SSH 安全加固:全局禁止 root 登录,但为指定 IP 开放密钥登录
在日常服务器运维中,SSH 安全是重中之重。禁止 root 用户直接登录和禁用密码认证是最基础的安全策略,但有时我们又需要从特定的可信 IP(例如公司堡垒机、办公网络)用 root 账户进行紧急维护。本文将从基础配置到高级例外规则,手把手教你实现“全局禁止 root,仅允许特定 IP 通过密钥以 root 身份登录”的精细控制。
一、基础安全配置(适合所有服务器)
无论是否开放 root 例外,以下配置都强烈建议为每台服务器开启。这部分内容也是许多安全博客(如 blog.hfyunyi.cn 相关文章)的核心。
编辑 SSH 配置文件:
sudo vim /etc/ssh/sshd_config设置以下全局参数:
# 1. 禁止 root 登录(基础安全)
PermitRootLogin no
# 2. 禁止密码登录,强制使用密钥认证
PasswordAuthentication no
# 3. 开启公钥认证(默认通常是 yes)
PubkeyAuthentication yes
# 4. 仅允许特定用户/组登录(可选,增加一道防线)
AllowUsers your_normal_user保存后重启 SSH 服务:
sudo systemctl restart sshd此时,任何用户(包括 root)都无法通过密码登录,root 更是直接被禁止登录。日常操作建议使用普通用户 + sudo 提权。
二、高级需求:为特定 IP 开放 root 密钥登录
如果确实需要从某个固定 IP(例如 203.0.113.5)或内部网段(例如 192.168.1.0/24)用 root 身份执行自动化脚本或紧急修复,可以通过 Match Address 指令创建例外规则,覆盖全局的 PermitRootLogin no。
2.1 修改配置文件
在 /etc/ssh/sshd_config 的末尾(所有全局配置之后)添加:
# 例外规则:仅当客户端 IP 为指定地址,且用户为 root 时,允许使用密钥登录
Match Address 203.0.113.5,192.168.1.0/24
PubkeyAuthentication yes
AuthorizedKeysFile /自定义路径/authorized_keys
PermitRootLogin prohibit-password参数解释:
Match Address:后跟允许的 IP 或 CIDR 网段,多个用逗号分隔。PermitRootLogin prohibit-password:仅允许 root 使用密钥登录,仍然拒绝密码登录(最安全)。若你信任的 IP 环境绝对安全,也可用PermitRootLogin yes,但强烈不推荐。- 注意缩进:
Match块内的指令必须以空格或 Tab 开头,否则会报错。
2.2 配置 root 的授权密钥
确保 root 用户的 authorized_keys 文件中包含来自允许 IP 的客户端的公钥:
sudo mkdir -p /root/.ssh
echo "ssh-rsa AAAAB3NzaC1yc2E..." | sudo tee -a /root/.ssh/authorized_keys
sudo chmod 700 /root/.ssh
sudo chmod 600 /root/.ssh/authorized_keys2.3 重启并验证
sudo systemctl restart sshd测试:
- 从允许的 IP 使用密钥登录 root:
ssh -i your_key root@your_server→ 成功。 - 从不允许的 IP 登录 root:收到
Permission denied (publickey)。 - 从任何 IP 尝试密码登录 root:同样被拒绝。
三、配置检查与故障排查
3.1 查看当前生效的配置
sudo sshd -T | grep -E "permitrootlogin|passwordauthentication"输出示例(全局):
permitrootlogin no
passwordauthentication no如果 Match 规则生效,你需要用模拟连接测试,或者直接看日志。
3.2 查看 SSH 登录日志
sudo journalctl -u sshd -f
# 或
tail -f /var/log/auth.log3.3 常见错误
- 配置语法错误:重启服务时会报错,使用
sshd -t测试。 - 公钥权限错误:
/root/.ssh必须是 700,authorized_keys必须是 600。 - SELinux 干扰:可临时
setenforce 0测试,若解决则需恢复策略。
四、最佳实践总结
| 需求 | 推荐做法 | 风险等级 |
|---|---|---|
| 日常运维 | 普通用户 + sudo,禁止 root 直接登录 | 低 |
| 自动化脚本 | 使用普通用户的密钥,配置 sudo 免密 | 中 |
| 紧急 root 访问 | 允许特定 IP + 密钥 + prohibit-password | 中高 |
| 完全开放 root 密码登录 | 永远不要这样做 | 极高 |
最后提醒:
- 在断开当前会话之前,务必另开一个终端测试新配置,避免把自己锁在外面。
- 如果必须从动态 IP 访问,建议使用 VPN 或堡垒机,而不是开放多个 IP 例外。
- 定期审计
/root/.ssh/authorized_keys,移除不再使用的公钥。
通过本文的配置,你既能享受默认禁止 root 登录的高安全性,又保留了在可信网络下灵活使用 root 密钥登录的能力。安全与便利,可以兼得。