LDAP-аутентификация#
Trino можно настроить для включения frontend LDAP-аутентификации по HTTPS для клиентов, таких как Trino CLI, а также JDBC и ODBC драйверов. В настоящее время поддерживается только простой механизм LDAP- аутентификации с использованием имени пользователя и пароля. Клиент Trino отправляет имя пользователя и пароль координатору, а координатор проверяет эти учетные данные с помощью внешнего LDAP-сервиса.
Чтобы включить LDAP-аутентификацию для Trino, связанные с LDAP изменения конфигурации выполняются на координаторе Trino.
Для LDAP-аутентификации требуется использовать TLS и a configured shared secret.
Конфигурация сервера Trino#
Конфигурация узла-координатора Trino#
Доступ к координатору Trino должен выполняться через HTTPS, настроенный как описано в TLS and HTTPS.
Также необходимо изменить файлы конфигурации Trino.
LDAP-аутентификация на координаторе настраивается в двух частях.
Первая часть — включить поддержку HTTPS и password-аутентификации
в файле config.properties координатора. Вторая часть —
настроить LDAP как плагин password-аутентификатора.
Свойства конфигурации сервера#
Ниже приведен пример обязательных свойств, которые необходимо добавить
в файл config.properties координатора:
http-server.authentication.type=PASSWORD
http-server.https.enabled=true
http-server.https.port=8443
http-server.https.keystore.path=/etc/trino/keystore.jks
http-server.https.keystore.key=keystore_password
Подробное описание доступных свойств см. в HTTP server properties и в таблице ниже:
Свойство |
Описание |
|---|---|
|
Regex для сопоставления пользователя. При совпадении пользователь
заменяется первой regex-группой. При отсутствии совпадения аутентификация
отклоняется. По умолчанию |
|
Файл, содержащий правила сопоставления пользователей. Подробнее см. Сопоставление пользователей. |
Конфигурация password-аутентификатора#
Password-аутентификация должна быть настроена на использование LDAP. Создайте
на координаторе файл etc/password-authenticator.properties. Пример:
password-authenticator.name=ldap
ldap.url=ldaps://ldap-server:636
ldap.ssl.truststore.path=/path/to/ldap_server.pem
ldap.user-bind-pattern=<Refer below for usage>
Свойство |
Описание |
|---|---|
|
URL LDAP-сервера. Схема URL должна быть |
|
Разрешить использование LDAP-соединения без защиты TLS. |
|
|
|
Пароль для key store. |
|
|
|
Пароль для truststore. |
|
Это свойство используется для указания LDAP user bind string для
password-аутентификации. Это свойство должно содержать шаблон |
|
Игнорировать referrals к другим LDAP-серверам при выполнении search-query.
По умолчанию |
|
Длительность LDAP-кэша. По умолчанию |
|
Таймаут установления LDAP-соединения. По умолчанию |
|
Таймаут чтения данных из LDAP-соединения. По умолчанию |
В зависимости от типа реализации LDAP-сервера, свойство
ldap.user-bind-pattern можно использовать, как описано ниже.
Active Directory#
ldap.user-bind-pattern=${USER}@<domain_name_of_the_server>
Пример:
ldap.user-bind-pattern=${USER}@corp.example.com
OpenLDAP#
ldap.user-bind-pattern=uid=${USER},<distinguished_name_of_the_user>
Пример:
ldap.user-bind-pattern=uid=${USER},OU=America,DC=corp,DC=example,DC=com
Авторизация на основе членства в LDAP-группе#
Вы можете дополнительно ограничить набор пользователей, которым разрешено
подключаться к координатору Trino, на основе их членства в группах, задав
необязательные свойства ldap.group-auth-pattern и ldap.user-base-dn
в дополнение к базовым свойствам LDAP-аутентификации.
Свойство |
Описание |
|---|---|
|
Базовый LDAP distinguished name для пользователя, который пытается
подключиться к серверу. Пример: |
|
Это свойство используется для указания LDAP-query для авторизации по членству в LDAP-группе. Запрос выполняется на LDAP-сервере, и при успешном результате пользователь авторизуется. Это свойство должно содержать шаблон |
Авторизация с использованием service user Trino LDAP#
Сервер Trino может использовать выделенного LDAP service user для выполнения
запросов членства пользователей в группах. В этом случае Trino сначала
выполняет запрос членства в группе для пользователя Trino, которого нужно
аутентифицировать. Distinguished name пользователя извлекается из результата
запроса. Затем Trino проверяет пароль пользователя, создавая LDAP context с
distinguished name пользователя и его паролем. Для использования этого
механизма необходимо задать свойства ldap.bind-dn, ldap.bind-password и
ldap.group-auth-pattern.
Свойство |
Описание |
|---|---|
|
Bind distinguished name, используемый Trino при выполнении запросов
членства в группах. Пример: |
|
Bind-пароль, используемый Trino при выполнении запросов членства в
группах. Пример: |
|
Это свойство используется для указания LDAP-query для авторизации по членству в LDAP-группе. Этот запрос выполняется на LDAP- сервере во время логина, чтобы проверить, принадлежит ли пользователь указанной группе. При успешном результате distinguished name пользователя извлекается из ответа запроса. Затем Trino проверяет пользователя и пароль, создавая LDAP context с distinguished name пользователя и паролем. Это свойство должно содержать шаблон |
Примеры авторизации LDAP-групп#
Для Active Directory можно использовать следующий синтаксис:
ldap.group-auth-pattern=(&(objectClass=<objectclass_of_user>)(sAMAccountName=${USER})(memberof=<dn_of_the_authorized_group>))
Пример:
ldap.group-auth-pattern=(&(objectClass=person)(sAMAccountName=${USER})(memberof=CN=AuthorizedGroup,OU=Asia,DC=corp,DC=example,DC=com))
Для OpenLDAP можно использовать следующий синтаксис:
ldap.group-auth-pattern=(&(objectClass=<objectclass_of_user>)(uid=${USER})(memberof=<dn_of_the_authorized_group>))
Пример:
ldap.group-auth-pattern=(&(objectClass=inetOrgPerson)(uid=${USER})(memberof=CN=AuthorizedGroup,OU=Asia,DC=corp,DC=example,DC=com))
Для OpenLDAP, чтобы этот запрос работал, убедитесь, что включен
memberOf overlay.
Вы можете использовать это свойство в сценариях, где нужно авторизовать пользователя на основе сложных search-query авторизации по группам. Например, если нужно авторизовать пользователя, принадлежащего любой из нескольких групп (в OpenLDAP), это свойство может быть задано так:
ldap.group-auth-pattern=(&(|(memberOf=CN=normal_group,DC=corp,DC=com)(memberOf=CN=another_group,DC=com))(objectClass=inetOrgPerson)(uid=${USER}))
Trino CLI#
Конфигурация окружения#
Конфигурация TLS#
При использовании LDAP-аутентификации доступ к координатору Trino должен осуществляться через TLS/HTTPS.
Запуск Trino CLI#
В дополнение к параметрам, необходимым при подключении к координатору Trino,
который не требует LDAP-аутентификации, запуск CLI с включенной LDAP-
поддержкой требует ряда дополнительных параметров командной строки.
Вы можете использовать свойства --keystore-* или --truststore-* для
защиты TLS-соединения. Самый простой способ запуска CLI — через
wrapper-скрипт.
#!/bin/bash
./trino \
--server https://trino-coordinator.example.com:8443 \
--keystore-path /tmp/trino.jks \
--keystore-password password \
--truststore-path /tmp/trino_truststore.jks \
--truststore-password password \
--catalog <catalog> \
--schema <schema> \
--user <LDAP user> \
--password
Подробности по использованным параметрам см. в TLS/HTTPS и Аутентификация по имени пользователя и паролю.
Устранение неполадок#
Проверка Java keystore-файла#
Проверьте пароль keystore-файла и просмотрите его содержимое с помощью Просмотр и проверка keystore.
Отладка проблем Trino ↔ LDAP server#
Если вам нужно отладить проблемы взаимодействия Trino с LDAP-сервером, можно изменить уровень логирования для LDAP аутентификатора:
io.trino.plugin.password=DEBUG
Отладка TLS для Trino CLI#
Если при запуске Trino CLI возникают ошибки, связанные с TLS, можно запустить
CLI с параметром -Djavax.net.debug=ssl для отладки. Для этого используйте
исполняемый JAR Trino CLI. Например:
java -Djavax.net.debug=ssl \
-jar \
trino-cli-<version>-executable.jar \
--server https://coordinator:8443 \
<other_cli_arguments>
Распространенные ошибки TLS/SSL#
java.security.cert.CertificateException: No subject alternative names present#
Эта ошибка возникает, когда сертификат координатора Trino некорректен и не
содержит IP-адрес, который вы указываете в аргументе --server CLI.
Необходимо заново выпустить TLS-сертификат координатора с добавлением
соответствующего SAN.
Добавление SAN в этот сертификат требуется в случаях, когда https://
использует IP-адрес в URL вместо доменного имени, содержащегося в сертификате
координатора, и сертификат не содержит параметр
SAN с соответствующим IP-адресом как
альтернативным атрибутом.
Ошибки аутентификации или TLS после обновления JDK#
Начиная с релиза JDK 8u181, для повышения надежности LDAPS (защищенный LDAP поверх TLS) endpoint identification algorithms включены по умолчанию. См. release notes from Oracle. Тот же сертификат LDAP-сервера на координаторе Trino, работающем на JDK версии >= 8u181, который ранее успешно подключался к LDAPS-серверу, теперь может завершаться следующей ошибкой:
javax.naming.CommunicationException: simple bind failed: ldapserver:636
[Root exception is javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative DNS name matching ldapserver found.]
Если вы хотите временно отключить endpoint identification, можно добавить
свойство -Dcom.sun.jndi.ldap.object.disableEndpointIdentification=true
в файл jvm.config Trino. Однако для production-среды мы
рекомендуем исправить проблему, заново выпустив сертификат LDAP-сервера так,
чтобы SAN сертификата или subject name
сертификата совпадал с LDAP-сервером.