根本原因是OpenSSH版本低于6.2或未启用UsePAM yes;AuthenticationMethods依赖PAM且仅在≥6.2版本支持,需验证sshd -V输出含authenticationmethods并检查man sshd_config。

为什么 sshd_config 里加了 AuthenticationMethods 却没生效
根本原因通常是 OpenSSH 版本太低——这个配置项从 OpenSSH 6.2 才开始支持,而很多 CentOS 7 默认装的是 6.6.1,Ubuntu 16.04 是 7.1p2,看似够用,但部分发行版打了补丁删掉了多因素支持。运行 sshd -V 看输出里有没有 authenticationmethods 关键字,没有就别折腾配置了。
实操建议:
- 先确认版本:
ssh -V和sshd -V输出要一致,且 ≥ 6.2;更稳妥是查man sshd_config是否有AuthenticationMethods条目 - 如果版本够但不生效,检查是否漏了
UsePAM yes—— Duo 认证依赖 PAM 模块,AuthenticationMethods只在 PAM 启用时才起作用 -
AuthenticationMethods publickey,keyboard-interactive是常见写法,但注意:这里keyboard-interactive不等于密码登录,它只是触发 PAM 的交互式流程,实际由 Duo 的 PAM 模块接管
Duo 的 pam_duo.so 怎么加载才不被绕过
很多人把 pam_duo.so 加在 /etc/pam.d/sshd 最底下,结果 SSH 密码登录依然直通,Duo 根本不弹。这是因为 PAM 的控制标志(required / sufficient)和顺序决定了是否跳过后续模块。
实操建议:
- 必须把 Duo 行加在
auth [success=ok default=bad]这类逻辑之前,推荐放在auth [success=done default=ignore]之后、auth required pam_permit.so之前 - 典型安全写法:
auth [success=ok default=bad] pam_duo.so—— 成功就继续,失败就标记为 bad,避免被其他模块覆盖判断 - 别用
sufficient:它一旦成功就跳过后面所有 auth 模块,可能绕过你设的密码策略或日志记录 - 加载前先测试模块是否存在:
ls /lib/security/pam_duo.so或/usr/lib/x86_64-linux-gnu/security/pam_duo.so,路径因系统而异
用户没配 Duo App 就连不上 SSH?怎么给管理员留后门
生产环境最怕“全量启用后全员失联”。Duo 本身不提供白名单机制,得靠 OpenSSH 和 PAM 配合做条件分流。
实操建议:
- 用
Match User或Match Group在sshd_config里分组:对运维组禁用 Duo,对普通用户强制启用 - 示例:
Match Group ssh-users AuthenticationMethods publickey,keyboard-interactive Match Group duo-bypass AuthenticationMethods publickey - 确保
duo-bypass组用户只用密钥登录,且私钥严格权限(chmod 600),否则等于裸奔 - 千万别用 IP 白名单做后门——办公网出口 IP 经常变,而且内网扫描也可能触发误判
duo_unix 配置里的 ikey/skey/host 哪些能暴露在服务器上
只有 ikey(集成密钥)和 host(API 域名)可明文存在服务器配置中;skey(密钥)绝不能硬编码进 /etc/duo/login_duo.conf —— 它等同于账户密码,泄露即沦陷。
实操建议:
-
skey必须通过文件权限锁死:chmod 400 /etc/duo/login_duo.conf且属主为root:root - 别把整个
login_duo.conf放进 Git 或配置管理工具,哪怕加密也要警惕解密密钥泄露链 - 测试 API 连通性用
duo_login --test,而不是手动curl—— 后者容易把skey泄露到 shell 历史里 - 如果用 Ansible,用
no_log: true+ vault 加密skey,且部署后立刻chown root:root和chmod 400
skey 权限。










