Keycloak の新しいストレージ

2022年7月27日 Hynek Mlnařík 著

Keycloak の現在のストレージには、いくつかの既知の制限事項があります。小規模なデプロイメントでは、データベースの初期化と Keycloak の起動に時間がかかりすぎます。クラウドネイティブなデプロイメントに対するネイティブサポートはありません。Keycloak の新しいバージョンへのアップグレードは、多くの場合、停止時間を最小限に抑えた、またはダウンタイムなしでのアップグレードの可能性が低い、stop-the-world アップデートが必要になることを意味します。

Keycloak 19 では、ダウンタイムなしのアップグレード、レルムごとのストレージ、そしてその初期段階からクラウドネイティブをサポートする、将来の Keycloak ストレージの初期プレビューが導入されています。このいわゆるmapストレージは、最適なエクスペリエンスを提供することに焦点を当てており、したがって、Postgres および CockroachDB データベース、そして Infinispan データストアへのサポートを限定しています。この初期プレビューは Quarkus ディストリビューションで利用可能です。

この初期プレビューには、最適なパフォーマンスに必要な機能がいくつか欠けているため、まだ本番環境に対応していません。それでも、それらを提供する計画はあります。

以前のバージョンで使用されていたストレージ(現在はレガシーストレージと呼ばれています)は、すぐに廃止されるわけではありません!新しいストレージはまだ本番環境に対応していないため、Keycloak 19 では引き続きデフォルトのストレージです。また、他のデータベース(MySQL、MariaDB、MS SQL Server、Oracle)は新しいストレージではサポートされておらず、これらはレガシーストレージでのみサポートされています。これらのデータベースに対するセカンドレベルのサポートは、コミュニティ調査の結果に基づいて検討しています。

開発およびテスト目的のために、chmと呼ばれる高速なインメモリストレージを提供しています。このストレージは、開発には不要であるため、意図的にゼロダウンタイムアップグレードに対応していません。そのため、データベースなしの簡単な Keycloak デプロイメントも提供します。

GitHub Discussions でのフィードバックをお待ちしております。

試してみる

以下のセクションでは、新しいストレージで Keycloak 19 を構成する方法の例を示します。

警告
--storage で始まる実験的なコマンドラインオプションは、コミュニティからのフィードバックやプロジェクトのニーズに基づいて、予告なしに変更される可能性があります。

データベースなしで Keycloak が何ができるかを見てみましょう

ダウンロード後、シングルノードデプロイメントで Keycloak を試すには、次のように実行するだけで済みます。

bin/kc.sh start-dev --storage=chm

これにより、Keycloak の再起動をまたいでローカルファイルシステムに保存されるシンプルなテスト用インメモリストレージを持つ Keycloak インスタンスが起動しますが、ゼロダウンタイムアップグレードやクラスタリングはサポートされていません。

次のステップ:リレーショナルデータベースにデータを永続化する

要件: Postgres 14 または CockroachDB 22.1(以降)

データをデータベースに保持するには、次のコマンドを実行します。

bin/kc.sh start-dev --storage=jpa --db-url=<jdbc-url> --db-username=<username> --db-password=<password>
注意
この機能には CockroachDB に既知の問題があります。リストについては このトラッカー を参照してください。

代替の次のステップ:外部 Infinispan にデータを永続化する

要件: Infinispan 12.1

Infinispan が起動して実行されている場合は、データの保存にも使用できます。これを行うには、次のコマンドを実行します。

bin/kc.sh start-dev --storage=hotrod --storage-hotrod-host=<host> --storage-hotrod-port=11222 --storage-hotrod-username=<username> --storage-hotrod-password=<password>

Keycloak は、最初の起動時に必要なキャッシュがまだ存在しない場合、Infinispan にキャッシュを作成します。キャッシュを微調整したい場合や、例えば永続性を設定したい場合は、キャッシュを自分で作成および構成することもできます。キャッシュ構成で使用可能なオプションについては、Infinispan のドキュメントを参照してください。

次のステップ:データを個別のストレージに格納する

最終的に、データの一部はファイルまたはデータベースに格納し、他のデータ(例えばセッションデータ)は Infinispan に格納する必要があることが判明します。これは実現可能でしょうか?

はい!Keycloak ストレージは、次のストレージ領域に分割されています:レルム、クライアント、ユーザー、グループ、ロール、クライアントスコープ、認可サービス、イベント、認証セッション、ユーザー/クライアントセッション、ログイン失敗、アクショントークン、およびシングルユーストークン(最後の 2 つの領域は Keycloak 20 でマージされる予定です)。

注意
この分割の詳細については、アーキテクチャ仕様を参照してください。

各領域は、データを格納するための独自のストレージを維持し、各領域は他の領域から独立しています。言い換えれば、レルムはデータベースで、ユーザーは Infinispan で処理できます。

すべてのセッションデータを外部 Infinispan に格納し、レルム/クライアント/ユーザー/グループ/ロール/…​データをリレーショナルデータベースに格納するには、次のコマンドを発行できます。

bin/kc.sh start-dev --storage=jpa \
  --db-url=<jdbc-url> --db-username=<username> --db-password=<password> \
  --storage-hotrod-host=<host> --storage-hotrod-port=<port> \
  --storage-hotrod-username=<username> --storage-hotrod-password=<password> \
  --storage-area-action-token=hotrod \
  --storage-area-auth-session=hotrod \
  --storage-area-single-use-object=hotrod \
  --storage-area-user-session=hotrod

これは、すべての領域がリレーショナルデータベース(--storage=jpa)によって処理される Keycloak サーバーを起動しますが、特定の --storage-area-…​ オプションにリストされている領域は、外部 Infinispan プロトコルを使用するように設定されています。この設定は、すべてのセッションデータが Infinispan に格納されているレガシーストレージに似ていますが、Infinispan が Keycloak に埋め込まれていない点が異なります。

結論

新しいストレージを試して、フィードバックを共有していただけると幸いです!