CentOS 7 怎么禁用 SSH 密码登录只允许密钥认证

文章导读
在 CentOS 7 上禁用 SSH 密码登录并强制使用密钥认证,最直接的方法是修改 sshd_config 配置文件,将 PasswordAuthentication 设为 no,并确保公钥已正确部署。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
A A

在 CentOS 7 上禁用 SSH 密码登录并强制使用密钥认证,最直接的方法是修改 sshd_config 配置文件,将 PasswordAuthentication 设为 no,并确保公钥已正确部署。

先说结论:生产环境建议关闭密码登录,但操作前必须保留一个已连接的 SSH 会话用于应急回滚。

  • 先判断:确认当前用户公钥已写入服务器 authorized_keys 且能免密登录。
  • 优先做:修改配置前备份原文件,修改后不要立即关闭当前连接。
  • 再验证:新开一个终端测试密钥登录,成功后再关闭旧会话。

命令速用版

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sed -i 's/^PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
systemctl restart sshd

注意:sed 命令可能因原始配置注释状态不同而失效,执行后务必手动检查配置文件确认修改生效。

为什么会这样

密码登录容易受到暴力破解攻击,尤其是当服务器暴露在公网时,攻击者会尝试常见密码组合。密钥认证基于非对称加密,私钥保存在本地且通常有 passphrase 保护,安全性远高于普通密码。关闭密码登录能从源头阻断密码爆破风险,但前提是管理员必须妥善保管私钥,否则一旦丢失将无法登录。

分步处理

1. 备份配置文件,防止修改错误导致无法恢复:

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

2. 编辑配置文件,找到以下项并确保设置正确:

CentOS 7 怎么禁用 SSH 密码登录只允许密钥认证
vi /etc/ssh/sshd_config

修改或添加以下内容:

PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no

3. 检查密钥权限,SSH 对权限非常敏感,权限过宽会导致密钥认证失败:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R $USER:$USER ~/.ssh

4. 如果服务器开启了 SELinux,确保文件上下文正确:

restorecon -Rv ~/.ssh

5. 重载 SSH 服务使配置生效:

systemctl restart sshd

怎么验证是否生效

不要关闭当前已连接的 SSH 窗口,新开一个终端尝试连接:

ssh -v user@your_server_ip

观察输出日志,如果出现 Keyboard-interactive 或 Password 提示,说明密码登录未完全关闭。成功密钥登录通常不会提示输入密码。同时可以在服务器端查看安全日志:

CentOS 7 怎么禁用 SSH 密码登录只允许密钥认证
tail -f /var/log/secure

尝试密码登录时,日志中应出现 Authentication failure 记录,而密钥登录成功则不会有此类报错。

常见坑

1. 把自己锁在门外:这是最常见的事故。务必在确认新终端能免密登录后,再关闭旧会话。如果无法登录,需要通过控制台(VNC/IPMI)恢复配置。

2. 权限问题:~/.ssh 目录权限不能超过 700,authorized_keys 不能超过 600,否则 SSH 服务端会忽略密钥文件。

3. 配置项冲突:某些系统默认开启了 ChallengeResponseAuthentication,即使 PasswordAuthentication 设为 no,仍可能提示输入密码,需同时关闭该项。

4. Root 登录限制:如果禁止了 Root 密码登录,确保普通用户有 sudo 权限,或者在配置中明确 PermitRootLogin prohibit-password 允许 Root 密钥登录。