linux中实现双因素认证需通过pam框架整合密码/密钥与totp动态码,首选google authenticator方案;配置涵盖安装模块、用户密钥生成、ssh及console/sudo/gnome等多入口联动,并强化faillock防护、禁用密码直连、强制管理员2fa及密钥轮换。

在 Linux 系统中结合双因素认证(2FA),核心是利用 PAM 框架把“你知道的”(如密码或密钥)和“你拥有的”(如手机上生成的 TOTP 动态码)串联起来,让登录必须同时满足两类独立凭证。这不是加一个软件就完事,而是要对认证流程做精准编排。
选对方案:优先用 Google Authenticator + PAM
这是目前最成熟、免硬件、兼容性强的组合:
- 服务端无需额外部署认证服务器,每个用户本地生成密钥,符合最小依赖原则
- 基于 TOTP 标准(RFC 6238),支持 Google Authenticator、Microsoft Authenticator、Authy 等主流 App
- 所有逻辑由 pam_google_authenticator.so 模块在本地完成校验,不依赖网络,响应快、故障面小
关键配置三步走
不是只改一个文件,而是 SSH 服务、PAM 模块、用户密钥三者协同生效:
-
装模块:Ubuntu/Debian 运行
sudo apt install libpam-google-authenticator;RHEL/CentOS 启用 EPEL 后运行sudo dnf install google-authenticator -
配用户:切换到目标用户后执行
google-authenticator,建议选y(时间令牌)、y(禁止重放)、y(启用速率限制),生成的 16 位密钥和应急码务必离线存好 -
连通链路:
- 编辑
/etc/pam.d/sshd,在顶部添加:auth [success=ok default=bad] pam_google_authenticator.so nullok
(nullok允许未配置 2FA 的用户暂用旧方式,适合灰度上线) - 编辑
/etc/ssh/sshd_config,确保这三行开启:ChallengeResponseAuthentication yesUsePAM yesAuthenticationMethods publickey,keyboard-interactive(若用密钥登录)或password,keyboard-interactive(若用密码)
- 编辑
不止于 SSH:覆盖更多登录入口
一台服务器的安全防线不能只守 SSH。真实攻击常从 console 或 sudo 绕过:
-
本地终端(console):修改
/etc/pam.d/system-auth,在 auth 栈开头插入同一条 pam_google_authenticator.so 规则,重启 getty 服务即可生效 -
sudo 权限提升:在
/etc/pam.d/sudo中添加相同 auth 行,这样即使拿到普通用户密码,提权时仍需输入动态码 -
图形界面(如 GNOME):多数桌面环境调用
password-auth,往该文件 auth 栈加模块,即可让 GDM 登录也触发 2FA
安全增强细节不能漏
基础能用只是起点,真正防住攻击得抠几个关键点:
- 把
pam_faillock.so和 2FA 模块配合使用:先锁密码尝试,再验动态码,避免攻击者靠穷举验证码绕过 - 禁用
PasswordAuthentication no(如果用密钥登录),防止有人绕过 PAM 直接输密码 - 为管理员账户强制启用
nonull参数(去掉 nullok),确保没人能跳过 2FA - 定期轮换用户密钥,并通过脚本自动归档应急码,避免丢失后被锁死











