Вопрос или проблема
Я настроил 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
Введите LDAP-пароль:
изменение записи "uid=anton,ou=accounts,dc=[redacted],dc=ca"
ldap_modify: Нет такого атрибута (16)
дополнительная информация: modify/delete: pwdFailureTime: такой атрибут отсутствует
Если я попробую удалить атрибут pwdFailureTime перед сбросом пароля, то получаю:
ldap_modify: Нарушение целостности (19)
дополнительная информация: pwdFailureTime: никакие изменения пользователем не разрешены
На практике, если пользователь забыл свой пароль и нуждается в его сбросе, он, как правило, пытался вспомнить пароль несколько раз, поэтому атрибут 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
? Вы уже сбросили его. Если это необходимо для того, чтобы пользователь “сбросил” свой пароль при первом подключении:
может быть, попробуйте вместо этого изменить атрибут pwdMustChange
на TRUE
, что должно установить атрибут pwdReset
на TRUE
(согласно IETF, на основе которой основана ppolicy OpenLDAP)
или, возможно, просто поменять местами два изменения в LDIF может помочь.
Я думаю, что есть две вещи, которые нужно изменить:
- Не используйте пароли в открытом виде в LDAP (даже если стандарт, кажется, это подразумевает)
- Используйте
ldappasswd
для изменения паролей, потому что атрибуты (кромеpwdReset
) обновляются автоматически
Также при изменении (или запросе) оперативных атрибутов убедитесь, что у вас есть права на это.
Ответ или решение
Решение проблемы с изменением паролей в LDAP с использованием ppolicy
Введение
Настройка LDAP-сервера с использованием ppolicy может быть сложной задачей, особенно когда возникает необходимость сброса паролей пользователей с установленным атрибутом pwdFailureTime
. Этот атрибут указывает на время последнего неудачного входа в систему и может стать препятствием при попытке изменить пароль. В данной статье мы рассмотрим способы решения этой проблемы, основываясь на описании, предоставленном пользователем, и рекомендациях по лучшим практикам.
Проблема
Пользователь пытается изменить пароль для учетной записи, но сталкивается с ошибкой из-за существования атрибута pwdFailureTime
, который блокирует операцию. При выполнении команды ldapmodify
возникает следующая ошибка:
ldap_modify: No such attribute (16)
additional info: modify/delete: pwdFailureTime: no such attribute
Когда последняя попытка входа была неудачной, ppolicy добавляет атрибут pwdFailureTime
, из-за чего попытка изменения пароля не происходит. Хуже оказывается, что удалить именно этот атрибут не представляется возможным, так как это приведет к ошибке:
ldap_modify: Constraint violation (19)
additional info: pwdFailureTime: no user modification allowed
Анализ ситуации
Согласно стандартам IETF по политике паролей, описанным в документе, когда происходит модификация пароля, автоматически происходит и изменение состояния атрибутов, связанных с безопасностью паролей. Несмотря на то, что вы пытались использовать LDIF-файл для изменения атрибутов, операция может завершаться неуспешно из-за ограничения, которое не позволяет вам изменять атрибут pwdFailureTime
.
Рекомендации по решению проблемы
-
Используйте ldappasswd для изменения паролей.
ldappasswd
автоматически обновляет необходимые атрибуты, включаяpwdFailureTime
. Это позволит избежать ошибок, связанных с ручным управлением атрибутами. Например:ldappasswd -x -D "cn=admin,dc=[redacted],dc=ca" -W -S "uid=anton,ou=accounts,dc=[redacted],dc=ca"
Этот подход не требует явной модификации
pwdReset
или других атрибутов, так как изменения производятся автоматически. -
Не храните пароли в открытом виде.
Хотя стандарт разрешает хранение паролей в открытом виде, это не рекомендуется по соображениям безопасности. Используйте безопасные механизмы хранения и передачи паролей. -
Алтернатива с использованием атрибута pwdMustChange.
Если необходимо, чтобы пользователь снова изменил пароль после сброса, используйте атрибутpwdMustChange
, который также активируетpwdReset
. Например, измените файл LDIF на:dn: uid=anton,ou=accounts,dc=[redacted],dc=ca changetype: modify replace: userPassword userPassword: foobar - replace: pwdMustChange pwdMustChange: TRUE
Это позволит вашему серверу правильно обработать изменения без необходимости непосредственно управлять атрибутом
pwdReset
.
Заключение
Работа с LDAP и ppolicy может вызывать сложности, особенно когда требуется изменение пароля для пользователя с активированным pwdFailureTime
. Однако, следуя рекомендациям по использованию утилиты ldappasswd
, хранению паролей в более безопасной форме и корректному управлению атрибутами, вы сможете упростить процесс и минимизировать риск возникновения ошибок. Операции с учетными записями пользователей должны выполняться с учетом всех рекомендаций по безопасности, что обеспечивает надежный и безопасный доступ к информации на вашем LDAP-сервере.