permitrootlogin 参数配置,sshd 设置 permitrootloginyes 开启 root 登录

PermitRootLogin 这个参数藏在 /etc/ssh/sshd_config 里,管的事情很具体:允不允许 root 用户直接通过 SSH 登录到服务器。之所以单独给它一个开关,是因为 root 权限太大,一旦被爆破成功,整个系统就没了。但这个参数本身不复杂,值就那么几个。

先说它的几个取值。yes 是全开,root 可以用密码或者密钥登录,不挑方式。no 是全关,root 不管用什么方式都别想直接 SSH 上来。prohibit-password 是中间路线,允许 root 登录,但只认密钥,密码不行。还有一个 forced-commands-only,只在自动化脚本的场景里用,root 登录后只能跑 authorized_keys 里写死的某条命令,不能交互式操作。

permitrootlogin 参数配置,sshd 设置 permitrootloginyes 开启 root 登录

现代发行版上,prohibit-password 通常是默认值。Debian、Ubuntu、CentOS 较新的版本装完 SSH 服务之后,这个参数往往就是 prohibit-password 而不是 yes。和它长得几乎一样的 without-password 是老写法,OpenSSH 已经废弃了,含义和 prohibit-password 完全一致,现在配置文件模板里基本都改成了新名字。

如果要开 root 登录,操作本身很简单。用编辑器打开 /etc/ssh/sshd_config,找到 PermitRootLogin 那一行,把后面的值改成 yes。如果那一行被注释掉了,去掉行首的 # 再改。如果整行都不存在,自己在文件里加一行 PermitRootLogin yes 也行。保存退出。

但有一个细节容易坑人。现代 OpenSSH 的 sshd_config 末尾通常有一行 Include /etc/ssh/sshd_config.d/*.conf,意思是 /etc/ssh/sshd_config.d/ 目录下的所有 .conf 文件也会被加载,而且这些文件是按文件名字母顺序解析的,第一个匹配到的指令生效。也就是说,如果你在 /etc/ssh/sshd_config 里把 PermitRootLogin 改成了 yes,但 /etc/ssh/sshd_config.d/ 下面某个文件里写着 PermitRootLogin no,那个文件的名字如果排在前面,你的修改就被覆盖了。改完之后用 grep -ri "PermitRootLogin" /etc/ssh/sshd_config /etc/ssh/sshd_config.d/ 把所有相关行都搜出来看一眼,确认没有互相打架的情况。

改完文件不等于生效。sshd 需要重新加载配置,systemctl restart sshd 是最常用的命令,某些发行版上服务名叫 ssh,那就 systemctl restart ssh。还有一个更温和的方式是 systemctl reload sshd,它不会断开当前已经建立的 SSH 连接,只加载新的配置。如果你正在通过 SSH 连着服务器操作,用 reload 比 restart 安全一些,因为 restart 在某些配置下可能会把你当前的连接也断掉。

重启之前最好先确认一件事:你手头有一个可以用的非 root 账号,而且它有 sudo 权限。如果 root 登录被你关了,又没有其他能登录的账号,那就把自己锁在门外了。云服务商的控制台通常有 VNC 或者救援模式可以救回来,但那个过程比重新连一次 SSH 麻烦得多。

说回安全这件事。把 PermitRootLogin 设成 yes 并且允许密码登录,等于告诉所有扫描器“我这个 IP 上的 root 账号可以用密码试”。互联网上的 SSH 爆破机器人每分钟都在扫 22 端口,root 是它们第一个试的用户名。如果你的 root 密码强度一般,被撞开只是时间问题。CIS Benchmark 和 NIST 的相关标准里,PermitRootLogin no 是推荐基线。实际操作中更常见的折中方案是用普通用户登录,需要 root 权限的时候 sudo 提权,这样每个操作都有日志记录,谁干的能查到人。如果确实需要 root 直连,把 PasswordAuthentication 关掉,只留密钥认证,同时 PermitRootLogin 设成 prohibit-password,安全性会好很多。

免责声明:本文提供的方法与建议仅供技术参考,实际部署效果受机房环境、运营商线路、系统配置等多重因素影响。请在专业人员指导下操作,因自行操作导致的业务损失本站不承担责任。