如何用 Google Authenticator 保护 SSH 登录(更高级)

要在 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

  1. 打开手机 Google Authenticator
  2. 点击 + → “扫描二维码”
  3. 扫描终端中显示的二维码(或手动输入 Secret Key)
  4. App 会开始生成 6 位动态码(每 30 秒刷新)

✅ 保存好那 5 个 Emergency Scratch Codes!手机丢失时可用它登录并重置。


🔑 第七步:测试 SSH 登录

新开一个终端窗口测试(不要关闭当前会话!):

bash

编辑

ssh your_username@your_server_ip

登录流程将变为:

  1. 输入密码(或使用 SSH 密钥)
  2. 系统提示:Verification code: 或 Google Authenticator Code:
  3. 打开手机 App,输入当前 6 位数字
  4. 登录成功!

🛡️ 可选增强:仅对特定用户启用 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 实现终极防护

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部