Ubuntu 20.04 默认策略已限制 root 远程登录,但为了确保持续安全,建议显式配置 SSH 禁止 root 登录,适用于所有面向公网的服务器。
先说结论:生产环境应始终禁止 root 直接 SSH 登录,改用普通用户配合 sudo 提权。
- 先判断:确认已创建具备 sudo 权限的普通用户,避免锁死自己。
- 优先做:修改 SSH 配置文件将 PermitRootLogin 设为 no。
- 再验证:保持当前会话开启,新开终端测试 root 登录是否被拒。
命令速用版
若已确认有 sudo 用户,可直接执行以下命令修改配置。操作前务必备份配置文件:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo sed -i 's/^#PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -i 's/^PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sshd -t
sudo systemctl restart ssh注意:Ubuntu 20.04 的 SSH 服务名通常为 ssh 而非 sshd。执行重启前必须通过 sshd -t 检查配置语法,无输出则表示正确。
为什么会这样
Ubuntu 默认禁用 root 登录并非技术限制,而是基于最小权限原则的安全设计。直接使用 root 意味着任何误操作或恶意软件都将获得系统最高控制权,且操作难以审计。通过 sudo 机制,管理员可以在需要时临时提权,系统会记录具体是哪个用户执行了特权命令,便于追踪问题源头。这是 Linux 运维领域的标准安全实践。
分步处理
1. 准备备用管理账户
在禁止 root 登录前,必须确保至少有一个普通用户拥有 sudo 权限。若当前只有 root 可用,请先创建新用户:
sudo adduser newadmin
sudo usermod -aG sudo newadmin2. 修改 SSH 配置
编辑配置文件,找到 PermitRootLogin 项。若该行被注释,需取消注释并修改值为 no。建议同时配置密钥登录并关闭密码认证以增强安全:
sudo nano /etc/ssh/sshd_config配置示例:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes3. 检查配置语法
保存文件后,先测试配置是否正确,避免服务无法启动:
sudo sshd -t若命令无输出,表示语法正确;若有报错,请根据提示修改配置文件。
4. 重启 SSH 服务
确认语法无误后重启服务使配置生效:
sudo systemctl restart ssh怎么验证是否生效
1. 本地测试
不要关闭当前已登录的会话。新开一个终端窗口,尝试连接 root 账户:
ssh root@你的服务器 IP若配置成功,应直接提示 Permission denied 或认证失败,而不会提示输入密码。
2. 检查日志
查看系统认证日志,确认 root 登录尝试被记录:
sudo grep "Failed password for root" /var/log/auth.log若能看到相关拒绝记录,说明 SSH 服务正常工作且拦截了 root 登录。
常见坑
1. 配置语法错误导致服务启动失败
修改 sshd_config 时若拼写错误,可能导致 SSH 服务无法启动。务必在执行 restart 前运行 sudo sshd -t 检查。若服务已挂掉,需通过云服务商的控制台 VNC 救援模式恢复。
2. 服务名称混淆
在 CentOS 或 RHEL 系统上 SSH 服务名通常是 sshd,但在 Ubuntu 20.04 上通常是 ssh。执行 restart 命令前可用 systemctl status ssh 确认。
3. 把自己锁在门外
这是最严重的风险。务必在断开当前连接前,验证新用户的 sudo 权限和 SSH 登录是否正常。建议保留一个开启的 root 会话直到确认新用户可成功登录并提权。
参考来源
- DigitalOcean, Initial Server Setup with Ubuntu 20.04, https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-20-04
- Ubuntu Manpage: sshd_config, https://manpages.ubuntu.com/manpages/focal/man5/sshd_config.5.html