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
  • Domain C
  • Organizational U
  • 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
  • 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