JWT認証プラグイン

Solrは、JWTAuthPluginを使用して、JSON Web Token(JWT)ベースのベアラー認証をサポートできます。

これにより、Solrは、JWT形式のアクセストークンがIDプロバイダによってデジタル署名されていることを検証することにより、ユーザーが外部IDプロバイダで既に認証されていることを確認できます。一般的なユースケースは、OpenID Connect対応のIDPとSolrを統合することです。

モジュール

これは、使用する前に有効にする必要があるjwt-auth Solrモジュールを介して提供されます。

JWT認証の有効化

JWTベアラー認証を使用するには、security.jsonファイルに、認証に使用されるクラスと設定パラメータを定義するauthentication部分が必要です。

設定なしでプラグインを登録するための、最もシンプルなsecurity.jsonは次のとおりです。

{
  "authentication": {
    "class":"solr.JWTAuthPlugin",
    "blockUnknown":"false"
  }
}

このプラグインは、デフォルトで、すべてのトラフィックに有効なJWTトークンを要求します。

上記の例のようにblockUnknownプロパティがfalseに設定されている場合、認証されていないREST API呼び出しを使用してプラグインの設定を開始できます。これは、「JWT認証プラグイン設定の編集」セクションでさらに説明されています。

設定パラメータ

キー 説明 デフォルト

blockUnknown

REST APIを介して設定を実行する必要がある場合、または認可プラグインを使用していて特定のパスのみを保護する場合にfalseに設定します。デフォルトでは、すべてのリクエストにトークンが必要です。

true

realm

HTTP 401レスポンスでエコーバックする認証レルムの名前。管理UIのログインページにも表示されます。

'solr-jwt'

scope

有効なスコープの空白で区切られたリスト。設定されている場合、JWTアクセストークンには、リストされたスコープの少なくとも1つを含むscopeクレームが含まれている必要があります。例:solr:read solr:admin

requireIss

iss(発行者)クレームがないリクエストを失敗させます。

true

requireExp

exp(有効期限)クレームがないリクエストを失敗させます。

true

algAllowlist

許可されるアルゴリズムを含むJSON配列: HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512, PS256, PS384, PS512, none

デフォルトでは、すべてのアルゴリズムが許可されます。

jwkCacheDur

JWKキャッシュの有効期間(秒)

3600 (1時間)

principalClaim

プリンシパルを取得するクレームID

sub

rolesClaim

ユーザーロールを取得するクレームID。トップレベルのクレームとネストされたクレームの両方がサポートされています。someClaim.child構文を使用して、someClaimオブジェクト内にネストされたクレームchildを参照してください。クレームには、スペースで区切られたロールのリスト、またはJSON配列が含まれている必要があります。これらのロールを使用して、Authorizationプラグインで詳細なアクセス制御を定義できます。

デフォルトでは、scopeクレームのスコープがユーザーロールとして渡されます。

claimsMatch

一致する必要がある正規表現(値)を持つクレーム(キー)のJSONオブジェクト。例: { "foo" : "A|B" } は、fooクレームが"A"または"B"のいずれかであることを要求します。

adminUiScope

管理UIからログインする際に要求されるスコープを定義します。

定義されていない場合、scopeパラメーターの最初のスコープが使用されます。

redirectUris

外部認証後のリダイレクトの有効な場所(1つまたは複数)。文字列または文字列の配列を受け入れます。Solrの基本URL(例: https://solr1.example.com:8983/solr/)でなければならず、事前にIDプロバイダーに登録されているリダイレクトURIのリストと一致する必要があります。

デフォルトは空のリストです。つまり、任意のノードが有効なリダイレクトターゲットと見なされます。

trustedCerts

IdPとの通信時に信頼する必要がある、プレーンテキストのPEMまたはPKCS#7形式の1つ以上のX.509 SSL証明書。改行文字は\nに置き換える必要があります。使用方法の詳細については、IdPサーバーの信頼の段落を参照してください。

デフォルトはJavaトラストストアです。

trustedCertsFile

IdPとの通信時に信頼する必要がある1つ以上のX.509 SSL証明書を含む、PEM、DER、またはPKCS#7形式のファイルへのパス。ファイルパスの配列も可能です。使用方法の詳細については、IdPサーバーの信頼の段落を参照してください。

デフォルトはJavaトラストストアです。

issuers

サポートする発行者(IDプロバイダー)のリスト。発行者の設定セクションで設定構文を参照してください。

発行者の設定

このプラグインは、1つ以上のトークン発行者(IdP)をサポートしています。発行者は、issuers設定キーの下にJSONオブジェクトのリストとして設定されます。リストの最初の発行者は「プライマリ発行者」であり、管理UIへのログインに使用されます。

キー 説明 デフォルト

name

発行者の固有の名前。APIを通じてリストを操作するために使用されます。

wellKnownUrl

OpenID Connect DiscoveryエンドポイントへのURL

clientId

OpenID Connectで使用するためのクライアント識別子。管理UIで認証するために必要です。プライマリ発行者のみ必要です。

jwksUrl

JWKsエンドポイントへのURL。httpsプロトコルを使用する必要があります。オプションでURLの配列を使用できます。その場合、署名を検証する際に、すべてのURLからすべての公開鍵が参照されます。

wellKnownUrlが提供されている場合は自動的に構成されます。

jwk

jwksUrlの代わりに、発行者の公開鍵を含む静的なJSONオブジェクトを指定できます。形式はJWKまたはJWKセットのいずれかです。RFC7517に例があります。

iss

IdPで設定されている固有の発行者ID。受信トークンには一致するissクレームが必要です。複数の発行者が設定されている場合にも、発行者の解決に使用されます。

wellKnownUrlが提供されている場合は自動的に構成されます。

aud

aud(オーディエンス)クレームがこの文字列と等しいことを検証します。

設定されている場合はclientIdを使用します。

authorizationEndpoint

Idプロバイダーの承認エンドポイントのURL

wellKnownUrlが提供されている場合は自動的に構成されます。

tokenEndpoint

IdプロバイダーのトークンエンドポイントのURL

wellKnownUrlが提供されている場合は自動的に構成されます。

authorizationFlow

使用するOAuth 2.0フローを指定します。サポートされているフローは'implicit'と'code_pkce'('Proof Key for Code Exchange'を使用した承認コード)です。注:'implicit'は非推奨であり、代わりに'code_pkce'を使用することを強くお勧めします。

implicit

下位互換性のために、プライマリ発行者のすべての設定キーは、nameを除いてトップレベルキーとして設定できます。

その他の設定例

JWKS URLを使用する場合

Authorizationヘッダーに有効なJWTを要求するすべてのユーザーに対する認証を適用するには、1つ以上のJSON Web Key(JWK)を使用してプラグインを設定する必要があります。これは、JWTの署名/暗号化に使用されるキーを含むJSONドキュメントです。対称キーまたは非対称キーのいずれかです。JWKは、外部HTTPSエンドポイントから取得(およびキャッシュ)するか、security.jsonで直接指定できます。以下は前者の例です。

{
  "authentication": {
    "class": "solr.JWTAuthPlugin",
    "jwksUrl": "https://my.key.server/jwk.json"
  }
}

管理UIサポートを有効にする場合

この例では、よく知られたURIを使用したOpenID Connect Discoveryを使用して、OpenID Connect対応のIDプロバイダーで管理UIを使用する機能を含む多くの一般的な設定を自動的に構成する方法を示しています。

{
  "authentication": {
    "class": "solr.JWTAuthPlugin",
    "wellKnownUrl": "https://idp.example.com/.well-known/openid-configuration",
    "clientId": "xyz",
    "redirectUris": "https://my.solr.server:8983/solr/"
  }
}

この場合、jwksUrliss、およびauthorizationEndpointは、取得された設定から自動的に構成されます。

複雑な例

より複雑な設定を見てみましょう。今回は、2つの発行者が設定されており、一方では静的に埋め込まれたJWKを使用しています。

{
  "authentication": {
    "class": "solr.JWTAuthPlugin", (1)
    "blockUnknown": true, (2)
    "principalClaim": "solruid", (3)
    "claimsMatch": { "foo" : "A|B", "dept" : "IT" }, (4)
    "scope": "solr:read solr:write solr:admin", (5)
    "algAllowlist" : [ "RS256", "RS384", "RS512" ], (6)
    "issuers": [ (7)
      {
        "name": "example1-static", (8)
        "jwk": { (9)
          "e": "AQAB",
          "kid": "k1",
          "kty": "RSA",
          "n": "3ZF6w....vjbCXxw"
        },
        "clientId": "solr-client-12345", (10)
        "iss": "https://example.com/idp", (11)
        "aud": "https://example.com/solr" (12)
      },
      {
        "name": "example2",
        "wellKnownUrl": "https://example2.com/.well-known/oidc", (13)
        "aud": "https://example2.com/solr"
      }
    ],
    "trustedCertsFile": "/path/to/certsFile.pem" (14)
  }
}

この設定について説明します。

1 プラグインクラス
2 有効なトークンを持たないユーザーをブロックします(デフォルトでもあります)。
3 デフォルトのsub以外のクレームからユーザーIDを取得します。
4 rolesクレームが"A"または"B"のいずれかで、deptクレームが"IT"であることを要求します。
5 solr:readsolr:write、またはsolr:adminのいずれかのスコープを要求します。
6 署名にはRSAアルゴリズムのみを受け入れます。
7 発行者設定の配列
8 各発行者オブジェクトには、固有の名前が必要です。
9 ここでは、jwksUrlを使用してURLを参照する代わりに、JWKをインラインで渡します。
10 IDプロバイダーに登録されているクライアントIDを設定します。
11 発行者IDを設定します。トークンの検証に使用されます。トークンの'iss'クレームは、設定された発行者IDのいずれかと一致する必要があります。
12 オーディエンスクレームを設定します。トークンの'aud'クレームは、設定された発行者のいずれかの'aud'と一致する必要があります。
13 この発行者はディスカバリによって自動的に構成されるため、'iss'とJWKの設定は必要ありません。
14 IdP https通信を信頼するSSL証明書を提供します。

非SSL URLを使用する場合

本番環境では、常にSSLで保護されたHTTPS接続を使用する必要があります。それ以外の場合は、攻撃を受ける可能性があります。ただし、開発中は、通常のHTTP URLを使用し、Solrが実行するセキュリティチェックをバイパスすることが役立つ場合があります。これをサポートするために、起動時にシステムプロパティ-Dsolr.auth.jwt.allowOutboundHttp=trueを設定できます。

IdPサーバーの信頼

Oauth2サーバー(IdP)とのすべての通信はHTTPSを介して行われます。デフォルトでは、Javaの組み込みTrustStoreが使用されます。ただし、trustedCertsFileまたはtrustedCertsのいずれかのオプションを設定することにより、プラグインは代わりに提供された証明書セットを信頼し、ルートCAによって署名された証明書は信頼しません。これはより安全であり、自己署名証明書を信頼することもできます。また、SolrがSSLモードで起動されていない場合でも動作するという利点もあります。

trustedCertsまたはtrustedCertsFileのいずれかのオプションを設定してください。両方を設定するとエラーが発生します。trustedCertsFileが文字列の配列の場合、Solrはすべてのファイルから証明書を解析します。

複数の認証スキーム

Solrは、Authorizationヘッダーに基づいて複数の認証スキームをサポートするMultiAuthPluginを提供します。これにより、JWTAuthPluginを使用してユーザー管理と認証をOIDCプロバイダーに委任するようにSolrを設定できますが、OIDCがサポートされていない場合や実際的でない場合でも、少数のサービスアカウントがBasic認証を使用できるようにすることができます。

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

上記のすべてのプロパティは、認証APIを使用して設定または変更できます。したがって、classblockUnknown=falseのみを設定した単純な構成から始めて、APIを使用して残りの部分を構成できます。

設定プロパティの設定

認証プラグインのプロパティを設定します。上記の表の設定キーのそれぞれを、set-propertyコマンドのパラメーターキーとして使用できます。

V1 API

curl https://127.0.0.1:8983/solr/admin/authentication -H 'Content-type:application/json' -H 'Authorization: Bearer xxx.yyy.zzz' -d '{
  "set-property": {
    "blockUnknown":true,
    "wellKnownUrl": "https://example.com/.well-known/openid-configuration",
    "scope": "solr:read solr:write"
  }
}
'

V2 API

curl https://127.0.0.1:8983/api/cluster/security/authentication -H 'Content-type:application/json' -H 'Authorization: Bearer xxx.yyy.zzz' -d '{
  "set-property": {
    "blockUnknown":true,
    "wellKnownUrl": "https://example.com/.well-known/openid-configuration",
    "scope": "solr:read solr:write"
  }
}
'

プラグインがアクティブになったら、コンパクトシリアル化形式(上記のxxx.yyy.zzz)で有効なJWTアクセストークンを挿入してSolrで認証するか、設定が完了するまでblockUnknown=falseのままにして、適用を開始するためにtrueに切り替えます。

現在、REST APIを介して複数のトークン発行者を追加することはサポートされていませんが、'issuer'プロパティをトップレベルプロパティとして使用することにより、APIを介して単一の発行者を構成することでこれを回避できます。

JWT認証を使用したクライアントの使用

SolrJ

SolrJは現在、リクエストごとのJWTトークンの提供をサポートしていません。

cURL

cURLユーティリティを使用してSolrで認証するには、次のようにAuthorizationヘッダーに有効なJWTアクセストークンを指定します(xxxxxxx.xxxxxx.xxxxxxをJWTコンパクトトークンに置き換えます)。

curl -H "Authorization: Bearer xxxxxx.xxxxxx.xxxxxx" https://127.0.0.1:8983/solr/admin/info/system

管理UI

このプラグインが有効になっている場合、ユーザーが制限されたアクションを実行しようとすると、管理UIにログインページにリダイレクトされます。ページには、ユーザーがクリックしてIDプロバイダーのログインページにリダイレクトされるボタンがあります。

複数の発行者(IdP)が設定されている場合、リストの最初の発行者が管理UIに使用されます。認証されると、ユーザーは最後の既知の場所にSolr管理UIにリダイレクトされます。セッションはJWTトークンの有効期限と同じ長さ続き、1つのSolrサーバーに対してのみ有効です。つまり、別のSolrノードに移動する際には再度ログインする必要があります。左側の列にはログアウトメニューもあり、ユーザーはそこで明示的にログアウトできます。

JWT認証を使用したSolrコントロールスクリプトの使用

コントロールスクリプト(bin/solr)は現在、JWT認証をサポートしていません。