配置服务器MFA硬件令牌支持的核心是服务端本地验证OTP,需按协议匹配设备:TOTP类用RFC 6238标准验证,YubiKey OTP模式需ykval或ykclient,FIDO2则依赖WebAuthn;务必确保时间同步、密钥加密存储、禁用宽松PAM参数及强制唯一用户密钥。

配置服务器 MFA 硬件令牌支持,核心是让服务端能本地验证令牌生成的一次性口令(OTP),不依赖网络通信。主流硬件如 YubiKey(OTP 模式)、FIDO 安全密钥、OATH 兼容设备等,需按其协议类型选择对应集成路径——TOTP 类设备走时间同步验证,YubiKey OTP 类走 HMAC-SHA1 挑战响应,FIDO2 则需 WebAuthn 支持。
确认硬件类型与协议匹配
不同硬件使用不同认证逻辑,不能混用配置:
-
YubiKey(OTP 模式):默认输出 HMAC-SHA1 一次性密码,需服务端部署 Yubico 的
ykval或轻量验证服务(如ykclient),或改用其 PIV/OpenPGP 模式配合 SSH agent -
YubiKey(FIDO/U2F 模式):需前端支持 WebAuthn,后端集成 FIDO2 库(如 Python 的
fido2),适用于 Web 登录场景,不适用于纯 SSH 或 PAM - OATH-TOTP 硬件令牌(如 AWS MFA 设备、Feitian C200):与手机 Authenticator 完全兼容,服务端只需标准 TOTP 验证(RFC 6238),推荐首选
- OATH-HOTP 硬件:依赖计数器同步,离线环境易失步,生产系统中应避免单独使用
Linux 服务器启用 TOTP 硬件令牌(推荐路径)
绝大多数“硬件 TOTP 令牌”本质是预烧密钥的离线 TOTP 设备,配置方式与软件 TOTP 一致,但注册流程必须物理可控:
- 用户首次绑定时,系统生成唯一 Base32 密钥(如
JBSWY3DPEHPK3PXP),通过安全信道(如扫码、手动输入)交付给硬件设备 - 服务端存储加密后的密钥(AES-GCM 加密,主密钥由 HSM 或 KMS 托管),禁用明文存库
- 验证时调用标准 TOTP 函数(如 Python
pyotp.TOTP(secret).now()),允许 ±1 时间窗口(共 3 个窗口)校验,上线后收敛为仅当前窗口 - 数据库字段示例:
otp_secret_enc(加密密文)、otp_issuer(显示名称)、otp_digits(6 或 8)、otp_period(通常 30)
SSH 登录集成硬件令牌(YubiKey PIV/OpenPGP 模式)
若使用 YubiKey 做 SSH 登录第二因素,实际是“智能卡 + GPG agent 代理”,非传统 OTP:
- 在 YubiKey 上用
gpg --edit-card → generate创建仅限 Authentication 的 4096 位 RSA 子密钥,确保私钥永不导出 - 启用
enable-ssh-support并指定pinentry-program,重启gpg-agent后验证$SSH_AUTH_SOCK是否指向.sshsocket - 导出公钥:
gpg --export-ssh-key [key-id] | sed 's/^/ssh-rsa /' >> ~/.ssh/authorized_keys - 关闭传统认证:
/etc/ssh/sshd_config中设PubkeyAuthentication yes、PasswordAuthentication no、AuthenticationMethods publickey(此时 PIN+触碰即为 MFA)
关键安全加固项(常被忽略)
硬件令牌本身安全,但服务端配置不当会绕过保护:
- 时间同步必须可靠:Linux 必须运行
chrony或systemd-timesyncd,误差超过 45 秒将导致频繁验证失败 - PAM 模块禁用宽松参数:例如
pam_google_authenticator.so中移除remember、allowed_attempts,用noskewadj关闭自动纠偏 - 绑定流程强制 HTTPS + 短时效会话 + 二次验证码验证(连续两个有效码),防止 QR 截获后未启用即生效
- 禁止共享密钥:每个用户必须独有密钥,不得复用测试密钥或硬编码密钥

















