Kerberos認証プラグイン

ネットワーク環境のセキュリティ保護にKerberosを使用している場合、Kerberos認証プラグインを使用してSolrクラスタをセキュリティ保護できます。

これにより、SolrはKerberosサービスプリンシパルとkeytabファイルを使用して、ZooKeeperおよびSolrクラスタのノード間(該当する場合)で認証できます。管理UIおよびすべてのクライアント(SolrJなど)のユーザーも、UIを使用したり、Solrにリクエストを送信したりする前に、有効なチケットを持っている必要があります。

Kerberos認証のサポートは、SolrCloud、ユーザー管理、または単一ノードのインストールで使用できます。

Kerberosでセキュリティ保護されたHadoopクラスタでSolrを使用し、SolrインデックスをHDFSに保存する場合は、その目的のためにSolrを設定するための追加手順については、HDFS上のSolrセクションも参照してください。このページの手順は、SolrがKerberosでセキュリティ保護されるシナリオにのみ適用されます。Kerberized HDFSシステムにインデックスを保存する必要があるだけの場合は、「HDFS上でSolrを実行する」セクションを参照してください。

SolrとKerberosの連携方法

SolrでKerberosを使用するように設定する場合、リクエストを認証するためにキー配布センター(KDC)に登録されているKerberosユーザー名である *サービスプリンシパル* をSolrで使用するための設定が行われます。設定では、サービスプリンシパル名と資格情報を含むkeytabファイルの場所が定義されます。

すべての認証プラグインと同様に、Kerberos認証の設定はsecurity.jsonに格納されます。このファイルについては、security.jsonの設定セクションで説明されています。

サービスプリンシパルとkeytabファイル

各Solrノードには、キー配布センター(KDC)に登録されたサービスプリンシパルが必要です。KerberosプラグインはSPNegoを使用して認証をネゴシエートします。

サービスプリンシパルの例としてHTTP/host1@YOUR-DOMAIN.ORGを使用します。

  • HTTPは、このサービスプリンシパルを使用して認証されるリクエストの種類を示します。サービスプリンシパルのHTTP/は、SPNegoがHTTP経由でのSolrへのリクエストで機能するために必須です。

  • host1は、Solrノードをホストしているマシンのホスト名です。

  • YOUR-DOMAIN.ORGは、組織全体のKerberosレルムです。

同じホスト上の複数のSolrノードは、ホスト名がすべて共通であるため、同じサービスプリンシパルを持つことができます。

サービスプリンシパルとともに、各Solrノードには、使用されるサービスプリンシパルの資格情報を含むkeytabファイルが必要です。keytabファイルには、KDCからKerberosチケットを取得する際のパスワードレスログインをサポートするための暗号化された資格情報が含まれています。各Solrノードについて、keytabファイルは安全な場所に保管し、クラスタのユーザーと共有しないでください。

Solrクラスタはノード間の通信を必要とするため、各ノードは他のノードへのKerberos対応リクエストを行うこともできる必要があります。デフォルトでは、Solrはノード間の通信の「クライアントプリンシパル」として、同じサービスプリンシパルとkeytabを使用します。異なるクライアントプリンシパルを明示的に設定することもできますが、推奨されず、以下の例では説明していません。

Kerberized ZooKeeper

Kerberized SolrCloudクラスタを設定する際には、ZooKeeperについてもKerberosセキュリティを有効にすることをお勧めします。

このような設定では、ZooKeeperとのリクエスト認証に使用されるクライアントプリンシパルを、ノード間通信にも共有できます。これにより、Solrが使用するZooKeeperクライアントがこれを処理するため、チケット付与チケット(TGT)を個別に更新する必要がなくなり、メリットがあります。これを達成するために、KerberosプラグインとZooKeeperクライアントの両方に対して、単一のJAAS構成(アプリ名としてClientを使用)を使用できます。

KerberosモードでZooKeeperを起動する例については、以下のZooKeeper構成セクションを参照してください。

ブラウザ構成

Kerberos認証を有効にした後、ブラウザでSolr Admin UIにアクセスするには、アクセスを許可するためにKerberos認証サービスとネゴシエートできる必要があります。各ブラウザはこれを異なる方法でサポートしており、一部のブラウザ(Chromeなど)はまったくサポートしていません。Kerberos認証を有効にした後にSolr Admin UIにアクセスしようとすると401エラーが表示される場合は、ブラウザが認証リクエストのネゴシエーション方法や場所を正しく構成されていない可能性があります。

ブラウザの設定方法に関する詳細情報は、このドキュメントの範囲外です。詳細については、Kerberosに関する情報をシステム管理者にお問い合わせください。

Kerberos認証構成

Kerberos管理者にご相談ください!

SolrでKerberos認証を使用するように構成する前に、以下に概説されている各手順を確認し、各詳細についてローカルのKerberos管理者にご相談して、各パラメータの正しい値を確実に把握してください。小さなエラーでも、Solrが起動しなかったり、正しく機能しなかったりする原因となり、診断が非常に困難になることがよくあります。

Kerberosプラグインの構成には、いくつかの部分があります。

  • サービスプリンシパルとkeytabファイルを作成する

  • ZooKeeper構成

  • /security.jsonを作成または更新する

  • jaas-client.confを定義する

  • Solr起動パラメータ

これらの手順を以下で順を追って説明します。

ホスト名を使用する

IPアドレスの代わりにホスト名を使用するには、bin/solr.in.shSOLR_HOST構成を使用するか、Solr起動時に-Dhost=<hostname>システムパラメータを渡します。このガイドではIPアドレスを使用しています。ホスト名を指定する場合は、ガイド内のすべてのIPアドレスを適切なSolrホスト名に置き換えてください。

サービスプリンシパルとkeytabを取得する

Solrを構成する前に、KDCサーバーで各SolrホストとZooKeeper(ZooKeeperがまだ構成されていない場合)のKerberosサービスプリンシパルが使用可能になっていること、および下記のようにkeytabファイルが生成されていることを確認してください。

この例では、ホスト名が192.168.0.107であり、ホームディレクトリが/home/foo/であると想定しています。この例は、ご自身の環境に合わせて変更する必要があります。

root@kdc:/# kadmin.local
Authenticating as principal foo/admin@EXAMPLE.COM with password.

kadmin.local:  addprinc HTTP/192.168.0.107
WARNING: no policy specified for HTTP/192.168.0.107@EXAMPLE.COM; defaulting to no policy
Enter password for principal "HTTP/192.168.0.107@EXAMPLE.COM":
Re-enter password for principal "HTTP/192.168.0.107@EXAMPLE.COM":
Principal "HTTP/192.168.0.107@EXAMPLE.COM" created.

kadmin.local:  ktadd -k /tmp/107.keytab HTTP/192.168.0.107
Entry for principal HTTP/192.168.0.107 with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/tmp/107.keytab.
Entry for principal HTTP/192.168.0.107 with kvno 2, encryption type arcfour-hmac added to keytab WRFILE:/tmp/107.keytab.
Entry for principal HTTP/192.168.0.107 with kvno 2, encryption type des3-cbc-sha1 added to keytab WRFILE:/tmp/108.keytab.
Entry for principal HTTP/192.168.0.107 with kvno 2, encryption type des-cbc-crc added to keytab WRFILE:/tmp/107.keytab.

kadmin.local:  quit

KDCサーバーの/tmp/107.keytabからSolrホストの/keytabs/107.keytabにkeytabファイルをコピーします。この手順を各Solrノードに対して繰り返します。

ZooKeeperがまだ設定されていない場合は、同様の手順を実行してZooKeeperサービスプリンシパルとkeytabを作成する必要がある場合があります。その場合、以下の例ではZooKeeperに異なるサービスプリンシパルを示しているため、ノードの1つのサービスプリンシパルとしてzookeeper/host1を使用して上記を繰り返す可能性があります。

ZooKeeper構成

既にKerberosを使用するように構成されているZooKeeperを使用している場合は、ここに示されているZooKeeper関連の手順をスキップできます。

ZooKeeperはSolrCloudクラスタ内のノード間の通信を管理するため、クラスタの各ノードと認証できる必要があります。構成には、ZooKeeperのサービスプリンシパルの設定、JAAS構成ファイルの定義、およびそれら両方の項目の使用をZooKeeperに指示することが必要です。

最初の手順として、ZooKeeperのconfディレクトリにjava.envファイルを作成し、この例のように以下の内容を追加します。

export JVMFLAGS="-Djava.security.auth.login.config=/etc/zookeeper/conf/jaas-client.conf"

JAAS構成ファイルには、以下のパラメータを含める必要があります。principalkeyTabのパスは、必要に応じて変更してください。このファイルは上記の手順で定義されたパスに、指定されたファイル名で配置する必要があります。

Server {
 com.sun.security.auth.module.Krb5LoginModule required
  useKeyTab=true
  keyTab="/keytabs/zkhost1.keytab"
  storeKey=true
  doNotPrompt=true
  useTicketCache=false
  debug=true
  principal="zookeeper/host1@EXAMPLE.COM";
};

最後に、ZooKeeper構成ファイルzoo.cfgに以下の行を追加します。

authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
jaasLoginRenew=3600000

すべての構成が完了したら、JAAS構成ファイルを指す以下のパラメータを使用してZooKeeperを起動します。

$ bin/zkServer.sh start -Djava.security.auth.login.config=/etc/zookeeper/conf/jaas-client.conf

security.jsonの作成

以下の内容でsecurity.jsonファイルを作成します。

{"authentication": {"class": "solr.KerberosPlugin"}}

次に、bin/solr zkコマンドを使用してファイルをアップロードします。

$ bin/solr zk cp ./security.json zk:security.json -z localhost:2181

単一ノードインストールでSolrを使用している場合は、security.jsonファイルを作成して$SOLR_HOMEディレクトリに配置する必要があります。

ZooKeeperに/security.jsonファイルが既に存在する場合は、そのファイルをダウンロードし、認証セクションを追加または変更して、Solrで使用可能なZooKeeperユーティリティを使用してZooKeeperにアップロードし直します。

JAAS構成ファイルの定義

JAAS構成ファイルは、サービスプリンシパルやkeytabファイルの場所など、認証に使用するプロパティを定義します。チケットのキャッシングなどの機能を確保するために、他のプロパティも設定できます。

以下の例をコピーして、ご自身の環境に合わせて少し変更できます。ファイルの場所はサーバー上のどこでもかまいませんが、Solrの起動時に参照されるため、ファイルシステムで読み取り可能である必要があります。JAASファイルには、異なるユーザー用の複数のセクションを含めることができますが、各セクションには一意の名前を付ける必要があります。これにより、各アプリケーションで一意に参照できます。

以下の例では、/home/foo/jaas-client.confという名前とパスを持つJAAS構成ファイルを作成しました。次のセクションでSolrの起動パラメータを定義するときに、この名前とパスを使用します。ここでクライアントのprincipalはサービスプリンシパルと同じであることに注意してください。これは、ノード間リクエストとZooKeeperへのリクエストを認証するために使用されます。正しいprincipalホスト名とkeyTabファイルパスを使用してください。

Client {
  com.sun.security.auth.module.Krb5LoginModule required
  useKeyTab=true
  keyTab="/keytabs/107.keytab"
  storeKey=true
  useTicketCache=true
  debug=true
  principal="HTTP/192.168.0.107@EXAMPLE.COM";
};

このファイルの最初の行はセクション名を定義しており、以下で定義されているsolr.kerberos.jaas.appnameパラメータと共に使用されます。

主に関係するのはkeyTabprincipalのプロパティですが、環境によっては他にも必要なものがあります。Krb5LoginModuleのjavadocs(使用されているクラスであり、上記の2行目で呼び出されるクラス)は、使用可能なプロパティの概要を示していますが、参考として、上記の例で使用されているものは以下のように説明されています。

  • useKeyTab:このブール型プロパティは、keytabファイルを使用するかどうかを定義します(この場合はtrue)。

  • keyTab:このJAAS構成ファイルのセクションが対象とするプリンシパルのkeytabファイルの場所と名前。パスは二重引用符で囲む必要があります。

  • storeKey:このブール型プロパティにより、キーをユーザーのプライベート資格情報に保存できます。

  • useTicketCache:このブール型プロパティにより、チケットをチケットキャッシュから取得できます。

  • debug:このブール型プロパティは、トラブルシューティングに役立つデバッグメッセージを出力します。

  • principal:使用するサービスプリンシパルの名前。

Solr起動パラメータ

Solrの起動時に、ホスト固有の以下のパラメータを渡す必要があります。これらのパラメータは、bin/solrスタートコマンドでコマンドラインから渡すか(システムパラメータの渡し方についてはSolrコントロールスクリプトリファレンスを参照)、オペレーティングシステムに応じてbin/solr.in.shまたはbin/solr.in.cmdで定義できます。

solr.kerberos.name.rules

オプション

デフォルト:DEFAULT

Kerberosプリンシパルを短い名前にマップするために使用されます。名前ルールの例:RULE:[1:$1@$0](.*EXAMPLE.COM)s/@.*//

solr.kerberos.name.rules.mechanism

オプション

デフォルト:hadoop

Kerberosプリンシパルを短い名前にマップするために使用されるメカニズム。これはhadoopまたはmitのいずれかになります。

solr.kerberos.cookie.domain

必須

デフォルト:なし

Cookieを発行するために使用され、Solrノードのホスト名を持つ必要があります。

solr.kerberos.cookie.portaware

オプション

デフォルト:false

trueに設定すると、標準的なCookieとは異なり、ホストとポートに基づいてCookieが区別されます。これは、同じホストに複数のSolrノードがホストされている場合に設定する必要があります。

solr.kerberos.principal

必須

デフォルト:なし

サービスプリンシパル。

solr.kerberos.keytab

必須

デフォルト:なし

サービスプリンシパルの資格情報を含むkeytabファイルのパス。

solr.kerberos.jaas.appname

オプション

デフォルト:Client

ノード間通信に必要なJAAS構成ファイル内のアプリ名(セクション名)。デフォルトはZooKeeper認証にも使用されます。ZooKeeperとSolrで異なるユーザーを使用する場合は、JAAS構成ファイルに個別のセクションが必要です。

java.security.auth.login.config

必須

デフォルト:なし

ノード間通信のためにSolrクライアントを構成するためのJAAS構成ファイルへのパス。

これはbin/solr.in.shに追加できる例です。この例を正しいホスト名とkeytabファイルパスを使用して変更してください。

SOLR_AUTH_TYPE="kerberos"
SOLR_AUTHENTICATION_OPTS="-Djava.security.auth.login.config=/home/foo/jaas-client.conf -Dsolr.kerberos.cookie.domain=192.168.0.107 -Dsolr.kerberos.cookie.portaware=true -Dsolr.kerberos.principal=HTTP/192.168.0.107@EXAMPLE.COM -Dsolr.kerberos.keytab=/keytabs/107.keytab"
AES-256暗号化を使用するKDC

KDCがAES-256暗号化を使用している場合、Kerberized SolrがKDCと通信する前に、Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy FilesをJREに追加する必要があります。

Solrログに「KrbException: Encryption type AES256 CTS mode with HMAC SHA1-96 is not supported/enabled」のようなエラーが表示された場合、このことがわかります。

Java 1.8の場合、これはこちらから入手できます:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

JAVA_HOME/jre/lib/security/にあるlocal_policy.jarを、ダウンロードしたパッケージの新しいlocal_policy.jarに置き換え、Solrノードを再起動します。

委任トークンを使用する

Kerberosプラグインは、委任トークンを使用するように構成できます。委任トークンを使用すると、アプリケーションはエンドユーザーまたは別のアプリケーションの認証を再利用できます。

Solrでこれが役立つ可能性のあるユースケースがいくつかあります。

  • 各クライアントがユーザーの資格情報にアクセスできない可能性のある分散クライアント(MapReduceなど)を使用する場合。

  • Kerberosサーバーの負荷が高い場合。委任トークンは、最初のリクエスト後にサーバーにアクセスしないため、負荷を軽減できます。

  • 他のユーザーにリクエストまたはパーミッションを委任する必要がある場合。

委任トークンを有効にするには、いくつかのパラメータを定義する必要があります。これらのパラメータは、コマンドラインで`bin/solr`スタートコマンドと共に渡すことができます(Solr コントロールスクリプト リファレンス)、またはオペレーティングシステムに応じて`bin/solr.in.sh`または`bin/solr.in.cmd`で定義できます。

solr.kerberos.delegation.token.enabled

オプション

デフォルト:false

`true`に設定して委任トークンを有効にします。トークンを有効にするには、このパラメータが必要です。

solr.kerberos.delegation.token.kind

オプション

デフォルト: `solr-dt`

委任トークンの種類。現時点では、デフォルトのみが使用可能です。

solr.kerberos.delegation.token.validity

オプション

デフォルト: `36000`

委任トークンが有効な時間(秒単位)。

solr.kerberos.delegation.token.signer.secret.provider

オプション

デフォルト: `zookeeper`

委任トークン情報が内部的に保存される場所。デフォルトは`zookeeper`です。これは、Solrサーバー間で(SolrCloudモードで実行する場合)委任トークンを機能させるために必要な場所です。現時点では他のオプションはありません。

solr.kerberos.delegation.token.signer.secret.provider.zookeeper.path

オプション

デフォルト:なし

シークレットプロバイダ情報が保存されているZooKeeperのパス。これはパス + `/security/token` の形式です。パスにはchrootを含めることも、chrootを使用していない場合は省略することもできます。この例にはchrootが含まれています: `server1:9983,server2:9983,server3:9983/solr/security/token`。

solr.kerberos.delegation.token.secret.manager.znode.working.path

オプション

デフォルト:なし

トークン情報が保存されているZooKeeperのパス。これはパス + `/security/zkdtsm` の形式です。パスにはchrootを含めることも、chrootを使用していない場合は省略することもできます。この例にはchrootが含まれています: `server1:9983,server2:9983,server3:9983/solr/security/zkdtsm`。

Solrの起動

設定が完了したら、以下の例のように`bin/solr`スクリプトでSolrを起動できます。これはSolrCloudモードのユーザーのみを対象とした例です。

この例では、`bin/solr.in.sh`または`bin/solr.in.cmd`を適切な値で変更したと仮定していますが、変更していない場合は、システムパラメータをスタートコマンドと一緒に渡す必要があります。また、ZooKeeperノードの場所に応じて`-z`プロパティをカスタマイズする必要がある点にも注意してください。

$ bin/solr -c -z server1:2181,server2:2181,server3:2181/solr
`solr.in.sh`/`solr.in.cmd`で`ZK_HOST`を定義している場合(Solrインクルードファイルの更新を参照)、上記の命令から`-z <zkホスト文字列>`を省略できます。

設定のテスト

  1. ユーザー名で`kinit`を実行します。例えば、`kinit user@EXAMPLE.COM`です。

  2. `curl`を使用してSolrにアクセスしてみてください。成功した応答が返されるはずです。

    $ curl --negotiate -u : "http://192.168.0.107:8983/solr/"

Kerberized SolrでのSolrJの使用

SolrJアプリケーションでKerberos認証を使用するには、SolrClientを作成する前に次の2行が必要です。

System.setProperty("java.security.auth.login.config", "/home/foo/jaas-client.conf");
HttpClientUtil.setHttpClientBuilder(new Krb5HttpClientBuilder().getBuilder());

クライアントのKerberosサービスプリンシパルと、対応するキータブを上記のJAASクライアント設定ファイルで指定する必要があります。このプリンシパルは、Solr用に作成したサービスプリンシパルとは異なる必要があります。

例を以下に示します。

SolrJClient {
  com.sun.security.auth.module.Krb5LoginModule required
  useKeyTab=true
  keyTab="/keytabs/foo.keytab"
  storeKey=true
  useTicketCache=true
  debug=true
  principal="solrclient@EXAMPLE.COM";
};

SolrJでの委任トークン

委任トークンは、以下の方法でSolrJでもサポートされています。

  • `DelegationTokenRequest`と`DelegationTokenResponse`を使用して、委任トークンの取得、キャンセル、更新を行うことができます。

  • `HttpSolrClient.Builder`には、委任トークンを使用して認証するHttpSolrClientを作成するための`withKerberosDelegationToken`関数があります。

委任トークンを取得するためのサンプルコード

private String getDelegationToken(final String renewer, final String user, HttpSolrClient solrClient) throws Exception {
    DelegationTokenRequest.Get get = new DelegationTokenRequest.Get(renewer) {
      @Override
      public SolrParams getParams() {
        ModifiableSolrParams params = new ModifiableSolrParams(super.getParams());
        params.set("user", user);
        return params;
      }
    };
    DelegationTokenResponse.Get getResponse = get.process(solrClient);
    return getResponse.getDelegationToken();
  }

委任トークンを使用する`HttpSolrClient`を作成するには

HttpSolrClient client = new HttpSolrClient.Builder("https://127.0.0.1:8983/solr").withKerberosDelegationToken(token).build();

委任トークンを使用する`CloudSolrClient`を作成するには

CloudSolrClient client = new CloudSolrClient.Builder(Collections.singletonList("localhost:2181"),Optional.empty())
                .withLBHttpSolrClientBuilder(new LBHttpSolrClient.Builder()
                    .withResponseParser(client.getParser())
                    .withHttpSolrClientBuilder(
                        new HttpSolrClient.Builder()
                            .withKerberosDelegationToken(token)
                    ))
                        .build();

Hadoopの委任トークン応答はJSONマップ形式です。そのため、`DelegationTokenResponse`にはそのための応答パーサーがあります。他の応答パーサーはHadoopの応答でうまく機能しない可能性があります。