SSH双因子认证需安装对应PAM模块、为用户生成并写入TOTP密钥至/etc/users.oath(权限600)、在/etc/pam.d/sshd末尾添加pam_oath.so规则、启用sshd_config中ChallengeResponseAuthentication yes/UsePAM yes/PasswordAuthentication yes,最后重启sshd服务。

在Linux服务器上启用SSH双因子认证(2FA),能有效防止密码泄露导致的非法登录,尤其适用于生产环境或等保合规场景。仅靠静态密码已无法抵御暴力破解与钓鱼攻击,必须叠加动态验证码这一第二因子。
确认系统环境与依赖安装
先检查当前系统类型和OpenSSH版本:执行 ssh -V,确保 OpenSSH 版本低于 8.0(OpenSSH ≥8.0 已原生支持 AuthenticationMethods 配置,无需额外PAM模块);若为 CentOS/RHEL 系统,运行 sudo yum install pam-devel oath-toolkit-pam;若为 Ubuntu/Debian,则执行 sudo apt-get install libpam0g-dev liboath-dev。未安装对应PAM模块将导致后续配置无效。
生成并绑定用户TOTP密钥
这一步必须为每个需启用2FA的用户单独执行,不能复用同一密钥。
① 生成16字节随机密钥:KEY=$(head -c 16 /dev/urandom | base32)
② 将密钥写入全局密钥文件:echo "$KEY" user >> /etc/users.oath(注意:user 是实际用户名,不是字符串"user")
③ 设置文件权限为 【600】:sudo chmod 600 /etc/users.oath。权限过高(如644)会导致PAM拒绝读取,认证直接失败。
配置PAM模块强制TOTP验证
编辑 SSH 的 PAM 配置文件:sudo vi /etc/pam.d/sshd
在文件末尾新增一行:auth [success=done new_authtok_reqd=done default=ignore] pam_oath.so usersfile=/etc/users.oath window=30
⚠️ 注意:该行必须放在所有 auth [default=ignore] 类型规则之后、但要在 auth required pam_deny.so 之前;否则可能跳过验证或引发登录循环。
修改SSH服务端配置启用挑战响应
打开 /etc/ssh/sshd_config,确认以下三项均已启用且未被注释:
ChallengeResponseAuthentication yes
UsePAM yes
PasswordAuthentication yes
其中 【PasswordAuthentication yes 是必要前提】 —— TOTP 是在密码验证通过后触发的第二阶段,关闭密码认证将使TOTP完全失效。
重启SSH服务并测试登录
执行 sudo systemctl restart sshd(CentOS/RHEL)或 sudo systemctl restart sshd.service(Ubuntu/Debian)。
新开终端窗口,用另一台机器SSH连接该服务器:ssh username@server_ip。
输入密码后,会立即提示 Verification code: —— 此时打开手机上的 Google Authenticator、Authy 或 1Password,输入当前6位动态码即可完成登录。


















