我已经使用 ppolicy 覆盖设置了一个 LDAP 服务器,但是现在在某些情况下重置用户密码时遇到了麻烦:如果用户登录失败,则 pwdFailureTime 属性存在,而 ldapmodify 会失败并抱怨它不存在。
如果我最近的登录尝试成功,那么我可以绑定为 cn=admin 并运行 ldif 文件:
dn: uid=anton,ou=accounts,dc=[redacted],dc=ca
changetype: modify
replace: userPassword
userPassword: foobar
-
replace: pwdReset
pwdReset: TRUE
成功了。但是,如果上次登录尝试使用了错误的密码,则 ppolicy 会向帐户添加 pwdFailureTime 属性,然后尝试运行上述 ldif 文件会导致:
$ ldapmodify -x -D "cn=admin,dc=[redacted],dc=ca" -W -H ldap:// -f pwreset.ldif
Enter LDAP Password:
modifying entry "uid=anton,ou=accounts,dc=[redacted],dc=ca"
ldap_modify: No such attribute (16)
additional info: modify/delete: pwdFailureTime: no such attribute
如果我在重置密码之前尝试删除 pwdFailureTime 属性,那么我会得到:
ldap_modify: Constraint violation (19)
additional info: pwdFailureTime: no user modification allowed
在现实生活中,如果用户忘记了密码并需要重置,他们通常会尝试多次回忆密码,因此会设置 pwdFailureTime 属性。有什么建议吗?
答案1
至于IETF 草案状态 :
8.2.7. 策略状态更新
如果这些步骤已完成且未导致错误情况,则服务器将执行以下步骤以更新必要的密码策略状态属性:
如果 pwdMaxAge 或 pwdMinAge 的值非零,则服务器将条目上的 pwdChangedTime 属性更新为当前时间。
如果 pwdInHistory 的值不为零,则服务器会将前一个密码(如果存在)添加到 pwdHistory 属性中。如果 pwdHistory 属性中保存的属性数量超出 pwdInHistory 的值,则服务器会删除最旧的多余密码。
如果 pwdMustChange 值为 TRUE,且修改由密码管理员执行,则将 pwdReset 属性设置为 TRUE。否则,如果存在 pwdReset,则将其从用户条目中删除。
如果存在 pwdFailureTime 和 pwdGraceUseTime 属性,则将其从用户条目中删除。
如果我没记错的话,LDIF 是原子操作,所以当userPassword
修改时,它会链接到删除该pwdFailureTime
属性,因此当修改它pwdReset
似乎也会触发删除pwdFailureTime
失败时。
为什么需要将 设置pwdReset
为TRUE
?您已经重置了它。如果是为了确保用户必须在第一次连接时“重置”自己的密码:
可以尝试将pwsMustChange
属性修改为TRUE
,这应该将属性设置pwdReset
为TRUE
(根据基于 OpenLDAP 策略的 IETF)
或者可能只需切换 LDIF 上的两个修改即可解决问题。