要实现SSH双重鉴权,必须在sshd_config中显式配置AuthenticationMethods publickey,keyboard-interactive,并配套启用ChallengeResponseAuthentication yes、UsePAM yes和PubkeyAuthentication yes,同时禁用PasswordAuthentication no。

要让 SSH 实现真正有效的双重鉴权(比如“密钥 + TOTP 验证码”),不能只靠客户端声明或零散开启某项开关,关键在 /etc/ssh/sshd_config 中精准配置 AuthenticationMethods,并确保它与 PAM 和认证流程协同工作。
AuthenticationMethods 必须显式指定组合顺序
OpenSSH 不会自动叠加认证方式。即使你装了 Google Authenticator、配好了 PAM,若 sshd_config 里没写明要求哪几种方法按什么顺序执行,服务端就只走默认路径(通常是单因子)。
- 要强制先验密钥、再输验证码:
AuthenticationMethods publickey,keyboard-interactive - 若想支持“密钥 或 密码+OTP”降级路径(不推荐生产环境):
AuthenticationMethods publickey,keyboard-interactive password,keyboard-interactive(需额外 PAM 支持) - 仅用密钥+OTP、彻底禁用纯密码登录:上面第一行即可,但必须配合
PasswordAuthentication no
配套参数缺一不可
AuthenticationMethods 是个“门禁指令”,但它本身不触发任何验证逻辑——背后依赖其他配置联动生效:
-
ChallengeResponseAuthentication yes:启用挑战响应式交互流程,是keyboard-interactive能被调用的前提 -
UsePAM yes:确保 SSH 启动时加载/etc/pam.d/sshd,否则 PAM 模块(如pam_google_authenticator.so)完全不运行 -
PubkeyAuthentication yes:允许公钥阶段通过,否则第一步就卡住 -
PasswordAuthentication no(建议启用):防止用户绕过 OTP 直接输密码登录
验证是否生效的实操判断法
改完配置别急着重启,先做两件事:
- 语法检查:
sudo sshd -t,无输出即通过 - 连接测试加调试:
ssh -v user@host,观察日志中是否出现:debug1: Next authentication method: keyboard-interactive没有这行,说明服务端根本没下发第二步挑战——大概率是AuthenticationMethods没生效,或ChallengeResponseAuthentication为no - 客户端连接时若静默退出,试试加
-o RequestTTY=yes,避免因非交互环境跳过 keyboard-interactive
注意 Match 块的覆盖优先级
如果你在 sshd_config 里用了 Match User 或 Match Group,AuthenticationMethods 必须写在对应 Match 块内才对该用户生效。全局设置会被 Match 块内的同名指令覆盖。
- 例如只对运维组启用双因子:
Match Group ops<br> AuthenticationMethods publickey,keyboard-interactive<br> ChallengeResponseAuthentication yes
- 写在
Match外面的配置对匹配用户无效











