Ubuntu 24.01配置SSH谷歌身份验证器MFA后登录无验证请求且密码验证失败
看起来你在配置SSH双因素认证时遇到了典型的配置冲突问题,我帮你一步步排查可能的原因:
1. 检查OpenSSH配置的兼容性问题
Ubuntu 24.01搭载的OpenSSH版本已经比较新,ChallengeResponseAuthentication这个选项其实已经被标记为过时,取而代之的是KbdInteractiveAuthentication。同时必须确保UsePAM是开启的,否则PAM模块的配置不会生效。
打开/etc/ssh/sshd_config,确认以下配置:
UsePAM yes KbdInteractiveAuthentication yes # 可以保留ChallengeResponseAuthentication yes作为兼容,但主要生效的是上面的选项
修改后记得重启SSH服务:
sudo systemctl restart sshd
2. 排查PAM配置的逻辑问题
你添加的PAM规则顺序和参数可能导致验证流程异常:
auth [success=1 default=ignore] pam_access.so accessfile=/etc/security/access-local.conf:这个规则的success=1意味着如果IP在白名单内,会跳过下一个PAM模块(也就是谷歌验证器),这部分是对的,但如果IP不在白名单,会继续执行下一个模块。- 但要注意,默认的
/etc/pam.d/sshd里可能已经有其他auth规则,比如auth include common-auth,如果你的自定义规则放在了这些默认规则后面,可能会被覆盖或者导致验证逻辑混乱。
建议调整PAM配置的顺序,把你的自定义规则放在auth include common-auth之前,比如:
# 先执行IP白名单检查 auth [success=1 default=ignore] pam_access.so accessfile=/etc/security/access-local.conf # 再执行谷歌验证器 auth required pam_google_authenticator.so # 最后执行默认的密码验证(如果需要同时保留密码+MFA的话) auth include common-auth
注意:如果你的需求是MFA+密码双重验证,就保留
auth include common-auth;如果只需要MFA验证,可以注释掉这一行,但通常建议双重验证更安全。
3. 确认谷歌身份验证器已正确初始化
你有没有在需要使用MFA的用户账户下执行过google-authenticator命令?这个命令会生成密钥、验证码,并创建~/.google_authenticator文件——如果这个文件不存在,PAM模块会直接验证失败,导致你看到的"Permission denied"错误。
切换到目标用户(比如你用来SSH登录的用户),执行:
google-authenticator
按照提示完成配置(建议选择y启用时间同步、禁止多次使用同一验证码等安全选项)。
4. 查看完整的认证日志定位问题
你只贴了部分auth.log内容,完整的日志会告诉你具体是哪个环节出错了。执行以下命令查看最近的SSH认证日志:
sudo tail -n 20 /var/log/auth.log
如果看到类似pam_google_authenticator(sshd:auth): Failed to update secret file或者No such file or directory的错误,就说明用户的~/.google_authenticator文件不存在或者权限不对;如果看到pam_access(sshd:auth): access denied,可能是IP白名单配置有问题。
最后验证
完成以上调整后,重启SSH服务,然后从非白名单IP尝试登录,应该会先提示你输入验证码,再输入密码(或者顺序取决于PAM规则)。如果还是有问题,把完整的auth.log错误信息贴出来,能更精准定位。
备注:内容来源于stack exchange,提问作者Paul

