LDAP認証

Presto は、Presto CLI、JDBC ドライバ、ODBC ドライバなどのクライアントに対して、HTTPS 経由でフロントエンド LDAP 認証を有効にするように設定できます。現在、サポートされているのは、ユーザー名とパスワードを含む単純な LDAP 認証メカニズムのみです。Presto クライアントはユーザー名とパスワードを Coordinator に送信し、Coordinator は外部 LDAP サービスを使用してこれらの資格情報を検証します。

Presto で LDAP 認証を有効にするには、Presto Coordinator で設定を変更します。ワーカーの設定を変更する必要はありません。クライアントから Coordinator への通信のみが認証されます。ただし、SSL/TLS を使用して Presto ノード間の通信を保護する場合は、セキュアな内部通信 を設定してください。

Presto サーバー設定

環境設定

セキュアLDAP

Presto にはセキュアLDAP (LDAPS) が必要なので、LDAPサーバーでTLSが有効になっていることを確認してください。

Presto Coordinator での TLS 設定

TLS接続を保護するために、LDAPサーバーのTLS証明書をPresto CoordinatorのデフォルトのJava Truststoreにインポートする必要があります。証明書`ldap_server.crt`をCoordinatorのTruststoreにインポートするには、次の`keytool`コマンドの例を使用できます。

$ keytool -import -keystore <JAVA_HOME>/jre/lib/security/cacerts -trustcacerts -alias ldap_server -file ldap_server.crt

これに加えて、Presto CoordinatorへのアクセスはHTTPSで行う必要があります。これは、CoordinatorでTLS用のJava Keystoreファイルを作成することで行うことができます。

Presto Coordinator ノード設定

Presto CoordinatorでLDAP認証とHTTPSを使用するように設定する前に、環境に以下の変更を加える必要があります。

Presto 設定ファイルにも変更を加える必要があります。LDAP 認証は、Coordinator で 2 つの部分で設定されます。最初の部分は、Coordinator の config.properties ファイルで HTTPS サポートとパスワード認証を有効にすることです。2 番目の部分は、LDAP をパスワード認証プラグインとして設定することです。

サーバー設定プロパティ

Coordinator の config.properties ファイルに追加する必要があるプロパティの例を次に示します。

http-server.authentication.type=PASSWORD

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

http-server.https.keystore.path=/etc/presto_keystore.jks
http-server.https.keystore.key=keystore_password

プロパティ

説明

http-server.authentication.type

Presto Coordinator のパスワード認証を有効にします。 PASSWORD に設定する必要があります。

http-server.https.enabled

Presto Coordinator の HTTPS アクセスを有効にします。 true に設定する必要があります。デフォルト値は false です。

http-server.https.port

HTTPS サーバーポート。

http-server.https.keystore.path

TLS のセキュリティ保護に使用される Java Keystore ファイルの場所。

http-server.https.keystore.key

Keystore のパスワード。これは、Keystore を作成したときに指定したパスワードと一致する必要があります。

http-server.authentication.allow-forwarded-https

HTTP 経由で転送された HTTPS リクエストを安全なものとして扱うことを有効にします。転送されたリクエストで X-Forwarded-Proto ヘッダーが https に設定されている必要があります。デフォルト値は false です。

パスワード認証設定

LDAP を使用するようにパスワード認証を設定する必要があります。Coordinator に etc/password-authenticator.properties ファイルを作成します。例

password-authenticator.name=ldap
ldap.url=ldaps://ldap-server:636
ldap.user-bind-pattern=<Refer below for usage>

プロパティ

説明

ldap.url

LDAP サーバーの URL。Presto ではセキュア LDAP のみが許可されるため、URL スキームは ldaps:// でなければなりません。

ldap.user-bind-pattern

このプロパティを使用して、パスワード認証用の LDAP ユーザーバインド文字列を指定できます。このプロパティには、パスワード認証中に実際のユーザー名で置き換えられる ${USER} パターンが含まれている必要があります。例: ${USER}@corp.example.com

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 グループメンバーシップに基づく承認

オプションの ldap.group-auth-pattern プロパティと ldap.user-base-dn プロパティを設定することにより、グループメンバーシップに基づいてPresto Coordinatorへの接続を許可するユーザーのセットをさらに制限できます。

プロパティ

説明

ldap.user-base-dn

サーバーへの接続を試みるユーザーの基本LDAP識別名。例: OU=America,DC=corp,DC=example,DC=com

ldap.group-auth-pattern

このプロパティは、LDAPグループメンバーシップ承認のLDAPクエリを指定するために使用されます。このクエリはLDAPサーバーに対して実行され、成功するとユーザーは承認されます。このプロパティには、グループ承認検索クエリで実際のユーザー名に置き換えられる ${USER} パターンが含まれている必要があります。下記のサンプルを参照してください。

LDAPサーバーの実装タイプに基づいて、ldap.group-auth-patternプロパティは下記のように使用できます。

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 オーバーレイを有効にする必要があります。

このプロパティは、複雑なグループ承認検索クエリに基づいてユーザーを承認する場合のシナリオにも使用できます。たとえば、複数のグループのいずれかに属するユーザーを承認する場合(OpenLDAP)、このプロパティは次のように設定できます。

ldap.group-auth-pattern=(&(|(memberOf=CN=normal_group,DC=corp,DC=com)(memberOf=CN=another_group,DC=com))(objectClass=inetOrgPerson)(uid=${USER}))

Presto CLI

環境設定

TLS 設定

LDAP認証を使用する場合は、Presto CoordinatorへのアクセスはHTTPSで行う必要があります。Presto CLIは、Java KeystoreファイルまたはJava Truststoreのいずれかを使用してTLSを設定できます。

Keystoreファイルを使用する場合は、クライアントマシンにコピーしてTLSの設定に使用できます。Truststoreを使用する場合は、デフォルトのJava Truststoreを使用するか、CLIにカスタムTruststoreを作成できます。本番環境では、自己署名証明書を使用することはお勧めしません。

Presto CLI 実行

LDAP認証を必要としないPresto Coordinatorに接続する場合に必要なオプションに加えて、LDAPサポートが有効になっているCLIを呼び出すには、いくつかの追加のコマンドラインオプションが必要です。TLS接続を保護するには、--keystore-*または--truststore-*プロパティを使用できます。CLIを呼び出す最も簡単な方法は、ラッパースクリプトを使用することです。

#!/bin/bash

./presto \
--server https://presto-coordinator.example.com:8443 \
--keystore-path /tmp/presto.jks \
--keystore-password password \
--truststore-path /tmp/presto_truststore.jks \
--truststore-password password \
--catalog <catalog> \
--schema <schema> \
--user <LDAP user> \
--password

オプション

説明

--server

Presto コディネーターのアドレスとポート。ポートは、Presto コディネーターがHTTPS接続をリッスンしているポートに設定する必要があります。LDAP認証を使用する場合、Presto CLIではURLにhttpスキームを使用できません。

--keystore-path

TLS のセキュリティ保護に使用される Java Keystore ファイルの場所。

--keystore-password

Keystore のパスワード。これは、Keystore を作成したときに指定したパスワードと一致する必要があります。

--truststore-path

TLSを保護するために使用されるJava Truststoreファイルの場所。

--truststore-password

Truststoreのパスワード。これは、Truststoreの作成時に指定したパスワードと一致する必要があります。

--user

LDAPユーザー名。Active Directoryの場合はsAMAccountName、OpenLDAPの場合はユーザーのuidを使用する必要があります。これは、config.propertiesで指定されたプロパティ内の${USER}プレースホルダーパターンを置き換えるために使用されるユーザー名です。

--password

userのパスワードの入力を求めるプロンプトが表示されます。

トラブルシューティング

Java Keystoreファイルの検証

Java Keystoreファイルの検証を使用して、Keystoreファイルのパスワードを検証し、その内容を表示します。

Presto CLIのSSLデバッグ

Presto CLIの実行時にSSL関連のエラーが発生した場合は、デバッグのために-Djavax.net.debug=sslパラメーターを使用してCLIを実行できます。これを実現するには、Presto CLI実行可能JARファイルを使用する必要があります。例:

java -Djavax.net.debug=ssl \
-jar \
presto-cli-<version>-executable.jar \
--server https://coordinator:8443 \
<other_cli_arguments>

一般的なSSLエラー

java.security.cert.CertificateException: No subject alternative names present

このエラーは、Prestoコディネーターの証明書が無効であり、CLIの--server引数で指定したIPアドレスが含まれていない場合に発生します。適切なSANを追加して、コディネーターのSSL証明書を再生成する必要があります。

https://がURLにドメイン名ではなくIPアドレスを使用しており、証明書に一致するIPアドレスを代替属性として含むSANパラメーターが含まれていない場合、この証明書にSANを追加する必要があります。