要让 ssh 守护进程强制启用双因子认证,需同步系统时间、安装 google authenticator、为用户生成 totp 密钥、配置 pam(auth required pam_google_authenticator.so)、修改 sshd_config 启用 challengeresponseauthentication 和 authenticationmethods publickey,keyboard-interactive,并配套禁用密码登录、root 登录及加固防火墙。

要让 SSH 守护进程强制启用双因子认证(2FA),核心是组合密钥/密码 + TOTP 动态验证码,并通过 PAM 和 sshd_config 协同控制登录流程。不能只靠单点配置,必须确保验证链完整、顺序正确、且不留下绕过漏洞。
同步系统时间并安装 Google Authenticator
动态验证码基于时间(TOTP),服务器与手机时间偏差超过 30 秒即失效。先校准时间:
sudo ntpdate -s pool.ntp.org 或启用 systemd-timesyncd
再按发行版安装组件:
- Ubuntu/Debian:sudo apt install libpam-google-authenticator
- CentOS/RHEL/AlmaLinux:sudo dnf install epel-release google-authenticator
为用户生成并绑定 TOTP 密钥
切换到目标用户(如 su - deploy),运行:
google-authenticator
回答提示时建议全选 y,尤其注意启用:
- 基于时间的令牌(y)
- 禁止重复使用同一令牌(y)——防重放
- 启用速率限制(y)——防暴力尝试
保存好密钥、二维码和备用恢复码。用 Authy、Google Authenticator 或 Microsoft Authenticator 扫码绑定。
配置 PAM 强制二次验证
编辑 /etc/pam.d/sshd,在文件最上方插入一行(顺序关键,放在其他 auth 规则之前):
auth required pam_google_authenticator.so nullok
其中 nullok 表示:若用户尚未生成 .google_authenticator 文件,仍允许登录(便于分批启用);生产环境建议去掉该参数,改为手动为每个用户初始化后再上线。
⚠️ 不要加 silent 或 noaudit,否则失败日志无法追踪。
修改 sshd_config 启用挑战响应与认证方法
编辑 /etc/ssh/sshd_config,确保以下三行存在且未被注释:
- ChallengeResponseAuthentication yes
- UsePAM yes(必须开启,否则 PAM 规则不加载)
- AuthenticationMethods publickey,keyboard-interactive
这一行表示:SSH 登录必须同时满足两个条件——先通过公钥认证,再完成键盘交互式验证(即输入 6 位 TOTP)。如果只想对密码用户启用 2FA,可改用 password,keyboard-interactive,但强烈建议禁用密码登录。
配置完成后,务必执行 sudo sshd -t 检查语法,再用新终端测试登录,确认成功后再 sudo systemctl reload sshd。
配套加固:关闭密码、禁用 root、限制端口
仅开 2FA 不够,需切断其他攻击路径:
- 禁用密码登录:PasswordAuthentication no
- 禁止 root 远程登录:PermitRootLogin no
- 修改默认端口(如 Port 22222),并在防火墙放行新端口
- 配合 fail2ban 监控 /var/log/auth.log,自动封禁多次验证失败的 IP
这些措施叠加后,攻击者即使拿到私钥或破解了某环节,也无法绕过 TOTP 校验,暴力破解基本失效。











