LabHub

ブログ

Keycloak 26.7 — SCIM がプレビューに昇格、外部 Infinispan 不要のマルチクラスター v2、そしてアップグレードで踏みやすい落とし穴

한국어English日本語中文

はじめに — 四半期に一つずつ、今回は26.7

Keycloakは最近、およそ3か月間隔でマイナーバージョンを出しています。GitHubのリリース日ベースで、26.5.0が2026年1月6日、26.6.0が4月8日、そして26.7.0が7月9日に出ました。マイナーが出るたびリリースノートをざっと眺めるだけで済ませたいところですが、今回は運用者として引っかかる点が多い回です — 長らく待たれていた機能2つ(SCIM、外部キャッシュ不要のマルチクラスター)がプレビューに乗り、アップグレードガイドのbreaking/notableの一覧も特に長くなっています。

本稿は、公式リリースノートとリポジトリの原文adoc(リリースノートアップグレードガイド)、そして機能フラグの実際の定義であるProfile.javaを突き合わせて整理した、運用視点の読み解きです。Keycloak 26のアーキテクチャ自体が初見なら、先にKeycloak 26 アーキテクチャ徹底解説を読んでおくほうがいいでしょう。

SCIM API — 4年開いていたイシューがコアへ(プレビュー)

SCIM(System for Cross-domain Identity Management)は、ユーザーやグループのようなアイデンティティリソースをシステム間で標準REST APIとして読み書きするプロトコルです(スキーマはRFC 7643、プロトコルはRFC 7644)。OktaやEntra IDのような商用IdPでは当たり前とされる機能ですが、Keycloakのコアにはありませんでした。2022年8月に開かれたSCIMサポートのイシューはリアクション300件を集めながら今も開いたままで、その間この空白はscim-for-keycloakのようなサードパーティ拡張が埋めてきました。

今回、その空白がコアで埋まり始めました。タイムラインをコードで追うとこうです — scim-api機能フラグは26.6.0のProfile.javaにexperimentalとしてひっそり入り(26.6.0のリリースノートには言及がありません)、26.7.0でプレビューに昇格しました。デフォルトは無効なので--features=scim-apiで有効化する必要があり、有効化した後もrealm設定でrealmごとに再度トグルする必要があります。

実装範囲は管理ガイドのSCIM章によれば次のとおりです。

エンドポイントはrealm単位で開かれます。

/realms/<realm-name>/scim/v2/ServiceProviderConfig
/realms/<realm-name>/scim/v2/ResourceTypes
/realms/<realm-name>/scim/v2/Schemas
/realms/<realm-name>/scim/v2/Users
/realms/<realm-name>/scim/v2/Groups

権限モデルは新設せず、Admin REST APIと同じrealm-managementロールをそのまま使います。ユーザーの書き込みはmanage-users、読み取りはview-users、検索はquery-users/query-groupsです — すでにAdmin API用のサービスアカウントがあれば、追加設定なしにSCIMも使えます。呼び出しはconfidentialクライアントのみ許可され、publicクライアントは拒否されます。

設計で目を引くのは管理者リソースの保護です。SCIMクライアントは通常、広範な管理権限で動くため、侵害されたプロビジョニングクライアントが管理者アカウントを削除したり管理者グループにユーザーを押し込んだりするシナリオを、ドキュメントが明示的に防いでいます — 管理ロールを持つユーザー・グループをSCIMで参照すると最小限の表現(id、schemas、userName程度)しか返らず、書き込みは403で拒否されます。管理者アカウントはAdminコンソールとAdmin REST APIからしか操作できません。

正直に限界を書くと — 今回入ったのはKeycloakがSCIMサーバーになる方向のみです。 HRシステムやアイデンティティガバナンスプラットフォームがKeycloakにユーザーを出し入れするインバウンドプロビジョニングはこれで対応できます。逆に、KeycloakがSCIMクライアントとなり外部SCIMプロバイダーからユーザーを連携してくることは別のイシューとしてまだ開いており、ドキュメントも外部SCIMサービスプロバイダーからのユーザー連携とプッシュベースのリアルタイムイベントを今後のリリース計画としてのみ記載しています。Keycloakからダウンストリームアプリへ押し出すアウトバウンドプロビジョニングも今回のスコープ外です — それは依然として拡張の領域です。そしてプレビューはプレビューです。サポート対象ではなく、最終形が変わる可能性もあります。

マルチクラスター v2 — 外部Infinispanなしで(プレビュー)

これまでKeycloakのマルチサイトHA(v1)は、サイト間セッションレプリケーションのために外部Infinispan(Data Grid)クラスターを別途デプロイ・運用する必要があり、自動フェイルオーバーのためのベンダー固有のfencingインフラまで要求していました — Keycloak Kubernetes HA 運用で扱った構成です。運用したことがある人なら分かる通り、認証サーバーのHAのためにキャッシュクラスターというもう一つの分散システムを世話するコストは小さくありません。

26.7のマルチクラスターv2は、その外部依存をまるごと取り除きます。アーキテクチャはこう変わります。

ここまで聞くと地理的なDRまでできそうに聞こえますが、公式ガイドが釘を刺している制約をそのまま移すとこうなります。

運用視点でもう一つ — Profile.javaではこの機能はFeatureUpdatePolicy.SHUTDOWNとして宣言されています。フラグのオン・オフにローリングが使えず、クラスター全体のシャットダウンが必要という意味です。すでに稼働中のプロダクションに無停止で組み込めるような類の機能ではありません。

まとめると、v2は「外部Infinispan運用をなくしたリージョン内マルチクラスター可用性」であって、「遠く離れた2つのデータセンター」ではありません。その代わりに得られるものははっきりしています — 管理すべき分散システムが一つ減り、KubernetesやAWSのような特定環境への依存も消えます。負荷がテスト範囲内で、DBを同期レプリケーションで運用できる組織であれば、v1の運用複雑度と引き換える価値のあるトレードです。

余談を一つ。タグ時点のリリースノート原文は、この機能をハイライトではプレビュー、本文の見出しではexperimentalと記す不一致があり(mainブランチではプレビューに整理されました)、コードのProfile.javaは最初からPREVIEWでした。リリースノートとコードが食い違うときは、コードが正しいです。

Organizations — マルチテナンシー委任が現実的に

マルチテナントSaaSのSSO設計で扱った通り、KeycloakのOrganizationsは一つのrealmの中で複数のテナント(組織)を管理する機能です。ところがこれまで組織を管理するにはmanage-realmという高権限ロールが必要でした — テナント管理者にrealm全体の管理権限を渡すことになり、委任と呼ぶには気恥ずかしい構造でした。

26.7がこれを手直ししました。

breaking変更も一つ付いてきました。組織メンバー一覧APIがデフォルトでbrief表現を返すようになりました。フルユーザー表現が必要な場合はクエリパラメータで明示する必要があります。

GET /admin/realms/{realm}/organizations/{id}/members?briefRepresentation=false

組織招待一覧のemail/firstName/lastNameフィルタも部分一致から大文字小文字を無視した完全一致に変わりました — 部分一致が必要ならsearchパラメータを使うよう案内されています。これらのAPIに依存する自動化があるなら、レスポンスとフィルタの挙動が変わっていないか先に確認してください。

アップグレードで踏みやすいもの

今回のアップグレードガイドから、運用者が実際に踏みそうなものを選びました。全体の一覧はアップグレードガイド原文を見てください。

PostgreSQLの非同期コミットがデフォルトで有効になります。 persisted user sessions、client sessions、login failures、eventsのような揮発性テーブルだけを更新するトランザクションは、今後PostgreSQLの非同期コミット(async commit)で処理されます(ログアウトは引き続き同期コミットを強制)。パフォーマンスのための選択ですが、意味を正確に理解しておく必要があります — PostgreSQLのドキュメントによれば、非同期コミットはWALがディスクにフラッシュされる前にコミット成功を返し、サーバーがクラッシュするとその間のコミットは失われます。ロスト・ウィンドウは最大でwal_writer_delay(デフォルト200ms)の3倍です。データが壊れるわけではなく、失われるのは直近1秒未満のセッション・イベント書き込みであり、ユーザーから見れば再ログインで済む話です。ただしeventsテーブルが含まれる点は注目に値します — クラッシュ直前のログインイベントが監査ログから抜け落ちる可能性があるということなので、監査要件が厳しい環境では--spi-connections-jpa--quarkus--async-commit=falseでオプトアウトするか判断が必要です。

X.509クライアント認証にCA Subject DNオプションができ、事実上必須になります。 mTLSでクライアントを認証している場合、管理コンソールで信頼アンカーCAのsubject DNを指定するオプションが強制されるようになりました。既存の設定は当面動作しますが、次のメジャーからサーバー側の検証が入り、このオプションのない作成・更新・インポートは拒否されます。正確なDNの代わりに正規表現で証明書をマッチさせていたオプションも同時に廃止予告されています。TLS終端プロキシの後ろでヘッダー経由で証明書を渡す構成の場合、truststoreがクライアント証明書チェーンを検証できるようになっているかも再確認が必要です。

セルフ登録フローが変わります。 realmでセルフ登録とVerify Emailを併用している場合、登録フォームからパスワードフィールドがデフォルトで消えます。ユーザーはプロフィールのみを登録し、メールを検証した後にパスワード(またはOTP、パスキー)を設定します。検証されていないメールでクレデンシャルから先に作る順序を逆にした変更で、登録UXとドキュメント・スクリーンショットが丸ごと変わります。以前の挙動に戻すスイッチはありますが、deprecatedと表示されています。

残りは圧縮して列挙します。

廃止レーダー — 今すぐ切るか乗り換えるもの

その他の標準実験 — 一段落ずつ

今回のリリースにはexperimentalタグの付いた標準実装がやけに多く含まれています。すべてデフォルト無効で、experimentalはプレビューよりもさらに手前の段階だという前提で目を通してください。

プレビューから正式サポートに昇格したのは、SAMLクライアントのstep-up認証一つです。OIDCにしかなかった認証コンテキスト要求がSAML SPにも開かれました。

だからいつ上げて、何を有効にするか

まとめると、こう判断します。

おわりに

Keycloak 26.7はヘッドライン(SCIM、マルチクラスターv2)だけ見るとプレビューの祭典ですが、その下に流れる方向は一貫しています — サードパーティ拡張と外部インフラが埋めてきた空白をコアの標準実装に吸収し(SCIM、SSF、AuthZEN)、高権限ロールを分割し(組織管理ロール、view-systemの削除)、古い緩みを締め直す(X.509 CA DN、URIテンプレート検証、SHA-1退役予告)。自前でIdPを運用している立場からすると歓迎すべき方向で、その代償はアップグレードガイドが長くなることだけです。リリースノートだけ読んで済ませず、アップグレードガイドをチェックリスト代わりに一度通すことをお勧めします。

参考資料

コメント

まだコメントはありません。

ログインするとコメントできます