🛠 Outils IT
🛠 102 outils 📚 53 docs
🤖 Assistant ☀

Active Directory - Durcissement et sécurité

Périmètre : cette page suppose les bases acquises (installation d'un DC, DNS, réplication, OU, GPO) décrites dans Windows Server - AD, DHCP, DNS. Elle traite du durcissement d'une forêt existante, sous l'angle défensif : chaque technique d'attaque citée l'est pour expliquer comment la prévenir, la détecter et l'auditer. Les exemples utilisent le domaine fictif contoso.local.

1. Modèle de menace et administration en tiers

1.1 Pourquoi AD est la cible n°1

Dans la quasi-totalité des compromissions de SI Windows (rançongiciel, espionnage), l'attaquant suit le même schéma : un poste utilisateur compromis, récupération d'identifiants en mémoire ou sur le réseau, mouvement latéral, puis prise de contrôle d'un compte disposant de droits sur le domaine. Une fois Domain Admins ou l'équivalent obtenu, le chiffrement ou l'exfiltration de tout le parc se fait par GPO ou par tâche planifiée en quelques minutes.

Le problème central n'est pas une vulnérabilité logicielle, mais l'exposition des identifiants privilégiés : un administrateur de domaine qui ouvre une session RDP sur un serveur applicatif laisse des éléments réutilisables (ticket Kerberos, hash NT, jeton) sur une machine bien moins protégée qu'un DC. Le durcissement AD consiste donc d'abord à cloisonner où les comptes privilégiés s'authentifient, puis à réduire les chemins d'attaque (ACL, délégations, protocoles faibles), et enfin à détecter.

1.2 Le modèle en tiers

Le modèle historique de Microsoft (Tier 0/1/2) reste la base pédagogique et opérationnelle la plus utilisée, même si Microsoft le présente désormais dans un cadre plus large, l'Enterprise Access Model (plan de contrôle, plan de gestion, plan de données, accès utilisateurs et applicatifs, intégrant le cloud).

TierContenuComptes associésRègle d'or
Tier 0DC, AD, ADCS (PKI d'entreprise), ADFS, Entra Connect / Cloud Sync, serveurs de sauvegarde des DC, hyperviseurs hébergeant des DC, outils de gestion des identités, PAW Tier 0Domain/Enterprise/Schema Admins, Administrators du domaine, comptes de service de ces outilsNe s'authentifient jamais sur un actif Tier 1 ou 2
Tier 1Serveurs membres, applications, bases de données, middlewareAdministrateurs serveurs, comptes de service applicatifsPas d'ouverture de session sur les postes de travail
Tier 2Postes de travail, imprimantes, terminauxSupport / helpdeskPas de droits sur les serveurs ni sur AD
Le piège du « Tier 0 caché » : tout ce qui peut modifier un actif Tier 0 est Tier 0. Exemples fréquents : l'hyperviseur (ou le vCenter / cluster Proxmox) qui héberge les DC, la console de sauvegarde capable de restaurer un DC, un serveur WSUS / SCCM / Intune qui pousse du code sur les DC, l'agent EDR administré depuis une console Tier 1, un compte qui a GenericAll sur une GPO liée à l'OU Domain Controllers. Ces systèmes doivent être administrés comme des DC.

1.3 Traduction concrète dans l'AD

Le modèle se matérialise par une arborescence d'OU dédiée, des groupes par tier, et des droits d'ouverture de session refusés par GPO.

OU=Admin,DC=contoso,DC=local
  OU=Tier0
    OU=Accounts        (comptes adm-t0-*)
    OU=Groups          (GRP-T0-*)
    OU=Devices         (PAW Tier 0)
    OU=ServiceAccounts
  OU=Tier1
    OU=Accounts / Groups / ServiceAccounts
  OU=Tier2
    OU=Accounts / Groups / ServiceAccounts
OU=Servers  (Tier 1)
OU=Workstations (Tier 2)
# Creation de la structure (extrait)
$base = "DC=contoso,DC=local"
New-ADOrganizationalUnit -Name "Admin" -Path $base -ProtectedFromAccidentalDeletion $true
foreach ($t in "Tier0","Tier1","Tier2") {
    New-ADOrganizationalUnit -Name $t -Path "OU=Admin,$base"
    foreach ($s in "Accounts","Groups","ServiceAccounts","Devices") {
        New-ADOrganizationalUnit -Name $s -Path "OU=$t,OU=Admin,$base"
    }
}

# Bloquer l'heritage des GPO "poste de travail" sur l'OU Admin
Set-GPInheritance -Target "OU=Admin,$base" -IsBlocked Yes

1.4 Les refus d'ouverture de session (cœur du cloisonnement)

GPO appliquée àDroits utilisateur à configurer (Deny)Groupes refusés
OU Servers (Tier 1)Deny log on locally, Deny log on through Remote Desktop Services, Deny access from the network, Deny log on as a batch job, Deny log on as a serviceGRP-T0-Admins, Domain Admins, Enterprise Admins, GRP-T2-Admins
OU Workstations (Tier 2)Mêmes droitsGRP-T0-Admins, Domain Admins, Enterprise Admins, GRP-T1-Admins
OU Domain ControllersDeny log on through RDS / locallyGRP-T1-Admins, GRP-T2-Admins
Déploiement progressif : appliquez d'abord les refus Tier 0 sur Tier 2 (les postes), c'est là que les identifiants privilégiés sont le plus souvent volés. Identifiez au préalable les tâches planifiées et services qui tournent avec un compte Domain Admin (voir section 13 : PingCastle les remonte) sinon ils cesseront de fonctionner.

2. PAW et comptes d'administration séparés

2.1 Comptes séparés par tier

Un administrateur dispose d'un compte bureautique sans aucun privilège (messagerie, navigation) et d'un compte par tier qu'il administre. Convention courante : jdupont, adm-t1-jdupont, adm-t0-jdupont. Les comptes d'administration :

  • n'ont pas de boîte aux lettres ni de licence bureautique, ne sont pas synchronisés vers Entra ID (les rôles cloud privilégiés utilisent des comptes cloud-only, voir Entra ID) ;
  • ont l'attribut « Account is sensitive and cannot be delegated » et sont membres de Protected Users (Tier 0 a minima) ;
  • utilisent une authentification forte : carte à puce / Windows Hello for Business, ou au minimum un mot de passe long (20+) unique ;
  • sont nominatifs ; le compte intégré Administrator (RID 500) est conservé avec un mot de passe long sous séquestre, pour la reprise uniquement.
# Marquer tous les comptes de l'OU Tier0 comme non delegables
Get-ADUser -SearchBase "OU=Accounts,OU=Tier0,OU=Admin,DC=contoso,DC=local" -Filter * |
    Set-ADAccountControl -AccountNotDelegated $true

# Comptes privilegies (adminCount=1) encore delegables : a corriger
Get-ADUser -Filter 'adminCount -eq 1 -and Enabled -eq $true' -Properties AccountNotDelegated |
    Where-Object { -not $_.AccountNotDelegated } | Select-Object SamAccountName

# Comptes privilegies avec mot de passe jamais change depuis plus d'un an
Get-ADUser -Filter 'adminCount -eq 1' -Properties PasswordLastSet |
    Where-Object PasswordLastSet -lt (Get-Date).AddDays(-365) |
    Select-Object SamAccountName, PasswordLastSet

2.2 Vider les groupes privilégiés

Domain Admins doit contenir quelques comptes (souvent 2 à 5), Enterprise Admins et Schema Admins doivent être vides en temps normal (on y ajoute un compte le temps d'une opération). Ne pas oublier les groupes « opérateurs » hérités, qui offrent des chemins vers Tier 0 :

GroupeRisqueCible
Account OperatorsPeut modifier la plupart des comptes et groupes non protégésVide
Server OperatorsOuverture de session sur DC, modification de servicesVide
Backup OperatorsLecture de la base NTDS et des ruches de registre d'un DCVide ou compte de service Tier 0 dédié
Print OperatorsChargement de pilotes sur les DCVide
DnsAdminsHistoriquement, chargement d'une DLL dans le service DNS des DCVide / Tier 0
Group Policy Creator OwnersCréation de GPOTier 0 uniquement
# Inventaire recursif des groupes sensibles
$groups = "Domain Admins","Enterprise Admins","Schema Admins","Administrators",
          "Account Operators","Server Operators","Backup Operators","Print Operators","DnsAdmins"
foreach ($g in $groups) {
    Get-ADGroupMember -Identity $g -Recursive -ErrorAction SilentlyContinue |
        Select-Object @{n='Groupe';e={$g}}, SamAccountName, objectClass
}

2.3 Postes d'administration privilégiés (PAW)

Un PAW est un poste dédié à l'administration d'un tier, durci et sans usage bureautique. C'est la seule machine depuis laquelle un compte Tier 0 ouvre une session. Caractéristiques attendues :

  • Matériel dédié (ou au minimum OS hôte PAW avec VM bureautique, jamais l'inverse) ; Secure Boot, TPM, BitLocker, Credential Guard activé ;
  • pas de navigation Internet ni de messagerie ; flux sortants limités aux cibles administrées (pare-feu local + filtrage réseau) ;
  • contrôle d'application (WDAC / App Control for Business ou AppLocker) ;
  • géré depuis Tier 0 (OU dédiée, GPO dédiées, pas de console de gestion Tier 1/2 qui y pousse du code) ;
  • connexion aux serveurs via RDP en Restricted Admin ou Remote Credential Guard, ou de préférence via outils distants (RSAT, PowerShell remoting) qui n'exposent pas d'identifiants réutilisables.
# Connexion RDP sans deleguer d'identifiants reutilisables
mstsc.exe /remoteGuard /v:srv-app01.contoso.local
# ou mode Restricted Admin (necessite que la cible l'autorise)
mstsc.exe /restrictedAdmin /v:srv-app01.contoso.local

# Verifier que Credential Guard tourne sur le PAW
(Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard).SecurityServicesRunning
# 1 = Credential Guard actif
Jump servers : un serveur de rebond partagé n'est pas un PAW. S'il est utilisé, il devient Tier 0 dès qu'un compte Tier 0 s'y connecte, et il doit être administré et protégé comme un DC. Le contrôle d'accès commence sur le poste depuis lequel on se connecte.

3. Protected Users, Authentication Policies et Silos

3.1 Le groupe Protected Users

Disponible depuis Windows Server 2012 R2, ce groupe global applique des protections côté DC et côté client, non désactivables par l'utilisateur :

ProtectionEffet
Pas d'authentification NTLMLe hash NT n'est pas utilisable pour s'authentifier ; pas de cache NTLM sur le client
Kerberos sans DES ni RC4 en pré-authentificationAES obligatoire
Pas de délégationNi contrainte ni non contrainte
TGT limité à 4 heuresNon renouvelable au-delà ; réauthentification
Pas de cache d'identifiantsPas d'ouverture de session hors ligne (cached logon) avec ces comptes
CredSSP / DigestIdentifiants non conservés en clair
Ne jamais y placer : les comptes de service, les comptes d'ordinateur, les comptes gMSA, ni le seul compte capable de se connecter aux DC en cas de panne Kerberos (gardez le RID 500 hors du groupe, sous séquestre). Ajoutez les comptes d'admin un par un et testez leurs usages réels (RDP, consoles MMC, scripts planifiés) avant de généraliser.
Add-ADGroupMember -Identity "Protected Users" -Members "adm-t0-jdupont"

# Verifier l'impact : evenements de rejet sur les DC
# Journal : Applications and Services Logs\Microsoft\Windows\Authentication
#   ProtectedUserFailures-DomainController / ProtectedUserSuccesses-DomainController
# (journaux desactives par defaut : les activer avant le test)
wevtutil sl "Microsoft-Windows-Authentication/ProtectedUserFailures-DomainController" /e:true

3.2 Authentication Policies et Silos

Les silos d'authentification (niveau fonctionnel de domaine 2012 R2 minimum) permettent d'exprimer côté KDC : « ce compte Tier 0 ne peut obtenir un TGT que depuis une machine du silo Tier 0 ». C'est le moyen technique le plus robuste de faire respecter le modèle en tiers, car la restriction est appliquée par le DC et non par la machine cible.

Prérequis :

  • GPO sur les DC : KDC support for claims, compound authentication and Kerberos armoring = Supported (ou Always provide claims) ;
  • GPO sur les clients du silo (PAW) : Kerberos client support for claims, compound authentication and Kerberos armoring = Enabled ;
  • les comptes du silo doivent pouvoir faire du Kerberos (pas de NTLM : cohérent avec Protected Users).
# 1. Politique : TGT de 4h, utilisable uniquement depuis une machine du silo
New-ADAuthenticationPolicy -Name "AP-Tier0" `
    -UserTGTLifetimeMins 240 `
    -UserAllowedToAuthenticateFrom 'O:SYG:SYD:(XA;OICI;CR;;;WD;(@USER.ad://ext/AuthenticationSilo == "Silo-Tier0"))' `
    -ProtectedFromAccidentalDeletion $true
# (pas de -Enforce : mode audit dans un premier temps)

# 2. Silo associe a la politique
New-ADAuthenticationPolicySilo -Name "Silo-Tier0" `
    -UserAuthenticationPolicy "AP-Tier0" `
    -ComputerAuthenticationPolicy "AP-Tier0" `
    -ServiceAuthenticationPolicy "AP-Tier0" `
    -ProtectedFromAccidentalDeletion $true

# 3. Autoriser puis affecter les membres (comptes ET machines : PAW + DC)
$members = Get-ADUser -SearchBase "OU=Accounts,OU=Tier0,OU=Admin,DC=contoso,DC=local" -Filter *
$members += Get-ADComputer -SearchBase "OU=Devices,OU=Tier0,OU=Admin,DC=contoso,DC=local" -Filter *
$members += Get-ADComputer -SearchBase "OU=Domain Controllers,DC=contoso,DC=local" -Filter *
foreach ($m in $members) {
    Grant-ADAuthenticationPolicySiloAccess -Identity "Silo-Tier0" -Account $m
    if ($m.objectClass -eq 'user') { Set-ADUser $m -AuthenticationPolicySilo "Silo-Tier0" }
    else { Set-ADComputer $m -AuthenticationPolicySilo "Silo-Tier0" }
}

# 4. Apres analyse des journaux d'audit : passage en mode bloquant
Set-ADAuthenticationPolicy -Identity "AP-Tier0" -Enforce $true
Set-ADAuthenticationPolicySilo -Identity "Silo-Tier0" -Enforce $true
Mode audit : tant que -Enforce n'est pas positionné, les refus qui auraient eu lieu sont journalisés dans Microsoft-Windows-Authentication/AuthenticationPolicyFailures-DomainController (à activer). Laissez tourner au moins un cycle d'exploitation complet (patchs mensuels, sauvegardes) avant d'appliquer.

4. Windows LAPS

4.1 Pourquoi et quoi

Un mot de passe administrateur local identique sur tout le parc transforme la compromission d'un poste en compromission de tous (réutilisation du hash NT). Windows LAPS, intégré nativement à Windows depuis les mises à jour d'avril 2023 (Windows 10/11, Windows Server 2019 et ultérieurs), remplace l'ancien « Microsoft LAPS » (MSI, attribut ms-Mcs-AdmPwd en clair), désormais déprécié.

CritèreLegacy LAPSWindows LAPS
InstallationMSI + extension CSEIntégré à l'OS
Stockagems-Mcs-AdmPwd (clair, protégé par ACL)msLAPS-Password ou msLAPS-EncryptedPassword (chiffré)
ChiffrementNonOui (DFL 2016 requis), déchiffrable par un principal désigné
HistoriqueNonOui (avec chiffrement)
Mot de passe DSRM des DCNonOui (chiffrement obligatoire)
Rotation après usageNonPost-authentication actions (rotation + déconnexion / redémarrage)
Entra IDNonOui (machines jointes Entra)
Nouveautés Server 2025 / Win 11 24H2-Gestion automatique du compte (création, renommage, désactivation), phrases de passe, détection de retour arrière d'image

4.2 Déploiement

# 1. Etendre le schema (une fois, en Schema Admin)
Update-LapsADSchema

# 2. Autoriser les ordinateurs d'une OU a ecrire leur propre mot de passe
Set-LapsADComputerSelfPermission -Identity "OU=Workstations,DC=contoso,DC=local"
Set-LapsADComputerSelfPermission -Identity "OU=Servers,DC=contoso,DC=local"

# 3. Droits de lecture / reinitialisation : groupes par tier
Set-LapsADReadPasswordPermission  -Identity "OU=Workstations,DC=contoso,DC=local" -AllowedPrincipals "CONTOSO\GRP-T2-LAPS-Read"
Set-LapsADResetPasswordPermission -Identity "OU=Workstations,DC=contoso,DC=local" -AllowedPrincipals "CONTOSO\GRP-T2-LAPS-Read"
Set-LapsADReadPasswordPermission  -Identity "OU=Servers,DC=contoso,DC=local" -AllowedPrincipals "CONTOSO\GRP-T1-LAPS-Read"

# 4. Auditer qui peut lire (droits etendus) - inclut les heritages oublies
Find-LapsADExtendedRights -Identity "OU=Workstations,DC=contoso,DC=local"

GPO : Computer Configuration > Administrative Templates > System > LAPS.

ParamètreValeur recommandée
Configure password backup directoryActive Directory
Password SettingsComplexité large (ou phrase de passe), longueur 20+, âge 30 jours (7 pour les serveurs sensibles)
Enable password encryptionEnabled
Configure authorized password decryptorsGroupe par tier (sinon : Domain Admins par défaut)
Configure size of encrypted password history12
Post-authentication actionsReset password and logoff (délai 8 à 24 h)
Enable password backup for DSRM accountsEnabled (GPO liée à l'OU Domain Controllers)
Name of administrator account to manageUniquement si compte personnalisé (sinon RID 500)

4.3 Lecture et opérations

# Lire le mot de passe courant (dechiffre si le lecteur est autorise)
Get-LapsADPassword -Identity "PC-0142" -AsPlainText

# Historique
Get-LapsADPassword -Identity "PC-0142" -IncludeHistory -AsPlainText

# Forcer une rotation immediate (cote AD : expiration a maintenant)
Set-LapsADPasswordExpirationTime -Identity "PC-0142"

# Sur la machine : forcer le traitement de la politique, consulter le journal
Invoke-LapsPolicyProcessing
Get-WinEvent -LogName "Microsoft-Windows-LAPS/Operational" -MaxEvents 20

# Couverture : machines actives sans mot de passe LAPS
Get-ADComputer -Filter 'Enabled -eq $true' -Properties msLAPS-PasswordExpirationTime, LastLogonDate |
    Where-Object { -not $_.'msLAPS-PasswordExpirationTime' -and $_.LastLogonDate -gt (Get-Date).AddDays(-30) } |
    Select-Object Name, LastLogonDate
Pièges LAPS :
  • Le droit All Extended Rights ou GenericAll sur une OU donne la lecture des mots de passe en clair (cas legacy) : auditez avec Find-LapsADExtendedRights, pas seulement avec les groupes prévus.
  • Ne faites pas tourner legacy et Windows LAPS sur le même compte : utilisez le mode d'émulation legacy le temps de la migration, puis basculez.
  • Le chiffrement nécessite le niveau fonctionnel de domaine 2016 ; sans lui, le mot de passe est stocké en clair dans msLAPS-Password.
  • Restaurer un snapshot de VM rend le mot de passe stocké dans AD invalide (mot de passe local plus ancien) : c'est le cas que la détection de retour arrière de Windows Server 2025 traite.

5. Kerberos : AES, gMSA/dMSA, SPN, roasting

5.1 Types de chiffrement : sortir de RC4

RC4-HMAC utilise directement le hash NT comme clé : un ticket de service chiffré en RC4 peut être attaqué hors ligne beaucoup plus vite qu'un ticket AES. Microsoft a engagé la désactivation progressive de RC4 dans Kerberos (annonces et mises à jour 2025-2026, avec phases d'audit puis d'application) : vérifiez l'état exact selon votre niveau de correctifs, mais l'objectif est clair, AES uniquement.

Valeur msDS-SupportedEncryptionTypesSignification
0 / non définiComportement par défaut du DC (historiquement RC4 pour les comptes utilisateurs de service)
0x4 (4)RC4 seul
0x8 (8)AES128
0x10 (16)AES256
0x18 (24)AES128 + AES256 (cible)
0x1C (28)RC4 + AES (transition)
# Comptes avec SPN et leur type de chiffrement declare
Get-ADUser -Filter 'servicePrincipalName -like "*"' `
    -Properties servicePrincipalName, msDS-SupportedEncryptionTypes, PasswordLastSet |
    Select-Object SamAccountName, @{n='EncTypes';e={$_.'msDS-SupportedEncryptionTypes'}}, PasswordLastSet

# Forcer AES sur un compte de service
Set-ADUser svc-app01 -KerberosEncryptionType AES128,AES256

# ATTENTION : un compte dont le mot de passe n'a pas ete change depuis
# la creation du domaine 2008+ peut ne pas avoir de cle AES -> le changer.

# Sur les DC, mesurer l'usage residuel de RC4 (4769 / 4768, champ Ticket Encryption Type)
#   0x17 = RC4-HMAC, 0x12 = AES256, 0x11 = AES128
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4769} -MaxEvents 5000 |
    Where-Object { $_.Properties[5].Value -eq 0x17 } |
    Group-Object { $_.Properties[2].Value } | Sort-Object Count -Descending |
    Select-Object Count, Name
Index des propriétés : la position des champs dans Properties[] varie selon la version de l'événement (Microsoft a enrichi 4768/4769 en 2025 avec des informations sur les types de chiffrement). Validez sur un événement réel ($e.ToXml()) avant d'industrialiser, ou utilisez un filtre XPath sur le nom du champ TicketEncryptionType.

5.2 Comptes de service : gMSA puis dMSA

Un compte de service utilisateur classique (mot de passe fixe, SPN, souvent membre de groupes privilégiés) est la cible idéale du kerberoasting. Les gMSA (group Managed Service Accounts) ont un mot de passe de 240 octets aléatoire, changé automatiquement tous les 30 jours, récupérable uniquement par les machines autorisées.

# Prerequis unique par foret : cle racine KDS
# (en production, attendre la replication : ~10 h apres creation)
Add-KdsRootKey -EffectiveImmediately

# Creer le gMSA, utilisable par les membres d'un groupe d'ordinateurs
New-ADServiceAccount -Name "gmsa-sql01" `
    -DNSHostName "gmsa-sql01.contoso.local" `
    -PrincipalsAllowedToRetrieveManagedPassword "GRP-T1-SQL-Hosts" `
    -KerberosEncryptionType AES128,AES256 `
    -ServicePrincipalNames "MSSQLSvc/sql01.contoso.local:1433","MSSQLSvc/sql01.contoso.local"

# Sur le serveur (apres redemarrage pour prise en compte du groupe)
Install-ADServiceAccount -Identity gmsa-sql01
Test-ADServiceAccount -Identity gmsa-sql01   # doit renvoyer True
# Le service est ensuite configure avec CONTOSO\gmsa-sql01$ et un mot de passe vide

# Qui peut lire le mot de passe d'un gMSA (a auditer : equivaut a etre le compte)
Get-ADServiceAccount gmsa-sql01 -Properties PrincipalsAllowedToRetrieveManagedPassword |
    Select-Object -ExpandProperty PrincipalsAllowedToRetrieveManagedPassword

dMSA (delegated Managed Service Account), introduit avec Windows Server 2025, vise la migration des comptes de service existants : le dMSA hérite des droits du compte legacy, le compte legacy est ensuite désactivé, et l'identité est liée aux machines autorisées.

# Schema simplifie de migration (Windows Server 2025, DC 2025 requis)
New-ADServiceAccount -Name "dmsa-app01" -DNSHostName "dmsa-app01.contoso.local" `
    -CreateDelegatedServiceAccount -KerberosEncryptionType AES256
Start-ADServiceAccountMigration    -Identity "dmsa-app01" -SupersededAccount "CN=svc-app01,OU=ServiceAccounts,OU=Tier1,OU=Admin,DC=contoso,DC=local"
# ... periode d'observation : le service s'authentifie et le dMSA apprend ses usages ...
Complete-ADServiceAccountMigration -Identity "dmsa-app01" -SupersededAccount "CN=svc-app01,OU=ServiceAccounts,OU=Tier1,OU=Admin,DC=contoso,DC=local"
dMSA et droits de création sur les OU : une recherche publiée en 2025 (« BadSuccessor ») a montré qu'un compte disposant simplement du droit de créer des objets dans une OU pouvait, via les attributs de migration d'un dMSA, hériter des privilèges d'un autre compte. Appliquez les correctifs Microsoft et auditez les droits CreateChild / GenericAll / WriteProperty sur les OU, même dans une forêt sans DC 2025.

5.3 Kerberoasting et AS-REP roasting : prévention et détection

TechniqueCondition côté ADPréventionDétection
KerberoastingCompte utilisateur avec SPN, mot de passe humain, RC4 acceptégMSA/dMSA ; sinon mot de passe 30+ caractères aléatoire, AES only ; retirer les SPN inutiles ; aucun compte à SPN dans un groupe privilégié4769 en RC4 (0x17) vers des comptes utilisateurs ; un même compte demandant des tickets pour de nombreux SPN en peu de temps ; compte « leurre » à SPN jamais utilisé légitimement
AS-REP roastingCompte avec « Do not require Kerberos preauthentication »Supprimer le drapeau (aucun besoin moderne)4768 avec Pre-Authentication Type = 0
# Comptes sans pre-authentification Kerberos (doit etre vide)
Get-ADUser -Filter 'DoesNotRequirePreAuth -eq $true' | Select-Object SamAccountName
# Correction
Set-ADAccountControl -Identity compte-legacy -DoesNotRequirePreAuth $false

# Comptes utilisateurs avec SPN membres d'un groupe privilegie (priorite absolue)
Get-ADUser -Filter 'servicePrincipalName -like "*" -and adminCount -eq 1' |
    Select-Object SamAccountName

# SPN dupliques (cause classique d'echec Kerberos -> repli NTLM)
setspn -X -F
Compte leurre (honeytoken) : créez un compte utilisateur activé et crédible (un compte désactivé ou au nom évocateur est vite repéré comme leurre), avec un SPN plausible (MSSQLSvc/sql-legacy.contoso.local), un mot de passe très long, et aucune utilisation légitime. Toute requête 4769 le visant est une alerte de haute fidélité. Même logique pour un compte avec adminCount=1 jamais utilisé.

6. NTLM : audit puis restriction

6.1 Contexte

NTLM n'offre pas d'authentification mutuelle, se relaie (NTLM relay vers LDAP, SMB, HTTP/ADCS) et accepte le hash NT comme secret (pass-the-hash). Microsoft a annoncé en 2024 la dépréciation de NTLM (toutes versions) au profit de Kerberos et de ses extensions (IAKerb, KDC local), et NTLMv1 a été retiré de Windows 11 24H2 et Windows Server 2025. La suppression totale de NTLM reste un chantier de longue haleine : l'approche réaliste est audit → réduction → exceptions documentées → blocage.

6.2 Étape 1 : interdire NTLMv1 et LM

# GPO : Network security: LAN Manager authentication level
#   = Send NTLMv2 response only. Refuse LM & NTLM   (valeur 5)
# Equivalent registre :
# HKLM\SYSTEM\CurrentControlSet\Control\Lsa  LmCompatibilityLevel = 5

# GPO : Network security: Do not store LAN Manager hash value on next password change = Enabled

# Detection NTLMv1 residuel sur les DC (4624, champ "Package Name (NTLM only)")
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624} -MaxEvents 20000 |
    Where-Object { $_.Message -match 'NTLM V1' } |
    Select-Object TimeCreated, @{n='Detail';e={($_.Message -split "`n" | Select-String 'Workstation Name|Account Name|Source Network Address') -join ' | '}}

6.3 Étape 2 : auditer tout NTLM

GPO (Security Options)OùValeur
Network security: Restrict NTLM: Audit NTLM authentication in this domainDCEnable all
Network security: Restrict NTLM: Audit Incoming NTLM TrafficServeurs / DCEnable auditing for all accounts
Network security: Restrict NTLM: Outgoing NTLM traffic to remote serversClientsAudit all

Les événements arrivent dans Applications and Services Logs\Microsoft\Windows\NTLM\Operational (8001 à 8004 : 8004 sur les DC indique le compte, la machine source et le serveur cible). Agrégez-les dans le SIEM pendant plusieurs semaines pour bâtir l'inventaire des flux NTLM.

# Top des couples (serveur cible, compte) en NTLM vus par un DC
Get-WinEvent -LogName "Microsoft-Windows-NTLM/Operational" -FilterXPath "*[System[EventID=8004]]" -MaxEvents 20000 |
    ForEach-Object { $x = [xml]$_.ToXml(); [pscustomobject]@{
        Serveur = ($x.Event.EventData.Data | ? Name -eq 'SChannelName').'#text'
        Compte  = ($x.Event.EventData.Data | ? Name -eq 'UserName').'#text'
        Source  = ($x.Event.EventData.Data | ? Name -eq 'WorkstationName').'#text' } } |
    Group-Object Serveur, Compte | Sort-Object Count -Descending | Select-Object -First 30 Count, Name

6.4 Causes habituelles de NTLM et correction

CauseCorrection
Accès par adresse IP (\\192.0.2.10\partage)Utiliser le FQDN ; Kerberos par IP n'est possible qu'avec un SPN IP explicite (déconseillé)
SPN absent ou dupliquésetspn -Q / setspn -X, enregistrer le SPN sur le bon compte
Alias DNS (CNAME) sans SPNsetspn -S HTTP/alias.contoso.local svc-web
Application codée en dur sur NTLMConfiguration « Negotiate » / mise à jour éditeur, sinon exception
Machine hors domaine, appliance, NASKerberos si supporté, sinon exception documentée et surveillée
Accès inter-forêts sans approbation adaptéeVérifier routage des suffixes / approbation

6.5 Étape 3 : restreindre

Quand l'inventaire est maîtrisé : Restrict NTLM: NTLM authentication in this domain = Deny for domain accounts to domain servers (ou plus strict), avec la liste d'exceptions Add server exceptions in this domain. Commencez par les comptes Tier 0 (Protected Users le fait déjà pour eux), puis les serveurs Tier 0 (refus NTLM entrant sur les DC hors exceptions), puis le reste.

Ordre impératif : ne passez jamais directement en « Deny all ». Un refus NTLM global coupe silencieusement des imprimantes, des scanners, des applications métier et parfois des scripts de sauvegarde. L'audit doit être propre (zéro événement non expliqué) sur une période représentative.

7. SMB signing, LDAP signing et channel binding

7.1 Pourquoi

Le relais NTLM consiste à rejouer une authentification interceptée vers un autre service. La signature (SMB, LDAP) et le channel binding (LDAPS, HTTPS/EPA) lient l'authentification à la session ou au canal TLS, ce qui rend le relais inopérant. C'est le complément indispensable de la réduction de NTLM.

7.2 SMB

# Etat cote serveur et client
Get-SmbServerConfiguration | Select-Object EnableSMB1Protocol, RequireSecuritySignature, EncryptData
Get-SmbClientConfiguration | Select-Object RequireSecuritySignature

# Exiger la signature (equivalent GPO "Microsoft network server/client: Digitally sign communications (always)")
Set-SmbServerConfiguration -RequireSecuritySignature $true -Force
Set-SmbClientConfiguration -RequireSecuritySignature $true -Force

# Supprimer SMBv1
Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -NoRestart
Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force

# Verifier les sessions en cours (Signed / Dialect)
Get-SmbConnection | Select-Object ServerName, ShareName, Dialect, Signed, Encrypted
Get-SmbSession    | Select-Object ClientComputerName, ClientUserName, Dialect, Signed
Valeurs par défaut récentes : les DC exigent la signature SMB depuis longtemps ; Windows 11 24H2 et Windows Server 2025 l'exigent par défaut sur davantage de connexions (notamment sortantes). Les NAS et équipements anciens qui ne signent pas sont la principale source d'incidents : testez-les avant la généralisation.

7.3 LDAP signing et channel binding

MesureGPO / registrePhase auditPhase application
LDAP signing (DC)Domain controller: LDAP server signing requirementsÉvénements 2887 (synthèse quotidienne) et 2889 (détail par client, journal Directory Service)Require signing
LDAP signing (clients)Network security: LDAP client signing requirements-Negotiate signing (minimum) / Require signing
Channel binding LDAPSDomain controller: LDAP server channel binding token requirements (registre LdapEnforceChannelBinding : 0 / 1 / 2)Événements 3039 à 30411 = When supported, puis 2 = Always
# Activer la journalisation detaillee des binds LDAP non signes (2889) sur un DC
reg add "HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Diagnostics" /v "16 LDAP Interface Events" /t REG_DWORD /d 2 /f

# Extraire les clients fautifs
Get-WinEvent -FilterHashtable @{LogName='Directory Service'; Id=2889} -MaxEvents 2000 |
    ForEach-Object { $x=[xml]$_.ToXml(); [pscustomobject]@{
        Client = $x.Event.EventData.Data[0]; Compte = $x.Event.EventData.Data[1] } } |
    Group-Object Client, Compte | Sort-Object Count -Descending

# Remettre le niveau de log a 0 apres analyse (volumetrie)
reg add "HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Diagnostics" /v "16 LDAP Interface Events" /t REG_DWORD /d 0 /f
Coupables habituels : applications qui font un « simple bind » LDAP en clair sur le port 389 (copieurs multifonctions, anciens portails, appliances VPN, outils de synchronisation). La correction consiste à passer en LDAPS (636) ou en StartTLS avec un certificat valide sur les DC, et à utiliser un compte de service dédié en lecture seule.

7.4 HTTP : EPA et services web d'ADCS

Les services d'inscription web d'ADCS (Web Enrollment, CES) et d'autres services IIS en authentification Windows sont des cibles de relais NTLM. Exigez HTTPS + Extended Protection for Authentication (EPA), désactivez NTLM sur ces sites, ou retirez ces rôles s'ils ne servent pas. Détail dans PKI et certificats.

8. Délégations Kerberos

8.1 Les trois mécanismes

TypeAttributRisqueRecommandation
Non contrainteUAC TRUSTED_FOR_DELEGATIONLe serveur reçoit et garde en mémoire le TGT de tout utilisateur qui s'y connecte, y compris d'un DC si on force celui-ci à s'authentifier (coercition)Interdite hors DC. Migrer vers contrainte / RBCD
Contrainte (KCD)msDS-AllowedToDelegateTo (+ TRUSTED_TO_AUTH_FOR_DELEGATION si transition de protocole)Si le compte est compromis, usurpation de n'importe quel utilisateur vers les SPN listés (avec transition de protocole : sans même que l'utilisateur se connecte)Liste minimale, pas de SPN de DC (ldap/, cifs/ d'un DC = Tier 0)
RBCD (basée sur la ressource)msDS-AllowedToActOnBehalfOfOtherIdentity sur la cibleQuiconque peut écrire cet attribut sur une machine peut s'y faire passer pour un adminAuditer qui peut écrire l'attribut ; MachineAccountQuota = 0

8.2 Audit

# Delegation non contrainte (hors DC)
Get-ADComputer -Filter 'TrustedForDelegation -eq $true -and PrimaryGroupID -ne 516' |
    Select-Object Name, DistinguishedName
Get-ADUser -Filter 'TrustedForDelegation -eq $true' | Select-Object SamAccountName

# Delegation contrainte (avec ou sans transition de protocole)
Get-ADObject -Filter 'msDS-AllowedToDelegateTo -like "*"' `
    -Properties msDS-AllowedToDelegateTo, userAccountControl |
    Select-Object Name, @{n='T2A4D';e={[bool]($_.userAccountControl -band 0x1000000)}},
                  @{n='Cibles';e={$_.'msDS-AllowedToDelegateTo' -join ', '}}

# RBCD configuree
Get-ADComputer -Filter * -Properties msDS-AllowedToActOnBehalfOfOtherIdentity |
    Where-Object 'msDS-AllowedToActOnBehalfOfOtherIdentity' |
    Select-Object Name, @{n='Autorises';e={$_.'msDS-AllowedToActOnBehalfOfOtherIdentity'.Access.IdentityReference -join ', '}}

# Quota de creation de machines par les utilisateurs (defaut : 10)
Get-ADObject (Get-ADDomain).DistinguishedName -Properties ms-DS-MachineAccountQuota |
    Select-Object ms-DS-MachineAccountQuota
Set-ADDomain -Identity contoso.local -Replace @{"ms-DS-MachineAccountQuota"="0"}

8.3 Réduire la surface de coercition

La délégation non contrainte est surtout dangereuse combinée à la coercition d'authentification (forcer un DC à s'authentifier vers une machine contrôlée, via le spouleur d'impression, EFSRPC, etc.). Mesures :

  • Désactiver le service Print Spooler sur les DC et les serveurs Tier 0 qui n'impriment pas ;
  • appliquer les correctifs EFSRPC / DFS et filtrer les RPC inutiles (filtres RPC, pare-feu Windows entre tiers) ;
  • bloquer les flux SMB/HTTP sortants des DC vers les postes de travail (un DC n'a aucune raison de s'authentifier vers un poste) ;
  • marquer les comptes sensibles AccountNotDelegated / Protected Users.
# Spooler sur les DC
Invoke-Command -ComputerName (Get-ADDomainController -Filter *).HostName {
    Stop-Service Spooler -Force; Set-Service Spooler -StartupType Disabled
    Get-Service Spooler | Select-Object PSComputerName, Status, StartType }

9. ACL dangereuses, AdminSDHolder et DCSync

9.1 Les droits qui équivalent à un contrôle total

DroitSurConséquence
GenericAll / GenericWrite / WriteDacl / WriteOwnerUtilisateur, groupe, ordinateur, OU, GPOPrise de contrôle de l'objet (reset de mot de passe, ajout de membre, ajout d'ACE, modification de GPO)
User-Force-Change-Password (extended right)UtilisateurRéinitialisation du mot de passe
WriteProperty member (Self-Membership)GroupeAjout à un groupe privilégié
WriteProperty servicePrincipalNameUtilisateurRend le compte « kerberoastable »
WriteProperty msDS-KeyCredentialLinkUtilisateur / ordinateurAjout d'une clé d'authentification (shadow credentials)
WriteProperty gPLinkOU / domaineLiaison d'une GPO malveillante
Droits de réplicationRacine du domaineDCSync : extraction de tous les hashes (dont krbtgt)

Ces ACE s'accumulent avec le temps : délégations helpdesk trop larges, installations d'Exchange (historiquement, droits WriteDacl sur le domaine), outils tiers, comptes de migration jamais nettoyés. Leur visualisation en graphe (BloodHound, section 13) est bien plus efficace que la lecture d'ACL objet par objet.

9.2 AdminSDHolder et SDProp

Le conteneur CN=AdminSDHolder,CN=System,DC=contoso,DC=local porte l'ACL de référence des objets protégés (membres directs ou indirects de Domain Admins, Administrators, Enterprise Admins, Schema Admins, opérateurs, krbtgt...). Le processus SDProp, exécuté par le PDC Emulator toutes les 60 minutes, réécrit l'ACL de ces objets à partir d'AdminSDHolder et pose adminCount=1.

  • Persistance : une ACE ajoutée sur AdminSDHolder se propage à tous les comptes privilégiés et revient après chaque nettoyage. AdminSDHolder doit être audité (SACL + événement 5136) et comparé à une référence.
  • Orphelins : un compte retiré d'un groupe protégé garde adminCount=1 et une ACL sans héritage. Il faut le nettoyer manuellement.
# ACL actuelle d'AdminSDHolder (a comparer a une reference exportee)
$dn = "CN=AdminSDHolder,CN=System,$((Get-ADDomain).DistinguishedName)"
(Get-Acl "AD:$dn").Access |
    Select-Object IdentityReference, ActiveDirectoryRights, ObjectType, AccessControlType |
    Sort-Object IdentityReference | Format-Table -AutoSize

# Comptes adminCount=1 qui ne sont plus dans aucun groupe protege (orphelins)
$prot = foreach ($g in "Domain Admins","Enterprise Admins","Schema Admins","Administrators",
                       "Account Operators","Server Operators","Backup Operators","Print Operators") {
    Get-ADGroupMember $g -Recursive -ErrorAction SilentlyContinue | Select-Object -Expand SamAccountName }
Get-ADUser -Filter 'adminCount -eq 1' | Where-Object { $_.SamAccountName -notin $prot -and $_.SamAccountName -ne 'krbtgt' } |
    Select-Object SamAccountName
# Nettoyage : adminCount a vide puis reactivation de l'heritage
# Set-ADUser compte -Clear adminCount ; puis Securite avancee > Activer l'heritage

9.3 DCSync : qui a les droits de réplication ?

Le protocole de réplication (MS-DRSR) permet à un DC de demander les secrets à un autre. Tout principal disposant des deux droits étendus DS-Replication-Get-Changes et DS-Replication-Get-Changes-All sur la racine du domaine peut en faire autant depuis n'importe quelle machine. En dehors des DC, d'Enterprise/Domain Admins, Administrators et éventuellement du compte de connecteur Entra Connect (synchronisation des hashes), personne ne doit les avoir.

Droit étenduGUID
DS-Replication-Get-Changes1131f6aa-9c07-11d1-f79f-00c04fc2dcd2
DS-Replication-Get-Changes-All1131f6ad-9c07-11d1-f79f-00c04fc2dcd2
DS-Replication-Get-Changes-In-Filtered-Set89e95b76-444d-4c62-991a-0facbeda640c
# Liste des principaux ayant les droits de replication sur le domaine
Import-Module ActiveDirectory
$domDN = (Get-ADDomain).DistinguishedName
$guids = @{ '1131f6aa-9c07-11d1-f79f-00c04fc2dcd2'='Get-Changes'
            '1131f6ad-9c07-11d1-f79f-00c04fc2dcd2'='Get-Changes-All'
            '89e95b76-444d-4c62-991a-0facbeda640c'='Get-Changes-In-Filtered-Set' }
(Get-Acl "AD:$domDN").Access |
    Where-Object { $guids.ContainsKey($_.ObjectType.Guid) -or $_.ActiveDirectoryRights -match 'GenericAll' } |
    Select-Object IdentityReference, ActiveDirectoryRights,
                  @{n='Droit';e={ $guids[$_.ObjectType.Guid] }}, AccessControlType |
    Sort-Object IdentityReference

Détection : événement 4662 sur les DC (nécessite l'audit « Directory Service Access » et une SACL sur la racine du domaine, présente par défaut pour Everyone en succès) dont les propriétés contiennent l'un des GUID ci-dessus et dont le compte n'est pas un compte d'ordinateur de DC. Microsoft Defender for Identity détecte nativement ce scénario (réplication demandée par une machine qui n'est pas un DC), ce qui est plus fiable que la corrélation d'événements.

9.4 GPO et objets Tier 0

# Qui peut modifier les GPO liees aux DC ?
$gpos = (Get-GPInheritance -Target "OU=Domain Controllers,$((Get-ADDomain).DistinguishedName)").GpoLinks
foreach ($l in $gpos) {
    Get-GPPermission -Guid $l.GpoId -All |
        Where-Object { $_.Permission -in 'GpoEdit','GpoEditDeleteModifySecurity' } |
        Select-Object @{n='GPO';e={$l.DisplayName}}, @{n='Qui';e={$_.Trustee.Name}}, Permission
}
# Toute entree hors groupes Tier 0 est un chemin d'escalade.

10. ADCS et rotation du compte krbtgt

10.1 ADCS : un composant Tier 0

Une autorité de certification d'entreprise intégrée à AD émet des certificats acceptés pour l'authentification (PKINIT, Schannel). Un modèle de certificat mal configuré permet à un simple utilisateur d'obtenir un certificat au nom d'un administrateur. Les configurations vulnérables sont classées dans la littérature en familles ESC1 à ESC16 (modèle autorisant le sujet fourni par le demandeur avec EKU d'authentification, ACL de modèle trop larges, agent d'inscription, drapeau EDITF_ATTRIBUTESUBJECTALTNAME2, relais NTLM vers l'inscription web, mappage faible...).

  • Traitez les serveurs d'AC, leurs clés (HSM idéalement) et leurs administrateurs comme Tier 0.
  • Auditez les modèles publiés et leurs ACL (PingCastle, Locksmith, BloodHound les signalent).
  • Assurez-vous que le mappage fort des certificats (KB5014754, extension SID dans les certificats) est appliqué : Microsoft est passé progressivement en mode application complète (2025) ; un DC encore en mode compatibilité est une faiblesse.

Procédures détaillées, commandes certutil et corrections ESC : voir PKI et certificats et OpenSSL.

10.2 Le compte krbtgt

Tous les TGT du domaine sont chiffrés et signés avec la clé du compte krbtgt. Quiconque obtient cette clé (DCSync, vol de ntds.dit, sauvegarde de DC non protégée) peut forger des TGT arbitraires (« golden ticket ») valables jusqu'au changement de la clé. Le mot de passe de krbtgt n'est changé que manuellement.

Le DC accepte la clé courante et la précédente : un seul reset n'invalide donc pas les tickets forgés avec l'ancienne clé. D'où la rotation double, avec un délai entre les deux.

  1. Vérifier la santé de la réplication (repadmin /replsummary sans erreur) : un DC qui ne reçoit pas le nouveau mot de passe refusera les tickets émis par les autres.
  2. Premier reset du mot de passe krbtgt, réplication forcée, contrôle de la version de l'attribut sur tous les DC.
  3. Attendre au moins la durée de vie maximale d'un ticket (10 h par défaut, règle « Maximum lifetime for user ticket ») + le temps de réplication. En pratique, 24 h.
  4. Second reset, réplication, contrôle.
# Etat actuel
Get-ADUser krbtgt -Properties PasswordLastSet, msDS-KeyVersionNumber |
    Select-Object PasswordLastSet, msDS-KeyVersionNumber

# Version de l'attribut unicodePwd sur chaque DC apres un reset
repadmin /showobjmeta * "CN=krbtgt,CN=Users,DC=contoso,DC=local" | Select-String "unicodePwd"

# Microsoft publie un script dedie (New-KrbtgtKeys.ps1, depot GitHub "microsoft")
# qui propose un mode simulation, verifie la replication et cible aussi
# les comptes krbtgt_NNNNN des RODC. Preferer ce script a un reset manuel.
Rythme : rotation double planifiée régulièrement (par exemple tous les 6 mois, ce qui valide aussi la procédure), et immédiatement lors d'une reprise après compromission, en enchaînant les deux resets plus rapidement (au prix de déconnexions et d'erreurs Kerberos transitoires acceptées). Un krbtgt dont PasswordLastSet date de la création du domaine est un signal d'alerte classique des audits.

11. GPO de sécurité et baselines

11.1 Baselines Microsoft

Le Microsoft Security Compliance Toolkit fournit les baselines de sécurité par version (Windows Server 2025 « Domain Controller » et « Member Server », Windows 11, Edge, Microsoft 365 Apps) sous forme de sauvegardes de GPO, avec Policy Analyzer (comparaison entre baseline, GPO existantes et configuration effective) et LGPO (application locale). Windows Server 2025 propose aussi des baselines appliquées et maintenues via OSConfig.

# Importer une GPO de baseline depuis le dossier "GPOs" du toolkit
Import-GPO -BackupGpoName "MSFT Windows Server 2025 - Domain Controller" `
    -Path "C:\Baselines\WS2025\GPOs" -TargetName "BL-WS2025-DC" -CreateIfNeeded

# Lier en desactive d'abord, comparer avec Policy Analyzer, puis activer
New-GPLink -Name "BL-WS2025-DC" -Target "OU=Domain Controllers,DC=contoso,DC=local" -LinkEnabled No

# Etat effectif sur une machine
gpresult /h C:\Temp\rsop.html /f
Méthode : n'éditez pas la GPO de baseline. Créez une GPO « deltas » de priorité supérieure qui contient uniquement vos écarts documentés. Lors de la sortie d'une nouvelle baseline, vous remplacez la GPO Microsoft sans perdre vos exceptions.

11.2 Paramètres à fort impact

ParamètreValeurObjectif
Credential Guard (VBS)Activé avec verrou UEFI (postes, serveurs membres ; pas sur les DC)Protéger les secrets LSA
LSA Protection (RunAsPPL)ActivéEmpêcher la lecture de LSASS par un processus non protégé
WDigest UseLogonCredential0Pas de mot de passe en clair en mémoire
Cached logons count0 à 2 sur serveurs, 1 à 4 sur postes nomadesLimiter les vérificateurs en cache
LLMNR / NetBIOS over TCP / mDNSDésactivésEmpêcher l'empoisonnement de résolution de noms
WPADDésactivé ou entrée DNS maîtriséeIdem
Pare-feu WindowsActif, règles entrantes restreintes, RDP/WinRM depuis les PAW / sous-réseaux d'admin uniquementLimiter le mouvement latéral
Attack Surface Reduction (Defender)Règle « Block credential stealing from LSASS » au minimumDurcissement poste
PowerShellScript Block Logging, transcription, Constrained Language via App ControlVisibilité (voir sécurité PowerShell)

11.3 Restreindre les administrateurs locaux

Le groupe local Administrators doit être piloté centralement : seul le compte LAPS et un groupe de domaine du tier concerné y figurent.

  • Group Policy Preferences > Local Users and Groups (action Update, « Delete all member users/groups » coché) : remplace le contenu par la liste attendue, par OU.
  • Ou Restricted Groups (plus brutal, remplace l'intégralité).
  • Refuser l'usage réseau des comptes locaux : Deny access to this computer from the network et Deny log on through RDS pour le SID S-1-5-114 (« Local account and member of Administrators group »). Cela neutralise la réutilisation latérale d'un compte local, même identique.
  • Désactiver l'élévation distante des comptes locaux : LocalAccountTokenFilterPolicy = 0 (défaut, à vérifier).
# Audit : membres du groupe Administrators local sur un lot de serveurs
$srv = Get-ADComputer -SearchBase "OU=Servers,DC=contoso,DC=local" -Filter 'Enabled -eq $true' | Select-Object -Expand Name
Invoke-Command -ComputerName $srv -ScriptBlock {
    Get-LocalGroupMember -SID S-1-5-32-544 | Select-Object @{n='Serveur';e={$env:COMPUTERNAME}}, Name, PrincipalSource
} -ErrorAction SilentlyContinue | Sort-Object Serveur | Format-Table -AutoSize

Voir aussi Droits Windows pour la gestion fine des ACL NTFS et des partages.

12. Journalisation et détection

12.1 Politique d'audit avancée

Utilisez exclusivement l'Advanced Audit Policy Configuration et activez Audit: Force audit policy subcategory settings to override audit policy category settings, sinon les deux mécanismes se contredisent.

Sous-catégorieDCServeurs / postes
Credential ValidationSuccès + ÉchecÉchec
Kerberos Authentication ServiceSuccès + Échec-
Kerberos Service Ticket OperationsSuccès + Échec-
Computer / User / Security Group Account ManagementSuccès + ÉchecSuccès
Directory Service AccessSuccès + Échec-
Directory Service ChangesSuccès-
Logon / Logoff, Special LogonSuccès + ÉchecSuccès + Échec
Process Creation (+ ligne de commande)SuccèsSuccès
Audit Policy Change, Authentication Policy ChangeSuccèsSuccès
Security System Extension, System IntegritySuccès + ÉchecSuccès + Échec
# Verifier la politique effective
auditpol /get /category:*

# Inclure la ligne de commande dans 4688
# GPO : Administrative Templates > System > Audit Process Creation >
#       Include command line in process creation events = Enabled

# Taille des journaux sur les DC (le defaut est bien trop faible)
wevtutil sl Security /ms:4294967296     # 4 Go
wevtutil gl Security

12.2 Événements clés

IDSignificationUsage en détection
4624 / 4625Ouverture de session réussie / échouéeType de logon (2 interactif, 3 réseau, 10 RDP), package NTLM vs Kerberos, compte Tier 0 sur machine hors Tier 0
4648Ouverture avec identifiants explicitesrunas, mouvement latéral
4672Privilèges spéciaux attribuésSession administrative : où se connectent les comptes privilégiés
4768 / 4771Demande de TGT / échec de pré-authentificationPré-auth type 0 (AS-REP), pulvérisation de mots de passe (4771 en masse)
4769Ticket de serviceRC4 (0x17), volume anormal (kerberoasting), compte leurre
4776Validation NTLM par le DCInventaire NTLM, pulvérisation
4662Opération sur un objet ADDCSync (GUID de réplication), lecture d'attributs LAPS
5136Objet AD modifiéAdminSDHolder, GPO, msDS-KeyCredentialLink, délégations
4728 / 4732 / 4756Membre ajouté à un groupe global / local / universelAjout à un groupe privilégié = alerte immédiate
4720 / 4722 / 4724 / 4738Compte créé / activé / reset de mot de passe / modifiéComptes inattendus, changement d'UAC (pré-auth, délégation)
4742Compte ordinateur modifiéAjout de délégation, de SPN
4740Compte verrouilléPulvérisation, ancienne session
4719 / 1102Politique d'audit modifiée / journal effacéTentative d'effacement de traces
4794Tentative de définition du mot de passe DSRMPersistance
7045 (System)Service installéExécution distante (outils de type PsExec)

12.3 Collecte et Sysmon

  • Windows Event Forwarding (WEF) : abonnements initiés par la source vers un collecteur Windows (WinRM), sans agent ; puis transfert vers le SIEM. Le collecteur qui reçoit les journaux des DC est un actif Tier 0.
  • Sysmon (Sysinternals) complète l'audit natif : création de processus avec hash et parent (ID 1), connexions réseau (3), chargement de pilotes (6), accès à LSASS (10), requêtes DNS (22). Partir d'une configuration communautaire maintenue et l'adapter, la configuration par défaut étant peu utile.
  • Sur les DC, viser une rétention locale d'au moins quelques jours et une rétention centrale de 6 à 12 mois (enquête post-incident).
# Installation Sysmon avec une configuration (fichier XML valide au prealable)
sysmon64.exe -accepteula -i C:\Sysmon\sysmonconfig.xml
# Mise a jour de la configuration
sysmon64.exe -c C:\Sysmon\sysmonconfig.xml

# Ajout d'un compte dans un groupe privilegie dans les dernieres 24 h (tous DC)
foreach ($dc in (Get-ADDomainController -Filter *).HostName) {
    Get-WinEvent -ComputerName $dc -FilterHashtable @{LogName='Security'; Id=4728,4732,4756; StartTime=(Get-Date).AddDays(-1)} -ErrorAction SilentlyContinue |
        Select-Object @{n='DC';e={$dc}}, TimeCreated, Id, @{n='Detail';e={$_.Message.Split("`n")[0]}}
}

12.4 Règles de détection à fort rapport signal / bruit

RègleSourceLogiqueFaux positifs typiques
Ajout à un groupe Tier 04728 / 4732 / 4756 sur DCGroupe cible dans la liste Tier 0, hors fenêtre de changementOpérations planifiées (à corréler avec le ticket)
Réplication depuis une non-DC4662 + GUID de réplicationCompte demandeur absent de la liste des comptes machine DC et du compte de synchronisation déclaréEntra Connect (à exclure nominativement)
Compte leurre sollicité4768 / 4769 / 4625 / 4624Toute occurrenceQuasi aucun
Rafale de tickets de service RC44769Un compte demande plus de N tickets RC4 vers des comptes utilisateurs distincts en 10 minScanners de vulnérabilités, applications legacy
Compte Tier 0 hors PAW / DC4624 type 2, 3, 10 sur serveurs et postesCompte membre du groupe Tier 0, machine hors OU Tier 0Comptes de service mal classés
Modification d'AdminSDHolder ou de GPO liée aux DC5136DN de l'objet modifiéMises à jour de baseline (planifiées)
Ajout de clé d'authentification5136 sur msDS-KeyCredentialLinkModifiant différent du compte lui-même / du service Windows Hello for BusinessEnrôlement WHfB légitime
Journal effacé / audit modifié1102 / 4719Toute occurrence sur DC et serveurs Tier 0Rares
Pulvérisation de mots de passe4771 / 4776 / 4625Une source, beaucoup de comptes distincts, 1 ou 2 échecs chacunSession restée ouverte après changement de mot de passe (un seul compte)
Prérequis des règles : elles supposent des listes de référence maintenues automatiquement (membres Tier 0, comptes machine des DC, PAW, comptes leurres). Exportez-les quotidiennement depuis l'AD vers le SIEM plutôt que de les saisir à la main : une liste figée génère soit du bruit, soit des angles morts.

Pour l'architecture de supervision (collecte, alerting, tableaux de bord), voir Monitoring.

13. Outils d'audit

OutilNatureCe qu'il apporteUsage conseillé
PingCastleAudit ponctuel (exécutable, sans installation), rapport HTML avec scoreSynthèse des risques : comptes privilégiés, délégations, krbtgt, LAPS, ADCS, GPO, protocoles faibles, objets obsolètesMensuel ; suivre l'évolution du score et traiter par règle
Purple Knight (Semperis)Audit ponctuel, indicateurs d'exposition et de compromissionIndicateurs AD, Entra ID, Okta ; recherche d'indices de compromission passéeSecond regard, complémentaire de PingCastle
BloodHound (Community Edition)Collecte + graphe des relationsChemins d'attaque vers Tier 0 (ACL, sessions, groupes, délégations, ADCS)En défensif : « qui peut atteindre Domain Admins ? », supprimer les arêtes les plus empruntées
Microsoft Defender for IdentityCapteurs sur DC, ADCS, ADFS, Entra Connect ; console Defender XDRDétection comportementale temps réel (DCSync, reconnaissance, pass-the-ticket...), évaluations de postureProduction, si licence disponible
LocksmithModule PowerShellDétection et corrections proposées pour les mauvaises configurations ADCSAvant / après chaque évolution PKI
Policy AnalyzerMicrosoft SCTÉcarts GPO vs baselinesÀ chaque nouvelle baseline
# PingCastle : healthcheck du domaine courant (depuis un poste Tier 0)
PingCastle.exe --healthcheck --server contoso.local

# Conserver les rapports XML pour suivre l'evolution
# (PingCastle sait consolider plusieurs rapports dans une carte / un tableau)
Cadre d'utilisation : ces outils interrogent massivement l'annuaire et certains collecteurs (BloodHound) énumèrent les sessions sur les machines : leur exécution doit être autorisée, annoncée à l'équipe SOC et faite depuis un poste d'administration, sans quoi elle déclenchera (à juste titre) les alertes de reconnaissance. Les résultats (graphe des chemins d'attaque, rapport) sont des données sensibles : stockage restreint, pas de partage par messagerie.

Pour la démarche d'audit globale (périmètre, restitution, priorisation), voir Audit de sécurité.

14. Sauvegarde et reprise de forêt

14.1 Ce qu'il faut sauvegarder

  • État système d'au moins deux DC par domaine (dont celui qui porte le plus de rôles FSMO), quotidien : base NTDS, SYSVOL, registre, base de la PKI si ADCS est sur un DC (déconseillé).
  • Sauvegarde hors domaine et immuable : un attaquant Domain Admin supprime d'abord les sauvegardes accessibles depuis le domaine. Le serveur de sauvegarde des DC ne doit pas être joint au domaine de production, ou appartenir à une forêt d'administration dédiée ; copie hors ligne / immuable obligatoire (voir Stratégie de sauvegarde).
  • Configuration : export des GPO (Backup-GPO -All), DNS, liste des approbations, des sites et liens, des modèles de certificats.
  • Le mot de passe DSRM de chaque DC (Windows LAPS le gère) et le mot de passe du compte RID 500, sous séquestre hors SI.
# Sauvegarde etat systeme vers un volume dedie
wbadmin start systemstatebackup -backupTarget:E: -quiet

# Export de toutes les GPO avec rapport
$d = "D:\GPOBackup\$(Get-Date -f yyyyMMdd)"; New-Item -ItemType Directory $d | Out-Null
Backup-GPO -All -Path $d
Get-GPOReport -All -ReportType Html -Path "$d\all-gpo.html"

# Age de la derniere sauvegarde vue par AD (par partition)
repadmin /showbackup *
Durée de validité : une sauvegarde de DC plus ancienne que la tombstone lifetime (180 jours par défaut) ne doit pas être restaurée. En pratique, la sauvegarde utile est récente et antérieure à la compromission : conservez plusieurs points sur plusieurs semaines.

14.2 Restaurations courantes

BesoinMéthode
Objet supprimé par erreurCorbeille AD (Restore-ADObject), si activée
Attribut / ACL modifiés à tortRestauration non autoritaire d'un DC isolé puis export, ou outil tiers ; à défaut, correction manuelle à partir des métadonnées (repadmin /showobjmeta)
Arborescence supprimée sans corbeilleRestauration non autoritaire en DSRM puis ntdsutil "authoritative restore" sur le sous-arbre
SYSVOL corrompu sur tous les DCRestauration autoritaire DFSR (msDFSR-Options = 1 sur le DC de référence)
Forêt compromise / chiffréePlan de reprise de forêt (ci-dessous)

14.3 Plan de reprise de forêt (principes du guide Microsoft)

  1. Décider : la reprise de forêt est justifiée si tous les DC sont inutilisables ou si l'intégrité de l'annuaire n'est plus garantie (compromission Tier 0 avérée). Identifier la sauvegarde saine la plus récente.
  2. Isoler : réseau de reprise sans lien avec la production (et sans la menace : postes d'admin neufs).
  3. Restaurer un DC inscriptible par domaine (en commençant par la racine de forêt), en restauration non autoritaire de SYSVOL marquée autoritaire.
  4. Sur ce DC : saisir les rôles FSMO, nettoyer les métadonnées des autres DC (ntdsutil metadata cleanup ou suppression via la console), augmenter le pool RID (invalider le pool courant / +100 000), réinitialiser le compte d'ordinateur du DC, le mot de passe krbtgt deux fois, les mots de passe des approbations, et le compte RID 500.
  5. Assainir : retirer les persistances connues (comptes, ACL, GPO, AdminSDHolder, délégations, modèles de certificats) avant toute reconnexion.
  6. Reconstruire les autres DC par promotion (pas par restauration), puis reconnecter progressivement les sites et serveurs, en réinitialisant les comptes de service et privilégiés.
Tester avant d'en avoir besoin : un plan de reprise de forêt jamais exercé échoue presque toujours (sauvegarde illisible, mot de passe DSRM inconnu, dépendance DNS oubliée, hyperviseur lui-même dépendant de l'AD). Exercez la procédure au moins annuellement dans un réseau isolé, chronométrez-la et mettez à jour la documentation. Vérifiez notamment que l'hyperviseur, le stockage et la sauvegarde démarrent et s'administrent sans l'AD.

15. Dépannage des effets de bord

SymptômeCause probableDiagnostic / correction
Un admin ne peut plus ouvrir de session RDP sur un serveur après ajout à Protected UsersRDP via NTLM (accès par IP, CredSSP sans Kerberos), ou TGT expiré au-delà de 4 hSe connecter par FQDN ; journal ProtectedUserFailures sur le DC ; klist purge puis réessayer
Service applicatif en échec « logon failure » après durcissementCompte de service dans Protected Users, ou refus de logon as a service par la GPO tiers4625 (statut / sous-statut) sur la machine ; retirer le compte du groupe / ajuster les droits ; migrer vers gMSA
Erreurs « KDC_ERR_ETYPE_NOSUPP » (4768/4769 en échec, code 0xE)Compte ou service sans clé AES après passage en AES onlyChanger le mot de passe du compte (génère les clés AES), vérifier msDS-SupportedEncryptionTypes du compte et du client
Copieur / scanner ne peut plus envoyer vers un partageSMBv1 désactivé ou signature SMB exigéeMettre à jour le firmware (SMB2/3 + signature) ; sinon partage dédié sur serveur isolé, exception documentée
Application LDAP en erreur « strong authentication required »LDAP signing exigé, bind simple sur 389Événements 2889 avant bascule ; passer l'application en LDAPS / StartTLS
Échec de bind LDAPS après activation du channel bindingClient ne supportant pas le CBT (ancienne bibliothèque, proxy TLS intermédiaire)Événements 3039 ; mise à jour du client ; rester temporairement en mode 1
gMSA : Test-ADServiceAccount renvoie FalseMachine pas encore membre effectif du groupe autorisé (jeton non rafraîchi), clé KDS non répliquéeRedémarrer le serveur (ou klist -li 0x3e7 purge) ; Get-KdsRootKey ; vérifier PrincipalsAllowedToRetrieveManagedPassword
LAPS : pas de mot de passe dans ADGPO non appliquée, permission self absente, DFL insuffisant pour le chiffrementJournal Microsoft-Windows-LAPS/Operational ; Invoke-LapsPolicyProcessing ; Find-LapsADExtendedRights
Après reset krbtgt : erreurs Kerberos sur un site distantDC qui n'a pas reçu le nouveau mot de passerepadmin /showobjmeta sur krbtgt, repadmin /syncall /AdeP ; ne jamais enchaîner le second reset avant convergence
Silo en application : un admin Tier 0 refusé depuis son PAWPAW non membre du silo, ou blindage Kerberos non supporté côté clientJournal AuthenticationPolicyFailures-DomainController ; vérifier Get-ADComputer PAW -Properties AuthenticationPolicySilo et la GPO claims/armoring
Restriction NTLM : application cassée sans message clairFlux absent de l'inventaire d'auditÉvénements 4004 / 8004 (journal NTLM) ; ajouter une exception serveur temporaire, corriger le SPN / la configuration
# Boite a outils Kerberos cote client
klist                      # tickets de l'utilisateur courant
klist tgt                  # detail du TGT (type de chiffrement, duree)
klist -li 0x3e7 purge      # purger les tickets du compte machine (SYSTEM)
nltest /dsgetdc:contoso.local /kdc /force
setspn -Q HTTP/app01.contoso.local   # qui porte ce SPN ?

16. Checklist priorisée

16.1 Quick wins (semaines 1 à 4)

  • [ ] Rapport PingCastle initial archivé (score de référence).
  • [ ] Groupes Enterprise Admins / Schema Admins vides ; Domain Admins réduit à quelques comptes nominatifs ; groupes opérateurs vides.
  • [ ] Aucun compte à SPN membre d'un groupe privilégié ; aucun compte sans pré-authentification Kerberos.
  • [ ] ms-DS-MachineAccountQuota = 0.
  • [ ] Spouleur d'impression désactivé sur les DC.
  • [ ] Aucune délégation non contrainte hors DC.
  • [ ] Droits de réplication (DCSync) limités aux principaux légitimes.
  • [ ] NTLMv1 et LM refusés (LmCompatibilityLevel = 5), SMBv1 supprimé.
  • [ ] LLMNR, NetBIOS et WPAD désactivés.
  • [ ] Windows LAPS déployé sur postes et serveurs, chiffrement activé, DSRM sauvegardé.
  • [ ] Comptes Tier 0 : AccountNotDelegated + Protected Users (après tests).
  • [ ] Politique d'audit avancée + taille des journaux des DC ; alerte sur 4728/4732/4756 pour les groupes privilégiés.
  • [ ] Corbeille AD activée ; sauvegarde état système quotidienne de deux DC, copie hors domaine.
  • [ ] Date de dernier changement du krbtgt vérifiée ; rotation double planifiée.

16.2 Chantiers (trimestre 1 à 4)

  • [ ] Modèle en tiers : OU, groupes, GPO de refus d'ouverture de session déployées progressivement (Tier 2 puis Tier 1).
  • [ ] PAW pour les administrateurs Tier 0, puis Tier 1 ; Remote Credential Guard.
  • [ ] Authentication Policies / Silos Tier 0 : audit puis application.
  • [ ] Migration des comptes de service vers gMSA (ou dMSA sur DC 2025) ; AES only ; élimination de RC4 mesurée par les 4769.
  • [ ] Inventaire NTLM complet, corrections SPN / FQDN, puis restriction avec exceptions documentées.
  • [ ] SMB signing exigé partout, LDAP signing + channel binding appliqués sur les DC.
  • [ ] Revue des ACL (BloodHound) : suppression des chemins vers Tier 0, nettoyage des adminCount orphelins, référence AdminSDHolder.
  • [ ] Audit ADCS (ESC), mappage fort des certificats appliqué, services web d'inscription protégés ou retirés.
  • [ ] Baselines Microsoft importées avec GPO de deltas ; administrateurs locaux pilotés centralement ; S-1-5-114 refusé en réseau.
  • [ ] Collecte centralisée (WEF + SIEM), Sysmon, règles de détection (DCSync, kerberoasting, compte leurre) ; Defender for Identity si disponible.
  • [ ] Hyperviseurs, sauvegarde et outils de déploiement qui touchent les DC traités en Tier 0.
  • [ ] Plan de reprise de forêt écrit et exercé au moins une fois par an.

16.3 Contrôle récurrent

FréquenceContrôle
QuotidienAlertes : ajout à un groupe privilégié, DCSync hors DC, compte leurre, effacement de journal
HebdomadaireSanté de réplication (repadmin /replsummary), sauvegardes des DC réussies et restaurables
MensuelPingCastle et comparaison du score, couverture LAPS, nouveaux SPN / délégations
SemestrielRotation double du krbtgt, revue des membres Tier 0, revue AdminSDHolder
AnnuelExercice de reprise de forêt, revue BloodHound complète, audit externe
Voir aussi : Windows Server - AD, DHCP, DNS, Entra ID (identités hybrides, synchronisation, accès conditionnel), Intune (durcissement des postes gérés), PKI et certificats, Pare-feu (segmentation entre tiers).