You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Yubikey配置pam_oath时遇到OTP无法授权登录及多次验证失败问题

Yubikey配置pam_oath时遇到OTP无法授权登录及多次验证失败问题

Hi,我来帮你逐个分析并解决这些问题:

Q1:PAM配置行的顺序真的重要吗?

没错,PAM模块的执行顺序绝对是核心关键!PAM是严格按照从上到下的顺序依次处理验证模块的,每个模块的返回值会直接决定后续流程走向:

  • 你的第一行auth [success=1 default=ignore] pam_unix.so nullok意思是:如果密码验证成功,就跳过下1个模块(也就是pam_deny.so),继续执行后面的模块;如果密码验证失败,就忽略这个结果,继续执行下一个模块。
  • 当前你的配置逻辑是「先验证本地密码,再验证OATH动态码」,属于双因素验证模式。如果想要把Yubikey作为唯一验证因素,需要调整模块顺序或者修改参数(比如去掉pam_unix.so的验证,或者设置try_first_pass等参数)。

Q2:为什么第二次及之后的验证尝试会失败?

问题出在HOTP计数器同步以及你设置的严格验证规则上:

  1. HOTP是基于计数器的算法:每次成功验证后,服务器端(/etc/users.oath)的计数器会自动递增,同时你的Yubikey内部的计数器也会递增。
  2. 你的pam_oath配置里设置了window=0,这个参数表示只接受当前计数器完全匹配的OTP,不允许任何计数器偏移——这太严格了,只要服务器和Yubikey的计数器有一点点不一致,验证就会失败。
  3. 从你提供的/etc/users.oath最终内容来看,第一次验证后,服务器记录的最后使用计数器是0,而你的Yubikey在生成第一个OTP后计数器已经变成了1,第二次生成的OTP对应计数器1,但服务器因为window=0的限制,无法接受偏移后的OTP;更可能的是你在配置Yubikey的HOTP slot时,初始计数器没有设置为0(Yubikey的HOTP slot默认初始计数器可能不是0),导致服务器和Yubikey的计数器从一开始就不同步。

解决方案:

  • 先把pam_oath配置里的window=0改成window=5,允许最多5次的计数器偏移,这样即使有少量不同步也能验证成功;
  • 重新同步Yubikey和服务器的计数器:
    1. 清空/etc/users.oath里的计数器记录,恢复成初始行:HOTP kein - 46362175108032033577;
    2. 使用ykman oath工具查看Yubikey里HOTP slot的当前计数器值,或者直接重置Yubikey的HOTP slot,重新配置时指定初始计数器为0;
    3. 用oathtool --hotp -d 6 --counter=0 46362175108032033577生成计数器0的OTP,对比Yubikey生成的第一个OTP是否一致,确认同步。

Q3:为什么会出现OATH_INVALID_DIGITS: Unsupported number of OTP digits错误?

这个错误是PAM流程导致的:
你的配置是先执行pam_unix.so验证密码,当你在sudo提示下输入密码后,pam_unix验证通过,接着执行pam_oath模块——这时候pam_oath会先尝试把你刚才输入的密码当作OTP来验证,但你的密码长度肯定不是6位,所以就触发了OATH_INVALID_DIGITS错误。之后pam_oath才会弹出正确的提示,让你输入真正的6位OTP。

如果不想看到这个错误,可以给pam_oath加上use_first_pass=no参数,明确告诉它不要复用之前输入的密码,不过这个错误不影响最终验证成功,只是日志里会显示而已。

备注:内容来源于stack exchange,提问作者MPEI_stud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 12:58:00