问题出现得很突然,日志倒是留得挺全。一台 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 是防止别人改你的密钥后提权,不要为了让登录顺利去关它;家目录的组写权限是重灾区,改权限比改配置安全。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
