SSH公钥+谷歌2FA结合IP白名单配置异常:白名单IP登录失败,咨询是否可跳过keyboard-interactive认证
兄弟,你这个问题我之前帮朋友排查过类似的,核心是sshd的全局认证方法配置和PAM的IP白名单逻辑没对齐,导致白名单IP登录时踩了坑:
你当前的sshd_config里全局设置了AuthenticationMethods publickey,keyboard-interactive,这意味着不管什么IP,sshd都要求必须完成「公钥认证 + 键盘交互式认证」这两个步骤才行。但白名单IP通过PAM的pam_access.so跳过了谷歌2FA,相当于keyboard-interactive的认证步骤没有实际内容可走,sshd就会认为你没完成全部认证流程,直接报Permission denied (keyboard-interactive)。
答案是可以针对白名单IP单独跳过keyboard-interactive认证,只需要调整sshd_config的配置逻辑,不要用全局的AuthenticationMethods,而是用Match块来区分不同IP段的认证要求,具体操作如下:
第一步:修改/etc/ssh/sshd_config配置
把原来全局的AuthenticationMethods配置删掉,换成基于IP的匹配块,注意Match块必须放在配置文件的最后面,否则会失效:
# 保留基础配置 ChallengeResponseAuthentication yes UsePAM yes PasswordAuthentication no # 建议禁用密码认证,进一步提升安全性 # 针对白名单IP单独设置认证规则 Match Address ###.###.###.### AuthenticationMethods publickey # 只需要公钥认证即可 # 对所有其他IP应用默认规则:公钥+2FA Match all AuthenticationMethods publickey,keyboard-interactive
第二步:验证现有PAM配置(无需修改)
你之前的PAM和access文件配置是没问题的:
/etc/pam.d/sshd里通过pam_access.so匹配白名单IP,跳过谷歌2FA/etc/security/access-local.conf的IP白名单规则也正确
第三步:重启sshd服务生效
执行命令重启sshd(根据你的系统选择对应命令):
# 适用于systemd系统(CentOS7+/Ubuntu16.04+等) systemctl restart sshd # 适用于SysVinit系统(老版本CentOS/Ubuntu等) service sshd restart
为什么这样就能解决问题?
调整后,白名单IP登录时,sshd会直接使用publickey单因素认证,不会要求keyboard-interactive步骤;外部IP登录时,才会要求公钥+键盘交互式认证(也就是公钥+谷歌2FA),完美和PAM的逻辑对齐,就不会出现「认证部分成功但权限被拒」的情况了。
你可以先在测试环境验证没问题后,再推到生产环境哦。
备注:内容来源于stack exchange,提问作者GaryB

