PermitRootLogin prohibit-password允许root密钥登录并禁用密码认证,需协同PubkeyAuthentication yes、PasswordAuthentication no、authorized_keys权限600等条件生效。

在 Linux 系统中将 PermitRootLogin 设为 prohibit-password,目的是允许 root 用户通过 SSH 密钥登录,同时彻底禁止其使用密码认证——这是生产环境中兼顾安全与应急能力的主流做法。
确认前提条件已满足
该配置不是孤立生效的,必须协同其他关键参数:
- PubkeyAuthentication yes:必须显式启用,不能依赖默认值
- PasswordAuthentication no:必须关闭全局密码登录,否则攻击者可借其他用户爆破后提权绕过限制
-
root 用户的
/root/.ssh/authorized_keys已存在且权限为 600:文件内容需包含你本地私钥对应的公钥 -
root 的家目录(
/root)权限不能是 777 或含 sticky bit:否则 OpenSSH 会跳过读取密钥
修改 sshd_config 配置
用具有 sudo 权限的账户执行:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 备份原配置:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak - 编辑配置:
sudo vim /etc/ssh/sshd_config - 搜索
PermitRootLogin,确保只有一行未注释,将其改为:PermitRootLogin prohibit-password - 检查并确认以下三行也明确存在且值正确(不注释、不拼错):
PubkeyAuthentication yesPasswordAuthentication noStrictModes yes
验证并重启服务
顺序不能错,否则可能被锁死:
- 先测试密钥能否成功登录 root:
ssh -o PubkeyAuthentication=yes root@localhost(应成功) - 再测试密码登录是否被拒:
ssh -o PasswordAuthentication=yes root@localhost(应返回 Permission denied) - 语法校验:
sudo sshd -t—— 无任何输出才表示配置合法 - 重启服务:
Ubuntu/Debian:sudo systemctl restart ssh
CentOS/RHEL:sudo systemctl restart sshd - 新开终端立即验证:
ssh root@your_server_ip,应仅接受密钥、拒绝密码
常见失效原因
配置看似正确却仍能密码登录 root,通常因为:
- 只改了
PermitRootLogin prohibit-password,但PasswordAuthentication仍是yes -
/root/.ssh/authorized_keys权限不是 600,或/root/.ssh目录权限不是 700 - SELinux 启用时未修复上下文:
sudo restorecon -Rv /root/.ssh - 配置文件中存在多行
PermitRootLogin,系统取最后一行,导致实际生效的是被注释掉的旧值


















