私は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
にセットをUnanimous
2つのポリシーを持ちます:
この場合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_owner
account: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
います。resource
scope
きちんとした:)これが役立つことを願っています。