Keycloakの最新機能について調査

# はじめに
Keycloakはオープンソースのアイデンティティ・アクセス管理（IAM）ソフトウェアです。

認証認可サービスのソリューションは世の中にいろいろありますが、オープンソースで実績が豊富なものとしてはKeycloakが代表的なソフトウェアの一つとして広く認識されつつあります[^kc_popular1]。実際、2023年4月にはCloud Native Computing FoundationのIncubatingプロジェクトとして承認されております[^kc_cncf]。

本記事では、2024年12月時点での最新バージョンであるKeycloak 26でリリース内容の一部をご紹介したいと思います。

# 対象とする読者
以下の読者を想定しております。
- Keycloakや他のIAMソフトウェアを利用したことがある人
- Keycloakの最新動向を知りたい人

# Keycloak 26のハイライト機能
以下の機能がリリースされました。

|#|リリース機能|
|:----|:----|
|1|Organizations supported|
|2|Client libraries updates|
|3|User sessions persisted by default|
|4|New default login theme|
|5|Highly available multi-site deployments|
|6|Admin Bootstrapping and Recovery|
|7|OpenTelemetry Tracing preview|
|8|OpenID for Verifiable Credential Issuance|
|9|DPoP improvements|
|10|Removal of GELF logging handler|
|11|Lightweight access tokens for Admin REST API|
|12|Keycloak JavaScript adapter now standalone|
|13|Hostname v1 feature removed|
|14|Automatic redirect from root to relative path|
|15|Persisting revoked access tokens across restarts|
|16|Client Attribute condition in Client Policies|
|17|Specify different log levels for log handlers|
|18|Proxy option removed|
|19|Option `proxy-trusted-addresses` added|
|20|Option `proxy-protocol-enabled` added|
|21|Option to reload trust and key material added|
|22|Options to configure cache max-count added|
|23|The `https-trust-store-*` options have been undeprecated|
|24|The `java-keystore` key provider supports more algorithms and vault secrets|
|25|Adding support for ECDH-ES encryption key management algorithms|
|26|Support for multiple instances of a social broker in a realm|
|27|New generalized event types for credentials|
|28|Customizable Footer in login Themes|
|29|Keycloak CR supports standard scheduling options|
|30|KeycloakRealmImport CR supports placeholder replacement|
|31|Configuring the LDAP Connection Pool|
|32|Infinispan marshalling changes to Infinispan Protostream|
|33|Removal of OSGi metadata|
|34|Group-related events no longer fired when removing a realm|
|35|Identity Providers no longer available from the realm representation|
|36|Securing Applications documentation converted into the guide format|
|37|Removal of legacy cookies|
|38|Property `origin` in the `UserRepresentation` is deprecated|

:::note info
[公式ドキュメント](https://www.keycloak.org/2024/10/keycloak-2600-released.html)より引用
:::

今回は個人的に興味がある機能について深堀させていただきます。

## Organizations supported
Keycloak 26よりOrganization機能が正式にサポートされます。

Organization機能は、顧客やビジネスパートナーといったサードパーティーのアイデンティティと自社のアイデンティティを別々に管理できるように以下のような中核となる機能を提供しております。

- メンバー管理
- 招待リンクを利用した組織メンバーのオンボーディング
- アイデンティティブローカーを利用したフェデレーションによる組織メンバーのオンボーディング
- 組織の範囲内で認証を行う場合の、アイデンティティ・ファースト・ログインと組織固有の手順
- トークンを介しての組織固有なクレームのアプリケーション連携

### 認証機能の変更点
Organization機能が追加されたことにより、以下の認証フローに変更が加わりました。

- browser
- first broker login

browserフローについて、IDファーストログインをデフォルトにすることで認証情報の入力前にユーザを識別するようになりました。Organizationに関連付けられたIdPを通じて認証が実行されると、ユーザがOrganizationのメンバーとして自動的に追加されます。

- browserフローのログインページ
![Identity-first login page](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584403/676e3cc1-e042-237f-de0c-34d8188aab48.png)
- ユーザが存在しない場合
![Identity-first when user does not exist](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584403/c94c76ca-755c-9f3b-070f-08cc9faa22ef.png)

:::note info
画像は[Keycloak公式ドキュメントの"Server Administration"](https://www.keycloak.org/docs/latest/server_admin/index.html#_managing_organizations)より引用
:::

## Client libraries updates
Keycloak 26以降では、Keycloakのサーバ部分とクライアント部分でリリースサイクルを分離するようになりました。
具体的には、以下のライブラリをKeycloakのサーバリリースから独立させます（将来的には増える可能性あり）。
- Java admin client - Maven artifact `org.keycloak:keycloak-admin-client`
- Java authorization client - Maven artifact `org.keycloak:keycloak-authz-client`
- Java policy enforcer - Maven artifact `org.keycloak:keycloak-policy-enforcer`

さらに、互換性を保つため、同じサーババージョンと以前のいくつかの主要なサーババージョンでクライアントライブラリをテストしサポートするようになります。

## User sessions persisted by default
ユーザセッション永続化機能がデフォルトになりました。
ユーザセッション永続化の機能はKeycloak 25で初めて導入され、この機能を用いるとKeycloakが再起動されてもユーザセッションが保持されるようになります。

詳細については、Keycloak 25の機能紹介のページをご参照ください。

https://www.keycloak.org/2024/06/persistent-user-sessions-in-preview

## Highly available multi-site deployments
高可用性を担保されたマルチサイトアーキテクチャに関してKeycloak 26で機能改善がありました。

Keycloakでは[バージョン23](https://www.keycloak.org/docs/latest/release_notes/index.html#preview-support-for-multi-site-active-passive-deployments)からロードバランサーを利用した複数インスタンスの展開によるマルチサイトアーキテクチャが採用されております。

![マルチサイトアーキテクチャ図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584403/eaaa7b13-4b5b-39ff-6687-9273b01aa8e3.png)

具体的には以下のような機能が改善されています。
- 両方のサイトで同時にユーザリクエストを処理可能になりました
<!-- - 障害発生時にサイト間のレプリケーションを更新するために、サイト間の接続性能を監視する必要があります -->
- ロードバランサーのブループリントが更新され、AWS Global Acceleratorを使用するようになりました（目的：クライアント側のDNSキャッシュによって引き起こされるフェイルオーバー長期化を避けるため）

https://www.keycloak.org/high-availability/deploy-aws-accelerator-loadbalancer
- ユーザセッション永続化はマルチサイトを実現するうえでの要件となりました。その結果、ユーザセッションはKeycloakまたはInfinispanのアップグレード時に保持されるようになります。

:::note warn
Keycloakでマルチサイトを実現する際、レイテンシの増大を回避するために両サイトを互いの近傍に構築する必要があります。公式ドキュメントでも、AWSでサービスを構築する際は同一リージョン内にサイトを構築することが求められています。
:::

マルチサイト構成についてはまだコミュニティでも議論が行われているため、今後の動向にも要注目です。

## OpenTelemetry Tracing preview
OpenTelemetry TracingのサポートがKeycloakに公開され、オブザーバビリティを担保するためにアプリケーションのトレースを取得できるようになりました。パフォーマンスのボトルネックの発見、アプリケーション障害の原因の特定、分散システムを介したリクエストのトレースなど、様々なことに役立ちます。さらに、ログ追跡の設定は柔軟に変更可能で、例えばコンソールログをログ追跡から除外するといったことも可能です。

KeycloakではQuarkusのOpenTelemetry拡張機能を用いてログ追跡機能を実現しており、より詳細な属性値の情報を知りたい方は[Quarkusの公式ドキュメント](https://quarkus.io/guides/opentelemetry)を参照しましょう。

詳細はログ追跡機能の紹介ページにてご覧ください。

https://www.keycloak.org/server/tracing

## Infinispan marshalling changes to Infinispan Protostream
Keycloak 26でマーシャリングのフォーマットがJBossマーシャリングからInfinispanプロトストリーム（proto3）に変更されました。

:::note info
マーシャリングとは、Javaオブジェクトをバイトに変換し、Keycloakサーバ間のネットワークを介して送信するプロセスのことです。
:::

https://github.com/infinispan/protostream

なお、両者の間で互換性はないため、バージョンアップ時にキャッシュが削除されます。
ユーザセッションが失われないようにするには、まずKeycloak 25にアップグレードしてセッション永続化機能を有効にして下さい。

# 終わりに
今回のリリースはマルチサイト機能の改善やOpenTelemetryの採用などクラウドネイティブな環境での利用を想定した機能が多い印象です。

注目度が高い機能である「Organizations機能」の導入により、レルム管理者はOrganization単位でメンバーのライフサイクルや認証認可の設定をできるようになりました。エンタープライズ向けに機能を提供する場面で顧客ニーズにより柔軟に対応できるようになるので、ぜひ使っていきたいですね。

[^kc_cncf]:https://www.cncf.io/projects/keycloak/
[^kc_popular1]:https://permify.co/post/open-source-identity-access-management-iam-solutions-for-enterprises/