Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

Chapitre 715 minIntermédiaire

Annuaire LDAP, Active Directory et Kerberos

Par Josselyn C., prof de BTS SIO. Mis à jour le .

À la fin de ce chapitre, tu sauras

  • lire un DN et écrire un filtre LDAP ;
  • organiser les groupes Active Directory selon AGDLP ;
  • décrire les échanges Kerberos et diagnostiquer un problème d'horloge ;
  • nommer les attaques contre l'annuaire et leurs parades ;
  • authentifier une application par l'annuaire sans injection LDAP.

4 exercices corrigés1 schéma

Un annuaire est une base centrale qui recense les comptes, les groupes et les machines d'une organisation, et que les applications interrogent pour authentifier les utilisateurs et connaître leurs droits. LDAP est le protocole standard pour interroger un annuaire ; Active Directory est l'annuaire de Microsoft, qui utilise LDAP pour la consultation et Kerberos pour l'authentification. Kerberos permet à un utilisateur de prouver son identité une seule fois à l'ouverture de session, puis d'accéder aux services du domaine grâce à des tickets, sans retaper son mot de passe.

Pourquoi un annuaire

Sans annuaire, chaque serveur a ses comptes locaux : Chloé Lambert a un compte sur le serveur de fichiers, un autre sur l'imprimante, un troisième sur l'outil de tickets, avec des mots de passe différents qui ne suivent pas la même politique. Le jour de son départ, il faut penser à tous. L'annuaire centralise les identités (comptes utilisateurs et ordinateurs), les groupes, les attributs (service, fonction, téléphone) et, pour Active Directory, les politiques appliquées aux postes. Une identité, un mot de passe, une politique, un point de désactivation.

LDAP : le protocole des annuaires

LDAP (Lightweight Directory Access Protocol, version 3, RFC 4511) est le protocole qui permet de chercher, lire et modifier les entrées d'un annuaire.

PortUsage
TCP 389LDAP, en clair, ou chiffré après la commande StartTLS
TCP 636LDAPS : LDAP dans un tunnel TLS dès la connexion
TCP 3268 et 3269Catalogue global d'Active Directory (recherche dans toute la forêt), en clair et en TLS

L'annuaire est un arbre (le DIT, Directory Information Tree). Chaque entrée a un nom distinctif (DN, Distinguished Name) qui décrit son chemin, de la feuille vers la racine :

text
CN=Chloé Lambert,OU=Informatique,OU=Utilisateurs,DC=ad,DC=sorbier,DC=example
ComposantSignificationIci
DC (domain component)Un morceau du nom de domainead.sorbier.example
OU (organizational unit)Une unité d'organisation, un dossier de l'arbreUtilisateurs, puis Informatique
CN (common name)Le nom de l'objetChloé Lambert

Chaque entrée appartient à des classes d'objets (user, group, computer, inetOrgPerson…) qui définissent ses attributs : sAMAccountName (l'identifiant court, clambert), userPrincipalName (clambert@ad.sorbier.example), mail, memberOf (ses groupes), department.

Une recherche LDAP en ligne de commande, depuis un serveur Linux :

bash
# Chercher Chloé dans l'annuaire, en LDAPS, avec un compte de service en lecture seule
ldapsearch -H ldaps://dc1.ad.sorbier.example -D "svc-ldap-lecture@ad.sorbier.example" -W \
  -b "OU=Utilisateurs,DC=ad,DC=sorbier,DC=example" \
  "(&(objectClass=user)(sAMAccountName=clambert))" cn mail memberOf

Le filtre (&(objectClass=user)(sAMAccountName=clambert)) se lit « les objets qui sont des utilisateurs et dont l'identifiant est clambert ». & signifie ET, | OU, ! NON.

Active Directory : les briques à connaître

Active Directory Domain Services (AD DS) est l'annuaire des réseaux Windows. Ses briques, que tu manipules en SISR :

BriqueRôle
DomaineEnsemble de comptes et de machines qui partagent un annuaire et des politiques : ad.sorbier.example
Contrôleur de domaine (DC)Serveur qui héberge l'annuaire et authentifie. On en installe au moins deux, qui se répliquent
ForêtUn ou plusieurs domaines qui se font confiance ; la frontière de sécurité d'Active Directory
Unité d'organisation (OU)Dossier qui range les objets, sur lequel on applique des GPO et délègue l'administration
Groupe de sécuritéEnsemble de comptes auquel on donne des droits
GPO (stratégie de groupe)Ensemble de paramètres appliqués aux utilisateurs et aux ordinateurs d'une OU : mots de passe, verrouillage d'écran, logiciels, pare-feu
DNSIndispensable : les postes trouvent les contrôleurs de domaine grâce à des enregistrements DNS

Les groupes ont une étendue qui dit où ils peuvent être utilisés. La bonne pratique pour donner des droits sur une ressource s'appelle AGDLP :

  • Accounts : les comptes des utilisateurs…
  • … vont dans des groupes Globaux qui représentent une fonction (GG_Comptabilite) ;
  • ces groupes globaux vont dans des groupes de Domaine Local qui représentent un droit sur une ressource (DL_Partage_Compta_Modification) ;
  • et c'est au groupe de domaine local que l'on donne la Permission (sur le dossier, l'imprimante).

Quand Paul Martin arrive à la comptabilité, on l'ajoute à GG_Comptabilite : il obtient d'un coup tous les droits de sa fonction. Personne ne touche aux ACL des dossiers. Cette organisation est la traduction technique de la matrice d'habilitations (chapitre 11).

powershell
# Créer le compte de Paul Martin dans la bonne OU, désactivé tant que son arrivée n'est pas confirmée
New-ADUser -Name "Paul Martin" -SamAccountName "pmartin" `
  -UserPrincipalName "pmartin@ad.sorbier.example" `
  -Path "OU=Comptabilite,OU=Utilisateurs,DC=ad,DC=sorbier,DC=example" `
  -AccountPassword (Read-Host -AsSecureString "Mot de passe initial") `
  -ChangePasswordAtLogon $true -Enabled $false

# Lui donner les droits de sa fonction
Add-ADGroupMember -Identity "GG_Comptabilite" -Members "pmartin"

# Le jour de l'arrivée
Enable-ADAccount -Identity "pmartin"

Le cours Windows Server détaille l'installation d'un contrôleur de domaine, les OU et les GPO. Sous Linux, les équivalents libres sont OpenLDAP (annuaire seul), Samba en mode contrôleur de domaine (compatible Active Directory) et FreeIPA (annuaire, Kerberos et gestion des droits).

Kerberos : s'authentifier une fois, accéder à tout le domaine

Kerberos (version 5) est le protocole d'authentification d'Active Directory. Son idée : l'utilisateur prouve son identité une seule fois à un tiers de confiance, le KDC (Key Distribution Center, qui tourne sur chaque contrôleur de domaine), et reçoit en échange des tickets chiffrés qu'il présente ensuite aux services. Son mot de passe ne circule jamais sur le réseau.

Poste de ChloéclientKDCcontrôleur : AS + TGSServeurde fichiers1. AS-REQ : horodatagechiffré (clé du mot de passe)2. AS-REP : TGT (10 h)3. TGS-REQ : TGT+ service demandé4. TGS-REP : ticket de service5. AP-REQ : ticket de serviceaccès selon lesgroupes du ticketLe mot de passe ne circule jamais · horloges synchronisées à moins de 5 minutes
Kerberos : un TGT obtenu une fois, puis un ticket par service

Les étapes, avec leur nom :

  1. AS-REQ : à l'ouverture de session, le poste demande au service d'authentification (AS) un ticket. Il prouve qu'il connaît le mot de passe en chiffrant l'heure courante avec une clé dérivée de ce mot de passe (la pré-authentification).
  2. AS-REP : le KDC vérifie et renvoie un TGT (Ticket Granting Ticket), chiffré avec la clé du compte spécial krbtgt, que seul le KDC connaît.
  3. TGS-REQ : pour accéder au serveur de fichiers, le poste présente son TGT au service d'émission de tickets (TGS).
  4. TGS-REP : le TGS renvoie un ticket de service pour ce serveur, chiffré avec la clé du compte du serveur.
  5. AP-REQ : le poste présente le ticket de service au serveur, qui le déchiffre avec sa propre clé, y lit l'identité de Chloé et ses groupes, et applique les droits.

Les valeurs par défaut d'une stratégie Kerberos d'Active Directory, à connaître :

ParamètreValeur par défautConséquence
Durée de vie maximale du ticket utilisateur (TGT)10 heuresUne journée de travail sans ressaisie
Durée maximale de renouvellement7 joursAu-delà, il faut se réauthentifier
Tolérance de décalage des horloges5 minutesUn poste dont l'heure dérive de plus de 5 minutes ne peut plus s'authentifier
PortTCP et UDP 88À ouvrir entre les postes et les contrôleurs de domaine

NTLM, l'ancien protocole à abandonner

Avant Kerberos, Windows utilisait NTLM, un protocole défi-réponse. Il reste utilisé quand Kerberos n'est pas possible (accès par adresse IP au lieu du nom, machine hors domaine). Il est plus faible : pas d'authentification mutuelle, exposition aux attaques par relais et au pass-the-hash. Microsoft a déclaré toutes les versions de NTLM obsolètes et a supprimé NTLMv1 de Windows 11 24H2 et de Windows Server 2025. La consigne : appeler l'authentification par Negotiate, qui tente Kerberos d'abord, auditer l'usage de NTLM, puis le restreindre.

Les attaques contre l'annuaire, en bref

Active Directory est la cible principale des attaques par rançongiciel : qui contrôle le domaine contrôle toutes les machines. Quatre attaques à savoir nommer et parer :

AttaquePrincipeParade
Pass-the-hashRéutiliser l'empreinte NTLM d'un mot de passe, récupérée dans la mémoire d'un poste, sans connaître le mot de passeMots de passe locaux uniques (LAPS), comptes d'administration qui ne se connectent jamais aux postes ordinaires, restriction de NTLM
KerberoastingDemander un ticket de service pour un compte de service, puis casser hors ligne le mot de passe qui le chiffreComptes de service gérés (gMSA) aux mots de passe longs et renouvelés automatiquement, chiffrement AES
AS-REP roastingViser les comptes dont la pré-authentification est désactivéeNe jamais désactiver la pré-authentification
Golden ticketAprès avoir volé la clé du compte krbtgt, fabriquer des TGT pour n'importe quel compteProtéger les contrôleurs de domaine comme le cœur du système ; en cas de compromission, réinitialiser deux fois le mot de passe de krbtgt

L'ANSSI publie des recommandations dédiées à l'administration sécurisée des systèmes d'information reposant sur Active Directory, organisées autour du cloisonnement des comptes d'administration en niveaux (chapitre 10).

Côté SLAM : authentifier les utilisateurs d'une application par l'annuaire

Une application interne peut éviter de gérer ses propres mots de passe en les faisant vérifier par l'annuaire : elle cherche le DN de l'utilisateur avec un compte de service, puis tente un bind avec ce DN et le mot de passe saisi. Si le bind réussit, le mot de passe est bon.

php
<?php
function authentifierParAnnuaire(string $identifiant, string $motDePasse): ?array {
    // Un mot de passe vide ferait un bind anonyme qui RÉUSSIT : on le refuse d'emblée
    if ($identifiant === '' || $motDePasse === '') {
        return null;
    }
    $ldap = ldap_connect('ldaps://dc1.ad.sorbier.example');
    ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);

    // 1. Bind du compte de service, en lecture seule (secret lu hors du code source)
    if (!ldap_bind($ldap, 'svc-ldap-lecture@ad.sorbier.example', getenv('LDAP_SVC_MDP'))) {
        return null;
    }
    // 2. Recherche du DN : la saisie est échappée avant d'entrer dans le filtre
    $filtre = sprintf('(&(objectClass=user)(sAMAccountName=%s))',
                      ldap_escape($identifiant, '', LDAP_ESCAPE_FILTER));
    $resultat = ldap_search($ldap, 'OU=Utilisateurs,DC=ad,DC=sorbier,DC=example',
                            $filtre, ['dn', 'cn', 'memberof']);
    $entrees = ldap_get_entries($ldap, $resultat);
    if ($entrees['count'] !== 1) {
        return null;
    }
    // 3. Bind avec le DN trouvé et le mot de passe saisi : c'est la vérification
    if (!@ldap_bind($ldap, $entrees[0]['dn'], $motDePasse)) {
        return null;
    }
    return ['dn' => $entrees[0]['dn'], 'groupes' => $entrees[0]['memberof'] ?? []];
}

Deux pièges que ce code évite :

  • l'injection LDAP : sans ldap_escape(), un identifiant comme *)(sAMAccountName=* modifie le filtre, comme une injection SQL modifie une requête (cours SQL) ;
  • le bind non authentifié : avec un DN valide et un mot de passe vide, beaucoup d'annuaires acceptent le bind comme anonyme, et l'application croit le mot de passe correct.

Aujourd'hui, une application web récente passe plutôt par un fournisseur d'identité OpenID Connect relié à l'annuaire (chapitre 6) : elle ne voit plus du tout les mots de passe.

Comment l'E7 l'interroge

  • SISR : expliquer le rôle d'un contrôleur de domaine et l'intérêt d'en avoir deux ; proposer une organisation des groupes (AGDLP) ; diagnostiquer un échec d'authentification dû à l'heure ; justifier LDAPS plutôt que LDAP ; proposer une parade au pass-the-hash ou au kerberoasting ; analyser des journaux de connexion d'un contrôleur de domaine.
  • SLAM : repérer une injection LDAP ; expliquer pourquoi déléguer l'authentification à l'annuaire évite de stocker des mots de passe ; justifier un compte de service en lecture seule.
  • Tronc commun : expliquer l'intérêt d'un annuaire centralisé pour la gestion des arrivées et des départs.

Exercices

Exercice 1 sur 4 Lire un DN Réussi À revoir

Soit le DN CN=Inès Bonnet,OU=Logistique,OU=Utilisateurs,DC=ad,DC=sorbier,DC=example.

  1. Quel est le nom de domaine ?
  2. Dans quelle unité d'organisation se trouve le compte ?
  3. Écris le filtre LDAP qui cherche les utilisateurs du service Logistique dont l'attribut department vaut Logistique ou Entrepôt.
Voir la réponseMasquer la réponse de l'exercice 1
  1. ad.sorbier.example (les composants DC, dans l'ordre).
  2. L'OU Logistique, elle-même dans l'OU Utilisateurs.
  3. (&(objectClass=user)(|(department=Logistique)(department=Entrepôt))) : un ET entre la classe et un OU entre les deux valeurs.

Tu avais trouvé ?

Exercice 2 sur 4 AGDLP Réussi À revoir

Les trois membres du service informatique doivent pouvoir modifier le dossier partagé Scripts ; la responsable de la direction doit seulement le lire. Propose les groupes à créer et les droits à poser, selon AGDLP.

Voir la réponseMasquer la réponse de l'exercice 2
  • Groupes globaux (fonctions) : GG_Informatique (Antoine Mercier, Chloé Lambert, Moussa Diallo) et GG_Direction (Hélène Garnier).
  • Groupes de domaine local (droits sur la ressource) : DL_Scripts_Modification et DL_Scripts_Lecture.
  • Imbrication : GG_Informatique membre de DL_Scripts_Modification, GG_Direction membre de DL_Scripts_Lecture.
  • Permissions sur le dossier Scripts : Modification pour DL_Scripts_Modification, Lecture pour DL_Scripts_Lecture.

Un nouvel informaticien sera ajouté à GG_Informatique, sans toucher aux droits du dossier.

Tu avais trouvé ?

Exercice 3 sur 4 L'horloge du portable Réussi À revoir

Après un retour de mission à l'étranger, le portable de Sofiane Benali affiche une heure décalée de 7 minutes par rapport aux serveurs. Il ne peut plus accéder aux partages réseau, alors que son mot de passe est correct. Explique et propose une solution.

Voir la réponseMasquer la réponse de l'exercice 3

Kerberos refuse les demandes dont l'horodatage s'écarte de plus de 5 minutes (tolérance par défaut) de l'heure du contrôleur de domaine : cela empêche de rejouer des messages capturés. Avec 7 minutes d'écart, la pré-authentification échoue. Il faut resynchroniser l'heure du portable sur le domaine (w32tm /resync en administrateur, ou vérifier que le service de temps Windows est actif et que le fuseau horaire est correct).

Tu avais trouvé ?

Exercice 4 sur 4 L'injection LDAP Réussi À revoir

Une application construit son filtre ainsi : "(&(objectClass=user)(sAMAccountName=" . $_POST['login'] . "))". Que devient le filtre si l'utilisateur saisit * ? Quel est le risque, et comment corriger ?

Voir la réponseMasquer la réponse de l'exercice 4

Le filtre devient (&(objectClass=user)(sAMAccountName=*)) : il sélectionne tous les utilisateurs. Selon le code qui suit, l'application peut afficher l'annuaire entier ou prendre le premier compte trouvé, ce qui ouvre la porte à l'énumération des comptes ou à un contournement de l'authentification. Correction : échapper la saisie avec ldap_escape($_POST['login'], '', LDAP_ESCAPE_FILTER), qui transforme * en \2a, et exiger exactement un résultat.

Tu avais trouvé ?

Chapitre terminé !

Fais les 4 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Contrôle d'accès au réseau : 802.1X, RADIUS et portail captifRevoir le sommaire du cours