上一篇 下一篇 分享链接 返回 返回顶部

如何在Linux服务器中为SSH设置双因素身份验证?

发布人:Minchunlin 发布时间:2025-07-18 09:21 阅读量:735

我在针对我们生产环境的安全审计中,注意到部分香港服务器仍然只依赖基于密钥的 SSH 登录。虽然密钥验证本身已经比明文密码安全得多,但一旦密钥被盗,攻击者依旧可以轻松访问服务器。因此,我决定在关键节点上启用 SSH 的双因素认证(2FA),增加一道安全屏障。本教程将以我在实际部署中踩过的坑为基础,完整展示如何在 Linux 系统中配置 Google Authenticator + SSH 公钥登录的双因素认证机制。

一、背景与准备工作

目标:

在现有 SSH 公钥登录的基础上,加入基于 TOTP(Time-based One-Time Password)的动态验证码作为第二道认证。

环境说明:

  • 操作系统:Debian 11 / CentOS 8 / Ubuntu 20.04(步骤通用)
  • SSH 服务版本:OpenSSH ≥ 7.4
  • 安全组件:libpam-google-authenticator(Google 官方 PAM 模块)

二、安装 Google Authenticator PAM 模块

Ubuntu/Debian 系列:

sudo apt update
sudo apt install libpam-google-authenticator -y

RHEL/CentOS 系列:

启用 EPEL 源并安装:

 

sudo dnf install epel-release -y
sudo dnf install google-authenticator -y

三、为用户生成 TOTP 密钥

我通常会先在需要加密的 SSH 用户账户下执行以下命令(如 root 或 deploy):

google-authenticator

系统会提示:

  • 是否基于时间生成验证码(选 y)
  • 是否允许多个 token(选 y 或 n 依据实际需求)
  • 是否更新 .google_authenticator 文件(选 y)
  • 是否禁止基于时间漂移的多个 token(建议选 y)

该命令会生成一个二维码和一串密钥,我们使用 Google Authenticator、Authy 或其他 TOTP 客户端扫码绑定。并妥善保存 紧急备用码(emergency scratch codes)。

四、配置 PAM 模块以启用 Google Authenticator

编辑 /etc/pam.d/sshd,在文件 顶部 添加以下一行:

auth required pam_google_authenticator.so

注意:这一配置指示 PAM 在认证阶段必须调用 Google Authenticator 模块。如果此步骤遗漏,2FA 不会生效。

五、修改 SSH 配置文件支持双因素认证

编辑 /etc/ssh/sshd_config:

ChallengeResponseAuthentication yes
UsePAM yes

如果你的环境原本已启用公钥登录(PubkeyAuthentication yes),保持不变即可。

补充说明:

如果你不想使用密码作为第一道认证,而是公钥 + OTP 组合,请确保:

PasswordAuthentication no
AuthenticationMethods publickey,keyboard-interactive

 

这表示仅当用户先通过公钥验证后,才会触发 OTP 校验。

六、重启 SSH 服务生效配置

执行以下命令重启 SSH 服务(根据系统不同选择其一):

sudo systemctl restart sshd
# 或
sudo service ssh restart

 

七、连接测试与验证

现在从客户端使用 SSH 登录时,流程将如下:

  • 首先通过私钥验证身份;
  • 系统提示输入 Google Authenticator 生成的一次性验证码;
  • 验证通过后方可进入系统。
$ ssh root@192.168.1.100
Verification code: 849182

如果验证码错误,即便密钥正确也无法登录。

八、避免配置失误导致锁死的建议

为了防止因配置错误导致无法登录,可以提前做如下防护:

保留一个未启用 2FA 的 sudo 用户,用于回滚或救援;

在 sshd_config 变更后使用 sshd -t 检查配置语法;

通过如下方式测试新配置,而非关闭当前 SSH 连接:

ssh -oPort=22 testuser@host

九、安全建议与进阶优化

配置 Fail2Ban:阻止暴力破解验证码;

限定某些用户启用 2FA:PAM 支持通过配置文件指定哪些用户强制启用;

通过 Ansible 批量部署:在多台服务器上统一推送 .google_authenticator 配置文件并同步 PAM 和 SSH 设置;

将 OTP 存储在 YubiKey 等硬件中,提升安全性;

定期轮换密钥:虽然 TOTP 理论上无限期有效,但我会建议每 6-12 个月重设一次。

十、结语

在启用 SSH 双因素认证之后,即使用户私钥泄露,攻击者也无法进入系统,大大降低了横向移动的风险。整个配置过程中,最关键的是 PAM 模块与 SSH 的联动逻辑,一旦理解其机制,实施起来就非常可控。我在多个生产节点中部署这套方案后,结合 IP 白名单与跳板机,显著提升了我们系统的整体安全防御能力。希望这篇实战教程能为你提供可复制的安全加固路径。

目录结构
全文