Keycloakには権限を表現する手段が複数あります。realm role、client role、composite role、group、そしてuser attribute。どれを使うかで、数年後の運用しやすさが大きく変わります。本稿では各要素の役割とトークンへの載り方を踏まえ、破綻しない設計指針を整理します。

Keycloakで認証基盤を組むとき、最初の設計判断でありながら後から効いてくるのが「権限を何で表現するか」です。同じ「営業部の課長だけがこの画面を使える」という要件でも、realm roleで表すか、group継承で表すか、user attributeで条件分岐するかで、運用負荷もトークンの中身もまったく変わります。本稿ではKeycloakが提供する各手段の性質を、公式ドキュメントの定義に沿って整理し、破綻しない設計指針を示します。バージョンはQuarkus版の新しめのリリース(26系)を前提としますが、モデルの基本概念はバージョン間で大きく変わりません。挙動の細部は必ずお使いのバージョンの公式ドキュメントでご確認ください。

014つの部品を正しく区別する

まず用語を揃えます。Keycloakで権限に関わる部品は、大きく4つです。混同したまま設計すると必ず破綻するので、定義を厳密に押さえます。

加えて、ユーザーとグループはそれぞれ任意のattribute(キーと値)を持てます。email・部署コード・費用センターといった「属性情報」を保持する箱です。ここまでが道具立てです。

02Role と Group は役割が違う

最頻出の混乱が「roleとgroup、どっちで権限を管理するのか」です。公式のServer Administration Guideは「Groups compared to roles」という独立した節を設け、両者を意図的に区別しています。整理するとこうです。

設計指針としては、権限そのものはroleで定義し、そのroleをgroupにマッピングして人に配るのが基本形です。ユーザーに直接roleを付けるのではなく、groupを経由させることで「異動=group移動」だけで権限が付け替わり、棚卸しも「このgroupに誰がいるか」で完結します。逆に、group名をそのままアプリの認可判断に使うのはアンチパターンです。組織変更でgroup構造が変わるたびにアプリ側の判定ロジックが壊れます。group構造は組織都合で変わる前提、role体系はアプリ都合で安定させる前提——この非対称を意識すると設計がぶれません。

現場のコツ:「人 → group → role → アプリの認可判断」という一方向の流れを崩さないこと。アプリがgroupのパス(/営業/東日本)を直接if文で見始めた瞬間、そのシステムは組織変更に弱くなります。アプリが見るのは常にroleに限定します。

03group継承と、roleの継承経路

groupは階層構造を持てます。/営業の下に/営業/東日本を作れば、子グループのメンバーは親グループのattributeとロールマッピングを継承します。ロール解決の観点で重要なのは、公式が明言している通り、ユーザーの実効ロールが「direct roles set to the user, its groups and their parent groups(ユーザー直付けのロール+所属グループ+その親グループ)」から合成される点です。つまり最終的な権限は、次の3経路の和集合になります。

この「3経路 × composite展開」の掛け算が、Keycloak権限設計の勘所です。表現力は高いのですが、経路が増えるほど「なぜこの人にこの権限があるのか」の追跡が難しくなります。破綻を避けるには、継承経路を意図的に絞ることです。実務では「roleの付与はgroup経由に一本化し、ユーザー直付けは例外運用のみ」「composite roleのネストは1〜2段まで」といったルールを最初に決めておくと、後の監査が楽になります。

実効ロールの合成経路 ユーザー 直付け role (例外運用のみ) group の role (親group も継承) composite 展開 (内包 role) 実効ロール(和集合) 経路が増えるほど「なぜこの権限があるか」の追跡は難しくなる
図:ユーザーの実効ロールは、直付け・group継承・composite展開の3経路の和集合として合成される。

04attribute は「権限」ではなく「文脈」

3つ目の混乱が「attributeで権限を表現していいか」です。結論から言うと、attributeを認可の主軸に据えるのは推奨しません。attributeはあくまで属性情報(部署コード、費用センター、社員区分など)を保持する箱であって、Keycloakのロールベース・アクセス制御(RBAC)の一次市民ではないからです。

ただしattributeが無力なわけではありません。適材適所は次の通りです。

逆に、「role=adminというattributeを付けてアプリがそれを見る」ような設計はやめるべきです。それはroleでやるべき仕事をattributeで代替しているだけで、Keycloakの標準的なrole mapperやスコープ制御の恩恵をすべて捨てることになります。権限はrole、属性はattribute——この境界を最初に引くことが、後の破綻を防ぎます。

05トークンにどう載せるか

設計したrole・group・attributeは、そのままではアプリに届きません。アプリが受け取るのはOIDCトークン(またはSAMLアサーション)であり、そこに何を載せるかはクライアントごとのprotocol mapperで制御します。公式が言う通り「for each client you can tailor what claims and assertions are stored in the OIDC token(クライアントごとにトークンに格納するclaimを調整できる)」わけです。代表的なものを挙げます。

ここで効いてくるのが「トークンに載るroleは何か」の制御です。KeycloakにはFull Scope Allowedという設定があり、管理コンソールで作成した新規クライアントでは既定で有効になっています(既定で無効になるのはClient Registration Service経由で作成したクライアントに限られます)。有効のままだと、そのクライアントはrealm内の全roleやスコープ外のroleまでトークンに載せてしまうため、推奨は明示的にオフにし、Scopeタブで必要なrealm roleだけを許可することです。オフにすれば、client scopeで明示的に許可したroleだけがトークンに載ります(合成roleも展開対象として考慮されます)。これは単なる好みの問題ではなく、トークンの肥大化を防ぐ実務的なレバーでもあります。

06トークンが太る問題を設計で防ぐ

role設計が破綻する典型が「トークンが巨大化する」です。composite roleを多用し、全roleを全クライアントに載せる設定にすると、Accessトークンに数十〜数百のroleが並び、ヘッダサイズ制限に抵触したり、ネットワーク往復のたびに無駄な帯域を食ったりします。対策は設計段階で打てます。

現場のコツ:role体系のレビューでは「このroleは最終的にどのクライアントのトークンに、どの経路で載るか」を1本ずつ追える状態を保つこと。composite roleを1段増やすたびに、それがトークンに与える影響を確認する習慣をつけると、後から「なぜこのトークンはこんなに大きいのか」で悩まずに済みます。

07マルチテナントとOrganization Groups

SIer案件では「1つのrealmで複数の顧客組織を収容したい」というマルチテナント要件がしばしば出ます。従来、realm直下のgroupを組織ごとに切ると、/Engineering/Backendのような同名パスが組織間で衝突し、cross-organization leakage(組織をまたいだ情報漏れ)のリスクがありました。

これに対しKeycloak 26.6.0で導入されたのがOrganization Groupsです。Organizations機能に階層的なグループ管理を持ち込み、公式の言葉を借りれば「Organization Aの/Engineering/BackendとOrganization Bの/Engineering/Backendは完全に別のグループ」として、組織ごとに独立した階層・メンバー・attributeを持てます。group membershipは組織claimの中でOIDCトークン/SAMLアサーションに載ります。

ただし設計上の注意があります。公式が明記する通り、Organization GroupsはKeycloakのauthorizationポリシー(Authorization Services)では使えません。つまりテナント分離の構造化には使えても、そのまま細粒度認可の判定材料にはできないということです。マルチテナントを組む際は、テナント境界をOrganization Groupsで表し、テナント内の権限は従来通りrealm/client roleで表す、という役割分担が現実解になります。realm自体を分けるかどうかの判断とあわせて、テナント設計の初期に決めておくべき論点です。

まとめ:破綻しない設計のチェックリスト

Keycloakの権限モデルは表現力が高いぶん、放っておくと経路が絡み合って破綻します。最後に、設計時に立ち返る指針をまとめます。

これらは机上論ではなく、運用フェーズで棚卸しや監査、組織変更に耐えるための実務指針です。関連して、認可フローの組み立ては認証フロー設計、細粒度の認可はFine-Grained Authorization、トークン発行時のclaim整形はClient ScopesとMapperの各記事もあわせてご覧ください。EMWの実案件事例は導入事例にまとめています。

参考(一次情報)

認証基盤の権限モデルをこれから設計する、あるいは肥大化したroleの再整理を検討中でしたら、お問い合わせください。実装まで手を動かす前提でご相談に乗ります。

相談する
← ブログ一覧へ戻る