使用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计数器同步以及你设置的严格验证规则上:
- HOTP是基于计数器的算法:每次成功验证后,服务器端(
/etc/users.oath)的计数器会自动递增,同时你的Yubikey内部的计数器也会递增。 - 你的
pam_oath配置里设置了window=0,这个参数表示只接受当前计数器完全匹配的OTP,不允许任何计数器偏移——这太严格了,只要服务器和Yubikey的计数器有一点点不一致,验证就会失败。 - 从你提供的
/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和服务器的计数器:
- 清空
/etc/users.oath里的计数器记录,恢复成初始行:HOTP kein - 46362175108032033577; - 使用
ykman oath工具查看Yubikey里HOTP slot的当前计数器值,或者直接重置Yubikey的HOTP slot,重新配置时指定初始计数器为0; - 用
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
相关产品推荐
相关产品推荐

