要在 linux 服务器上用 duo security 实现 ssh 登录的推送认证,需四步:1. 在 duo 控制台注册 unix 应用并获取 ikey、skey、api_host;2. 安装 duo_unix,配置 /etc/duo/pam_duo.conf 并设权限 600;3. 在 /etc/pam.d/sshd 中正确位置插入 auth [success=ok default=bad] pam_duo.so;4. 确保 /etc/ssh/sshd_config 启用 usepam yes、challengeresponseauthentication yes 和 passwordauthentication yes,重启 sshd 后测试。

要在 Linux 服务器上用 Duo Security 实现 SSH 登录的推送认证(即用户手机收到 Duo App 推送通知,点“批准”即可完成第二步验证),关键不是装个软件就完事,而是让整个认证链路——从 OpenSSH 到 PAM 再到 Duo 服务端——严丝合缝地协同工作。推送认证本身依赖 Duo 移动应用和网络连通性,但本地配置稍有偏差,就会变成“收不到推送”“直接跳过”或“死在密码后”。下面按真实生产环境中最常卡住的环节,分步讲清怎么做、为什么这么设、哪里容易错。
注册 Unix 应用并获取三要素密钥
登录 Duo Admin Panel(如 https://admin-xxxxxx.duosecurity.com),进入 Applications → Protect an Application,搜索并选择 Unix 类型应用。创建后立即记下三项值:
-
ikey(Integration Key):形如
DIXXXXXXXXXXXXXXXX - skey(Secret Key):一长串 Base64 字符,区分大小写
-
api_host:形如
api-xxxxxxxx.duosecurity.com
注意:不要选 Web SDK 或 Auth API——那是给网页或 API 调用用的;SSH 推送必须用 Unix 应用类型,它原生支持 PAM 的 keyboard-interactive 流程,才能触发推送。
安装 duo_unix 并严格配置 pam_duo.conf
在目标 Linux 服务器(Ubuntu/Debian/CentOS 均可)执行:
sudo apt update && sudo apt install build-essential libssl-dev libpam0g-dev -y # 依赖 wget https://dl.duosecurity.com/duo_unix-latest.tar.gz tar zxf duo_unix-latest.tar.gz && cd duo_unix-* sudo make install
然后编辑配置文件:
sudo nano /etc/duo/pam_duo.conf
填入刚才拿到的三要素,格式为:
[duo] ikey = DIXXXXXXXXXXXXXXXX skey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx api_host = api-xxxxxxxx.duosecurity.com
保存后立即执行:sudo chmod 600 /etc/duo/pam_duo.conf
权限不是建议,是硬性要求。PAM 模块加载时会校验,600 以外(比如 644)会静默失败,日志里只报“authentication failure”,根本不会提示配置文件权限问题。
精准修改 PAM 和 SSH 配置顺序
打开 /etc/pam.d/sshd,在 auth [success=done default=ignore] pam_succeed_if.so user ingroup nopam(如有)之后、其他 auth required 行之前,插入:
宝塔Linux面板11.8.1为官网当前正式版,新增AI建站能力并经过宝塔网站工程师深度调教,开放自定义AI功能API,同时对WAF进行界面重构和深度优化,提升拦截能力与运维效率。
auth [success=ok default=bad] pam_duo.so
这行位置和控制标志决定了行为:
- 放在开头太早,可能被前面的
pam_permit.so绕过;放在末尾,可能已被pam_deny.so或密码模块拒绝 -
[success=ok default=bad]表示:Duo 成功就继续走后续流程(比如登录 shell),失败则立刻标记为 bad,不给其他模块“补救”机会 - 绝不用
sufficient——它一旦成功就跳过所有后续 auth 模块,会导致你设的密码策略、登录限制等全部失效
再检查 /etc/ssh/sshd_config,确保以下三项已启用且未被注释:
UsePAM yes ChallengeResponseAuthentication yes PasswordAuthentication yes
注意:AuthenticationMethods 不是必须项。只要 PAM 启用,Duo 就能通过 keyboard-interactive 触发推送;加了反而可能因 OpenSSH 版本不支持(如某些定制版 CentOS)导致配置无效。
测试与管理员逃生通道
重启服务:sudo systemctl restart sshd。用非 root 普通用户测试:
- 先确认该用户已在 Duo Admin Panel 中被手动激活(或通过自助注册流程完成绑定)
- SSH 登录时输入密码后,应立刻在手机 Duo App 收到推送通知,点击 Approve 才完成登录
- 若无推送,请检查服务器能否访问
api_host(curl -v https://api-xxxxxxxx.duosecurity.com),防火墙是否放行 443 出向
防锁死机制:为运维账号留后门,可在 sshd_config 末尾添加:
Match User adminuser
AuthenticationMethods publickey
这样 adminuser 只用密钥就能登录,完全绕过 Duo;普通用户则走完整双因素流程。无需改 PAM,也不影响安全策略分级。










