bin/kc.[sh|bat] start --cache=ispn
Keycloak は、高可用性とマルチノードのクラスタ構成向けに設計されています。現在の分散キャッシュの実装は、高性能で分散可能なインメモリデータグリッドである Infinispan 上に構築されています。
本番モードで Keycloak を起動すると (start
コマンドを使用)、キャッシュが有効になり、ネットワーク内のすべての Keycloak ノードが検出されます。
デフォルトでは、キャッシュは jdbc-ping
スタックを使用します。これは TCP トランスポートに基づいており、設定されたデータベースを使用してクラスタに参加するノードを追跡します。Keycloak では、定義済みのデフォルトトランスポートスタックのセットから選択するか、このガイドで後述するように、独自のカスタムスタックを定義することができます。
分散 Infinispan キャッシュを明示的に有効にするには、次のコマンドを入力します。
bin/kc.[sh|bat] start --cache=ispn
開発モードで Keycloak を起動すると (start-dev
コマンドを使用)、Keycloak はローカルキャッシュのみを使用し、分散キャッシュは --cache=local
オプションを暗黙的に設定することにより完全に無効になります。local
キャッシュモードは、開発およびテスト目的でのみ使用することを目的としています。
Keycloak は、conf/cache-ispn.xml
に適切なデフォルト値を持つキャッシュ構成ファイルを提供します。
キャッシュ構成は、通常の Infinispan 構成ファイル です。
次の表は、Keycloak が使用する特定のキャッシュの概要を示しています。これらのキャッシュは conf/cache-ispn.xml
で設定します。
キャッシュ名 | キャッシュタイプ | 説明 |
---|---|---|
realms |
ローカル |
永続化されたレルムデータをキャッシュします |
users |
ローカル |
永続化されたユーザーデータをキャッシュします |
authorization |
ローカル |
永続化された認可データをキャッシュします |
keys |
ローカル |
外部公開鍵をキャッシュします |
crl |
ローカル |
X.509 認証局 CRL のキャッシュ |
work |
レプリケート |
ノード間で無効化メッセージを伝播します |
authenticationSessions |
分散 |
認証プロセス中に作成/破棄/期限切れになる認証セッションをキャッシュします |
sessions |
分散 |
永続化されたユーザーセッションデータをキャッシュします |
clientSessions |
分散 |
永続化されたクライアントセッションデータをキャッシュします |
offlineSessions |
分散 |
永続化されたオフラインユーザーセッションデータをキャッシュします |
offlineClientSessions |
分散 |
永続化されたオフラインクライアントセッションデータをキャッシュします |
loginFailures |
分散 |
失敗したログイン、不正検出を追跡します |
actionTokens |
分散 |
アクション トークンをキャッシュします |
Keycloak は、データベースへの不要なラウンドトリップを避けるために、永続データをローカルにキャッシュします。
次のデータは、ローカルキャッシュを使用してクラスタ内の各ノードにローカルに保持されます。
realms およびクライアント、ロール、グループなどの関連データ。
users および付与されたロールやグループメンバーシップなどの関連データ。
authorization およびリソース、パーミッション、ポリシーなどの関連データ。
keys
realms、users、authorization のローカルキャッシュは、デフォルトで最大 10,000 エントリを保持するように構成されています。ローカルキーキャッシュは、デフォルトで最大 1,000 エントリを保持でき、デフォルトで 1 時間ごとに期限切れになります。したがって、キーは外部クライアントまたはアイデンティティプロバイダーから定期的にダウンロードされる必要があります。
最適なランタイムを実現し、データベースへの追加のラウンドトリップを避けるために、各キャッシュの構成を確認して、エントリの最大数がデータベースのサイズと一致していることを確認する必要があります。キャッシュできるエントリが多いほど、サーバーがデータベースからデータをフェッチする必要が少なくなります。メモリ使用量とパフォーマンスのトレードオフを評価する必要があります。
ローカルキャッシュはパフォーマンスを向上させますが、マルチノード構成では課題が追加されます。
1 つの Keycloak ノードが共有データベース内のデータを更新すると、他のすべてのノードはそれを認識し、キャッシュからそのデータを無効にする必要があります。
work
キャッシュはレプリケートされたキャッシュであり、これらの無効化メッセージを送信するために使用されます。このキャッシュのエントリ/メッセージは非常に短命であり、このキャッシュのサイズが時間の経過とともに大きくなることは想定されていません。
ユーザーが認証を試みるたびに、認証セッションが作成されます。認証プロセスが完了するか、有効期限に達すると、自動的に破棄されます。
authenticationSessions
分散キャッシュは、認証セッションと、認証プロセス中に関連付けられたその他のデータを格納するために使用されます。
分散キャッシュに依存することで、認証セッションはクラスタ内の任意のノードで使用できるようになり、ユーザーは認証状態を失うことなく任意のノードにリダイレクトできます。ただし、本番環境対応のデプロイメントでは、常にセッションアフィニティを考慮し、ユーザーをセッションが最初に作成されたノードにリダイレクトすることを優先する必要があります。そうすることで、ノード間の不要な状態転送を回避し、CPU、メモリ、ネットワークの使用率を向上させることができます。
ユーザーが認証されると、ユーザーセッションが作成されます。ユーザーセッションは、アクティブなユーザーとその状態を追跡するため、ユーザーは資格情報を再度求められることなく、任意のアプリケーションにシームレスに認証できます。アプリケーションごとに、ユーザーはクライアントセッションで認証するため、サーバーはユーザーが認証されているアプリケーションとその状態をアプリケーションごとに追跡できます。
ユーザーおよびクライアントセッションは、ユーザーがログアウトを実行した場合、クライアントがトークン失効を実行した場合、または有効期限に達した場合に自動的に破棄されます。
セッションデータは、デフォルトでデータベースに格納され、オンデマンドで次のキャッシュにロードされます。
sessions
clientSessions
分散キャッシュに依存することで、キャッシュされたユーザーおよびクライアントセッションはクラスタ内の任意のノードで使用できるようになり、ユーザーはデータベースからセッションデータをロードする必要なく、任意のノードにリダイレクトできます。ただし、本番環境対応のデプロイメントでは、常にセッションアフィニティを考慮し、ユーザーをセッションが最初に作成されたノードにリダイレクトすることを優先する必要があります。そうすることで、ノード間の不要な状態転送を回避し、CPU、メモリ、ネットワークの使用率を向上させることができます。
ユーザーセッションおよびクライアントセッションのこれらのインメモリキャッシュは、デフォルトでノードあたり 10000 エントリに制限されており、大規模なインストールにおける Keycloak の全体的なメモリ使用量を削減します。内部キャッシュは、各キャッシュエントリに対して単一のオーナーのみで実行されます。メモリ消費量とデータベース使用率のトレードオフを考慮し、キャッシュのサイズを異ならせて設定し、Keycloak のキャッシュ構成ファイル (conf/cache-ispn.xml
) を編集して、これらのキャッシュに <memory max-count="..."/>
を設定します。
デフォルトでは、ユーザーセッションはデータベースに格納され、オンデマンドでキャッシュにロードされます。ユーザーセッションをキャッシュのみに格納し、データベースの使用率を最小限に抑えるように Keycloak を構成することができます。
この設定ではすべてのセッションがインメモリに格納されるため、これに関連する 2 つの副作用があります。
すべての Keycloak ノードが再起動するとセッションが失われる。
メモリ消費量の増加。
この設定を有効にするには、次の手順に従います。
キャッシュがユーザーおよびクライアントセッションの唯一の信頼できるソースであるため、エントリ数を制限せず、各エントリを少なくとも 2 つのノードにレプリケートするようにキャッシュを構成します。そのためには、Keycloak のキャッシュ構成ファイル (conf/cache-ispn.xml
) を編集して、sessions
および clientSessions
キャッシュを次の更新で更新します。
<memory max-count="..."/>
を削除します
distributed-cache
タグの owners
属性を 2 以上に変更します
sessions
キャッシュの結果として得られる構成の例は、次のようになります。
<distributed-cache name="sessions" owners="2">
<expiration lifespan="-1"/>
</distributed-cache>
次のコマンドを使用して persistent-user-sessions
機能を無効にします。
bin/kc.sh start --features-disabled=persistent-user-sessions ...
|
OpenID Connect プロバイダーとして、サーバーはユーザーを認証し、オフライン トークンを発行することもできます。通常のユーザーセッションおよびクライアントセッションと同様に、オフライン トークンが認証成功時にサーバーによって発行されると、サーバーはオフラインユーザーセッションおよびオフラインクライアントセッションも作成します。
次のキャッシュは、オフラインセッションを格納するために使用されます。
offlineSessions
offlineClientSessions
通常のユーザーセッションおよびクライアントセッションキャッシュと同様に、オフラインユーザーセッションキャッシュおよびクライアントセッションキャッシュも、デフォルトでノードあたり 10000 エントリに制限されています。メモリから削除された項目は、必要に応じてデータベースからオンデマンドでロードされます。メモリ消費量とデータベース使用率のトレードオフを考慮し、キャッシュのサイズを異ならせて設定し、Keycloak のキャッシュ構成ファイル (conf/cache-ispn.xml
) を編集して、これらのキャッシュに <memory max-count="..."/>
を設定します。
loginFailures
分散キャッシュは、失敗したログイン試行に関するデータを追跡するために使用されます。このキャッシュは、マルチノード Keycloak セットアップでブルートフォース保護機能を動作させるために必要です。
アクション トークンは、ユーザーがアクションを非同期的に確認する必要があるシナリオ (たとえば、パスワード忘れフローによって送信される電子メールなど) で使用されます。actionTokens
分散キャッシュは、アクション トークンに関するメタデータを追跡するために使用されます。
メモリ使用量を削減するために、特定のキャッシュに格納されるエントリ数に上限を設定することができます。キャッシュの上限を指定するには、次のコマンドライン引数 --cache-embedded-${CACHE_NAME}-max-count=
を指定する必要があります。${CACHE_NAME}
は、上限を適用するキャッシュの名前に置き換えます。たとえば、offlineSessions
キャッシュに 1000
の上限を適用するには、--cache-embedded-offline-sessions-max-count=1000
を構成します。上限は、actionToken
、authenticationSessions
、loginFailures
、work
キャッシュには定義できません。
分散キャッシュは、クラスタ内のノードのサブセットにキャッシュエントリをレプリケートし、エントリを固定オーナーノードに割り当てます。
データの主要なソースである各分散キャッシュ (authenticationSessions
、loginFailures
、actionTokens
) には、デフォルトで 2 つのオーナーがあります。つまり、2 つのノードが特定のキャッシュエントリのコピーを持っています。オーナーノードではないノードは、特定のキャッシュのオーナーにクエリを実行してデータを取得します。両方のオーナーノードがオフラインの場合、すべてのデータが失われます。
デフォルトのオーナー数は、少なくとも 3 つのノードを持つクラスタ構成で 1 つのノード (オーナー) の障害を乗り切るのに十分です。可用性の要件に合わせてオーナー数を自由に変更できます。オーナー数を変更するには、conf/cache-ispn.xml
を開き、分散キャッシュの owners=<value>
の値を目的の値に変更します。
独自のキャッシュ構成ファイルを指定するには、次のコマンドを入力します。
bin/kc.[sh|bat] start --cache-config-file=my-cache-file.xml
構成ファイルは conf/
ディレクトリからの相対パスです。
高可用性とマルチノードクラスタ構成のための Keycloak サーバーの構成のために、XML ファイル内の構成を簡素化する次の CLI オプション cache-remote-host
、cache-remote-port
、cache-remote-username
、および cache-remote-password
が導入されました。宣言された CLI パラメータのいずれかが存在する場合、XML ファイルにリモートストアに関連する構成が存在しないことが想定されます。
本番環境ではセキュリティを無効にすることはお勧めしません。 |
開発環境またはテスト環境では、安全でない Infinispan サーバーを起動する方が簡単です。これらのユースケースでは、CLI オプション cache-remote-tls-enabled
は Keycloak と Infinispan 間の暗号化 (TLS) を無効にします。Infinispan サーバーが暗号化された接続のみを受け入れるように構成されている場合、Keycloak は起動に失敗します。
CLI オプション cache-remote-username
および cache-remote-password
はオプションであり、設定されていない場合、Keycloak は認証情報を提示せずに Infinispan サーバーに接続します。Infinispan サーバーで認証が有効になっている場合、Keycloak は起動に失敗します。
トランスポートスタックは、クラスタ内の Keycloak ノードが信頼性の高い方法で通信することを保証します。Keycloak は、幅広いトランスポートスタックをサポートしています。
jdbc-ping
(デフォルト)
kubernetes
jdbc-ping-udp
(非推奨)
tcp
(非推奨)
udp
(非推奨)
ec2
(非推奨)
azure
(非推奨)
google
(非推奨)
特定のキャッシュスタックを適用するには、次のコマンドを入力します。
bin/kc.[sh|bat] start --cache-stack=<stack>
デフォルトのスタックは、分散キャッシュが有効になっている場合は jdbc-ping
に設定されています。これは、Keycloak の 26.x リリースストリームのデフォルトとの下位互換性があります。
次の表は、--cache-stack
ランタイムオプションを使用する以外に、追加の構成なしで利用できるトランスポートスタックを示しています。
スタック名 | トランスポートプロトコル | 検出 |
---|---|---|
|
TCP |
JGroups |
|
UDP |
JGroups |
次の表は、--cache-stack
ランタイムオプションと最小限の構成を使用して利用できるトランスポートスタックを示しています。
スタック名 | トランスポートプロトコル | 検出 |
---|---|---|
|
TCP |
JGroups |
|
TCP |
JGroups |
|
UDP |
JGroups |
tcp
、udp
、または jdbc-ping-udp
スタックを使用する場合、各クラスタは、ノードが個別のクラスタを形成するように、異なるマルチキャストアドレスおよび/またはポートを使用する必要があります。デフォルトでは、Keycloak は jgroups.mcast_addr
のマルチキャストアドレスとして 239.6.7.8
を、jgroups.mcast_port
のマルチキャストポートとして 46655
を使用します。
-D<property>=<value> を使用して、JAVA_OPTS_APPEND 環境変数または CLI コマンドでプロパティを渡します。 |
追加のスタック
上記のいずれかのスタックを使用することをお勧めします。追加のスタックは Infinispan によって提供されていますが、それらの構成方法はこのガイドの範囲外です。詳細については、Infinispan クラスタトランスポートの設定 および JGroups スタックのカスタマイズ を参照してください。
TCP ベースのトランスポートスタックでは、TLS を使用した暗号化がデフォルトで有効になっています。これはデフォルト構成でもあります。TCP ベースのトランスポートスタックを使用している限り、追加の CLI オプションやキャッシュ XML の変更は必要ありません。
|
TLS が有効になっている場合、Keycloak は接続をセキュリティ保護するために自己署名 RSA 2048 ビット証明書を自動生成し、通信をセキュリティ保護するために TLS 1.3 を使用します。キーと証明書はデータベースに格納されるため、すべてのノードで使用できます。デフォルトでは、証明書の有効期間は 60 日であり、30 日ごとにランタイムでローテーションされます。これを変更するには、オプション cache-embedded-mtls-rotation-interval-days
を使用します。
標準的なセットアップには推奨されませんが、特定のセットアップで不可欠な場合は、トランスポートスタックの証明書を使用してキーストアを手動で構成できます。cache-embedded-mtls-key-store-file
はキーストアへのパスを設定し、cache-embedded-mtls-key-store-password
はそれを復号化するためのパスワードを設定します。トラストストアには、接続を受け入れるための有効な証明書が含まれており、cache-embedded-mtls-trust-store-file
(トラストストアへのパス) および cache-embedded-mtls-trust-store-password
(それを復号化するためのパスワード) で構成できます。不正アクセスを制限するには、常に各 Keycloak デプロイメントに自己署名証明書を使用してください。
健全な Keycloak クラスタリングを確保するには、一部のネットワークポートを開く必要があります。次の表は、jdbc-ping
スタックで開く必要のある TCP ポートと、そこを通過するトラフィックの説明を示しています。
ポート | プロパティ | 説明 |
---|---|---|
|
|
ユニキャストデータ送信。 |
|
|
プロトコル |
-D<property>=<value> を使用して、JAVA_OPTS_APPEND 環境変数または CLI コマンドで上記のポートを変更します。 |
健全な Keycloak クラスタリングを確保するには、ネットワークポートをクラスタの他のすべてのノードからアクセス可能なインターフェイスにバインドする必要があります。
デフォルトでは、サイトローカル (ルーティング不可) IP アドレス (たとえば、192.168.0.0/16 または 10.0.0.0/8 アドレス範囲) を選択します。
アドレスをオーバーライドするには、jgroups.bind.address
プロパティを設定します。
-Djgroups.bind.address=<IP> を使用して、JAVA_OPTS_APPEND 環境変数または CLI コマンドでバインドアドレスを変更します。 |
IPv6 のみでセットアップし、Keycloak にバインドアドレスを自動的に選択させるには、次の設定を使用します。
export JAVA_OPTS_APPEND="-Djava.net.preferIPv4Stack=false -Djava.net.preferIPv6Addresses=true"
ファイアウォールの背後やコンテナなど、異なるネットワークで Keycloak インスタンスを実行する場合、異なるインスタンスはローカル IP アドレスで互いに到達できません。そのような場合は、ローカル IP アドレスへのポートフォワーディングルール (「仮想サーバー」と呼ばれることもあります) を設定します。
ポートフォワーディングを使用する場合は、各ノードがその外部アドレスを他のノードに正しくアドバタイズするように、次のプロパティを使用します。
プロパティ | 説明 |
---|---|
|
Keycloak クラスタ内の他のインスタンスがこのノードに接続するために使用する必要があるポート。 |
|
Keycloak 内の他のインスタンスがこのノードに接続するために使用する必要がある IP アドレス。 |
-D<property>=<value> を使用して、JAVA_OPTS_APPEND 環境変数または CLI コマンドでこれを設定します。 |
メトリクスが有効になっている場合、キャッシュからのメトリクスは自動的に公開されます。
キャッシュメトリクスのヒストグラムを有効にするには、cache-metrics-histograms-enabled
を true
に設定します。これらのメトリクスはレイテンシ分布に関するより深い洞察を提供しますが、収集するとパフォーマンスに影響を与える可能性があるため、すでに飽和状態のシステムでアクティブ化する場合は注意が必要です。
bin/kc.[sh|bat] start --metrics-enabled=true --cache-metrics-histograms-enabled=true
メトリクスを有効にする方法の詳細については、メトリクスによる洞察の獲得 を参照してください。
値 | |
---|---|
|
|
|
|
メトリクスが有効になっている場合にのみ使用可能 |
|
'cache' タイプが 'ispn' に設定されている場合にのみ使用可能 'jdbc-ping' を代わりに使用してください 非推奨の値: |
|
値 | |
---|---|
|
|
埋め込み Infinispan クラスタが構成されている場合にのみ使用可能 |
|
|
|
|
|
TCP ベースのキャッシュスタックが使用されている場合にのみ使用可能 |
|
プロパティ 'cache-embedded-mtls-enabled' が有効になっている場合にのみ使用可能 |
|
プロパティ 'cache-embedded-mtls-enabled' が有効になっている場合にのみ使用可能 |
|
プロパティ 'cache-embedded-mtls-enabled' が有効になっている場合にのみ使用可能 |
(デフォルト) |
プロパティ 'cache-embedded-mtls-enabled' が有効になっている場合にのみ使用可能 |
|
プロパティ 'cache-embedded-mtls-enabled' が有効になっている場合にのみ使用可能 |
|
埋め込み Infinispan クラスタが構成されている場合にのみ使用可能 |
|
埋め込み Infinispan クラスタが構成されている場合にのみ使用可能 |
|
|
|
埋め込み Infinispan クラスタが構成されている場合にのみ使用可能 |
|
|