SSO sur l'architecture de microservice. Nous utilisons Keycloak. Numéro de piÚce 1
Dans toute grande entreprise, le X5 Retail Group ne fait pas exception, car le nombre de projets nĂ©cessitant une authentification des utilisateurs augmente Ă mesure que le nombre de projets augmente. Au fil du temps, une transition transparente des utilisateurs d'une application Ă une autre est nĂ©cessaire, puis il est nĂ©cessaire d'utiliser un seul serveur Single-Sing-On (SSO). Mais qu'en est-il lorsque des fournisseurs d'identitĂ© tels que AD ou d'autres qui n'ont pas d'attributs supplĂ©mentaires sont dĂ©jĂ utilisĂ©s dans divers projets. Une classe de systĂšmes appelĂ©s «courtiers d'identité» viendra Ă la rescousse. Les plus fonctionnels sont ses reprĂ©sentants, tels que Keycloak, Gravitee Access management, etc. Le plus souvent, les scĂ©narios d'utilisation peuvent ĂȘtre diffĂ©rents: interaction machine, participation des utilisateurs, etc. La solution doit supporter des fonctionnalitĂ©s flexibles et Ă©volutives,capable de combiner toutes les exigences en une seule, et une telle solution dans notre entreprise est maintenant un courtier indicateur - Keycloak.
Keycloak est un produit open source pour l'authentification et le contrĂŽle d'accĂšs pris en charge par RedHat. C'est la base des produits de l'entreprise utilisant SSO - RH-SSO.Concepts de base
Avant de commencer à traiter des décisions et des approches, vous devez déterminer les termes et la séquence des processus: L'
identification est le processus de reconnaissance d'un sujet par son identifiant (en d'autres termes, il détermine un nom, un identifiant ou un numéro).L'authentification est une procédure d'authentification (un utilisateur est vérifié avec un mot de passe, une lettre est vérifiée par signature électronique, etc.) L'autorisation est la fourniture d'accÚs à une ressource (par exemple, un courrier électronique).Courtier d'identité Keycloak
Keycloak est une solution open source de gestion des identitĂ©s et des accĂšs conçue pour ĂȘtre utilisĂ©e dans les circuits intĂ©grĂ©s oĂč des modĂšles d'architecture de microservices peuvent ĂȘtre utilisĂ©s.Keycloak offre des fonctionnalitĂ©s telles que l'authentification unique (SSO), l'identification du courtier et la connexion sociale, la fĂ©dĂ©ration des utilisateurs, les adaptateurs client, une console d'administrateur et une console de gestion de compte.FonctionnalitĂ© de base prise en charge dans Keycloak:- Authentification unique et dĂ©connexion unique pour les applications basĂ©es sur un navigateur.
- Prise en charge d'OpenID / OAuth 2.0 / SAML.
- Courtage d'identité - Authentification à l'aide de fournisseurs d'identité OpenID Connect externes ou SAML.
- Connexion sociale - prise en charge de Google, GitHub, Facebook, Twitter pour l'identification des utilisateurs.
- User Federation â LDAP Active Directory .
- Kerberos bridge â Kerberos .
- Admin Console â Web.
- Account Management Console â .
- .
- 2FA Authentication â TOTP/HOTP Google Authenticator FreeOTP.
- Login Flows â , .
- Session Management â .
- Token Mappers â , .
- realm, application .
- CORS Support â CORS.
- Service Provider Interfaces (SPI) â SPI, : , , .
- JavaScript applications, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring.
- , OpenID Connect Relying Party library SAML 2.0 Service Provider Library.
- plugins.
Pour les processus CI / CD, ainsi que l'automatisation des processus de gestion dans Keycloak, l'API REST / API JAVA peut ĂȘtre utilisĂ©e. La documentation est disponible sous forme Ă©lectronique:API REST https://www.keycloak.org/docs-api/8.0/rest-api/index.htmlAPI JAVA https://www.keycloak.org/docs-api/8.0/javadocs /index.htmlFournisseurs d'identitĂ© d'entreprise (sur site)
La possibilité d'authentifier les utilisateurs via les services de fédération d'utilisateurs.
L'authentification directe peut Ă©galement ĂȘtre utilisĂ©e - si les utilisateurs s'authentifient sur les postes de travail avec Kerberos (LDAP ou AD), ils peuvent ĂȘtre automatiquement authentifiĂ©s avec Keycloak sans avoir Ă ressaisir leur nom d'utilisateur et leur mot de passe.Pour l'authentification et l'autorisation supplĂ©mentaire des utilisateurs, il est possible d'utiliser un SGBD relationnel, qui est le plus applicable aux environnements de dĂ©veloppement, car il n'implique pas de paramĂštres et d'intĂ©grations Ă long terme dans les premiĂšres Ă©tapes des projets. Par dĂ©faut, Keycloak utilise un SGBD intĂ©grĂ© pour stocker les paramĂštres et les donnĂ©es utilisateur.La liste des SGBD pris en charge est longue et comprend: MS SQL, Oracle, PostgreSQL, MariaDB, Oracle et autres. Les plus testĂ©s actuellement sont Oracle 12C Release1 RAC et le cluster Galera 3.12 pour MariaDB 10.1.19.Fournisseurs d'identitĂ© - connexion sociale
Il est possible d'utiliser une connexion depuis les rĂ©seaux sociaux. Pour activer la possibilitĂ© d'authentifier les utilisateurs, la console d'administration Keycloack est utilisĂ©e. Il n'est pas nĂ©cessaire de modifier le code de l'application et cette fonctionnalitĂ© est disponible «prĂȘte Ă l'emploi» et peut ĂȘtre activĂ©e Ă n'importe quelle Ă©tape du projet.
Pour authentifier les utilisateurs, il est possible d'utiliser des fournisseurs d'identités OpenID / SAML.Scénarios d'autorisation typiques utilisant OAuth2 dans Keycloak
Flux de code d'autorisation - utilisĂ© avec les applications cĂŽtĂ© serveur. L'un des types d'autorisation les plus courants, car il convient bien aux applications serveur dans lesquelles le code source de l'application et les donnĂ©es client ne sont pas accessibles aux Ă©trangers. Dans ce cas, le processus est basĂ© sur la redirection. L'application doit pouvoir interagir avec l'agent utilisateur (user-agent), tel qu'un navigateur Web, pour recevoir des codes d'autorisation API redirigĂ©s via l'agent utilisateur.Flux implicite - utilisĂ© par les applications mobiles ou Web (applications s'exĂ©cutant sur l'appareil de l'utilisateur).Un type implicite d'autorisation d'autorisation est utilisĂ© par les applications mobiles et Web oĂč la confidentialitĂ© des clients ne peut pas ĂȘtre garantie. Le type d'autorisation implicite utilise Ă©galement la redirection de l'agent utilisateur et le jeton d'accĂšs est transmis Ă l'agent utilisateur pour une utilisation ultĂ©rieure dans l'application. Cela rend le jeton disponible pour l'utilisateur et d'autres applications sur l'appareil de l'utilisateur. Avec ce type d'autorisation, l'application n'est pas authentifiĂ©e et le processus lui-mĂȘme repose sur une URL de redirection (prĂ©cĂ©demment enregistrĂ©e dans le service).Le flux implicite ne prend pas en charge les jetons d'actualisation.Flux d'octroi des informations d'identification client - utilisĂ© lorsque l'application accĂšde Ă l'API. Ce type d'autorisation est gĂ©nĂ©ralement utilisĂ© pour les interactions de serveur Ă serveur qui doivent s'exĂ©cuter en arriĂšre-plan sans interaction immĂ©diate avec l'utilisateur. Le flux d'informations d'identification du client permet au service Web (le client confidentiel) d'utiliser ses propres informations d'identification au lieu d'usurper l'identitĂ© de l'utilisateur pour l'authentification lors de l'appel d'un autre service Web. Pour un niveau de sĂ©curitĂ© plus Ă©levĂ©, il est possible que le service appelant utilise un certificat (au lieu d'un secret partagĂ©) comme informations d'identification.La spĂ©cification OAuth2 est dĂ©crite dans laRFC-6749RFC-8252RFC-6819Jeton JWT et ses avantages
JWT (JSON Web Token) est un standard ouvert ( https://tools.ietf.org/html/rfc7519 ) qui dĂ©finit une mĂ©thode compacte et autonome pour transfĂ©rer en toute sĂ©curitĂ© des informations entre les parties en tant qu'objet JSON.Selon la norme, le jeton se compose de trois parties au format base 64, sĂ©parĂ©es par des points. La premiĂšre partie est appelĂ©e en-tĂȘte, qui contient le type de jeton et le nom de l'algorithme de hachage pour obtenir une signature numĂ©rique. La deuxiĂšme partie stocke les informations de base (utilisateur, attributs, etc.). La troisiĂšme partie est une signature numĂ©rique.<en-tĂȘte codĂ©>. <charge utile codĂ©e>. <signature>N'enregistrez jamais de jeton dans votre base de donnĂ©es. Ătant donnĂ© qu'un jeton valide est Ă©quivalent Ă un mot de passe, le stockage d'un jeton revient Ă stocker un mot de passe en texte clair.Un jeton d'accĂšs est un jeton qui donne Ă son propriĂ©taire un accĂšs aux ressources protĂ©gĂ©es du serveur. Habituellement, il a une courte durĂ©e de vie et peut contenir des informations supplĂ©mentaires, telles que l'adresse IP de la partie demandant ce jeton.Un jeton d'actualisation est un jeton qui permet aux clients de demander de nouveaux jetons d'accĂšs aprĂšs l'expiration de leur durĂ©e de vie. Ces jetons sont gĂ©nĂ©ralement Ă©mis pour une longue pĂ©riode.Principaux avantages de l'application en architecture de microservices:- La possibilitĂ© d'accĂ©der Ă diverses applications et services via une authentification unique.
- En l'absence d'un certain nombre d'attributs requis dans le profil utilisateur, il est possible d'enrichir avec des donnĂ©es qui peuvent ĂȘtre ajoutĂ©es Ă la charge utile, y compris automatisĂ©es et Ă la volĂ©e.
- Il n'est pas nécessaire de stocker des informations sur les sessions actives, l'application serveur doit uniquement vérifier la signature.
- ContrÎle d'accÚs plus flexible avec des attributs supplémentaires dans la charge utile.
- L'utilisation d'une signature de jeton pour l'en-tĂȘte et la charge utile augmente la sĂ©curitĂ© de la solution dans son ensemble.
Jeton JWT - Composition
En - tĂȘte - par dĂ©faut, l'en-tĂȘte contient uniquement le type de jeton et l'algorithme utilisĂ© pour le chiffrement.Le type de jeton est stockĂ© dans la clĂ© "typ". La clĂ© "typ" est ignorĂ©e dans le JWT. Si la clĂ© typ est prĂ©sente, sa valeur doit ĂȘtre JWT pour indiquer que cet objet est un jeton Web JSON.La deuxiĂšme clĂ© alg dĂ©finit l'algorithme utilisĂ© pour chiffrer le jeton. Par dĂ©faut, il doit ĂȘtre dĂ©fini sur HS256. L'en-tĂȘte est codĂ© en base64.{"alg": "HS256", "typ": "JWT"}Charge utile (contenu) - la charge utile stocke toutes les informations qui doivent ĂȘtre vĂ©rifiĂ©es. Chaque clĂ© de la charge utile est appelĂ©e «instruction». Par exemple, la candidature ne peut ĂȘtre saisie que sur invitation (promo fermĂ©e). Lorsque nous voulons inviter quelqu'un Ă participer, nous lui envoyons une lettre d'invitation. Il est important de vĂ©rifier que l'adresse e-mail appartient Ă la personne qui accepte l'invitation, nous inclurons donc cette adresse dans la charge utile, pour cela nous l'enregistrerons dans la clĂ© «e-mail»{"email": "example@x5.ru"}Les clĂ©s de la charge utile peuvent ĂȘtre arbitraires. Cependant, il y en a quelques-uns rĂ©servĂ©s:- iss (Issuer) - dĂ©finit l'application Ă partir de laquelle le jeton est envoyĂ©.
- sub (Subject) - définit le sujet du jeton.
- aud (Audience) â URI, . JWT , â .
- exp (Expiration Time) â , . JWT , . Exp unix .
- nbf (Not Before) â unix , , .
- iat (Issued At) â , JWT. iat unix .
- Jti (JWT ID) â , c .
Il est important de comprendre que la charge utile n'est pas transmise sous forme cryptĂ©e (bien que les jetons puissent ĂȘtre intĂ©grĂ©s et qu'il soit alors possible de transmettre des donnĂ©es cryptĂ©es). Par consĂ©quent, il est impossible d'y stocker des informations secrĂštes. Comme l'en-tĂȘte, la charge utile est codĂ©e en base64.Signature - lorsque nous avons un en-tĂȘte et une charge utile, nous pouvons calculer la signature.EncodĂ© en Base64: l'en-tĂȘte et la charge utile sont pris, ils sont combinĂ©s en une ligne par un point. Ensuite, cette ligne et la clĂ© secrĂšte sont envoyĂ©es Ă l'entrĂ©e de l'algorithme de chiffrement spĂ©cifiĂ© dans l'en-tĂȘte (clĂ© "alg"). La clĂ© peut ĂȘtre n'importe quelle chaĂźne. Des cordes plus longues seront prĂ©fĂ©rables, car cela prendra plus de temps pour correspondre.{"alg": "RSA1_5", "charge utile": "A128CBC-HS256"}Architecture du cluster de basculement Keycloak
Lorsque vous utilisez un seul cluster pour tous les projets, il existe des exigences accrues pour une solution d'authentification unique. Lorsque le nombre de projets est faible, ces exigences ne sont pas si perceptibles pour tous les projets, mais avec une augmentation du nombre d'utilisateurs et d'intĂ©grations, les exigences d'accessibilitĂ© et de productivitĂ© augmentent.L'augmentation du risque de dĂ©faillance d'un SSO unique augmente les exigences pour l'architecture de la solution et les mĂ©thodes utilisĂ©es pour la redondance des composants et conduit Ă un SLA trĂšs serrĂ©. Ă cet Ă©gard, plus souvent lors du dĂ©veloppement ou dans les premiers stades de la mise en Ćuvre de solutions, les projets ont leur propre infrastructure non tolĂ©rante aux pannes. Au fur et Ă mesure de votre dĂ©veloppement, vous devez prĂ©voir la possibilitĂ© de dĂ©veloppement et de mise Ă l'Ă©chelle. Le plus flexible est de crĂ©er un cluster de basculement Ă l'aide de la virtualisation de conteneurs ou d'une approche hybride.Pour travailler dans des clusters actifs / actifs et actifs / passifs, il est nĂ©cessaire d'assurer la cohĂ©rence des donnĂ©es dans une base de donnĂ©es relationnelle - les deux nĆuds de base de donnĂ©es doivent ĂȘtre rĂ©pliquĂ©s de maniĂšre synchrone entre diffĂ©rents centres de donnĂ©es gĂ©o-distribuĂ©s.L'exemple le plus simple d'une installation Ă sĂ©curitĂ© intĂ©grĂ©e.
Quels sont les avantages d'utiliser un seul cluster:- Haute disponibilité et performances.
- Prise en charge des modes de fonctionnement: actif / actif, actif / passif.
- La possibilité d'évoluer dynamiquement - lors de l'utilisation de la virtualisation de conteneurs.
- Possibilité de gestion et de surveillance centralisées.
- Approche unifiée pour l'identification / l'authentification / l'autorisation des utilisateurs dans les projets.
- Interaction plus transparente entre différents projets sans participation des utilisateurs.
- La possibilité de réutiliser le jeton JWT dans divers projets.
- Point de confiance unique.
- Lancement plus rapide de projets utilisant la virtualisation de microservices / conteneurs (pas besoin de monter et configurer des composants supplémentaires).
- Peut-ĂȘtre l'acquisition d'un support commercial auprĂšs du vendeur.
ĂlĂ©ments Ă prendre en compte lors de la planification d'un cluster
SGBD
Keycloak utilise un systĂšme de gestion de SGBD pour sauvegarder: domaines, clients, utilisateurs, etc.Une large gamme de SGBD est prise en charge: MS SQL, Oracle, MySQL, PostgreSQL. Keycloak est livrĂ© avec sa propre base de donnĂ©es relationnelle intĂ©grĂ©e. L'utilisation pour les environnements non chargĂ©s tels que les environnements de dĂ©veloppement est recommandĂ©e.Pour fonctionner dans des clusters actifs / actifs et actifs / passifs, il est nĂ©cessaire de garantir la cohĂ©rence des donnĂ©es dans une base de donnĂ©es relationnelle, et les deux nĆuds du cluster de base de donnĂ©es sont rĂ©pliquĂ©s de maniĂšre synchrone entre les centres de donnĂ©es.Cache distribuĂ© (Infinspan)
Pour que le cluster fonctionne correctement, une synchronisation supplĂ©mentaire des types de cache suivants Ă l'aide de JBoss Data Grid est requise:Sessions d'authentification - utilisĂ©es pour enregistrer les donnĂ©es lors de l'authentification d'un utilisateur spĂ©cifique. Les demandes de ce cache incluent gĂ©nĂ©ralement uniquement le navigateur et le serveur Keycloak, pas l'application.Jetons d'action - utilisĂ©s pour les scĂ©narios oĂč l'utilisateur doit confirmer l'action de maniĂšre asynchrone (par e-mail). Par exemple, pendant le flux de mot de passe oubliĂ©, le cache actionTokens Infinispan est utilisĂ© pour suivre les mĂ©tadonnĂ©es sur les marqueurs d'action associĂ©s qui ont dĂ©jĂ Ă©tĂ© utilisĂ©s, il ne peut donc pas ĂȘtre rĂ©utilisĂ©.Mise en cache et invalidation des donnĂ©es persistantes - utilisĂ© pour mettre en cache les donnĂ©es persistantes pour Ă©viter les requĂȘtes de base de donnĂ©es inutiles. Lorsqu'un serveur Keycloak met Ă jour des donnĂ©es, tous les autres serveurs Keycloak de tous les centres de donnĂ©es doivent en ĂȘtre conscients.Travail - utilisĂ© uniquement pour envoyer des messages d'invalidation entre les nĆuds de cluster et les centres de donnĂ©es.Sessions utilisateur - utilisĂ©es pour enregistrer des donnĂ©es sur les sessions utilisateur valides pour la session de navigation d'un utilisateur. Le cache doit gĂ©rer les requĂȘtes HTTP de l'utilisateur final et de l'application.Protection contre la force brute - utilisĂ©e pour suivre les donnĂ©es de connexion ayant Ă©chouĂ©.L'Ă©quilibrage de charge
L'équilibreur de charge est un point d'entrée unique dans keycloak et devrait prendre en charge les sessions persistantes.Serveur d'application
Ils sont utilisĂ©s pour contrĂŽler l'interaction des composants entre eux et peuvent ĂȘtre virtualisĂ©s ou conteneurisĂ©s Ă l'aide des outils d'automatisation existants et Ă l'Ă©chelle dynamique des outils d'automatisation d'infrastructure. Les scĂ©narios de dĂ©ploiement les plus courants dans OpenShift, Kubernetes, Rancher.Sur ce point, la premiĂšre partie - thĂ©orique - est terminĂ©e. Dans la sĂ©rie d'articles suivante, des exemples d'intĂ©gration avec divers fournisseurs d'identification et des exemples de configuration seront discutĂ©s. Source: https://habr.com/ru/post/undefined/
All Articles