6.5. スティッキーセッションの有効化
通常のクラスターデプロイメントは、プライベートネットワークにあるロードバランサー (リバースプロキシー) および 2 つ以上の Red Hat build of Keycloak サーバーで構成されます。パフォーマンスの観点からは、ロードバランサーが特定のブラウザーセッションに関連するすべての要求を同じ Red Hat build of Keycloak バックエンドノードに転送すると便利です。
なぜなら、Red Hat build of Keycloak は、現在の認証セッションとユーザーセッションに関連するデータを保存する裏で、Infinispan の分散キャッシュを使用しているためです。Infinispan の分散キャッシュは、デフォルトで 2 つの所有者で設定されます。つまり、特定のセッションは 2 つのクラスターノードに保存され、そのセッションにアクセスする必要がある場合は、リモートでセッションを検索する必要があります。
たとえば、ID 123 の認証セッションが node1 の Infinispan キャッシュに保存され、node2 がこのセッションを検索する必要がある場合は、特定のセッションエンティティーを返すために、ネットワーク経由で要求を node1 に送信する必要があります。
特定のセッションエンティティーが常にローカルで利用可能な場合に利点があります。これは、スティッキーセッションを使用して実行できます。パブリックフロントエンドロードバランサーと 2 つのバックエンド Red Hat build of Keycloak ノードを持つクラスター環境のワークフローは次のようになります。
- ユーザーは、Red Hat build of Keycloak のログイン画面を表示するために、最初の要求を送信します。
- この要求はフロントエンドロードバランサーにより提供されます。このロードバランサーは、これをランダムなノード (例: node1) に転送します。厳密に言及されているので、ノードはランダムにする必要はありませんが、他の基準 (クライアント IP アドレスなど) に従って選択できます。これらはすべて、基盤のロードバランサーの実装および設定 (逆引きプロキシー) によって異なります。
- Red Hat build of Keycloak は、ランダム ID (例: 123) で認証セッションを作成し、Infinispan キャッシュに保存します。
- Infinispan の分散キャッシュは、セッション ID のハッシュに基づいてセッションのプライマリー所有者を割り当てます。詳細は、Infinispan のドキュメントを参照してください。Infinispan が、このセッションの所有者として node2 を割り当てたとします。
- Red Hat build of Keycloak は、<session-id>.<owner-node-id> のような形式で cookie (AUTH_SESSION_ID) を作成します。この例では、123.node2 になります。
- ブラウザーで、Red Hat build of Keycloak ログイン画面と cookie (AUTH_SESSION_ID) を持つユーザーに応答が返されます。
この観点から、ロードバランサーが次の要求をすべて node2 に転送することは有用です。なぜなら、これは ID 123 の認証セッションの所有者であるノードであり、Infinispan がこのセッションをローカルで検索できるからです。認証が終了すると、認証セッションはユーザーセッションに変換されます。その場合も ID 123 と同じになるため、node2 に保存されます。
クラスターの設定にスティッキーセッションは必須ではありませんが、上記の理由でパフォーマンスの観点から推奨されます。AUTH_SESSION_ID cookie をスティッキーにするように、ロードバランサーを設定する必要があります。これは、ロードバランサーによって異なります。
プロキシーがバックエンドノードからの cookie を処理せずにセッションアフィニティーをサポートする場合は、ノードを cookie にアタッチせず、リバースプロキシー機能に依存するのみにするために、spi-sticky-session-encoder-infinispan-should-attach-route
オプションを false
に設定する必要があります。
bin/kc.[sh|bat] start --spi-sticky-session-encoder-infinispan-should-attach-route=false
デフォルトでは、spi-sticky-session-encoder-infinispan-should-attach-route
オプションの値は true
であるため、ノード名は cookie にアタッチされ、リバースプロキシーには後続の要求の送信先であるノードが示されます。
6.5.1. 管理コンソールを公開する
デフォルトでは、管理コンソール URL は、適切なスキーム、ホスト名、およびポートを解決する要求に基づく場合にのみ作成されます。たとえば、edge
プロキシーモードを使用しており、プロキシーが正しく設定されていない場合、TLS Termination プロキシーからのバックエンド要求ではプレーン HTTP が使用されます。その場合、URL は http
スキームを使用して作成され、プロキシーがプレーン HTTP をサポートしないため、管理コンソールにアクセスできなくなる可能性があります。
管理コンソールを適切に公開するには、プロキシーにより公開されたスキーム、ホスト名、ポートを使用して URL を作成するために、ここで説明されている X-Forwarded-*
ヘッダーをプロキシーが設定していることを確認する必要があります。
6.5.2. 公開されたパスに関する推奨事項
リバースプロキシーを使用する場合、Red Hat build of Keycloak では特定のパスのみ公開する必要があります。次の表は、公開が推奨されるパスを示しています。
Red Hat build of Keycloak のパス | リバースプロキシーパス | 公開 | 理由 |
---|---|---|---|
/ | - | いいえ | すべてのパスを公開すると、管理パスが不必要に公開されます。 |
/admin/ | - | いいえ | 管理パスが公開されると、不要な攻撃ベクトルが発生します。 |
/js/ | - | はい (以下の注記を参照) | "内部" クライアント (アカウントコンソールなど) に必要な keycloak.js へのアクセス |
/welcome/ | - | いいえ | 初回インストール後に welcome ページを公開する必要はありません。 |
/realms/ | /realms/ | はい | このパスは、たとえば OIDC エンドポイントなどで正しく機能するために必要です。 |
/resources/ | /resources/ | はい | このパスは、アセットを正しく提供するために必要です。Red Hat build of Keycloak のパスではなく、CDN から提供される場合があります。 |
/robots.txt | /robots.txt | はい | 検索エンジンのルール |
/metrics | - | いいえ | メトリクスが公開されると、不要な攻撃ベクトルが発生します。 |
/health | - | いいえ | ヘルスチェックが公開されると、不要な攻撃ベクトルが発生します。 |
アカウントコンソールなどの内部クライアントには js
パスが必要なため、外部クライアントには npm や yarn などの JavaScript パッケージマネージャーから keycloak.js
を使用することが推奨されます。
Red Hat build of Keycloak をリバースプロキシー/ゲートウェイのパブリック API のルートパス /
で実行していることを前提としています。そうでない場合は、パスの前に任意の接頭辞を追加します。
6.5.3. クライアント証明書ルックアップを有効にする
プロキシーが TLS Termination プロキシーとして設定されている場合、クライアント証明書情報は特定の HTTP 要求ヘッダーを通じてサーバーに転送され、クライアントの認証に使用されます。使用しているプロキシーに応じて、サーバーがクライアント証明書情報を取得する方法を設定できます。
サーバーは、次のような最も一般的な TLS Termination プロキシーのいくつかをサポートしています。
Proxy | Provider |
---|---|
Apache HTTP サーバー | apache |
HAProxy | haproxy |
NGINX | nginx |
要求からクライアント証明書を取得する方法を設定するには、以下を実行する必要があります。
対応するプロキシープロバイダーを有効にする
bin/kc.[sh|bat] build --spi-x509cert-lookup-provider=<provider>
HTTP ヘッダーを設定する
bin/kc.[sh|bat] start --spi-x509cert-lookup-<provider>-ssl-client-cert=SSL_CLIENT_CERT --spi-x509cert-lookup-<provider>-ssl-cert-chain-prefix=CERT_CHAIN --spi-x509cert-lookup-<provider>-certificate-chain-length=10
HTTP ヘッダーを設定する際には、使用している値が、プロキシーによってクライアント証明書情報とともに転送されるヘッダーの名前に対応していることを確認する必要があります。
プロバイダーの設定に使用できるオプションは次のとおりです。
オプション | 説明 |
---|---|
ssl-client-cert | クライアント証明書を保持するヘッダーの名前 |
ssl-cert-chain-prefix |
チェーン内の追加の証明書を保持するヘッダーの接頭辞。チェーンの長さに応じて個々の証明書を取得するために使用されます。たとえば |
certificate-chain-length | 証明書チェーンの最大長。 |
trust-proxy-verification | 証明書を Red Hat build of Keycloak に転送して Red Hat build of Keycloak で検証するのではなく、信頼している NGINX プロキシー証明書の検証を有効にします。 |
6.5.3.1. NGINX プロバイダーを設定する
NGINX SSL/TLS モジュールは、クライアント証明書チェーンを公開しません。Red Hat build of Keycloak の NGINX 証明書ルックアッププロバイダーは、Red Hat build of Keycloak トラストストアを使用してそれを再構築します。
このプロバイダーを使用している場合は、Red Hat build of Keycloak トラストストアを設定する方法について、信頼済み証明書の設定 を参照してください。