在 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. 编辑配置文件,找到以下项并确保设置正确:
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 提示,说明密码登录未完全关闭。成功密钥登录通常不会提示输入密码。同时可以在服务器端查看安全日志:
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 密钥登录。