轻松部署 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 协议》,转载必须注明作者和本文链接
讲解的很好,先插个眼,慢慢学习
今天大概浏览了下 你这个系列有讲到
ssl
的实现吗@Flourishing 是说部署 HTTPS 证书吗?
@Wi1dcard 是啊 文章十几篇 大概浏览一下 收藏了 不知道有没有讲到
HTTPS
证书的生成@Flourishing 后续还会继续写,目前才刚刚开始;已经规划三部分「基础篇」、「初级篇」、「进阶篇」。基础篇已经快要结束了,马上要开始「初级篇」,还有很多干货等待放出。
关于 HTTPS 证书的问题,可以写个番外(类似那篇「浅析 Nginx 配置」的形式),另外在后续讲到 Ansible 附近的时候,也会涉及到部署 HTTPS 相关话题的,欢迎关注。
@Wi1dcard 可以啊 写的时候 希望能够不要遗漏步骤 方便日后查阅使用 :grin:
@Flourishing 嗯,在写课程的同时,我自己也在服务器上执行同样的命令,如果遗漏出现问题的话,就会及时修正,尽可能保证读者跟着步骤进行不会出错。另外,在整套课程结束之后我会再进行一遍全局的校对,到时会新开一台干净的服务器,从头到尾跟着教程再操作一遍,确保无误。
@Wi1dcard 辛苦了
简洁明了,很实用。感谢!