要在Linux上用PAM实现MFA,关键是密码与TOTP动态码双重通过才允许登录;需同步完成模块安装、用户密钥生成、PAM规则配置(在/etc/pam.d/sshd中@common-auth后添加auth [verifier=0 success=ok default=bad] pam_google_authenticator.so secret=/home/${USER}/.google_authenticator)及SSH启用UsePAM yes和PasswordAuthentication yes。

要在 Linux 上用 PAM 实现多因素认证(MFA),关键是把密码验证和第二因素(比如 TOTP 动态码)组合起来,让两者都必须通过才能登录。这不是装个软件就能跑通的事,得同时搞定模块安装、用户密钥生成、PAM 规则编写和 SSH 配置四件事,缺一不可。
确认 SSH 已启用 PAM 支持
SSH 必须主动调用 PAM,否则所有配置都无效。检查 /etc/ssh/sshd_config 中这两行是否存在且未被注释:
- UsePAM yes —— 这是硬性要求,没有它 PAM 完全不介入登录流程
- PasswordAuthentication yes —— 即使你主要用密钥登录,也得保留这一项,否则 PAM 的 auth 阶段可能被跳过
改完后重启服务:sudo systemctl restart sshd,再用 sshd -T | grep usepam 确认返回 usepam yes。操作前务必留一个活跃终端,防止配置错误导致失联。
安装并验证 Google Authenticator 模块
该模块提供 TOTP 校验能力,需按发行版安装对应包:
- Debian/Ubuntu:
sudo apt install libpam-google-authenticator - RHEL/CentOS/Rocky 8+:
sudo dnf install epel-release google-authenticator - CentOS 7:
sudo yum install epel-release google-authenticator
安装后检查模块文件是否存在:
- Debian/Ubuntu:
ls /lib/security/pam_google_authenticator.so - RHEL 系列:
ls /usr/lib64/security/pam_google_authenticator.so
路径不存在说明安装失败或架构不匹配,不能继续下一步。
为每个用户生成并保护密钥文件
MFA 是按用户生效的,root 不能代劳。以目标用户身份执行:
-
su - username(推荐用su -确保环境干净) -
google-authenticator,按提示依次选:y(启用 TOTP)、y(更新配置)、y(防重放)、y(30 秒容错)、y(生成 10 个应急码) - 扫描终端显示的二维码,或手动输入密钥绑定手机 App
- 确认配置文件权限:
ls -l ~/.google_authenticator必须是-rw-------(600),否则 PAM 拒绝读取
精准配置 PAM 规则,确保“密码且动态码”
编辑 /etc/pam.d/sshd,在 @include common-auth 行之后添加:
auth [verifier=0 success=ok new_authtok_reqd=ok default=bad] pam_google_authenticator.so secret=/home/${USER}/.google_authenticator
关键点:
- 必须放在
@include common-auth后面,保证密码校验先完成 - 用
required或带条件的[...]控制标志,避免sufficient导致短路 - 不要加
nullok(上线后),否则未配 MFA 的用户能绕过第二步 - 不建议直接改
system-auth,容易影响所有服务;专用于 SSH 的配置应集中在sshd文件中
最后测试:用新终端尝试 SSH 登录,会先提示输密码,成功后再要 6 位动态码。任一环节错,连接立即断开。











