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を介して設定を実行する必要がある場合、または認可プラグインを使用していて特定のパスのみを保護する場合に |
|
realm |
HTTP 401レスポンスでエコーバックする認証レルムの名前。管理UIのログインページにも表示されます。 |
'solr-jwt' |
scope |
有効なスコープの空白で区切られたリスト。設定されている場合、JWTアクセストークンには、リストされたスコープの少なくとも1つを含む |
|
requireIss |
|
|
requireExp |
|
|
algAllowlist |
許可されるアルゴリズムを含むJSON配列: |
デフォルトでは、すべてのアルゴリズムが許可されます。 |
jwkCacheDur |
JWKキャッシュの有効期間(秒) |
|
principalClaim |
プリンシパルを取得するクレームID |
|
rolesClaim |
ユーザーロールを取得するクレームID。トップレベルのクレームとネストされたクレームの両方がサポートされています。 |
デフォルトでは、 |
claimsMatch |
一致する必要がある正規表現(値)を持つクレーム(キー)のJSONオブジェクト。例: |
|
adminUiScope |
管理UIからログインする際に要求されるスコープを定義します。 |
定義されていない場合、 |
redirectUris |
外部認証後のリダイレクトの有効な場所(1つまたは複数)。文字列または文字列の配列を受け入れます。Solrの基本URL(例: https://solr1.example.com:8983/solr/)でなければならず、事前にIDプロバイダーに登録されているリダイレクトURIのリストと一致する必要があります。 |
デフォルトは空のリストです。つまり、任意のノードが有効なリダイレクトターゲットと見なされます。 |
trustedCerts |
IdPとの通信時に信頼する必要がある、プレーンテキストのPEMまたはPKCS#7形式の1つ以上のX.509 SSL証明書。改行文字は |
デフォルトは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からすべての公開鍵が参照されます。 |
|
jwk |
|
|
iss |
IdPで設定されている固有の発行者ID。受信トークンには一致する |
|
aud |
|
設定されている場合は |
authorizationEndpoint |
Idプロバイダーの承認エンドポイントのURL |
|
tokenEndpoint |
IdプロバイダーのトークンエンドポイントのURL |
|
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/"
}
}
この場合、jwksUrl
、iss
、および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:read 、solr: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を使用して設定または変更できます。したがって、class
とblockUnknown=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認証を使用したクライアントの使用
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ノードに移動する際には再度ログインする必要があります。左側の列にはログアウトメニューもあり、ユーザーはそこで明示的にログアウトできます。