SSH双因子认证需密钥登录与动态验证码缺一不可:先用ed25519生成带密码短语的密钥对并上传,再为用户配置Google Authenticator,接着在PAM和SSH中严格设置认证顺序与参数,最后禁用密码登录并验证流程。

SSH 密钥双因子认证,本质是“密钥登录 + 动态验证码”组合,比单纯密码+验证码更安全,也比仅用密钥更防私钥泄露。关键不是加个插件就完事,而是让两个因子真正独立、顺序合理、缺一不可。
生成强密钥对(第一因子)
别用默认的 id_rsa,优先选 ed25519 算法,抗暴力能力更强:
- macOS/Linux:运行
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_work -C "you@company.com",务必设密码短语(passphrase),macOS 钥匙串可自动记住 - Windows(Git Bash/PowerShell):同上命令,或用
ssh-keygen -t rsa -b 4096作备选 - 公钥上传到服务器:推荐
ssh-copy-id -i ~/.ssh/id_work.pub user@host;手动上传需确保远程~/.ssh目录权限为 700,authorized_keys为 600
安装并配置 Google Authenticator(第二因子)
动态验证码必须绑定到具体用户,不能全局配置:
宝塔面板11.3.0是一款针对Linux服务器设计的可视化管理工具,通过重构核心模块实现资源占用显著降低,尤其适合低配置服务器环境。它将复杂的命令行操作转化为直观的图形界面,帮助开发者快速完成网站部署、环境配置及日常运维工作,无需专业技术背景即可高效管理服务器。
- CentOS/RHEL/AlmaLinux:先启用 EPEL(
dnf install epel-release),再装google-authenticator - Ubuntu/Debian:直接
apt install libpam-google-authenticator - 切换到目标用户(如
su - john),运行google-authenticator - 交互中全选 y:启用 TOTP、禁止单次重用、允许 ±30 秒时钟偏差、启用失败限制(3 次/30 秒)
- 扫码绑定手机 App(Google Authenticator、Authy 或 Microsoft Authenticator),5 个应急码务必离线保存,每用一个即失效
打通 PAM 和 SSH 认证链
这一步最容易出错——顺序和参数决定是否真生效:
- 编辑
/etc/pam.d/sshd,在文件最上方插入一行:auth [success=done new_authtok_reqd=done default=ignore] pam_google_authenticator.so
注意:调试阶段可用nullok,上线前必须删掉,否则未配 GA 的用户仍能跳过 - 编辑
/etc/ssh/sshd_config,确认以下三行已启用且无注释:ChallengeResponseAuthentication yesUsePAM yesAuthenticationMethods publickey,keyboard-interactive - 禁用密码登录(可选但推荐):
PasswordAuthentication no,避免绕过密钥直输密码 - 重启服务:
systemctl restart sshd(Linux)或sudo launchctl kickstart -k system/com.openssh.sshd(macOS)
验证与容错准备
别等登不上才慌:
- 测试前保留一个未关闭的 root 或其他已配好密钥的会话,防止锁死
- 首次登录会先走密钥校验,成功后再提示输入 6 位验证码——不是密码后追加,而是独立挑战步骤
- 若验证码总错,先检查服务器和手机时间是否同步(
ntpdate pool.ntp.org或timedatectl status) - 应急码只用于找回,用一次少一个,别存云端;密钥密码短语和 GA 备用码建议分开保管

















