TOTP 补上第二因素
TOTP 在口令或密钥之外再叠一层动态口令:服务端安装 libpam-google-authenticator,把模块挂进 SSH 的认证链,用户侧用认证器应用绑定共享密钥。这样即使口令泄露,攻击者没有动态码也无法登录,撞库与暴力破解的成本被显著抬高。
基本信息
| 适用平台 | Linux(PAM 与 OpenSSH) |
|---|---|
| 风险等级 | 中 |
| 基线要求 | 特权账号强制 MFA |
| 关键软件 | libpam-google-authenticator |
| 依赖项 | 认证主机时间必须同步(NTP) |
典型使用场景
- 公网 SSH 入口叠加第二因素
- 特权账号与跳板机登录强制多因素
- 满足合规要求中的多因素认证条款
- 口令泄露后降低被直接登录的风险
- 小范围验证后再逐步推广
服务端接入
服务端接入
sudo apt install -y libpam-google-authenticator # Debian 系安装 PAM 模块
# /etc/pam.d/sshd 增加一行:auth required pam_google_authenticator.so nullok
echo 'KbdInteractiveAuthentication yes' | sudo tee -a /etc/ssh/sshd_config # 新版 OpenSSH 的开关
sudo sshd -t && sudo systemctl reload sshd # 先语法检查再重载
sudo tail -f /var/log/auth.log # 观察认证日志确认效果用户侧初始化
用户侧初始化
google-authenticator # 交互式生成密钥,扫码绑定认证器应用
# 生成后保存紧急备用码,并避免多台设备复用同一密钥配置项读法
| 配置项 | 含义 | 注意点 |
|---|---|---|
| pam_google_authenticator.so | PAM 认证模块 | 挂在 sshd 认证链上 |
| nullok | 未绑定用户可跳过 MFA | 只宜推广期临时使用 |
| KbdInteractiveAuthentication | 交互式认证开关 | 新版 OpenSSH 由旧参数更名而来 |
| 时间同步 | 服务端与客户端时钟一致 | 漂移会导致动态码校验失败 |
| 备用码 | 应急的一次性口令 | 必须离线保存 |
推广顺序要先在测试账号开通并完整验证,再批量推行:MFA 配错会让全员都无法登录,务必保留可用的 root 控制台作为退路。
nullok 参数允许还没绑定的用户跳过 MFA,推广期靠它避免影响存量用户,收口完成后必须移除这个参数。
主机时间要作为依赖项检查:TOTP 基于时间窗口计算,NTP 漂移会让动态码校验随机失败,这类故障排查起来很费时间。
接入前先确认 OpenSSH 版本:新版本使用的开关名与旧版本不同,参数写错会出现第二因素根本不生效的情况,改完一定要用测试账号完整拉一次会话。