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アドレスの代わりにホスト名を使用するには、 |
サービスプリンシパルと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構成ファイルには、以下のパラメータを含める必要があります。principal
とkeyTab
のパスは、必要に応じて変更してください。このファイルは上記の手順で定義されたパスに、指定されたファイル名で配置する必要があります。
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に |
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
パラメータと共に使用されます。
主に関係するのはkeyTab
とprincipal
のプロパティですが、環境によっては他にも必要なものがあります。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。
|
委任トークンを使用する
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ホスト文字列>`を省略できます。 |
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の応答でうまく機能しない可能性があります。 |