为什么不要一直用 root 登录服务器?

预计阅读时间:8 分钟

这是「把自己部署到互联网上」系列的第 12 篇。

上一篇我写到,买完服务器后,我没有急着部署项目,而是先处理基础安全。原因很简单:这台机器以后会长期暴露在公网,不是本地开发环境,也不是一次性测试机。如果一开始只图快,很容易把风险留到后面。

这一篇先处理最基础的一步:不要一直用 root 登录服务器

很多云服务器创建实例后,会默认提供 root 登录。root 很方便,权限最大,想装软件、改配置、删文件都可以。但正因为它太方便,所以不适合作为日常维护用户。

长期使用 root 用户,会有什么问题

root 是 Linux 系统里的超级管理员,几乎可以做任何事。初始化服务器时,它确实省事;但长期使用 root,有几个明显问题。

  1. 误操作成本高。普通用户执行高风险命令时,系统可能会因为权限不足而拒绝;root 不会,它大概率会直接执行。

  2. 账号被攻破后影响更大。攻击者拿到普通用户,还需要进一步提权;如果直接拿到 root,基本就是最高权限。

  3. 权限边界会变得混乱。日常操作、项目部署、系统管理全部堆在 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 输出 codutysudo 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 控制高权限操作,能让服务器从一开始就有基本权限边界

下一篇继续拆另一个容易混淆的问题:防火墙和安全组到底有什么区别?用户权限处理完后,就该搞清楚服务器入口到底由谁控制。


本文由 楸木 原创,转载请注明出处。

相关推荐

发现更多