Keycloakは UMA 2.0 に準拠した認可サーバーとして、リソース所有者自身が他のユーザーへアクセス許可を委ねる「ユーザー主導の共有」を提供します。permission ticket と RPT の流れ、Protection API、そして現実的な採否判断まで、実装者の視点で整理します。

01UMA 2.0が解く「誰が許可を出すのか」問題

通常のOAuth2では、あるユーザー(リソース所有者)が、クライアントアプリケーションに対して自分のリソースへのアクセスを同意します。同意の相手はあくまで「自分の代わりに動くアプリ」です。ところがエンタープライズの現場では、これと似て非なる要求が頻繁に出てきます。「Aさんが所有するドキュメントを、Aさん自身の操作でBさんに共有させたい」というものです。ここで許可を出す主体は管理者でもアプリでもなく、リソース所有者本人です。

この「ユーザー同士の、非同期な、本人主導のアクセス許可」を標準化したのが User-Managed Access(UMA)2.0 です。KeycloakはAuthorization Servicesの一部として UMA 2.0 準拠の認可サーバー機能を備えており、公式ドキュメントは次のように述べています。UMAでは permission ticket が person-to-person(人対人)の共有、および person-to-organization(人対組織)の共有を支える中核であり、OAuth2がクライアントへの同意であるのに対し、UMAではリソース所有者が他のユーザーへ、完全に非同期な形でアクセスを許可できる、と。

現場のコツ:UMAを検討する前に「許可を出すのは誰か」を一言で言えるか確認してください。答えが「管理者」や「ロール設計」なら、UMAではなく きめ細かな認可(fine-grained authorization) やロール/グループ設計で足ります。答えが「所有者本人が、その場で、相手を指名して」であるときだけUMAが効きます。

02登場人物と用語を実装者の言葉で整理する

UMAは仕様が抽象的で、用語で挫折しがちです。Keycloakの実装に即して最小限に翻訳します。

混同しやすいのが、ユーザーが持つ uma_authorization というレルムロールです。これはデフォルトロールとして各ユーザーに付与され、認可フローに関与します。これを不用意に外すとログインや認可要求に影響が出るため、UMAを使わない場合でも安易な削除は避けてください。

03permission ticketからRPTへ:認可フローの全体像

UMAのフローは、初見だと往復が多く見えます。しかし要は「まず門前払い(チケット付き)→ そのチケットを認可サーバーに持ち込んでRPTを得る → RPTで再アクセス」という3段構えです。図で掴んでください。

リクエスティング パーティ/クライアント リソースサーバー (保護対象API) Keycloak 認可サーバー 1. アクセス試行 (RPTなし) 2. ticket要求(Protection API) 3. permission ticket発行 4. 401 + ticket返却 5. uma-ticketグラントでticketを提示 → RPT取得 6. 得たRPTで1.を再試行し成功
図:permission ticketを起点にRPTを取得するUMAの往復フロー。クライアントは最初のアクセスで401とticketを受け取り、それを認可サーバーへ持ち込んでRPTを得る。

最後の5番が要です。クライアントは Keycloak のトークンエンドポイントに対し、グラントタイプ urn:ietf:params:oauth:grant-type:uma-ticket と、受け取った ticket を送ります。ポリシー評価が通ればRPTが返り、通らなければ拒否またはクレーム収集(claim gathering)へと進みます。

04所有者がリソースを共有する:アカウントコンソールの「My Resources」

UMAが管理者不在で回る鍵は、リソース所有者本人がKeycloakのアカウントコンソールから共有を操作できる点にあります。Keycloak自身が sharing management service(共有管理サービス)として振る舞い、所有者は共有先ユーザーのユーザー名またはメールアドレスを入力し、付与したいpermission(スコープ)を選んで共有します。公式ドキュメントの表現どおり、これはOAuth2のクライアントへの同意とは異なり、所有者が他のエンドユーザーへ、非同期に、本人の意思でアクセスを許可する仕組みです。

裏側では、この共有操作が Protection API の Policy API / Permission API を通じてUMA policyやpermission ticketの承認として記録されます。所有者は同じ画面から、誰にどのスコープを渡しているかの一覧確認と取り消し(revoke)も行えます。運用上はこの「取り消し導線が所有者の手元にある」ことが監査・ガバナンス面で効いてきます。

現場のコツ:共有UIをそのまま業務ユーザーに出すと用語が難解です。実案件では「My Resources」相当の機能をアプリ側UIに寄せ、裏でProtection APIを叩く薄いBFFを挟む構成にしました。エンドユーザーには「共有」ボタンだけを見せ、UMAの語彙を露出させないのが定着のコツです。

05Protection APIとpermission requestの扱い

リソースサーバー側の実装で触るのが Protection API です。役割は大きく3つあります。

Protection APIの呼び出しには、クライアントに uma_protection スコープが与えられていることが前提です。実装では、リソースサーバー自身のサービスアカウントトークン(client_credentials)でこのAPIを叩くのが定石です。ユーザーのトークンで叩くのはowner-managedな共有承認など限定的な場面に留めると、権限境界が明確になります。

06RPTの検証とpermissionの取り出し

RPTを受け取ったリソースサーバーは、それを検証してどのpermissionが実際に付与されたかを判断します。Keycloakは token introspection エンドポイントを提供しており、RPTのactive状態と、Keycloakが付与したpermission群を取得できます。RPT内のpermissionは、リソース名/リソースIDとスコープの組で表現されます。

実装上の判断ポイントは「RPTをどこまで信頼して素通しするか」です。RPTは署名付きJWTとして扱えますが、失効(共有取り消し)を即時反映したい要件があるならintrospectionでの都度確認が必要になり、レイテンシとKeycloakへのRPS(1秒あたりリクエスト数)が増えます。ここは Infinispanキャッシュのチューニング可観測性の設計 と併せて負荷を見積もってください。UMAはトークン検証の回数が素のOIDCより増えがちだという前提で容量計画を立てるのが安全です。

RPTを受領 失効の即時反映が 必要か? Yes:introspectionで 都度検証(高鮮度・高負荷) No:JWT署名検証で ローカル判定(低負荷) permission(リソース× スコープ)で認可判定
図:RPT検証方式の分岐。共有取り消しの即時反映要件があるかで、introspection都度検証かローカルJWT検証かを選ぶ。

07バージョン差と実装上の注意

Authorization ServicesとUMAサポート自体は長く安定して提供されている機能ですが、周辺は動いています。現行はQuarkusベースのディストリビューション(およびRed Hat build of Keycloak)が基準で、旧WildFlyベースは非推奨です。Quarkusディストリビューションへの移行を終えていない環境では、まずそこから着手してください。設定キーやアカウントコンソールのUI(Account Console v2/v3系)はバージョンで差があるため、共有UIの見た目や画面遷移は必ず利用中バージョンの公式ドキュメントで確認するのが安全です。

08現実的な採否判断:UMAを選ぶ・選ばない

UMAは強力ですが、万能薬ではありません。実案件でのEMWの判断軸を共有します。

UMAが向くケース:ファイル共有、予約枠の代理管理、IoTデバイスの所有者間貸与など、「エンドユーザーが自分の持ち物を、その場で、別のエンドユーザーに」渡すユースケース。許可の主体が本人で、相手が動的に決まり、非同期な承認・取り消しが要件に含まれるとき、UMAは仕様が要件に素直に噛み合います。

UMAを避けるべきケース:許可の主体が管理者やロール設計であるとき、あるいは共有相手が固定的で組織構造から決まるときは、UMAの往復とpermission ticketの管理コストが割に合いません。この場合は fine-grained authorization のリソース/スコープ/ポリシーだけで組む、あるいはロール・グループ・属性で表現する方が、運用も検証もはるかに楽です。マルチアカウント統制のようなガバナンス主導の要件も、UMAより集中管理型の設計が適します。

現場のコツ:UMAを入れる前に「共有取り消しの即時性」「共有関係の監査ログ要件」「想定される共有関係の総数」の3点を必ず数字で押さえてください。この3つが曖昧なままPoCを通すと、本番でintrospection負荷と監査要件が同時に牙を剥きます。逆にこの3点が明確なら、UMAは驚くほどきれいに要件を満たします。EMWの導入事例でも、この見極めが定着の分かれ目でした。

まとめ

UMA 2.0は「所有者本人が、その場で、相手を指名して、非同期に許可を出す」という、OAuth2では表現しづらい共有を標準化した仕組みです。Keycloakはpermission ticket・RPT・Protection API・アカウントコンソールの共有UIという形でこれを実装として提供します。鍵は仕様の網羅ではなく、自分の要件が本当に「本人主導・動的・非同期」なのかの見極めと、RPT検証の負荷・失効即時性・監査要件を数字で押さえることです。そこさえ外さなければ、UMAは実運用に耐える強力な選択肢になります。

参考(一次情報)

UMA 2.0を含むKeycloak認可基盤の設計・実装でお困りの際は、実構築の経験を踏まえてお問い合わせください。

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