SSO in einer Mikrodienarchitektur. Verwendung von Keycloak. Teil Nr. 1

In jedem großen Unternehmen, und die X5 Retail Group ist da keine Ausnahme, steigt mit der Entwicklung die Anzahl der Projekte, in denen eine Benutzerauthentifizierung erforderlich ist. Im Laufe der Zeit wird ein nahtloser Übergang der Benutzer von einer Anwendung zur anderen notwendig, und dann entsteht die Notwendigkeit, einen einheitlichen Single-Sign-On (SSO)-Server zu verwenden. Aber was ist zu tun, wenn IdentitĂ€tsanbieter wie AD oder andere, die keine zusĂ€tzlichen Attribute besitzen, bereits in verschiedenen Projekten verwendet werden? Hier kommen die sogenannten "IdentitĂ€tsbroker" ins Spiel. Zu den funktionalsten Vertretern gehören Keycloak, Gravitee Access Management und andere. Die Nutzungsszenarien können sehr unterschiedlich sein: maschinelles Zusammenspiel, Benutzerinteraktion und mehr. Die Lösung muss flexible und skalierbare Funktionen unterstĂŒtzen, die alle Anforderungen in einer Lösung vereinen, und diese Lösung in unserem Unternehmen ist derzeit der IdentitĂ€tsbroker – Keycloak.

SSO in einer Mikrodienarchitektur. Verwendung von Keycloak. Teil Nr. 1

Keycloak ist ein Open-Source-Produkt, das fĂŒr IdentitĂ€tsmanagement und Zugangskontrolle vorgesehen ist und von RedHat unterstĂŒtzt wird. Es ist die Grundlage fĂŒr die von dem Unternehmen verwendeten SSO-Produkte – RH-SSO.

Grundbegriffe

Bevor man sich mit Lösungen und AnsÀtzen beschÀftigt, sollte man die Begriffe und die Reihenfolge der Prozesse klÀren:

SSO in einer Mikrodienarchitektur. Verwendung von Keycloak. Teil Nr. 1

Identifikation – ist das Verfahren zur Erkennung eines Subjekts anhand seiner Kennung (einfacher gesagt, es ist die Bestimmung des Namens, Logins oder der Nummer).

Authentifizierung – ist das Verfahren zur ÜberprĂŒfung der Echtheit (der Benutzer wird mit einem Passwort ĂŒberprĂŒft, eine E-Mail wird mit einer elektronischen Signatur ĂŒberprĂŒft usw.).

Autorisierung – ist die GewĂ€hrung des Zugangs zu einer Ressource (zum Beispiel zu einer E-Mail).

IdentitÀtsbroker Keycloak

Keycloak – ist eine Open-Source-Lösung fĂŒr das IdentitĂ€ts- und Zugangsmanagement, die fĂŒr den Einsatz in Informationssystemen vorgesehen ist, in denen Muster der Microservice-Architektur verwendet werden können.

Keycloak bietet Funktionen wie Single Sign-On (SSO), Broker-Identifikation und sozialen Login, Benutzerföderation, Client-Adapter, eine Administrationskonsole und eine Konto-Management-Konsole.

Die grundlegenden Funktionen, die in Keycloak unterstĂŒtzt werden:

  • Single Sign-On und Single Sign-Out fĂŒr Webanwendungen.
  • UnterstĂŒtzung fĂŒr OpenID/OAuth 2.0/SAML.
  • Identity Brokering – Authentifizierung ĂŒber externe OpenID Connect oder SAML IdentitĂ€tsanbieter.
  • Social Login – UnterstĂŒtzung fĂŒr Google, GitHub, Facebook, Twitter zur Identifizierung von Nutzern.
  • User Federation – Synchronisierung von Nutzern aus LDAP und Active Directory Servern sowie anderen IdentitĂ€tsanbietern.
  • Kerberos-Bridge – Nutzung eines Kerberos-Servers fĂŒr die automatische Authentifizierung von Nutzern.
  • Admin-Konsole – zur zentralen Verwaltung von Einstellungen und Parametern der Lösung ĂŒber das Web.
  • Account Management Konsole – zur Selbstverwaltung des Nutzerprofils.
  • Anpassung der Lösung basierend auf dem Corporate Design des Unternehmens.
  • 2FA Authentifizierung – UnterstĂŒtzung fĂŒr TOTP/HOTP mithilfe von Google Authenticator oder FreeOTP.
  • Login-Flows – Selbstregistrierung der Nutzer, Passwort-Wiederherstellung und -ZurĂŒcksetzung und weiteres ist möglich.
  • Session Management – Administratoren können die Nutzer-Sessions von einem zentralen Punkt aus verwalten.
  • Token Mappers – Zuordnung von Nutzerattributen, Rollen und anderen erforderlichen Attributen in Token.
  • Flexibles Management von Richtlinien ĂŒber Realm, Anwendung und Nutzer.
  • CORS-UnterstĂŒtzung – die Client-Adapter haben eine integrierte UnterstĂŒtzung fĂŒr CORS.
  • Service Provider Interfaces (SPI) – eine Vielzahl von SPI zur Anpassung verschiedener Aspekte des Serverbetriebs: Authentifizierungsströme, IdentitĂ€tsanbieter, Protokoll-Mapping und vieles mehr.
  • Client-Adapter fĂŒr JavaScript-Anwendungen, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring.
  • UnterstĂŒtzung fĂŒr die Arbeit mit verschiedenen Anwendungen, die die OpenID Connect Relying Party-Bibliothek oder die SAML 2.0 Service Provider-Bibliothek unterstĂŒtzen.
  • Möglichkeit zur Erweiterung durch Plugins.

FĂŒr CI/CD-Prozesse sowie zur Automatisierung der Verwaltungsprozesse in Keycloak kann das REST API/JAVA API verwendet werden. Die Dokumentation ist elektronisch verfĂŒgbar:

REST API https://www.keycloak.org/docs-api/8.0/rest-api/index.html
JAVA API https://www.keycloak.org/docs-api/8.0/javadocs/index.html

Unternehmensbasierte IdentitÀtsanbieter (On-Premise)

Möglichkeit zur Authentifizierung von Nutzern ĂŒber User Federation-Dienste.

SSO in einer Mikrodienarchitektur. Verwendung von Keycloak. Teil Nr. 1

Es kann auch eine durchgehende Authentifizierung verwendet werden – wenn Nutzer sich an Arbeitsstationen mit Kerberos (LDAP oder AD) authentifizieren, können sie sich automatisch bei Keycloak authentifizieren, ohne ihren Benutzernamen und ihr Passwort erneut angeben zu mĂŒssen.

Zur Authentifizierung und weiteren Autorisierung von Benutzern kann eine relationale Datenbankmanagementsystem (RDBMS) verwendet werden, was besonders in Entwicklungsumgebungen sinnvoll ist, da dies in den frĂŒhen Phasen von Projekten keine langen Konfigurationen und Integrationen erfordert. StandardmĂ€ĂŸig wird in Keycloak eine integrierte Datenbank fĂŒr die Speicherung von Einstellungen und Benutzerdaten verwendet.

Die Liste der unterstĂŒtzten Datenbankmanagementsysteme ist umfangreich und umfasst: MS SQL, Oracle, PostgreSQL, MariaDB, Oracle und andere. Die derzeit am besten getesteten sind Oracle 12C Release1 RAC und der Galera 3.12 Cluster fĂŒr MariaDB 10.1.19.

IdentitĂ€tsanbieter – sozialer Login

Die Verwendung von Logins ĂŒber soziale Netzwerke ist möglich. Um die Möglichkeit zur Authentifizierung von Benutzern zu aktivieren, wird die Keycloak-Administrationskonsole verwendet. Änderungen im Anwendungscode sind nicht erforderlich, und diese FunktionalitĂ€t ist "out of the box" verfĂŒgbar und kann in jeder Phase der Projektrealisierung aktiviert werden.

SSO in einer Mikrodienarchitektur. Verwendung von Keycloak. Teil Nr. 1

Zur Authentifizierung von Benutzern können OpenID/SAML-IdentitÀtsanbieter verwendet werden.

Typische Autorisierungsszenarien mit OAuth2 in Keycloak

Authorization Code Flow — wird mit serverseitigen Anwendungen verwendet (server-side applications). Es ist einer der am weitesten verbreiteten Autorisierungsarten, da er gut fĂŒr serverseitige Anwendungen geeignet ist, bei denen der Quellcode der Anwendung und die Daten des Clients fĂŒr Dritte nicht zugĂ€nglich sind. Der Prozess basiert in diesem Fall auf der Umleitung (Redirection). Die Anwendung muss in der Lage sein, mit einem Benutzeragenten (user-agent) wie einem Webbrowser zu interagieren – die Authentifizierungs-Codes, die ĂŒber den Benutzeragenten umgeleitet werden, zu empfangen.

Implicit Flow — wird von mobilen oder Webanwendungen (Anwendungen, die auf dem GerĂ€t des Benutzers betrieben werden) verwendet.

Der implizite Berechtigungstyp fĂŒr die Autorisierung wird von mobilen und Webanwendungen verwendet, bei denen die Vertraulichkeit des Clients nicht garantiert werden kann. Der implizite Berechtigungstyp verwendet auch die Umleitung des User Agents, wobei das Zugriffstoken an den User Agent ĂŒbergeben wird, um es in der Anwendung weiter zu nutzen. Dadurch wird das Token fĂŒr den Nutzer und andere Anwendungen auf dem GerĂ€t des Nutzers verfĂŒgbar. Bei diesem Berechtigungstyp erfolgt keine Authentifizierung der Echtheit der Anwendung, und der Prozess verlĂ€sst sich auf die vorher registrierte Umleitungs-URL (im Service).

Der Implizite Fluss unterstĂŒtzt keine Refresh-Tokens.

Client-Zugangsdaten Grant Flow — wird verwendet, wenn Anwendungen auf APIs zugreifen. Dieser Berechtigungstyp wird normalerweise fĂŒr Server-zu-Server-Interaktionen genutzt, die im Hintergrund ohne sofortige Nutzerinteraktion stattfinden mĂŒssen. Der Client-Credentials-Flow ermöglicht es einem Webdienst (vertraulichem Client), seine eigenen Anmeldeinformationen anstelle der Nutzerdaten zur Authentifizierung bei der Aufrufung eines anderen Webdienstes zu verwenden. FĂŒr ein höheres Sicherheitsniveau kann der aufrufende Dienst ein Zertifikat (anstatt eines gemeinsamen Geheimnisses) als Anmeldeinformation verwenden.

Die OAuth2-Spezifikation ist in
RFC-6749
RFC-8252
RFC-6819

JWT-Token und seine Vorteile

JWT (JSON Web Token) ist ein offener Standard (https://tools.ietf.org/html/rfc7519), der einen kompakten und autonomen Weg definiert, um Informationen sicher als JSON-Objekt zwischen Parteien zu ĂŒbertragen.

Laut Standard besteht das Token aus drei Teilen im Base-64-Format, die durch Punkte getrennt sind. Der erste Teil wird als Header bezeichnet, in dem der Typ des Tokens und der Name des Hash-Algorithmus zur Erzeugung der digitalen Signatur enthalten sind. Der zweite Teil speichert die wesentlichen Informationen (Nutzer, Attribute usw.). Der dritte Teil ist die digitale Signatur.

..
Speichern Sie das Token niemals in Ihrer Datenbank. Denn ein gĂŒltiges Token ist gleichbedeutend mit einem Passwort; ein Token zu speichern, ist dasselbe wie ein Passwort im Klartext zu speichern.
Zugriffstoken — es ist ein Token, das dem Inhaber Zugriff auf geschĂŒtzte Ressourcen des Servers gewĂ€hrt. In der Regel hat es eine kurze Lebensdauer und kann zusĂ€tzliche Informationen wie die IP-Adresse der anfordernden Partei enthalten.

Refresh-Token — ist ein Token, das es Client-Anwendungen ermöglicht, neue Access-Token anzufordern, nachdem deren Lebensdauer abgelaufen ist. Diese Token werden normalerweise fĂŒr lĂ€ngere Zeit ausgegeben.

Hauptvorteile der Anwendung in einer Microservices-Architektur:

  • Möglichkeit, auf verschiedene Anwendungen und Dienste ĂŒber eine einmalige Authentifizierung zuzugreifen.
  • Wenn bestimmte erforderliche Attribute im Benutzerprofil fehlen, können Daten ergĂ€nzt werden, die in die Payload hinzugefĂŒgt werden können, auch automatisiert und „on-the-fly“.
  • Es besteht keine Notwendigkeit, Informationen ĂŒber aktive Sitzungen zu speichern; die Serveranwendung muss nur die Signatur ĂŒberprĂŒfen.
  • Flexibleres Zugriffsmanagement durch zusĂ€tzliche Attribute in der Payload.
  • Die Verwendung einer Signatur fĂŒr das Header- und Payload erhöht die Sicherheit der Lösung insgesamt.

JWT-Token — Struktur

Header — standardmĂ€ĂŸig enthĂ€lt der Header nur den Typ des Tokens und den Algorithmus, der zur VerschlĂŒsselung verwendet wird.

Der Typ des Tokens wird im SchlĂŒssel „typ“ gespeichert. Der SchlĂŒssel „typ“ wird in JWT ignoriert. Wenn der SchlĂŒssel „typ“ vorhanden ist, sollte sein Wert JWT sein, um anzugeben, dass dieses Objekt ein JSON Web Token ist.

Der zweite SchlĂŒssel „alg“ definiert den Algorithmus, der zur VerschlĂŒsselung des Tokens verwendet wird. StandardmĂ€ĂŸig sollte er auf HS256 gesetzt sein. Der Header wird in Base64 codiert.

{ "alg": "HS256", "typ": "JWT"}
Payload (Inhalt) — in der Payload wird jede Information gespeichert, die ĂŒberprĂŒft werden muss. Jeder SchlĂŒssel in der Payload wird als „Anspruch“ bezeichnet. Zum Beispiel kann man nur mit einer Einladung in die Anwendung eintreten (geschlossene Promotion). Wenn wir jemanden einladen möchten, senden wir ihm eine E-Mail mit der Einladung. Es ist wichtig zu prĂŒfen, dass die E-Mail-Adresse der Person gehört, die die Einladung annimmt. Daher werden wir diese Adresse in die Payload aufnehmen und in den SchlĂŒssel „e-mail“ speichern.

{ "email": "example@x5.ru" }

Die SchlĂŒssel in der Payload können beliebig sein. Es gibt jedoch einige reservierte:

  • iss (Issuer) — definiert die Anwendung, aus der das Token gesendet wird.
  • sub (Betreff) — definiert das Thema des Tokens.
  • aud (Zielgruppe) – ein Array aus groß-/kleinschreibungssensitiven Strings oder URIs, das die Liste der EmpfĂ€nger dieses Tokens darstellt. Wenn die empfangende Partei ein JWT mit diesem SchlĂŒssel erhĂ€lt, muss sie prĂŒfen, ob sie in den EmpfĂ€ngern enthalten ist – andernfalls wird das Token ignoriert.
  • exp (Ablaufdatum) — gibt an, wann das Token ablĂ€uft. Der JWT-Standard schreibt vor, dass in allen seinen Implementierungen abgelaufene Tokens abgelehnt werden. Der exp-SchlĂŒssel sollte einen Zeitstempel im Unix-Format besitzen.
  • nbf (Nicht vor) — dies ist die Zeit im Unix-Format, die angibt, wann das Token gĂŒltig wird.
  • iat (Ausgestellt am) — dieser SchlĂŒssel stellt die Zeit dar, zu der das Token ausgestellt wurde, und kann verwendet werden, um das Alter des JWT zu bestimmen. Der iat-SchlĂŒssel sollte einen Zeitstempel im Unix-Format besitzen.
  • Jti (JWT-ID) — ein String, der eine eindeutige Kennung dieses Tokens unter BerĂŒcksichtigung der Groß-/Kleinschreibung definiert.

Es ist wichtig zu verstehen, dass die Payload nicht in verschlĂŒsselter Form ĂŒbertragen wird (obwohl Tokens verschachtelt sein können und dann möglicherweise verschlĂŒsselte Daten ĂŒbermittelt werden können). Daher sollten keine geheimen Informationen darin gespeichert werden. Wie der Header wird die Payload in base64 kodiert.
Signatur — wenn wir den Header und die Payload haben, können wir die Signatur berechnen.

Die in base64 codierten Teile: Header und Payload werden durch einen Punkt zu einer Zeichenkette verbunden. Dann wird diese Zeichenkette zusammen mit dem geheimen SchlĂŒssel als Eingabe fĂŒr den im Header angegebenen VerschlĂŒsselungsalgorithmus verwendet (SchlĂŒssel „alg“). Der SchlĂŒssel kann beliebiger String sein. LĂ€ngere Strings sind bevorzugt, da es mehr Zeit in Anspruch nimmt, sie zu knacken.

{"alg":"RSA1_5","payload":"A128CBC-HS256"}

Aufbau einer ausfallsicheren Keycloak-Cluster-Architektur

Die Verwendung eines gemeinsamen Clusters fĂŒr alle Projekte stellt höhere Anforderungen an die SSO-Lösung. Bei einer geringen Anzahl von Projekten sind diese Anforderungen fĂŒr alle Projekte nicht so spĂŒrbar, jedoch steigen die Anforderungen an VerfĂŒgbarkeit und Leistung mit der zunehmenden Zahl an Nutzern und Integrationen.

Die Erhöhung der Ausfallrisiken des einheitlichen SSO erhöht die Anforderungen an die Architektur der Lösung und die verwendeten Methoden zur Sicherung von Komponenten und fĂŒhrt zu sehr strengen SLAs. In diesem Zusammenhang haben Projekte in der Regel wĂ€hrend der Entwicklung oder in frĂŒhen Phasen der Implementierung eigene nicht ausfallsichere Infrastrukturen. Mit der Weiterentwicklung mĂŒssen Möglichkeiten fĂŒr Wachstum und Skalierung eingeplant werden. Der flexibelste Weg besteht darin, einen ausfallsicheren Cluster unter Verwendung von Container-Virtualisierung oder einem hybriden Ansatz zu erstellen.

FĂŒr den Betrieb im Active/Active- und Active/Passive-Modus eines Clusters ist die GewĂ€hrleistung der Datenkonsistenz in der relationalen Datenbank erforderlich – beide Knoten der Datenbank mĂŒssen synchron zwischen verschiedenen geografisch verteilten Rechenzentren repliziert werden.

Das einfachste Beispiel fĂŒr eine ausfallsichere Installation.

SSO in einer Mikrodienarchitektur. Verwendung von Keycloak. Teil Nr. 1

Welche Vorteile bietet die Verwendung eines einheitlichen Clusters:

  • Hohe VerfĂŒgbarkeit und Leistung.
  • UnterstĂŒtzung von Betriebsmodi: Active/Active, Active/Passive.
  • Möglichkeit der dynamischen Skalierung – bei Verwendung von Container-Virtualisierung.
  • Möglichkeit der zentralisierten Verwaltung und Überwachung.
  • Einheitlicher Ansatz zur Identifikation/Authentifizierung/Autorisierung von Benutzern in Projekten.
  • Transparenteres Interagieren zwischen verschiedenen Projekten ohne Benutzereinbindung.
  • Möglichkeit der Wiederverwendung von JWT-Token in verschiedenen Projekten.
  • Einheitlicher Vertrauenspunkt.
  • Schnellere Projektstarts durch den Einsatz von Microservices/Container-Virtualisierung (keine Einrichtung zusĂ€tzlicher Komponenten erforderlich).
  • Möglichkeit, kommerziellen Support vom Anbieter zu erhalten.

Worauf sollte bei der Planung eines Clusters geachtet werden

Datenbankmanagementsystem

Keycloak verwendet ein Datenbankmanagementsystem zum Speichern von: Realms, Clients, Benutzern usw.
Eine breite Palette von Datenbankmanagementsystemen wird unterstĂŒtzt: MS SQL, Oracle, MySQL, PostgreSQL. Keycloak wird mit einer eigenen eingebauten relationalen Datenbank geliefert. Die Nutzung wird fĂŒr nicht belastete Umgebungen empfohlen – wie zum Beispiel Entwicklungsumgebungen.

FĂŒr den Betrieb im Active/Active- und Active/Passive-Modus eines Clusters ist die GewĂ€hrleistung der Datenkonsistenz in der relationalen Datenbank erforderlich, und beide Knoten des Datenbankclusters werden synchron zwischen den Rechenzentren repliziert.

Verteilte Cache (Infinispan)

FĂŒr das ordnungsgemĂ€ĂŸe Funktionieren des Clusters ist eine zusĂ€tzliche Synchronisierung der folgenden Cache-Typen unter Verwendung von JBoss Data Grid erforderlich:

Authentifizierungssitzungen – werden verwendet, um Daten wĂ€hrend der Authentifizierung eines bestimmten Benutzers zu speichern. Anfragen aus diesem Cache enthalten in der Regel nur den Browser und den Keycloak-Server, nicht die Anwendung.

Aktionstoken – werden fĂŒr Szenarien verwendet, in denen der Benutzer eine Aktion asynchron bestĂ€tigen muss (per E-Mail). Beispielsweise wird wĂ€hrend des Vergessen-Passwort-Prozesses der Cache actionTokens Infinispan verwendet, um Metadaten ĂŒber die zugehörigen Aktionsmarker zu verfolgen, die bereits verwendet wurden, sodass sie nicht erneut verwendet werden können.

Caching und Invalidierung von persistenten Daten – wird verwendet, um persistente Daten zu cachen und so unnötige Anfragen an die Datenbank zu vermeiden. Wenn ein Keycloak-Server Daten aktualisiert, mĂŒssen alle anderen Keycloak-Server in allen Rechenzentren darĂŒber informiert werden.

Arbeit – wird nur verwendet, um Nachrichten ĂŒber UngĂŒltigkeit zwischen den Knoten des Clusters und den Rechenzentren zu senden.

Benutzersitzungen – werden verwendet, um Daten ĂŒber Benutzersitzungen zu speichern, die wĂ€hrend der Browsersitzung des Benutzers gĂŒltig sind. Der Cache muss HTTP-Anfragen von Endbenutzern und der Anwendung verarbeiten.

Brute-Force-Schutz – wird verwendet, um Daten ĂŒber fehlgeschlagene Anmeldeversuche zu verfolgen.

Lastenausgleich

Der Lastenausgleich ist der einzige Einstiegspunkt in Keycloak und muss sticky sessions unterstĂŒtzen.

Anwendungsserver

Wird verwendet, um die Interaktion der Komponenten untereinander zu steuern und kann mit vorhandenen Automatisierungswerkzeugen und dynamischen Skalierungsmitteln virtualisiert oder containerisiert werden. Die hÀufigsten Bereitstellungsszenarien sind in OpenShift, Kubernetes, Rancher.

Damit ist der erste Teil - der theoretische - abgeschlossen. In den nĂ€chsten Artikeln werden Beispiele fĂŒr Integrationen mit verschiedenen IdentitĂ€tsanbietern sowie Beispiele fĂŒr Einstellungen behandelt.

Quelle: habr.com

60GB SSD 8Gb DDR4