要在 Linux 服务器上使用 Google Authenticator(基于 TOTP 的双因素认证)保护 SSH 登录,你可以实现「密码/密钥 + 动态验证码」的双重验证(2FA),大幅提升安全性。即使密码或私钥泄露,攻击者也无法登录。
下面以 Ubuntu 22.04 / Debian / CentOS 7+ 为例,提供完整配置步骤(适用于云服务器如阿里云、腾讯云、Google Cloud 等)。
✅ 前提条件
- 你有 root 或 sudo 权限
- 已能通过 SSH 正常登录服务器
- 手机已安装 Google Authenticator App(或 Microsoft Authenticator、Authy 等支持 TOTP 的 App)
⚠️ 重要:操作前请确保你有至少两个活跃的 SSH 会话(或控制台访问权限)!
配置错误可能导致无法登录!
🔧 第一步:安装 Google Authenticator PAM 模块
Ubuntu / Debian:
bash
编辑
sudo apt update
sudo apt install libpam-google-authenticator -y
CentOS / Rocky Linux:
bash
编辑
sudo yum install epel-release -y
sudo yum install google-authenticator -y
# 或 dnf(CentOS 8+)
sudo dnf install google-authenticator -y
🔐 第二步:为当前用户生成密钥(在普通用户下运行!)
❌ 不要直接用 root 运行!先切换到你要启用 2FA 的用户(如
admin)
bash
编辑
# 切换到目标用户(例如你的运维账号)
su - your_username
# 运行配置程序
google-authenticator
交互式配置(建议全选 y):
text
编辑
Do you want authentication tokens to be time-based (y/n) y
→ 选择 y(基于时间的一次性密码)
然后你会看到:
- 一个 二维码(可用手机 App 扫描)
- 一行 Your new secret key is: XXXXXXXX
- 一个 6位初始验证码
- 5 个 Emergency scratch codes(紧急备用码,务必保存!)
继续回答:
text
编辑
Do you want me to update your "/home/your_user/.google_authenticator" file? (y/n) y
Do you want to disallow multiple uses of the same authentication token? (y/n) y
By default, tokens are good for 30s... Do you want to do so? (y/n) y
Do you want to enable rate-limiting? (y/n) y
✅ 完成后,会在用户家目录生成 ~/.google_authenticator 文件。
🛠️ 第三步:配置 PAM(让 SSH 调用 Google Authenticator)
编辑 PAM 配置文件:
bash
编辑
sudo nano /etc/pam.d/sshd
在文件顶部添加一行:
pam
编辑
auth required pam_google_authenticator.so nullok
🔹
nullok表示:如果用户没有设置.google_authenticator文件,仍可正常登录(方便逐步部署)。
🔸 所有用户都配置完成后,建议删除nullok以强制 2FA。
⚙️ 第四步:配置 SSH 服务支持键盘交互认证
编辑 SSH 配置:
bash
编辑
sudo nano /etc/ssh/sshd_config
确保以下选项设置正确:
conf
编辑
# 允许挑战响应认证
ChallengeResponseAuthentication yes
# 如果你用密码登录,保留 PasswordAuthentication yes
# 如果你用密钥登录,可以设为 no,但需配合下面的 AuthenticationMethods
PasswordAuthentication yes
# 关键:要求同时使用密钥(或密码)+ 2FA
AuthenticationMethods publickey,keyboard-interactive
# 或如果你只用密码:
# AuthenticationMethods password,keyboard-interactive
💡
keyboard-interactive是 Google Authenticator 验证的方式。
🔄 第五步:重启 SSH 服务
bash
编辑
# Ubuntu/Debian
sudo systemctl restart sshd
# CentOS/Rocky
sudo systemctl restart sshd
📱 第六步:绑定手机 App
- 打开手机 Google Authenticator
- 点击 + → “扫描二维码”
- 扫描终端中显示的二维码(或手动输入 Secret Key)
- App 会开始生成 6 位动态码(每 30 秒刷新)
✅ 保存好那 5 个 Emergency Scratch Codes!手机丢失时可用它登录并重置。
🔑 第七步:测试 SSH 登录
新开一个终端窗口测试(不要关闭当前会话!):
bash
编辑
ssh your_username@your_server_ip
登录流程将变为:
- 输入密码(或使用 SSH 密钥)
- 系统提示:
Verification code:或Google Authenticator Code: - 打开手机 App,输入当前 6 位数字
- 登录成功!
🛡️ 可选增强:仅对特定用户启用 2FA
如果你不想强制所有用户使用 2FA,可以在 /etc/pam.d/sshd 中改用:
pam
编辑
auth [success=done default=bad] pam_succeed_if.so user = admin quiet
auth required pam_google_authenticator.so
或者使用 Match User 在 sshd_config 中针对用户配置。
🚫 故障排查
表格
| 问题 | 解决方法 |
|---|---|
| 登录卡住或直接拒绝 | 检查 sshd_config 中 AuthenticationMethods 是否写错 |
| 提示 “Permission denied” | 确保 ~/.google_authenticator 文件权限为 600:chmod 600 ~/.google_authenticator |
| 时间不同步导致验证码无效 | 在服务器和手机上启用自动时间同步:sudo timedatectl set-ntp on |
| 忘记备用码且手机丢失 | 通过云平台 VNC 控制台登录,删除 ~/.google_authenticator 文件临时恢复 |
✅ 总结:你现在拥有的安全层级
表格
| 攻击方式 | 是否有效 |
|---|---|
| 仅知道密码 | ❌ 失败(需要验证码) |
| 仅窃取私钥 | ❌ 失败(需要验证码) |
| 暴力破解 SSH | ❌ 失败(Fail2ban + 2FA 双重防护) |
| 手机丢失 | ✅ 可用 Emergency Code 登录并重置 |
如果你告诉我你的具体系统(如 Ubuntu 22.04 或 CentOS 7),我可以提供更精确的命令。也可以教你如何结合 Fail2ban + Google Authenticator 实现终极防护