Aller au contenu

Montez un LDAP rapidement avec Lldap

Mise à jour :

Quand on pense à la gestion d’annuaires, le protocole LDAP (Lightweight Directory Access Protocol) est souvent incontournable. Il est utilisé pour centraliser les informations d’authentification et les partager entre différents services. Cependant, soyons honnêtes : la configuration et la gestion des serveurs LDAP traditionnels comme OpenLDAP ou FreeIPA peuvent rapidement devenir un casse-tête.

C’est là que Lldap entre en scène. Il s’agit d’un serveur LDAP léger, rapide et facile à configurer, conçu pour simplifier la vie des développeurs et administrateurs systèmes. Contrairement aux solutions plus lourdes, Lldap se concentre sur l’essentiel : offrir un serveur d’annuaire fonctionnel et sécurisé.

Si, comme moi, vous avez parfois eu l’impression de devoir escalader une montagne juste pour configurer un serveur LDAP, je vous promets que Lldap va changer votre vision.

Comment est né Lldap ?

Pour comprendre l’origine de Lldap, il faut d’abord regarder les serveurs LDAP classiques. Historiquement, le protocole LDAP a été conçu dans les années 1990 pour permettre aux organisations de centraliser et de gérer leurs utilisateurs, groupes, et droits d’accès. À l’époque, des solutions comme OpenLDAP ou Microsoft Active Directory régnaient en maître. Puissantes et flexibles, elles répondent encore aujourd’hui aux besoins des grandes entreprises, mais leur complexité les rend parfois disproportionnées pour des projets plus modestes.

Et c’est là qu’intervient Lldap. Ce projet est né d’un constat simple : pour de nombreuses petites équipes ou projets, les solutions classiques sont surdimensionnées. Pourquoi déployer un serveur lourd, avec une configuration complexe, quand on a juste besoin d’un annuaire pour quelques utilisateurs ? Lldap a été créé pour combler ce vide, en proposant une alternative légère, rapide et facile à mettre en place.

De plus, l’évolution des pratiques DevOps a joué un rôle clé dans la montée en popularité de Lldap. Avec l’adoption croissante des conteneurs et des microservices, il était nécessaire d’avoir une solution LDAP moderne, adaptée à ces environnements agiles. Lldap répond parfaitement à ces attentes, en offrant une intégration native avec des standards modernes comme OpenID Connect et en permettant un déploiement rapide via des conteneurs.

Aujourd’hui, Lldap est vu comme un souffle d’air frais dans l’écosystème LDAP. Il prouve qu’on peut conserver les bases solides du protocole tout en modernisant son utilisation. À mon avis, son succès est dû à son approche minimaliste : il fait tout ce dont on a besoin, sans surplus, et il le fait bien. Un véritable exemple du principe KISS (Keep It Simple, Stupid), que j’apprécie particulièrement.

Les fonctionnalités de Lldap

Lldap ne cherche pas à réinventer la roue, mais à simplifier son utilisation. Son objectif principal : offrir une solution légère et moderne pour la gestion des annuaires LDAP, tout en conservant les standards du protocole. Voici les fonctionnalités qui, selon moi, en font un choix intéressant :

  • Léger et performant : Avec un backend basé sur SQLite, Lldap est optimisé pour être léger tout en restant performant. Pas besoin d’une infrastructure massive pour le faire tourner : il peut s’exécuter sur une petite machine ou un conteneur avec un minimum de ressources.
  • Simplicité de déploiement et de configuration : Contrairement à des solutions plus lourdes comme OpenLDAP, Lldap brille par sa facilité de mise en place. Que vous l’installiez localement ou via un conteneur Docker ou Podman, tout est pensé pour être opérationnel en quelques minutes. Fini les heures passées à éplucher des manuels ou des fichiers de configuration interminables !
  • Interface Web intégrée : C’est un vrai point fort : Lldap propose une interface Web simple et intuitive pour gérer vos utilisateurs et groupes. Pas besoin de connaître par cœur les commandes LDAP ou de manipuler les fichiers de manière manuelle. Tout se fait via un navigateur, et en quelques clics.
  • Sécurité intégrée : Lldap met l’accent sur la sécurité dès le départ. Il prend en charge TLS pour chiffrer les communications, et il est conçu pour limiter les mauvaises configurations par défaut. (pas réussi à le faire fonctionner).
  • Compatibilité avec les outils standards LDAP : Même si Lldap est conçu pour la simplicité, il reste compatible avec les outils et bibliothèques LDAP classiques. Vous pouvez continuer à utiliser des commandes comme ldapsearch ou des bibliothèques Python pour interagir avec lui.

En résumé, Lldap se démarque par sa modernité, sa légèreté et son adaptabilité. Pour moi, il incarne parfaitement l’équilibre entre la puissance d’un serveur LDAP et la simplicité d’un outil pensé pour les équipes agiles.

Installation rapide de Lldap (sans conteneur)

Vous n’êtes pas fan des conteneurs ? Pas de souci ! Lldap peut être installé directement sur votre système grâce au gestionnaire de paquets de votre distribution.

  1. Installation des pré-requis : Avant de commencer, assurez-vous d’avoir les éléments suivants :

    • SQLite3 : Lldap utilise SQLite comme backend par défaut, donc assurez-vous qu’il est installé. Par exemple, sous Debian/Ubuntu :

      Terminal window
      sudo apt update && sudo apt install sqlite3 libsqlite3-dev
    • mkcert : Pour générer des certificats TLS auto-signés, vous aurez besoin de mkcert. Installez-le avec :

      Terminal window
      sudo apt install mkcert
    • les outils ldap : Pour tester votre serveur LDAP, vous aurez besoin de ldapsearch. Installez-le avec :

      Terminal window
      sudo apt install ldap-utils
  2. Installation de Lldap : Une fois les pré-requis en place, installez directement Lldap avec la commande suivante :

    Terminal window
    sudo apt install lldap
  3. Une fois l’installation terminée, vérifiez que Lldap est correctement installé avec :

Terminal window
lldap --version

Vous devriez voir une version s’afficher, confirmant que tout est en place.

Génération du certificat TLS

Pour sécuriser les communications avec votre serveur LDAP, vous pouvez générer un certificat TLS auto-signé avec mkcert. C’est par que vous trouverez comment procéder pour installer et configurer mkcert.

Voici comment procéder :

  1. Générez le certificat TLS pour votre serveur LDAP :
Terminal window
mkcert 'ldap.robert.local' localhost 127.0.0.1 ::1
  1. Installez le certificat dans un répertoire appartenant à l’utilisateur Lldap :
Terminal window
sudo mkdir /etc/lldap/certs
sudo mv ~/ldap.robert.local+3-key.pem /etc/lldap/certs/lldap.key
sudo mv ~/ldap.robert.local+3.pem /etc/lldap/certs/lldap.pem
sudo chown -R lldap:lldap /etc/lldap/certs

Configuration de Lldap

Le fichier de configuration de Lldap est au format YAML et contient plusieurs paramètres pour personnaliser le serveur. Voici le contenu de mon fichier :

## Tune the logging to be more verbose by setting this to be true.
## You can set it with the LLDAP_VERBOSE environment variable.
# verbose=false
## The host address that the LDAP server will be bound to.
## To enable IPv6 support, simply switch "ldap_host" to "::":
## To only allow connections from localhost (if you want to restrict to local self-hosted services),
## change it to "127.0.0.1" ("::1" in case of IPv6)".
#ldap_host = "0.0.0.0"
## The port on which to have the LDAP server.
#ldap_port = 3890
## The host address that the HTTP server will be bound to.
## To enable IPv6 support, simply switch "http_host" to "::".
## To only allow connections from localhost (if you want to restrict to local self-hosted services),
## change it to "127.0.0.1" ("::1" in case of IPv6)".
#http_host = "0.0.0.0"
## The port on which to have the HTTP server, for user login and
## administration.
#http_port = 17170
## The public URL of the server, for password reset links.
#http_url = "http://localhost"
## Random secret for JWT signature.
## This secret should be random, and should be shared with application
## servers that need to consume the JWTs.
## Changing this secret will invalidate all user sessions and require
## them to re-login.
## You should probably set it through the LLDAP_JWT_SECRET environment
## variable from a secret ".env" file.
## This can also be set from a file's contents by specifying the file path
## in the LLDAP_JWT_SECRET_FILE environment variable
## You can generate it with (on linux):
## LC_ALL=C tr -dc 'A-Za-z0-9!#%&'\''()*+,-./:;<=>?@[\]^_{|}~' </dev/urandom | head -c 32; echo ''
#jwt_secret = "REPLACE_WITH_RANDOM"
## Base DN for LDAP.
## This is usually your domain name, and is used as a
## namespace for your users. The choice is arbitrary, but will be needed
## to configure the LDAP integration with other services.
## The sample value is for "example.com", but you can extend it with as
## many "dc" as you want, and you don't actually need to own the domain
## name.
ldap_base_dn = "dc=robert,dc=local"
## Admin username.
## For the LDAP interface, a value of "admin" here will create the LDAP
## user "cn=admin,ou=people,dc=example,dc=com" (with the base DN above).
## For the administration interface, this is the username.
ldap_user_dn = "admin"
## Admin email.
## Email for the admin account. It is only used when initially creating
## the admin user, and can safely be omitted.
ldap_user_email = "admin@example.com"
## Admin password.
## Password for the admin account, both for the LDAP bind and for the
## administration interface. It is only used when initially creating
## the admin user.
## It should be minimum 8 characters long.
## You can set it with the LLDAP_LDAP_USER_PASS environment variable.
## This can also be set from a file's contents by specifying the file path
## in the LLDAP_LDAP_USER_PASS_FILE environment variable
## Note: you can create another admin user for user administration, this
## is just the default one.
ldap_user_pass = "changeme"
## Force reset of the admin password.
## Break glass in case of emergency: if you lost the admin password, you
## can set this to true to force a reset of the admin password to the value
## of ldap_user_pass above.
## Alternatively, you can set it to "always" to reset every time the server starts.
force_ldap_user_pass_reset = false
## Database URL.
## This encodes the type of database (SQlite, MySQL, or PostgreSQL)
## , the path, the user, password, and sometimes the mode (when
## relevant).
## Note: SQlite should come with "?mode=rwc" to create the DB
## if not present.
## Example URLs:
## - "postgres://postgres-user:password@postgres-server/my-database"
## - "mysql://mysql-user:password@mysql-server/my-database"
##
## This can be overridden with the LLDAP_DATABASE_URL env variable.
database_url = "sqlite:///var/lib/lldap/users.db?mode=rwc"
## Private key file.
## Not recommended, use key_seed instead.
## Contains the secret private key used to store the passwords safely.
## Note that even with a database dump and the private key, an attacker
## would still have to perform an (expensive) brute force attack to find
## each password.
## Randomly generated on first run if it doesn't exist.
## Env variable: LLDAP_KEY_FILE
#key_file = "/var/lib/lldap/private_key"
## Seed to generate the server private key, see key_file above.
## This can be any random string, the recommendation is that it's at least 12
## characters long.
## Env variable: LLDAP_KEY_SEED
key_seed = "RanD0m STR1ng"
## Ignored attributes.
## Some services will request attributes that are not present in LLDAP. When it
## is the case, LLDAP will warn about the attribute being unknown. If you want
## to ignore the attribute and the service works without, you can add it to this
## list to silence the warning.
#ignored_user_attributes = [ "sAMAccountName" ]
#ignored_group_attributes = [ "mail", "userPrincipalName" ]
## Options to configure SMTP parameters, to send password reset emails.
## To set these options from environment variables, use the following format
## (example with "password"): LLDAP_SMTP_OPTIONS__PASSWORD
[smtp_options]
## Whether to enabled password reset via email, from LLDAP.
#enable_password_reset=true
## The SMTP server.
#server="smtp.gmail.com"
## The SMTP port.
#port=587
## How the connection is encrypted, either "NONE" (no encryption), "TLS" or "STARTTLS".
#smtp_encryption = "TLS"
## The SMTP user, usually your email address.
#user="sender@gmail.com"
## The SMTP password.
#password="password"
## The header field, optional: how the sender appears in the email. The first
## is a free-form name, followed by an email between <>.
#from="LLDAP Admin <sender@gmail.com>"
## Same for reply-to, optional.
#reply_to="Do not reply <noreply@localhost>"
## Options to configure LDAPS.
## To set these options from environment variables, use the following format
## (example with "port"): LLDAP_LDAPS_OPTIONS__PORT
[ldaps_options]
## Whether to enable LDAPS.
enabled=true
## Port on which to listen.
port=6360
## Certificate file.
cert_file="/etc/lldap/certs/lldap.pem"
## Certificate key file.
key_file="/etc/lldap/certs/lldap.key"

Modifier les valeurs avec les votres.

Démarrage de Lldap

Pour démarrer Lldap, utilisez la commande suivante :

Terminal window
sudo systemctl enable lldap --now

Vous pouvez vérifier que le serveur est en cours d’exécution avec :

Terminal window
sudo systemctl status lldap

Vous pouvez également consulter les journaux pour voir les messages de démarrage :

Terminal window
journalctl -u lldap

Vérifiez que le serveur est bien en écoute sur les ports 3890 et 6360 :

Terminal window
sudo ss -tulnp | grep lldap
tcp LISTEN 0 2048 0.0.0.0:6360 0.0.0.0:* users:(("lldap",pid=995582,fd=11))
tcp LISTEN 0 2048 0.0.0.0:3890 0.0.0.0:* users:(("lldap",pid=995582,fd=10))
tcp LISTEN 0 2048 0.0.0.0:17170 0.0.0.0:* users:(("lldap",pid=995582,fd=12))

Vous pouvez également vous connecter à l’interface Web de Lldap en vous rendant sur http://localhost:17170 dans votre navigateur. Vous devriez voir une page de connexion où vous pouvez vous connecter avec les identifiants d’administration que vous avez configurés. Une fois connecté, vous pourrez ajouter des utilisateurs, des groupes et gérer les paramètres de votre serveur LDAP.

Lldap

Tester votre serveur LDAP

Pour vous assurer que Lldap fonctionne correctement, vous pouvez utiliser l’outil ldapsearch pour interroger l’annuaire. Par exemple :

Terminal window
ldapsearch -H ldap://localhost:3890 -D "uid=admin,ou=people,dc=robert,dc=local" -w "changeme" -b "dc=robert,dc=local" "(objectClass=*)"
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=com> with scope subtree
# filter: (objectClass=*)
# requesting: ALL
#
# admin, people, example.com
dn: uid=admin,ou=people,dc=example,dc=com
cn: Administrator
createtimestamp: 2025-01-27T13:56:43.252453685+00:00
entryuuid: 666964a9-a2d8-36ca-a19d-6149e3a5aac6
mail: admin@example.com
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: mailAccount
objectclass: person
uid: admin
# lldap_admin, groups, example.com
dn: cn=lldap_admin,ou=groups,dc=example,dc=com
cn: lldap_admin
entryuuid: 2dbd571f-e20a-3195-ad85-51fa1232e20c
member: uid=admin,ou=people,dc=example,dc=com
objectclass: groupOfUniqueNames
uid: lldap_admin
uniquemember: uid=admin,ou=people,dc=example,dc=com
# lldap_password_manager, groups, example.com
dn: cn=lldap_password_manager,ou=groups,dc=example,dc=com
cn: lldap_password_manager
entryuuid: 094c5f0d-2a80-3192-935c-38f3912fd41d
objectclass: groupOfUniqueNames
uid: lldap_password_manager
# lldap_strict_readonly, groups, example.com
dn: cn=lldap_strict_readonly,ou=groups,dc=example,dc=com
cn: lldap_strict_readonly
entryuuid: c37db72c-e43c-3ca4-a150-97484638d1c1
objectclass: groupOfUniqueNames
uid: lldap_strict_readonly
# search result
search: 2
result: 0 Success
control: 1.2.840.113556.1.4.319 false MAUCAQQEAA==
pagedresults: estimate=4 cookie=
# numResponses: 5
# numEntries: 4

Si tout fonctionne, vous devriez voir les entrées de votre annuaire listées.

Conclusion

Je suis resté sur ma faim avec Lldap. J’ai trouvé l’idée intéressante, mais mes problèmes de configuration TLS m’ont empêché de vraiment l’explorer en profondeur. J’ai mis un commentaire sur une issue parlant des mêms difficultés. Cependant, je pense que Lldap a un potentiel réel pour simplifier la gestion des annuaires LDAP. Sa simplicité d’installation et d’utilisation en font un outil idéal pour les petites équipes ou les projets modestes.

Plus d’infos