Ubuntu SSH 强制密钥登录:配置不生效的排查与修复
症状
修改 PasswordAuthentication yes 并重启 sshd,客户端仍报 Permission denied (publickey)。
根因
sshd 运行时配置由多个文件合并决定,云镜像默认配置往往被 /etc/ssh/sshd_config.d/50-cloud-init.conf 中的 PasswordAuthentication no 覆盖,或存在 AuthenticationMethods 限制。
排查步骤
1. 查看 sshd 运行时生效值
bash
sudo sshd -T | grep -E 'passwordauthentication|authenticationmethods|kbdinteractiveauthentication'
要求:
passwordauthentication yesauthenticationmethods输出为空(无任何限制)kbdinteractiveauthentication yes
任何一项不符,继续。
2. 定位冲突配置文件
bash
sudo grep -rn "PasswordAuthentication\|AuthenticationMethods" /etc/ssh/sshd_config /etc/ssh/sshd_config.d/
常见冲突源:/etc/ssh/sshd_config.d/50-cloud-init.conf 内含 PasswordAuthentication no。
3. 创建高优先级覆盖配置
bash
sudo tee /etc/ssh/sshd_config.d/99-password-auth.conf <<EOF
PasswordAuthentication yes
KbdInteractiveAuthentication yes
EOF
若步骤 1 中发现 authenticationmethods 非空,追加一行以清空限制:
bash
echo "AuthenticationMethods password" | sudo tee -a /etc/ssh/sshd_config.d/99-password-auth.conf
4. 语法检查并重启服务
bash
sudo sshd -t && sudo systemctl restart ssh
5. 确认用户密码可用
bash
sudo passwd -S <username>
状态必须为 P(密码已设置)。若为 L(锁定),执行 sudo passwd -u <username>;若为 NP(无密码),执行 sudo passwd <username>。
6. 验证客户端支持的认证方式
bash
ssh -o PreferredAuthentications=password -v user@host
输出中应出现 Authentications that can continue: password。
常见错误与处理
-
AuthenticationMethods publickey强制密钥→ 在步骤 3 覆盖为
AuthenticationMethods password或直接注释原文件行。 -
KbdInteractiveAuthentication no导致 PAM 密码认证失效→ 步骤 3 已覆盖。
-
用户密码未设置或锁定
→ 步骤 5 解决。
-
sshd -T仍显示passwordauthentication no→ 检查
/etc/ssh/sshd_config.d/下文件名的排序,确保99-文件最晚加载。可用sudo sshd -T | grep -B1 passwordauthentication观察来源文件(需 root 权限查看)。
恢复密钥认证(运维后必做)
bash
sudo rm /etc/ssh/sshd_config.d/99-password-auth.conf
sudo systemctl restart ssh