Authentification unique sur Kubernetes avec Keycloak

Logo Keycloak

Cette article fait suite à un projet que j'ai réalisé pour tester la mise en place d'une authentification unique (SSO) sur Kubernetes avec Keycloak et un annuaire LDAP externe. Vous pouvez retrouver le projet complet sur Github.

La solution de SSO est basée sur Keycloak, mais utilise aussi:

  • OpenLDAP comme annuaire d'identité externe
  • OAuth2 Proxy pour fournir la couche d'authentification à des applications non sécurisées à la base

Installation

Cluster kubernetes

Avant d'installer la solution SSO à proprement parlé, nous avons besoin d'un cluster Kubernetes comprenant l'ingress controller NGINX et cert-manager. Let's Encrypt sera également utilisé pour la génération des certificats.

Détail de la solution SSO

Toutes les solutions Kubernetes pourront convenir, mais il faut avoir un enregistrement DNS public qui pointe sur le point d'entrée du cluster de test.

>> Documentation d'installation étape par étape

Installation des composants SSO

Nous allons maintenant installer et configurer les différents composants qui composent notre solution SSO, à savoir: Keycloak, OpenLDAP et OAuth2 Proxy.

Logo Keycloak

>> Documentation étape par étape

Processus d'authentification

Voici un aperçu du processus qui est joué quand un client accède à une application sécurisée pour la première fois, avant d'être authentifié.

Processus authentification

  1. L'utilisateur envoie une requête pour accéder à l'application de démo
  2. L'ingress controller le redirige vers OAuth2 Proxy au regard des annotations présentent dans les règles d'ingress de l'application de démo
  3. OAuth2 Proxy vérifie auprès de Keycloak si l'utilisateur est authentifié
  4. L'utilisateur n'est pas authentifié, Keycloak présente la page de login
  5. L'utilisateur saisit ses identifiants et valide
  6. Keycloak réalise l'authentification et transmet les informations à OAUth2 Proxy
  7. OAuth2 Proxy informe l'Ingress Controller que le user est authentifié et qu'il souhaite accéder à l'application de démo
  8. L'Ingress Controller achemine la requête jusqu'à l'application demandée

Quelques tests

Déploiement d'une application sécurisée

Maintenant que la solution SSO est fonctionnelle, nous allons déployer une première application sécurisée.

Nous utiliserons ici NGINX et sa célèbre page d'accueil comme application de démo, sécurisé par OAuth2 Proxy, pour vérifier que tout fonctionne comme attendu.

Dans cet exemple, nous voulons que la page d'accueil d'NGINX soit accessible uniquement pour les utilisateurs authentifiés auprès de Keycloak.

>> Documentation étape par étape

Maintenant, vérifions que l'application est bien sécurisée. Quand on tente d'y accéder :

  • On obtient la page de login de Keycloak si l'on n'est pas déjà authentifié
  • On peut accéder directement à l'application quand on est déjà authentifié

Déploiement d'une application non sécurisée

Dans le test précédent, nous avons vu comment déployer une application sécurisée dans le cluster grâce aux annotations dans les règles d'ingress.

Vérifions maintenant qu'il est toujours possible de déployer des applications non sécurisées dans le cluster.

>> Documentation étape par étape

Simulation d'une panne de fédération

Que se passe-t-il si Keycloak perd la connectivité avec le référentiel d'identité externe, OpenLDAP dans notre cas ?

Voyons si notre solution SSO continue de fonctionner, au moins pour les utilisateurs connus, et si nous pouvons toujours accéder aux applications sécurisées.

>> Documentation étape par étape

Conclusion

C'est une bonne introduction pour apprendre à construire une solution SSO dans Kubernetes basée sur Keycloak.

J'essaierai d'ajouter quelques tests pour étudier de nouveaux cas d'usage. Mais il y a beaucoup d'autres configurations et fonctionnalités à disposition, il faut prendre le temps de regarder tout cela en profondeur.

Si vous avez des idées ou des suggestions pour améliorer ces démonstrations, n'hésiter à me les envoyer !