轻松部署 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 协议》,转载必须注明作者和本文链接
Former WinForm and PHP engineer. Now prefer Golang and Rust, and mainly working on DevSecOps and Kubernetes.
附言 1  ·  5年前

由于后续课程需要,本文过程有所调整,详见 Commit 54a2cbc93854ab21ea318aa7e0134257655285c6

主要变更:将 deployer 用户追加至 www-data 用户组。

本帖由 Summer 于 5年前 加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 10

@zhaomengqiao 如果你新用户的主用户组是 www-data 的话,用 0775 也无妨。看你关注的是哪方面的 安全 问题了。

4年前 评论

sed -i -E 's/#?\s*(PermitRootLogin)(.*)$/\1 no/' /etc/ssh/sshd_config 还是直接vi编辑保守点,万一正则写错了,还没法回滚

5年前 评论

@lovecn 赞同。

不过 sed 可使使用类似 -i.bak 选项来自动将原文件备份为 *.bak。只需在-i后带上后缀即可。

5年前 评论

发现从root用户换了其它用户后,使用类似envoy类自动部署的时候,出现好多权限问题.

5年前 评论

@Flourishing 是的,很正常。为了保证安全,在实际过程中我们肯定也会遇到一些权限问题,遇到并解决即可,尽可能确保最小权限。无论如何都不应该使用 root 部署,非常非常非常危险。

5年前 评论

使用新建用户一直有一个疑问。新建用户加入www-data组,但是一般权限755-644,这个用户还是没法对文件进行修改,不知道该如何操作

5年前 评论

@zhaomengqiao 为什么要对文件进行修改?

4年前 评论

@Wi1dcard 比如说我ci,rsync同步代码。root不安全,新建一个普通用户755的话,会没有权限覆盖文件

4年前 评论
JasonG

禁用了 root 登录以后,假如要重新开放,要怎么登录 root 用户去修改这个配置呢

4年前 评论
JasonG (作者) 4年前
Wi1dcard (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
67
粉丝
590
喜欢
1235
收藏
1133
排名:13
访问:32.4 万
私信
所有博文
社区赞助商