Aller au contenu
medium

Fédérer un annuaire LDAP ou AD avec Keycloak

12 min de lecture

Cette page connecte Keycloak à un annuaire LDAP ou Active Directory existant. Vos comptes restent dans l'annuaire, référence unique de l'entreprise ; Keycloak les fédère pour les exposer à vos applications en OIDC ou SAML, sans jamais recopier les mots de passe. Le guide couvre la création du provider de fédération, la synchronisation des utilisateurs, l'authentification déléguée et les mappers d'attributs. Public : administrateur qui a déjà un annuaire (OpenLDAP, Active Directory, FreeIPA) et un realm Keycloak.

Les notions de DN, OU, bind et schéma LDAP ne sont pas détaillées ici ; elles sont expliquées dans LDAP, Active Directory et Kerberos. Cette page se concentre sur la configuration Keycloak.

  • Distinguer fédération et import manuel, et savoir où vivent utilisateurs et mots de passe
  • Créer un provider de fédération LDAP dans un realm, en console et en ligne de commande
  • Synchroniser les utilisateurs de l'annuaire vers Keycloak
  • Vérifier que l'authentification est bien déléguée à l'annuaire
  • Adapter la configuration aux spécificités d'Active Directory

Avant de commencer, il vous faut :

  • Une instance Keycloak fonctionnelle avec un realm applicatif. Voir Installer Keycloak et Administrer Keycloak.
  • Un annuaire LDAP accessible depuis Keycloak, avec un compte de service pour le bind. Les exemples utilisent un OpenLDAP servant la base dc=exemple,dc=fr et l'unité d'organisation ou=people. Pour un annuaire léger de test, voir Monter un LDAP avec LLDAP.
  • L'URL de connexion, le bind DN (compte de lecture) et le DN des utilisateurs de votre annuaire.

La fédération ne copie pas votre annuaire dans Keycloak : elle le branche dessus. À chaque connexion, Keycloak interroge l'annuaire pour vérifier l'identité et le mot de passe. L'annuaire reste la source de vérité, Keycloak n'est qu'une façade qui parle OIDC et SAML aux applications.

C'est le point qui déroute au début : par défaut, le mot de passe ne quitte jamais l'annuaire. Keycloak le transmet à l'annuaire pour vérification (bind), mais ne le stocke pas. Un utilisateur importé apparaît dans la liste du realm, mais son mot de passe n'y est pas.

Le comportement se règle avec le mode d'édition (editMode), qui décide qui peut modifier quoi :

Mode d'éditionModifications dans KeycloakÉcrites vers l'annuaireCas d'usage
READ_ONLYInterditesNonL'annuaire est géré ailleurs (le plus courant)
WRITABLEAutoriséesOuiKeycloak est l'outil d'administration de l'annuaire
UNSYNCEDAutoriséesNon (copie locale)Surcharge locale sans toucher à l'annuaire

Commencez toujours en READ_ONLY. C'est le mode le plus sûr : Keycloak ne peut rien casser dans l'annuaire de production. Vous passerez à WRITABLE seulement si Keycloak devient l'outil de gestion de cet annuaire.

Avant de configurer Keycloak, identifiez où sont les utilisateurs et sous quels attributs. Une recherche LDAP le confirme :

Fenêtre de terminal
ldapsearch -x -H ldap://ldap.exemple.fr \
-b "ou=people,dc=exemple,dc=fr" \
-D "cn=admin,dc=exemple,dc=fr" -w 'MotDePasseBind' \
"(objectClass=inetOrgPerson)" uid cn mail
dn: uid=bob,ou=people,dc=exemple,dc=fr
uid: bob
cn: Bob Durand
mail: bob@exemple.fr
dn: uid=carol,ou=people,dc=exemple,dc=fr
uid: carol
cn: Carol Nguyen
mail: carol@exemple.fr

Notez les trois informations dont Keycloak a besoin :

  • DN des utilisateurs (usersDn) : ou=people,dc=exemple,dc=fr
  • Attribut d'identifiant : uid sur OpenLDAP, sAMAccountName sur Active Directory
  • Classe d'objet : inetOrgPerson sur OpenLDAP, user sur Active Directory
  1. Dans votre realm, ouvrez User federation > Add LDAP providers.

  2. General options :

    • UI display name : openldap-exemple
    • Vendor : Other (ou Active Directory pour un AD)
  3. Connection and authentication :

    • Connection URL : ldaps://ldap.exemple.fr:636 (LDAPS recommandé)
    • Bind type : simple
    • Bind DN : cn=admin,dc=exemple,dc=fr
    • Bind credentials : le mot de passe du compte de service
  4. LDAP searching and updating :

    • Edit mode : READ_ONLY
    • Users DN : ou=people,dc=exemple,dc=fr
    • Username LDAP attribute : uid
    • RDN LDAP attribute : uid
    • UUID LDAP attribute : entryUUID
    • User object classes : inetOrgPerson
  5. Test connection puis Test authentication, et Save.

Deux mécanismes peuplent le realm. La synchronisation à la demande importe un utilisateur la première fois qu'il se connecte : discret, mais l'utilisateur n'existe dans Keycloak qu'après sa première connexion. La synchronisation complète importe tout l'annuaire d'un coup, utile pour peupler le realm immédiatement et attribuer des rôles avant la première connexion.

Depuis la console, le bouton Sync all users déclenche une synchro complète. En ligne de commande :

Fenêtre de terminal
compid=$(kcadm.sh get components -r lab -q name=openldap-exemple \
--fields id --format csv --noquotes)
kcadm.sh create "user-storage/$compid/sync?action=triggerFullSync" -r lab

La liste des utilisateurs du realm confirme l'import. Les comptes venus de l'annuaire portent un lien de fédération, contrairement aux comptes créés localement :

Fenêtre de terminal
kcadm.sh get users -r lab --fields username,email,federationLink
alice | alice@exemple.fr | federe: False
bob | bob@exemple.fr | federe: True
carol | carol@exemple.fr | federe: True

bob et carol viennent de l'annuaire, alice a été créée dans Keycloak. Pour maintenir le realm à jour sans intervention, activez la synchronisation périodique dans le provider (par exemple toutes les heures) : les nouveaux comptes de l'annuaire apparaîtront automatiquement.

Étape 4 - Vérifier l'authentification déléguée

Section intitulée « Étape 4 - Vérifier l'authentification déléguée »

C'est le test qui prouve que la fédération fonctionne : un utilisateur de l'annuaire se connecte avec le mot de passe stocké dans l'annuaire, pas dans Keycloak. On demande un token pour bob avec ses identifiants LDAP :

Fenêtre de terminal
curl -s -o /dev/null -w "%{http_code}\n" \
-X POST http://localhost:8080/realms/lab/protocol/openid-connect/token \
-d grant_type=password \
-d client_id=test-cli \
-d username=bob \
-d password='MotDePasseBob1!' \
-d scope=openid
200

Le code 200 et le token retourné confirment la délégation : Keycloak a transmis le mot de passe à l'annuaire pour vérification (bind), l'annuaire a répondu favorablement, Keycloak a émis le token. À aucun moment le mot de passe de bob n'a été stocké dans Keycloak.

Keycloak crée automatiquement des mappers qui relient les attributs LDAP aux champs utilisateur : uid vers le nom d'utilisateur, mail vers l'email, cn/sn vers le nom complet. Ils apparaissent dans l'onglet Mappers du provider et couvrent la plupart des besoins sans réglage.

Le mapper à ajouter manuellement, dans presque tous les cas, est le group-ldap-mapper : il fait remonter les groupes de l'annuaire (souvent ou=groups) comme groupes Keycloak. Vos applications reçoivent alors les appartenances de groupe dans le token, ce qui permet d'attribuer des droits sans gérer les groupes deux fois. Configurez-y le DN des groupes, la classe d'objet (groupOfNames sur OpenLDAP, group sur AD) et l'attribut de membre (member).

Active Directory est un annuaire LDAP, mais avec ses propres attributs. Sélectionnez Vendor : Active Directory dans le provider, ce qui pré-remplit la plupart des champs. Les différences à connaître :

RéglageOpenLDAPActive Directory
Username LDAP attributeuidsAMAccountName (ou cn)
UUID LDAP attributeentryUUIDobjectGUID
User object classesinetOrgPersonperson, organizationalPerson, user
Attribut d'emailmailmail (parfois userPrincipalName)

Sur AD, prévoyez aussi de gérer les comptes désactivés (attribut userAccountControl) pour qu'un compte désactivé côté AD ne puisse plus se connecter via Keycloak. Le mapper msad-user-account-control-mapper, ajouté par défaut quand le vendor est AD, s'en charge.

La fédération relie Keycloak à l'annuaire le plus sensible de l'entreprise. Quelques règles :

  • LDAPS ou StartTLS obligatoire en production. Un bind en clair (ldap://) expose le mot de passe du compte de service et ceux des utilisateurs sur le réseau. Utilisez ldaps:// (port 636) et importez le certificat de l'annuaire dans le truststore de Keycloak.
  • Compte de bind en lecture seule, limité à l'OU des utilisateurs. N'utilisez jamais un compte administrateur du domaine pour le bind.
  • Edit mode READ_ONLY tant que Keycloak n'est pas l'outil de gestion de l'annuaire. Cela évite qu'une action dans Keycloak modifie l'annuaire de production.
  • Secret de bind hors du dépôt Git : traité comme un mot de passe, injecté par variable d'environnement ou coffre-fort. Voir HashiCorp Vault.
  • Filtre LDAP restrictif (customUserSearchFilter) pour ne fédérer que les comptes concernés, pas tout l'annuaire.
SymptômeCause probableSolution
Test connection échoueURL, port ou pare-feuVérifier que Keycloak joint l'annuaire (ldapsearch depuis le serveur Keycloak)
Test authentication échoueBind DN ou mot de passe erronéVérifier le compte de service et son DN complet
Synchro : 0 utilisateur importéusersDn ou userObjectClasses incorrectRecopier le DN exact et la classe vus dans ldapsearch
Doublons à chaque synchroUUID mal réglé (uid au lieu de entryUUID)Corriger l'UUID LDAP attribute puis resynchroniser
Utilisateur AD introuvablesAMAccountName non configuréVendor Active Directory + username attribute sAMAccountName
Erreur de certificat en LDAPSCertificat de l'annuaire absent du truststoreImporter le certificat CA dans le truststore Keycloak
  • La fédération branche Keycloak sur l'annuaire ; les utilisateurs et les mots de passe restent dans l'annuaire, qui demeure la source de vérité.
  • Le mode d'édition READ_ONLY est le défaut sûr : Keycloak ne peut rien modifier dans l'annuaire de production.
  • L'UUID LDAP (entryUUID sur OpenLDAP, objectGUID sur AD) est l'ancre stable qui évite les doublons entre synchros.
  • La synchro complète peuple le realm immédiatement ; la synchro à la demande importe à la première connexion.
  • Un token obtenu avec le mot de passe d'annuaire prouve l'authentification déléguée : le mot de passe n'est jamais stocké dans Keycloak.
  • Active Directory change surtout les attributs (sAMAccountName, objectGUID, classe user) ; le reste de la logique est identique.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn