Mikroserwisy a autoryzacja

DKN
  • Rejestracja:ponad 4 lata
  • Ostatnio:8 miesięcy
  • Postów:128
0

Temat dość gruby.
Przechodzimy z wielkiego monolitu na mikro.
Chciałbym się spytać jak u Was wyglada kwestia zarządzania uprawnieniami. Dajmy ze jest 10 domen i pytanie czy w każdej domenie można autonomicznie parametryzować dostęp klienta do produktu?

Czy istnieje jedna domena parametryzujaca uprawnienia klienta?


Z każdym dniem czuje się głupszym programista.
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 7 godzin
  • Postów:3277
3

U mnie jest dość prosto. AGW dostaje token JWT uwierzytelniający żądanie, dorzuca nagłówek z uprawnieniami (kiepskie rozwiązanie, ale akurat w tym przypadku konieczne), dopisuje do nagłówka każdego żądania role użytkownika i wysyła dalej. Usługi za AGW odpowiadają za autoryzację, czyli sprawdzają czy konkretna rola (albo użytkownik) ma prawo wywołać konkretną akcję w usłudze. Jeżeli potrzebne jest wykonanie dodatkowego zapytania, to nagłówek z AGW jest do niego dołączany. Jak coś nie pasuje, to któraś usługa zwraca 403, które leci sobie łańcuszkiem z powrotem do klienta, który zainicjował żądanie.

DKN
  • Rejestracja:ponad 4 lata
  • Ostatnio:8 miesięcy
  • Postów:128
0

@piotrpo: tylko ze tu jest właśnie minus który widzę.
IMO upraszczając to biznesowe serwisy powinny robić tylko biznesowe rzeczy. Authorization jest rzeczą techniczna. Konieczna jest sepracja. W obecnym projekcie zaproponowałem rozwiązanie gdzie auth server enkapsulowalby uprawnienia. Wyglądałoby to tak seq:

  1. Apigtw dostaje usera i przedmiot na którym user działa. Np „Jako klient X załóż lokatę o wysokości y”
  2. Apigtw nie wie, wiec uderza do auth serv. Tutaj dokonywany jest cały proces sprawdzenia uprawnień
  3. Apigtw dostaje odp czy może przesłać do domeny czy nie.

Chciałem zapytać co o tym sądzicie?


Z każdym dniem czuje się głupszym programista.
piotrpo
Apigtw nie wie, wiec uderza do auth serv Czego nie wie?
piotrpo
Nie ty jeden, nie ty jeden (nawiązuję do stopki)
DKN
Nie wie czy go zautoryzowac wiec uderza do miejsce gdzie ta informacja jest
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 7 godzin
  • Postów:3277
0

@DKN: Moim zdaniem trochę zbyt skomplikowane. Ostatecznie też sprawdzasz w tym docelowym serwisie uprawnienia, tylko nie odczytujesz ich z samego requesta, a z jakiegoś dodatkowego zewnętrznego API.

Aventus
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
2

Przede wszystkim to jak wspomniał już słusznie @piotrpo JWT jest tutaj kluczem. Natomiast co do tego:

IMO upraszczając to biznesowe serwisy powinny robić tylko biznesowe rzeczy.

Serwisy powinny być wewnętrznie podzielone na warstwy, dzięki czemu warstwa aplikacji może zająć się uwierzytelnianiem i autoryzacją. Logika biznesowa pozostaje wtedy nietknięta, bo to czy ktoś może wykonać daną operację sprawdzi warstwa aplikacja- web API etc.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
DKN
  • Rejestracja:ponad 4 lata
  • Ostatnio:8 miesięcy
  • Postów:128
0

Co do JWT to się zgadzam, ze on zawsze jest kluczem, czyli nośnikiem informacji, to z niego są wyciągane potrzebne info do autoryzacji.

To ze aplikacje są podzielone na warstwy to tez sprawa jasna. Jednak są pewne rzeczy które są problemem.
Dajmy ze są 2 poziomy granulacji:
Domena (zbiór subdomen, np. Domena ranskacji. Domena Klient..)
Subdomna/Mikroserwis (np, w domenie klienta będziemy miec osobne mikroserwisy. mikroserwis dla ankiet dla klienta, mikroserwis dla utrzymiwania podstawowych info o kliencie, mikroserwis do walidacji dowodów osobistych z baza MSW itd..)

Wprowadzając koncepcje gdzie każdy mikroserwis musi trzymać odp. za autoryzacje zmuszamy by każdy zespół brał na siebie bezpieczeństwo.

We wcześniejszym poście chciałem przekazać ze chodzi mi by oddzielić kwestie techniczne i biznesowe, przez odpowiednie routowanie ruchu. Czyli stworzenia warstwy filtracji na poziomie APIGTW, który by rozmawiał z jednym serwisem autoryzacyjnym w domenie.


Z każdym dniem czuje się głupszym programista.
Aventus
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
2

To już zależy czy uważasz to za problem, czy też nie. Dla mnie to jednak trochę wyolbrzymianie problemu bo kwestia autoryzacji w oparciu o JWT to zazwyczaj tylko kwestia podpięcia odpowiedniej biblioteki/frameworku. Można to nawet jeszcze bardziej uprościć pakując to w wewnętrzną paczkę używaną przez wszystkie serwisy.

Ewentualnie, jeśli masz taki klaster serwisów odpowiedzialny za konkretny konkursy biznesowy, to można postawić przed nimi API gateway i tam sprawdzać autoryzację.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
piotrpo
Ja staram się po przykrych doświadczeniach unikać częstych zmian na API Gateway'em. To praktycznie zawsze jest SPoF.
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 7 godzin
  • Postów:3277
3

@DKN: To niesie ze sobą bardzo spory problem, API Gateway, który powinien odpowiadać jedynie za routing, nagle musi wiedzieć kto może obsłużyć konkretne żądania. Jeżeli te uprawnienia da się rozwiązać na poziomie endpointów - luzik, da się zrobić. Co jeżeli, będziesz musiał rozróżniać uprawnienia na poziomie konkretnych encji? Np. wniosek urlopowy zatwierdza manager, ale tylko w odniesieniu do swoich podwładnych? Będziesz sprawdzał, czy w jakimś post /requests/1234/acceptance jest w strukturze organizacyjnej powiązanie pomiędzy autorem wniosku 1234 a managerem odczytanym z JWT?

Możesz to zrobić te w ten sposób, że API Gateway przekieruje idący z zewnątrz JWT, lub go zastąpi czymś własnym (jesteśmy już w wewnętrznych sieciach, możemy sobie w miarę ufać) i w ostateczności serwis docelowy dostaje jakiś nagłówek:

Kopiuj
{
userName=Kowalski,
roles:
  [EMPLOYEE, MANAGER]
}

Samo sprawdzenie czy JWT jest w porządku dalej przeprowadza się na poziomie ApiGtw, natomiast potwierdzenie uprawnień do zasobu tam gdzie się ten zasób trzyma.

Aventus
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
1

@piotrpo: API gateway to taka nazwa umowna, można to nazwać inaczej. Poza tym nie jest prawdą, że API gateway służy tylko do routingu. Chociażby agregacja danych z kilku źródeł i zwrócenie do klienta często również leży w gestii takiego serwisu. Jeśli więc byłaby taka potrzeba, to nie widzę przeszkód aby mieć taki serwis odpowiadający za uwierzytelnianie i autoryzację. Bądźmy pragmatyczni.

Zwróć uwagę że są usługi takie jak np. Azure API Management, który również jest jakby API gateway i serwisem uwierzytelniajacym w jednym.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
markone_dev
Temat jest o autoryzacji nie uwierzytelnianiu i zgadzam się z @piotrpo że APGW nie powinien autoryzować operacji bo czasem ta logika znajduje się na poziomie encji/dziedziny biznesowej a nie endpointów.
Aventus
Ok, faktycznie mowa przede wszystkim o autoryzacji. Jeśli zaś chodzi o resztę, to zależy to całkowicie od konkretnego przypadku. Jeśli jest to tak drobnoziarniste że musi być sprawdzane na poziomie logiki biznesowej, to oczywiście ma to sens. W innym przypadku jak już pisałem może to być sprawdzane na wyższym poziomie, i również nie widzę przeszkód. Poza tym przedstawiłem to jako potencjalną alternatywę, ale jak już wspomniałem problem zapewne nie jest taki duży jak się wydaje.
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 7 godzin
  • Postów:3277
0

@Aventus: Jeżeli Rolą serwisu jest agregacja danych z kilku serwisów i wysyłanie ich na zewnątrz, to nie jest API Gateway. Nie żeby było to coś złego, ale w dyskusji warto używać precyzyjnych sformułowań. OP rozczłonkowuje jakiś monolit. Ma do tego z grubsza 2 możliwe podejścia:

  • Postawić API Gatweay, wydzielać kawałki domeny (po istniejących endpointach) i w miarę postępu przepinać pojedynczo ścieżki na inne serwisy. W tym przypadku warto mieć bardzo ograniczoną odpowiedzialność API Gateway, bo to pozwala na utrzymanie większej otwartości na zmiany i przy okazji ogranicza ryzyko, że coś walnie. Jeżeli wrzucisz dużą odpowiedzialność do API Gateway, to musisz dokonywać tam zmian przy wielu okazjach, czyli tracisz/ograniczasz jeden z większych atutów architektury uS, czyli ograniczony zakres zmian.

  • Zostawić ten serwis, razem z publicznym API i wyciągać poszczególne kawałki gdzieś dalej. Też niby można, ale łatwo nie będzie.

    Podobnie, używając argumentu "pragmatyczności", można uznać, ze po co dzielić serwis na warstwy, jak właściwie wszystko da się zaimplementować na widoku. Moim zdaniem podobna sytuacja.

Aventus
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
2

@piotrpo: API Gateway może, ale nie musi być zwykłym "pass through" dla poszczególnych requestow. Ale ok, nie ciagnijmy już offtopu.

An API gateway acts as a reverse proxy to accept all application programming interface (API) calls, aggregate the various services required to fulfill them, and return the appropriate result.

https://www.redhat.com/en/topics/api/what-does-an-api-gateway-do

Implement an API gateway that is the single entry point for all clients. The API gateway handles requests in one of two ways. Some requests are simply proxied/routed to the appropriate service. It handles other requests by fanning out to multiple services.

https://microservices.io/patterns/apigateway.html


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
edytowany 2x, ostatnio: Aventus
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)