带MFA的pam.d配置异常:指定IP免验证/公钥认证失效问题
带MFA的pam.d配置异常:指定IP免验证/公钥认证失效问题
嘿,我看你这配置踩了PAM模块跳转规则的坑,太常见了!先给你拆解清楚问题根源,再给你现成的修复方案。
问题1:指定IP直接免密免公钥登录的原因
你原来的第一行配置:
auth [success=done default=ignore] pam_access.so accessfile=/etc/security/access-without-MFA.conf
这里的success=done是关键——它的意思是:只要pam_access匹配到了允许的IP,直接终止整个认证流程并返回成功。后面的common-auth(里面包含了公钥/密码认证的逻辑)根本没机会执行,所以那些IP的用户直接就能登录,完全跳过了所有验证步骤,这肯定不符合你的需求。
问题2:调整顺序后公钥认证失效的原因
你把pam_access挪到后面之后,PAM会先执行common-auth里的模块(包括MFA和密码认证)。如果你的common-auth里有requisite类型的密码模块,那么即使用户在SSH层面通过了公钥认证,PAM还是会强制要求输入密码,导致公钥认证看起来像是失效了,自动化自然就没法搞了。
修复方案:精准跳过MFA,保留公钥/密码认证
核心思路是:让指定IP的用户只跳过MFA模块,但必须通过公钥/密码认证;非指定IP的用户则需要完成全流程认证。
步骤1:修正pam.d/sshd的auth规则
把原来的pam_access行的success=done改成success=1,并把MFA模块单独放在pam_access的下一行,这样匹配成功时只会跳过MFA,不会跳过后续的公钥/密码认证。完整配置示例如下:
#%PAM-1.0 # 匹配免MFA的IP时,跳过下1个模块(也就是下面的MFA模块) auth [success=1 default=ignore] pam_access.so accessfile=/etc/security/access-without-MFA.conf # 替换成你实际使用的MFA模块,比如谷歌验证器(nullok可选,允许未设置MFA的用户临时登录) auth requisite pam_google_authenticator.so nullok # auth requisite pam_nologin.so auth include common-auth # 这里包含公钥/密码的认证逻辑 account requisite pam_nologin.so account include common-account password include common-password session required pam_loginuid.so session include common-session
步骤2:验证access-without-MFA.conf的规则
确保你的IP白名单格式正确,比如:
# 允许192.168.1.0/24网段和10.0.0.5的IP访问 +:ALL:192.168.1.0/24 +:ALL:10.0.0.5 # 拒绝其他所有IP(这行必须放在最后) -:ALL:ALL
步骤3:检查sshd_config的关键配置
为了让公钥认证正常工作,确保/etc/ssh/sshd_config里有这些设置:
PubkeyAuthentication yes UsePAM yes ChallengeResponseAuthentication yes # MFA基于挑战响应的话必须开启
改完后记得重启sshd服务:systemctl restart sshd
测试注意事项
千万不要直接断开当前SSH连接!用另一个终端窗口测试新配置,避免配置错误把自己锁在服务器外。
备注:内容来源于stack exchange,提问作者Andrew_ram
相关产品推荐
相关产品推荐

