10.2. キャッシュを設定する
Red Hat build of Keycloak は、conf/cache-ispn.xml
に置かれた適切なデフォルトを含むキャッシュ設定ファイルを提供します。
キャッシュ設定は、通常の nfinispan configuration file です。
次の表は、Red Hat build of Keycloak が使用する特定のキャッシュの概要を示しています。これらのキャッシュは、conf/cache-ispn.xml
で設定します。
キャッシュ名 | キャッシュタイプ | 説明 |
---|---|---|
realms | Local | 永続化されたレルムデータをキャッシュします |
users | Local | 永続化されたユーザーデータをキャッシュします |
authorization | Local | 永続化された認可データをキャッシュします |
keys | Local | 外部公開鍵をキャッシュします |
work | Replicated (レプリケート) | 無効化メッセージをノード間で伝播します |
authenticationSessions | Distributed (分散) | 認証プロセス中に作成/破棄された、または期限切れになった認証セッションをキャッシュします。 |
sessions | Distributed (分散) | 永続的なユーザーセッションデータをキャッシュする |
clientSessions | Distributed (分散) | 永続的なクライアントセッションデータをキャッシュする |
offlineSessions | Distributed (分散) | 永続的なオフラインユーザーセッションデータをキャッシュする |
offlineClientSessions | Distributed (分散) | 永続的なオフラインクライアントセッションデータをキャッシュする |
loginFailures | Distributed (分散) | 失敗したログイン (不正の検知) を追跡します |
actionTokens | Distributed (分散) | アクショントークンをキャッシュします |
10.2.1. キャッシュタイプとデフォルト
ローカルキャッシュ
Red Hat build of Keycloak は、データベースへの不必要なラウンドトリップを回避するために、永続データをローカルにキャッシュします。
次のデータは、ローカルキャッシュを使用して、クラスター内の各ノードのローカルに保持されます。
- レルム と、クライアント、ロール、グループなどの関連データ。
- ユーザー と、付与されたロールやグループメンバーシップなどの関連データ。
- 認可 と、リソース、権限、ポリシーなどの関連データ。
- keys
レルム、ユーザー、認可のローカルキャッシュは、デフォルトで最大 10,000 エントリーを保持するように設定されています。デフォルトで、ローカルキーキャッシュは最大 1,000 エントリーを保持でき、1 時間ごとに期限切れになります。したがって、外部クライアントまたはアイデンティティープロバイダーからキーを定期的にダウンロードする必要があります。
最適な実行時間を実現し、データベースへの追加のラウンドトリップを回避するには、各キャッシュの設定で、エントリーの最大数がデータベースのサイズと一致していることを確認する必要があります。キャッシュできるエントリーが増えると、サーバーがデータベースからデータを取得しなければならない回数が少なくなります。メモリーの使用率とパフォーマンスの間で何が犠牲になるかを評価する必要があります。
ローカルキャッシュの無効化
ローカルキャッシュによりパフォーマンスは向上しますが、マルチノードセットアップでは課題が発生します。
1 つの Red Hat build of Keycloak ノードが共有データベース内のデータを更新すると、他のすべてのノードはそれを認識する必要があるため、キャッシュからそのデータを無効にします。
work
キャッシュはレプリケートされたキャッシュであり、これらの無効化メッセージの送信に使用されます。このキャッシュのエントリー/メッセージは有効期限が非常に短いため、このキャッシュのサイズが時間の経過とともに増加することを想定する必要はありません。
認証セッション
ユーザーが認証を試みるたびに、認証セッションが作成されます。これらは、認証プロセスが完了するか、有効期限に達すると自動的に破棄されます。
authenticationSessions
分散キャッシュは、認証プロセス中に、認証セッションとそれに関連する他のデータを保存するために使用されます。
分散可能キャッシュに依存すると、クラスター内のどのノードでも認証セッションを利用できるため、ユーザーは認証状態を失うことなく任意のノードにリダイレクトできます。ただし、実稼働環境に対応したデプロイメントでは、常にセッションアフィニティーを考慮し、セッションが最初に作成されたノードにユーザーをリダイレクトすることを優先する必要があります。これにより、ノード間の不要な状態遷移が回避され、CPU、メモリー、ネットワークの使用率が向上します。
ユーザーセッション
ユーザーが認証されると、ユーザーセッションが作成されます。ユーザーセッションはアクティブユーザーとその状態を追跡するため、認証情報を再度要求されることなく、あらゆるアプリケーションに対してシームレスに認証できるようになります。アプリケーションごとに、ユーザーはクライアントセッションで認証されるため、サーバーはユーザーが認証されているアプリケーションとその状態をアプリケーションごとに追跡できます。
ユーザーセッションとクライアントセッションは、ユーザーがログアウトを実行するとき、クライアントがトークンの取り消しを実行するとき、または有効期限に達したときに自動的に破棄されます。
セッションデータはデフォルトでデータベースに保存され、オンデマンドで次のキャッシュにロードされます。
-
sessions
-
clientSessions
分散可能キャッシュに依存することで、キャッシュされたユーザーおよびクライアントセッションはクラスター内の任意のノードで利用できるようになり、データベースからセッションデータをロードすることなく、ユーザーを任意のノードにリダイレクトできるようになります。ただし、実稼働環境に対応したデプロイメントでは、常にセッションアフィニティーを考慮し、セッションが最初に作成されたノードにユーザーをリダイレクトすることを優先する必要があります。これにより、ノード間の不要な状態遷移が回避され、CPU、メモリー、ネットワークの使用率が向上します。
ユーザーセッションとクライアントセッションのこれらのメモリー内キャッシュは、デフォルトではノードあたり 10000 エントリーに制限されているため、大規模なインストールでは Red Hat build of Keycloak の全体的なメモリー使用量が削減されます。内部キャッシュは、キャッシュエントリーごとに 1 人の所有者のみで実行されます。メモリー消費とデータベース使用率のトレードオフを考慮してキャッシュに異なるサイズを設定し、Red Hat build of Keycloak のキャッシュ設定ファイル (conf/cache-ispn.xml
) を編集して、それらのキャッシュに <memory max-count="..."/>
を設定します。
揮発性のユーザーセッション
デフォルトでは、ユーザーセッションはデータベースに保存され、オンデマンドでキャッシュにロードされます。Red Hat build of Keycloak を設定して、ユーザーセッションをキャッシュにのみ保存し、データベースの使用率を最小限に抑えることができます。
このセットアップのすべてのセッションはメモリー内に保存されるため、これに関連する 2 つの影響があります。
- すべての Red Hat build of Keycloak ノードが再起動するとセッションが失われます。
- メモリー消費量が増加します。
このセットアップを有効にするには、次の手順に従います。
キャッシュはユーザーおよびクライアントセッションの唯一の信頼できるソースであるため、エントリーの数を制限せず、各エントリーを少なくとも 2 つのノードにレプリケートするようにキャッシュを設定します。これを行うには、Red Hat build of 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 ...
multi-site
機能が有効になっている場合、persistent-user-sessions
を無効化できません。
オフラインユーザーセッション
サーバーは、OpenID Connect プロバイダーとしてユーザーを認証し、オフライントークンを発行することもできます。通常のユーザーセッションやクライアントセッションと同様に、サーバーは認証成功時にオフライントークンを発行すると、オフラインユーザーセッションとオフラインクライアントセッションも作成します。
次のキャッシュは、オフラインセッションを保存するために使用されます。
- offlineSessions
- offlineClientSessions
通常ユーザーおよびクライアントセッションキャッシュと同様に、オフラインユーザーおよびクライアントセッションキャッシュも、デフォルトではノードあたり 10000 エントリーに制限されます。メモリーから削除されたアイテムは、必要に応じてデータベースからオンデマンドでロードされます。メモリー消費とデータベース使用率のトレードオフを考慮してキャッシュに異なるサイズを設定し、Red Hat build of Keycloak のキャッシュ設定ファイル (conf/cache-ispn.xml
) を編集して、それらのキャッシュに <memory max-count="..."/>
を設定します。
パスワードのブルートフォース検出
loginFailures
分散キャッシュは、失敗したログイン試行に関するデータを追跡するために使用されます。このキャッシュは、マルチノード Red Hat build of Keycloak セットアップでブルートフォース保護機能が動作するために必要です。
アクショントークン
アクショントークンは、たとえばパスワードを忘れた場合のフローで送信されるメールなど、アクションを非同期で確認する必要がある場合に使用されます。actionTokens
分散キャッシュは、アクショントークンに関するメタデータを追跡するために使用されます。
10.2.2. キャッシュの最大サイズの設定
メモリー使用量を削減するために、特定のキャッシュに保存されるエントリーの数に上限を設定することが可能です。キャッシュの上限を指定するには、次のコマンドライン引数 --cache-embedded-${CACHE_NAME}-max-count=
を指定する必要があります。${CACHE_NAME}
は、上限を適用するキャッシュの名前に置き換えます。たとえば、offlineSessions
キャッシュに上限 1000
を適用するには、--cache-embedded-offline-sessions-max-count=1000
のように設定します。次のキャッシュでは上限を定義できません: actionToken
、authenticationSessions
、loginFailures
、work
。
10.2.3. 可用性のためのキャッシュ設定
分散キャッシュは、クラスター内のノードのサブセットでキャッシュエントリーをレプリケートし、エントリーを固定所有者ノードに割り当てます。
データ (authenticationSessions
、loginFailures
、actionTokens
) の信頼できる主要なソースである各分散キャッシュには、デフォルトで 2 つの所有者が存在します。つまり、2 つのノードに特定のキャッシュエントリーのコピーが存在することになります。非所有者ノードは、データを取得するために、特定のキャッシュの所有者にクエリーを実行します。両方の所有者ノードがオフラインになると、すべてのデータが失われます。
デフォルトの所有者数は、3 つ以上のノードを持つクラスターセットアップで 1 つのノード (所有者) で障害が発生しても継続できる数です。所有者の数は、可用性要件に合わせて自由に変更できます。所有者の数を変更するには、conf/cache-ispn.xml
を開き、分散キャッシュの owner=<value>
値を任意の値に変更します。
10.2.4. 独自のキャッシュ設定ファイルを指定する
独自のキャッシュ設定ファイルを指定するには、次のコマンドを入力します。
bin/kc.[sh|bat] start --cache-config-file=my-cache-file.xml
設定ファイルは conf/
ディレクトリーに相対的です。
10.2.5. リモートサーバーの CLI オプション
高可用性用およびマルチノードのクラスター化セットアップ用に Red Hat build of Keycloak サーバーを設定するために、CLI オプション cache-remote-host
、cache-remote-port
、cache-remote-username
、cache-remote-password
が導入され、XML ファイル内の設定が簡素化されました。上記の CLI パラメーターのいずれかが存在する場合、XML ファイル内にリモートストアに関連する設定が存在しないしないものと想定されます。
10.2.5.1. 安全でない Infinispan サーバーへの接続
実稼働環境ではセキュリティーを無効にすることは推奨されません。
開発環境やテスト環境では、保護されていない Infinispan サーバーを起動する方が簡単です。これらのユースケースでは、CLI オプション cache-remote-tls-enabled
により、Red Hat build of Keycloak と Data Grid 間の暗号化 (TLS) が無効になります。Data Grid サーバーが暗号化された接続のみを受け入れるように設定されている場合、Red Hat build of Keycloak は起動に失敗します。
CLI オプション cache-remote-username
と cache-remote-password
はオプションであり、設定されていない場合は、Red Hat build of Keycloak は認証情報を提示せずに Data Grid サーバーに接続します。Data Grid サーバーで認証が有効になっている場合、Red Hat build of Keycloak は起動に失敗します。