Authentifizierung und Autorisierung in einer Microservices-Architektur
(microservices.io)Diese Serie behandelt die Implementierung von Authentifizierung (Authentication) und Autorisierung (Authorization) in einer Microservices-Architektur.
Dieser Artikel erklärt zusammen mit einem Gesamtüberblick die Unterschiede zu einer einzelnen Anwendung (Monolithen).
Beispielanwendung: RealGuard.io
RealGuard.io ist eine Plattform für kommerzielle Sicherheitssysteme, die die Steuerung von Sicherheitsgeräten und Alarmen verwaltet.
Die Nutzer gehören zu Vertriebsunternehmen, Kundenunternehmen und Monitoring-Anbietern und haben jeweils unterschiedliche Zugriffsrechte.
Authentifizierung und Autorisierung in einer monolithischen Architektur
Eine monolithische Struktur besteht aus einer Anwendung und einer Datenbank; die Authentifizierung wird mit einem Session-Token umgesetzt.
Die Autorisierung erfolgt in einer Struktur wie der folgenden:
isAllowed(user, operation, resource)
Beispiel:
isAllowed(user, "disarm", SecuritySystem(ID))
Vier Autorisierungsmodelle
- RBAC: rollenbasierte Zugriffskontrolle – Berechtigungen werden anhand der dem Nutzer zugewiesenen Rollen bestimmt
- ReBAC: beziehungsbasierte Zugriffskontrolle – der Zugriff wird anhand der Beziehung zwischen Nutzer und Ressource bestimmt
- ABAC: attributbasierte Zugriffskontrolle – die Entscheidung basiert auf Attributen von Nutzer, Ressource und Umgebung
- Hybrides Modell: Die drei obigen Ansätze können kombiniert werden, um komplexe Richtlinien umzusetzen
Autorisierungsbeispiele und Berechtigungen nach Rolle
| Operation | Required Role |
|---|---|
| getAlarmSystem() | SecuritySystemViewer |
| armSystem() | SecuritySystemArmer |
| disarmSystem() | SecuritySystemDisarmer |
| cancelSystem() | SecuritySystemAlarmCanceller |
Zusätzlich zu bestimmten Rollen können weitere Bedingungen gelten, etwa Einschränkungen auf Arbeitszeiten (ABAC) oder die Frage, ob ein System in einer Benachrichtigungsliste enthalten ist.
Orte der Autorisierungsprüfung
- Netzwerkinfrastruktur: In Service Mesh, Ingress Controller usw. sind einfache Berechtigungsprüfungen möglich
- REST-API-Handler: coarse-grained Autorisierung auf Anfrageebene
- Domänenlogik: Autorisierung auf Basis komplexer bedingungsabhängiger Regeln
- DB-Zugriffsschicht: Autorisierungsfilterung innerhalb von SQL (effektiv bei großen Datenmengen)
Autorisierung in der UI
Die UI kann Autorisierung nicht erzwingen, aber sie kann die UX optimieren, indem sie je nach Benutzerrechten Schaltflächen/Funktionen anzeigt oder deaktiviert.
Authentifizierung in einer Microservices-Architektur
Das BFF (Backend For Frontend) ist für Login und Session-Management zuständig.
Da jeder Microservice unabhängig läuft, kann er nicht direkt auf Benutzerinformationen aus der Session zugreifen; Benutzerinformationen müssen daher per Token wie JWT übermittelt werden.
Autorisierung in einer Microservices-Architektur
Anfragen werden in der Reihenfolge BFF → SecurityService weitergeleitet, und die Autorisierung kann an den folgenden drei Stellen geprüft werden:
- BFF: Auf Basis von Session-Informationen ist eine Autorisierung auf Anfrageebene nach Pfad und Methode möglich
- Inter-service Network: Das Service Mesh übernimmt einen Teil der JWT-basierten Autorisierung
- Innerhalb jedes Dienstes: Autorisierung in der Domänenlogik und der DB-Zugriffsschicht
Schwierigkeiten verteilter Autorisierung
Da jeder Dienst die benötigten Informationen nicht in seiner eigenen DB hat, können für die Autorisierung Aufrufe an APIs anderer Dienste erforderlich sein.
Es gibt auch Ansätze, dies per JWT zu lösen, aber dabei werden die Größe des Tokens und die Kosten der Validierung zum Problem.
Zusammenfassung
- Authentifizierung bestätigt die Identität des Nutzers, Autorisierung entscheidet über Berechtigungen
- Das Muster
isAllowed(user, operation, resource)ist der Kern der Autorisierung - Die drei Autorisierungsmodelle RBAC, ReBAC und ABAC werden kombiniert implementiert
- In Monolithen ist Autorisierung durch den Zugriff auf eine einzelne DB einfacher
- In Microservices ist die Implementierung komplexer, weil die für die Autorisierung nötigen Daten verstreut sind
Noch keine Kommentare.