Управление группами пользователей с помощью LDAP#

Примечание

Данный раздел содержит документацию о получении из LDAP групп, в которых состоит пользователь. Документация об аутентификации пользователя в кластере с помощью LDAP находится в LDAP аутентификация.

CedrusData позволяет сопоставлять пользователей с группами для более удобного управления доступом. Например, вы можете установить правила доступа для группы, которые будут автоматически применены ко всем входящим в группу пользователям.

Примечание

Сопоставление пользователя с группами происходит на основе имени пользователя, полученного после Сопоставление пользователей.

CedrusData позволяет сопоставлять пользователей с группами на основе информации из LDAP. Например, пользователь CedrusData bob может иметь в LDAP запись uid=bob,ou=sales,dc=company,dc=com, которая принадлежит группе cn=management,ou=sales,dc=company,dc=com. CedrusData позволяет извлечь информацию о данной группе из LDAP так, что пользователь CedrusData bob будет сопоставлен с группой management.

Алгоритм поиска групп#

  1. CedrusData подключается к LDAP и проходит аутентификацию на основе имени и пароля системного пользователя (bind user), определенных в параметрах конфигурации cedrusdata.group-provider.ldap.bind.user и cedrusdata.group-provider.ldap.bind.password.

  2. Происходит поиск записи текущего пользователя CedrusData в LDAP. Для этого CedrusData подставляет имя пользователя в паттерн cedrusdata.group-provider.ldap.user.search-filter. Типичные значение паттерна зависят от конкретного LDAP сервера и приведены ниже. Если пользователь не найден, будет возвращен пустой список групп.

  3. Если определен параметр конфигурации cedrusdata.group-provider.ldap.user.member-of-attribute, CedrusData попытается извлечь список групп пользователя из соответствующего атрибута его записи в LDAP. Если CedrusData удалось извлечь список групп из атрибута пользователя, они будут использованы для формирования финального результата, как описано в пункте 5.

  4. Если параметр конфигурации cedrusdata.group-provider.ldap.user.member-of-attribute не установлен или запись LDAP пользователя не содержит соответствующий атрибут, CedrusData предпримет попытку поиска групп пользователя с помощью отдельного запроса. Для этого CedrusData сформирует запрос на поиск групп на основе параметра конфигурации cedrusdata.group-provider.ldap.group.search-filter. К запросу будет добавлен дополнительный фильтр по атрибуту cedrusdata.group-provider.ldap.group.member-attribute. Значением фильтра выступает DN (distinguished name) текущего пользователя. Таким образом будет получен список групп, в которых состоит текущий пользователь. Существует возможность рекурсивного получения списка родительских групп на один или несколько уровней вверх с помощью параметра конфигурации cedrusdata.group-provider.ldap.group.hierarchy-levels. Полученные группы будут использованы для формирования финального результата, как описано в пункте 5.

  5. Для всех полученных групп пользователя будет извлечен атрибут cedrusdata.group-provider.ldap.group.name-attribute, определяющий имя группы. Таким образом будет сформирован финальный список имен групп пользователя.

Конфигурация#

Создайте файл etc/group-provider.properties на координаторе и задайте в нем следующие обязательные параметры:

group-provider.name=cedrusdata_ldap
ldap.url=<URL сервера LDAP>
cedrusdata.group-provider.ldap.bind.user=<distinguished name системного пользователя>
cedrusdata.group-provider.ldap.bind.password=<пароль системного пользователя>

Сконфигурируйте дополнительные параметры по мере необходимости. Вы можете использовать Секреты в файлах конфигурации, чтобы не хранить чувствительную информацию в файле конфигурации.

Пример конфигурации для OpenLDAP с подключением по SSL:

group-provider.name=cedrusdata_ldap
ldap.url=ldaps://host:port
ldap.ssl.keystore.path=/path/to/keystore
ldap.ssl.keystore.password=${ENV:LDAP_KEYSTORE_PASSWORD}
ldap.ssl.truststore.path=/path/to/truststore
ldap.ssl.truststore.password=${ENV:LDAP_TRUSTSTORE_PASSWORD}
cedrusdata.group-provider.ldap.bind.user=uid=admin,ou=it,dc=company,dc=com
cedrusdata.group-provider.ldap.bind.password=${ENV:LDAP_BIND_PASSWORD}
cedrusdata.group-provider.ldap.search-base=dc=company,dc=com
cedrusdata.group-provider.ldap.user.search-filter=(&(objectClass=inetOrgPerson)(uid={0}))
cedrusdata.group-provider.ldap.group.search-filter=(objectClass=groupOfNames)

Пример конфигурации для Active Directory с подключением без SSL и использованием memberOf атрибута пользователя для получения списка групп:

group-provider.name=cedrusdata_ldap
ldap.url=ldap://host:port
ldap.allow-insecure=true
cedrusdata.group-provider.ldap.bind.user=admin@company.com
cedrusdata.group-provider.ldap.bind.password=${ENV:LDAP_BIND_PASSWORD}
cedrusdata.group-provider.ldap.search-base=dc=company,dc=com
cedrusdata.group-provider.ldap.user.member-of-attribute=memberOf
Параметры конфигурации#

Название

Описание

Значение по умолчанию

ldap.url

URL для подключения к серверу LDAP. Должен начинаться с ldap:// или ldaps://. В случае использования незащищенного подключения (ldap://) необходимо установить параметр ldap.allow-insecure=true.

ldap.allow-insecure

Позволять ли подключение к серверу LDAP без использования SSL. Запрещено по умолчанию.

false

ldap.ssl.keystore.path

Путь к keystore в формате PEM или JKS.

ldap.ssl.keystore.password

Пароль keystore.

ldap.ssl.truststore.path

Путь к truststore в формате PEM или JKS.

ldap.ssl.truststore.password

Пароль truststore.

ldap.ignore-referrals

Запретить запуск запросов на других LDAP серверах, предоставленных в качестве referrals. По умолчанию использование referrals разрешено.

false

ldap.timeout.connect

Таймаут для установления соединения с сервером LDAP. По умолчанию не ограничен.

ldap.timeout.read

Таймаут на чтение данных с сервера LDAP. По умолчанию не ограничен.

cedrusdata.group-provider.ldap.bind.user

Distinguished name системного пользователя для подключения к серверу LDAP.

cedrusdata.group-provider.ldap.bind.password

Пароль системного пользователя для подключения к серверу LDAP.

cedrusdata.group-provider.ldap.search-base

Базовый distinguished name, используемый для поиска. Используется для поиска пользователей, если не установлен параметр cedrusdata.group-provider.ldap.user.search-base. Используется для поиска групп, если не установлен параметр cedrusdata.group-provider.ldap.group.search-base. Пример: dc=company,dc=com.

cedrusdata.group-provider.ldap.user.search-base

Базовый distinguished name, используемый для поиска пользователей. Если не выставлен, будет использовано значение cedrusdata.group-provider.ldap.search-base. Пример: dc=company,dc=com

cedrusdata.group-provider.ldap.group.search-base

Базовый distinguished name, используемый для поиска групп. Если не выставлен, будет использовано значение cedrusdata.group-provider.ldap.search-base. Пример: dc=company,dc=com

cedrusdata.group-provider.ldap.user.search-filter

Фильтра для поиска пользователей. Должен содержать строковую последовательность {0}, в которую будет подставлено имя текущего пользователя CedrusData. Типичное значение для Active Directory: (&(objectClass=user)(sAMAccountName={0})) (совпадает со значением по умолчанию). Типичное значение для OpenLDAP: (&(objectClass=inetOrgPerson)(uid={0})).

(&(objectClass=user)(sAMAccountName={0}))

cedrusdata.group-provider.ldap.group.search-filter

Фильтр для получения списка групп. Типичное значение для Active Directory: (objectClass=group) (совпадает со значением по умолчанию). Типичное значение для OpenLDAP: (objectClass=groupOfNames).

(objectClass=group)

cedrusdata.group-provider.ldap.user.member-of-attribute

Атрибут пользователя, который содержит список его групп. Если не указан, поиск групп пользователя будет произведен отдельным запросом к LDAP. Типичное значение для Active Directory и LDAP: memberOf. Не может быть использован, если значение cedrusdata.group-provider.ldap.group.hierarchy-levels больше 0.

cedrusdata.group-provider.ldap.group.member-attribute

Атрибут группы, который содержит участников группы (пользователей или другие группы).

member

cedrusdata.group-provider.ldap.group.name-attribute

Атрибут группы, который содержит название группы.

cn

cedrusdata.group-provider.ldap.group.hierarchy-levels

На сколько уровней вверх осуществлять поиск групп пользователя. Если установлено значение 0, будут возвращены только группы пользователя. Если установлено значение 1, будут возвращены группы пользователя, а также группы, в которых состоят группы пользователя. И так далее. Не может быть больше нуля, если установлено параметр cedrusdata.group-provider.ldap.user.member-of-attribute.

0

cedrusdata.group-provider.ldap.cache.ttl

Как долго кэшировать список групп пользователя. Нулевое значение (например, 0s) отключает кэш.

5m

cedrusdata.group-provider.ldap.cache.max-size

Максимальный размер кэша групп пользователей. Нулевое значение отключает кэш.

1000

Устранение неисправностей#

Для устранения проблем добавьте следующую запись в файл etc/log.properties и перезагрузите узел:

io.trino.plugin.cedrusdata.ldap=DEBUG

При попытке аутентификации пользователя в логе появятся записи, которые содержат фразу io.trino.plugin.cedrusdata.ldap. Данные записи будут содержать запросы, отправленные к LDAP серверу. Попросите администраторов вашего LDAP-сервера подтвердить, что запросы сформированы корректно, и что они возвращают ожидаемую информацию. Исправьте конфигурацию CedrusData соответствующим образом при необходимости.