OpenSSH 无法原生实现密码+短信/令牌的多因子认证,但可通过 IP 白名单(AllowUsers)、强制公钥认证(PasswordAuthentication no)和 Match 块细粒度限制,构建“来源可信+身份可信+持有凭证”三重校验体系。

直接在 sshd_config 中无法实现真正的“多因子访问控制”(如密码 + 短信/令牌),因为 OpenSSH 本身不原生支持 OTP、短信或生物识别等第二因子。但你可以通过组合 IP 白名单、用户白名单 和 公钥强制认证,构建一个接近多因子强度的访问控制体系:即“来源可信(IP)+ 身份可信(用户)+ 持有凭证(私钥)”三重校验。
一、用 AllowUsers 实现 IP + 用户级白名单
AllowUsers 是最优先生效的白名单机制,它在认证前就拦截请求,不匹配者连登录提示都不会出现。支持精确到用户@IP 或用户@域名模式,通配符仅限 * 和 ?。
- 只允许运维组的 admin 从堡垒机登录:
AllowUsers admin@10.10.5.100 - 允许多个用户来自不同网段:
AllowUsers deploy@192.168.10.* backup@172.16.0.0/16(注意:CIDR 写法不被sshd_config原生支持,需写成backup@172.16.*.*) - 多个条目用空格分隔,建议写在同一行,避免因换行导致解析失败
二、禁用密码,强制密钥认证(模拟“第二因子”)
关闭密码登录不是多因子,但它是关键前提——它把“拥有合法私钥”变成硬性准入条件。攻击者即使知道用户名和密码,也无法登录;必须同时持有对应私钥文件。
- 确保配置中包含:
PasswordAuthentication no和PubkeyAuthentication yes - 不要仅依赖
Match User块局部开启密钥认证,而应在全局关闭密码,再用Match开放例外(如仅对某测试用户临时启用密码) - 私钥权限必须为
600,对应公钥须正确写入~/.ssh/authorized_keys,且该文件权限不能高于644
三、用 Match 块叠加更细粒度限制
当需要对特定用户进一步约束行为(例如禁止端口转发、禁用交互 shell、限定命令),Match User 是唯一可靠方式。它必须放在 sshd_config 文件末尾,且每个用户只能有一个 Match 块。
- 限制某审计账号只能 SFTP,无 Shell:
Match User audit<br> X11Forwarding no<br> AllowTcpForwarding no<br> PermitTTY no<br> ForceCommand internal-sftp
- 若需 Chroot,补充
ChrootDirectory /sftp/%u,并确保该路径由 root 拥有、不可写,用户主目录权限为755,子目录才可写
四、验证与安全加固要点
配置完成后不重启服务也能生效,但务必执行语法检查和重载,否则可能锁死自己。
- 备份原配置:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak-$(date +%F) - 检查语法:
sudo sshd -t—— 返回 “Syntax OK” 才可继续 - 重载而非重启:
sudo systemctl reload sshd(避免连接中断) - 测试时务必保留一个已登录会话,再开新终端验证,防止配置错误失联
- 确认系统中无残留高危账户(如
sync、games、ftp),它们可能绕过白名单逻辑


















