{"id":40865,"date":"2020-02-05T10:07:04","date_gmt":"2020-02-05T07:07:04","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961"},"modified":"2020-02-05T10:07:04","modified_gmt":"2020-02-05T07:07:04","slug":"sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","title":{"rendered":"SSO in einer Mikrodienarchitektur. Verwendung von Keycloak. Teil Nr. 1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>In jedem gro\u00dfen 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 \u00dcbergang 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\u00e4tsanbieter wie AD oder andere, die keine zus\u00e4tzlichen Attribute besitzen, bereits in verschiedenen Projekten verwendet werden? Hier kommen die sogenannten \"Identit\u00e4tsbroker\" ins Spiel. Zu den funktionalsten Vertretern geh\u00f6ren Keycloak, Gravitee Access Management und andere. Die Nutzungsszenarien k\u00f6nnen sehr unterschiedlich sein: maschinelles Zusammenspiel, Benutzerinteraktion und mehr. Die L\u00f6sung muss flexible und skalierbare Funktionen unterst\u00fctzen, die alle Anforderungen in einer L\u00f6sung vereinen, und diese L\u00f6sung in unserem Unternehmen ist derzeit der Identit\u00e4tsbroker \u2013 Keycloak. <\/p>\n<p><img decoding=\"async\" alt=\"SSO in einer Mikrodienarchitektur. Verwendung von Keycloak. Teil Nr. 1\" src=\"\/wp-content\/uploads\/2020\/02\/3a7f1d5f68fa5d07fc30f2804dc62bef.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nKeycloak ist ein Open-Source-Produkt, das f\u00fcr Identit\u00e4tsmanagement und Zugangskontrolle vorgesehen ist und von RedHat unterst\u00fctzt wird. Es ist die Grundlage f\u00fcr die von dem Unternehmen verwendeten SSO-Produkte \u2013 RH-SSO.<\/p>\n<h3>Grundbegriffe <\/h3>\n<p>\nBevor man sich mit L\u00f6sungen und Ans\u00e4tzen besch\u00e4ftigt, sollte man die Begriffe und die Reihenfolge der Prozesse kl\u00e4ren:<\/p>\n<p><img decoding=\"async\" alt=\"SSO in einer Mikrodienarchitektur. Verwendung von Keycloak. Teil Nr. 1\" src=\"\/wp-content\/uploads\/2020\/02\/3a83d4364425aeed1019662fd1d5f152.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Identifikation<\/b> \u2013 ist das Verfahren zur Erkennung eines Subjekts anhand seiner Kennung (einfacher gesagt, es ist die Bestimmung des Namens, Logins oder der Nummer).<\/p>\n<p><b>Authentifizierung<\/b> \u2013 ist das Verfahren zur \u00dcberpr\u00fcfung der Echtheit (der Benutzer wird mit einem Passwort \u00fcberpr\u00fcft, eine E-Mail wird mit einer elektronischen Signatur \u00fcberpr\u00fcft usw.).<\/p>\n<p><b>Autorisierung<\/b> \u2013 ist die Gew\u00e4hrung des Zugangs zu einer Ressource (zum Beispiel zu einer E-Mail).<\/p>\n<h4>Identit\u00e4tsbroker Keycloak<\/h4>\n<p>\n<b>Keycloak<\/b> \u2013 ist eine Open-Source-L\u00f6sung f\u00fcr das Identit\u00e4ts- und Zugangsmanagement, die f\u00fcr den Einsatz in Informationssystemen vorgesehen ist, in denen Muster der Microservice-Architektur verwendet werden k\u00f6nnen.<\/p>\n<p>Keycloak bietet Funktionen wie Single Sign-On (SSO), Broker-Identifikation und sozialen Login, Benutzerf\u00f6deration, Client-Adapter, eine Administrationskonsole und eine Konto-Management-Konsole.<\/p>\n<p>Die grundlegenden Funktionen, die in Keycloak unterst\u00fctzt werden:<\/p>\n<ul>\n<li>Single Sign-On und Single Sign-Out f\u00fcr Webanwendungen.<\/li>\n<li>Unterst\u00fctzung f\u00fcr OpenID\/OAuth 2.0\/SAML.<\/li>\n<li>Identity Brokering \u2013 Authentifizierung \u00fcber externe OpenID Connect oder SAML Identit\u00e4tsanbieter.<\/li>\n<li>Social Login \u2013 Unterst\u00fctzung f\u00fcr Google, GitHub, Facebook, Twitter zur Identifizierung von Nutzern.<\/li>\n<li>User Federation \u2013 Synchronisierung von Nutzern aus LDAP und Active Directory Servern sowie anderen Identit\u00e4tsanbietern.<\/li>\n<li>Kerberos-Bridge \u2013 Nutzung eines Kerberos-Servers f\u00fcr die automatische Authentifizierung von Nutzern.<\/li>\n<li>Admin-Konsole \u2013 zur zentralen Verwaltung von Einstellungen und Parametern der L\u00f6sung \u00fcber das Web.<\/li>\n<li>Account Management Konsole \u2013 zur Selbstverwaltung des Nutzerprofils.<\/li>\n<li>Anpassung der L\u00f6sung basierend auf dem Corporate Design des Unternehmens.<\/li>\n<li>2FA Authentifizierung \u2013 Unterst\u00fctzung f\u00fcr TOTP\/HOTP mithilfe von Google Authenticator oder FreeOTP.<\/li>\n<li>Login-Flows \u2013 Selbstregistrierung der Nutzer, Passwort-Wiederherstellung und -Zur\u00fccksetzung und weiteres ist m\u00f6glich.<\/li>\n<li>Session Management \u2013 Administratoren k\u00f6nnen die Nutzer-Sessions von einem zentralen Punkt aus verwalten.<\/li>\n<li>Token Mappers \u2013 Zuordnung von Nutzerattributen, Rollen und anderen erforderlichen Attributen in Token.<\/li>\n<li>Flexibles Management von Richtlinien \u00fcber Realm, Anwendung und Nutzer.<\/li>\n<li>CORS-Unterst\u00fctzung \u2013 die Client-Adapter haben eine integrierte Unterst\u00fctzung f\u00fcr CORS.<\/li>\n<li>Service Provider Interfaces (SPI) \u2013 eine Vielzahl von SPI zur Anpassung verschiedener Aspekte des Serverbetriebs: Authentifizierungsstr\u00f6me, Identit\u00e4tsanbieter, Protokoll-Mapping und vieles mehr.<\/li>\n<li>Client-Adapter f\u00fcr JavaScript-Anwendungen, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring.<\/li>\n<li>Unterst\u00fctzung f\u00fcr die Arbeit mit verschiedenen Anwendungen, die die OpenID Connect Relying Party-Bibliothek oder die SAML 2.0 Service Provider-Bibliothek unterst\u00fctzen.<\/li>\n<li>M\u00f6glichkeit zur Erweiterung durch Plugins.<\/li>\n<\/ul>\n<p>\nF\u00fcr CI\/CD-Prozesse sowie zur Automatisierung der Verwaltungsprozesse in Keycloak kann das REST API\/JAVA API verwendet werden. Die Dokumentation ist elektronisch verf\u00fcgbar: <\/p>\n<p>REST API <noindex><a rel=\"nofollow\" href=\"https:\/\/www.keycloak.org\/docs-api\/8.0\/rest-api\/index.html\">https:\/\/www.keycloak.org\/docs-api\/8.0\/rest-api\/index.html<\/a><\/noindex><br \/>\nJAVA API <noindex><a rel=\"nofollow\" href=\"https:\/\/www.keycloak.org\/docs-api\/8.0\/javadocs\/index.html\">https:\/\/www.keycloak.org\/docs-api\/8.0\/javadocs\/index.html<\/a><\/noindex><\/p>\n<h4>Unternehmensbasierte Identit\u00e4tsanbieter (On-Premise)<\/h4>\n<p>\nM\u00f6glichkeit zur Authentifizierung von Nutzern \u00fcber User Federation-Dienste.<\/p>\n<p><img decoding=\"async\" alt=\"SSO in einer Mikrodienarchitektur. Verwendung von Keycloak. Teil Nr. 1\" src=\"\/wp-content\/uploads\/2020\/02\/59bbeaf4630855467ddb003d52b0c1b6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEs kann auch eine durchgehende Authentifizierung verwendet werden \u2013 wenn Nutzer sich an Arbeitsstationen mit Kerberos (LDAP oder AD) authentifizieren, k\u00f6nnen sie sich automatisch bei Keycloak authentifizieren, ohne ihren Benutzernamen und ihr Passwort erneut angeben zu m\u00fcssen. <\/p>\n<p>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\u00fchen Phasen von Projekten keine langen Konfigurationen und Integrationen erfordert. Standardm\u00e4\u00dfig wird in Keycloak eine integrierte Datenbank f\u00fcr die Speicherung von Einstellungen und Benutzerdaten verwendet.<\/p>\n<p>Die Liste der unterst\u00fctzten 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\u00fcr MariaDB 10.1.19. <\/p>\n<h4>Identit\u00e4tsanbieter \u2013 sozialer Login <\/h4>\n<p>\nDie Verwendung von Logins \u00fcber soziale Netzwerke ist m\u00f6glich. Um die M\u00f6glichkeit zur Authentifizierung von Benutzern zu aktivieren, wird die Keycloak-Administrationskonsole verwendet. \u00c4nderungen im Anwendungscode sind nicht erforderlich, und diese Funktionalit\u00e4t ist \"out of the box\" verf\u00fcgbar und kann in jeder Phase der Projektrealisierung aktiviert werden.<\/p>\n<p><img decoding=\"async\" alt=\"SSO in einer Mikrodienarchitektur. Verwendung von Keycloak. Teil Nr. 1\" src=\"\/wp-content\/uploads\/2020\/02\/546ddea10c79662ca37a448d3dfc1fd0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZur Authentifizierung von Benutzern k\u00f6nnen OpenID\/SAML-Identit\u00e4tsanbieter verwendet werden.<\/p>\n<h3>Typische Autorisierungsszenarien mit OAuth2 in Keycloak<\/h3>\n<p>\n<b>Authorization Code Flow <\/b> \u2014 wird mit serverseitigen Anwendungen verwendet (server-side applications). Es ist einer der am weitesten verbreiteten Autorisierungsarten, da er gut f\u00fcr serverseitige Anwendungen geeignet ist, bei denen der Quellcode der Anwendung und die Daten des Clients f\u00fcr Dritte nicht zug\u00e4nglich 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 \u2013 die Authentifizierungs-Codes, die \u00fcber den Benutzeragenten umgeleitet werden, zu empfangen.<\/p>\n<p><b>Implicit Flow<\/b> \u2014 wird von mobilen oder Webanwendungen (Anwendungen, die auf dem Ger\u00e4t des Benutzers betrieben werden) verwendet.<\/p>\n<p>Der implizite Berechtigungstyp f\u00fcr 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 \u00fcbergeben wird, um es in der Anwendung weiter zu nutzen. Dadurch wird das Token f\u00fcr den Nutzer und andere Anwendungen auf dem Ger\u00e4t des Nutzers verf\u00fcgbar. Bei diesem Berechtigungstyp erfolgt keine Authentifizierung der Echtheit der Anwendung, und der Prozess verl\u00e4sst sich auf die vorher registrierte Umleitungs-URL (im Service).<\/p>\n<p>Der Implizite Fluss unterst\u00fctzt keine Refresh-Tokens.<br \/>\n<br \/>\n<b>Client-Zugangsdaten Grant Flow<\/b> \u2014 wird verwendet, wenn Anwendungen auf APIs zugreifen. Dieser Berechtigungstyp wird normalerweise f\u00fcr Server-zu-Server-Interaktionen genutzt, die im Hintergrund ohne sofortige Nutzerinteraktion stattfinden m\u00fcssen. Der Client-Credentials-Flow erm\u00f6glicht es einem Webdienst (vertraulichem Client), seine eigenen Anmeldeinformationen anstelle der Nutzerdaten zur Authentifizierung bei der Aufrufung eines anderen Webdienstes zu verwenden. F\u00fcr ein h\u00f6heres Sicherheitsniveau kann der aufrufende Dienst ein Zertifikat (anstatt eines gemeinsamen Geheimnisses) als Anmeldeinformation verwenden.<\/p>\n<p>Die OAuth2-Spezifikation ist in <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/tools.ietf.org\/html\/rfc6749\">RFC-6749<\/a><\/noindex> <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/tools.ietf.org\/html\/rfc8259\">RFC-8252<\/a><\/noindex> <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/tools.ietf.org\/html\/rfc6819\">RFC-6819<\/a><\/noindex><\/p>\n<h3>JWT-Token und seine Vorteile<\/h3>\n<p>\nJWT (JSON Web Token) ist ein offener Standard (<noindex><a rel=\"nofollow\" href=\"https:\/\/tools.ietf.org\/html\/rfc7519\">https:\/\/tools.ietf.org\/html\/rfc7519<\/a><\/noindex>), der einen kompakten und autonomen Weg definiert, um Informationen sicher als JSON-Objekt zwischen Parteien zu \u00fcbertragen.<\/p>\n<p>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.<\/p>\n<p>..<br \/>\nSpeichern Sie das Token niemals in Ihrer Datenbank. Denn ein g\u00fcltiges Token ist gleichbedeutend mit einem Passwort; ein Token zu speichern, ist dasselbe wie ein Passwort im Klartext zu speichern.<br \/>\n<b>Zugriffstoken <\/b>\u2014 es ist ein Token, das dem Inhaber Zugriff auf gesch\u00fctzte Ressourcen des Servers gew\u00e4hrt. In der Regel hat es eine kurze Lebensdauer und kann zus\u00e4tzliche Informationen wie die IP-Adresse der anfordernden Partei enthalten.<\/p>\n<p><b>Refresh-Token <\/b>\u2014 ist ein Token, das es Client-Anwendungen erm\u00f6glicht, neue Access-Token anzufordern, nachdem deren Lebensdauer abgelaufen ist. Diese Token werden normalerweise f\u00fcr l\u00e4ngere Zeit ausgegeben.<\/p>\n<p>Hauptvorteile der Anwendung in einer Microservices-Architektur:<\/p>\n<ul>\n<li>M\u00f6glichkeit, auf verschiedene Anwendungen und Dienste \u00fcber eine einmalige Authentifizierung zuzugreifen.<\/li>\n<li>Wenn bestimmte erforderliche Attribute im Benutzerprofil fehlen, k\u00f6nnen Daten erg\u00e4nzt werden, die in die Payload hinzugef\u00fcgt werden k\u00f6nnen, auch automatisiert und \u201eon-the-fly\u201c.<\/li>\n<li>Es besteht keine Notwendigkeit, Informationen \u00fcber aktive Sitzungen zu speichern; die Serveranwendung muss nur die Signatur \u00fcberpr\u00fcfen.<\/li>\n<li>Flexibleres Zugriffsmanagement durch zus\u00e4tzliche Attribute in der Payload.<\/li>\n<li>Die Verwendung einer Signatur f\u00fcr das Header- und Payload erh\u00f6ht die Sicherheit der L\u00f6sung insgesamt.<\/li>\n<\/ul>\n<p><\/p>\n<h3>JWT-Token \u2014 Struktur<\/h3>\n<p>\n<b>Header<\/b> \u2014 standardm\u00e4\u00dfig enth\u00e4lt der Header nur den Typ des Tokens und den Algorithmus, der zur Verschl\u00fcsselung verwendet wird.<\/p>\n<p>Der Typ des Tokens wird im Schl\u00fcssel \u201etyp\u201c gespeichert. Der Schl\u00fcssel \u201etyp\u201c wird in JWT ignoriert. Wenn der Schl\u00fcssel \u201etyp\u201c vorhanden ist, sollte sein Wert JWT sein, um anzugeben, dass dieses Objekt ein JSON Web Token ist.<\/p>\n<p>Der zweite Schl\u00fcssel \u201ealg\u201c definiert den Algorithmus, der zur Verschl\u00fcsselung des Tokens verwendet wird. Standardm\u00e4\u00dfig sollte er auf HS256 gesetzt sein. Der Header wird in Base64 codiert.<\/p>\n<p>{ \"alg\": \"HS256\", \"typ\": \"JWT\"}<br \/>\n<b>Payload (Inhalt)<\/b> \u2014 in der Payload wird jede Information gespeichert, die \u00fcberpr\u00fcft werden muss. Jeder Schl\u00fcssel in der Payload wird als \u201eAnspruch\u201c bezeichnet. Zum Beispiel kann man nur mit einer Einladung in die Anwendung eintreten (geschlossene Promotion). Wenn wir jemanden einladen m\u00f6chten, senden wir ihm eine E-Mail mit der Einladung. Es ist wichtig zu pr\u00fcfen, dass die E-Mail-Adresse der Person geh\u00f6rt, die die Einladung annimmt. Daher werden wir diese Adresse in die Payload aufnehmen und in den Schl\u00fcssel \u201ee-mail\u201c speichern.<\/p>\n<p>{ \"email\": \"example@x5.ru\" }<br \/>\n<br \/>\nDie Schl\u00fcssel in der Payload k\u00f6nnen beliebig sein. Es gibt jedoch einige reservierte:<\/p>\n<ul>\n<li>iss (Issuer) \u2014 definiert die Anwendung, aus der das Token gesendet wird.<\/li>\n<li>sub (Betreff) \u2014 definiert das Thema des Tokens.<\/li>\n<li>aud (Zielgruppe) \u2013 ein Array aus gro\u00df-\/kleinschreibungssensitiven Strings oder URIs, das die Liste der Empf\u00e4nger dieses Tokens darstellt. Wenn die empfangende Partei ein JWT mit diesem Schl\u00fcssel erh\u00e4lt, muss sie pr\u00fcfen, ob sie in den Empf\u00e4ngern enthalten ist \u2013 andernfalls wird das Token ignoriert.<\/li>\n<li>exp (Ablaufdatum) \u2014 gibt an, wann das Token abl\u00e4uft. Der JWT-Standard schreibt vor, dass in allen seinen Implementierungen abgelaufene Tokens abgelehnt werden. Der exp-Schl\u00fcssel sollte einen Zeitstempel im Unix-Format besitzen.<\/li>\n<li>nbf (Nicht vor) \u2014 dies ist die Zeit im Unix-Format, die angibt, wann das Token g\u00fcltig wird.<\/li>\n<li>iat (Ausgestellt am) \u2014 dieser Schl\u00fcssel stellt die Zeit dar, zu der das Token ausgestellt wurde, und kann verwendet werden, um das Alter des JWT zu bestimmen. Der iat-Schl\u00fcssel sollte einen Zeitstempel im Unix-Format besitzen.<\/li>\n<li>Jti (JWT-ID) \u2014 ein String, der eine eindeutige Kennung dieses Tokens unter Ber\u00fccksichtigung der Gro\u00df-\/Kleinschreibung definiert.<\/li>\n<\/ul>\n<p>\nEs ist wichtig zu verstehen, dass die Payload nicht in verschl\u00fcsselter Form \u00fcbertragen wird (obwohl Tokens verschachtelt sein k\u00f6nnen und dann m\u00f6glicherweise verschl\u00fcsselte Daten \u00fcbermittelt werden k\u00f6nnen). Daher sollten keine geheimen Informationen darin gespeichert werden. Wie der Header wird die Payload in base64 kodiert.<br \/>\n<b>Signatur<\/b> \u2014 wenn wir den Header und die Payload haben, k\u00f6nnen wir die Signatur berechnen.<\/p>\n<p>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\u00fcssel als Eingabe f\u00fcr den im Header angegebenen Verschl\u00fcsselungsalgorithmus verwendet (Schl\u00fcssel \u201ealg\u201c). Der Schl\u00fcssel kann beliebiger String sein. L\u00e4ngere Strings sind bevorzugt, da es mehr Zeit in Anspruch nimmt, sie zu knacken.<\/p>\n<p>{\"alg\":\"RSA1_5\",\"payload\":\"A128CBC-HS256\"}<\/p>\n<h3>Aufbau einer ausfallsicheren Keycloak-Cluster-Architektur<\/h3>\n<p>\nDie Verwendung eines gemeinsamen Clusters f\u00fcr alle Projekte stellt h\u00f6here Anforderungen an die SSO-L\u00f6sung. Bei einer geringen Anzahl von Projekten sind diese Anforderungen f\u00fcr alle Projekte nicht so sp\u00fcrbar, jedoch steigen die Anforderungen an Verf\u00fcgbarkeit und Leistung mit der zunehmenden Zahl an Nutzern und Integrationen. <\/p>\n<p>Die Erh\u00f6hung der Ausfallrisiken des einheitlichen SSO erh\u00f6ht die Anforderungen an die Architektur der L\u00f6sung und die verwendeten Methoden zur Sicherung von Komponenten und f\u00fchrt zu sehr strengen SLAs. In diesem Zusammenhang haben Projekte in der Regel w\u00e4hrend der Entwicklung oder in fr\u00fchen Phasen der Implementierung eigene nicht ausfallsichere Infrastrukturen. Mit der Weiterentwicklung m\u00fcssen M\u00f6glichkeiten f\u00fcr Wachstum und Skalierung eingeplant werden. Der flexibelste Weg besteht darin, einen ausfallsicheren Cluster unter Verwendung von Container-Virtualisierung oder einem hybriden Ansatz zu erstellen. <\/p>\n<p>F\u00fcr den Betrieb im Active\/Active- und Active\/Passive-Modus eines Clusters ist die Gew\u00e4hrleistung der Datenkonsistenz in der relationalen Datenbank erforderlich \u2013 beide Knoten der Datenbank m\u00fcssen synchron zwischen verschiedenen geografisch verteilten Rechenzentren repliziert werden.<\/p>\n<p>Das einfachste Beispiel f\u00fcr eine ausfallsichere Installation.<\/p>\n<p><img decoding=\"async\" alt=\"SSO in einer Mikrodienarchitektur. Verwendung von Keycloak. Teil Nr. 1\" src=\"\/wp-content\/uploads\/2020\/02\/c0df30a07e7dda5ae892a1fca3790a45.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWelche Vorteile bietet die Verwendung eines einheitlichen Clusters:<\/p>\n<ul>\n<li>Hohe Verf\u00fcgbarkeit und Leistung.<\/li>\n<li>Unterst\u00fctzung von Betriebsmodi: Active\/Active, Active\/Passive.<\/li>\n<li>M\u00f6glichkeit der dynamischen Skalierung \u2013 bei Verwendung von Container-Virtualisierung.<\/li>\n<li>M\u00f6glichkeit der zentralisierten Verwaltung und \u00dcberwachung.<\/li>\n<li>Einheitlicher Ansatz zur Identifikation\/Authentifizierung\/Autorisierung von Benutzern in Projekten.<\/li>\n<li>Transparenteres Interagieren zwischen verschiedenen Projekten ohne Benutzereinbindung.<\/li>\n<li>M\u00f6glichkeit der Wiederverwendung von JWT-Token in verschiedenen Projekten.<\/li>\n<li>Einheitlicher Vertrauenspunkt.<\/li>\n<li>Schnellere Projektstarts durch den Einsatz von Microservices\/Container-Virtualisierung (keine Einrichtung zus\u00e4tzlicher Komponenten erforderlich).<\/li>\n<li>M\u00f6glichkeit, kommerziellen Support vom Anbieter zu erhalten. <\/li>\n<\/ul>\n<p><\/p>\n<h3>Worauf sollte bei der Planung eines Clusters geachtet werden<\/h3>\n<p><\/p>\n<h4>Datenbankmanagementsystem<\/h4>\n<p>\nKeycloak verwendet ein Datenbankmanagementsystem zum Speichern von: Realms, Clients, Benutzern usw.<br \/>\nEine breite Palette von Datenbankmanagementsystemen wird unterst\u00fctzt: MS SQL, Oracle, MySQL, PostgreSQL. Keycloak wird mit einer eigenen eingebauten relationalen Datenbank geliefert. Die Nutzung wird f\u00fcr nicht belastete Umgebungen empfohlen \u2013 wie zum Beispiel Entwicklungsumgebungen.<\/p>\n<p>F\u00fcr den Betrieb im Active\/Active- und Active\/Passive-Modus eines Clusters ist die Gew\u00e4hrleistung der Datenkonsistenz in der relationalen Datenbank erforderlich, und beide Knoten des Datenbankclusters werden synchron zwischen den Rechenzentren repliziert.<\/p>\n<h4>Verteilte Cache (Infinispan)<\/h4>\n<p>\nF\u00fcr das ordnungsgem\u00e4\u00dfe Funktionieren des Clusters ist eine zus\u00e4tzliche Synchronisierung der folgenden Cache-Typen unter Verwendung von JBoss Data Grid erforderlich:<\/p>\n<p>Authentifizierungssitzungen \u2013 werden verwendet, um Daten w\u00e4hrend 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.<\/p>\n<p>Aktionstoken \u2013 werden f\u00fcr Szenarien verwendet, in denen der Benutzer eine Aktion asynchron best\u00e4tigen muss (per E-Mail). Beispielsweise wird w\u00e4hrend des Vergessen-Passwort-Prozesses der Cache actionTokens Infinispan verwendet, um Metadaten \u00fcber die zugeh\u00f6rigen Aktionsmarker zu verfolgen, die bereits verwendet wurden, sodass sie nicht erneut verwendet werden k\u00f6nnen.<\/p>\n<p>Caching und Invalidierung von persistenten Daten \u2013 wird verwendet, um persistente Daten zu cachen und so unn\u00f6tige Anfragen an die Datenbank zu vermeiden. Wenn ein Keycloak-Server Daten aktualisiert, m\u00fcssen alle anderen Keycloak-Server in allen Rechenzentren dar\u00fcber informiert werden.<\/p>\n<p>Arbeit \u2013 wird nur verwendet, um Nachrichten \u00fcber Ung\u00fcltigkeit zwischen den Knoten des Clusters und den Rechenzentren zu senden. <\/p>\n<p>Benutzersitzungen \u2013 werden verwendet, um Daten \u00fcber Benutzersitzungen zu speichern, die w\u00e4hrend der Browsersitzung des Benutzers g\u00fcltig sind. Der Cache muss HTTP-Anfragen von Endbenutzern und der Anwendung verarbeiten. <\/p>\n<p>Brute-Force-Schutz \u2013 wird verwendet, um Daten \u00fcber fehlgeschlagene Anmeldeversuche zu verfolgen. <\/p>\n<h4>Lastenausgleich<\/h4>\n<p>\nDer Lastenausgleich ist der einzige Einstiegspunkt in Keycloak und muss sticky sessions unterst\u00fctzen. <\/p>\n<h4>Anwendungsserver<\/h4>\n<p>\nWird verwendet, um die Interaktion der Komponenten untereinander zu steuern und kann mit vorhandenen Automatisierungswerkzeugen und dynamischen Skalierungsmitteln virtualisiert oder containerisiert werden. Die h\u00e4ufigsten Bereitstellungsszenarien sind in OpenShift, Kubernetes, Rancher.<\/p>\n<p>Damit ist der erste Teil - der theoretische - abgeschlossen. In den n\u00e4chsten Artikeln werden Beispiele f\u00fcr Integrationen mit verschiedenen Identit\u00e4tsanbietern sowie Beispiele f\u00fcr Einstellungen behandelt.<br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/X5RetailGroup\/blog\/486778\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u043b\u044e\u0431\u043e\u0439 \u043a\u0440\u0443\u043f\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0438 X5 Retail Group \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u0421 \u0442\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0431\u0435\u0441\u0448\u043e\u0432\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0438 \u0442\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Single-Sing-On (SSO). \u041d\u043e \u043a\u0430\u043a \u0431\u044b\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0442\u0430\u043a\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u044b \u043a\u0430\u043a AD \u0438\u043b\u0438 \u0438\u043d\u044b\u0435, \u043d\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":40866,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-40865","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u043b\u044e\u0431\u043e\u0439 \u043a\u0440\u0443\u043f\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0438 X5 Retail Group \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47SSO \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Keycloak. \u0427\u0430\u0441\u0442\u044c \u21161 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u043b\u044e\u0431\u043e\u0439 \u043a\u0440\u0443\u043f\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0438 X5 Retail Group \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-05T07:07:04+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-05T07:07:04+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47SSO in einer Mikrodienste-Architektur. Wir nutzen Keycloak. Teil Nr. 1 | ProHoster","description":"In jedem gro\u00dfen Unternehmen, und die X5 Retail Group bildet da keine Ausnahme, nimmt mit der Entwicklung die Anzahl der Projekte zu, bei denen eine Benutzerautorisierung erforderlich ist.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47SSO \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Keycloak. \u0427\u0430\u0441\u0442\u044c \u21161 | ProHoster","og:description":"\u0412 \u043b\u044e\u0431\u043e\u0439 \u043a\u0440\u0443\u043f\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0438 X5 Retail Group \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.","og:url":"https:\/\/prohoster.info\/de\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-05T07:07:04+00:00","article:modified_time":"2020-02-05T07:07:04+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"40865","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:46:14","updated":"2022-09-27 14:28:39","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/40865","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=40865"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/40865\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/40866"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=40865"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=40865"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=40865"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}