私は2年以上遅れていることを知っていますが、私が知っていることを共有し、将来の読者の苦痛を和らげることができればと思います。完全な透明性-私は決してKeycloak / OAuth / OIDCの専門家ではありません。私が知っているのは、主にドキュメント、本、古き良きYouTubeを読んだり、ツールをいじったりすることです。
この投稿は2つの部分で構成されます。
- 私はあなたのすべての質問に私の能力の及ぶ限りでは答えようとします
- このスレッドのコアコンセプトのいくつかをよりよく理解するために、別のアプリをデプロイする必要なしに、Keycloakでポリシー/スコープ/パーミッションを試す方法をすべて紹介します。ただし、これは主にすべてを開始することを目的としていることに注意してください。私はを使用してい
Keycloak 8.0.0ます。
パートI
始める前のいくつかの用語:
- Keycloakでは、次の2種類の権限を作成できます。リソースベースとスコープ。
- 簡単に言えば、
Resource-Based権限については、リソースに直接適用します
- 以下のため
Scoped-Basedの許可は、あなたのスコープ(複数可)または範囲(複数可)に適用し、リソース。
1つの「ビュー」スコープを作成し、それを複数のリソース(アカウント、トランザクションなど)で使用することをお勧めしますか?または、「viewAccount」スコープ、「viewTransaction」スコープなどを作成する必要がありますか?
スコープは、保護されたリソースでの一連の権限を表します。あなたの場合、2つのリソースがあります。accountとtransaction、なので、2番目のアプローチに傾倒します。
長期的には、グローバルたview(すべてのリソースに関連付けられている範囲を例えばaccount、transaction、customer、settlement...)の両方に困難な許可が管理し、セキュリティ要件の変化に適応することができます。
デザインの感触をつかむためにチェックアウトできるいくつかの例を次に示します。
ただし、注意してください-リソース間でスコープを共有するべきではないと主張しているわけではありません。実際のところ、Keycloak同じリソースに対してこれを許可しますtype。たとえば、viewAccountとviewTransaction、特定のアカウントでトランザクションを読み取るには、スコープのが必要になる可能性があります(結局、トランザクションを表示するには、アカウントにアクセスする必要があるかもしれません)。要件と標準は、設計に大きく影響します。
リソースとスコープの実際的な組み合わせごとに、権限を作成するのが通常の方法ですか?
申し訳ありませんが、私は質問を完全に理解していないので、少し広範になります。へのアクセスを許可/拒否するにはresource、次のことを行う必要があります。
- ポリシーを定義する
- あなたの定義 権限を
- ポリシーを権限に適用する
- 権限を
scopeまたはresource(または両方)に関連付けます
ポリシーの施行を有効にするため。承認プロセスを参照してください。
これらすべてをどのように設定するかは、完全にあなた次第です。たとえば、次のことができます。
個々のポリシーを定義し、適切な許可の下で各ポリシーを結び付けます。
さらに良いことに、個々のポリシーを定義してから、関連するすべてのポリシーをaggregatedポリシー(ポリシーのポリシー)の下にグループ化し、その集約されたポリシーをscope-basedアクセス許可に関連付けます。あなたはそれを持つことができますscoped-based権限をリソースとそれに関連するすべてのスコープの両方に適用するます。
または、2つの別々のタイプを活用して、権限をさらに分解することもできます。resource-based権限タイプを介してリソースに対してのみ権限を作成し、他の権限をscope-based権限タイプを介してスコープのみに個別に関連付けることができます。
オプションがあります。
特定のリソース/スコープに一致する複数のアクセス許可がある場合、Keycloakは何をしますか?
これは
- リソースサーバーの
Decision Strategy
- 各許可の
Decision Strategy
- 各ポリシーの
Logic値。
Logic値は、Javaのと似ている!事業者。PositiveまたはのいずれかNegativeです。ときLogicでPositive、政策の最終的な評価は変わりません。そのNegative場合、最終結果は否定されます(たとえば、ポリシーがfalseと評価され、それLogicがNegativeである場合、それは否定されますtrue)。物事を単純にするために、Logicが常にに設定されていると仮定しましょうPositive。
それDecision Strategyが私たちが本当に取り組みたいことです。はまたDecision StrategyはのいずれUnanimousかAffirmativeです。ドキュメントから、
意思決定戦略
この構成により、評価されたすべてのアクセス許可の結果に基づいて、リソースまたはスコープを付与するかどうかをポリシー評価エンジンが決定する方法が変更されます。肯定的とは、リソースとそのスコープへのアクセスを許可するために、少なくとも1つの許可が肯定的な決定に評価される必要があることを意味します。全会一致とは、最終決定も肯定的であるためには、すべての許可が肯定的決定に評価される必要があることを意味します。例として、同じリソースまたはスコープに対する2つのアクセス許可が競合している場合(一方がアクセスを許可し、もう一方がアクセスを拒否している)、選択した戦略が肯定的であれば、リソースまたはスコープへのアクセス許可が付与されます。それ以外の場合、アクセス許可を1回拒否すると、リソースまたはスコープへのアクセスも拒否されます。
上記をよりよく理解するために例を使用してみましょう。2つの権限を持つリソースがあり、誰かがそのリソースにアクセスしようとしているとします(これLogicはPositiveすべてのポリシーに適用されます)。今:
Permission OneにDecision Strategy設定されていAffirmativeます。また、それぞれが評価する3つのポリシーがあります。
ポリシーの1つがに設定されているためtrue、Permission Oneはに設定されますtrue(肯定的-1つだけが必要ですtrue)。
Permission Two持っているDecision StrategyにセットをUnanimous2つのポリシーを持ちます:
この場合Permission Twoはfalse、1つのポリシーが偽であるためです(全会一致-すべてが偽である必要がありますtrue)。
- これで最終評価が行われます。リソースサーバー
Decision Strategyがに設定されている場合、はであるためAffirmative、そのリソースへのアクセスが許可されPermission Oneますtrue。一方、リソースサーバーDecision Strategyがに設定されているUnanimous場合、アクセスは拒否されます。
見る:
これを再検討し続けます。Decision Strategy パートIIでリソースサーバーを設定する方法を説明します。
たとえば、「アカウント」にアクセスする権限と「表示」スコープの権限を持つことができるので、アカウントを表示する権限がありますか?
簡単な答えはイエスです。さて、これを少し拡張してみましょう:)
次のシナリオがある場合:
- リソースサーバーの
Decision Strategy設定UnanimousまたはAffirmative
account/{id}リソースにアクセスするための権限はtrue
viewスコープにアクセスする権限はtrue
アカウントを表示するためのアクセス権が付与されます。
true+trueに等しいtrue下AffirmativeまたはUnanimous Decision Strategy。
今あなたがこれを持っているなら
- リソースサーバーの
Decision Strategy設定Affirmative
account/{id}リソースにアクセスするための権限はtrue
viewスコープにアクセスする権限はfalse
あなたはしますも、アカウントを表示するためのアクセスを許可すること。
true+falseは戦略のtrue下にありAffirmativeます。
ここでのポイントは、特定のリソースへのアクセスもセットアップに依存するため、2番目のシナリオが必要ない場合があるので注意してください。
しかし、これは、ユーザーが属することができるレガシーグループごとにポリシーが必要であることを意味するのは正しいですか?
Keycloakが2年前にどのように動作したかはわかりませんが、グループベースのポリシーを指定して、そのポリシーの下にすべてのグループを追加するだけで済みます。確かに、グループごとに1つのポリシーを作成する必要はありません。
たとえば、「ヘルプデスク」ロールがある場合は、「ヘルプデスクメンバーシップ」ポリシーが必要です。これを「viewAccount」権限に追加できます。これは正しいです?
かなり。これを設定する方法はたくさんあります。たとえば、次のことができます。
- リソース(例
/account/{id})を作成し、account:viewスコープに関連付けます。
- 役割ベースのポリシーを作成し、
helpdeskそのポリシーの下に役割を追加します
- 作成
Scope-Basedと呼ばれる許可をviewAccountしてとそれを結ぶscope、resourceとpolicy
パートIIでも同様の設定を行います。
パートII
Keycloakには、すべてのポリシーをテストできる小さなツールがあります。さらに良いことに、これを機能させるために、実際には別のアプリケーションサーバーを起動して別のアプリをデプロイする必要はありません。
設定するシナリオは次のとおりです。
- と呼ばれる新しいレルムを作成します
stackoverflow-demo
bank-apiその領域の下にクライアントを作成します
/account/{id}そのクライアントに呼び出されるリソースを定義します
account/{id}必要がありますaccount:viewスコープを
bob新しいレルムの下に呼び出されるユーザーを作成します
- 我々はまた、3つの役割を作成します:
bank_teller、account_ownerおよびuser
- 私たちは
bobいかなる役割にも関連付けません。これは今は必要ありません。
- 次の2つの
Role-Basedポリシーを設定します。
bank_tellerとaccount_ownerにアクセスしてい/account/{id}たリソースを
account_owneraccount:viewスコープにアクセスできます
user リソースまたはスコープにアクセスできません
- 私たちはで遊んでよ
Evaluate、アクセスが許可または拒否することができます方法を確認するためのツール。
私を許してください、この例は非現実的ですが、私は銀行セクターに精通していません:)
Keycloakのセットアップ
Keycloakをダウンロードして実行します
cd tmp
wget https://downloads.jboss.org/keycloak/8.0.0/keycloak-8.0.0.zip
unzip keycloak-8.0.0.zip
cd keycloak-8.0.0/bin
./standalone.sh
初期管理者ユーザーを作成する
- に移動
http://localhost:8080/auth
Administration Consoleリンクをクリックしてください
- 管理者ユーザーを作成してログインします
詳細については、「はじめに」をご覧ください。私たちの目的では、上記で十分です。
ステージのセットアップ
新しいレルムを作成する
masterレルムの周りにマウスを置き、Add Realmボタンをクリックします。
stackoverflow-demo名前として入力します。
- をクリックし
Createます。
- 左上にレルムの
stackoverflow-demo代わりに言う必要がありmasterます。
新しいレルムの作成を参照してください
新しいユーザーを作成する
Users左側のリンクをクリックしてください
- クリックして
Add User、ボタン
username(例bob)を入力します
User Enabledオンになっていることを確認します
- クリック
Save
新しいユーザーの作成を参照してください
新しい役割を作成する
Rolesリンクをクリックしてください
- クリック
Add Role
- 次の役割を追加します
bank_teller、account_ownerとuser
繰り返しますが、ユーザーをロールに関連付けないでください。私たちの目的では、これは必要ありません。
役割を参照してください
クライアントを作成する
Clientsリンクをクリックしてください
- クリック
Create
- に入力
bank-apiしてくださいClient ID
- 以下のための
Root URL入力http://127.0.0.1:8080/bank-api
- クリック
Save
- それ
Client Protocolがopenid-connect
- に変更
Access Typeしますconfidential
- 変更
Authorization EnabledへOn
- 下にスクロールして、を押し
Saveます。新しいAuthorizationタブが上部に表示されます。
AuthorizationタブをクリックしてからSettings
Decision Strategyがに設定されていることを確認しますUnanimous
- これはリソースサーバーの
Decision Strategy
見る:
カスタムスコープを作成する
Authorizationタブをクリックします
Authorization Scopes>CreateをクリックしてAdd Scopeページを表示します
account:view名前を入力してEnterキーを押します。
「アカウントリソースの表示」を作成する
- 上の
Authorizationリンクをクリックしてください
- クリック
Resources
- クリック
Create
- 入力
View Account Resourceの両方のためにNameとDisplay name
- に入力
account/{id}してくださいURI
- テキストボックスに入力
account:viewしますScopes
- クリック
Save
リソースの作成を参照してください
ポリシーを作成する
- 再び
Authorizationタブの下で、をクリックしますPolicies
- ドロップダウン
Roleから選択しますCreate Policy
- では
Nameセクション、タイプOnly Bank Teller and Account Owner Policy
- 下の
Realm Roles選択の両方bank_tellerとaccount_owner役割
Logicがに設定されていることを確認しますPositive
- クリック
Save
Policiesリンクをクリックしてください
- ドロップダウン
Roleからもう一度選択しCreate Policyます。
- 今回
Only Account Owner PolicyはName
- 下の
Realm Roles選択account_owner
Logicがに設定されていることを確認しますPositive
- クリック
Save
Policies上部のリンクをクリックすると、新しく作成したポリシーが表示されます。
ロールベースのポリシーを参照してください
Keycloakにははるかに強力なポリシーがあることに注意してください。ポリシーの管理を参照してください
リソースベースの権限を作成する
- 再び
Authorizationタブの下で、をクリックしますPermissions
- 選択する
Resource-Based
- タイプ
View Account Resource PermissionについてName
Resourcesタイプの下View Account Resource Permission
- 下の
Apply Policy選択Only Bank Teller and Account Owner Policy
Decision Strategyがに設定されていることを確認しますUnanimous
- クリック
Save
リソースベースの権限の作成を参照してください
ふぅ...
リソースベースの権限の評価
- 再び
Authorizationタブの下で、Evaluate
User入力の下でbob
- 下の
Roles選択user
- 以下の下で
Resources選択View Account Resourceし、クリックAdd
- [評価]をクリックします。
- 展開
View Account Resource with scopes [account:view]の結果を見て、あなたが表示されるはずですDENY。

- これは、を介してそのリソースへのアクセスを2つのロールにのみ許可するため意味があり
Only Bank Teller and Account Owner Policyます。これをテストして、これが正しいことを確認しましょう!
Back評価結果の真上にあるリンクをクリックしてください
- bobの役割をに変更し
account_owner、をクリックしEvaluateます。結果はとして表示されPERMITます。戻って役割をに変更した場合も同じ取引bank_teller
ポリシーの評価とテストを参照してください
スコープベースの権限を作成する
Permissionsセクションに戻る
- ドロップダウンで
Scope-Based今回を選択しCreate Permissionます。
- 下に
Name、View Account Scope Permission
- 下に
Scopes、account:view
- 下に
Apply Policy、Only Account Owner Policy
Decision Strategyがに設定されていることを確認しますUnanimous
- クリック
Save
スコープベースの権限の作成を参照してください
2回目のテスト実行
新しい変更の評価
Authorizationセクションに戻る
- クリック
Evaluate
- ユーザーは
bob
- 役割は
bank_teller
- リソースは
View Account Resource、クリックする必要がありますAdd
- をクリックする
Evaluateと、が表示されますDENY。
- 繰り返し
bank_tellerますが、resourceこれはにアクセスできますが、にはアクセスできないので、当然のことscopeです。ここでは、一方の権限がtrueと評価され、もう一方の権限がfalseと評価されます。リソースサーバーDecision Strategyがに設定されているUnanimous場合、最終的な決定はDENYです。
- タブの
Settings下をクリックしAuthorization、をに変更しDecision StrategyてAffirmative、手順1〜6に戻ります。今回は、最終結果は次のようになりますPERMIT(1つの許可が真であるため、最終決定が真です)。
- 完全を期すために、リソースサーバーをに
Decision Strategy戻しますUnanimous。繰り返しますが、手順1〜6に戻りますが、今回は役割をとして設定しaccount_ownerます。今回も、との両方にアクセスできることをPERMIT考えると、最終結果は理にかなってaccount_ownerいます。resourcescope
きちんとした:)これが役立つことを願っています。