Ошибки 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
Введите 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 может помочь.

Я думаю, что есть две вещи, которые нужно изменить:

  1. Не используйте пароли в открытом виде в LDAP (даже если стандарт, кажется, это подразумевает)
  2. Используйте 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.

Рекомендации по решению проблемы

  1. Используйте ldappasswd для изменения паролей.
    ldappasswd автоматически обновляет необходимые атрибуты, включая pwdFailureTime. Это позволит избежать ошибок, связанных с ручным управлением атрибутами. Например:

    ldappasswd -x -D "cn=admin,dc=[redacted],dc=ca" -W -S "uid=anton,ou=accounts,dc=[redacted],dc=ca"

    Этот подход не требует явной модификации pwdReset или других атрибутов, так как изменения производятся автоматически.

  2. Не храните пароли в открытом виде.
    Хотя стандарт разрешает хранение паролей в открытом виде, это не рекомендуется по соображениям безопасности. Используйте безопасные механизмы хранения и передачи паролей.

  3. Алтернатива с использованием атрибута 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-сервере.

Оцените материал
Добавить комментарий

Капча загружается...