Ich möchte ein ziemlich einfaches rollenbasiertes Zugriffskontrollsystem mit dem Autorisierungssystem von Keycloak erstellen. Das System, das Keycloak ersetzt, ermöglicht es uns, einen "Benutzer" zu erstellen, der Mitglied einer oder mehrerer "Gruppen" ist. In diesem Legacy-System erhält ein Benutzer die "Berechtigung", auf jede der etwa 250 "Funktionen" zuzugreifen, entweder durch Gruppenmitgliedschaft (bei der Gruppen Berechtigungen zugewiesen werden) oder durch direkte Erteilung einer Berechtigung an den Benutzer.
Ich möchte das Legacy-System Keycloak-Berechtigungen zuordnen.
Es sollte für mich einfach sein, jede "Fähigkeit" im vorhandenen System einer Schlüsselumhüllungsressource und einer Reihe von Schlüsselumhüllungsbereichen zuzuordnen. Beispielsweise würde eine "viewAccount" -Funktion offensichtlich einer "Konto" -Ressource und einem "Ansicht" -Bereich zugeordnet. und "viewTransaction" werden einer "Transaktions" -Ressource zugeordnet. Ist es jedoch empfehlenswert, nur einen "Ansicht" -Bereich zu erstellen und ihn für mehrere Ressourcen (Konto, Transaktion usw.) zu verwenden? Oder sollte ich einen Bereich "viewAccount", einen Bereich "viewTransaction" usw. erstellen?
Ebenso bin ich etwas verwirrt über Berechtigungen. Ist es üblich, für jede praktische Kombination aus Ressource und Umfang eine Berechtigung zu erstellen? Was macht Keycloak, wenn mehrere Berechtigungen für eine bestimmte Ressource / einen bestimmten Bereich vorhanden sind? Ich vermute, dass Keycloak es mir ermöglichen soll, eine Matrix von Berechtigungen für Ressourcen und Bereiche zu konfigurieren, sodass ich beispielsweise die Berechtigung zum Zugriff auf "Konten" und die Berechtigung zum "Anzeigen" des Bereichs haben könnte, sodass ich die Berechtigung hätte Konten anzeigen?
Ich frage, weil das Ergebnis all dessen zu sein scheint, dass meine alte "viewAccount" -Funktion dazu führt, dass eine "Account" -Ressource mit dem Bereich "View" und einer "viewAccount" -Berechtigung erstellt wird, die mich wieder dorthin zu bringen scheint, wo ich war. Welches ist in Ordnung, wenn es richtig ist.
Schließlich benötige ich natürlich eine Reihe von Richtlinien, die festlegen, ob viewAccount angewendet werden soll. Aber habe ich Recht, dass dies bedeutet, dass ich eine Richtlinie für jede der Legacy-Gruppen benötige, zu denen ein Benutzer gehören könnte? Wenn ich beispielsweise eine "Helpdesk" -Rolle habe, benötige ich eine "Helpdesk-Mitgliedschafts" -Richtlinie, die ich dann zur Berechtigung "viewAccount" hinzufügen kann. Ist das richtig?
Vielen Dank,
Kennzeichen
quelle
Antworten:
Ich weiß, dass ich 2+ Jahre zu spät bin, aber ich denke, ich würde teilen, was ich weiß, und hoffentlich einige Schmerzen für zukünftige Leser lindern. Volle Transparenz - Ich bin kein Keycloak / OAuth / OIDC-Experte und was ich weiß, ist hauptsächlich das Lesen der Dokumente, Bücher, des guten alten YouTube und das Herumspielen mit dem Tool.
Dieser Beitrag besteht aus zwei Teilen:
Keycloak 8.0.0
.Teil I.
Einige Begriffe, bevor wir beginnen:
Resource-Based
Berechtigungen wenden Sie es direkt auf Ihre Ressource anScoped-Based
Berechtigung zu erhalten, wenden Sie sie auf Ihre Bereiche oder Bereiche und Ressourcen an.Bereiche repräsentieren eine Reihe von Rechten an einer geschützten Ressource. In Ihrem Fall haben Sie zwei Ressourcen:
account
undtransaction
, so würde ich mich zum zweiten Ansatz neigen.Auf langer Sicht, einen globalen mit
view
Umfang mit allen Ressourcen verbunden ist (zBaccount
,transaction
,customer
,settlement
...) macht Genehmigung schwierig, sowohl verwalten und Sicherheitsanforderungen Änderungen anzupassen.Hier sind einige Beispiele, die Sie sich ansehen können, um ein Gefühl für Design zu bekommen
Beachten Sie jedoch, dass ich nicht behaupte, dass Sie Bereiche nicht ressourcenübergreifend teilen sollten. Tatsache ist,
Keycloak
ermöglicht dies für Ressourcen mit den gleichentype
. Sie könnten beispielsweise beidesviewAccount
und denviewTransaction
Umfang benötigen , um eine Transaktion unter einem bestimmten Konto zu lesen (schließlich benötigen Sie möglicherweise Zugriff auf das Konto, um Transaktionen anzuzeigen). Ihre Anforderungen und Standards werden Ihr Design stark beeinflussen.Entschuldigung, ich verstehe die Frage nicht ganz, also werde ich ein bisschen breit sein. Um den Zugriff auf a zu gewähren / zu verweigern
resource
, müssen Sie:scope
oderresource
(oder beiden)damit die Durchsetzung der Richtlinien wirksam wird. Siehe Autorisierungsprozess .
Wie Sie das alles einrichten, liegt ganz bei Ihnen. Sie könnten zum Beispiel:
Definieren Sie einzelne Richtlinien und binden Sie jede Richtlinie mit der entsprechenden Berechtigung.
Besser noch, definieren Sie einzelne Richtlinien, gruppieren Sie dann alle zugehörigen Richtlinien unter einer
aggregated
Richtlinie (einer Richtlinienrichtlinie) und ordnen Sie diese aggregierte Richtlinie derscope-based
Berechtigung zu. Diesescoped-based
Berechtigung kann sowohl für die Ressource als auch für den gesamten zugehörigen Bereich gelten.Sie können Ihre Berechtigungen auch weiter aufteilen, indem Sie die beiden separaten Typen nutzen. Sie können Berechtigungen ausschließlich für Ihre Ressourcen über den
resource-based
Berechtigungstyp erstellen und andere Berechtigungen separat ausschließlich einem Bereich über denscope-based
Berechtigungstyp zuordnen.Sie haben Optionen.
Das hängt davon ab
Decision Strategy
Decision Strategy
Logic
Wert jeder Richtlinie .Der
Logic
Wert ist ähnlich wie beim Java-!
Operator. Es kann entweder seinPositive
oderNegative
. Wenn dies der FallLogic
istPositive
, bleibt die endgültige Bewertung der Richtlinie unverändert. Wenn dies der Fall ist , wirdNegative
das Endergebnis negiert (z. B. wenn eine Richtlinie als falsch bewertetLogic
wirdNegative
und dies der Fall ist , ist dies der Falltrue
). Nehmen wir zur Vereinfachung an, dass der WertLogic
immer auf eingestellt istPositive
.Das
Decision Strategy
ist es, was wir wirklich angehen wollen. DasDecision Strategy
kann entweder seinUnanimous
oderAffirmative
. Aus den Dokumenten,Verwenden wir ein Beispiel, um das Obige besser zu verstehen. Angenommen , Sie eine Ressource mit 2 Berechtigungen und jemand versucht , den Zugriff auf die Ressource (denken Sie daran, das
Logic
istPositive
für alle Richtlinien). Jetzt:Permission One
hat einenDecision Strategy
Satz zuAffirmative
. Es gibt auch drei Richtlinien, in denen jeweils Folgendes bewertet wird:true
false
false
Da eine der Richtlinien auf gesetzt ist
true
,Permission One
ist auf gesetzttrue
(bejahend - nur 1 muss seintrue
).Permission Two
hat einenDecision Strategy
SatzUnanimous
mit 2 Richtlinien:true
false
In diesem Fall
Permission Two
istfalse
eine Richtlinie falsch (einstimmig - sie müssen alle seintrue
).Decision Strategy
gesetzt istAffirmative
, den Zugang zu dieser Ressource gewährt werden würde , daPermission One
isttrue
. Wenn andererseits der Ressourcenserver aufDecision Strategy
eingestellt ist,Unanimous
wird der Zugriff verweigert.Sehen:
Wir werden das noch einmal überdenken. Ich erkläre
Decision Strategy
in Teil II , wie die Ressourcen-Server eingestellt werden .Die kurze Antwort lautet ja. Lassen Sie uns das jetzt etwas erweitern :)
Wenn Sie das folgende Szenario haben:
Decision Strategy
aufUnanimous
oder eingestelltAffirmative
account/{id}
Ressource isttrue
view
Bereich isttrue
Sie erhalten Zugriff auf das Konto.
true
+true
ist gleichtrue
unter demAffirmative
oderUnanimous
Decision Strategy
.Nun, wenn Sie das haben
Decision Strategy
eingestelltAffirmative
account/{id}
Ressource isttrue
view
Bereich istfalse
Sie erhalten außerdem Zugriff auf das Konto.
true
+false
stehttrue
unter derAffirmative
Strategie.Der Punkt hier ist, dass der Zugriff auf eine bestimmte Ressource auch von Ihrem Setup abhängt. Seien Sie also vorsichtig, da Sie das zweite Szenario möglicherweise nicht möchten.
Ich bin nicht sicher , wie Keycloak vor 2 Jahren verhalten haben , aber Sie können angeben Gruppenbasierte Politik und einfach alle Ihre Gruppen im Rahmen dieser Politik hinzuzufügen. Sie müssen sicherlich keine Richtlinie pro Gruppe erstellen.
Ja schon. Es gibt viele Möglichkeiten, wie Sie dies einrichten können. Zum Beispiel können Sie:
/account/{id}
) und ordnen Sie sie demaccount:view
Bereich zu.helpdesk
Rolle unter dieser Richtlinie hinzuScope-Based
Berechtigung namensviewAccount
und verknüpfen Sie sie mitscope
,resource
undpolicy
Wir werden in Teil II etwas Ähnliches einrichten.
Teil II
Keycloak hat ein hübsches kleines Tool, mit dem Sie alle Ihre Richtlinien testen können. Besser noch, Sie müssen tatsächlich keinen anderen Anwendungsserver hochfahren und eine separate App bereitstellen, damit dies funktioniert.
Hier ist das Szenario, das wir einrichten werden:
stackoverflow-demo
bank-api
diesem Bereich erstellen wir einen Client/account/{id}
für diesen Client aufgerufen wirdaccount/{id}
wird denaccount:view
Umfang habenbob
unter dem neuen Bereich aufgerufen wirdbank_teller
,account_owner
unduser
bob
keine Rollen zuordnen. Dies wird derzeit nicht benötigt.Role-Based
Richtlinien einrichten :bank_teller
undaccount_owner
haben Zugriff auf die/account/{id}
Ressourceaccount_owner
hat Zugriff auf denaccount:view
Bereichuser
hat keinen Zugriff auf die Ressource oder den BereichEvaluate
Tool herumspielen, um zu sehen, wie der Zugriff gewährt oder verweigert werden kann.Verzeihen Sie mir, dieses Beispiel ist unrealistisch, aber ich kenne den Bankensektor nicht :)
Keycloak-Setup
Laden Sie Keycloak herunter und führen Sie es aus
Erstellen Sie den ersten Administrator
http://localhost:8080/auth
Administration Console
LinkWeitere Informationen finden Sie unter Erste Schritte . Für unsere Zwecke ist das oben Genannte ausreichend.
Bühne einrichten
Erstelle ein neues Reich
master
Reich und klicken Sie auf dieAdd Realm
Schaltfläche.stackoverflow-demo
als Namen ein.Create
.stackoverflow-demo
statt desmaster
Reiches stehen.Siehe Erstellen eines neuen Bereichs
Erstellen Sie einen neuen Benutzer
Users
Link linksAdd User
Schaltflächeusername
(zBbob
)User Enabled
istSave
Siehe Erstellen eines neuen Benutzers
Erstellen Sie neue Rollen
Roles
LinkAdd Role
bank_teller
,account_owner
unduser
Auch hier kann nicht assoziieren Ihre Benutzer mit den Rollen. Für unsere Zwecke wird dies nicht benötigt.
Siehe Rollen
Erstellen Sie einen Client
Clients
LinkCreate
bank-api
für dieClient ID
Root URL
Eingabehttp://127.0.0.1:8080/bank-api
Save
Client Protocol
istopenid-connect
Access Type
inconfidential
Authorization Enabled
zuOn
Save
.Authorization
Oben sollte eine neue Registerkarte angezeigt werden.Authorization
Registerkarte und dannSettings
Decision Strategy
istUnanimous
Decision Strategy
Sehen:
Erstellen Sie benutzerdefinierte Bereiche
Authorization
RegisterkarteAuthorization Scopes
>Create
, um dieAdd Scope
Seite aufzurufenaccount:view
den Namen ein und drücken Sie die Eingabetaste.Erstellen Sie "Kontoressource anzeigen"
Authorization
LinkResources
Create
View Account Resource
sowohl fürName
als auch einDisplay name
account/{id}
für dieURI
account:view
in dasScopes
Textfeld einSave
Siehe Erstellen von Ressourcen
Erstellen Sie Ihre Richtlinien
Authorization
Klicken Sie erneut unter der Registerkarte aufPolicies
Role
aus derCreate Policy
Dropdown-ListeName
Abschnitt Folgendes einOnly Bank Teller and Account Owner Policy
Realm Roles
Sie unterbank_teller
und ausaccount_owner
RolleLogic
istPositive
Save
Policies
LinkRole
erneut ausCreate Policy
Dropdown-Liste.Only Account Owner Policy
für dieName
Realm Roles
Sie unter Auswählenaccount_owner
Logic
istPositive
Save
Policies
Link. Sie sollten nun Ihre neu erstellten Richtlinien sehen.Siehe Rollenbasierte Richtlinie
Beachten Sie, dass Keycloak viel leistungsfähigere Richtlinien hat. Siehe Verwalten von Richtlinien
Erstellen Sie eine ressourcenbasierte Berechtigung
Authorization
Klicken Sie erneut unter der Registerkarte aufPermissions
Resource-Based
View Account Resource Permission
für dieName
Resources
TypView Account Resource Permission
Apply Policy
Sie unter AuswählenOnly Bank Teller and Account Owner Policy
Decision Strategy
istUnanimous
Save
Siehe Erstellen von ressourcenbasierten Berechtigungen
Puh...
Auswerten der ressourcenbasierten Berechtigung
Authorization
Registerkarte ausEvaluate
User
enterbob
Roles
Sie unter Auswählenuser
Resources
AuswählenView Account Resource
und klicken Sie aufAdd
View Account Resource with scopes [account:view]
, um die Ergebnisse anzuzeigen , und Sie sollten sehenDENY
.Only Bank Teller and Account Owner Policy
. Testen wir dies, um sicherzustellen, dass dies wahr ist!Back
Link direkt über dem Bewertungsergebnisaccount_owner
und klicken Sie aufEvaluate
. Sie sollten das Ergebnis nun als sehenPERMIT
. Gleiches Angebot, wenn Sie zurückgehen und die Rolle in ändernbank_teller
Siehe Auswerten und Testen von Richtlinien
Erstellen Sie eine bereichsbezogene Berechtigung
Permissions
AbschnittScope-Based
diese Zeit in derCreate Permission
Dropdown-Liste aus.Name
unter einView Account Scope Permission
Scopes
unter einaccount:view
Apply Policy
unter einOnly Account Owner Policy
Decision Strategy
istUnanimous
Save
Siehe Erstellen bereichsbasierter Berechtigungen
Zweiter Testlauf
Bewertung unserer neuen Änderungen
Authorization
AbschnittEvaluate
bob
bank_teller
View Account Resource
und klickenAdd
Evaluate
und wir sollten bekommenDENY
.bank_teller
Zugang zum,resource
aber nicht zum hatscope
. Hier wird eine Berechtigung als wahr und die andere als falsch ausgewertet. Da der Ressourcenserver aufDecision Strategy
eingestellt ist,Unanimous
ist die endgültige EntscheidungDENY
.Settings
unter derAuthorization
Registerkarte auf und ändern Sie dasDecision Strategy
zuAffirmative
und kehren Sie erneut zu den Schritten 1-6 zurück. Dieses Mal sollte das Endergebnis seinPERMIT
(eine Erlaubnis ist wahr, also ist die endgültige Entscheidung wahr).Decision Strategy
wieder anUnanimous
. Kehren Sie erneut zu den Schritten 1 bis 6 zurück, setzen Sie diesmal jedoch die Rolle alsaccount_owner
. Dieses Mal ist das Endergebnis wiederPERMIT
sinnvoll, da deraccount_owner
Zugriff sowohl auf dasresource
als auch auf das hatscope
.Ordentlich :) Hoffe das hilft.
quelle
User Management Access (UMA)
wo der Ressourcenbesitzer dem anfragenden Teilnehmer Zugriff auf eine geschützte Ressource gewähren kann (zumindest ist dies meine Interpretation).account_owner has access to the account:view scope
. Wie stellen Sie die Beziehung zwischen dieser Rolle und diesem Bereich her?Ich wollte die Autorisierung über reine HTTP-Methoden erzwingen, ohne den Adapter zu verwenden, da Lua keinen Adapter hatte. Hoffe, diese Antwort hilft Menschen, die nach einer nicht adapterbasierten Methode suchen.
Wenn Sie nach dem Adapter suchen, lesen Sie die Kurzanleitung ist der beste Ort zu beginnen. Besonders das Spring Boot Authz Beispiel .
Für eine reine HTTP-basierte Implementierung:
Schritt 1:
Definieren Sie die Richtlinien und Berechtigungen in der Keycloak Admin-Benutzeroberfläche
Schritt 2
Haben Sie eine interne Zuordnung, welche HTTP-Pfade zu welchen Ressourcen gehören und welche Bereiche für jeden Pfad erforderlich sind. Dies kann auch in der gespeichert werden Konfigurationsdatei gespeichert werden . Wenn eine bestimmte Route aufgerufen wird, rufen Sie den Keycloak-Token-Endpunkt auf, um die Ansprüche des Zugriffstokens zu überprüfen.
{ "policy-enforcer": { "user-managed-access" : {}, "enforcement-mode" : "ENFORCING" "paths": [ { "path" : "/someUri/*", "methods" : [ { "method": "GET", "scopes" : ["urn:app.com:scopes:view"] }, { "method": "POST", "scopes" : ["urn:app.com:scopes:create"] } ] } ] } }
Wenn Sie einen Adapter verwenden und den Pfad oder die Ressource nicht angeben, sucht der Adapter intern nach den Pfaden und Ressourcen von Keycloak .
Schritt 3:
Verwenden Sie den Token-Endpunkt, um die Berechtigungen abzurufen oder auszuwerten . Sie können
response_mode
Parameter verwenden, um entweder die endgültige Entscheidung zu erhalten (ob Zugriff gewährt werden soll) oder um die gesamten Berechtigungen abzurufen.curl -X POST \ http://${host}:${port}/auth/realms/${realm}/protocol/openid-connect/token \ -H "Authorization: Bearer ${access_token}" \ --data "grant_type=urn:ietf:params:oauth:grant-type:uma-ticket" \ --data "permission=Resource A#Scope A"
Wenn die Autorisierungsanforderung keiner Berechtigung zugeordnet ist,
403
wird stattdessen ein HTTP-Statuscode zurückgegeben.quelle