Dans toute grande entreprise, y compris le groupe X5 Retail, au fur et Ă mesure de leur dĂ©veloppement, le nombre de projets nĂ©cessitant une authentification des utilisateurs augmente. Avec le temps, un passage fluide des utilisateurs d'une application Ă une autre devient essentiel, rendant nĂ©cessaire l'utilisation d'un serveur d'authentification unique, le Single-Sign-On (SSO). Mais que faire lorsque des fournisseurs d'identitĂ© comme AD, ou d'autres n'ayant pas d'attributs supplĂ©mentaires, sont dĂ©jĂ utilisĂ©s dans divers projets ? C'est ici qu'interviennent les classes de systĂšmes appelĂ©es « courtiers d'identitĂ© ». Les reprĂ©sentants les plus fonctionnels de ce systĂšme incluent Keycloak, Gravitee Access management, etc. Les scĂ©narios d'utilisation peuvent ĂȘtre variĂ©s : interaction machine, participation des utilisateurs, etc. La solution doit prendre en charge une fonctionnalitĂ© flexible et Ă©volutive, capable de rĂ©pondre Ă toutes les exigences en un seul endroit, et c'est ce que reprĂ©sente actuellement le courtier d'identitĂ© dans notre sociĂ©tĂ© â Keycloak.

Keycloak est un produit open source destinĂ© Ă l'identification et Ă la gestion des accĂšs, soutenu par la sociĂ©tĂ© RedHat. Il constitue la base des produits de l'entreprise utilisant le SSO â RH-SSO.
Concepts de base
Avant de commencer à examiner les solutions et les approches, il convient de clarifier les termes et la séquence des processus :

Identification â c'est la procĂ©dure de reconnaissance d'un sujet par son identifiant (en d'autres termes, il s'agit de dĂ©terminer le nom, le login ou le numĂ©ro).
Authentification â c'est la procĂ©dure de vĂ©rification de l'authenticitĂ© (l'utilisateur est vĂ©rifiĂ© par son mot de passe, un document Ă©lectronique est vĂ©rifiĂ© par une signature Ă©lectronique, etc.)
Autorisation â c'est l'octroi d'accĂšs Ă une ressource particuliĂšre (par exemple, Ă un courriel).
Le courtier d'identité Keycloak
Keycloak est une solution de gestion des identitĂ©s et des accĂšs open source, conçue pour ĂȘtre utilisĂ©e dans des systĂšmes d'information pouvant intĂ©grer des modĂšles d'architecture microservices.
Keycloak propose des fonctionnalités telles que l'authentification unique (SSO), l'identification via un courtier et la connexion sociale, la fédération des utilisateurs, des adaptateurs client, une console d'administration et une console de gestion des comptes.
Fonctionnalité de base prise en charge dans Keycloak :
- Single-Sign On et Single-Sign Out pour les applications web.
- Support d'OpenID/OAuth 2.0/SAML.
- Rassemblement d'identitĂ© â authentification via des fournisseurs d'identitĂ© externes OpenID Connect ou SAML.
- Connexion sociale â prise en charge de Google, GitHub, Facebook, Twitter pour l'identification des utilisateurs.
- FĂ©dĂ©ration d'utilisateurs â synchronisation des utilisateurs Ă partir des serveurs LDAP et Active Directory et d'autres fournisseurs d'identitĂ©.
- Pont Kerberos â utilisation du serveur Kerberos pour l'authentification automatique des utilisateurs.
- Console d'administration â pour la gestion centralisĂ©e des paramĂštres et options de la solution via le Web.
- Console de gestion des comptes â pour une gestion autonome des profils utilisateurs.
- Personnalisation de la solution en fonction de l'identité de l'entreprise.
- Authentification 2FA â prise en charge de TOTP/HOTP avec Google Authenticator ou FreeOTP.
- Flux de connexion â possibilitĂ© d'auto-inscription des utilisateurs, de rĂ©cupĂ©ration et de rĂ©initialisation de mot de passe, etc.
- Gestion des sessions â les administrateurs peuvent gĂ©rer les sessions des utilisateurs Ă partir d'un point central.
- Mappeurs de jetons â association des attributs des utilisateurs, des rĂŽles et d'autres attributs requis dans les jetons.
- Gestion flexible des politiques via le realm, l'application et les utilisateurs.
- Support CORS â les adaptateurs clients disposent d'un support CORS intĂ©grĂ©.
- Interfaces de fournisseur de services (SPI) â un grand nombre de SPI permettant de configurer diffĂ©rents aspects du fonctionnement du serveur : flux d'authentification, fournisseurs d'identitĂ©, mappage de protocoles, etc.
- Adaptateurs clients pour les applications JavaScript, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring.
- Support pour les applications utilisant la bibliothĂšque OpenID Connect Relying Party ou la bibliothĂšque SAML 2.0 Service Provider.
- Possibilité d'extension avec des plugins.
Pour les processus CI/CD ainsi que pour l'automatisation de la gestion dans Keycloak, l'API REST/JAVA API peut ĂȘtre utilisĂ©e. La documentation est disponible sous forme Ă©lectronique :
API REST
API JAVA
Fournisseurs d'identité de niveau entreprise (On-Premise)
Possibilité d'authentification des utilisateurs via des services de fédération d'utilisateurs.

L'authentification unique peut Ă©galement ĂȘtre utilisĂ©e â si les utilisateurs sont authentifiĂ©s sur des stations de travail avec Kerberos (LDAP ou AD), ils peuvent ĂȘtre automatiquement authentifiĂ©s sur Keycloak sans avoir Ă ressaisir leur nom d'utilisateur et mot de passe.
Pour l'authentification et l'autorisation ultérieure des utilisateurs, il est possible d'utiliser une base de données relationnelle, ce qui est particuliÚrement adapté aux environnements de développement, car cela n'entraßne pas de configurations et d'intégrations prolongées aux premiÚres étapes des projets. Par défaut, Keycloak utilise une base de données intégrée pour stocker les paramÚtres et les données des utilisateurs.
La liste des bases de données supportées est vaste et inclut : MS SQL, Oracle, PostgreSQL, MariaDB, Oracle et d'autres. Les plus testées à ce jour sont Oracle 12C Release 1 RAC et le cluster Galera 3.12 pour MariaDB 10.1.19.
Fournisseurs d'identification â connexion sociale
Il est possible d'utiliser un identifiant provenant des rĂ©seaux sociaux. Pour activer la possibilitĂ© d'authentifier les utilisateurs, la console d'administration de Keycloak est utilisĂ©e. Aucun changement dans le code des applications n'est nĂ©cessaire et cette fonctionnalitĂ© est disponible 'out of the box' et peut ĂȘtre activĂ©e Ă tout stade de la rĂ©alisation du projet.

Pour l'authentification des utilisateurs, il est possible d'utiliser des fournisseurs d'identité OpenID/SAML.
Scénarios d'autorisation typiques utilisant OAuth2 dans Keycloak
Flux de code d'autorisation â utilisĂ© avec des applications serveur (applications cĂŽtĂ© serveur). C'est l'un des types les plus courants d'autorisation, car il convient particuliĂšrement bien aux applications serveur dont le code source et les donnĂ©es client ne sont pas accessibles Ă des tiers. Le processus repose sur la redirection. L'application doit ĂȘtre capable d'interagir avec l'agent utilisateur, tel qu'un navigateur web â en obtenant des codes d'autorisation API redirigĂ©s via l'agent utilisateur.
Flux implicite â utilisĂ© par des applications mobiles ou web (applications fonctionnant sur l'appareil de l'utilisateur).
Le type de permission implicite est utilisĂ© par les applications mobiles et web oĂč la confidentialitĂ© du client ne peut pas ĂȘtre garantie. Ce type de permission utilise Ă©galement la redirection de l'agent utilisateur, le jeton d'accĂšs Ă©tant transmis Ă l'agent utilisateur pour une utilisation ultĂ©rieure dans l'application. Cela rend le jeton accessible Ă l'utilisateur et Ă d'autres applications sur l'appareil de l'utilisateur. Avec ce type de permission, l'authentification de l'application n'est pas effectuĂ©e, le processus reposant sur l'URL de redirection (enregistrĂ©e auparavant dans le service).
Le Flux Implicite ne supporte pas les jetons de rafraĂźchissement (refresh tokens).
Flux d'Octroi de Credentials Client â utilisĂ© lors de l'accĂšs de l'application Ă l'API. Ce type de permission est gĂ©nĂ©ralement utilisĂ© pour les interactions « serveur-serveur », qui doivent se dĂ©rouler en arriĂšre-plan sans interaction immĂ©diate avec l'utilisateur. Le flux de fourniture d'identifiants client permet Ă 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Ă©curitĂ© supĂ©rieur, il est possible que le service appelant utilise un certificat (au lieu d'un secret partagĂ©) comme identifiant.
La spécification OAuth2 est décrite dans
Jeton JWT et ses avantages
JWT (JSON Web Token) est une norme ouverte (), qui définit un moyen compact et autonome pour la transmission sécurisée d'informations entre les parties sous la forme d'un 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 s'appelle l'en-tĂȘte (header), qui contient le type de jeton et le nom de l'algorithme de hachage utilisĂ© pour produire la signature numĂ©rique. La deuxiĂšme partie contient l'information principale (utilisateur, attributs, etc.). La troisiĂšme partie est la signature numĂ©rique.
..
Ne stockez jamais de jeton dans votre BDD. Un jeton valide est équivalent à un mot de passe, stocker un jeton revient à stocker un mot de passe en clair.
Jeton d'accĂšs â c'est un jeton qui donne Ă son titulaire accĂšs aux ressources protĂ©gĂ©es du serveur. Il a gĂ©nĂ©ralement une durĂ©e de vie courte et peut contenir des informations supplĂ©mentaires, comme l'adresse IP de la partie demandant ce jeton.
Jeton de rafraĂźchissement â c'est un jeton qui permet aux clients de demander de nouveaux jetons d'accĂšs aprĂšs leur pĂ©riode de validitĂ©. Ces jetons sont gĂ©nĂ©ralement dĂ©livrĂ©s pour une longue durĂ©e.
Principaux avantages d'une telle application dans une architecture microservices :
- Possibilité d'accéder à différentes applications et services par le biais d'une authentification unique.
- En l'absence de certains attributs requis dans les profils utilisateur, il est possible d'enrichir les données, y compris automatiquement et 'à la volée'.
- Pas besoin de stocker des informations sur les sessions actives ; l'application serveur doit simplement vérifier la signature.
- Gestion des accÚs plus flexible grùce à des attributs supplémentaires dans la charge utile.
- L'utilisation de la signature du jeton pour l'en-tĂȘte et la charge utile renforce la sĂ©curitĂ© de la solution dans son ensemble.
Jeton JWT â composant
L'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 JWT. Si la clĂ© « typ » est prĂ©sente, sa valeur doit ĂȘtre JWT pour indiquer que cet objet est un JSON Web Token.
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) â dans la charge utile est stockĂ©e toute information Ă vĂ©rifier. Chaque clĂ© dans la charge utile est connue sous le nom de « dĂ©claration ». Par exemple, on peut entrer dans l'application uniquement sur invitation (promotion fermĂ©e). Lorsque nous voulons inviter quelqu'un Ă participer, nous lui envoyons un courriel d'invitation. Il est important de vĂ©rifier que l'adresse Ă©lectronique appartient Ă la personne qui accepte l'invitation, donc nous allons inclure cette adresse dans la charge utile, en la sauvegardant sous la clĂ© « e-mail »
{ "email": "example@x5.fr" }
Les clĂ©s dans la charge utile peuvent ĂȘtre arbitraires. Cependant, il y a plusieurs rĂ©servĂ©es :
- iss (Ămetteur) â dĂ©termine l'application Ă partir de laquelle le jeton est envoyĂ©.
- sub (Sujet) â dĂ©finit le sujet du jeton.
- aud (Audience) â un tableau de chaĂźnes sensibles Ă la casse ou d'URI, reprĂ©sentant la liste des destinataires de ce jeton. Lorsque le destinataire reçoit un JWT avec cette clĂ©, il doit vĂ©rifier sa prĂ©sence parmi les destinataires, sinon ignorer le jeton.
- exp (Heure d'expiration) â indique quand le jeton expire. La norme JWT exige que, dans toutes ses implĂ©mentations, les jetons expirĂ©s soient rejetĂ©s. La clĂ© exp doit ĂȘtre un timestamp au format unix.
- nbf (Non avant) â un temps au format unix, dĂ©finissant le moment oĂč le jeton deviendra valide.
- iat (Ămis Ă ) â cette clĂ© reprĂ©sente l'heure Ă laquelle le jeton a Ă©tĂ© Ă©mis et peut ĂȘtre utilisĂ©e pour dĂ©terminer l'Ăąge du JWT. La clĂ© iat doit ĂȘtre un timestamp au format unix.
- Jti (ID JWT) â chaĂźne dĂ©finissant un identifiant unique pour ce jeton, sensible Ă la casse.
Il est important de comprendre que la charge utile n'est pas transmise de maniĂšre chiffrĂ©e (bien que les jetons puissent ĂȘtre imbriquĂ©s et ainsi permettre de transmettre des donnĂ©es chiffrĂ©es). Par consĂ©quent, elle ne doit pas contenir d'informations sensibles. Comme pour l'en-tĂȘte, la charge utile est encodĂ©e en base64.
Signature â lorsque nous avons l'en-tĂȘte et la charge utile, nous pouvons calculer la signature.
Les Ă©lĂ©ments codĂ©s en base64 : l'en-tĂȘte et la charge utile sont combinĂ©s en une seule chaĂźne Ă l'aide d'un point. Ensuite, cette chaĂźne et la clĂ© secrĂšte sont entrĂ©es dans l'algorithme de cryptage spĂ©cifiĂ© dans l'en-tĂȘte (clĂ© « alg »). La clĂ© peut ĂȘtre n'importe quelle chaĂźne. Des chaĂźnes plus longues seront prĂ©fĂ©rables, car elles nĂ©cessiteront plus de temps pour ĂȘtre dĂ©chiffrĂ©es.
{"alg":"RSA1_5", "payload":"A128CBC-HS256"}
Construction de l'architecture d'un cluster Keycloak tolérant aux pannes
Lorsque 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Ús marquées pour tous les projets, mais à mesure que le nombre d'utilisateurs et d'intégrations augmente, les exigences en matiÚre de disponibilité et de performance s'intensifient.
L'augmentation des risques de dĂ©faillance du SSO unique renforce les exigences en matiĂšre d'architecture des solutions et des mĂ©thodes de redondance des composants, entraĂźnant des SLA trĂšs stricts. En consĂ©quence, il est frĂ©quent que lors du dĂ©veloppement ou des premiĂšres Ă©tapes de mise en Ćuvre des solutions, des projets possĂšdent leur propre infrastructure non redondante. Au fur et Ă mesure de l'Ă©volution, il est nĂ©cessaire de prĂ©voir des capacitĂ©s de dĂ©veloppement et de mise Ă l'Ă©chelle. Il est plus flexible de construire un cluster tolĂ©rant aux pannes en utilisant la virtualisation par conteneurs ou une approche hybride.
Pour fonctionner en mode Active/Active et Active/Passive, le cluster doit garantir la cohĂ©rence des donnĂ©es dans la base de donnĂ©es relationnelle â les deux nĆuds de la 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 tolérante aux pannes.

Quels sont les avantages d'utiliser un cluster unique :
- Haute disponibilité et performance.
- Support des modes de fonctionnement : Active/Active, Active/Passive.
- PossibilitĂ© d'Ă©volutivitĂ© dynamique â lors de l'utilisation de la virtualisation par conteneurs.
- Possibilité de gestion et de surveillance centralisées.
- Une approche unique pour l'identification/authentification/autorisation des utilisateurs dans les projets.
- Une interaction plus transparente entre différents projets sans intervention des utilisateurs.
- Possibilité de réutilisation du token JWT dans différents projets.
- Un point de confiance unique.
- Lancement plus rapide des projets en utilisant des microservices/virtualisation par conteneurs (pas besoin de déployer et configurer des composants supplémentaires).
- Possibilité d'acquérir un support commercial auprÚs du fournisseur.
Ă quoi faire attention lors de la planification d'un cluster
SGBD
Keycloak utilise un systĂšme de gestion de SGBD pour sauvegarder : realms, clients, utilisateurs, etc.
Un large Ă©ventail de SGBD est supportĂ© : MS SQL, Oracle, MySQL, PostgreSQL. Keycloak est fourni avec sa propre base de donnĂ©es relationnelle intĂ©grĂ©e. Son utilisation est recommandĂ©e pour les environnements peu chargĂ©s â tels que les environnements de dĂ©veloppement.
Pour fonctionner en mode Active/Active et Active/Passive, le cluster doit garantir la cohĂ©rence des donnĂ©es dans la base de donnĂ©es relationnelle, et les deux nĆuds du cluster de bases de donnĂ©es sont rĂ©pliquĂ©s de maniĂšre synchrone entre les centres de donnĂ©es.
Cache distribué (Infinispan)
Pour un bon fonctionnement du cluster, une synchronisation supplémentaire des types de cache suivants est requise à l'aide de JBoss Data Grid :
Sessions d'authentification â utilisĂ©es pour stocker les donnĂ©es lors de l'authentification d'un utilisateur spĂ©cifique. Les requĂȘtes provenant de ce cache incluent gĂ©nĂ©ralement uniquement le navigateur et le serveur Keycloak, mais pas l'application.
Tokens d'action â utilisĂ©s pour des scĂ©narios oĂč l'utilisateur doit confirmer une action de maniĂšre asynchrone (par email). Par exemple, lors du processus de rĂ©initialisation de mot de passe, le cache actionTokens Infinispan est utilisĂ© pour suivre les mĂ©tadonnĂ©es concernant les tokens d'action associĂ©s qui ont dĂ©jĂ Ă©tĂ© utilisĂ©s, de sorte qu'ils ne peuvent pas ĂȘtre rĂ©utilisĂ©s.
Mise en cache et invalidation des donnĂ©es persistantes â utilisĂ©es pour mettre en cache des donnĂ©es permanentes afin d'Ă©viter les requĂȘtes excessives Ă la base de donnĂ©es. Lorsque l'un des serveurs Keycloak met Ă jour des donnĂ©es, tous les autres serveurs Keycloak dans tous les centres de donnĂ©es doivent en ĂȘtre informĂ©s.
Travail â uniquement utilisĂ© pour envoyer des messages d'invalidation entre les nĆuds du cluster et les centres de donnĂ©es.
Sessions utilisateur â utilisĂ©es pour conserver les donnĂ©es sur les sessions des utilisateurs qui sont valides pendant la session de leur navigateur. Le cache doit traiter les requĂȘtes HTTP provenant de l'utilisateur final et de l'application.
Protection contre les attaques par force brute â utilisĂ©e pour suivre les donnĂ©es concernant les tentatives de connexion Ă©chouĂ©es.
Ăquilibrage de charge
Le répartiteur de charge est un point d'entrée unique dans Keycloak et doit prendre en charge les sessions persistantes.
Serveurs d'applications
UtilisĂ©s pour contrĂŽler l'interaction entre les composants et peuvent ĂȘtre virtualisĂ©s ou conteneurisĂ©s Ă l'aide des outils d'automatisation existants et de l'Ă©volutivitĂ© dynamique des infrastructures automatisĂ©es. Les scĂ©narios de dĂ©ploiement les plus courants sont dans OpenShift, Kubernetes, Rancher.
Voici la premiĂšre partie â thĂ©orique â qui est terminĂ©e. Dans les prochains cycles d'articles, des exemples d'intĂ©grations avec divers fournisseurs d'identitĂ©s et des exemples de configurations seront examinĂ©s.
Source : habr.com
