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_keys

2.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.log

3.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 密钥登录的能力。安全与便利,可以兼得。

最后修改:2026 年 04 月 03 日
如果觉得我的文章对你有用,请随意赞赏