認証と承認の設定
Solr は、ユーザーの認証、承認、および監査をサポートするためのセキュリティフレームワークを備えています。これにより、ユーザーの身元を確認し、Solr クラスタ内のリソースへのアクセスを制限することができます。
Solr には、すぐに使用できるプラグインがいくつか含まれており、以下で説明する認証、承認、および監査ログフレームワークを使用して追加のプラグインを開発できます。
すべての認証、承認、および監査ログプラグインは、クラスタとして実行されているか、単一ノードインストールとして実行されているかに関係なく、Solr で動作します。ユーザーや許可ルールを含むすべての関連設定は、security.json
という名前のファイルに保存されます。 SolrCloud を使用する場合、このファイルは ZooKeeper 構造の chroot に配置する必要があります。 chroot が指定されていない場合は、ルートに配置する必要があります。 Solr をスタンドアロンモード(ZooKeeper なし)で実行する場合、このファイルは $SOLR_HOME
ディレクトリにある必要があります。抽出されたアーカイブから Solr を手動で実行する場合、これはおそらく server/solr
になります。サービスインストーラースクリプトを使用する場合、デフォルトの場所は /var/solr/data
になり、これはサービスインストーラーに指定されたオプションで変更できます。
security.json の設定
セキュリティプラグインの初期化に必要なすべての情報は、security.json
ファイルに保存されます。このファイルには、認証、承認、および監査ログのそれぞれに 1 つずつ、3 つのセクションが含まれています。
{
"authentication" : {
"class": "class.that.implements.authentication"
},
"authorization": {
"class": "class.that.implements.authorization"
},
"auditlogging": {
"class": "class.that.implements.auditlogging"
}
}
Solr インスタンスが起動する前に /security.json
ファイルを適切な場所に配置する必要があります。そのため、Solr はセキュリティプラグインが有効になっている状態で起動します。これを行う方法については、以下の Solr での security.json の使用 セクションを参照してください。
使用中のプラグインに応じて、ユーザー情報やロールとアクセス許可を作成するためのルールなど、他の情報が security.json
に保存されます。この情報は、Solr によって提供される各プラグインの API、またはカスタムプラグインの場合は、設計したアプローチを通じて追加されます。
より詳細なsecurity.json
の例を以下に示します。この例では、Basic認証とルールベースの承認プラグインが有効になっており、いくつかのデータが追加されています。
{
"authentication":{
"class":"solr.BasicAuthPlugin",
"credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="}
},
"authorization":{
"class":"solr.RuleBasedAuthorizationPlugin",
"permissions":[{"name":"security-edit",
"role":"admin"}],
"user-role":{"solr":"admin"}
}}
Solrでのsecurity.jsonの使用
SolrCloudクラスタの場合
Solrで認証または承認プラグインを使用するように設定する場合、security.json
ファイルをZooKeeperにアップロードする必要があります。
以下の内容でsecurity.json
ファイルを作成します。
{"authentication": {"class": "solr.KerberosPlugin"}}
この例では、認証にKerberosPlugin
が定義されていることに注意してください。使用しているプラグインに合わせて、このセクションを適切に変更する必要があります。
次に、bin/solr zk
コマンドを使用してファイルをアップロードします。
>bin/solr zk cp ./security.json zk:security.json -z localhost:2181
solr.in.sh /solr.in.cmd でZK_HOST を定義している場合(Solrインクルードファイルの更新を参照)、上記のコマンドから-z <zk host string> を省略できます。 |
セキュリティプラグインを使用し、 |
security.json
がZooKeeperにアップロードされたら、使用しているプラグインに適切なAPIを使用して更新する必要があります。手動で編集することもできますが、すべてのZooKeeperノードで適切に更新されるように、バージョンデータを削除する必要があります。バージョンデータはsecurity.json
ファイルの最後にあり、「v」の後に数字が続きます(例:{"v":138}
)。
ユーザー管理クラスタまたはシングルノードインストールの場合
ユーザー管理クラスタまたはシングルノードインストールでSolrを実行する場合、security.json
ファイルを作成し、インストールの$SOLR_HOME
ディレクトリに配置します(これはsolr.xml
と同じ場所で、通常はserver/solr
です)。
ユーザー管理クラスタでは、クラスタの各ノードにsecurity.json
を配置する必要があります。
認証および承認APIを使用できますが、ユーザー管理クラスタでは、各ノードで同じAPIリクエストを個別に実行する必要があります。必要に応じて、security.json
を手動で編集することもできます。
認証
認証プラグインは、受信リクエストを認証することにより、Solrのエンドポイントのセキュリティ保護に役立ちます。カスタムプラグインは、AuthenticationPluginクラスを拡張することで実装できます。
認証プラグインは2つの部分で構成されています。
-
サーバー側コンポーネント:Kerberos、Basic認証などのプラグインで定義されたメカニズムを使用して、Solrへの受信リクエストをインターセプトして認証します。
-
クライアント側コンポーネント:
HttpClientConfigurer
の拡張機能。SolrJクライアントが、サーバーが理解できる認証メカニズムを使用して、セキュアなSolrインスタンスにリクエストを送信できるようにします。
認証プラグインの有効化
この例のように、/security.json
で認証プラグインを指定します。
{
"authentication": {
"class": "class.that.implements.authentication",
"other_data" : "..."}
}
security.json
のauthentication
ブロック内のすべてのコンテンツは、初期化中にマップとしてプラグインに渡されます。
認証プラグインは、起動時に-DauthenticationPlugin=<plugin class name>
を渡すことにより、シングルノードSolrインスタンスでも使用できます。
現在利用可能な認証プラグインは次のとおりです。
承認
AuthorizationPluginインターフェースを拡張することにより、Solrの承認プラグインを作成できます。
承認プラグインの有効化
プラグインの実装はクラスパスに存在する必要があります。その後、security.json
で次のように指定することで、プラグインを初期化できます。
{
"authorization": {
"class": "org.apache.solr.security.MockAuthorizationPlugin",
"other_data" : "..."}
}
security.json
のauthorization
ブロック内のすべてのコンテンツは、初期化中にマップとしてプラグインに渡されます。
プラグインの再読み込みはまだサポートされておらず、Solrインストールの再起動が必要です(つまり、コアの再読み込みではなく、JVMを再起動する必要があります)。 |
現在利用可能な承認プラグインは次のとおりです。
管理UIでの認証
認証プラグインが有効になっている場合は、管理UIのすべてまたは一部の操作にも認証が必要です。管理UIはブラウザ内で実行されるAngularJSアプリケーションであり、Solrによって他の外部クライアントと同様に扱われます。
認証が必要な場合、管理UIにログインダイアログが表示されます。管理UIで現在サポートされている認証プラグインは次のとおりです。
選択したプラグインがサポートされていない場合でも、管理UIでは制限のない操作を実行できます。制限付きの操作の場合は、管理UIのグラフィカルユーザーインターフェースではなく、HTTPリクエストを送信してSolrと対話する必要があります。管理UIでサポートされているすべての操作は、SolrのAPIを介して実行できます。
ノード間リクエストのセキュリティ保護
Solrノード自体から発信されるリクエストは多数あります。たとえば、overseerからノードへのリクエスト、リカバリ スレッドなどです。これらを「ノード間」リクエストと呼びます。Solrには、ノード間トラフィックを保護するために常に利用できる組み込みのPKIAuthenticationPlugin
(下記参照)があります。
各認証プラグインは、独自のノード間リクエストを保護することもできます。これらは、いわゆるHttpClientBuilder
メカニズムを通じて行うことも、HTTPヘッダーを設定できる基本クラスのinterceptInternodeRequest()
メソッドをオーバーライドすることにより、PKIに委任するかどうかをリクエストごとに選択することもできます。
PKIAuthenticationPlugin
PKIAuthenticationPlugin
は、各Solrノードがスーパーユーザーであり、公開鍵基盤(PKI)の使用を通じて他のSolrノードによって完全に信頼される組み込みの認証メカニズムを提供します。各認証プラグインは、すべてまたは一部のノード間トラフィックをPKIプラグインに委任することを選択できます。
現在、SolrではPKI認証プロトコルの2つのバージョンが利用可能です。送信リクエストごとに、PKIAuthenticationPlugin
はリクエストのタイムスタンプとユーザープリンシパルを保持する特別なヘッダーを追加します。ノードがこの特別なヘッダーを含むリクエストを受信すると、対応する送信元ノードの公開鍵を使用してメッセージを検証します。メッセージの検証は、ZooKeeperに登録されている他のSolrノードからの受信トラフィックに対してのみ試行されます。リクエストがPKI検証に合格し、タイムスタンプが5秒未満の場合、リクエストは信頼されます。
注:PKI認証プラグインは比較的短いタイムスタンプの有効期限に依存してリクエストを検証するため、クラスタ内の個別のノードのクロックを同期させる必要があります。 |
プロトコルのバージョン2はデフォルトバージョンです。このバージョンでは、SolrAuthV2
ヘッダーには、送信元ノード名、ユーザープリンシパル、リクエストタイムスタンプ、およびbase64エンコードされたRSA署名が含まれています。すべてのノードは、最初にこのヘッダーの検証を試みます。
古いバージョンからのローリング再起動をサポートするために、プロトコルv1を使用してPKI認証を受け入れて検証するようにSolrを設定できます。これは、システムプロパティsolr.pki.sendVersion=v1
とsolr.pki.acceptVersions=v1,v2
を設定することで有効になります。有効にすると、リクエストには、送信者の秘密鍵を使用して暗号化されたユーザープリンシパルとタイムスタンプを含むSolrAuth
ヘッダーが含まれます。
SolrAuthV2
ヘッダーが存在するが検証に失敗した場合、SolrはSolrAuth
のチェックにフォールバックしません。レガシー認証ヘッダーは、最新のヘッダーが存在しない場合にのみ参照されます。
solr.pki.acceptVersion
の不明な値は警告ログメッセージを出力しますが、将来のプロトコルリビジョンをよりスムーズにサポートするためにエラーは発生しません。
タイムアウトは、pkiauth.ttl
というシステムプロパティで設定できます。たとえば、有効期間を10秒(10,000ミリ秒)に増やす場合は、各ノードをプロパティ'-Dpkiauth.ttl=10000'
で起動します。