Я настроил сервер 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 равно TRUE и модификация равна выполняемый администратором пароля, то атрибут pwdReset имеет вид установлено на TRUE. В противном случае pwdReset удаляется из записи пользователя. если он существует.
Атрибуты pwdFailureTime и pwdGraceUseTime убираются из Если я не ошибаюсь, LDIF является атомарной операцией, поэтому при изменении
userPassword
он цепляется за удаление атрибутаpwdFailureTime
, следовательно, почему, когда модификацияpwdReset
, которая, кажется, запускает также и удалениеpwdFailureTime
, не удается.Зачем нужно устанавливать
pwdReset
наTRUE
? Вы уже перезагрузили его. Если это необходимо для того, чтобы при первом подключении пользователь сам "сбросил" пароль : вместо этого можно попробовать изменить атрибутpwsMustChange
наTRUE
, который должен установить атрибутpwdReset
наTRUE
(в соответствии с IETF, на котором основана политика OpenLDAP), или можно просто переключить две модификации в LDIF, что может помочь.