Wiem, że spóźniłem się 2+ lata, ale myślę, że podzielę się tym, co wiem i miejmy nadzieję, że złagodzę ból dla przyszłych czytelników. Pełna przejrzystość - w żadnym wypadku nie jestem ekspertem od Keycloak / OAuth / OIDC i wiem, że to głównie z czytania dokumentów, książek, starego dobrego YouTube'a i zabawy z narzędziem.
Ten post będzie składał się z dwóch części:
- Postaram się odpowiedzieć na wszystkie Twoje pytania najlepiej jak potrafię
- Pokażę ci wszystko, jak możesz bawić się zasadami / zakresami / uprawnieniami w Keycloak bez konieczności wdrażania oddzielnej aplikacji, aby lepiej zrozumieć niektóre z podstawowych pojęć w tym wątku. Zwróć jednak uwagę, że ma to głównie na celu rozpoczęcie pracy. Używam
Keycloak 8.0.0.
Część I.
Kilka terminów, zanim zaczniemy:
- W Keycloak możesz utworzyć 2 typy uprawnień: oparte na zasobach i na zakresie .
- Mówiąc najprościej, w przypadku
Resource-Baseduprawnień stosujesz je bezpośrednio do swojego zasobu
- Aby uzyskać
Scoped-Basedpozwolenie, stosujesz je do zakresu (-ów) lub zakresu (-ów) i zasobu.
Czy najlepszą praktyką jest tworzenie tylko jednego zakresu „widoku” i używanie go w wielu zasobach (konto, transakcja itp.)? A może powinienem utworzyć zakres „viewAccount”, zakres „viewTransaction” itp.?
Zakresy reprezentują zestaw praw do chronionego zasobu. W twoim przypadku masz 2 zasoby: accounti transactiondlatego skłaniałbym się do drugiego podejścia.
W dłuższej perspektywie, o globalny viewzakres związaną ze wszystkimi swoimi zasobami (np account, transaction, customer, settlement...) sprawia, że trudno jest autoryzacja zarówno zarządzanie i dostosować się do zmian wymagań bezpieczeństwa.
Oto kilka przykładów, które możesz sprawdzić, aby poczuć projekt
Zwróć jednak uwagę - nie twierdzę, że nie należy udostępniać zakresów między zasobami. W rzeczywistości Keycloakpozwala na to dla zasobów z tym samym type. Możesz na przykład potrzebować obu viewAccounti viewTransactionzakresu, aby odczytać transakcję na danym rachunku (w końcu możesz potrzebować dostępu do rachunku, aby wyświetlić transakcje). Twoje wymagania i standardy będą miały duży wpływ na Twój projekt.
Czy w przypadku każdego praktycznego połączenia zasobów i zakresu zwykle tworzy się pozwolenie?
Przepraszam, nie do końca rozumiem pytanie, więc będę trochę szerszy. Aby przyznać / odmówić dostępu resource, musisz:
- Zdefiniuj swoje zasady
- Określ swoje uprawnienia
- Zastosuj swoje zasady do swoich uprawnień
- Skojarz swoje uprawnienia z
scopelub resource(lub obydwoma)
aby egzekwowanie zasad zaczęło obowiązywać. Zobacz proces autoryzacji .
To, jak sobie z tym poradzisz, zależy wyłącznie od Ciebie. Możesz na przykład:
Zdefiniuj indywidualne zasady i przypisz je do odpowiednich uprawnień.
Jeszcze lepiej, zdefiniuj indywidualne zasady, a następnie zgrupuj wszystkie powiązane zasady w ramach aggregatedpolityki (polityki zasad), a następnie skojarz tę zagregowaną politykę z scope-baseduprawnieniem. Możesz mieć to scoped-baseduprawnienie dotyczące zarówno zasobu, jak i całego powiązanego z nim zakresu.
Możesz też dalej rozdzielić swoje uprawnienia, wykorzystując dwa oddzielne typy. Możesz tworzyć uprawnienia wyłącznie dla swoich zasobów za pomocą resource-basedtypu uprawnienia i oddzielnie kojarzyć inne uprawnienia wyłącznie z zakresem za pomocą scope-basedtypu uprawnienia.
Masz opcje.
Co robi Keycloak, jeśli istnieje wiele uprawnień pasujących do danego zasobu / zakresu?
To zależy od
- Serwer zasobów
Decision Strategy
- Każde pozwolenie
Decision Strategy
LogicWartość każdej polisy .
LogicWartość jest podobna Java !operatora. Może to być Positivelub Negative. Gdy Logicto Positive, ostateczna ocena polityki pozostaje niezmieniona. Kiedy jej Negative, ostateczny wynik jest zanegowany (np. Jeśli w ocenie zasady jest fałsz i tak Logicjest Negative, to tak będzie true). Aby uprościć sprawę, załóżmy, że opcja Logicjest zawsze ustawiona na Positive.
To Decision Strategyjest to, czym naprawdę chcemy się zająć. Decision StrategyMoże być albo Unanimousalbo Affirmative. Z dokumentów,
Strategia decyzyjna
Ta konfiguracja zmienia sposób, w jaki aparat oceny zasad decyduje, czy zasób lub zakres powinien zostać przyznany na podstawie wyniku wszystkich ocenionych uprawnień. Twierdzący oznacza, że co najmniej jedno zezwolenie musi dać pozytywną decyzję, aby przyznać dostęp do zasobu i jego zakresów. Jednogłośność oznacza, że wszystkie pozwolenia muszą zostać ocenione pozytywnie, aby ostateczna decyzja była również pozytywna. Na przykład, jeśli dwa uprawnienia do tego samego zasobu lub zakresu są ze sobą w konflikcie (jedno z nich przyznaje dostęp, a drugie odmawia dostępu), uprawnienie do zasobu lub zakresu zostanie przyznane, jeśli wybrana strategia jest potwierdzona. W przeciwnym razie pojedyncza odmowa dowolnego uprawnienia spowoduje również odmowę dostępu do zasobu lub zakresu.
Skorzystajmy z przykładu, aby lepiej zrozumieć powyższe. Załóżmy, że masz zasób z 2 uprawnieniami i ktoś próbuje uzyskać do niego dostęp (pamiętaj, że Logicdotyczy Positivewszystkich zasad). Teraz:
Permission Onema Decision Strategyzestaw do Affirmative. Ma również 3 zasady, w których każda z nich ocenia:
Ponieważ jedna z zasad jest ustawiona na true, Permission Onejest ustawiona na true(Twierdząca - tylko 1 musi być true).
Permission Twoma Decision Strategyzestaw Unanimousz 2 zasadami:
W tym przypadku Permission Twojest tak, falseponieważ jedna zasada jest fałszywa (jednogłośnie - wszystkie muszą być true).
- Teraz nadchodzi ostateczna ocena. Jeśli serwer zasobów
Decision Strategyjest ustawiony na Affirmative, dostęp do tego zasobu zostanie przyznany, ponieważPermission One jest true. Jeśli z drugiej strony serwer zasobów Decision Strategyjest ustawiony na Unanimous, dostęp byłby zabroniony.
Widzieć:
Będziemy to ponownie odwiedzać. Wyjaśniam, jak ustawić serwer zasobówDecision Strategy W części II .
więc na przykład mógłbym mieć pozwolenie na dostęp do „kont” i pozwolenie na zakres „widok”, więc miałbym uprawnienia do przeglądania kont?
Krótka odpowiedź brzmi: tak. Teraz rozwińmy to trochę :)
Jeśli masz następujący scenariusz:
- Serwer zasobów jest
Decision Strategyustawiony na UnanimouslubAffirmative
- Uprawnienie do dostępu do
account/{id}zasobu totrue
- Uprawnienie do dostępu do
viewzakresu totrue
Otrzymasz dostęp do przeglądania konta.
true+ truejest równe truepod Affirmativelub Unanimous Decision Strategy.
Teraz, jeśli to masz
- Serwer zasobów jest
Decision Strategyustawiony naAffirmative
- Uprawnienie do dostępu do
account/{id}zasobu totrue
- Uprawnienie do dostępu do
viewzakresu tofalse
Otrzymasz również dostęp do przeglądania konta.
true+ falsejest truew ramach Affirmativestrategii.
Chodzi o to, że dostęp do danego zasobu zależy również od twojej konfiguracji, więc bądź ostrożny, ponieważ możesz nie chcieć drugiego scenariusza.
Ale czy mam rację, że to oznacza, że potrzebuję polityki dla każdej starszej grupy, do której mógłby należeć użytkownik?
Nie jestem pewien, jak Keycloak zachowywał się 2 lata temu, ale możesz określić zasady oparte na grupach i po prostu dodać wszystkie swoje grupy do tej polityki. Z pewnością nie musisz tworzyć jednej polityki na grupę.
Na przykład, jeśli pełnię rolę „helpdesk”, potrzebuję zasady „członkostwa w helpdesku”, którą mogę następnie dodać do uprawnienia „viewAccount”. Czy to jest poprawne?
Dość dużo. Można to ustawić na wiele sposobów. Na przykład możesz:
- Utwórz zasób (np.
/account/{id}) I powiąż go z account:viewzakresem.
- utwórz zasadę opartą na rolach i dodaj
helpdeskrolę w ramach tej polityki
- Utwórz
Scope-Baseduprawnienie o nazwie viewAccounti powiąż je z scope, resourceipolicy
W części II ustawimy coś podobnego.
część druga
Keycloak ma zgrabne małe narzędzie, które pozwala przetestować wszystkie zasady. Co więcej, w rzeczywistości nie trzeba uruchamiać kolejnego serwera aplikacji i wdrażać oddzielnej aplikacji, aby to zadziałało.
Oto scenariusz, który skonfigurujemy:
- Stworzymy nowe królestwo o nazwie
stackoverflow-demo
- Stworzymy
bank-apiklienta w tym królestwie
- Zdefiniujemy zasób wywoływany
/account/{id}dla tego klienta
account/{id}Będzie miał account:viewzakres
- Stworzymy użytkownika o nazwie
bobw nowej dziedzinie
- Będziemy także tworzyć trzy role:
bank_teller, account_owneriuser
- Nie będziemy kojarzyć się
bobz żadnymi rolami. Nie jest to teraz potrzebne.
- Skonfigurujemy następujące dwie
Role-Basedzasady:
bank_telleri account_ownermieć dostęp do /account/{id}zasobu
account_ownerma dostęp do account:viewzakresu
user nie ma dostępu do zasobu lub zakresu
- Będziemy bawić się
Evaluatenarzędziem, aby zobaczyć, jak można przyznać lub odmówić dostępu.
Wybaczcie, ten przykład jest nierealny, ale nie znam sektora bankowego :)
Konfiguracja Keycloak
Pobierz i uruchom 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
Utwórz początkowego administratora
- Iść do
http://localhost:8080/auth
- Kliknij na
Administration Console łącze
- Utwórz administratora i zaloguj się
Odwiedź stronę Pierwsze kroki , aby uzyskać więcej informacji. Do naszych celów wystarczy powyższe.
Przygotowanie sceny
Stwórz nowe królestwo
- Najedź myszką po
masterkrólestwie i kliknijAdd Realm przycisk.
- Wchodzić
stackoverflow-demo jako nazwę.
- Kliknij
Create .
- W lewym górnym rogu powinno być teraz napisane
stackoverflow-demozamiast mastersfery.
Zobacz Tworzenie nowego królestwa
Utwórz nowego użytkownika
- Kliknij
Userslink po lewej stronie
- Kliknij
Add Userprzycisk
- Wpisz
username(np. bob)
- Upewnij się, że
User Enabledjest włączony
- Kliknij
Save
Zobacz Tworzenie nowego użytkownika
Utwórz nowe role
- Kliknij
Rolesłącze
- Kliknij
Add Role
- Dodaj następujące role:
bank_teller, account_owneriuser
Ponownie, nie kojarz swojego użytkownika z rolami. Dla naszych celów nie jest to potrzebne.
Zobacz role
Utwórz klienta
- Kliknij
Clientsłącze
- Kliknij
Create
- Wejdź
bank-apidoClient ID
- Do
Root URLwejściahttp://127.0.0.1:8080/bank-api
- Kliknij
Save
- Upewnij się, że
Client Protocoltakopenid-connect
- Zmień
Access Typenaconfidential
- Zmień
Authorization EnablednaOn
- Przewiń w dół i naciśnij
Save. NowyAuthorization górze powinna pojawić się karta.
- Kliknij
Authorizationkartę, a następnieSettings
- Upewnij się, że
Decision Strategyjest ustawiony naUnanimous
- To jest serwer zasobów
Decision Strategy
Widzieć:
Utwórz niestandardowe zakresy
- Kliknij
Authorizationkartę
- Kliknij
Authorization Scopes>, Createaby wyświetlić Add Scopestronę
- Wpisz
account:viewnazwę i naciśnij Enter.
Utwórz „Wyświetl zasoby konta”
- Kliknij
Authorizationlink powyżej
- Kliknij
Resources
- Kliknij
Create
- Wpisz
View Account Resourcezarówno, jak NameiDisplay name
- Wejdź
account/{id}doURI
- Wpisz
account:vieww polu Scopestekstowym
- Kliknij
Save
Zobacz Tworzenie zasobów
Utwórz swoje zasady
- Ponownie w
Authorizationzakładce kliknijPolicies
- Wybierz
RolezCreate Policy rozwijanej
- W
Namesekcji wpiszOnly Bank Teller and Account Owner Policy
- W obszarze
Realm Roleswybierz zarówno rolę, jak bank_telleriaccount_owner
- Upewnij się, że
Logicjest ustawiona naPositive
- Kliknij
Save
- Kliknij
Policies łącze
- Wybierz
Roleponownie z listy Create Policyrozwijanej.
- Tym razem użyj
Only Account Owner PolicydlaName
- Pod
Realm Roleswybierzaccount_owner
- Upewnij się, że
Logicjest ustawiona naPositive
- Kliknij
Save
- Kliknij
Policieslink u góry, powinieneś zobaczyć nowo utworzone zasady.
Zobacz Zasady oparte na rolach
Zwróć uwagę, że Keycloak ma znacznie silniejsze zasady. Zobacz Zarządzanie zasadami
Utwórz uprawnienie oparte na zasobach
- Ponownie w
Authorizationzakładce kliknijPermissions
- Wybierz
Resource-Based
- Wpisz
View Account Resource PermissiondlaName
- Pod
ResourcestypemView Account Resource Permission
- Pod
Apply PolicywybierzOnly Bank Teller and Account Owner Policy
- Upewnij się, że
Decision Strategyjest ustawiony naUnanimous
- Kliknij
Save
Zobacz Tworzenie uprawnień opartych na zasobach
Uff ...
Ocena uprawnienia opartego na zasobach
- Ponownie na
Authorizationkarcie wybierzEvaluate
- Pod
Userwejściembob
- Pod
Roleswybierzuser
- Tutaj będziemy kojarzyć naszego użytkownika z naszymi utworzonymi rolami.
- Pod
Resourceswybierz View Account Resourcei kliknijAdd
- Kliknij Oceń.
- Rozwiń,
View Account Resource with scopes [account:view]aby zobaczyć wyniki i powinieneś zobaczyć DENY.

- Ma to sens, ponieważ zezwalamy tylko dwóm rolom na dostęp do tego zasobu za pośrednictwem
Only Bank Teller and Account Owner Policy. Przetestujmy to, aby upewnić się, że to prawda!
- Kliknij
Backlink tuż nad wynikiem oceny
- Zmień rolę boba na
account_owneri kliknij Evaluate. Powinieneś teraz zobaczyć wynik jako PERMIT. To samo, jeśli wrócisz i zmienisz rolę nabank_teller
Zobacz Ocenianie i testowanie zasad
Utwórz uprawnienie oparte na zakresie
- Wróć do
Permissionssekcji
- Wybierz
Scope-Basedten czas z listy Create Permissionrozwijanej.
- Pod
Name, wprowadźView Account Scope Permission
- Pod
Scopes, wprowadźaccount:view
- Pod
Apply Policy, wprowadźOnly Account Owner Policy
- Upewnij się, że
Decision Strategyjest ustawiony naUnanimous
- Kliknij
Save
Zobacz Tworzenie uprawnień opartych na zakresie
Drugi przebieg próbny
Ocena naszych nowych zmian
- Wróć do
Authorizationsekcji
- Kliknij
Evaluate
- Użytkownik powinien być
bob
- Role powinny być
bank_teller
- Zasoby powinny być
View Account Resourcei kliknijAdd
- Kliknij
Evaluatei powinniśmy dostać DENY.
- Ponownie nie powinno to być zaskoczeniem, ponieważ
bank_tellerma dostęp do, resourceale nie scope. Tutaj jedno zezwolenie jest oceniane jako prawdziwe, a drugie jako fałszywe. Biorąc pod uwagę, że serwer zasobów Decision Strategyjest ustawiony na Unanimous, ostateczną decyzją jest DENY.
- Kliknij na
Settingspod Authorizationzakładki i zmienić Decision Strategysię Affirmativei wrócić do kroków 1-6 ponownie. Tym razem ostateczny wynik powinien być PERMIT(jedno zezwolenie jest prawdziwe, więc ostateczna decyzja jest prawdziwa).
- Ze względu na kompletność przełącz serwer zasobów z
Decision Strategypowrotem na Unanimous. Ponownie wróć do kroków od 1 do 6, ale tym razem ustaw rolę jako account_owner. Tym razem ostateczny wynik jest znowu PERMITsensowny, biorąc pod uwagę, że account_ownerma dostęp zarówno do, jak resourcei scope.
Schludnie :) Mam nadzieję, że to pomoże.