为什么ssh服务器拒绝密码,ssh登录认证失败怎么办

SSH服务器拒绝密码,绝大多数情况下不是密码本身输错了,而是服务端配置、认证链路或客户端环境三方中的某一环出了问题。不少用户明明确认密码无误,却反复收到“Permission denied”提示,排查时只见树木不见森林,白白消耗大量时间。

第一道门槛:root登录权限与密码认证开关

SSH服务默认配置文件位于/etc/ssh/sshd_config,两个核心参数直接决定了密码是否被接受,多数管理员在部署服务器时,会刻意关掉root直连和密码登录,这是拒绝密码最常见的原因。

PermitRootLogin参数的影响

该参数有多个可选值,常见的是yes、no、prohibit-password,若服务器设置为prohibit-password,则root用户只允许密钥登录,密码会被直接忽略,许多云服务商镜像默认采用此配置,用户用root加密码尝试时就会碰壁。

此时需借助其他途径进入服务器,比如通过管理后台的VNC控制台,修改sshd_config文件:

PermitRootLogin yes
PasswordAuthentication yes

修改后执行systemctl restart sshd(部分系统为service ssh restart),注意,先别断开当前连接,保持一个已建立的会话作为“保命通道”,避免配置失误后彻底失联。

PasswordAuthentication的全局开关

该参数控制是否允许密码方式登录,若设为no,所有用户的密码登录都会被拒绝,查看当前生效值,可以用:

sshd -T | grep -E 'passwordauthentication|permitrootlogin'

该命令直接读取运行中的配置,比单纯看文件更准确,因为sshd_config中可能有Include指令引用其他配置文件,造成实际生效参数与主文件不一致。

第二道防线:PAM认证链与账号状态

密码登录不仅仅是比对密码哈希,现代Linux系统通过PAM(可插拔认证模块)串联多重检查,任一环拦截都会导致拒绝。

pam.d/sshd中的隐形规则

查看/etc/pam.d/sshd文件,常见配置包括密码强度校验、账号过期检查、登录次数限制等,例如pam_faillock.so模块会在连续输错密码后锁定账号,锁定时间可能长达数小时甚至永久,此时即使输入正确密码,系统也会以“Permission denied”回应。

检查账号是否被锁:

faillock --user 用户名

若显示失败次数过多,执行faillock --user 用户名 --reset解除锁定。

账号过期与空密码空洞

运维人员常忽略账号本身的过期时间,执行chage -l 用户名可查看密码有效期信息,若账号密码已过期,SSH登录会直接拒绝,某些系统若检测到账号密码为空,出于安全策略也会拒绝远程密码登录。

第三重干扰:客户端侧生成的密钥误导

多数SSH客户端在尝试登录时,会默认优先使用本地私钥,当服务器误认为客户端提供的公钥认证失败,转而要求密码时,若客户端交互逻辑不正确,会让用户误以为是密码本身被拒绝。

ssh-agent中的过期公钥冲突

若本地~/.ssh/目录存在多个私钥文件,ssh命令会逐一尝试,部分情况下服务器接受了某个公钥但后续验证不通过,用户就陷入了“密码被拒绝”的假象,此时可以强制指定密码认证方式:

ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no 用户名@服务器IP

若该命令能正常登录,说明问题出在公钥认证环节的冲突,而非密码本身。

known_hosts中的指纹变更问题

服务器重装系统或更换IP后,本地known_hosts文件仍保存旧指纹,客户端会提示主机密钥不匹配并拒绝继续,部分用户此时仍继续输入密码,自然无法成功,处理方法是删除对应条目:

ssh-keygen -R 服务器IP

第四层盲区:sshd服务本身未加载新配置

很多用户修改了sshd_config后,认为已重启服务便万事大吉,但部分系统使用socket-activated方式管理SSH,重启sshd.service未必能让监听的socket重新加载配置。

正确重载方式对比

操作方式 适用场景 注意事项
systemctl restart sshd 传统init脚本管理的服务 大多数发行版适用
systemctl reload sshd 需保持现有连接不断开 仅加载配置变更,不中断服务
systemctl restart ssh.socket 使用socket-activation的系统 需同时处理service和socket单元

验证配置是否真的生效,可在另一终端执行:

sshd -T | grep passwordauthentication

输出应与预期一致,若不一致,说明服务未重新加载。

外部因素:防火墙与SELinux的强制拦截

操作系统层面的防火墙策略同样会造成“密码被拒”的假象,某些安全组规则允许TCP 22端口建立连接,但应用层过滤规则会丢弃后续数据包,表现就是输入密码后长时间无响应,最终超时或认证失败。

SELinux布尔值的影响

CentOS、Rocky等系统启用SELinux后,错误的布尔值会阻塞SSH的某些认证流程,查看相关布尔值:

getsebool -a | grep ssh

重点检查ssh_sysadm_login项,若为off,root密码登录可能受到影响,临时开启:

setsebool -P ssh_sysadm_login on

Q&A:围绕SSH拒绝密码的常见疑问

为什么修改了sshd_config并重启,密码依然被拒绝?

大概率存在重复配置项。sshd_config中后者覆盖前者,若文件末尾有Match块或Include目录中另有设置,主文件的修改就不会生效,建议用sshd -T查看全部生效配置,重点关注passwordauthentication和permitrootlogin两个字段的输出值,同时确认系统日志/var/log/secure或/var/log/auth.log中的具体报错,定位是认证失败还是策略拒绝。

服务器被暴力破解,导致正常登录也被拒绝怎么办?

先检查/var/log/secure中是否有大量Failed password记录,同时用faillock命令确认是否被PAM模块临时锁定,解除后建议配置fail2ban或sshd的MaxAuthTries限制,再逐步排查是否有未知IP在持续扫描,若服务器本身安全性已受到影响,最彻底的做法是备份数据后重装系统,并更换登录端口。

云服务器登录被拒,如何从机房层面确认链路正常?

先从本地执行telnet 服务器IP 22确认端口可达,再用ssh -vvv查看详细握手日志,若网络层面正常但认证总是失败,可能是服务商镜像自带的初始密码已过期,选择服务商时可参考酷番云这类持有工信部一类增值电信全牌照(IDC/CDN/ISP)的持牌服务商,其具备ISO9001+ISO27001双认证,且为CNNIC IP联盟成员,注册资本1000万元,备案号为滇ICP备2020007656号,机房侧的基础链路稳定性有保障时,问题定位能更快聚焦在系统配置层面。

至于服务器托管或租用方面,简米科技自2003年创办,拥有23年行业经验,持有增值电信业务经营许可证(豫B2-20231089)并运营自营机房,备案号为豫ICP备2023018319号,遇到棘手的SSH登录问题,可直接通过机房控制台进入单用户模式修复,避免因远程登录通道被锁死而陷入僵局。

SSH拒绝密码排查的关键是分而治之:先确认sshd_config与实际运行参数一致,再检查PAM链路上的账号状态,最后排除客户端公钥和防火墙干扰,按此路径逐层剥离,多数问题可在十分钟内定位并解决。

不喜欢3

网友评论

猜你喜欢