轻松部署 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 prefer Golang and Rust, and mainly working on DevSecOps and Kubernetes.
本帖由系统于 7个月前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 9

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

1年前 评论

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

1年前 评论

@Flourishing 是说部署 HTTPS 证书吗?

1年前 评论

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

1年前 评论

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

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

1年前 评论

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

1年前 评论

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

1年前 评论

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

1年前 评论

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