
在Linux服务器上配置Google Authenticator二步验证,核心是让SSH登录强制要求时间动态口令(TOTP),同时保留密码或密钥登录作为第一因素。整个过程不修改系统认证本质,而是通过PAM模块扩展验证流程。
安装Google Authenticator PAM模块
不同发行版命令略有差异,需先确保系统已启用EPEL(CentOS/RHEL)或 universe 源(Ubuntu/Debian):
Ubuntu/Debian:sudo apt update && sudo apt install libpam-google-authenticator CentOS 7/RHEL 7:sudo yum install epel-release && sudo yum install google-authenticator CentOS 8+/RHEL 8+:sudo dnf install google-authenticator
安装后,google-authenticator 命令即可全局使用,无需额外启动服务。
为用户生成并初始化密钥
切勿用 root 直接运行初始化(安全风险高),应以目标登录用户身份执行:
切换到目标用户:sudo -u username bash 运行初始化:google-authenticator 按提示选择:是否启用时间戳(选 y)、是否限制同一口令多次使用(y)、是否启用紧急备用码(y,保存好这5个一次性代码)、是否开启速率限制(y)
执行后会输出二维码(可用手机Google Authenticator扫描)、密钥字符串、验证URL及备用码。密钥和备用码建议离线保存——~/.google_authenticator 文件权限自动设为 0600,切勿改权限。
配置PAM启用TOTP验证
编辑SSH的PAM配置文件,使登录时调用Google Authenticator模块:
打开文件:sudo nano /etc/pam.d/sshd 在文件**顶部**添加一行(顺序很重要):auth [success=ok new_authtok_reqd=ok default=bad] pam_google_authenticator.so nullok nullok 表示该用户未初始化时仍可登录(便于逐步部署);上线后可改为 secret=/home/${USER}/.google_authenticator 并去掉 nullok,强制所有用户启用
注意:不要加 required 或 requisite,否则一旦模块异常会导致所有SSH登录失败。上面的 [success=ok … default=bad] 是推荐的安全跳转逻辑。
调整SSH服务配置并重启
PAM只负责验证逻辑,还需告诉sshd启用键盘交互式认证:
编辑:sudo nano /etc/ssh/sshd_config 确认以下三项为 yes:ChallengeResponseAuthentication yes、UsePAM yes、PasswordAuthentication yes(若用密钥登录,可设为 no,但需确保 PubkeyAuthentication yes) 保存后重载服务:sudo systemctl reload sshd(Ubuntu/Debian)或 sudo systemctl reload sshd(RHEL/CentOS)
此时新SSH连接会先要求输入密码(或密钥),再提示输入6位验证码。若用密钥登录且禁用了密码,验证流程为:密钥 → TOTP。两步缺一不可。
配置完成后建议新开终端测试,保留原会话以防锁死。如遇问题,可临时注释PAM中刚添加的行并重载sshd恢复访问。备用码是唯一应急入口,务必妥善保管。

评论(0)