Depuis quelque temps j’interviens chez mes clients afin de mener des études d’architecture autour de Keycloak/RHSSO. Comme son nom l’indique, il s’agit d’une solution de SSO c’est à dire d’un système unique d’authentification et d’authorisation. Le projet Keycloak a debuté en 2014 et est donc relativement mature, la communauté autour de ce projet est très importante.

Il y a quelques temps déjà, j’ai acheté et configuré des clefs Yubico afin de faire du 2FA avec mes principaux comptes en ligne. Les principaux acteurs du web (Google, Facebook, AWS, etc…) proposent ce type d’authentification qui apporte une sécurité supplémentaire des comptes en ligne.

Keycloack depuis fin 2019 dispose d’une intégration du standard Webauthn du W3C. Nous allons voir comment faire cette configuration dans le produit.

Intégration/Configuration d’une authentification Webauthn avec Keycloak

Le standard WebAuthn

Le standard WebAuthn est une généralisation d’un autre standard le FIDO. Ces deux standards ont pour but de proposer une authentification forte des utilisateurs lors de leurs connexions en ligne. Il existe déjà des systemes de double authentification via SMS par exemple, mais il est possible, avec un peu de moyen, de hacker/casser soit techniquement soit socialement ce type d’authentification.

Auparavant le standard FIDO était très axé sur des clefs matérielles via USB beaucoup plus difficile à casser (par clonage par ex) et une API dans le browser, WebAuthn supporte quant à lui d’autre type de device comme les montres connectées, les téléphones portables et d’autres types de protocole comme le BLE et/ou le NFC. WebAuthn apporte aussi au browser une API standard en Javascript qui est maintenant supportée dans la plupart des navigateurs (Chrome, Firefox, etc…).

Lorsque d’un utilisateur se connecte à son compte en ligne le service via le browser demande à l’utilisateur d’inserer sa clef (ici : Yubikey) dans son ordinateur (utiliser sa clef NFC si il s’agit d’un telephone ou d’une tablette). Le browser dialogue donc avec le systeme d’authentification afin de verifier un challenge de sécurité, le tout est renvoyé au service pour verification finale avant l’accès au dit service. L’avantage est que l’on peut utiliser la même clef d’un service en ligne à l’autre, car le standard défini que le challenge doit etre fait par nom de domaine.

Un des avantages de ce standard est son faible coût de deploiement à la fois pour l’utilisateur final que pour le service en ligne, grace à la standardisation il existe un certain nombre d’acteurs et de fournisseur de solution WebAuthn compatible. Une clef Yubico est aux alentours d’une cinquantaine d’euros piece, donc pour un Architecte IT comme moi cela est très raisonnable. Le service en ligne peut facilement intégrer cette fonctionnalité dans le processus d’authentification de ses utilisateurs, comme nous allons le voir dans le chapitre suivant.

Installation de Keycloak

L’installation de Keycloak est tout aussi simple que l’installation d’un serveur Wildfly/JBoss EAP, il suffit simplement télécharger le zip serveur puis de le dezipper dans le repertoire de son choix.

Utilisateur root

Ajouter l’utilisateur root pour la gestion des Realm (Royaume) dans Keycloak via la commande suivante :

$> bin/add-user-keycloak.sh

En production, on passera par un Realm (Royaume) n’utilisant pas le système de fichier de stockage des utilisateurs/mots de passe mais plutôt un annuaire LDAP disponible dans la plupart des systèmes d’information.

Démarrer Keycloak/RHSSO

Le démarrage de Keycloak se fait comme un Wildfly/JBoss EAP via la commande standalone.sh.

$> bin/standalone.sh -b 0.0.0.0

Il est bien sûr possible d’utiliser toute les fonctionnalités de Wildlfy/JBoss EAP en terme d’administration centralisée avec le mode domain, le clustering des sessions HTTP via la solution Infinispan intégrée ou bien le mod_cluster/Apache qui facilite le cycle de vie et l’administration des clusters Apache/JBoss.

Configuration du Realm, Client et Flow

Configurer maintenant le Realm qui va contenir l’ensemble des utilisateurs et des clients (applications).

Configuration Realm

Pour la demo, nous utilisons une application cliente de type Javascript donc n’oubliez pas de configurer en mode public l’option Access Type.

Configuration Client

Dans Browser Flow il suffit de rajouter le WebAuthn Authenticator executor dans le flow normal.

Configuration Flow

Dans la configuration du WebAuthn, n’oubliez pas de configurer le Relying Party Entity Name.

Configuration 2fa

Enregistrement d’un utilisateur

Passons maintenant à l’enregistrement d’un utilisateur.

Register User

Le browser demande ensuite l’enregistrement de la clef pour l’authentification future (cf la dialogue box avec l’empreinte digitale).

Register Key

Il suffit d’inserer ca clef Yubico FIDO2 compatible WebAuthn.

Yubico Key

Ensuite il est possible de configurer un label pour ce processus d’authentification WebAuthn Yubico Blue.

Register Key Label

Authentification de l’utilisateur

L’authentification de l’utilisateur est maintenant possible.

Authn User

Dans ce cas le browser demande cette fois une authentification via la clef Yubico (cf la dialogue box avec l’empreinte digitale).

Authn User Key

Dans le cas où l’utilisateur s’est trompé de clef ou bien à oublié ca clef, voici le message d’erreur

Authn User Key Failed

Mais dans le cas où tout ce passe bien l’utilisateur sera correctement authentifié et redirigé vers l’application cliente.

User Authentification Ok

Information utilisateur

Si l’on retourne sur la console d’administration web des utilisateurs dans Keycloak/RHSSO, on peut verifier que l’enregistrement de la clef Yubico a bien était fait. L’enregistrement contient notamment la clef publique de la clef Yubico.

User Detail

Conclusion

Nous avons vu que la configuration et authentification via le standard WebAuthn est relativement simple avec Keycloak. Alors n’hesitez pas à améliorer l’experience de vos utilisateurs ainsi que la sécurité de leur compte en activant très simplement cette option dans Keycloak/RHSSO.

NB

Les fichiers de configuration seront disponibles bientôt dans un repo github.