核心是密码或密钥验证后调用Google Authenticator动态验证码二次校验,需同步完成PAM模块安装、用户密钥生成、/etc/pam.d/sshd规则配置(顶部添加auth [success=ok new_authtok_reqd=ok default=bad] pam_google_authenticator.so)、/etc/ssh/sshd_config启用ChallengeResponseAuthentication及AuthenticationMethods,并重启sshd服务。

直接启用 SSH 双因子认证,核心是让系统在密码或密钥验证之后,再调用 Google Authenticator 生成的动态验证码做第二道校验。这不是装个包就能用的功能,必须同步完成模块安装、用户配置、PAM 规则和 SSH 服务四方面调整。
安装 PAM 模块并确认文件存在
不同发行版安装命令不同,但目标一致:把 pam_google_authenticator.so 放到系统能加载的位置。
- CentOS/RHEL/Rocky 8+:先启用 EPEL 源,再运行 dnf install google-authenticator;验证文件是否在 /usr/lib64/security/pam_google_authenticator.so
- Ubuntu/Debian:运行 apt install libpam-google-authenticator;检查 /lib/security/pam_google_authenticator.so 是否存在
- 装完后执行 ldd /path/to/pam_google_authenticator.so | grep "not found",确保无缺失依赖
每个用户单独生成并保护密钥文件
root 不能代劳,也不能复制密钥文件。必须以目标用户身份运行命令,且严格控制权限。
- 切换到该用户:su - username(不要用 sudo -u username,环境变量可能不全)
- 执行 google-authenticator,按提示全部选 y:启用 TOTP、禁用重用、开启速率限制、保存配置、生成恢复码
- 立即执行:chmod 600 ~/.google_authenticator && chmod 700 ~ && chmod 700 ~/.ssh
- 5 个应急备用码务必离线保存——手机丢失或重装 App 时全靠它
正确配置 /etc/pam.d/sshd
PAM 行位置和参数决定 MFA 是否真正触发。加错地方等于没配。
- 在 /etc/pam.d/sshd 文件顶部添加(不是末尾,也不是中间):
auth [success=ok new_authtok_reqd=ok default=bad] pam_google_authenticator.so nullok secret=/home/%u/.google_authenticator - nullok 仅用于调试阶段;上线前删掉它,并确保所有目标用户都已运行过 google-authenticator
- 这一行必须出现在 auth [success=done] pam_unix.so 之后、auth required pam_deny.so 之前
- 避免使用 required 或 [success=done],否则可能跳过后续认证环节
调整 /etc/ssh/sshd_config 并重启服务
SSH 必须明确知道要走“挑战响应”流程,否则 PAM 规则根本不会被调用。
- 确认以下三项已取消注释且设为 yes:
ChallengeResponseAuthentication yes
UsePAM yes
PasswordAuthentication no(若只用密钥登录,可保留为 yes,但需配合 AuthenticationMethods) - OpenSSH 8.8+ 版本必须设置:
AuthenticationMethods publickey,keyboard-interactive(密钥 + 验证码)
或 AuthenticationMethods keyboard-interactive(密码 + 验证码) - 修改前备份原文件;改完执行 sudo systemctl restart sshd(reload 不生效)
- 测试时用新终端登录,不要断开当前会话


















