CLI Kerberos認証

Prestoのコマンドラインインターフェースは、Kerberos認証が有効になっているPrestoコーディネーターに接続できます。

環境設定

Kerberosサービス

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

MIT Kerberosの設定

Kerberosはクライアントで設定する必要があります。少なくとも、/etc/krb5.confファイルの[realms]セクションにkdcエントリが必要です。また、admin_serverエントリを含め、クライアントがポート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 Projectによってホストされています。Kerberosプロトコルの異なる実装を使用している場合は、環境に合わせて構成を調整する必要があります。

Kerberosプリンシパルとkeytabファイル

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

また、各ユーザーにはkeytabファイルが必要です。keytabファイルは、プリンシパルを作成した後、kadminを使用して作成できます。

kadmin
> addprinc -randkey someuser@EXAMPLE.COM
> ktadd -k /home/someuser/someuser.keytab someuser@EXAMPLE.COM

注意

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

Java Cryptography Extensionポリシーファイル

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

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

  • 強度の低いキーを使用するようにKerberosを構成します。

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

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

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

Kerberos認証を使用する場合、Prestoコーディネーターへのアクセスはhttpsを介して行う必要があります。Prestoコーディネーターは、TLS構成にJavaキーストアファイルを使用します。このファイルは、クライアントマシンにコピーして、構成に使用できます。

Presto CLIの実行

Kerberos認証を必要としないPrestoコーディネーターに接続する場合に必要なオプションに加えて、Kerberosサポートを有効にしてCLIを起動するには、いくつかの追加のコマンドラインオプションが必要です。CLIを起動する最も簡単な方法は、ラッパースクリプトを使用することです。

#!/bin/bash

./presto \
  --server https://presto-coordinator.example.com:7778 \
  --krb5-config-path /etc/krb5.conf \
  --krb5-principal someuser@EXAMPLE.COM \
  --krb5-keytab-path /home/someuser/someuser.keytab \
  --krb5-remote-service-name presto \
  --keystore-path /tmp/presto.jks \
  --keystore-password password \
  --catalog <catalog> \
  --schema <schema>

オプション

説明

--server

Prestoコーディネーターのアドレスとポート。ポートは、PrestoコーディネーターがHTTPS接続をリッスンしているポートに設定する必要があります。

--krb5-config-path

Kerberos設定ファイル。

--krb5-principal

コーディネーターへの認証に使用するプリンシパル。

--krb5-keytab-path

--krb5-principalで指定されたプリンシパルを認証するために使用できるkeytabの場所

--krb5-remote-service-name

PrestoコーディネーターのKerberosサービス名。

--keystore-path

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

--keystore-password

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

トラブルシューティング

Prestoコーディネーターのトラブルシューティングに使用できるのと同じ手順の多くが、CLIのトラブルシューティングにも適用されます。

Kerberosの追加デバッグ情報

CLIプロセスを開始するときに、-Dsun.security.krb5.debug=trueをJVM引数として渡すことで、Presto CLIプロセスの追加のKerberosデバッグ情報を有効にできます。そのためには、自己実行可能なJARを直接実行するのではなく、javaを介してCLI JARを起動する必要があります。自己実行可能なjarファイルは、オプションをJVMに渡すことができません。

#!/bin/bash

java \
  -Dsun.security.krb5.debug=true \
  -jar presto-cli-*-executable.jar \
  --server https://presto-coordinator.example.com:7778 \
  --krb5-config-path /etc/krb5.conf \
  --krb5-principal someuser@EXAMPLE.COM \
  --krb5-keytab-path /home/someuser/someuser.keytab \
  --krb5-remote-service-name presto \
  --keystore-path /tmp/presto.jks \
  --keystore-password password \
  --catalog <catalog> \
  --schema <schema>

PrestoコーディネーターのKerberos認証の設定に関するドキュメントにリストされている追加リソースは、Kerberosデバッグメッセージを解釈する際に役立つ場合があります。