コーディネーター Kerberos 認証

Presto コーディネーターは、Presto CLI や JDBC および ODBC ドライバーなどのクライアントに対して、HTTPS 経由での Kerberos 認証を有効にするように構成できます。

Presto の Kerberos 認証を有効にするには、Presto コーディネーターで構成を変更します。ワーカー構成を変更する必要はありません。ワーカーノードは認証されていない HTTP 経由でコーディネーターに接続し続けます。ただし、SSL/TLS で Presto ノード間の通信を保護する場合は、セキュアな内部通信を構成してください。

環境設定

Kerberos サービス

Presto コーディネーターがネットワーク経由で到達できるノードで実行されている Kerberos KDC が必要になります。KDC は、プリンシパルを認証し、Kerberos 対応サービスで使用できるセッションキーを発行する役割を担います。通常、KDC は Kerberos 用に IANA が割り当てたポートであるポート 88 で実行されます。

MIT Kerberos 設定

Kerberos は Presto コーディネーターで構成する必要があります。少なくとも、/etc/krb5.conf ファイルの [realms] セクションに kdc エントリが必要です。admin_server エントリを含めて、Presto コーディネーターがポート 749 で Kerberos 管理サーバーに到達できることを確認することもできます。

[realms]
  PRESTO.EXAMPLE.COM = {
    kdc = kdc.example.com
    admin_server = kdc.example.com
  }

[domain_realm]
  .presto.example.com = PRESTO.EXAMPLE.COM
  presto.example.com = PRESTO.EXAMPLE.COM

krb5.conf の完全なドキュメントは、MIT Kerberos プロジェクトでホストされています。Kerberos プロトコルの別の実装を使用している場合は、環境に合わせて構成を調整する必要があります。

Kerberos プリンシパルとキータブファイル

Presto コーディネーターには Kerberos プリンシパルが必要です。Presto コーディネーターに接続するユーザーにも必要です。kadmin を使用して、Kerberos でこれらのユーザーを作成する必要があります。

さらに、Presto コーディネーターにはキータブファイルが必要です。プリンシパルを作成した後、kadmin を使用してキータブファイルを作成できます。

kadmin
> addprinc -randkey presto@EXAMPLE.COM
> addprinc -randkey presto/presto-coordinator.example.com@EXAMPLE.COM
> ktadd -k /etc/presto/presto.keytab presto@EXAMPLE.COM
> ktadd -k /etc/presto/presto.keytab presto/presto-coordinator.example.com@EXAMPLE.COM

注意

ktadd を実行すると、プリンシパルのキーがランダム化されます。プリンシパルを作成したばかりの場合、これは問題ではありません。プリンシパルがすでに存在する場合、既存のユーザーまたはサービスがパスワードまたはキータブを使用して認証できることに依存している場合は、ktadd-norandkey オプションを使用します。

Java 暗号化拡張ポリシーファイル

Java ランタイム環境には、使用できる暗号化キーの強度を制限するポリシーファイルが同梱されています。Kerberos はデフォルトで、同梱されているポリシーファイルでサポートされているキーよりも大きいキーを使用します。この問題には 2 つの可能な解決策があります。

  • JCE ポリシーファイルを更新します。

  • 強度を下げたキーを使用するように Kerberos を構成します。

2 つのオプションのうち、JCE ポリシーファイルを更新することをお勧めします。JCE ポリシーファイルは、Oracle からダウンロードできます。JCE ポリシーファイルは、実行している Java のメジャーバージョンによって異なることに注意してください。たとえば、Java 6 ポリシーファイルは Java 8 では機能しません。

Java 8 ポリシーファイルはこちらから入手できます。ポリシーファイルをインストールする手順は、ZIP アーカイブの README ファイルに含まれています。システム JRE にポリシーファイルをインストールする場合は、管理者アクセス権が必要になります。

TLS 用の Java キーストアファイル

Kerberos 認証を使用する場合、Presto コーディネーターへのアクセスは HTTPS 経由で行う必要があります。コーディネーターでTLS 用の Java キーストアファイルを作成することで実行できます。

システムアクセスコントロールプラグイン

Kerberos を有効にした Presto コーディネーターでは、目的のレベルのセキュリティを実現するために、システムアクセス制御プラグインが必要になる可能性があります。

Presto コーディネーターノードの設定

Presto コーディネーターで Kerberos 認証と HTTPS を使用するように構成する前に、上記の設定を環境に適用する必要があります。次の環境変更を行った後、Presto 構成ファイルに変更を加えることができます。

config.properties

Kerberos 認証は、コーディネーターノードの config.properties ファイルで構成されます。追加する必要があるエントリを以下に示します。

http-server.authentication.type=KERBEROS

http.server.authentication.krb5.service-name=presto
http.server.authentication.krb5.service-hostname=presto.example.com
http.server.authentication.krb5.keytab=/etc/presto/presto.keytab
http.authentication.krb5.config=/etc/krb5.conf

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

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

プロパティ

説明

http-server.authentication.type

Presto コーディネーターの認証タイプ。必ず KERBEROS に設定する必要があります。

http.server.authentication.krb5.service-name

Presto コーディネーターの Kerberos サービス名。Kerberos プリンシパルと一致する必要があります。

http.server.authentication.krb5.principal-hostname

Presto コーディネーターの Kerberos ホスト名。Kerberos プリンシパルと一致する必要があります。このパラメーターはオプションです。含まれている場合、Presto はマシンのホスト名の代わりに、Kerberos プリンシパルのホスト部分にこの値を使用します。

http.server.authentication.krb5.keytab

Kerberos プリンシパルを認証するために使用できるキータブの場所。

http.authentication.krb5.config

Kerberos 構成ファイルの場所。

http-server.https.enabled

Presto コーディネーターの HTTPS アクセスを有効にします。true に設定する必要があります。

http-server.https.port

HTTPS サーバーポート。

http-server.https.keystore.path

TLS を保護するために使用される Java キーストアファイルの場所。

http-server.https.keystore.key

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

注意

HTTPSを有効にした後、PrestoコーディネーターのCPU使用率を監視してください。Javaは、大きなリストから選択できる場合、CPU負荷の高い暗号スイートを優先します。HTTPSを有効にした後、CPU使用率が許容できないほど高い場合は、http-server.https.included-cipher プロパティを設定して安価な暗号のみを許可するようにJavaを構成できます。前方秘匿性(FS)のない暗号はデフォルトで無効になっています。その結果、FSではない暗号を選択したい場合は、デフォルトの除外を上書きするために、http-server.https.excluded-cipher プロパティを空のリストに設定する必要があります。

http-server.https.included-cipher=TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256
http-server.https.excluded-cipher=

Javaのドキュメントには、サポートされている暗号スイートが記載されています。

access-controls.properties

少なくとも、access-control.properties ファイルには、access-control.name プロパティが含まれている必要があります。その他の構成はすべて、構成される実装に固有です。詳細については、システムアクセス制御を参照してください。

トラブルシューティング

Kerberos認証を正常に機能させるのは難しい場合があります。問題を解決しようとするときに焦点を絞るために、Prestoの外部で構成の一部を個別に検証できます。

Kerberosの検証

telnetを使用して、PrestoコーディネーターからKDCに接続できることを確認します。

$ telnet kdc.example.com 88

kinitklistを使用して、keytabファイルを使用してチケットを正常に取得できることを確認します。

$ kinit -kt /etc/presto/presto.keytab presto@EXAMPLE.COM
$ klist

Javaキーストアファイルの検証

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

Kerberosの追加デバッグ情報

Presto jvm.config ファイルに次の行を追加することにより、PrestoコーディネータープロセスのKerberos追加デバッグ情報を有効にできます

-Dsun.security.krb5.debug=true
-Dlog.enable-console=true

-Dsun.security.krb5.debug=true は、JRE KerberosライブラリからのKerberosデバッグ出力を有効にします。デバッグ出力はstdoutに送られ、Prestoはロギングシステムにリダイレクトします。-Dlog.enable-console=true は、stdout への出力をログに表示できるようにします。

Kerberosデバッグ出力がログに送信する情報の量と有用性は、認証が失敗している場所によって異なります。例外メッセージとスタックトレースも、問題の本質について有用な手がかりを提供できます。

追加リソース

一般的なKerberosエラーメッセージ(A-M)

一般的なKerberosエラーメッセージ(N-Z)

MIT Kerberosドキュメント:トラブルシューティング