服务器如何禁止 root 远程登录
学完这篇,你能在不把自己锁在服务器外面的前提下,安全地关闭 root 的 SSH 远程登录,并知道改完怎么验证、出问题怎么回滚。
第一步:先建一个能提权的普通用户
这一步要做的是给自己留一条后路——因为禁止 root 登录后,你必须用别的账号进系统,并且还得能把权限提到 root。做完后你会得到一个可以 SSH 登录、可以 sudo 到 root 的账号。
以用户名 deploy 为例,CentOS 7/8、Rocky、Ubuntu 20.04/22.04 通用:
useradd -m -s /bin/bash deploy
passwd deploy
然后把它加进管理员组。CentOS/RHEL/Rocky 用 wheel 组:
usermod -aG wheel deploy
Debian/Ubuntu 用 sudo 组:
usermod -aG sudo deploy
验证:先 su - deploy,再执行 sudo whoami,输出 root 就说明提权没问题。
注意:
usermod -aG里的-a不能省,写成usermod -G会把用户从其他附加组里踢出去。改完组之后需要重新登录,新组权限才生效。
第二步:确认新账号能远程登录
这一步是用另一个终端验证备用通道确实可用,做完后再动配置才有底气。
不要断开当前 root 会话,另开一个终端执行:
ssh deploy@你的服务器IP
登录成功后执行 sudo -i,能变成 root 提示符就对了。
注意:这一步必须在改 sshd 配置之前做,而且原来那个已登录的 root 会话先别关——万一配置写错,你还能从这条已建立的连接里改回来。
第三步:修改 sshd_config 禁止 root 登录
这一步是真正的核心改动,做完后 root 将无法通过 SSH 登录。先备份:
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F)
再编辑:
vim /etc/ssh/sshd_config
在 vim 里输入 /PermitRootLogin 搜索,把
PermitRootLogin yes
改成
PermitRootLogin no
如果这行被注释掉了(前面有 #),去掉 # 或者直接在文件末尾新增一行 PermitRootLogin no。
注意:Ubuntu 22.04、Debian 12、CentOS 9 等版本会把配置拆到
/etc/ssh/sshd_config.d/目录,里面的 .conf 文件在主配置之后加载、优先级更高。先用grep -r PermitRootLogin /etc/ssh/把所有出现位置找出来逐个改成 no,否则主文件改了也不生效。
第四步:检查语法并重载服务
这一步先确认配置没错,再让 sshd 重新读取配置,做完后新配置正式生效但不断开现有连接。
sshd -t
没有任何输出说明语法 OK。再确认最终生效值:
sshd -T | grep -i permitrootlogin
输出 permitrootlogin no 才算真正生效。然后重载:
CentOS/RHEL:
systemctl reload sshd
Ubuntu/Debian:
systemctl reload ssh
注意:服务名不一样,CentOS 系是 sshd,Ubuntu/Debian 是 ssh。不确定就
systemctl list-units | grep ssh看一下。优先用 reload,restart 会中断当前 SSH 连接,没必要冒险。
第五步:验证结果
这一步用实际登录来确认限制生效。新开一个终端执行:
ssh root@你的服务器IP
应该被拒绝,提示 Permission denied。再用 ssh deploy@你的服务器IP 登录,sudo -i 能提权,说明一切正常。日志可以进一步确认:Ubuntu/Debian 看 /var/log/auth.log,CentOS/RHEL 看 /var/log/secure。
注意:如果 root 用了密钥登录、且你确实需要保留某些自动化场景,可以改成
PermitRootLogin prohibit-password,它只允许密钥、禁止密码。要完全禁止就用no。
第六步(可选):再收紧一层
这一步顺手把密码登录也关掉,只留密钥,做完后暴力破解基本没有发挥空间。在 sshd_config 里设置:
PubkeyAuthentication yes
PasswordAuthentication no
改完同样执行 sshd -t 和 reload。
注意:云服务器(阿里云、腾讯云、AWS)在禁用密码登录前,务必先确认你能通过控制台的 VNC/远程连接功能登录,否则密钥出问题就真进不去了。
小结
- 顺序不能反:先建普通用户并确认能 SSH 登录 + sudo,再动 sshd 配置。
- 改前备份 sshd_config,改后用
sshd -T | grep permitrootlogin看最终生效值。 - 别忘了检查
/etc/ssh/sshd_config.d/里的覆盖文件;Ubuntu/Debian 服务名是 ssh。 - 用 reload 而不是 restart,并保留一个已登录会话作为兜底。
- 禁止 root 登录后,用 deploy 这类账号
sudo -i或su -提权,日常运维习惯不受影响。
原文链接:https://www.gj0.com/thread-359.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。