Mise en place d'un serveur LDAP

Présentation


Lightweight Directory Access Protocol est un protocole permettant l'interrogation et la modification des services d'annuaire et reposant sur TCP/IP. Il peut être considéré comme un système d'annuaire pour stocker des utilisateurs et des groupes.

Son fonctionnement est le suivant :
1. Connexion du client sur le serveur (port 389) :
  • Bind : authentification :
    • simple :
      • login : dn (voire infra)
      • password
    • anonyme : simple sans login/mot de passe
    • Simple Authentication and Security Layer
  • Start TLS : utilisation de TLS
2. Envoi des requêtes (client->serveur) :
  • Search : recherche dans l'annuaire et rapatriement des données,
  • Compare : test qui détermine si une entrée contient un attribut avec une valeur donnée, - Add : ajout d'une nouvelle entrée,
  • Delete : suppression d'une entrée,
  • Modify : modification d'une entrée,
  • Modify DN : déplacement ou renommage d'une entrée
3. Envoi des réponses (serveur->client)
4. Clôture de la connexion : Unbind.

La structure d'un annuaire est la suivante :
- un annuaire est un arbre d'entrées (Directory Information Tree), uniquement identifiables
- une entrée est constituée d'un ensemble d'attributs : c'est une approche Orientée Objets),
- un attribut possède un nom, un type et une ou plusieurs valeurs (multi-valuation possible à la différence des SGBD),
- les attributs sont définis dans des schémas*.

On distingue 3 catégories d'entrées:
  • les Domain Components à la racine et aux premières branches de l'arbres,
  • les Organizational Units (groupes) aux branches intermédiaires,
  • les feuilles (personnes) identifiées par un attribut Common Name

Parmi les attributs, certains ont un rôle particulier :
- le Distinguished Name. C'est un identifiant unique défini récursivement à l'aide de son Relative Distinguished Name (RDN) suivi du DN de son parent.
- l'objectclass désigne une classe associée au noeud et définie dans un schéma LDAP:
  • organizationalUnit : gestion des sous-entrées de même nature (groupes, utilisateurs, etc...)
  • account : gestion de compte basique
  • posixAccount : gestion comptes Linux (POSIX)
  • posixAccount : gestion des groupes Linux (POSIX)
  • top
  • shadowAccount : gestion mot de passe Linux
  • inetOrgPerson : gestion de comptes pour des personnes

Le service Active Directory peut-être considéré comme l'implémentation de LDAP a pour les systèmes Windows.

Installation d'OpenLDAP


Installation du serveur LDAP :
apt install slapd

Configuration du serveur LDAP (définition du DC, définition du mot de passe admin) :
dpkg-reconfigure slapd

Utilisation d'un annuaire OpenLDAP


Afin de peupler l'annuaire LDAP ou d'y effectuer des recherches, il est nécessaire d'utiliser un client LDAP.

Sous les systèmes Linux, le client LDAP de base est fourni par le paquet ldap-utils
apt install ldap-utils
et s'utilise en ligne de commande.

La syntaxe des requêtes de recherche est la suivante
ldapsearch -H ldap.defis.info -p 389 -D cn=admin,dc=defis,dc=info -W -b dc=defis,dc=info filtre

- -x pour utiliser une authentification simple (non SASL).
- -D pour indiquer le compte administrateur du LDAP et ainsi accéder à davantage d'attributs des entrées.
- -W pour se voir demander le mot de passe du compte spécifié par -D.
- -w pour fournir dans la ligne de commande le mot de passe du compte spécifié par -D
- -LLL pour supprimer tous les commentaires.
- -p pour spécifier un numéro de port
- -b pour préciser la branche dans laquelle effectuer la recherche.
- -H pour donner l'url ou l'adresse IP du serveur LDAP à interroger.
- -ZZ pour utiliser StartTLS
- filtre est une expression du type :
  • (attribut=valeur) pour un filtre simple
  • (&(filtre1)(filtre 2)) pour un filtre composé avec la clause ET
  • (|(filtre1)(filtre2)) pour un filtre composé avec la clause OU

La syntaxe des requêtes d'ajout est la suivante
ldapadd -x -H localhost -D cn=admin,dc=defis,dc=info -W -f modif.ldif
où modif.ldif est un fichier au format LDIF contenant la liste des modifications à effectuer.

LDIF (LDAP Data Interchange Format) est un format standardisé d'échange de données, qui permet la représentation des données contenues dans un annuaire LDAP ainsi que le représentation d'opérations sur cette annuaire.

La syntaxe du fichier LDIF peut-être donnée par l'exemple suivant (création de l'OU adhérent et peuplement de cette OU par un utilisateur Test) :
dn: ou=People,dc=defis,dc=info
objectClass: organizationalUnit
ou: People

dn: uid=test,ou=People,dc=defis,dc=info
uid: test
cn: Test
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
uidNumber: 2001
gidNumber: 2001
homeDirectory: /home/user

Il est possible d'utiliser des clients LDAP en mode graphique :
- via une application Web : http://phpldapadmin.sourceforge.net/wiki/index.php/Main_Page
- via un logiciel : https://directory.apache.org/studio/

Les services (Nextcloud, Radius, LTSP, ...) qui utilisent LDAP pour l'authentification des utilisateurs disposent d'un client LDAP propre à leur technologie (le module php-ldap pourPHP par exemple). La configuration des clients est propres à chaque service et est décrite dans la page du wiki correspondante.


Sécurisation d'un serveur LDAP


La sécurisation d'un serveur LDAP repose aujourd'hui sur l'utilisation du protocole StartTLS (et non plus LDAPS qui est déprécié).

Création de l'autorité de certification


Il existe principalement deux manières de générer un certificat autosigné :
- via openssl
- via certtool (GNUTLS), détaillé ci-dessous:
apt install gnutls-bin ssl-cert
# Création de clé privée RSA
certtool --generate-privkey --outfile /etc/ssl/private/ca_server.key
# Génération d'un certificat autosigné
certtool --generate-self-signed --load-privkey /etc/ssl/private/ca_server.key --outfile /etc/ssl/certs/ca_server.pem


De manière générale, l'extension .pem désigne un fichier contenant l'entièreté d'un certificat (clés publique et privé) et contenu dans le répertoire /etc/ssl/certs tandis qu'un fichier avec l'extension .key contient uniquement la clé privée et est situé dans /etc/ssl/private.

Création d'un certificat pour le service LDAP


Pour des raisons de sécurité, il est recommandé à chaque service d''un serveur de disposer de son propre certificat. On réitère donc les étapes précédentes pour LDAP en le signant à l'aide de l'autorité de certification précédemment définie :
# Création de clé privée RSA
certtool --generate-privkey --sec-param high --outfile /etc/ssl/private/ldap_server.key
# Génération d'un certificat autosigné
certtool --generate-certificate --load-privkey /etc/ssl/private/ldap_server.key --load-ca-certificate /etc/ssl/certs/ca_server.pem --load-ca-privkey /etc/ssl/private/ca_server.key --outfile /etc/ssl/certs/ldap_server.pem


On autorise alors openLDAP à utiliser le certificat ainsi généré :
usermod -aG ssl-cert openldap
sudo chown root:ssl-cert /etc/ssl/private/ldap_server.key
chmod 640 /etc/ssl/private/ldap_server.key


Configuration du serveur LDAP pour utilisation de StartTLS )


Fichier LDIF de configuration

dn: cn=config
changetype: modify
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/ca_server.pem
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/ssl/ldap_server.pem
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/ssl/ldap_server.key


Intégration du fichier LDIF (accès ldapi car racine cn=config) :
ldapmodify -Y EXTERNAL -H ldapi:/// -f cert.ldif
service slapd force-reload


Ajout de l'accès ldaps à /etc/default/slapd :

SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"

Pour forcer l'utilisation de StartTLS en l'ajoutant dans la configuration
ldapmodify -H ldapi:// -Y EXTERNAL -f forcetls.ldif
service slapd force-reload

où forcetls.dif conitent les lignes suivantes

dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcSecurity
olcSecurity: tls=1


Configuration du client LDAP


Il reste à importer le certificat d'autorité ca_cert.pem dans la liste des certificats du client (/etc/ldap/)
et lui spécifier le chemin d'accès en éditant le fichier /etc/ldap/ldap.conf:

BASE dc=defis,dc=info
URI ldaps://ldap.defis.info
TLS_CACERT /etc/ldap/ca_cert.pem


L'utilisation du protocole STARTLS est possible en ajoutant l'option -ZZ dans les commandes ldapsearch, ldapadd et ldapmodify.

À faire : Création des sous-groupes pour Nextcloud

Webographie

- https://wiki.faimaison.net/doku.php?id=adminsys:ldap
- https://fr.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol
- https://www.digitalocean.com/community/tutorials/how-to-encrypt-openldap-connections-using-starttls
- https://www.codeflow.site/fr/article/how-to-encrypt-openldap-connections-using-starttls