Вопрос или проблема
У меня есть экземпляр Keycloak, который взаимодействует с AD на сервере 2016 через LDAPS. Я проверил, что соединение с сервером работает, что соединение зашифровано и что пользователь Bind в Keycloak может аутентифицироваться.
И ТЕМ НЕ МЕНЕЕ, при попытке изменить пароль я получаю следующую ошибку:
Пользователь Bind в Keycloak имеет ПОЛНЫЙ доступ на запись по всему домену, поэтому я действительно не вижу причин, по которым AD должен отклонять внешний доступ на запись.
Подключившись к серверу через ldapsearch с ldapsearch -x -H ldaps://<DC FQDN>:636 -D "cn=Keycloak-Sync2,ou=SpecialUsers,ou=<компания>,dc=<домен компании>,dc=de" -b "ou=Team,ou=<Компания>,dc=<домен компании>,dc=de" -w "<пароль>"
, я получаю список всех пользователей в результате.
Я также получаю следующую ошибку в журнале Keycloak:
8:26:53,153 INFO [org.keycloak.storage.ldap.LDAPIdentityStoreRegistry] (Timer-2) Создание нового LDAP Store для провайдера хранения LDAP: 'ldap', Конфигурация LDAP: {fullSyncPeriod=[86400], pagination=[true], connectionPooling=[false], usersDn=[ou=Team,ou=<имя компании>,dc=<домен компании>,dc=de], cachePolicy=[DEFAULT], useKerberosForPasswordAuthentication=[false], importEnabled=[true], enabled=[true], bindDn=[CN=Keycloak-Sync2,ou=SpecialUsers,ou=<имя компании>,dc=<домен компании>,dc=de], usernameLDAPAttribute=[sAMAccountName], changedSyncPeriod=[900], lastSync=[1734287212], vendor=[ad], uuidLDAPAttribute=[objectGUID], connectionUrl=[ldaps://dc02.<домен компании>.de:636], allowKerberosAuthentication=[false], syncRegistrations=[false], authType=[simple], debug=[false], searchScope=[2], useTruststoreSpi=[ldapsOnly], usePasswordModifyExtendedOp=[true], trustEmail=[true], priority=[0], userObjectClasses=[person, organizationalPerson, user], rdnLDAPAttribute=[sAMAccountName], editMode=[WRITABLE], validatePasswordPolicy=[false], batchSizeForSync=[1000]}, binaryAttributes: []
18:26:53,200 INFO [org.keycloak.truststore.SSLSocketFactory] (Timer-2) Не найден провайдер хранилища доверенных сертификатов - используется стандартный SSLSocketFactory
18:26:54,022 INFO [org.keycloak.storage.ldap.LDAPStorageProviderFactory] (Timer-2) Синхронизация федерационного маппера 'role-mapper' завершена. Статус: UserFederationSyncResult [0 импортированных ролей, 67 ролей уже существует в Keycloak]
18:26:54,027 INFO [org.keycloak.storage.ldap.LDAPStorageProviderFactory] (Timer-2) Синхронизация измененных пользователей из LDAP в локальное хранилище: realm: <ДОМЕН КОМПАНИИ>.DE, провайдер федерации: ldap, время последней синхронизации: Вс Дек 15 18:07:41 GMT 2024
18:26:54,218 INFO [org.keycloak.storage.ldap.LDAPStorageProviderFactory] (Timer-2) Синхронизация измененных пользователей завершена: 0 импортированных пользователей, 0 обновленных пользователей
18:36:58,665 WARN [org.keycloak.events] (default task-2) type=LOGIN_ERROR, realmId=master, clientId=null, userId=null, ipAddress=10.42.0.2, error=expired_code, restart_after_timeout=true, authSessionParentId=89cdcdbd-5f32-47a2-9c69-1d83f8eca814, authSessionTabId=g8xANkYl1M0
18:37:04,130 WARN [org.keycloak.events] (default task-1) type=LOGIN_ERROR, realmId=master, clientId=security-admin-console, userId=null, ipAddress=10.42.0.2, error=user_not_found, auth_method=openid-connect, redirect_uri=https://auth.<домен компании>.de/auth/admin/master/console/, code_id=89cdcdbd-5f32-47a2-9c69-1d83f8eca814, username=<windows username>, authSessionParentId=89cdcdbd-5f32-47a2-9c69-1d83f8eca814, authSessionTabId=g8xANkYl1M0
18:38:30,022 WARN [org.keycloak.services.resources.admin.UserResource] (default task-3) Не удалось обновить пароль пользователя.: org.keycloak.models.ModelException: Не удалось изменить атрибут для DN [CN=<имя пользователя>,OU=Team,OU=<имя компании>,DC=<домен компании>,DC=de]
...
Caused by: javax.naming.NoPermissionException: [LDAP: error code 50 - 00000005: SecErr: DSID-031A11EF, problem 4003 (INSUFF_ACCESS_RIGHTS), data 0
]; remaining name 'CN=<имя пользователя>,OU=Team,OU=<имя компании>,DC=<домен компании>,DC=de'
Какова может быть причина, по которой AD не позволяет Keycloak изменить пароль пользователя?
Ответ или решение
Проблема, связанная с невозможностью изменения паролей Active Directory (AD) через Keycloak, может иметь несколько причин. Важно рассмотреть все элементы конфигурации и возможность взаимодействия между Keycloak и AD. Исходя из предоставленного описания проблемы, давайте разберем это пошагово.
1. Проверка соединения и настроек LDAP
Первым делом необходимо убедиться, что соединение между Keycloak и AD корректно настроено. Вы упомянули, что проверка шифрования и возможность аутентификации пользователя, указанного в Bind DN, прошла успешно. Однако полезно удостовериться в следующих аспектах:
-
Убедитесь, что в Keycloak правильно установлены все параметры конфигурации LDAP, такие как hostname, port, Bind DN и Base DN. Также проверьте, что все поля в конфигурации (например, userObjectClasses и другие атрибуты) соответствуют тем, что используются в AD.
-
Настройка правильных прав доступа: Даже если указанный Bind пользователь имеет полные права доступа, важно также удостовериться, что заданные права пользователя распространяются на все необходимые объекты. В данном случае, вы получаете ошибку "INSUFF_ACCESS_RIGHTS", что указывает на недостаток прав для выполнения определенной операции.
2. Полномочия и Ошибки доступа
Ошибка, которую вы наблюдаете, указывает на проблему с правами доступа пользователя, используемого для аутентификации:
javax.naming.NoPermissionException: [LDAP: error code 50 - 00000005: SecErr: DSID-031A11EF, problem 4003 (INSUFF_ACCESS_RIGHTS)
-
Проверьте политику паролей в Active Directory: Убедитесь, что политика паролей в вашей AD позволяет изменять пароль через LDAP. Иногда требуется настройка определенных параметров, чтобы разрешить изменение пароля для специфических пользователей или групп.
-
Убедитесь, что пользователь, которому вы назначаете новый пароль, действительно соответствует параметрам, указанным в Keycloak. Возможно, этот пользователь имеет какие-то особые атрибуты, которые требуют контроля при изменении пароля.
3. Исполнение операций по изменению пароля
Для изменения пароля в Active Directory через Keycloak может потребоваться активирование расширенной операции passwordModify
. Убедитесь, что данная операция поддерживается вашим сервером AD, и она включена в конфигурации Keycloak.
- Проверьте настройки расширенных операций: В настройках Keycloak убедитесь, что параметр
usePasswordModifyExtendedOp
установлен вtrue
.
4. Аудит и Логи
Всегда полезно просмотреть логи, как Keycloak, так и ваш сервер Active Directory. Возможно, дополнительные детали об ошибках могут быть найдены в соответствующих логах, которые могут указать на более специфичные причины проблемы.
-
Проверьте логи Keycloak на предмет дополнительных сообщений об ошибках, которые могут уточнять, почему операции по изменению паролей не проходят.
-
Включите аудит LDAP в AD для отслеживания операций, которые выполняет Keycloak. Это поможет выявить любые аномалии или проблемы с правами при попытке изменения пароля.
Заключение
Проблема с изменением паролей в AD через Keycloak может зависеть от множества факторов, включая настройки прав доступа, конфигурацию LDAP и специфику политики AD. Рекомендуется проверить все перечисленные моменты и, при необходимости, проконсультироваться с администратором Active Directory, чтобы удостовериться в корректности настроек. Таким образом, вы сможете устранить возникшие трудности и обеспечить стабильную работу Keycloak и Active Directory в связке.