多因素认证(MFA)是重构服务器登录安全逻辑的关键支点,须深度集成PAM、协同密钥登录、配备可验证应急机制,并与审计响应联动。

多因素认证(MFA)不是“加个验证码就完事”的功能开关,而是重构服务器登录安全逻辑的关键支点。真正有效的防护,必须把MFA嵌入认证流程的每个关键环节,同时兼顾可用性与应急能力。
一、PAM层深度集成:不止于SSH登录
Linux系统中,PAM是所有认证行为的统一入口。仅在/etc/pam.d/sshd里加一行pam_google_authenticator.so远远不够。
-
覆盖全部高危入口:除SSH外,还需同步修改
/etc/pam.d/sudo和/etc/pam.d/su,防止用户绕过SSH直接提权 -
区分认证类型:使用
auth [success=ok default=bad]等跳转控制,让密码正确但令牌错误时返回统一提示,避免泄露验证阶段信息 -
拒绝空令牌兜底:生产环境应去掉
nullok参数,强制所有用户启用2FA;迁移期可先用auth [default=ignore]临时放行未配置用户
二、与密钥登录协同工作
很多团队误以为“用了SSH密钥就不用MFA”,其实二者是互补关系:密钥防暴力破解,MFA防凭证盗用。关键在于配置顺序与策略组合。
-
双因子组合写法:在
/etc/ssh/sshd_config中设AuthenticationMethods publickey,keyboard-interactive,确保必须同时通过私钥+动态码 -
避免交互冲突:若脚本需免交互登录(如Ansible),可在PAM配置中为特定用户或组添加
auth [user_unknown=ignore success=ok default=bad] pam_succeed_if.so user ingroup no2fa,实现白名单豁免 -
禁用密码不等于安全闭环:即使
PasswordAuthentication no,仍要保留ChallengeResponseAuthentication yes,否则MFA模块无法触发
三、应急机制必须可验证、可轮换
所有MFA方案都必须回答一个问题:“手机丢了怎么办?”应急码不是生成后存进笔记就算完成。
-
离线保存+定期刷新:生成时用
google-authenticator -t -d -f -r 3 -w 3命令,自动输出10个一次性备用码,并立即导入密码管理器加密备份 -
绑定恢复路径:在
~/.google_authenticator文件末尾追加RECOVERY_CODES: /var/lib/2fa/recovery/user1.codes,配合定时脚本校验文件存在性与权限(应为600) -
锁定失效逻辑:每次使用应急码后,PAM模块默认会将其标记为已用;建议搭配
pam_exec.so调用清理脚本,自动归档并生成新码集
四、审计与异常响应联动
MFA本身不产生日志,但PAM和SSH可以。真正的高级防护,是让认证失败事件触发后续动作。
-
精准记录来源:在
/etc/pam.d/sshd中加入auth [default=ignore] pam_exec.so /usr/local/bin/log_2fa_failure.sh,脚本中提取PAM_RHOST和PAM_USER写入专用日志 -
失败次数联动封禁:将
pam_tally2.so与MFA模块同置auth段,设置deny=3 unlock_time=900,三次令牌错误即锁账户30分钟 -
高危IP自动上报:日志脚本检测到同一IP在5分钟内触发3次MFA失败,自动调用API向SIEM平台发送告警,并写入
/etc/hosts.deny

















