轻松部署 Laravel 应用 | 《11. 安全加固 - 避免使用根用户》
:clap: 本系列持续更新中,欢迎关注:https://github.com/wi1dcard/laravel-deploy...。
由于课程上下文关联比较紧密,在开始前请先阅读 本文。
你的支持是我写作的动力;关注我的客官们,请在右上角点个赞,将会让文章在首页展示,帮助更多人。
感谢 :clap: !
还记得最早我们提到的「暂时 作为 root
(根)用户登录」吗。在本节,我将带领大家创建新用户。
为何这么做?
严格地说,并不是不允许使用根用户;而是 禁止直接作为根用户登录到服务器。原因如下:
- 避免随手
rm -rf /
或是rm -rf . /
之类的悲剧。 - 更加安全地使用 Composer,尽可能减少扩展包作者或中间人劫持插入的恶意代码在依赖安装或更新时被执行对服务器造成的影响。
- 更加安全地登录服务器,即使密钥泄露,不法分子(?)也不能直接作为根用户登录,无法直接取得管理权限。
- 后续课程中,更加安全地使用 Deployer 和 Ansible。
- ...
可以看出,几乎所有的因素都与 安全 直接挂钩。
创建新用户
在创建用户之前,请先新建用户组,例如 deployment
:
$ addgroup deployment
随后创建新用户,例如 deployer
:
$ useradd -d /home/deployer -s /bin/bash -m deployer
其中,/home/deployer
为用户家目录(也就是登录到服务器后默认所在的当前目录),/bin/bash
为用户的默认 Shell 程序。
接着将用户添加至用户组:
$ usermod -a -G deployment -G www-data deployer
注意:此处使用了两次 -G 参数,将该用户分别添加至 deployment 和 www-data 用户组。
最后,为新用户设置密码:
$ passwd deployer
根据提示输入密码并确认:
Enter new UNIX password: <输入密码>
Retype new UNIX password: <再次输入密码>
好了,新用户配置完成。你可以通过以下命令切换至 deployer
用户:
$ su deployer
同理,也可切换为其它用户,例如 root
:
$ su root
测试效果
断开 SSH 连接,在本地使用以下命令作为 deployer
用户登录到服务器:
$ ssh deployer@laravel-deployment.wi1dcard.cn
如你所见,将原先的 root
替换为新用户名即可。随后,输入上文中设置的密码:
deployer@laravel-deployment.wi1dcard.cn's password: <输入密码>
若能够成功登录,则可以继续下一步了。
注意:务必确保登录成功,否则下一步完成后你将无法登录到服务器!
禁止根用户 SSH 登录
以上我们已经创建了新用户,接下来我们需要禁止根用户直接通过 SSH 登录到服务器。若需要管理员权限,可登录后通过 su
命令切换至 root
执行。
首先,请执行以下命令:
$ sed -i -E 's/#?\s*(PermitRootLogin)(.*)$/\1 no/' /etc/ssh/sshd_config
其中:
sed
是一款十分流行的流文本编辑器,具备查找、替换等功能;与先前提到的grep
类似,但相比之下 sed 更加强大。该例子中,我们使用的便是它的 替换 功能。/etc/ssh/sshd_config
是被编辑的文件,也就是 SSH 的配置。's/#?\s*(PermitRootLogin)(.*)$/\1 no/'
是最关键的部分,它是一个 sed 表达式,表示将PermitRootLogin
配置项设置为no
。此处不再详细展开,有兴趣可自行搜索相关语法。-i
表示直接替换文件内容,而不是将替换后的结果输出。-E
表示使用扩展版正则语法,支持更多规则。
以上参数的细节可不必深究,只需明白它的作用即可。
你也可以手动编辑 /etc/ssh/sshd_config
文件,搜索 PermitRootLogin
这一关键字,将 整行 修改为:
PermitRootLogin no
注意:务必确保整行修改,首尾无多余字符(例如注释符
#
)。提示:虽然课程内尽可能地假设你不会使用 Vim / Emacs 等文本编辑器,但还是强烈建议学习一下它们,哪怕简单地了解一部分用法也会带来极高的效率提升。
随后,重启 SSH 服务即可:
$ service ssh restart
再次测试效果
在本地执行原先的登录命令:
$ ssh root@laravel-deployment.wi1dcard.cn
输入密码后将会报错:
root@laravel-deployment.wi1dcard.cn's password: <输入密码>
Permission denied, please try again.
意为权限被拒绝,请再试一次。当然,我们都知道,重试也不会起作用的。
本作品采用《CC 协议》,转载必须注明作者和本文链接
由于后续课程需要,本文过程有所调整,详见 Commit 54a2cbc93854ab21ea318aa7e0134257655285c6。
主要变更:将 deployer
用户追加至 www-data
用户组。
推荐文章: