centos 7配置google authenticator实现ssh双因子认证的核心是正确部署pam_google_authenticator.so模块并开启challengeresponseauthentication,最易失败环节为pam配置顺序错误、.google_authenticator文件权限不合规、selinux策略未调整、系统时间不同步及客户端未启用keyboard-interactive认证方式。

直接上结论:CentOS 7 上配 Google Authenticator 做 SSH 双因子认证,核心是 pam_google_authenticator.so 模块 + sshd 的 ChallengeResponseAuthentication 开启,但最常失败的环节不是安装,而是 PAM 配置顺序和用户级配置文件权限。
为什么 pam_google_authenticator.so 加在 auth include password-auth 上面?
PAM 认证链是顺序执行的,一旦某条规则返回 success 或 ignore,后续模块可能被跳过。如果把 Google 验证器模块放在 password-auth 之后,系统会先走完密码验证(成功即登录),根本不会触发二次验证。
-
auth [success=done default=ignore]是危险写法,容易绕过 —— 不要用 - 必须用
auth [success=ok default=die]或更稳妥的auth required pam_google_authenticator.so - 确保它出现在
auth include password-auth的正上方,且前面没有requisite类模块提前终止流程
google-authenticator 命令生成的 .google_authenticator 文件为什么总被拒绝读取?
OpenSSH 默认启用 StrictModes yes,它会检查用户家目录、~/.ssh 和 ~/.google_authenticator 的权限。只要其中任意一项不满足严格限制(比如目录可被 group/o 写),PAM 就静默拒绝验证,sshd -d 日志里只显示 authentication failure,毫无提示。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 运行后立刻执行:
chmod 700 ~ && chmod 600 ~/.google_authenticator && chmod 700 ~/.ssh - 确认
~所属用户和组正确:ls -ld ~输出应为drwx------. 1 user user - 别忽略 SELinux —— 若启用,需加策略:
setsebool -P authlogin_nis_enabled 1(CentOS 7 默认 enforcing)
时间不同步会导致验证码始终无效
Google Authenticator 默认使用 TOTP(基于时间的一次性密码),服务端与客户端时间差超过 30 秒即失效。Linux 服务器若未同步 NTP,新生成的密钥几乎必然失败。
- 检查时间偏移:
ntpdate -q pool.ntp.org或chronyc tracking - 强制同步一次:
systemctl stop chronyd && ntpdate -s pool.ntp.org && systemctl start chronyd - 验证是否生效:
google-authenticator -t -d(-d开启 debug,会输出本地时间戳与期望窗口)
测试时为什么输对验证码还是连不上?
常见真问题不是“验证码错”,而是 SSH 连接根本没走到 PAM 的 Google 验证环节 —— 大概率因为客户端没发 ChallengeResponse 请求。
- 客户端必须显式启用键盘交互:
ssh -o PubkeyAuthentication=no -o PreferredAuthentications=keyboard-interactive user@host - 如果用 OpenSSH 8.2+,默认禁用
keyboard-interactive,需在~/.ssh/config加:PreferredAuthentications keyboard-interactive,password - 别依赖 PuTTY 图形界面自动弹窗 —— 它可能缓存了旧的认证方式,重启会话或清空“Connection → Data → Auto-login username”再试
最关键的细节藏在日志里:tail -f /var/log/secure | grep google 能看到模块加载、密钥读取、时间窗口比对等每一步结果;而 sshd -d 启动调试模式时,PAM 流程会逐行打印,这才是定位“卡在哪”的唯一可靠手段。










