基本認証プラグイン

Solrは、BasicAuthPluginを使用して、ユーザーの基本認証をサポートできます。

このプラグインはユーザー認証のみを提供します。ユーザー権限を制御するには、「ルールベースの認可プラグイン」セクションで説明されているように、認可プラグインを設定する必要がある場合があります。

基本認証を有効にする

基本認証を使用するには、最初にsecurity.jsonファイルを作成する必要があります。このファイルとその配置場所については、「security.jsonの設定」セクションで詳しく説明しています。

クラウドモードで実行している場合は、bin/solr authコマンドラインユーティリティを使用して、新規インストールのセキュリティを有効にできます。詳細については、bin/solr auth --helpを参照してください。

基本認証の場合、security.jsonには、認証に使用されるクラスを定義するauthenticationブロックが必要です。ユーザー名とパスワード(sha256(password + salt)ハッシュとして)は、ファイルの作成時に追加することも、後述の認証APIを使用して追加することもできます。

認証プラグインと認可プラグインがどのように連携できるかを示すために、authenticationブロックとauthorizationブロックを示すsecurity.jsonの例を以下に示します。

{
"authentication":{ (1)
   "blockUnknown": true, (2)
   "class":"solr.BasicAuthPlugin",
   "credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="}, (3)
   "realm":"My Solr users", (4)
   "forwardCredentials": false (5)
},
"authorization":{
   "class":"solr.RuleBasedAuthorizationPlugin",
   "permissions":[{"name":"security-edit",
      "role":"admin"}],
   "user-role":{"solr":"admin"}
}}

この例では、いくつかのオプションが定義されています。

1 最初のブロックは、使用する認証プラグインとそのパラメータを定義します。
2 パラメータ"blockUnknown":trueは、認証されていないリクエストの通過を許可しないことを意味します。
3 パスワード'SolrRocks'を持つ「solr」というユーザーが定義されています。
4 ログインプロンプトに別のテキストを表示するために、realmプロパティをオーバーライドします。
5 パラメータ"forwardCredentials":falseは、基本認証ヘッダーを転送する代わりに、SolrのPKI認証に分散リクエストを処理させることを意味します。

設定をローカルのsecurity.jsonというファイルに保存します。 Solrをシングルノードインストールで使用している場合は、このファイルを$SOLR_HOMEに配置する必要があります。

blockUnknownsecurity.jsonファイルで定義されていない場合、デフォルトでtrueになります。これにより、SolrへのHTTPアクセスに認証が必要になります。場合によっては、プラグインを有効にした後、認証を必要としない場合があります。たとえば、security.jsonを配置したいが、認証を有効にする準備ができていない場合などです。ただし、システムへのすべてのリクエストに対して認証が確実に適用されるようにするには、blockUnknowntrueに設定するか、完全に省略する必要があります。

blockUnknownfalseに設定すると、権限によって明示的に保護されていないすべてのリクエストは匿名ユーザーがアクセスできるようになります!そのため、保護したい定義済み権限ごとにロールバインディングを定義する必要があります。匿名ユーザーにアクセスを許可するリクエストには、特別なrole: nullバインディングを割り当てることができます。 role:nullを持つエンドポイントを除くすべてのエンドポイントを保護するには、all権限のロールバインディングを追加し、security.jsonの最後の位置に配置します。

realmが定義されていない場合、デフォルトでsolrになります。

SolrCloudを使用している場合は、security.jsonをZooKeeperにアップロードする必要があります。コマンド例と設定のセキュリティ保護に関する詳細は、SolrCloudクラスタにおける認証と承認プラグインを参照してください。

注意事項

基本認証プラグインを使用する際に留意すべき点がいくつかあります。

  • 資格情報はデフォルトでプレーンテキストで送信されます。SSLの有効化セクションで説明されているように、基本認証が有効になっている場合は、通信にSSLを使用することをお勧めします。

  • security.jsonへの書き込み権限を持つユーザーは、すべての権限とユーザー権限の割り当てを変更できます。セキュリティの編集へのアクセス権は、適切なユーザーにのみ付与するように特に注意する必要があります。

  • もちろん、ネットワークは安全である必要があります。基本認証が有効になっていても、Solrを不必要に外部に公開しないでください。

基本認証と他のスキームの組み合わせ

JWT認証プラグインなどの他の認証スキームを使用する場合でも、少数の「サービスアカウント」指向のクライアントアプリケーションに基本認証を使用したい場合があります。Solrは、複数の認証スキームをサポートするためにMultiAuthPluginを提供しています。たとえば、ユーザーアカウント用にSolrをOIDCプロバイダーと統合する一方で、Prometheusメトリクスエクスポーターからのリクエストの認証にBasicを使用することもできます。 MultiAuthPluginは、Authorizationヘッダーのスキームを使用して、各リクエストを処理するプラグインを決定します。 MultiAuthPluginは、KubernetesでSolrを実行する場合に役立ちます。エンドユーザーのユーザー管理と認証をOIDCプロバイダーに委任できますが、プローブエンドポイントをテストするときにKubernetesがOIDCを使用しないように、livenessエンドポイントとreadinessエンドポイントをBasic認証を使用して保護することもできます。

次の例は、BasicスキームとBearerスキームをサポートするようにMultiAuthPluginを設定する方法を示しています。

{
  "authentication": {
    "class": "solr.MultiAuthPlugin",
    "schemes": [{
      "scheme": "bearer",
      "blockUnknown": true,
      "class": "solr.JWTAuthPlugin",
      "wellKnownUrl": "https://OIDC_PROVIDER_URL/.well-known/openid-configuration",
      "clientId": "solr",
      "redirectUris": "https://127.0.0.1:8983/solr/",
      "rolesClaim": "groups"
    },{
      "scheme": "basic",
      "blockUnknown": true,
      "class": "solr.BasicAuthPlugin",
      "credentials": {
        "k8s-oper": "PASSWORD SALT & HASH"
      },
      "forwardCredentials": false
    }]
  }
}

Solr管理UIからの認証されていないAJAXリクエスト(つまり、Authorizationヘッダーのないリクエスト)の場合、MultiAuthPluginはリクエストをschemesリストに最初にリストされているプラグインに転送します。上記の例では、ユーザーは管理UIにログインするためにOIDCプロバイダーに認証する必要があります。

基本認証プラグイン設定の編集

認証APIでは、ユーザーIDとパスワードを変更できます。APIは、ユーザーの詳細を設定または削除するための特定のコマンドを持つエンドポイントを提供します。

APIエントリポイント

  • v1: https://127.0.0.1:8983/solr/admin/authentication

  • v2: https://127.0.0.1:8983/api/cluster/security/authentication

このエンドポイントはコレクション固有ではないため、ユーザーはSolrクラスタ全体に対して作成されます。ユーザーを特定のコレクションに制限する必要がある場合は、承認ルールを使用して行うことができます。

ユーザーの追加またはパスワードの編集

set-userコマンドを使用すると、ユーザーを追加し、パスワードを変更できます。たとえば、次のコマンドは2人のユーザーとそのパスワードを定義しています

V1 API

curl --user solr:SolrRocks https://127.0.0.1:8983/solr/admin/authentication -H 'Content-type:application/json' -d '{"set-user": {"tom":"TomIsCool", "harry":"HarrysSecret"}}'

V2 API

curl --user solr:SolrRocks https://127.0.0.1:8983/api/cluster/security/authentication -H 'Content-type:application/json' -d '{"set-user": {"tom":"TomIsCool", "harry":"HarrysSecret"}}'

ユーザーの削除

delete-userコマンドを使用すると、ユーザーを削除できます。ユーザーを削除するためにユーザーパスワードを送信する必要はありません。次の例では、ユーザーID「tom」と「harry」をシステムから削除するように要求しています。

V1 API

curl --user solr:SolrRocks https://127.0.0.1:8983/solr/admin/authentication -H 'Content-type:application/json' -d  '{"delete-user": ["tom", "harry"]}'

V2 API

curl --user solr:SolrRocks https://127.0.0.1:8983/api/cluster/security/authentication -H 'Content-type:application/json' -d  '{"delete-user": ["tom", "harry"]}'

プロパティの設定

認証プラグインのプロパティを設定します。現在、基本認証プラグインでサポートされているプロパティは、blockUnknownrealm、およびforwardCredentialsです。

V1 API

curl --user solr:SolrRocks https://127.0.0.1:8983/solr/admin/authentication -H 'Content-type:application/json' -d  '{"set-property": {"blockUnknown":false}}'

V2 API

curl --user solr:SolrRocks https://127.0.0.1:8983/api/cluster/security/authentication -H 'Content-type:application/json' -d  '{"set-property": {"blockUnknown":false}}'

認証レルムはデフォルトでsolrで、WWW-Authenticate HTTPヘッダーと管理UIログインページに表示されます。レルムを変更するには、realmプロパティを設定します

V1 API

curl --user solr:SolrRocks https://127.0.0.1:8983/solr/admin/authentication -H 'Content-type:application/json' -d  '{"set-property": {"realm":"My Solr users"}}'

V2 API

curl --user solr:SolrRocks https://127.0.0.1:8983/api/cluster/security/authentication -H 'Content-type:application/json' -d  '{"set-property": {"realm":"My Solr users"}}'

MultiAuthPluginを使用したプラグイン設定の編集

MultiAuthPluginを使用する場合、schemeを識別する単一キーオブジェクトでコマンドデータをラップする必要があります。たとえば、Basicプラグインのset-userコマンドは次のようになります。

{
  "set-user": {
    "basic": {"tom":"TomIsCool", "harry":"HarrysSecret"}
  }
}

MultiAuthPluginを使用する場合、Basicプラグインのプロパティを設定します

{
  "set-property": {
    "basic": {"realm":"My Solr users"}
  }
}

SolrJでの基本認証の使用

基本認証によって保護されているSolrサーバーでSolrJを使用するには、主に2つの方法があります。権限を個々のリクエストごとに設定するか、基になるHTTPクライアントが送信するすべてのリクエストに資格情報を追加するように設定できます。

リクエストごとの基本認証資格情報

SolrJで基本認証を設定する最も簡単な方法は、この例のように、各リクエストでsetBasicAuthCredentialsメソッドを使用することです

SolrRequest req ;//create a new request object
req.setBasicAuthCredentials(userName, password);
solrClient.request(req);

クエリの例

QueryRequest req = new QueryRequest(new SolrQuery("*:*"));
req.setBasicAuthCredentials(userName, password);
QueryResponse rsp = req.process(solrClient);

このメソッドはシンプルですが、必要なすべての場所で資格情報が提供されていることを確認するのは不便な場合があります。また、SolrRequestオブジェクトを使用しない多くのSolrClientメソッドでは機能しません。

クライアントごとの資格情報

Http2SolrClientは、クライアントを構築するときにクライアントレベルで資格情報を設定することをサポートしています。これにより、この特定のクライアントで発行されたすべてのリクエストに基本認証ヘッダーが設定されます。

Http2SolrClient client = new Http2SolrClient.Builder(solrUrl)
        .withBasicAuthCredentials(userName, password).build();
QueryResponse rsp = req.process(client);

CloudHttp2SolrClientは、内部クライアントを作成するためのHttp2SolrClient.Builderインスタンスの受信をサポートしているため、クライアントレベルで資格情報を設定するには、次のようなコードを使用できます。

Http2SolrClient.Builder http2ClientBuilder = Http2SolrClient.Builder().withBasicAuthCredentials(userName, password);
CloudHttp2SolrClient client = new CloudHttp2SolrClient.Builder(zkHostList, chroot)
            .withInternalClientBuilder(http2ClientBuilder).build();
QueryResponse rsp = req.process(client);

グローバル(JVM)基本認証資格情報

または、ユーザーはSolrJのPreemptiveBasicAuthClientBuilderFactoryを使用して、すべてのリクエストに基本認証資格情報を自動的に追加できます。この機能を有効にするには、システムプロパティ-Dsolr.httpclient.builder.factory=org.apache.solr.client.solrj.impl.PreemptiveBasicAuthClientBuilderFactoryを設定する必要があります。 PreemptiveBasicAuthClientBuilderFactoryを使用すると、アプリケーションは2つの異なる方法で資格情報を提供できます

  1. 資格情報を直接含むbasicauthシステムプロパティを渡すことができます(例:-Dbasicauth=username:password)。このオプションは簡単ですが、設定方法によっては、コマンドラインで資格情報が公開される場合があります。

  2. 資格情報を保持するプロパティファイルへのパスを含むsolr.httpclient.configシステムプロパティを渡すことができます。このファイル内では、ユーザー名とパスワードをそれぞれhttpBasicAuthUserhttpBasicAuthPasswordとして指定できます。

    httpBasicAuthUser=my_username
    httpBasicAuthPassword=secretPassword

基本認証でのSolr制御スクリプトの使用

基本認証が有効になると、Solr制御スクリプト(bin/solr)へのすべてのリクエストにユーザー資格情報が含まれている必要があります。これを確実にするために、solr.in.shまたはsolr.in.cmdファイルに次の行を追加します。

この例では、bin/solrコマンドラインに、認証のタイプとして「basic」を使用し、ユーザー名「solr」とパスワード「SolrRocks」で資格情報を渡すように指示しています。

SOLR_AUTH_TYPE="basic"
SOLR_AUTHENTICATION_OPTS="-Dbasicauth=solr:SolrRocks"

または、SOLR_AUTHENTICATION_OPTSは、次のようにファイルへのパスを受け取ることができます。

SOLR_AUTH_TYPE="basic"
SOLR_AUTHENTICATION_OPTS="-Dsolr.httpclient.config=/path/to/solr-9.5.0/server/solr/basicAuth.conf"