Назад | Перейти на главную страницу

Ошибки LDAP (с ppolicy) при изменении пароля другого пользователя

Я установил сервер 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 может помочь.