Stratégies de sécurité (mot de passe, audit, droits)¶
Ce que couvre ce chapitre
- Le mécanisme d'application des paramètres de sécurité :
scecli.dll, le fichierGptTmpl.infet pourquoi ils sont fondamentalement différents deregistry.pol - La politique de mot de passe de domaine : pourquoi elle ne peut s'appliquer que depuis une GPO liée à la racine du domaine
- Les Fine-Grained Password Policies (PSOs) : comment définir des règles distinctes par groupe et comment la priorité est résolue
- Le verrouillage de compte : paramètres, Event IDs de diagnostic et localisation de la source des échecs
- L'audit avancé Windows : 53 sous-catégories vs 9 catégories classiques, et lesquelles activer en priorité
- Les droits utilisateur (User Rights) : les 9 privilèges les plus dangereux et leur valeur par défaut
- Les options de sécurité critiques : NTLMv2, signature SMB, signature LDAP, UAC
Si vous ne retenez qu'une chose
Les paramètres de sécurité ne passent pas par registry.pol. Ils sont stockés dans GptTmpl.inf (format INI dans SYSVOL) et appliqués par scecli.dll. La politique de mot de passe de domaine ne peut être définie que dans une GPO liée à la racine du domaine — les GPO liées à des OUs enfants sont ignorées pour les comptes de domaine. Les Fine-Grained Password Policies (PSOs) sont le seul mécanisme légal pour dépasser cette contrainte.
Le mécanisme d'application : scecli.dll et GptTmpl.inf¶
Un fichier différent de registry.pol¶
Quand on pense à l'application des GPO, on pense naturellement à registry.pol. Mais les paramètres de sécurité ignorent ce fichier.
La CSE Security utilise son propre format : un fichier texte INI nommé GptTmpl.inf. Ce fichier contient l'ensemble des paramètres de sécurité configurés dans la GPO, organisés en sections.
Son chemin dans SYSVOL suit le schéma suivant :
Pourquoi un format INI ?
GptTmpl.inf est un héritage de l'outil secedit.exe, présent depuis Windows 2000. L'outil secedit utilise encore aujourd'hui ce même format pour importer et exporter des configurations de sécurité. La continuité architecturale a été préservée.
Anatomie d'un GptTmpl.inf¶
Un fichier GptTmpl.inf complet ressemble à ceci :
[Unicode]
Unicode=yes
[System Access]
MinimumPasswordLength = 12
PasswordComplexity = 1
MaximumPasswordAge = 365
MinimumPasswordAge = 1
PasswordHistorySize = 10
ClearTextPassword = 0
LockoutBadCount = 5
LockoutDuration = 30
ResetLockoutCount = 30
[Audit Policy]
AuditLogonEvents = 3
AuditAccountManage = 3
AuditObjectAccess = 1
AuditPolicyChange = 1
[Privilege Rights]
SeDebugPrivilege = *S-1-5-32-544
SeTcbPrivilege =
SeBackupPrivilege = *S-1-5-32-544,*S-1-5-32-551
[Registry Values]
MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\LmCompatibilityLevel=4,5
MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\RequireSecuritySignature=4,1
[Version]
signature="$CHICAGO$"
Revision=1
Chaque section correspond à une catégorie distincte de paramètres de sécurité. Les valeurs numériques dans [Audit Policy] suivent un encodage binaire (bit 0 = succès, bit 1 = échec, donc 3 = succès + échec).
Encodage de [Audit Policy] vs auditpol
La section [Audit Policy] configure les 9 catégories classiques (héritées de Windows 2000). Elle ne contrôle pas les 53 sous-catégories avancées introduites avec Vista. Pour les sous-catégories avancées, il faut utiliser Advanced Audit Policy Configuration dans la GPMC — les données sont stockées dans un fichier CSV séparé : Audit.csv.
La CSE Security : GUID et DLL¶
La CSE responsable des paramètres de sécurité est identifiée par :
| Attribut | Valeur |
|---|---|
| GUID | {827D319E-6EAC-11D2-A4EA-00C04F79F83A} |
| DLL | scecli.dll |
| Clé registre | HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\GPExtensions\{827D319E-...} |
Sa clé de registre expose des comportements importants qu'il faut connaître :
NoBackgroundPolicy = 0 (peut s'exécuter en arrière-plan)
NoGPOListChanges = 1 (optimisation activée par défaut)
MaxNoGPOListChangesInterval = 960 (minutes = 16 heures)
La réapplication automatique toutes les 16 heures¶
La valeur MaxNoGPOListChangesInterval = 960 est un comportement fondamental à comprendre.
Même si la liste des GPO applicables n'a pas changé depuis le dernier traitement, scecli.dll force une réapplication complète des paramètres de sécurité toutes les 16 heures. C'est un mécanisme de drift remediation : si un administrateur local modifie manuellement un paramètre de sécurité, la GPO le rétablit dans les 16 heures au plus tard.
Foreground vs Background
Par défaut, scecli.dll peut s'exécuter en arrière-plan (le flag NoBackgroundPolicy est absent ou à 0). Cependant, certains paramètres — notamment la politique de compte ([System Access]) — ne sont effectivement appliqués qu'au traitement foreground (démarrage machine). Les paramètres d'audit et de droits utilisateur sont appliqués à chaque refresh.
La base de données de sécurité locale¶
scecli.dll ne lit pas GptTmpl.inf et n'applique pas directement. Elle fusionne d'abord toutes les GPO applicables dans une base de données de sécurité locale :
C'est cette base qui est la source de vérité pour l'état courant des paramètres. L'outil secedit.exe permet de l'interroger directement.
# Export the current security configuration from the local database
secedit /export /cfg C:\Temp\security-current.inf /quiet
En résumé
Les paramètres de sécurité GPO n'utilisent pas registry.pol. Ils transitent par GptTmpl.inf (format INI dans SYSVOL) et sont traités par scecli.dll (GUID {827D319E-6EAC-11D2-A4EA-00C04F79F83A}). La CSE fusionne toutes les GPO dans secedit.sdb puis applique les paramètres au système. Elle force une réapplication toutes les 16 heures, même sans changement de GPO.
Politique de mot de passe de domaine¶
La règle de la racine du domaine¶
C'est l'une des règles les plus mal comprises de Group Policy. La politique de mot de passe s'applique aux comptes de domaine. Pour ces comptes, Windows lit la politique de mot de passe uniquement dans les GPO liées à la racine du domaine.
Une GPO liée à OU=Utilisateurs,DC=contoso,DC=com peut très bien contenir des paramètres de mot de passe — ils seront ignorés pour les comptes de domaine. En revanche, ils s'appliqueront aux comptes locaux des machines dans cette OU.
Confusion fréquente
Si vous configurez une politique de mot de passe dans une GPO liée à une OU, elle s'appliquera aux comptes locaux des machines concernées — mais jamais aux comptes Active Directory. Pour différencier les règles par groupe d'utilisateurs, vous devez utiliser les Fine-Grained Password Policies.
Paramètres de la politique de mot de passe¶
| Paramètre GPMC | Clé GptTmpl.inf | Valeur recommandée (ANSSI 2023) |
|---|---|---|
| Minimum password length | MinimumPasswordLength | 12 caractères minimum |
| Password must meet complexity requirements | PasswordComplexity | 1 (activé) |
| Maximum password age | MaximumPasswordAge | 365 jours |
| Minimum password age | MinimumPasswordAge | 1 jour |
| Enforce password history | PasswordHistorySize | 10 mots de passe |
| Store passwords using reversible encryption | ClearTextPassword | 0 (désactivé) |
Le chemin GPMC complet : Computer Configuration → Policies → Windows Settings → Security Settings → Account Policies → Password Policy
Âge maximal 365 jours — évolution ANSSI
L'ANSSI a révisé sa recommandation en 2023 : un mot de passe long et complexe n'a plus besoin d'être changé tous les 90 jours. L'âge maximal de 365 jours, combiné à un historique de 10 entrées et une longueur minimale de 12 caractères, est désormais la référence. La rotation systématique tous les 90 jours tend à encourager les utilisateurs à choisir des mots de passe prévisibles.
Lire la politique en vigueur¶
# Read the effective domain password policy
Get-ADDefaultDomainPasswordPolicy | Select-Object `
MinPasswordLength,
PasswordHistoryCount,
MaxPasswordAge,
MinPasswordAge,
ComplexityEnabled,
LockoutThreshold,
LockoutDuration,
LockoutObservationWindow |
Format-List
MinPasswordLength : 12
PasswordHistoryCount : 10
MaxPasswordAge : 365.00:00:00
MinPasswordAge : 1.00:00:00
ComplexityEnabled : True
LockoutThreshold : 5
LockoutDuration : 00:30:00
LockoutObservationWindow : 00:30:00
En résumé
La politique de mot de passe de domaine ne peut être définie qu'une seule fois, dans une GPO liée à la racine du domaine. Par convention, c'est la Default Domain Policy qui porte ces paramètres. Toute GPO liée à une OU enfant est ignorée pour les comptes AD. Pour des politiques différenciées par population, utilisez les PSOs.
Fine-Grained Password Policy (FGPP)¶
Pourquoi les PSOs existent¶
La limitation du "une seule politique pour tout le domaine" est souvent inacceptable en entreprise. Les comptes de service, les administrateurs et les utilisateurs standards ont des besoins différents.
Les Password Settings Objects (PSOs) résolvent ce problème. Ce sont des objets AD de classe msDS-PasswordSettings, stockés dans :
Ils peuvent être appliqués à des groupes de sécurité ou à des utilisateurs individuels (déconseillé pour la maintenabilité).
La résolution de priorité¶
Quand plusieurs PSOs s'appliquent à un utilisateur (via différents groupes), Windows utilise l'attribut msDS-PasswordSettingsPrecedence. La valeur la plus basse l'emporte.
La politique de domaine (GPO) a une priorité inférieure à tout PSO. Un utilisateur membre d'un groupe avec un PSO ne sera jamais soumis à la politique de domaine pour les paramètres couverts par le PSO.
PSO et utilisateurs individuels
Si un PSO est appliqué directement à un utilisateur et via un groupe, le PSO direct l'emporte toujours, quelle que soit sa valeur Precedence. L'assignation directe est une "wild card" qui surpasse toute assignation par groupe.
Créer et assigner un PSO¶
# Create a Fine-Grained Password Policy for admin accounts
New-ADFineGrainedPasswordPolicy `
-Name "PSO-Admins" `
-Precedence 10 `
-MinPasswordLength 16 `
-PasswordHistoryCount 20 `
-MaxPasswordAge "90.00:00:00" `
-MinPasswordAge "1.00:00:00" `
-ComplexityEnabled $true `
-ReversibleEncryptionEnabled $false `
-LockoutThreshold 3 `
-LockoutDuration "00:30:00" `
-LockoutObservationWindow "00:30:00"
# Apply the PSO to a security group
Add-ADFineGrainedPasswordPolicySubject `
-Identity "PSO-Admins" `
-Subjects "GRP-Admins-IT"
# Get the resultant PSO for a specific user account
Get-ADUserResultantPasswordPolicy -Identity "j.martin" | Select-Object `
Name, Precedence, MinPasswordLength, MaxPasswordAge, LockoutThreshold
Name : PSO-Admins
Precedence : 10
MinPasswordLength : 16
MaxPasswordAge : 90.00:00:00
LockoutThreshold : 3
Exemple d'architecture PSO¶
| PSO | Priorité | Cibles | Longueur min | Âge max | Seuil verrou |
|---|---|---|---|---|---|
PSO-Admins | 10 | GRP-Admins-IT | 16 | 90 j | 3 |
PSO-Services | 20 | GRP-Comptes-Service | 20 | 0 (jamais) | 0 (jamais) |
PSO-Utilisateurs | 30 | Domain Users | 12 | 365 j | 5 |
Comptes de service et PSO
Pour les comptes de service, il est courant de configurer MaxPasswordAge = 0 (jamais expire) et LockoutThreshold = 0 (jamais verrouillé). Attention : ces comptes doivent être protégés par d'autres moyens (mots de passe très longs, 30+ caractères, aléatoires — ou mieux, utiliser les gMSA qui gèrent eux-mêmes la rotation).
En résumé
Les PSOs permettent des politiques de mot de passe différenciées par groupe, sans dépendre des OU. La priorité est déterminée par msDS-PasswordSettingsPrecedence : valeur plus basse = priorité plus haute. Tout PSO prend le dessus sur la politique de domaine.
Verrouillage de compte¶
Les trois paramètres à configurer ensemble¶
Le verrouillage de compte repose sur trois paramètres interdépendants. Les définir indépendamment ou partiellement génère des comportements inattendus.
| Paramètre | Valeur recommandée | Comportement si à 0 |
|---|---|---|
Seuil de verrouillage (LockoutBadCount) | 5 à 10 tentatives | 0 = verrouillage désactivé |
Durée de verrouillage (LockoutDuration) | 30 min | 0 = déverrouillage manuel uniquement |
Réinitialisation du compteur (ResetLockoutCount) | 30 min | — |
LockoutDuration = 0 signifie que seul un administrateur peut déverrouiller le compte. C'est une option valide pour les environnements haute sécurité, mais elle augmente la charge de support.
ResetLockoutCount doit être ≤ LockoutDuration
Si ResetLockoutCount (délai de remise à zéro du compteur) est supérieur à LockoutDuration (durée du verrou), un compte peut se déverrouiller alors que le compteur n'est pas encore remis à zéro. La tentative suivante peut immédiatement reverrouiller le compte. Configurez toujours ResetLockoutCount ≤ LockoutDuration.
Event IDs de diagnostic du verrouillage¶
Ces Event IDs sont enregistrés sur les contrôleurs de domaine, dans le journal Security.
| Event ID | Localisation | Description |
|---|---|---|
| 4625 | DC (tous) | Échec d'ouverture de session — contient le type de logon et le poste source |
| 4740 | DC (tous) | Compte verrouillé — contient le nom du compte et le poste à l'origine |
| 4771 | DC (tous) | Échec de pré-authentification Kerberos — indique un mauvais mot de passe |
| 4776 | DC (tous) | Validation NTLM échouée — contient le compte et le poste appelant |
| 4767 | DC (tous) | Compte déverrouillé manuellement |
Où chercher l'Event 4740 ?
L'Event 4740 est généré sur tous les DC qui reçoivent les tentatives. Mais le PDC Emulator consolide tous les verrouillages. Pour un diagnostic fiable, interrogez toujours le PDC Emulator en premier.
Trouver la source d'un verrouillage¶
# Query the PDC Emulator for account lockout events
$pdc = (Get-ADDomain).PDCEmulator
Get-WinEvent -ComputerName $pdc `
-FilterHashtable @{LogName = 'Security'; Id = 4740} `
-MaxEvents 20 |
Select-Object TimeCreated,
@{N = "LockedAccount"; E = { $_.Properties[0].Value }},
@{N = "CallerComputer"; E = { $_.Properties[1].Value }},
@{N = "CallerDomain"; E = { $_.Properties[5].Value }} |
Format-Table -AutoSize
TimeCreated LockedAccount CallerComputer CallerDomain
----------- ------------- -------------- ------------
2026-04-04 08:12:44 j.martin LAPTOP-HR-042 CONTOSO
2026-04-04 08:11:53 j.martin LAPTOP-HR-042 CONTOSO
# Check lockout status across all domain controllers
Get-ADDomainController -Filter * | ForEach-Object {
$dc = $_.HostName
$user = Get-ADUser "j.martin" -Server $dc `
-Properties LockedOut, BadLogonCount, LastBadPasswordAttempt, BadPwdCount
[PSCustomObject]@{
DC = $dc
LockedOut = $user.LockedOut
BadLogonCount = $user.BadLogonCount
LastBadPasswordAttempt = $user.LastBadPasswordAttempt
}
} | Format-Table -AutoSize
En résumé
Les trois paramètres de verrouillage forment un ensemble indissociable. Le diagnostic passe par les Events 4740 (verrouillage) et 4625/4771/4776 (échecs d'authentification), à interroger en priorité sur le PDC Emulator. La propriété CallerComputer identifie le poste à l'origine des tentatives.
Stratégie d'audit¶
Deux systèmes coexistent¶
Windows dispose de deux systèmes d'audit qui coexistent et peuvent se contredire :
- Audit Policy classique — 9 catégories, héritées de Windows 2000, configurées dans
Security Settings → Local Policies → Audit Policy - Advanced Audit Policy Configuration — 53 sous-catégories, introductes avec Vista, configurées dans
Security Settings → Advanced Audit Policy Configuration
Les sous-catégories avancées sont plus précises et doivent être préférées. Elles permettent par exemple d'auditer les ouvertures de session réussies sans auditer les fermetures de session, ou d'auditer uniquement la création de processus sans tout l'accès aux objets.
Conflit entre les deux systèmes
Si vous configurez à la fois les 9 catégories classiques et les sous-catégories avancées, un paramètre de registre détermine lequel prime : HKLM\SYSTEM\CurrentControlSet\Control\Lsa\SCENoApplyLegacyAuditPolicy. Quand il vaut 1 (valeur par défaut depuis Vista), les sous-catégories avancées l'emportent sur les catégories classiques. Ne configurez pas les deux en parallèle.
Sous-catégories avancées recommandées¶
| Sous-catégorie | Recommandation | Events principaux |
|---|---|---|
| Logon | Succès + Échec | 4624 (logon réussi), 4625 (logon échoué) |
| Logoff | Succès | 4634 (déconnexion) |
| Account Lockout | Échec | 4740 (compte verrouillé) |
| Special Logon | Succès | 4964 (logon avec privilèges sensibles) |
| User Account Management | Succès + Échec | 4720 (création), 4726 (suppression), 4738 (modification) |
| Security Group Management | Succès + Échec | 4728/4732/4756 (ajout membre), 4729/4733/4757 (retrait) |
| Computer Account Management | Succès + Échec | 4741 (création poste), 4743 (suppression poste) |
| Sensitive Privilege Use | Échec | 4673/4674 (utilisation de privilège) |
| Process Creation | Succès | 4688 (nouveau processus — indispensable pour EDR/SIEM) |
| Directory Service Changes | Succès | 5136 (objet AD modifié), 5137 (créé), 5139 (déplacé) |
| Audit Policy Change | Succès + Échec | 4719 (politique d'audit modifiée) |
| Authentication Policy Change | Succès | 4706 (nouvelle approbation de domaine) |
| Filtering Platform Connection | Échec | 5157 (connexion bloquée par WFP) |
| Object Access — File System | Optionnel | 4663 (accès fichier — volumeux, à cibler) |
Process Creation et la ligne de commande
L'audit de Process Creation (Event 4688) peut être complété par l'activation de la ligne de commande dans les arguments : Computer Configuration → Administrative Templates → System → Audit Process Creation → Include command line in process creation events. Indispensable pour les investigations de malware et les outils SIEM/EDR.
Les 9 catégories classiques vs sous-catégories avancées¶
| Catégorie classique | Sous-catégories avancées équivalentes |
|---|---|
| Account Logon | Credential Validation, Kerberos Authentication Service, Kerberos Service Ticket Operations |
| Account Management | User/Computer/Security Group/Distribution Group/Application Group Account Management |
| Directory Service Access | Directory Service Access, Directory Service Changes, Directory Service Replication |
| Logon Events | Logon, Logoff, Account Lockout, IPsec Main/Quick/Extended Mode, Special Logon |
| Object Access | File System, Registry, Kernel Object, SAM, Handle Manipulation, File Share, Filtering Platform Packet Drop/Connection |
| Policy Change | Audit Policy Change, Authentication Policy Change, Authorization Policy Change |
| Privilege Use | Sensitive/Non-Sensitive Privilege Use |
| Process Tracking | Process Creation, Process Termination, DPAPI Activity, RPC Events |
| System Events | Security State Change, Security System Extension, System Integrity, IPsec Driver, Other System Events |
Vérifier et configurer l'audit¶
# Display the current effective audit policy for all subcategories
auditpol /get /category:* | Where-Object { $_ -match "Success|Failure|No Auditing" }
Account Logon
Credential Validation Success and Failure
Kerberos Authentication Service No Auditing
Kerberos Service Ticket Operations No Auditing
Logon/Logoff
Logon Success and Failure
Logoff Success
Account Lockout Failure
# Enable Logon auditing (success and failure)
auditpol /set /subcategory:"Logon" /success:enable /failure:enable
# Enable Process Creation (success only — for SIEM/EDR)
auditpol /set /subcategory:"Process Creation" /success:enable
# Enable Directory Service Changes (success only)
auditpol /set /subcategory:"Directory Service Changes" /success:enable
GPO vs auditpol direct
auditpol /set modifie la politique locale directement. Si une GPO est en vigueur, elle sera réappliquée au prochain refresh (ou dans les 16 heures) et écrasera les modifications manuelles. Pour un changement permanent, configurez les sous-catégories avancées dans la GPO.
En résumé
Préférez systématiquement les 53 sous-catégories avancées aux 9 catégories classiques. Activez en priorité : Logon (succès+échec), Process Creation (succès), Account Management (succès+échec) et Directory Service Changes (succès). Ces quatre sous-catégories fournissent l'essentiel de la visibilité nécessaire pour un SOC.
Droits utilisateur (User Rights Assignment)¶
Qu'est-ce qu'un droit utilisateur ?¶
Les droits utilisateur (ou privilèges) sont distincts des permissions sur les objets (fichiers, clés de registre). Ce sont des droits système accordés à des comptes ou groupes, indépendamment de tout objet.
Windows définit 44 privilèges. Ils sont configurés dans la section [Privilege Rights] de GptTmpl.inf et appliqués via le sous-système LSA.
Le chemin GPMC : Computer Configuration → Policies → Windows Settings → Security Settings → Local Policies → User Rights Assignment
Droits critiques à contrôler¶
| Privilege (constante) | Valeur par défaut | Risque si mal configuré |
|---|---|---|
SeDebugPrivilege | Administrators | Injection de code dans n'importe quel processus — vecteur de dump mémoire (LSASS) |
SeTcbPrivilege | LocalSystem | Act as part of the OS — donne contrôle total ; ne pas assigner à des comptes humains |
SeBackupPrivilege | Administrators, Backup Operators | Lit n'importe quel fichier quel que soit la DACL — y compris NTDS.dit |
SeImpersonatePrivilege | Service, IIS, Network Service | Vecteur d'escalade (Potato attacks) — à restreindre aux comptes de service légitimes |
SeLoadDriverPrivilege | Administrators | Charge des pilotes en mode noyau — vecteur rootkit |
SeAssignPrimaryTokenPrivilege | LocalService, NetworkService | Remplacement du token primaire d'un processus — vecteur d'escalade |
SeNetworkLogonRight | Everyone, Authenticated Users | Connexion réseau — restreindre pour les admins locaux (Pass-the-Hash mitigation) |
SeDenyNetworkLogonRight | Guest | Refus explicite de connexion réseau — ajouter les admins locaux |
SeInteractiveLogonRight | Administrators, Users, Backup Operators | Connexion locale interactive — restreindre sur les serveurs |
SeDenyInteractiveLogonRight | Guest | Refus de connexion locale — étendre aux comptes de service |
SeRemoteInteractiveLogonRight | Administrators, Remote Desktop Users | Connexion RDP — contrôler précisément |
SeShutdownPrivilege | Administrators, Users (postes) | Arrêt du système — supprimer Users sur les serveurs |
SeDebugPrivilege et les administrateurs locaux
Même SeDebugPrivilege accordé uniquement au groupe Administrators peut être dangereux : tout administrateur local peut l'utiliser pour dumper la mémoire de LSASS et extraire des credentials. Sur les serveurs sensibles (DC, PKI), envisagez de le retirer complètement — les outils légitimes de débogage peuvent fonctionner avec SeLocalDebugPrivilege ou des mécanismes alternatifs.
Interroger les droits utilisateur¶
# Display all privileges for the current user session
whoami /priv | Format-Table -AutoSize
# Get user rights assignment from a GPO report
$gpoName = "SEC-Postes-Baseline"
$report = Get-GPOReport -Name $gpoName -ReportType Xml
$xml = [xml]$report
# Extract User Rights Assignment section
$xml.GPO.Computer.ExtensionData.Extension.UserRightsAssignment |
ForEach-Object {
[PSCustomObject]@{
Privilege = $_.Name
Members = ($_.Member.Name | Where-Object { $_ }) -join ", "
}
} |
Format-Table -AutoSize
Privilege Members
--------- -------
SeDebugPrivilege BUILTIN\Administrators
SeNetworkLogonRight NT AUTHORITY\Authenticated Users, BUILTIN\Administrators
SeDenyNetworkLogonRight CONTOSO\GRP-AdminsLocaux
SeInteractiveLogonRight BUILTIN\Administrators
SeRemoteInteractiveLogonRight BUILTIN\Administrators, BUILTIN\Remote Desktop Users
# Check who has a specific privilege on a remote machine
$computer = "SRV-APP-01"
$session = New-PSSession -ComputerName $computer
Invoke-Command -Session $session -ScriptBlock {
# Use secedit to export and read privilege assignments
$tempFile = "$env:TEMP\privs.inf"
secedit /export /cfg $tempFile /quiet
$content = Get-Content $tempFile | Where-Object { $_ -match "SeDebugPrivilege" }
$content
Remove-Item $tempFile -Force
}
Remove-PSSession $session
Recommandations de durcissement des droits¶
Ces recommandations s'alignent avec les baselines Microsoft Security (STIG/CIS) :
| Action | Droit concerné | Justification |
|---|---|---|
Retirer Everyone | SeNetworkLogonRight | Ajouter uniquement les groupes nécessaires |
| Ajouter admins locaux | SeDenyNetworkLogonRight | Mitigation Pass-the-Hash (KB2871997) |
| Vider la valeur | SeTcbPrivilege | Aucun compte humain ne doit Act as OS |
| Restreindre aux DCs | SeEnableDelegationPrivilege | Permet de configurer la délégation Kerberos |
| Supprimer sur serveurs | SeShutdownPrivilege pour Users | Les utilisateurs ne doivent pas arrêter un serveur |
En résumé
Les droits utilisateur sont des privilèges système indépendants des ACL. Les plus dangereux sont SeDebugPrivilege (dump mémoire), SeImpersonatePrivilege (Potato attacks), SeBackupPrivilege (lecture NTDS.dit) et SeLoadDriverPrivilege (rootkit). Auditez-les régulièrement via whoami /priv ou les rapports GPO.
Options de sécurité critiques¶
Présentation¶
Les Security Options sont des paramètres de sécurité système qui ne rentrent dans aucune autre catégorie. Ils contrôlent des comportements du noyau, du protocole d'authentification, des communications réseau et de l'interface UAC.
Leur chemin GPMC : Computer Configuration → Policies → Windows Settings → Security Settings → Local Policies → Security Options
Dans GptTmpl.inf, ils apparaissent dans la section [Registry Values].
Options critiques et leurs clés de registre¶
| Paramètre GPMC | Valeur recommandée | Clé de registre |
|---|---|---|
| UAC : Behavior for elevation — Admin | Prompt for credentials | HKLM\...\Policies\System\ConsentPromptBehaviorAdmin = 1 |
| UAC : Behavior for elevation — User | Automatically deny elevation | HKLM\...\Policies\System\ConsentPromptBehaviorUser = 0 |
| UAC : Run all admins in Admin Approval Mode | Activé | HKLM\...\Policies\System\EnableLUA = 1 |
| LAN Manager authentication level | Send NTLMv2 only / refuse LM & NTLM | HKLM\SYSTEM\...\Lsa\LmCompatibilityLevel = 5 |
| SMB signing client — Always sign | Activé | HKLM\SYSTEM\...\LanmanWorkstation\Parameters\RequireSecuritySignature = 1 |
| SMB signing server — Always sign | Activé | HKLM\SYSTEM\...\LanmanServer\Parameters\RequireSecuritySignature = 1 |
| LDAP client signing | Require signing | HKLM\SYSTEM\...\Services\NTDS\Parameters\LDAPServerIntegrity = 2 |
| LDAP server channel binding | Always | HKLM\SYSTEM\...\Services\NTDS\Parameters\LdapEnforceChannelBinding = 2 |
| Do not store LAN Manager hash | Activé | HKLM\SYSTEM\...\Control\Lsa\NoLMHash = 1 |
| Anonymous SID/Name translation | Désactivé | HKLM\SYSTEM\...\Control\Lsa\TurnOffAnonymousBlock = 0 |
LmCompatibilityLevel et la compatibilité
Passer LmCompatibilityLevel à 5 (NTLMv2 uniquement, refus LM et NTLM) peut casser des applications legacy qui ne supportent pas NTLMv2. Avant déploiement, identifiez les applications qui utilisent encore NTLM via les Events 4776 (NTLM validation) sur les DCs. Un niveau 3 (NTLMv2, refus LM) est un compromis acceptable pendant la migration.
NTLMv2 et la dégradation d'authentification¶
NTLMv1 et LM (LAN Manager) sont des protocoles cryptographiquement faibles, vulnérables aux attaques par dictionnaire et aux relais NTLM.
LmCompatibilityLevel contrôle quel protocole le client envoie et ce que le serveur accepte :
| Niveau | Client envoie | Serveur accepte |
|---|---|---|
| 0 | LM + NTLM | LM + NTLM + NTLMv2 |
| 1 | LM + NTLM, NTLMv2 si négocié | LM + NTLM + NTLMv2 |
| 2 | NTLMv2 | LM + NTLM + NTLMv2 |
| 3 | NTLMv2 | NTLMv2 seulement |
| 4 | NTLMv2 | NTLMv2 seulement (idem 3 côté serveur membre) |
| 5 | NTLMv2 | NTLMv2 seulement — refuse LM et NTLM |
Vérifier les options de sécurité en vigueur¶
# Read critical security option registry values
$keys = @{
"LmCompatibilityLevel" = "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa"
"EnableLUA" = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"
"ConsentPromptBehaviorAdmin" = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"
"NoLMHash" = "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa"
}
$keys.GetEnumerator() | ForEach-Object {
$value = (Get-ItemProperty -Path $_.Value -Name $_.Key -ErrorAction SilentlyContinue).$($_.Key)
[PSCustomObject]@{
Setting = $_.Key
Value = $value
Path = $_.Value
}
} | Format-Table -AutoSize
Setting Value Path
------- ----- ----
LmCompatibilityLevel 5 HKLM:\SYSTEM\CurrentControlSet\Control\Lsa
EnableLUA 1 HKLM:\SOFTWARE\Microsoft\Windows\...\System
ConsentPromptBehaviorAdmin 1 HKLM:\SOFTWARE\Microsoft\Windows\...\System
NoLMHash 1 HKLM:\SYSTEM\CurrentControlSet\Control\Lsa
En résumé
Les options de sécurité critiques à configurer en priorité sont : NTLMv2 seul (LmCompatibilityLevel = 5), signature SMB obligatoire côté client et serveur, signature LDAP obligatoire, UAC en mode "prompt for credentials" et suppression du stockage des hashs LM. Ces paramètres forment le socle de durcissement réseau de toute infrastructure Windows.
Windows LAPS via CSE Security¶
Windows LAPS remplace l'ancien Microsoft LAPS legacy pour la gestion du mot de passe administrateur local. Il peut sauvegarder le secret dans Active Directory ou dans Entra ID selon le design.
Point important : Windows LAPS n'est pas une simple option [System Access] traitée par scecli.dll. Les stratégies sont exposées par ADMX et traitées par le composant Windows LAPS côté client. Dans le diagnostic GPO, il faut donc lire à la fois la GPO appliquée, le registre de stratégie et les journaux Windows LAPS.
Chemin GPO principal :
Computer Configuration → Administrative Templates → System → LAPS
Chemin registre de stratégie :
| Paramètre | Intention |
|---|---|
BackupDirectory | Choisir AD ou Entra ID comme stockage du mot de passe |
PasswordAgeDays | Définir l'âge maximal du mot de passe local |
PasswordLength | Imposer une longueur suffisante |
PasswordComplexity | Définir le jeu de caractères |
PostAuthenticationActions | Déclencher une rotation après usage du compte |
ADPasswordEncryptionEnabled | Chiffrer le secret stocké dans AD quand le schéma le permet |
Legacy LAPS vs Windows LAPS
Ne mélangez pas les deux modèles sans plan. L'ancien client Microsoft LAPS, les anciens attributs ms-Mcs-* et Windows LAPS n'ont pas exactement les mêmes attributs, journaux et paramètres.
Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\LAPS" `
-ErrorAction SilentlyContinue |
Select-Object BackupDirectory, PasswordAgeDays, PasswordLength, PasswordComplexity,
ADPasswordEncryptionEnabled, PostAuthenticationActions
En résumé
Windows LAPS doit être traité comme un contrôle de sécurité de base. Vérifiez la GPO, le registre Policies\LAPS, les journaux LAPS et les droits AD avant de considérer le déploiement comme conforme.
Voir aussi
- LAPS et comptes locaux — Hardening : deploiement complet, recuperation du mot de passe et audit
Flux d'application des stratégies de sécurité¶
Le diagramme suivant illustre le flux complet de traitement, de la détection des GPO jusqu'à l'application effective des paramètres sur le système.
sequenceDiagram
participant GP as gpsvc
participant SC as scecli.dll (CSE Security)
participant SV as SYSVOL
participant DB as secedit.sdb (DB locale)
participant SY as Système (SAM / LSA / auditpol)
GP ->> SC : Déclencher traitement sécurité (foreground ou refresh 16h)
SC ->> SV : Lire GptTmpl.inf de chaque GPO applicable
SV -->> SC : [System Access], [Audit Policy], [Privilege Rights], [Registry Values]
SC ->> DB : Fusionner dans secedit.sdb (résolution de conflits par priorité GPO)
SC ->> SY : Appliquer [System Access] → SAM (politique de compte)
SC ->> SY : Appliquer [Privilege Rights] → LSA (droits utilisateur)
SC ->> SY : Appliquer [Audit Policy] → auditpol (catégories classiques)
SC ->> SY : Appliquer [Registry Values] → registre système
SC ->> GP : Rapport succès (Event 4016 / 5016)
Note over SC,SY : Réapplication forcée toutes les 16h<br/>(MaxNoGPOListChangesInterval = 960 min)<br/>même sans changement de GPO Résolution des conflits entre GPO¶
Quand plusieurs GPO contiennent des paramètres de sécurité contradictoires, scecli.dll applique les règles LSDOU standard : la dernière GPO traitée (priorité la plus haute dans l'ordre d'application) l'emporte.
Pour les paramètres [System Access] (politique de mot de passe et de verrouillage), seules les GPO liées à la racine du domaine participent à cette résolution. Les GPO liées aux OUs enfants sont ignorées pour ces paramètres.
Paramètre absent ≠ non configuré
Si une GPO de priorité haute ne contient pas un paramètre, scecli.dll remonte aux GPO de priorité plus basse pour ce paramètre. Un paramètre absent dans GptTmpl.inf n'écrase pas le paramètre existant — contrairement à registry.pol où l'absence peut signifier une suppression de la valeur.
En résumé
- Les paramètres
[System Access](mot de passe, verrouillage) ne sont résolus qu’à partir des GPO liées à la racine du domaine. - Un paramètre absent dans
GptTmpl.infn’écrase pas la valeur existante — contrairement àregistry.pol.
Diagnostic et dépannage¶
Event IDs de la CSE Security¶
| Event ID | Journal | Description |
|---|---|---|
| 4016 | Application (GP Operational) | Début du traitement de la CSE Security |
| 5016 | Application (GP Operational) | Fin réussie du traitement de la CSE Security |
| 6016 | Application (GP Operational) | Fin avec avertissement (paramètre non applicable) |
| 7016 | Application (GP Operational) | Échec du traitement de la CSE Security |
| 4719 | Security | Politique d'audit modifiée (qui a changé quoi ?) |
| 4902 | Security | Table de politique d'audit par utilisateur créée |
# Get Security CSE processing events from the GP Operational log
Get-WinEvent -LogName "Microsoft-Windows-GroupPolicy/Operational" |
Where-Object { $_.Id -in @(4016, 5016, 6016, 7016) } |
Select-Object TimeCreated, Id, Message |
Sort-Object TimeCreated -Descending |
Select-Object -First 20 |
Format-Table -Wrap -AutoSize
Secedit pour le diagnostic¶
secedit.exe est l'outil natif pour interagir directement avec la base de sécurité locale.
# Export the configured security template (from GPO)
secedit /export /cfg C:\Temp\sec-configured.inf /quiet
# Analyze the current system state against the configured template
secedit /analyze /db C:\Temp\sec-analysis.sdb `
/cfg C:\Temp\sec-configured.inf `
/log C:\Temp\sec-analysis.log `
/quiet
# View the analysis results
Get-Content C:\Temp\sec-analysis.log | Select-String "Mismatch|mismatch"
# Force an immediate reapplication of security policy (bypasses 16h timer)
Invoke-GPUpdate -Force -Computer "LAPTOP-HR-042" -Target Computer
# Or locally:
gpupdate /force /target:computer
secedit /configure vs gpupdate
secedit /configure /db secedit.sdb réapplique la base de sécurité locale existante. gpupdate /force déclenche un cycle complet : téléchargement des GPO depuis SYSVOL, recalcul de secedit.sdb, puis application. Utilisez secedit /configure pour un test rapide local, gpupdate /force pour un test complet du pipeline GPO.
En résumé
Les Events 4016/5016 (journal Group Policy/Operational) tracent le cycle de traitement de scecli.dll. L'Event 4719 (journal Security) alerte sur toute modification de politique d'audit. secedit /analyze permet de détecter les dérives entre la politique configurée et l'état actuel du système.
Références croisées¶
| Sujet | Référence |
|---|---|
| Mécanisme des CSE en détail | Ch. 03 — Client-Side Extensions |
| Filtrage des GPO (qui reçoit quoi) | Ch. 09 — Filtrage de sécurité et WMI |
| Baselines CIS / STIG / Microsoft Security | Ch. 22 — Baselines de sécurité |
| AppLocker et WDAC | Ch. 15 — AppLocker et WDAC |
| BitLocker via GPO | Ch. 16 — BitLocker |
| Déploiement pratique sécurité endpoint | Les GPO pour les Admins — Ch. 14 |
| Introduction sécurité niveau débutant | Les GPO pour les Nuls — Ch. 07 |
En résumé
- À relire : Mécanisme des CSE en détail → Ch. 03 — Client-Side Extensions.
- À relire : Filtrage des GPO (qui reçoit quoi) → Ch. 09 — Filtrage de sécurité et WMI.
- À relire : Baselines CIS / STIG / Microsoft Security → Ch. 22 — Baselines de sécurité.
- À relire : AppLocker et WDAC → Ch. 15 — AppLocker et WDAC.
- Ces renvois prolongent le chapitre avec des mécanismes complémentaires ou des cas d’usage voisins.