ssh服务器拒绝了密码,先别急着重装系统
ssh服务器拒绝了密码,核心原因是认证链路某环节出了问题,按照”配置文件→密钥权限→系统状态”的顺序排查,多数情况下能在十分钟内解决。
很多人在服务器上敲了一下午命令,突然ssh连不上了,密码明明没改过,系统却提示Permission denied,这个问题坑过几乎所有运维,也坑过不少刚入行的开发者,别慌,密码被拒和密码错误是两码事,前者意味着服务器收到了你的请求,只是在某个环节把你挡在了门外。
先确认是不是密码真的错了
排查前先做一次最简单的验证:在本地终端手动输入密码,注意观察是立即报错还是卡顿后报错,立即报错通常说明密码比对失败,卡顿几秒再报错反而是网络或认证配置的问题。
如果你有服务器控制面板(比如简米云、酷番云的网页终端),先通过网页版登录进去,用passwd命令重置一下密码,然后再试ssh连接,这一步能排除掉绝大多数”密码输错”的尴尬场景。
查看sshd_config里的认证选项
ssh服务器拒绝密码最常见的原因集中在/etc/ssh/sshd_config这个配置文件里,登录服务器后,执行下面命令查看关键项:
grep -E "PasswordAuthentication|ChallengeResponseAuthentication|PubkeyAuthentication" /etc/ssh/sshd_config
重点看三个参数:
- PasswordAuthentication:必须为yes,若为no则系统直接拒绝所有密码登录
- ChallengeResponseAuthentication:部分老系统需要保持yes
- PermitRootLogin:如果你想用root账号登录,这里需要是yes或without-password
如果是这里的问题,改完配置后重启sshd服务即可:
systemctl restart sshd
行业共识认为,修改sshd_config前先备份一份原文件是个好习惯,防止改错导致彻底失联。
检查root账号的登录限制
用普通用户连不上时,多数人第一反应是换root试试,但root被拒的更常见原因是PermitRootLogin参数,很多云服务器默认镜像把这个参数设成了no,专门防暴力破解。
如果你需要root直接登录,把PermitRootLogin改成yes并重启服务,但业内专家指出,更安全的做法是保持禁止root密码登录,用普通用户加sudo提权操作,既能干活又能减少暴露面。
ssh服务器拒绝了密码怎么解决?从系统层面找原因
配置文件没问题时,下一步就该检查系统层面的干扰因素了,这里整理了三种高频场景,按出现概率从高到低排列。
SELinux拦截了ssh的认证过程
CentOS和RHEL系服务器上,SELinux经常扮演”隐形杀手”,即使配置文件全对,SELinux策略依然可能拦截sshd对某些文件的读取,快速验证方法:
getenforce
如果输出是Enforcing,先临时改成Permissive试试:
setenforce 0
改完再尝试ssh连接,如果通了,说明确实是SELinux的锅,可以进一步查看审计日志确认,再决定是调整策略还是直接关闭。
家目录或.ssh目录的权限问题
这个原因特别隐蔽,因为它和密码认证本身无关,却会导致登录流程走到一半被强制终止,服务器判定你的home目录或authorized_keys文件权限过大时,出于安全考虑会拒绝认证。
检查以下权限是否符合要求:
- 家目录权限不能超过755
- ~/.ssh目录权限应为700
- ~/.ssh/authorized_keys权限应为600
修正命令如下:
chmod 755 ~ chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
这几行命令如果你在网页终端上执行过权限收紧操作,很可能会触发这个坑。
密码过期或账户被锁定
有些服务器开启了密码有效期策略,密码过期后ssh会直接拒绝密码认证,查看账户状态:
chage -l username
如果看到Password expires那一行显示密码已过期,执行passwd username强制更新即可,多次输错密码也可能触发PAM的账户锁定策略,用faillock –user username查看锁定状态,必要时执行faillock –user username –reset解除锁定。
zhangsan面提到的密码正确仍被拒,八成是密钥文件在捣乱
有些人遇到的问题是:密码确实是对的,但ssh服务器明确提示密码被拒绝,甚至根本不弹出密码输入框,碰到这种场景,责任方通常不是密码认证本身,而是密钥认证优先级高于密码认证。
authorized_keys里有失效的公钥
当客户端携带密钥发起连接时,sshd会优先校验公钥,如果authorized_keys文件里存在格式不对或已失效的公钥条目,认证过程可能直接进入异常分支,连密码输入的机会都不给你。
进入~/.ssh目录,清空或重命名authorized_keys后重启sshd服务,再试密码登录,如果恢复了,说明问题就在这个文件里,逐条排查公钥内容,把多余的条目删掉。
客户端配置强制走密钥认证
如果你的本地~/.ssh/config文件里对某台服务器指定了IdentitiesOnly yes,ssh客户端会忽略密码输入,只尝试密钥认证,检查本地配置文件:
cat ~/.ssh/config
看到类似以下内容时,注释掉或删除:
Host myserver
IdentitiesOnly yes
PreferredAuthentications publickey
这条排查方向常被忽略,因为很多人习惯在服务器端找问题,忽略了客户端配置也在参与认证决策。
长期有效的ssh防坑策略
解决完眼前问题后,以下几个习惯能帮你避开后续大量同类麻烦。
开启sshd的详细日志
在/etc/ssh/sshd_config里把LogLevel设置为VERBOSE,重启服务后,所有认证细节都会写入/var/log/secure或/var/log/auth.log,下次再遇到拒绝密码时,直接看日志里最后几行,原因一目了然。
设置Fail2ban防护暴力破解
据统计,互联网上针对ssh的暴力破解尝试几乎每分钟都在发生,安装fail2ban并配置好sshd的防护规则,能自动封禁短时间内多次失败尝试的IP,既降低安全风险,也能减少账户被锁定的概率。
备用登录通道的重要性
无论配置多完善,都建议保留一条不依赖ssh的备用登录通道,云服务器厂商的网页版VNC,或者本地串口登录,都属于这类通道,遇到ssh服务器拒绝密码这类问题时,这条通道就是救命的。
关于ssh服务器拒绝密码的常见疑问
ssh密码正确但登录被拒,重启服务器能解决吗?
不确定时可以先重启试试,但多数情况下重启并非最优解,如果问题出在sshd进程异常或PAM模块锁死,重启会短暂恢复;但如果是配置、权限或密钥文件的问题,重启后大概率依旧被拒,建议优先用systemctl restart sshd来重启服务而不是整机重启,影响面更小。
Windows下用ssh连Linux服务器提示密码被拒,和电脑有关系吗?
同一条网络环境下从不同设备尝试连接,是判断问题归属的有效方法,如果手机端ssh客户端能正常登录而Windows端不行,那就是客户端配置或本地网络环境的问题,反之如果所有设备都被拒,问题在服务器端,Windows下常见坑是OpenSSH版本过旧,或不支持新版密钥交换算法,可以尝试升级系统自带的OpenSSH组件。
修改ssh端口能减少密码被暴力破解的概率吗?
能,把默认端口22改成其他高位端口,能躲过大量基于端口扫描的批量攻击脚本,但要注意,这并不能解决密码本身的强度问题,只降低了被探测到的概率,修改端口后需要同步调整云安全组规则和本地ssh客户端的连接端口,避免把自己挡在门外。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/785528.html


