AuthenticationMethods publickey,password 仅实现双单因素认证,非真正2FA;需搭配TOTP或FIDO2安全密钥,引入时间动态码或物理设备+PIN+生物特征等独立第二因子,才满足标准MFA与合规要求。

`AuthenticationMethods publickey,password` 这个配置**不能实现真正的双重认证(2FA)**,它只是要求**两种认证方式都必须成功通过**,但二者都属于“单因素”——公钥是“你拥有什么”,密码是“你知道什么”,加起来仍是**双单因素(two single-factor auth)**,不是标准意义上的双因素(2FA)或多重因素(MFA)。真正安全的强组合鉴权,需要引入**时间动态码、硬件令牌或生物特征等独立第二因子**。 下面分三部分讲清楚怎么做才对:
一、“publickey,password”配置的真实效果与局限
在 /etc/ssh/sshd_config 中写入:
AuthenticationMethods publickey,password
意味着:SSH 登录必须**先后完成公钥验证 + 密码验证**,缺一不可。但它存在明显短板:
- 密码仍走 PAM 的 password-auth 流程,未绑定时间/设备维度,无法防重放或撞库
- 若私钥文件无密码保护(即空 passphrase),公钥本身就成了“可复制即登录”的静态凭证
- 不满足合规要求(如等保2.0、PCI DSS)中对“至少两个不同类别因素”的强制定义
- 攻击者一旦拿下用户本地私钥+窃听一次密码,即可永久冒用
二、真正高安全的组合:公钥 + TOTP(推荐方案)
这是目前最平衡安全、可用与兼容性的方案:保留密钥登录的便捷性,叠加 TOTP 动态码作为不可预测的第二因子。
关键操作步骤:
- 安装 Google Authenticator(Ubuntu/Debian):
sudo apt install -y libpam-google-authenticator - 切换到目标用户(如
root或普通运维账号),运行:google-authenticator -t -f -d -w3 -e10 -r3 -R30
(生成 TOTP 密钥、保存应急码、启用速率限制) - 编辑 /etc/pam.d/sshd,在文件末尾添加:
auth [success=done new_authtok_reqd=done default=ignore] pam_google_authenticator.so nullok - 修改 /etc/ssh/sshd_config,确保以下三项开启:
PubkeyAuthentication yesChallengeResponseAuthentication yesAuthenticationMethods publickey,keyboard-interactive - 重启服务:
sudo systemctl restart sshd
此时登录流程为:先提供私钥 → SSH 提示输入“Verification code” → 输入手机 App 实时刷新的6位数字 → 登录成功。私钥丢失或手机丢失,都无法单独完成登录。
三、更进一步:公钥 + FIDO2 安全密钥(最高安全等级)
适合对安全性有极致要求的场景(如密钥管理服务器、金融核心系统)。
- 前提:OpenSSH 8.2+(2020年起默认支持)、Linux 内核 ≥5.4、USB/NFC 安全密钥(如 YubiKey 5系列)
- 用户端生成带 FIDO2 的密钥:
ssh-keygen -t ecdsa-sk -f ~/.ssh/id_ecdsa_sk -N "" - 服务端 sshd_config 启用:
PubkeyAuthentication yesAuthenticationMethods publickey
(注意:这里不需要 password 或 keyboard-interactive,FIDO2 本身已含“所拥有的物理设备 + 所知道的 PIN + 生物验证(可选)”三要素) - 将公钥内容(
id_ecdsa_sk.pub)追加到/root/.ssh/authorized_keys,并确保该行开头加sk-ecdsa-sha2-nistp256@openssh.com标识
这种模式下,即使私钥材料泄露,没有对应物理密钥+PIN,攻击者完全无法使用。
不复杂但容易忽略:所有改动前务必备份 /etc/ssh/sshd_config,并确保终端留有本地控制台或带串口的应急通道,避免锁死自己。











