问题出现得很突然,日志倒是留得挺全。一台 Ubuntu 22.04 上新加运维账号,authorized_keys 放好、权限 600、属主正确,ssh -i 登录仍然提示要密码,/var/log/auth.log 里有一行 Authentication refused: bad ownership。

刚开始盯着「.ssh 目录权限是 777,属于同样的问题,日志提示略有不同」,折腾了半个多小时,排掉了。

排查方向其实有限,先把可能性排一排。StrictModes 默认开启,家目录或 .ssh 只要组或其他用户可写就拒绝公钥认证。少数情况下是家目录被设成 775 且属组里有其他人,属主正确也没用。

还有一种情况,SELinux 上下文不对,sshd 读不到 authorized_keys。

第一件事是看拒绝原因的确切文案

journalctl -u ssh -n 50 --no-pager | grep -i 'authentication refused'

随后逐级收紧家目录与 .ssh 权限

chmod 700 /home/ops/.ssh && chmod 600 /home/ops/.ssh/authorized_keys && chmod 750 /home/ops

再往下确认属主与属组只有本人

ls -ld /home/ops /home/ops/.ssh && stat -c '%U:%G %a' /home/ops/.ssh/authorized_keys

恢复 SELinux 上下文后重试

restorecon -Rv /home/ops/.ssh && ssh -i /root/ops.pem ops@127.0.0.1 true

别只看报错消失,验证要多做一步。ssh -v 输出里出现 Offering public key 之后直接认证通过,不再提示 password,auth.log 中不再有 bad ownership 记录。

提醒一点。StrictModes 是防止别人改你的密钥后提权,不要为了让登录顺利去关它;家目录的组写权限是重灾区,改权限比改配置安全。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189