Я установил сервер LDAP с наложением ppolicy, но теперь у меня в некоторых случаях возникают проблемы со сбросом пароля пользователя: если у пользователя произошел сбой входа в систему, то существует атрибут 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. Какие-либо предложения?
Для Проект IETF состояния :
8.2.7. Обновления состояния политики
Если шаги были выполнены без возникновения состояния ошибки, сервер выполняет следующие шаги для обновления необходимых атрибутов состояния политики паролей:
Если значение pwdMaxAge или pwdMinAge не равно нулю, сервер обновляет атрибут pwdChangedTime в записи до текущего времени.
Если значение pwdInHistory не равно нулю, сервер добавляет предыдущий пароль (если он существовал) к атрибуту pwdHistory. Если количество атрибутов, содержащихся в атрибуте pwdHistory, превышает значение pwdInHistory, сервер удаляет самые старые избыточные пароли.
Если значение pwdMustChange - ИСТИНА и изменение выполняется администратором пароля, тогда атрибут pwdReset устанавливается в ИСТИНА. В противном случае pwdReset удаляется из записи пользователя, если он существует.
Атрибуты pwdFailureTime и pwdGraceUseTime удаляются из записи пользователя, если они существуют.
Если я не ошибаюсь, LDIF - это атомарные операции, поэтому когда userPassword
изменен, он связан с удалением pwdFailureTime
атрибут, поэтому, когда модификация pwdReset
что, кажется, вызывает также удаление pwdFailureTime
терпит неудачу.
Зачем нужно устанавливать pwdReset
к TRUE
? Вы его уже сбросили. Если необходимо, чтобы пользователь сам «сбрасывал» пароль при первом подключении:
вместо этого можно попробовать изменить pwsMustChange
приписывать TRUE
, который должен установить pwdReset
приписывать TRUE
(согласно IETF, на котором основана ppolicy OpenLDAP)
или может быть просто переключение двух модификаций на LDIF может помочь.