排障与安全50 条

认证失败的排查路径

SSH 认证失败的排查路径是客户端详细输出、服务端授权日志、服务端生效配置三步;常见根因集中在密钥提供顺序、公钥条目格式、文件权限过宽与服务端策略限制,光看客户端提示容易误判方向。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌‌​​‌‌​‌‌‌​​‌‌​‌‌​‌​​​​​‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌​​​​​‌​‌‌​‌​‌‌​​‌‌​​‌‌​​​​‌​‌‌​‌​​‌​‌‌​‌‌​​​‌‌‌​‌​‌​‌‌‌​​‌​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌‌​‌​​​‌‌‌​​‌​​‌‌​‌‌‌‌​‌‌‌​‌​‌​‌‌​​​‌​​‌‌​‌‌​​​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌​‌​​​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌​‌​‌‌‌​​​​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

认证失败先分客户端与服务端

SSH 认证失败的症状高度相似——多数情况只返回一行权限拒绝,但原因可能出在客户端提供什么、服务端接受什么、以及两者之间的策略限制。有效的排查路径是:先在客户端用详细输出看它尝试了哪些认证方式、每个方式为什么被拒,再去服务端日志找对应的拒绝原因。两端都看,才不会在「以为是密钥问题、实际是账号被策略限制」这类情况上绕路。

基本信息

适用对象OpenSSH 客户端与服务端(Linux、macOS、BSD 等)
客户端证据详细输出里的认证方式尝试顺序与拒绝原因
服务端证据系统授权日志与 sshd 自身日志
生效配置sshd 最终生效值可与配置文件写法不同,需查生效结果
权限要求读取服务端日志与查看生效配置需要 root

典型失败原因

  • 客户端没提供对的密钥:代理里存在多把密钥,先试错了若干把,触及认证尝试次数上限后被拒
  • 服务端没有这把公钥:公钥拼接或追加时换行丢失、写进了错误的用户目录
  • 文件权限过宽:家目录或密钥目录可被他人写,服务端按严格模式直接忽略该密钥
  • 服务端禁用该方式:口令登录被关闭,或只允许证书签发的密钥
  • 账号本身受限:账号被锁定、已过期,或被允许登录名单排除
  • 强制约束不满足:公钥条目里限定了来源地址或强制命令,通过也会被立即断开

客户端定位认证方式

客户端定位认证方式
ssh -vvv user@host 2>&1 | grep -i 'offering\|permission denied\|authentications that can continue'  # 看尝试顺序与拒绝原因
ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519 user@host   # 只提供指定密钥,排除代理干扰
ssh-add -l                        # 检查代理里都装了哪些密钥
eval "$(ssh-agent -s)" && ssh-add -D  # 清空代理后重新只加一把密钥
echo $SSH_AUTH_SOCK               # 代理套接字不对时,客户端用的不是你以为的密钥

服务端确认真实原因

服务端确认真实原因
sshd -T | grep -Ei 'pubkeyauth|passwordauth|permitrootlogin|maxauthtries|allowusers'  # 看生效值
journalctl -u sshd -n 50 --no-pager   # systemd 系统上的 sshd 日志
journalctl -u ssh -n 50 --no-pager    # 单元名随发行版不同
tail -n 50 /var/log/secure            # RHEL 系授权日志
tail -n 50 /var/log/auth.log          # Debian 系授权日志
sudo sshd -d -p 2222                  # 前台调试模式,单次连接的所有决策都会打印
ss -lntp | grep :22                   # 确认是不是这台主机、这个进程在处理连接

客户端提示与真实原因

客户端表现服务端日志线索常见根因
只列出少数认证方式无对应记录服务端未启用该方式或账号被名单排除
拒绝且日志提示密钥被忽略权限或属主告警目录或文件权限过宽、属主不对
拒绝但服务端无异常认证尝试耗尽代理内多把密钥把尝试次数用光
通过后立刻断开强制命令或来源限制触发公钥条目带了附加约束
提示账号不可用账号锁定或过期口令策略与账号生命周期管理
排查顺序建议固定为:客户端详细输出 → 服务端授权日志 → 生效配置。先改配置再找证据是本末倒置,尤其在生产环境上试错可能直接把自己锁在门外。
修改认证相关配置前,务必保留一个已经登录成功的会话,并在改完后先做语法检查再重载;关闭口令认证之前,必须用新窗口确认密钥登录真的可用。

易错点

  • 忽略代理里的多把密钥:客户端按顺序试错密钥,多次失败后触发尝试次数上限,表现为「密钥明明对却登不上」
  • 修改 authorized_keys 时换行丢失:追加操作没带换行会把两条公钥拼成一条无效记录,且服务端只提示拒绝
  • 权限过宽被静默忽略:目录或文件可被同组或他人写时,服务端按严格模式跳过该密钥,日志线索容易看漏
  • 直接改配置文件而不看生效值:同一参数在不同位置重复出现时以先者为准,改错位置等于没改
  • 在服务端反复试错却不保留会话:认证配置属于高风险改动,失去现有会话等于失去回滚手段

数据来源与参考

  • OpenSSH 手册页:ssh(1) 与 sshd_config(5)
  • OpenSSH 手册页:sshd(8) 调试模式
  • 各发行版授权日志位置说明(auth.log 与 secure)

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/automation/ssh-auth-failure-troubleshooting-path.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌‌​​‌‌​‌‌‌​​‌‌​‌‌​‌​​​​​‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌​​​​​‌​‌‌​‌​‌‌​​‌‌​​‌‌​​​​‌​‌‌​‌​​‌​‌‌​‌‌​​​‌‌‌​‌​‌​‌‌‌​​‌​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌‌​‌​​​‌‌‌​​‌​​‌‌​‌‌‌‌​‌‌‌​‌​‌​‌‌​​​‌​​‌‌​‌‌​​​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌​‌​​​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌​‌​‌‌‌​​​​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​