这是「把自己部署到互联网上」系列的第 12 篇。
上一篇我写到,买完服务器后,我没有急着部署项目,而是先处理基础安全。原因很简单:这台机器以后会长期暴露在公网,不是本地开发环境,也不是一次性测试机。如果一开始只图快,很容易把风险留到后面。
这一篇先处理最基础的一步:不要一直用 root 登录服务器。
很多云服务器创建实例后,会默认提供 root 登录。root 很方便,权限最大,想装软件、改配置、删文件都可以。但正因为它太方便,所以不适合作为日常维护用户。
长期使用 root 用户,会有什么问题
root 是 Linux 系统里的超级管理员,几乎可以做任何事。初始化服务器时,它确实省事;但长期使用 root,有几个明显问题。
-
误操作成本高。普通用户执行高风险命令时,系统可能会因为权限不足而拒绝;root 不会,它大概率会直接执行。
-
账号被攻破后影响更大。攻击者拿到普通用户,还需要进一步提权;如果直接拿到 root,基本就是最高权限。
-
权限边界会变得混乱。日常操作、项目部署、系统管理全部堆在 root 下,短期方便,长期难维护。
所以我的原则是:root 可以用于初始化,不适合做日常用户。日常维护用普通用户,需要高权限时再通过 sudo 执行。
创建普通用户
以 Ubuntu 系统为例。其他发行版命令可能不同,但思路一样:创建普通用户,赋予 sudo 权限,验证能登录,再收紧 root 登录。
先用 root 登录服务器,创建普通用户。这里用 coduty 举例:
adduser coduty
按提示设置密码,其他信息可以按需填写。创建后检查用户是否存在:
id coduty
ls -ld /home/coduty
接着把用户加入 sudo 组:
usermod -aG sudo coduty
groups coduty
这里要注意 -aG,-a 表示追加。如果只写 -G,可能会覆盖用户原来的附加组。输出里包含 sudo,说明用户已经具备 sudo 权限。
切换用户
不要急着改 SSH 配置。先在当前 root 会话里切换到普通用户验证:
su - coduty
whoami
sudo whoami
如果 whoami 输出 coduty,sudo whoami 输出 root,说明普通用户和 sudo 权限都正常。
下一步,测试普通用户能否通过 SSH 登录。这里一定要新开一个终端,不要关闭当前 root 会话,避免把自己锁在服务器外面。
ssh coduty@服务器IP
sudo whoami
如果使用密钥登录,还要把公钥放到普通用户的:
/home/coduty/.ssh/authorized_keys
并设置权限:
chmod 700 /home/coduty/.ssh
chmod 600 /home/coduty/.ssh/authorized_keys
chown -R coduty:coduty /home/coduty/.ssh
权限不对时,SSH 可能会拒绝使用密钥。
只有普通用户 SSH 登录和 sudo 都验证通过后,才考虑限制 root 登录。SSH 配置文件一般在:
/etc/ssh/sshd_config
强烈建议修改前先备份、先备份、先备份:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo nano /etc/ssh/sshd_config
可以关注这几个配置:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin no 表示禁止 root 直接登录。PasswordAuthentication no 表示关闭密码登录,只允许密钥登录。这里必须谨慎:如果还没确认密钥可用,不要关闭密码登录;如果还没确认普通用户能登录,不要禁止 root 登录。
修改后先检查 SSH 配置语法:
sudo sshd -t
没有错误后再重载服务:
sudo systemctl reload ssh
有些系统服务名可能是 sshd:
sudo systemctl reload sshd
重载后仍然不要关闭旧会话。新开终端测试普通用户能否登录,确认无误后再退出旧会话。
结果
完成后,我的日常方式会变成:用普通用户登录,需要管理员权限时再 sudo。
ssh coduty@服务器IP
sudo apt update
sudo systemctl status ssh
项目代码、部署目录、Docker Compose 文件,也尽量放在普通用户可维护的位置,不要什么都塞进 /root。后面部署博客、配置 Nginx、管理证书和日志时,目录结构会越来越重要。
如果加了 sudo 组后仍然不能 sudo,先退出重新登录,或者用 su - coduty 刷新会话;再检查 groups coduty 是否包含 sudo。不要随手改 /etc/sudoers,真要修改应使用 visudo,它会做语法检查。
如果普通用户 SSH 登录失败,也不要关闭 root 会话。先检查用户名、用户是否存在、密码或密钥是否正确,.ssh 权限是否合适,再看 SSH 配置是否禁用了对应登录方式。Ubuntu 上可以查看日志:
sudo journalctl -u ssh --no-pager -n 100
要不要改 SSH 默认端口?可以改,但它不是核心安全手段,只是减少一些低级扫描和日志噪音。真正重要的是密钥登录、限制 root、合理配置安全组、不暴露不必要端口,以及后续配合 fail2ban 等工具。如果要改端口,必须先在安全组和防火墙里放行新端口,再测试新端口能否登录。
这一篇完成后,我会检查几件事:普通用户存在,属于 sudo 组,sudo whoami 输出 root,普通用户能 SSH 登录,SSH 配置语法正确,服务重载后还能正常连接。
为什么不要一直用 root 登录服务器?因为 root 适合初始化,不适合日常维护。先创建普通用户,再通过 sudo 控制高权限操作,能让服务器从一开始就有基本权限边界。
下一篇继续拆另一个容易混淆的问题:防火墙和安全组到底有什么区别?用户权限处理完后,就该搞清楚服务器入口到底由谁控制。
本文由 楸木 原创,转载请注明出处。