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.html
API JAVA https://www.keycloak.org/docs-api/8.0/javadocs /index.html

Fournisseurs 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 la
RFC-6749
RFC-8252
RFC-6819

Jeton 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