CentOS密钥登录正常但密码登录提示Permission denied,排查sshd_config
刚把新服务器上架,密钥秒进,密码却死活敲不开门,提示一行冷冰冰的“Permission denied, please try again.”,再试三次直接断开。别急着砸键盘,九成问题藏在/etc/ssh/sshd_config,一条配置写错,密码验证就被悄悄关掉。下面把踩坑路线一次说清,跟着做,十分钟内让密码登录重新开门。

先确认现象:密钥能进、密码被拒
用终端连服务器,带私钥文件直接进系统,说明SSH服务活着、网络没拦、防火墙放行22端口。换台没私钥的机器,输入账号密码,同样端口同样IP,立刻弹Permission denied,说明sshd主动拒绝了密码验证。此时别去改PAM、别动shadow,先盯死sshd_config,它才是闸门。
第一步:留一条命,防改错锁死
开两个窗口,一个已经用密钥连上,保持不动;另一个用来改配置。万一改崩,第一个窗口还能救场。养成习惯,先cp /etc/ssh/sshdconfig /etc/ssh/sshdconfig.bak,回滚只需一条命令。
第二步:找关键的三行配置
vim /etc/ssh/sshd_config,/搜索下面三项:

PasswordAuthentication
ChallengeResponseAuthentication
UsePAM
系统默认安装完,CentOS minimal镜像为了安全,把PasswordAuthentication设成no,这就是密码敲到手指发麻也进不去的元凶。把这行改成:
PasswordAuthentication yes
如果前面带#号,把#一并删掉。改完:wq保存。

第三步:检查ChallengeResponseAuthentication
很多人以为开了PasswordAuthentication就万事大吉,却忽略另一道闸。ChallengeResponseAuthentication如果写成no,部分老版本sshd会把密码验证一并掐死。保险起见,改成:
ChallengeResponseAuthentication yes
保存退出。
第四步:UsePAM别乱动
UsePAM yes是CentOS的默认,它负责把密码拿去跟系统账户比对。有人抄网上“优化”脚本,顺手把UsePAM改成no,结果密钥还能走公钥通道,密码验证却失去PAM支撑,同样被拒。确认该行保持yes即可。
第五步:重启服务,拒绝systemctl restart sshd
生产环境重启sshd会踢掉所有在线会话,风险高。用reload更温柔:
systemctl reload sshd
配置有错,sshd会当场报错,提示哪一行语法不对;没错就静默重载,已连的会话不断,新连接立刻生效。
第六步:排除防火墙与SELinux
密码登录仍失败,先别回头改配置,确认防火墙没做IP层拦截:
firewall-cmd --list-all | grep 22
看到22/tcp放行即可。再看SELinux:
getenforce
Enforcing状态下,若改过ssh端口,需要semanage port -a -t sshportt -p tcp 新端口;如果仅改配置未改端口,SELinux不会拦密码。为防万一,可setenforce 0临时放通,测试通过后再改回Enforcing。
第七步:日志定位,拒绝盲猜
tail -f /var/log/secure,另开窗口尝试密码登录,实时看sshd甩什么错。常见提示:
“Failed password for root from xxx port xxx”——说明密码输错或账户被锁。
“User root not allowed because account is locked”——账户被passwd -l锁了,passwd -u root解锁即可。
如果日志里连Failed password都不吐,八成还是sshd_config没放行,回到第二步再检查拼写、空格、注释符。
第八步:root远程开关
PermitRootLogin也是坑位。CentOS默认写成prohibit-password,密钥能进,密码不让。想保留密钥安全又临时给root开密码,可改成:
PermitRootLogin yes
更安全的做法是另建普通账号,给wheel权限,root保持prohibit-password,需要root时sudo -i,减少爆破面。
第九步:账户本身被锁
passwd -S root查看状态,出现LK字样代表锁定。解锁:
passwd -u root
如果用了fail2ban、denyhosts,检查iptables -L -n是否把客户端IP扔进DROP链,临时测试可fail2ban-client stop关闭服务。
第十步:重启sshd仍不生效,看配置加载路径
极少数场景,管理员手工编译安装过openssh,配置文件不在/etc/ssh。用:
sshd -T | grep -i password
打印运行时的实际配置,若看到的PasswordAuthentication仍是no,说明sshd读的是另一个路径,找到对应文件再改。
完整流程回顾
1. 留密钥会话当后门
备份sshd_config
改PasswordAuthentication yes
改ChallengeResponseAuthentication yes
确认UsePAM yes
systemctl reload sshd
看日志、看防火墙、看SELinux
检查PermitRootLogin与账户锁
必要时sshd -T核对实际配置
按顺序走完,密码登录基本都能复活。做完把PasswordAuthentication改回no,只用密钥,安全又省心。
重点再提醒:改配置前先备份,留一条密钥会话不退出,reload而非restart,看日志而非盲猜,四步保命。
