轻松部署 Laravel 应用 | 《12. 安全加固 - 使用密钥登录》

:clap: 本系列持续更新中,欢迎关注:https://github.com/wi1dcard/laravel-deploy...

由于课程上下文关联比较紧密,在开始前请先阅读 本文

你的支持是我写作的动力;关注我的客官们,请在右上角点个赞,将会让文章在首页展示,帮助更多人。

感谢 :clap: !

上一小节中,我们为服务器创建了新用户,并禁止了根用户直接登录。本节将进一步完善安全加固,同时避免每次登录都需要输入密码的麻烦。

所谓密钥登录,即 在本地生成密钥对(一套公钥 + 私钥称为「密钥对」)后,将公钥 传输到服务器中;随后进行 SSH 登录时,本地使用私钥加密一字符串,若服务端使用公钥解密成功,则认为客户端可信。

提示:关于非对称加密和 RSA 相关知识,可参见 本文

在本地生成密钥对

在本地执行以下命令:

$ ssh-keygen -t rsa -C "wi1dcard.cn@gmail.com"

其中,-t rsa 表示密钥类型为 RSA,wi1dcard.cn@gmail.com 请替换为自己的邮箱地址。

接下来你将会收到连续几条询问提示:

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):

意为:使用哪个文件保存私钥(默认为 /root/.ssh/id_rsa)?不同系统、不同用户的默认值均不同,通常情况下为 ~/.ssh/id_rsa~ 是 Bash 中的特殊字符之一,表示用户根目录)。

直接按下回车键,使用默认值即可。

Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):

意为:私钥密码想设置成什么?我们暂时无需加密,回车继续即可。

Enter same passphrase again:

意为:请再次输入密码确认;依旧回车继续即可。

稍等片刻,密钥对就生成好了:

Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:TwgRw0ZIHo1UqzGgLrAuKkjZaLxdkmcHRxbAuyDNiow wi1dcard.cn@gmail.com
The key's randomart image is:
...

以上提示我们只需关注前两行:

  • /root/.ssh/id_rsa 是私钥路径。
  • /root/.ssh/id_rsa.pub 是公钥路径。

你可以使用 cat 命令来查看它们,例如:

$ cat /root/.ssh/id_rsa.pub

你将会看到公钥文本展示在命令行中。

cat 命令与 PHP 的 file_get_contents + echo 作用类似 —— 读取文件并完整地输出。

传输公钥到服务器

接下来,我们需要将公钥传输到服务器上。十分简单,一行命令即可:

$ ssh-copy-id deployer@laravel-deployment.wi1dcard.cn

请将 laravel-deployment.wi1dcard.cn 替换为你的服务器公网 IP 或域名,并使用新用户(deployer),而非根用户。

在这期间,需要你输入上一节设置的密码:

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/jootu/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
deployer@laravel-deployment.wi1dcard.cn's password: <输入密码>

恭喜,传输成功:

Number of key(s) added:        1

Now try logging into the machine, with:   "ssh 'deployer@laravel-deployment.wi1dcard.cn'"
and check to make sure that only the key(s) you wanted were added.

阅读以上输出,已提示我们可以使用 ssh 'deployer@laravel-deployment.wi1dcard.cn' 登录到服务器,亲自试试看吧。

禁止使用密码登录

成功地「免密码」登录服务器后,我们需要确保密码登录被禁用。与上一节类似,修改 SSH 服务配置文件 /etc/ssh/sshd_config

$ su root # 切换至 root 用户身份
$ sed -i -E 's/#?\s*(PermitEmptyPasswords)(.*)$/\1 no/' /etc/ssh/sshd_config
$ sed -i -E 's/#?\s*(PasswordAuthentication)(.*)$/\1 no/' /etc/ssh/sshd_config

注意:再次建议使用 Vim 等编辑器手动编辑。

以上命令将会变更两个配置项,它们的值均被修改为 no,也就是不允许。

  • PermitEmptyPasswords no 用于禁止空密码登录。若创建用户时未使用 passwd 设置密码,且此处为 yes 将会非常危险;因此,无论是否使用密钥登录,强烈建议将该配置项设置为 no
  • PasswordAuthentication no 用于禁止密码授权(即密码登录)。

安全警告

务必务必!确保你的私钥无法被除自己之外的任何人读取,否则将会泄露 几乎所有 基于 SSH 协议的通讯权限,包括但不限于 Git Push、SSH 登录服务器等。

本作品采用《CC 协议》,转载必须注明作者和本文链接

Former WinForm and PHP Engineer. Now focus on #DevSecOps and global networking.

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 9

讲解的很好先插个眼,慢慢学习

10个月前 评论

今天大概浏览了下 你这个系列有讲到 ssl的实现吗

10个月前 评论

@Flourishing 是说部署 HTTPS 证书吗?

10个月前 评论

@Wi1dcard 是啊 文章十几篇 大概浏览一下 收藏了 不知道有没有讲到HTTPS证书的生成

10个月前 评论

@Flourishing 后续还会继续写,目前才刚刚开始;已经规划三部分「基础篇」、「初级篇」、「进阶篇」。基础篇已经快要结束了,马上要开始「初级篇」,还有很多干货等待放出。

关于 HTTPS 证书的问题,可以写个番外(类似那篇「浅析 Nginx 配置」的形式),另外在后续讲到 Ansible 附近的时候,也会涉及到部署 HTTPS 相关话题的,欢迎关注。

10个月前 评论

@Wi1dcard 可以啊 写的时候 希望能够不要遗漏步骤 方便日后查阅使用 :grin:

10个月前 评论

@Flourishing 嗯,在写课程的同时,我自己也在服务器上执行同样的命令,如果遗漏出现问题的话,就会及时修正,尽可能保证读者跟着步骤进行不会出错。另外,在整套课程结束之后我会再进行一遍全局的校对,到时会新开一台干净的服务器,从头到尾跟着教程再操作一遍,确保无误。

10个月前 评论

简洁明了,很实用。感谢!

9个月前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
未填写
文章
59
粉丝
494
喜欢
1111
收藏
869
排名:13
访问:15.2 万
私信
所有博文