最稳妥的做法是保留 root 账号但禁止其通过 SSH 远程登录,日常运维改用普通账号配合 sudo 提权,适用于绝大多数面向公网的 Linux 服务器。
先说结论:禁用 root 远程登录是基础安全基线,但操作前必须确保已有可用的普通 sudo 账号,否则会导致无法维护服务器。
- 先判断:确认当前已有另一个具备 sudo 权限的账号,且能成功登录。
- 优先做:备份配置文件,修改 SSH 配置关闭 root 登录,同时保留本地控制台 root 权限。
- 再验证:新开终端测试 root 远程登录是否被拒,确保原会话不断开的情况下完成验证。
命令速用版
如果你确认已有 sudo 账号,可以直接运行以下命令修改配置并重启服务。注意不同发行版服务名称可能不同:
# 1. 备份配置文件(重要)
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# 2. 修改配置禁止 root 登录
sudo sed -i 's/^#PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -i 's/^PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
# 3. 检查配置语法
sudo sshd -t
# 4. 重启服务(根据系统选择)
sudo systemctl restart sshd # CentOS/RHEL
sudo systemctl restart ssh # Ubuntu/Debian
注意:执行前请确保当前 SSH 会话不要关闭,以便出错时回滚。
原理简述
root 是 Linux 系统的超级管理员,用户名固定且已知。开启 root 远程登录意味着攻击者只需要破解密码或窃取密钥即可完全控制服务器,无需猜测用户名。禁用后,攻击者必须先突破普通账号层,增加了暴力破解的难度。此外,使用普通账号操作配合 sudo 审计,也能更清晰地记录是谁执行了特权命令。
分步处理
1. 创建并验证普通账号
如果还没有普通账号,先创建一个并赋予 sudo 权限:
adduser opsuser
passwd opsuser
usermod -aG sudo opsuser # Ubuntu/Debian
usermod -aG wheel opsuser # CentOS/RHEL
2. 测试普通账号登录
新开一个终端窗口,尝试用新账号登录,确保密钥或密码认证正常,且能执行 sudo 命令。
3. 备份并修改 SSH 配置
修改前务必备份原配置文件,以防配置错误无法恢复:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
编辑配置文件,找到 PermitRootLogin 项,改为 no:
sudo vi /etc/ssh/sshd_config
确保配置行没有注释符号 #,值为 no。同时建议检查 PasswordAuthentication,若使用密钥登录可设为 no 进一步加固。
4. 检查配置语法
在重启服务前,必须验证配置文件语法是否正确,避免服务启动失败:
sudo sshd -t
如果命令无输出,表示配置正确;若有报错,请根据提示修改配置。
5. 重启 SSH 服务
根据操作系统发行版执行对应的重启命令:
sudo systemctl restart sshd # CentOS/RHEL
sudo systemctl restart ssh # Ubuntu/Debian
6. 保持当前会话
重启服务后,不要关闭当前已登录的 root 终端,直到验证完成。
怎么验证是否生效
在另一个终端尝试远程连接 root:
ssh root@你的服务器 IP
预期结果应该是直接被拒绝,提示 Permission denied 或 Public key denied,而不是提示输入密码。
查看安全日志确认拒绝记录:
sudo grep "Failed" /var/log/secure # CentOS/RHEL
sudo grep "Failed" /var/log/auth.log # Ubuntu/Debian
常见坑
- 把自己锁在门外:这是最高频风险。修改配置前务必确认另一个账号可用,且不要关闭当前会话直到验证成功。
- sudo 权限缺失:创建了普通账号但忘记加入 sudo 组,导致无法执行管理命令。
- 云服务商控制台:如果是云服务器,确保知道如何通过云厂商的控制台 VNC 或救援模式登录,以防 SSH 彻底无法连接。
- 配置备份缺失:修改前未备份配置文件,一旦语法错误且无法通过 VNC 修复,可能需要重装系统。