OAuth 2.0-аутентификация#

Trino можно настроить для включения OAuth 2.0-аутентификации по HTTPS для Web UI и JDBC-драйвера. Trino использует поток Authorization Code, в котором Authorization Code обменивается на токен. В общих чертах поток включает следующие шаги:

  1. координатор Trino перенаправляет браузер пользователя на Authorization Server

  2. пользователь проходит аутентификацию на Authorization Server, и сервер одобряет запрос разрешений Trino

  3. браузер пользователя перенаправляется обратно на координатор Trino с authorization code

  4. координатор Trino обменивает authorization code на токен

Чтобы включить OAuth 2.0-аутентификацию для Trino, изменения конфигурации выполняются на координаторе Trino. Изменения в конфигурации worker не требуются; аутентифицируется только коммуникация от клиентов к координатору.

При настройке OAuth 2.0 authorization server, например OpenID Connect (OIDC) provider, задайте callback/redirect URL как https://<trino-coordinator-domain-name>/oauth2/callback.

Если Web UI включен, при настройке OAuth 2.0 authentication server, например OpenID Connect (OIDC) provider, задайте post-logout callback URL как https://<trino-coordinator-domain-name>/ui/logout/logout.html.

Для OAuth 2.0-аутентификации требуется использовать TLS и a configured shared secret.

OpenID Connect Discovery#

Trino поддерживает чтение конфигурации Authorization Server из OIDC provider configuration metadata document. Во время запуска координатора Trino получает этот документ и использует предоставленные значения для установки соответствующих свойств конфигурации OAuth2-аутентификации:

  • authorization_endpoint -> http-server.authentication.oauth2.auth-url

  • token_endpoint -> http-server.authentication.oauth2.token-url

  • jwks_uri -> http-server.authentication.oauth2.jwks-url

  • userinfo_endpoint -> http-server.authentication.oauth2.userinfo-url

  • access_token_issuer -> http-server.authentication.oauth2.access-token-issuer

  • end_session_endpoint -> http-server.authentication.oauth2.end-session-url

Warning

Если authorization server выдает JSON Web Tokens (JWT), а metadata document содержит userinfo_endpoint, Trino использует этот endpoint для проверки валидности OAuth2 access token. Поскольку JWT можно проверять локально, использование их через userinfo_endpoint может приводить к ошибке аутентификации. В таком случае задайте http-server.authentication.oauth2.oidc.use-userinfo-endpoint в false (http-server.authentication.oauth2.oidc.use-userinfo-endpoint=false). Это указывает Trino игнорировать userinfo_endpoint и проверять токены локально.

Эта функциональность включена по умолчанию, но может быть отключена с помощью: http-server.authentication.oauth2.oidc.discovery=false.

Конфигурация сервера Trino#

Использование OAuth2-аутентификации требует, чтобы координатор Trino был защищен TLS.

Ниже приведен пример обязательных свойств, которые нужно добавить в файл config.properties координатора:

http-server.authentication.type=oauth2

http-server.https.port=8443
http-server.https.enabled=true

http-server.authentication.oauth2.issuer=https://authorization-server.com
http-server.authentication.oauth2.client-id=CLIENT_ID
http-server.authentication.oauth2.client-secret=CLIENT_SECRET

Чтобы включить OAuth 2.0-аутентификацию для Web UI, необходимо добавить следующее свойство:

web-ui.authentication.type=oauth2

Доступны следующие свойства конфигурации:

Свойства конфигурации OAuth2#

Свойство

Описание

http-server.authentication.type

Тип используемой аутентификации. Для включения OAuth2-аутентификации координатора Trino должен быть установлен в oauth2.

http-server.authentication.oauth2.issuer

URL издателя IdP. Все выданные токены должны содержать это значение в поле iss.

http-server.authentication.oauth2.access-token-issuer

URL издателя IdP для access token, если он отличается. Все выданные access token должны содержать это значение в поле iss. Указание этого значения при включенном OIDC discovery переопределяет значение из OpenID provider metadata document. По умолчанию равно значению http-server.authentication.oauth2.issuer.

http-server.authentication.oauth2.auth-url

URL авторизации. URL, на который будет перенаправлен браузер пользователя для начала процесса OAuth 2.0 authorization. Указание этого значения при включенном OIDC discovery переопределяет значение из OpenID provider metadata document.

http-server.authentication.oauth2.token-url

URL endpoint на authorization server, который Trino использует для получения access token. Указание этого значения при включенном OIDC discovery переопределяет значение из OpenID provider metadata document.

http-server.authentication.oauth2.jwks-url

URL endpoint JSON Web Key Set (JWKS) на authorization server. Он предоставляет Trino набор ключей, содержащий public key для проверки любого JSON Web Token (JWT) от authorization server. Указание этого значения при включенном OIDC discovery переопределяет значение из OpenID provider metadata document.

http-server.authentication.oauth2.userinfo-url

URL endpoint /userinfo IdP. Если указан, этот URL используется для проверки OAuth access token и получения связанных claims. Это требуется, если IdP выдает opaque token. Указание этого значения при включенном OIDC discovery переопределяет значение из OpenID provider metadata document.

http-server.authentication.oauth2.client-id

Публичный идентификатор клиента Trino.

http-server.authentication.oauth2.client-secret

Секрет, используемый для авторизации клиента Trino на authorization server.

http-server.authentication.oauth2.additional-audiences

Дополнительные аудитории, которым доверяют, помимо client ID, который всегда является доверенной аудиторией.

http-server.authentication.oauth2.scopes

Scopes, запрашиваемые сервером во время authorization challenge. См.: https://tools.ietf.org/html/rfc6749#section-3.3

http-server.authentication.oauth2.challenge-timeout

Максимальная длительность authorization challenge. По умолчанию 15m.

http-server.authentication.oauth2.state-key

Секретный ключ, используемый алгоритмом SHA-256 HMAC для подписи параметра state, чтобы гарантировать, что authorization request не был подделан. По умолчанию это случайная строка, сгенерированная во время запуска координатора.

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

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

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

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

http-server.authentication.oauth2.principal-field

Поле access token, используемое для Trino user principal. По умолчанию sub. Другие часто используемые поля: sAMAccountName, name, upn и email.

http-server.authentication.oauth2.oidc.discovery

Включить чтение OIDC provider metadata. По умолчанию true.

http-server.authentication.oauth2.oidc.discovery.timeout

Таймаут при чтении OpenID provider metadata. По умолчанию 30s.

http-server.authentication.oauth2.oidc.use-userinfo-endpoint

Использовать значение userinfo_endpoint из provider metadata. Когда значение userinfo_endpoint указано, этот URL используется для проверки OAuth 2.0 access token и получения связанных claims. Этот флаг позволяет игнорировать значение, предоставленное в metadata document. По умолчанию true.

http-server.authentication.oauth2.end-session-url

URL endpoint на authentication server, на который перенаправляется браузер пользователя, чтобы End-User был разлогинен из authentication server при выходе из Trino.

Refresh tokens#

Refresh tokens позволяют безопасно управлять длительностью пользовательских сессий в приложениях. Refresh token имеет более долгий срок жизни (TTL) и используется для обновления access token с более коротким сроком жизни. Когда refresh tokens используются вместе с access tokens, пользователи могут оставаться в системе длительное время без прерывания повторным запросом входа.

В потоке refresh token используются три токена с разными сроками действия:

  • access token

  • refresh token

  • Trino-encrypted token, который является комбинацией access token и refresh token. Encrypted token управляет временем жизни сессии через timeout, задаваемый свойством http-server.authentication.oauth2.refresh-tokens.issued-token.timeout.

В следующем сценарии срок жизни токенов, выдаваемых IdP:

  • access token 5m

  • refresh token 24h

Поскольку срок жизни access token всего пять минут, Trino использует refresh token с более долгим сроком, чтобы запрашивать новый access token каждые пять минут от имени пользователя. В этом случае максимальное значение http-server.authentication.oauth2.refresh-tokens.issued-token.timeout составляет двадцать четыре часа.

Чтобы использовать flow refresh token, следующее свойство должно быть включено в конфигурации координатора.

http-server.authentication.oauth2.refresh-tokens=true

Могут потребоваться дополнительные scopes для офлайн-доступа, в зависимости от конфигурации IdP.

http-server.authentication.oauth2.scopes=openid,offline_access [or offline]

Доступны следующие свойства конфигурации:

Свойства конфигурации OAuth2 для refresh flow#

Свойство

Описание

http-server.authentication.oauth2.refresh-tokens.issued-token.timeout

Срок действия issued token, то есть Trino-encrypted token, который содержит access token и refresh token. Значение timeout должно быть меньше или равно длительности срока действия refresh token, выдаваемого IdP. По умолчанию 1h. Значение timeout — это максимальная длительность сессии OAuth2-аутентифицированного клиента при включенных refresh tokens. Подробнее см. в Устранение неполадок.

http-server.authentication.oauth2.refresh-tokens.issued-token.issuer

Issuer, представляющий экземпляр координатора, который указывается в issued token. По умолчанию Trino_coordinator. К значению добавляется текущая версия Trino. В основном используется для отладки.

http-server.authentication.oauth2.refresh-tokens.issued-token.audience

Audience, представляющая этот экземпляр координатора, используемая в issued token. По умолчанию Trino_coordinator.

http-server.authentication.oauth2.refresh-tokens.secret-key

Base64-encoded secret key, используемый для шифрования сгенерированного токена. По умолчанию генерируется во время запуска.

Устранение неполадок#

Для отладки проблем измените [log level ` для OAuth 2.0 аутентификатора:

io.trino.server.security.oauth2=DEBUG

Для отладки проблем использования OAuth 2.0-аутентификации с Web UI задайте следующее свойство конфигурации:

io.trino.server.ui.OAuth2WebUiAuthenticationFilter=DEBUG

Предполагается, что OAuth 2.0-аутентификация для Web UI включена, как описано в Конфигурация сервера Trino.

Логируемая отладочная ошибка для просроченного refresh token: Tokens refresh challenge has failed.

Warning

Если refresh token истекает, пользовательская сессия прерывается, и пользователь должен повторно аутентифицироваться, выполнив вход снова. Убедитесь, что значение http-server.authentication.oauth2.refresh-tokens.issued-token.timeout меньше или равно длительности срока действия refresh token, выдаваемого вашим IdP. Оптимально задавать timeout немного меньше, чем срок жизни refresh token вашего IdP, чтобы сессии завершались корректно.