Microservice-Authentifizierungsstrategie

138

Es fällt mir schwer, eine anständige / sichere Authentifizierungsstrategie für eine Microservice-Architektur zu wählen. Der einzige SO-Beitrag, den ich zu diesem Thema gefunden habe, ist dieser: Single Sign-On in der Microservice-Architektur

Meine Idee hier ist, in jedem Dienst (z. B. Authentifizierung, Messaging, Benachrichtigung, Profil usw.) einen eindeutigen Verweis auf jeden Benutzer (ganz logisch dann seinen user_id) und die Möglichkeit zu haben, den aktuellen Benutzer abzurufen, idwenn er angemeldet ist.

Aus meinen Forschungen geht hervor, dass es zwei mögliche Strategien gibt:

1. Gemeinsame Architektur

Gemeinsame Architektur

Bei dieser Strategie ist die Authentifizierungs-App ein Dienst unter anderen. Aber jeder Dienst muss in der Lage sein, die Konvertierung durchzuführen session_id=>, user_idalso muss es absolut einfach sein. Deshalb dachte ich an Redis, das den Schlüssel speichern würde: Wert session_id:user_id.

2. Firewall-Architektur

Firewall-Architektur

Bei dieser Strategie spielt der Sitzungsspeicher keine Rolle, da er nur von der authentifizierenden App verwaltet wird. Dann user_idkann das an andere Dienste weitergeleitet werden. Ich dachte an Rails + Devise (+ Redis oder Mem-Cache oder Cookie-Speicherung usw.), aber es gibt unzählige Möglichkeiten. Das einzige, was zählt, ist, dass Service X den Benutzer niemals authentifizieren muss.


Wie vergleichen sich diese beiden Lösungen in Bezug auf:

  • Sicherheit
  • Robustheit
  • Skalierbarkeit
  • Benutzerfreundlichkeit

Oder schlagen Sie vielleicht eine andere Lösung vor, die ich hier nicht erwähnt habe?

Ich mag die Lösung Nr. 1 besser, habe aber nicht viel Standardimplementierung gefunden, die mich in der Tatsache sichern würde, dass ich in die richtige Richtung gehe.

Ich hoffe meine Frage wird nicht geschlossen. Ich weiß nicht wirklich, wo ich es sonst fragen soll.

Danke im Voraus

Augustin Riedinger
quelle
1
Würden Sie bitte weitere Einzelheiten zu dem, was Sie erreichen möchten, angeben? Im ersten Fall erfolgt die Authentifizierung gegen Redis oder in den Diensten selbst? Redis fehlt im zweiten Diagramm. Ist das beabsichtigt?
Plamen Petrov
Ich habe einige Informationen hinzugefügt. Bitte lassen Sie mich wissen, dass es noch unklar ist. Vielen Dank!
Augustin Riedinger
Haben Sie über die Idee nachgedacht, einen Microservice zu erstellen, der das OAuth-Protokoll verwendet, und den von Ihrem anderen Dienst verwendeten Token?
Tiarê Balbi
Ich bin neugierig auf diese Lösung, aber ich verstehe immer noch nicht, wie sie in der Praxis funktionieren wird. Wissen Sie, wo ich einige Standardimplementierungen finden könnte?
Augustin Riedinger
@AugustinRiedinger, danke, dass du das gemacht hast. Ich zerlege auch meine monolithische Webanwendung in Mikrodienste, indem ich kleine Schritte unternehme. In Ihrem Fall sind die Dienste 1-n zustandslos oder zustandsvoll. Haben Sie darüber nachgedacht, Sitzungen in jedem dieser Dienste zu verwalten, falls sie voll sind? Danke
Manchanda. P

Antworten:

61

Nach meinem Verständnis besteht eine gute Möglichkeit zur Lösung darin, das OAuth 2-Protokoll zu verwenden (weitere Informationen dazu finden Sie unter http://oauth.net/2/ ).

Wenn sich Ihr Benutzer bei Ihrer Anwendung anmeldet, erhält er ein Token und kann mit diesem Token an andere Dienste senden, um sie in der Anforderung zu identifizieren.

OAuth 2-Modell

Beispiel für ein verkettetes Microservice-Design Architekturmodell

Ressourcen:

Tiarê Balbi
quelle
1
Danke, es ist ziemlich klar. Ich fand diesen sehr guten Artikel, der so ziemlich die gleiche Lösung zerlegt
Augustin Riedinger
16
Ihre Antwort ist großartig, aber wie kann das vom API-Gateway (innerhalb des API-Gateways oder in einem AuthMicroService) generierte Token von einem zufälligen Microservice verarbeitet werden, dessen Ziel es ist, sich nicht zu authentifizieren, und der wahrscheinlich keine vollständige Verwaltung innerhalb des API-Gateways hat sein Geschäftscode?
Mfrachet
Sie können beispielsweise Netflix Zuul verwenden, um das im Gateway empfangene Token an alle Dienste zu senden, die die Benutzerinformationen kennen. docs.spring.io/spring-boot/docs/current/reference/htmlsingle/…
Tiarê Balbi
Eine weitere nette Sache bei der Verwendung von OAuth2 zwischen Diensten ist, dass Sie Endpunkte haben können, die zwischen dienstauthentifizierten und benutzerauthentifizierten Aktionen unterscheiden.
cmp
2
Bei OAuth geht es mehr darum, einem System Zugriff auf die Daten eines Benutzers zu gewähren, die in einem anderen System gespeichert sind. Für mich sieht das nach einem guten Fall für SAML aus.
Rob Grant
8

Kurze Antwort: Verwenden Sie die tokenbasierte Authentifizierung vom Typ Oauth2.0, die in jeder Art von Anwendung wie einer Webanwendung oder einer mobilen App verwendet werden kann. Die Reihenfolge der Schritte für eine Webanwendung wäre dann zu

  1. Authentifizierung gegen ID-Anbieter
  2. Behalten Sie das Zugriffstoken im Cookie
  3. Zugriff auf die Seiten in der Webanwendung
  4. Rufen Sie die Dienste an

Das folgende Diagramm zeigt die Komponenten, die benötigt würden. Eine solche Architektur, die das Web und die Daten-API trennt, bietet eine gute Skalierbarkeit, Ausfallsicherheit und Stabilität

Geben Sie hier die Bildbeschreibung ein

Sandeep Nair
quelle
Wird AWS Lambda nicht "kalt" und braucht Zeit zum Starten? Das würde die Anmeldung verlangsamen, nicht wahr?
Tsuz
@tsuz, AWS hat jetzt die Parallelitätsfunktion in Lambda eingeführt, mit der Sie die Parallelität reservieren können. Damit können Sie das Kaltstartproblem beheben. docs.aws.amazon.com/lambda/latest/dg/…
Sandeep Nair
Ich hätte diese Antwort gerne schon Jahre zuvor gesehen. Es ist unglaublich einfach zu verstehen, wie die Microservices-Architektur mit authentifizierungs- und autorisierungsunabhängigen Microservices orchestriert werden kann, um Zugriff auf andere Dienste zu erhalten
brayancastrop
@ Sandeep, ich denke, Sie beziehen sich auf Provisioned Concurrency und nicht reserviert.
Anil Kumar
0

Das API-Gateway-Muster sollte verwendet werden, um dies mithilfe von OpenID Connect zu implementieren. Der Benutzer wird vom IDP authentifiziert und erhält das JWT-Token vom Autorisierungsserver. Jetzt kann das API-Gateway-System dieses Token in der Redis-Datenbank speichern und das Cookie im Browser setzen. Das API-Gateway verwendet das Cookie, um die Benutzeranforderung zu validieren, und sendet das Token an die Microservices.

API Gateway fungiert als ein einziger Einstiegspunkt für alle Arten von Client-Apps wie die öffentliche Java-Skript-Client-App, die herkömmliche Web-App, die native mobile App und Client-Apps von Drittanbietern in der Microservice-Architektur.

Weitere Informationen dazu finden Sie unter http://proficientblog.com/microservices-security/.

ManishSingh
quelle
-2

Sie können idenitty server 4 zur Authentifizierung und Autorisierung verwenden

Sie müssen die Firewall-Architektur verwenden, damit Sie mehr Kontrolle über Sicherheit, Robustheit, Skalierbarkeit und Benutzerfreundlichkeit haben

Vijay Parmar
quelle