{"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\/fr\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","title":{"rendered":"SSO sur une architecture microservices. Utilisation de Keycloak. Partie n\u00b01","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Dans toute grande entreprise, y compris le groupe X5 Retail, au fur et \u00e0 mesure de leur d\u00e9veloppement, le nombre de projets n\u00e9cessitant une authentification des utilisateurs augmente. Avec le temps, un passage fluide des utilisateurs d'une application \u00e0 une autre devient essentiel, rendant n\u00e9cessaire l'utilisation d'un serveur d'authentification unique, le Single-Sign-On (SSO). Mais que faire lorsque des fournisseurs d'identit\u00e9 comme AD, ou d'autres n'ayant pas d'attributs suppl\u00e9mentaires, sont d\u00e9j\u00e0 utilis\u00e9s dans divers projets ? C'est ici qu'interviennent les classes de syst\u00e8mes appel\u00e9es \u00ab courtiers d'identit\u00e9 \u00bb. Les repr\u00e9sentants les plus fonctionnels de ce syst\u00e8me incluent Keycloak, Gravitee Access management, etc. Les sc\u00e9narios d'utilisation peuvent \u00eatre vari\u00e9s : interaction machine, participation des utilisateurs, etc. La solution doit prendre en charge une fonctionnalit\u00e9 flexible et \u00e9volutive, capable de r\u00e9pondre \u00e0 toutes les exigences en un seul endroit, et c'est ce que repr\u00e9sente actuellement le courtier d'identit\u00e9 dans notre soci\u00e9t\u00e9 \u2013 Keycloak. <\/p>\n<p><img decoding=\"async\" alt=\"SSO sur une architecture microservices. Utilisation de Keycloak. Partie n\u00b01\" 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 est un produit open source destin\u00e9 \u00e0 l'identification et \u00e0 la gestion des acc\u00e8s, soutenu par la soci\u00e9t\u00e9 RedHat. Il constitue la base des produits de l'entreprise utilisant le SSO \u2013 RH-SSO.<\/p>\n<h3>Concepts de base <\/h3>\n<p>\nAvant de commencer \u00e0 examiner les solutions et les approches, il convient de clarifier les termes et la s\u00e9quence des processus :<\/p>\n<p><img decoding=\"async\" alt=\"SSO sur une architecture microservices. Utilisation de Keycloak. Partie n\u00b01\" src=\"\/wp-content\/uploads\/2020\/02\/3a83d4364425aeed1019662fd1d5f152.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Identification<\/b> \u2013 c'est la proc\u00e9dure de reconnaissance d'un sujet par son identifiant (en d'autres termes, il s'agit de d\u00e9terminer le nom, le login ou le num\u00e9ro).<\/p>\n<p><b>Authentification<\/b> \u2013 c'est la proc\u00e9dure de v\u00e9rification de l'authenticit\u00e9 (l'utilisateur est v\u00e9rifi\u00e9 par son mot de passe, un document \u00e9lectronique est v\u00e9rifi\u00e9 par une signature \u00e9lectronique, etc.)<\/p>\n<p><b>Autorisation<\/b> \u2013 c'est l'octroi d'acc\u00e8s \u00e0 une ressource particuli\u00e8re (par exemple, \u00e0 un courriel).<\/p>\n<h4>Le courtier d'identit\u00e9 Keycloak<\/h4>\n<p>\n<b>Keycloak<\/b> est une solution de gestion des identit\u00e9s et des acc\u00e8s open source, con\u00e7ue pour \u00eatre utilis\u00e9e dans des syst\u00e8mes d'information pouvant int\u00e9grer des mod\u00e8les d'architecture microservices.<\/p>\n<p>Keycloak propose des fonctionnalit\u00e9s telles que l'authentification unique (SSO), l'identification via un courtier et la connexion sociale, la f\u00e9d\u00e9ration des utilisateurs, des adaptateurs client, une console d'administration et une console de gestion des comptes.<\/p>\n<p>Fonctionnalit\u00e9 de base prise en charge dans Keycloak :<\/p>\n<ul>\n<li>Single-Sign On et Single-Sign Out pour les applications web.<\/li>\n<li>Support d'OpenID\/OAuth 2.0\/SAML.<\/li>\n<li>Rassemblement d'identit\u00e9 \u2013 authentification via des fournisseurs d'identit\u00e9 externes OpenID Connect ou SAML.<\/li>\n<li>Connexion sociale \u2013 prise en charge de Google, GitHub, Facebook, Twitter pour l'identification des utilisateurs.<\/li>\n<li>F\u00e9d\u00e9ration d'utilisateurs \u2013 synchronisation des utilisateurs \u00e0 partir des serveurs LDAP et Active Directory et d'autres fournisseurs d'identit\u00e9.<\/li>\n<li>Pont Kerberos \u2013 utilisation du serveur Kerberos pour l'authentification automatique des utilisateurs.<\/li>\n<li>Console d'administration \u2014 pour la gestion centralis\u00e9e des param\u00e8tres et options de la solution via le Web.<\/li>\n<li>Console de gestion des comptes \u2013 pour une gestion autonome des profils utilisateurs.<\/li>\n<li>Personnalisation de la solution en fonction de l'identit\u00e9 de l'entreprise.<\/li>\n<li>Authentification 2FA \u2013 prise en charge de TOTP\/HOTP avec Google Authenticator ou FreeOTP.<\/li>\n<li>Flux de connexion \u2013 possibilit\u00e9 d'auto-inscription des utilisateurs, de r\u00e9cup\u00e9ration et de r\u00e9initialisation de mot de passe, etc.<\/li>\n<li>Gestion des sessions \u2013 les administrateurs peuvent g\u00e9rer les sessions des utilisateurs \u00e0 partir d'un point central.<\/li>\n<li>Mappeurs de jetons \u2013 association des attributs des utilisateurs, des r\u00f4les et d'autres attributs requis dans les jetons.<\/li>\n<li>Gestion flexible des politiques via le realm, l'application et les utilisateurs.<\/li>\n<li>Support CORS \u2013 les adaptateurs clients disposent d'un support CORS int\u00e9gr\u00e9.<\/li>\n<li>Interfaces de fournisseur de services (SPI) \u2013 un grand nombre de SPI permettant de configurer diff\u00e9rents aspects du fonctionnement du serveur : flux d'authentification, fournisseurs d'identit\u00e9, mappage de protocoles, etc.<\/li>\n<li>Adaptateurs clients pour les applications JavaScript, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring.<\/li>\n<li>Support pour les applications utilisant la biblioth\u00e8que OpenID Connect Relying Party ou la biblioth\u00e8que SAML 2.0 Service Provider.<\/li>\n<li>Possibilit\u00e9 d'extension avec des plugins.<\/li>\n<\/ul>\n<p>\nPour les processus CI\/CD ainsi que pour l'automatisation de la gestion dans Keycloak, l'API REST\/JAVA API peut \u00eatre utilis\u00e9e. La documentation est disponible sous forme \u00e9lectronique : <\/p>\n<p>API REST <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 \/>\nAPI JAVA <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>Fournisseurs d'identit\u00e9 de niveau entreprise (On-Premise)<\/h4>\n<p>\nPossibilit\u00e9 d'authentification des utilisateurs via des services de f\u00e9d\u00e9ration d'utilisateurs.<\/p>\n<p><img decoding=\"async\" alt=\"SSO sur une architecture microservices. Utilisation de Keycloak. Partie n\u00b01\" src=\"\/wp-content\/uploads\/2020\/02\/59bbeaf4630855467ddb003d52b0c1b6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nL'authentification unique peut \u00e9galement \u00eatre utilis\u00e9e \u2014 si les utilisateurs sont authentifi\u00e9s sur des stations de travail avec Kerberos (LDAP ou AD), ils peuvent \u00eatre automatiquement authentifi\u00e9s sur Keycloak sans avoir \u00e0 ressaisir leur nom d'utilisateur et mot de passe. <\/p>\n<p>Pour l'authentification et l'autorisation ult\u00e9rieure des utilisateurs, il est possible d'utiliser une base de donn\u00e9es relationnelle, ce qui est particuli\u00e8rement adapt\u00e9 aux environnements de d\u00e9veloppement, car cela n'entra\u00eene pas de configurations et d'int\u00e9grations prolong\u00e9es aux premi\u00e8res \u00e9tapes des projets. Par d\u00e9faut, Keycloak utilise une base de donn\u00e9es int\u00e9gr\u00e9e pour stocker les param\u00e8tres et les donn\u00e9es des utilisateurs.<\/p>\n<p>La liste des bases de donn\u00e9es support\u00e9es est vaste et inclut : MS SQL, Oracle, PostgreSQL, MariaDB, Oracle et d'autres. Les plus test\u00e9es \u00e0 ce jour sont Oracle 12C Release 1 RAC et le cluster Galera 3.12 pour MariaDB 10.1.19. <\/p>\n<h4>Fournisseurs d'identification \u2014 connexion sociale <\/h4>\n<p>\nIl est possible d'utiliser un identifiant provenant des r\u00e9seaux sociaux. Pour activer la possibilit\u00e9 d'authentifier les utilisateurs, la console d'administration de Keycloak est utilis\u00e9e. Aucun changement dans le code des applications n'est n\u00e9cessaire et cette fonctionnalit\u00e9 est disponible 'out of the box' et peut \u00eatre activ\u00e9e \u00e0 tout stade de la r\u00e9alisation du projet.<\/p>\n<p><img decoding=\"async\" alt=\"SSO sur une architecture microservices. Utilisation de Keycloak. Partie n\u00b01\" src=\"\/wp-content\/uploads\/2020\/02\/546ddea10c79662ca37a448d3dfc1fd0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPour l'authentification des utilisateurs, il est possible d'utiliser des fournisseurs d'identit\u00e9 OpenID\/SAML.<\/p>\n<h3>Sc\u00e9narios d'autorisation typiques utilisant OAuth2 dans Keycloak<\/h3>\n<p>\n<b>Flux de code d'autorisation <\/b> \u2014 utilis\u00e9 avec des applications serveur (applications c\u00f4t\u00e9 serveur). C'est l'un des types les plus courants d'autorisation, car il convient particuli\u00e8rement bien aux applications serveur dont le code source et les donn\u00e9es client ne sont pas accessibles \u00e0 des tiers. Le processus repose sur la redirection. L'application doit \u00eatre capable d'interagir avec l'agent utilisateur, tel qu'un navigateur web \u2014 en obtenant des codes d'autorisation API redirig\u00e9s via l'agent utilisateur.<\/p>\n<p><b>Flux implicite<\/b> \u2014 utilis\u00e9 par des applications mobiles ou web (applications fonctionnant sur l'appareil de l'utilisateur).<\/p>\n<p>Le type de permission implicite est utilis\u00e9 par les applications mobiles et web o\u00f9 la confidentialit\u00e9 du client ne peut pas \u00eatre garantie. Ce type de permission utilise \u00e9galement la redirection de l'agent utilisateur, le jeton d'acc\u00e8s \u00e9tant transmis \u00e0 l'agent utilisateur pour une utilisation ult\u00e9rieure dans l'application. Cela rend le jeton accessible \u00e0 l'utilisateur et \u00e0 d'autres applications sur l'appareil de l'utilisateur. Avec ce type de permission, l'authentification de l'application n'est pas effectu\u00e9e, le processus reposant sur l'URL de redirection (enregistr\u00e9e auparavant dans le service).<\/p>\n<p>Le Flux Implicite ne supporte pas les jetons de rafra\u00eechissement (refresh tokens).<br \/>\n<br \/>\n<b>Flux d'Octroi de Credentials Client<\/b> \u2014 utilis\u00e9 lors de l'acc\u00e8s de l'application \u00e0 l'API. Ce type de permission est g\u00e9n\u00e9ralement utilis\u00e9 pour les interactions \u00ab serveur-serveur \u00bb, qui doivent se d\u00e9rouler en arri\u00e8re-plan sans interaction imm\u00e9diate avec l'utilisateur. Le flux de fourniture d'identifiants client permet \u00e0 un service web (client confidentiel) d'utiliser ses propres identifiants au lieu de l'authentification de l'utilisateur lors de l'appel d'un autre service web. Pour un niveau de s\u00e9curit\u00e9 sup\u00e9rieur, il est possible que le service appelant utilise un certificat (au lieu d'un secret partag\u00e9) comme identifiant.<\/p>\n<p>La sp\u00e9cification OAuth2 est d\u00e9crite dans <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>Jeton JWT et ses avantages<\/h3>\n<p>\nJWT (JSON Web Token) est une norme ouverte (<noindex><a rel=\"nofollow\" href=\"https:\/\/tools.ietf.org\/html\/rfc7519\">https:\/\/tools.ietf.org\/html\/rfc7519<\/a><\/noindex>), qui d\u00e9finit un moyen compact et autonome pour la transmission s\u00e9curis\u00e9e d'informations entre les parties sous la forme d'un objet JSON.<\/p>\n<p>Selon la norme, le jeton se compose de trois parties au format base-64, s\u00e9par\u00e9es par des points. La premi\u00e8re partie s'appelle l'en-t\u00eate (header), qui contient le type de jeton et le nom de l'algorithme de hachage utilis\u00e9 pour produire la signature num\u00e9rique. La deuxi\u00e8me partie contient l'information principale (utilisateur, attributs, etc.). La troisi\u00e8me partie est la signature num\u00e9rique.<\/p>\n<p>..<br \/>\nNe stockez jamais de jeton dans votre BDD. Un jeton valide est \u00e9quivalent \u00e0 un mot de passe, stocker un jeton revient \u00e0 stocker un mot de passe en clair.<br \/>\n<b>Jeton d'acc\u00e8s <\/b>\u2014 c'est un jeton qui donne \u00e0 son titulaire acc\u00e8s aux ressources prot\u00e9g\u00e9es du serveur. Il a g\u00e9n\u00e9ralement une dur\u00e9e de vie courte et peut contenir des informations suppl\u00e9mentaires, comme l'adresse IP de la partie demandant ce jeton.<\/p>\n<p><b>Jeton de rafra\u00eechissement <\/b>\u2014 c'est un jeton qui permet aux clients de demander de nouveaux jetons d'acc\u00e8s apr\u00e8s leur p\u00e9riode de validit\u00e9. Ces jetons sont g\u00e9n\u00e9ralement d\u00e9livr\u00e9s pour une longue dur\u00e9e.<\/p>\n<p>Principaux avantages d'une telle application dans une architecture microservices :<\/p>\n<ul>\n<li>Possibilit\u00e9 d'acc\u00e9der \u00e0 diff\u00e9rentes applications et services par le biais d'une authentification unique.<\/li>\n<li>En l'absence de certains attributs requis dans les profils utilisateur, il est possible d'enrichir les donn\u00e9es, y compris automatiquement et '\u00e0 la vol\u00e9e'.<\/li>\n<li>Pas besoin de stocker des informations sur les sessions actives ; l'application serveur doit simplement v\u00e9rifier la signature.<\/li>\n<li>Gestion des acc\u00e8s plus flexible gr\u00e2ce \u00e0 des attributs suppl\u00e9mentaires dans la charge utile.<\/li>\n<li>L'utilisation de la signature du jeton pour l'en-t\u00eate et la charge utile renforce la s\u00e9curit\u00e9 de la solution dans son ensemble.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Jeton JWT \u2014 composant<\/h3>\n<p>\n<b>L'en-t\u00eate<\/b> \u2014 par d\u00e9faut, l'en-t\u00eate contient uniquement le type de jeton et l'algorithme utilis\u00e9 pour le chiffrement.<\/p>\n<p>Le type de jeton est stock\u00e9 dans la cl\u00e9 \u00ab typ \u00bb. La cl\u00e9 \u00ab typ \u00bb est ignor\u00e9e dans JWT. Si la cl\u00e9 \u00ab typ \u00bb est pr\u00e9sente, sa valeur doit \u00eatre JWT pour indiquer que cet objet est un JSON Web Token.<\/p>\n<p>La deuxi\u00e8me cl\u00e9 \u00ab alg \u00bb d\u00e9finit l'algorithme utilis\u00e9 pour chiffrer le jeton. Par d\u00e9faut, il doit \u00eatre d\u00e9fini sur HS256. L'en-t\u00eate est cod\u00e9 en base64.<\/p>\n<p>{ \"alg\": \"HS256\", \"typ\": \"JWT\"}<br \/>\n<b>Charge utile (contenu)<\/b> \u2014 dans la charge utile est stock\u00e9e toute information \u00e0 v\u00e9rifier. Chaque cl\u00e9 dans la charge utile est connue sous le nom de \u00ab d\u00e9claration \u00bb. Par exemple, on peut entrer dans l'application uniquement sur invitation (promotion ferm\u00e9e). Lorsque nous voulons inviter quelqu'un \u00e0 participer, nous lui envoyons un courriel d'invitation. Il est important de v\u00e9rifier que l'adresse \u00e9lectronique appartient \u00e0 la personne qui accepte l'invitation, donc nous allons inclure cette adresse dans la charge utile, en la sauvegardant sous la cl\u00e9 \u00ab e-mail \u00bb<\/p>\n<p>{ \"email\": \"example@x5.ru\" }<br \/>\n<br \/>\nLes cl\u00e9s dans la charge utile peuvent \u00eatre arbitraires. Cependant, il y a plusieurs r\u00e9serv\u00e9es :<\/p>\n<ul>\n<li>iss (\u00c9metteur) \u2014 d\u00e9termine l'application \u00e0 partir de laquelle le jeton est envoy\u00e9.<\/li>\n<li>sub (Sujet) \u2014 d\u00e9finit le sujet du jeton.<\/li>\n<li>aud (Audience) \u2013 un tableau de cha\u00eenes sensibles \u00e0 la casse ou d'URI, repr\u00e9sentant la liste des destinataires de ce jeton. Lorsque le destinataire re\u00e7oit un JWT avec cette cl\u00e9, il doit v\u00e9rifier sa pr\u00e9sence parmi les destinataires, sinon ignorer le jeton.<\/li>\n<li>exp (Heure d'expiration) \u2014 indique quand le jeton expire. La norme JWT exige que, dans toutes ses impl\u00e9mentations, les jetons expir\u00e9s soient rejet\u00e9s. La cl\u00e9 exp doit \u00eatre un timestamp au format unix.<\/li>\n<li>nbf (Non avant) \u2014 un temps au format unix, d\u00e9finissant le moment o\u00f9 le jeton deviendra valide.<\/li>\n<li>iat (\u00c9mis \u00e0) \u2014 cette cl\u00e9 repr\u00e9sente l'heure \u00e0 laquelle le jeton a \u00e9t\u00e9 \u00e9mis et peut \u00eatre utilis\u00e9e pour d\u00e9terminer l'\u00e2ge du JWT. La cl\u00e9 iat doit \u00eatre un timestamp au format unix.<\/li>\n<li>Jti (ID JWT) \u2014 cha\u00eene d\u00e9finissant un identifiant unique pour ce jeton, sensible \u00e0 la casse.<\/li>\n<\/ul>\n<p>\nIl est important de comprendre que la charge utile n'est pas transmise de mani\u00e8re chiffr\u00e9e (bien que les jetons puissent \u00eatre imbriqu\u00e9s et ainsi permettre de transmettre des donn\u00e9es chiffr\u00e9es). Par cons\u00e9quent, elle ne doit pas contenir d'informations sensibles. Comme pour l'en-t\u00eate, la charge utile est encod\u00e9e en base64.<br \/>\n<b>Signature<\/b> \u2014 lorsque nous avons l'en-t\u00eate et la charge utile, nous pouvons calculer la signature.<\/p>\n<p>Les \u00e9l\u00e9ments cod\u00e9s en base64 : l'en-t\u00eate et la charge utile sont combin\u00e9s en une seule cha\u00eene \u00e0 l'aide d'un point. Ensuite, cette cha\u00eene et la cl\u00e9 secr\u00e8te sont entr\u00e9es dans l'algorithme de cryptage sp\u00e9cifi\u00e9 dans l'en-t\u00eate (cl\u00e9 \u00ab alg \u00bb). La cl\u00e9 peut \u00eatre n'importe quelle cha\u00eene. Des cha\u00eenes plus longues seront pr\u00e9f\u00e9rables, car elles n\u00e9cessiteront plus de temps pour \u00eatre d\u00e9chiffr\u00e9es.<\/p>\n<p>{\"alg\":\"RSA1_5\",\"payload\":\"A128CBC-HS256\"}<\/p>\n<h3>Construction de l'architecture d'un cluster Keycloak tol\u00e9rant aux pannes<\/h3>\n<p>\nLorsque l'on utilise un seul cluster pour tous les projets, les exigences pour la solution SSO augmentent. Quand le nombre de projets est faible, ces exigences ne sont pas tr\u00e8s marqu\u00e9es pour tous les projets, mais \u00e0 mesure que le nombre d'utilisateurs et d'int\u00e9grations augmente, les exigences en mati\u00e8re de disponibilit\u00e9 et de performance s'intensifient. <\/p>\n<p>L'augmentation des risques de d\u00e9faillance du SSO unique renforce les exigences en mati\u00e8re d'architecture des solutions et des m\u00e9thodes de redondance des composants, entra\u00eenant des SLA tr\u00e8s stricts. En cons\u00e9quence, il est fr\u00e9quent que lors du d\u00e9veloppement ou des premi\u00e8res \u00e9tapes de mise en \u0153uvre des solutions, des projets poss\u00e8dent leur propre infrastructure non redondante. Au fur et \u00e0 mesure de l'\u00e9volution, il est n\u00e9cessaire de pr\u00e9voir des capacit\u00e9s de d\u00e9veloppement et de mise \u00e0 l'\u00e9chelle. Il est plus flexible de construire un cluster tol\u00e9rant aux pannes en utilisant la virtualisation par conteneurs ou une approche hybride. <\/p>\n<p>Pour fonctionner en mode Active\/Active et Active\/Passive, le cluster doit garantir la coh\u00e9rence des donn\u00e9es dans la base de donn\u00e9es relationnelle \u2014 les deux n\u0153uds de la base de donn\u00e9es doivent \u00eatre r\u00e9pliqu\u00e9s de mani\u00e8re synchrone entre diff\u00e9rents centres de donn\u00e9es g\u00e9o-distribu\u00e9s.<\/p>\n<p>L'exemple le plus simple d'une installation tol\u00e9rante aux pannes.<\/p>\n<p><img decoding=\"async\" alt=\"SSO sur une architecture microservices. Utilisation de Keycloak. Partie n\u00b01\" src=\"\/wp-content\/uploads\/2020\/02\/c0df30a07e7dda5ae892a1fca3790a45.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQuels sont les avantages d'utiliser un cluster unique :<\/p>\n<ul>\n<li>Haute disponibilit\u00e9 et performance.<\/li>\n<li>Support des modes de fonctionnement : Active\/Active, Active\/Passive.<\/li>\n<li>Possibilit\u00e9 d'\u00e9volutivit\u00e9 dynamique \u2014 lors de l'utilisation de la virtualisation par conteneurs.<\/li>\n<li>Possibilit\u00e9 de gestion et de surveillance centralis\u00e9es.<\/li>\n<li>Une approche unique pour l'identification\/authentification\/autorisation des utilisateurs dans les projets.<\/li>\n<li>Une interaction plus transparente entre diff\u00e9rents projets sans intervention des utilisateurs.<\/li>\n<li>Possibilit\u00e9 de r\u00e9utilisation du token JWT dans diff\u00e9rents projets.<\/li>\n<li>Un point de confiance unique.<\/li>\n<li>Lancement plus rapide des projets en utilisant des microservices\/virtualisation par conteneurs (pas besoin de d\u00e9ployer et configurer des composants suppl\u00e9mentaires).<\/li>\n<li>Possibilit\u00e9 d'acqu\u00e9rir un support commercial aupr\u00e8s du fournisseur. <\/li>\n<\/ul>\n<p><\/p>\n<h3>\u00c0 quoi faire attention lors de la planification d'un cluster<\/h3>\n<p><\/p>\n<h4>SGBD<\/h4>\n<p>\nKeycloak utilise un syst\u00e8me de gestion de SGBD pour sauvegarder : realms, clients, utilisateurs, etc.<br \/>\nUn large \u00e9ventail de SGBD est support\u00e9 : MS SQL, Oracle, MySQL, PostgreSQL. Keycloak est fourni avec sa propre base de donn\u00e9es relationnelle int\u00e9gr\u00e9e. Son utilisation est recommand\u00e9e pour les environnements peu charg\u00e9s \u2014 tels que les environnements de d\u00e9veloppement.<\/p>\n<p>Pour fonctionner en mode Active\/Active et Active\/Passive, le cluster doit garantir la coh\u00e9rence des donn\u00e9es dans la base de donn\u00e9es relationnelle, et les deux n\u0153uds du cluster de bases de donn\u00e9es sont r\u00e9pliqu\u00e9s de mani\u00e8re synchrone entre les centres de donn\u00e9es.<\/p>\n<h4>Cache distribu\u00e9 (Infinispan)<\/h4>\n<p>\nPour un bon fonctionnement du cluster, une synchronisation suppl\u00e9mentaire des types de cache suivants est requise \u00e0 l'aide de JBoss Data Grid :<\/p>\n<p>Sessions d'authentification \u2014 utilis\u00e9es pour stocker les donn\u00e9es lors de l'authentification d'un utilisateur sp\u00e9cifique. Les requ\u00eates provenant de ce cache incluent g\u00e9n\u00e9ralement uniquement le navigateur et le serveur Keycloak, mais pas l'application.<\/p>\n<p>Tokens d'action \u2014 utilis\u00e9s pour des sc\u00e9narios o\u00f9 l'utilisateur doit confirmer une action de mani\u00e8re asynchrone (par email). Par exemple, lors du processus de r\u00e9initialisation de mot de passe, le cache actionTokens Infinispan est utilis\u00e9 pour suivre les m\u00e9tadonn\u00e9es concernant les tokens d'action associ\u00e9s qui ont d\u00e9j\u00e0 \u00e9t\u00e9 utilis\u00e9s, de sorte qu'ils ne peuvent pas \u00eatre r\u00e9utilis\u00e9s.<\/p>\n<p>Mise en cache et invalidation des donn\u00e9es persistantes \u2013 utilis\u00e9es pour mettre en cache des donn\u00e9es permanentes afin d'\u00e9viter les requ\u00eates excessives \u00e0 la base de donn\u00e9es. Lorsque l'un des serveurs Keycloak met \u00e0 jour des donn\u00e9es, tous les autres serveurs Keycloak dans tous les centres de donn\u00e9es doivent en \u00eatre inform\u00e9s.<\/p>\n<p>Travail \u2014 uniquement utilis\u00e9 pour envoyer des messages d'invalidation entre les n\u0153uds du cluster et les centres de donn\u00e9es. <\/p>\n<p>Sessions utilisateur \u2014 utilis\u00e9es pour conserver les donn\u00e9es sur les sessions des utilisateurs qui sont valides pendant la session de leur navigateur. Le cache doit traiter les requ\u00eates HTTP provenant de l'utilisateur final et de l'application. <\/p>\n<p>Protection contre les attaques par force brute \u2014 utilis\u00e9e pour suivre les donn\u00e9es concernant les tentatives de connexion \u00e9chou\u00e9es. <\/p>\n<h4>\u00c9quilibrage de charge<\/h4>\n<p>\nLe r\u00e9partiteur de charge est un point d'entr\u00e9e unique dans Keycloak et doit prendre en charge les sessions persistantes. <\/p>\n<h4>Serveurs d'applications<\/h4>\n<p>\nUtilis\u00e9s pour contr\u00f4ler l'interaction entre les composants et peuvent \u00eatre virtualis\u00e9s ou conteneuris\u00e9s \u00e0 l'aide des outils d'automatisation existants et de l'\u00e9volutivit\u00e9 dynamique des infrastructures automatis\u00e9es. Les sc\u00e9narios de d\u00e9ploiement les plus courants sont dans OpenShift, Kubernetes, Rancher.<\/p>\n<p>Voici la premi\u00e8re partie \u2014 th\u00e9orique \u2014 qui est termin\u00e9e. Dans les prochains cycles d'articles, des exemples d'int\u00e9grations avec divers fournisseurs d'identit\u00e9s et des exemples de configurations seront examin\u00e9s.<br \/>\n<br \/>Source : <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.2 - 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\/fr\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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 sur une architecture de microservices. Utiliser Keycloak. Partie \u21161 | ProHoster","description":"Dans toute grande entreprise, et le groupe X5 Retail ne fait pas exception, le nombre de projets n\u00e9cessitant l'autorisation des utilisateurs augmente avec le d\u00e9veloppement.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/40865","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=40865"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/40865\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/40866"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=40865"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=40865"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=40865"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}