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 и в таблице ниже:

Свойство

Описание

http-server.authentication.password.user-mapping.pattern

Regex для сопоставления пользователя. При совпадении пользователь заменяется первой regex-группой. При отсутствии совпадения аутентификация отклоняется. По умолчанию (.*).

http-server.authentication.password.user-mapping.file

Файл, содержащий правила сопоставления пользователей. Подробнее см. Сопоставление пользователей.

Конфигурация 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>

Свойство

Описание

ldap.url

URL LDAP-сервера. Схема URL должна быть ldap:// или ldaps://. Подключение к LDAP-серверу без TLS требует ldap.allow-insecure=true.

ldap.allow-insecure

Разрешить использование LDAP-соединения без защиты TLS.

ldap.ssl.keystore.path

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

ldap.ssl.keystore.password

Пароль для key store.

ldap.ssl.truststore.path

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

ldap.ssl.truststore.password

Пароль для truststore.

ldap.user-bind-pattern

Это свойство используется для указания LDAP user bind string для password-аутентификации. Это свойство должно содержать шаблон ${USER}, который заменяется фактическим именем пользователя во время password-аутентификации. Свойство может содержать несколько шаблонов, разделенных двоеточием. Шаблоны проверяются по порядку до успешного входа или до исчерпания всех вариантов. Пример: ${USER}@corp.example.com:${USER}@corp.example.co.uk

ldap.ignore-referrals

Игнорировать referrals к другим LDAP-серверам при выполнении search-query. По умолчанию false.

ldap.cache-ttl

Длительность LDAP-кэша. По умолчанию 1h.

ldap.timeout.connect

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

ldap.timeout.read

Таймаут чтения данных из LDAP-соединения. По умолчанию 1m.

В зависимости от типа реализации 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.user-base-dn

Базовый LDAP distinguished name для пользователя, который пытается подключиться к серверу. Пример: OU=America,DC=corp,DC=example,DC=com

ldap.group-auth-pattern

Это свойство используется для указания LDAP-query для авторизации по членству в LDAP-группе. Запрос выполняется на LDAP-сервере, и при успешном результате пользователь авторизуется.

Это свойство должно содержать шаблон ${USER}, который заменяется на фактическое имя пользователя в search-query авторизации по группе. Подробности см. в разделе примеров.

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

Свойство

Описание

ldap.bind-dn

Bind distinguished name, используемый Trino при выполнении запросов членства в группах. Пример: CN=admin,OU=CITY_OU,OU=STATE_OU,DC=domain

ldap.bind-password

Bind-пароль, используемый Trino при выполнении запросов членства в группах. Пример: password1234

ldap.group-auth-pattern

Это свойство используется для указания LDAP-query для авторизации по членству в LDAP-группе. Этот запрос выполняется на LDAP- сервере во время логина, чтобы проверить, принадлежит ли пользователь указанной группе. При успешном результате distinguished name пользователя извлекается из ответа запроса. Затем Trino проверяет пользователя и пароль, создавая LDAP context с distinguished name пользователя и паролем.

Это свойство должно содержать шаблон ${USER}, который заменяется на фактическое имя пользователя в search-query авторизации по группе. Подробности см. в разделе примеров.

Примеры авторизации 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-сервером.