如何在 Linux SSH 登录中配置 Google Authenticator 双因素认证?

文章导读
在 Linux SSH 登录中配置 Google Authenticator 双因素认证,最稳妥的方式是通过 PAM 模块 libpam-google-authenticator 实现。该方案基于 TOTP 算法,在原有密码或密钥认证基础上增加动态验证码,适用于需要加强远程登录安全的服务器环境。配置核心在于修改 SSH 和 PAM 配置文件,但必须注意 OpenSSH 版本差异以防服务启动失败。
📋 目录
  1. 1. 检查版本与安装模块
  2. 2. 生成用户密钥
  3. 3. 配置 PAM 模块
  4. 4. 配置 SSH 服务 (关键步骤)
  5. 5. 重启 SSH 服务
  6. 6. 验证是否生效
  7. 7. 常见坑与排查
  8. 参考来源
A A

在 Linux SSH 登录中配置 Google Authenticator 双因素认证,最稳妥的方式是通过 PAM 模块 libpam-google-authenticator 实现。该方案基于 TOTP 算法,在原有密码或密钥认证基础上增加动态验证码,适用于需要加强远程登录安全的服务器环境。配置核心在于修改 SSH 和 PAM 配置文件,但必须注意 OpenSSH 版本差异以防服务启动失败。

先说结论:这是标准的 PAM 认证模块配置过程,但 OpenSSH 8.8+ 版本配置指令有变,配置错误可能导致无法登录。

  • 先判断:执行 ssh -V 确认 OpenSSH 版本,Debian/Ubuntu 与 CentOS/RHEL 安装包名称不同。
  • 优先做:操作前保持当前 SSH 连接不断开,备份 /etc/ssh/sshd_config/etc/pam.d/sshd
  • 再验证:新开一个终端窗口测试登录,确认成功后再关闭旧会话。

1. 检查版本与安装模块

首先确认 OpenSSH 版本,不同版本配置指令存在兼容性差异:

ssh -V

根据系统类型安装认证模块:

# Debian/Ubuntu 系统
sudo apt-get update
sudo apt-get install libpam-google-authenticator

# CentOS/RHEL 系统 (需先启用 EPEL 源)
sudo yum install epel-release
sudo yum install google-authenticator

2. 生成用户密钥

在需要开启双因素认证的每个用户目录下运行 google-authenticator。命令会交互式提问,建议依次选择:

  • 基于时间生成令牌:选 y
  • 更新授权文件:选 y
  • 禁止重用令牌:选 y
  • 增加速率限制:选 y

运行结束后,终端会显示一个二维码和一组应急代码。请务必截图保存二维码,并抄写应急代码到安全位置,这是丢失手机后的唯一找回途径。

3. 配置 PAM 模块

编辑 /etc/pam.d/sshd 文件,在文件末尾添加以下内容:

如何在 Linux SSH 登录中配置 Google Authenticator 双因素认证?
auth required pam_google_authenticator.so

4. 配置 SSH 服务 (关键步骤)

编辑 /etc/ssh/sshd_config 文件。根据 ssh -V 显示的版本,选择对应的配置指令:

OpenSSH 8.8 及以上版本:

KbdInteractiveAuthentication yes
# AuthenticationMethods 根据需求选择:
# 仅密钥 + 验证码:publickey,keyboard-interactive
# 仅密码 + 验证码:keyboard-interactive
AuthenticationMethods publickey,keyboard-interactive

OpenSSH 8.8 以下版本:

ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive

注意:AuthenticationMethods 的具体值取决于你是否同时使用密钥登录。如果仅使用密码 + 验证码,可设为 keyboard-interactive。修改前建议备份原文件。

5. 重启 SSH 服务

执行以下命令使配置生效,并检查服务状态:

# systemd 系统
sudo systemctl restart sshd
sudo systemctl status sshd

# 旧版 init 系统
sudo service ssh restart

如果 status 显示失败,请立即使用当前未断开的会话回滚配置。

6. 验证是否生效

不要关闭当前已登录的 SSH 窗口。打开一个新的终端窗口,尝试使用 SSH 连接服务器。如果配置正确,登录过程中会在输入密码后额外提示输入 Verification code:。输入手机 App 上显示的 6 位数字,若能成功登录,说明配置生效。

如何在 Linux SSH 登录中配置 Google Authenticator 双因素认证?

此外,可以查看系统日志确认认证过程:

# Debian/Ubuntu
tail -f /var/log/auth.log

# CentOS/RHEL
tail -f /var/log/secure

日志中应包含 pam_google_authenticator 相关的记录。

7. 常见坑与排查

1. 时间不同步导致验证码错误:TOTP 算法依赖系统时间,如果服务器时间与手机时间偏差过大,验证码将无效。请确保服务器已配置 NTP 时间同步。

# 检查时间同步状态
timedatectl status
# 或
chronyc tracking

2. 配置错误导致无法登录:如果在修改 sshd_config 后重启服务失败或无法登录,可通过云服务商的控制台(VNC/救援模式)登录服务器回滚配置,或利用之前保持开放的 SSH 会话进行修改。

3. SELinux 拦截:在开启 SELinux 的 CentOS/RHEL 系统上,PAM 模块可能因权限问题被拦截。若日志提示权限错误,可尝试检查 SELinux 日志或暂时设为宽容模式排查。

# 临时设为宽容模式测试
setenforce 0
# 查看 SELinux 拦截日志
ausearch -m avc -ts recent

4. 根用户锁定:建议不要直接禁用根用户的密码登录,而是为根用户也配置好双因素认证,或限制根用户仅通过密钥 + 双因素登录,避免 emergency 情况下无法进入系统。

参考来源

  • Google Authenticator PAM Module 官方仓库:github.com/google/google-authenticator
  • Linux PAM 文档:linux-pam.org
  • OpenSSH Release Notes: openssh.com