Docker, LDAP et Symfony

LDAP est probablement la solution la plus utilisée pour référencer des utilisateurs dans une infrastructure. Si ce protocole est normalisé et plutôt bien respecté, il s’avère que les outils que nous avons à notre disposition pour interagir avec ce protocole restent bien obscurs. Cet article a pour but d’éclaircir quelques zones d’ombre dans l’utilisation de LDAP pour authentifier un utilisateur avec Symfony.

Le serveur LDAP

Il existe plusieurs serveurs LDAP. Vous pouvez installer celui de votre choix sur votre machine (slapd est probablement le plus utilisé) ou vous pouvez utiliser un docker. Ici je vais détailler l’approche « Docker ».

Utiliser le docker principal d’OpenLDAP vous fera très sûrement perdre vos cheveux si vous n’êtes pas habitués à travailler avec cet annuaire. Je recommande donc l’usage du docker broadinstitute/slapd. Ce docker installe un serveur slapd et permet de configurer debconf avec des variables d’environnement.

Voici un exemple de configuration qui fonctionne dans docker-compose :

Pour information, vous pouvez utiliser la commande suivante pour lister le contenu de votre ldap :

ldapsearch -H ldap://localhost -D “cn=admin,dc=mycorp,dc=com” -w s3cr3tpassw0rd -x -LLL -b “dc=mycorp,dc=com”

Charger des données dans LDAP

En PHP, nous avons deux outils nous permettant d’interagir avec LDAP :

  • L’extension PHP « LDAP »
  • Le composant Symfony LDAP

Vous devrez installer les deux sur votre projet pour continuer :

# apt-get install php-ldap
$ composer require symfony/ldap

Toutes les solutions sont possibles pour charger vos données. J’ai fait le choix d’utiliser les DoctrineFixtures pour ne pas déroger aux habitudes de chargement.

Pour plus d’informations sur les fonctions LDAP je vous invite à vous référer à la documentation de Symfony.

Remarques :

  • Le uid est la valeur permettant d’identifier de manière unique l’utilisateur, tous les LDAP n’utilisent pas forcément cette clé à cette fin.
  • Pour encoder le mot de passe de l’utilisateur j’utilise un LdapEncoder. J’ai créé cette classe pour les besoins de l’authentification, elle est réutilisable ici et c’est bien pratique. Vous pouvez évidemment aussi encoder manuellement. Le format du mot de passe est standardisé par cette RFC. En revanche, votre implémentation dépendra très certainement de ce qui est en place sur le serveur LDAP que vous utiliserez.

Authentifier via LDAP

Cette fonctionnalité est également documentée par Symfony, mais il est facile de s’y perdre. Voici donc les étapes que j’ai suivies pour que ça fonctionne.

Dans un premier temps nous devons définir un adapter LDAP en service. Je vous recommande d’utiliser une url LDAP, c’est le format qu’on croise le plus souvent dans l’univers LDAP vu qu’il est supporté par les commandes standard type “ldapsearch”. Ici j’ai ajouté la variable d’environnement LDAP_URL qui contient ldap://ldap:389.

Dans le fichier “security.yaml” vous devrez détailler la configuration du fournisseur d’utilisateurs (user provider) et de votre encoder (cela dépendra fortement de la façon dont est construit votre LDAP).

Pour faire fonctionner tout cela avec la configuration docker que je vous ai proposé, j’utilise ces variables d’environnement :

Et pour finir, voici le code du password encoder :

Encore une fois, n’oubliez pas que le fonctionnement de cet encoder doit être en fonction de votre LDAP global.

Sources et liens intéressants