Partie 7-bis - Annexe technique : configurations & commandes de référence¶
Le stack de sécurité déployé et gouverné dans AD - version copy-paste¶
Windows Server 2022¶
But de ce document : la Partie 7-bis expliquait pourquoi et comment gouverner le tooling. Ici, ce sont les configurations complètes et les commandes exactes, prêtes à adapter (remplace
corp.lab.local,CORP, les IP, les noms). Ordre d'application recommandé en §10.Convention :
[DC]= à exécuter sur un contrôleur de domaine ;[WEC]= sur le collecteur ;[MGMT]= poste d'admin/PAW ;[GPO]= réglage à poser dans une GPO. Tout est idempotent quand c'est possible.
Sommaire¶
- Sysmon - config de base + déploiement GPO
- WEF/WEC - collecteur, souscription, sources
- Detection Baseline - audit, 4688 cmdline, PowerShell logging
- gMSA - cycle de vie complet + affectation
- Délégations
dsacls- SOAR & SOC - JEA - fichiers complets + enregistrement
- Ingestion SIEM - Winlogbeat & Wazuh
- Détections d'auto-défense - règles Sigma + requêtes
- Gouvernance as code - Git, sauvegarde GPO, drift
- Runbook : ordre de déploiement
1. Sysmon - configuration & déploiement¶
1.1 Config de base fonctionnelle (sysmonconfig.xml)¶
Base saine et lisible (pour la prod, pars de sysmon-modular d'Olaf Hartong, taggé ATT&CK). Philosophie : exclure le bruit, capturer les signaux forts (LSASS, LOLBins, réseau, DNS, autoruns).
<Sysmon schemaversion="4.90">
<HashAlgorithms>SHA256</HashAlgorithms>
<DnsLookup>False</DnsLookup>
<EventFiltering>
<!-- ID 1 : Création de processus (garder tout, exclure bruit connu) -->
<RuleGroup name="ProcessCreate" groupRelation="or">
<ProcessCreate onmatch="exclude">
<Image condition="is">C:\Windows\System32\SearchIndexer.exe</Image>
</ProcessCreate>
</RuleGroup>
<!-- ID 3 : Connexions réseau (cibler processus sensibles / non-navigateurs) -->
<RuleGroup name="NetworkConnect" groupRelation="or">
<NetworkConnect onmatch="include">
<Image condition="end with">powershell.exe</Image>
<Image condition="end with">cmd.exe</Image>
<Image condition="end with">rundll32.exe</Image>
<Image condition="end with">regsvr32.exe</Image>
<Image condition="end with">mshta.exe</Image>
<Image condition="end with">certutil.exe</Image>
<Image condition="end with">wscript.exe</Image>
<Image condition="end with">cscript.exe</Image>
</NetworkConnect>
</RuleGroup>
<!-- ID 8 : CreateRemoteThread (injection) -->
<RuleGroup name="CreateRemoteThread" groupRelation="or">
<CreateRemoteThread onmatch="include">
<TargetImage condition="end with">lsass.exe</TargetImage>
<SourceImage condition="end with">powershell.exe</SourceImage>
</CreateRemoteThread>
</RuleGroup>
<!-- ID 10 : Accès processus - CRITIQUE : accès à LSASS (vol de creds, P5 M38) -->
<RuleGroup name="ProcessAccess" groupRelation="or">
<ProcessAccess onmatch="include">
<TargetImage condition="end with">lsass.exe</TargetImage>
</ProcessAccess>
<!-- Exclure les lecteurs légitimes connus pour réduire le bruit -->
<ProcessAccess onmatch="exclude">
<SourceImage condition="is">C:\Windows\System32\wininit.exe</SourceImage>
<SourceImage condition="is">C:\Windows\System32\csrss.exe</SourceImage>
<SourceImage condition="is">C:\Windows\System32\services.exe</SourceImage>
</ProcessAccess>
</RuleGroup>
<!-- ID 11 : Création de fichiers dans zones sensibles (droppers) -->
<RuleGroup name="FileCreate" groupRelation="or">
<FileCreate onmatch="include">
<TargetFilename condition="contains">\Temp\</TargetFilename>
<TargetFilename condition="end with">.ps1</TargetFilename>
<TargetFilename condition="end with">.hta</TargetFilename>
<TargetFilename condition="end with">.bat</TargetFilename>
</FileCreate>
</RuleGroup>
<!-- ID 12/13 : Registry - persistance (Run keys, services) -->
<RuleGroup name="RegistryEvent" groupRelation="or">
<RegistryEvent onmatch="include">
<TargetObject condition="contains">\CurrentVersion\Run</TargetObject>
<TargetObject condition="contains">\Services\</TargetObject>
<TargetObject condition="contains">msDS-KeyCredentialLink</TargetObject>
</RegistryEvent>
</RuleGroup>
<!-- ID 22 : Requêtes DNS (C2 DNS, résolutions suspectes) -->
<RuleGroup name="DnsQuery" groupRelation="or">
<DnsQuery onmatch="exclude">
<QueryName condition="end with">.corp.lab.local</QueryName>
</DnsQuery>
</RuleGroup>
</EventFiltering>
</Sysmon>
1.2 Installation / mise à jour (référence)¶
# [cible] Installation initiale avec config
\\corp.lab.local\Deploy\Sysmon\Sysmon64.exe -accepteula -i \\corp.lab.local\Deploy\Sysmon\sysmonconfig.xml
# Mise à jour de config (idempotent)
\\corp.lab.local\Deploy\Sysmon\Sysmon64.exe -c \\corp.lab.local\Deploy\Sysmon\sysmonconfig.xml
# Vérifier
Sysmon64.exe -c
Get-WinEvent -LogName "Microsoft-Windows-Sysmon/Operational" -MaxEvents 5
1.3 Déploiement par GPO - tâche planifiée idempotente¶
Script de déploiement (déposé sur le partage, ex. \\corp.lab.local\Deploy\Sysmon\Deploy-Sysmon.ps1) :
# Deploy-Sysmon.ps1 - idempotent, exécuté en SYSTEM par la tâche GPO
$src = "\\corp.lab.local\Deploy\Sysmon"
$exe = Join-Path $src "Sysmon64.exe"
$conf = Join-Path $src "sysmonconfig.xml"
$svc = Get-Service -Name "Sysmon64" -ErrorAction SilentlyContinue
if (-not $svc) {
& $exe -accepteula -i $conf
} else {
# Comparer le hash de la config appliquée à la référence pour éviter un -c inutile
$refHash = (Get-FileHash $conf).Hash
$applied = "$env:ProgramData\Sysmon\applied.hash"
if (-not (Test-Path $applied) -or (Get-Content $applied) -ne $refHash) {
& $exe -c $conf
New-Item -Force -Path (Split-Path $applied) -ItemType Directory | Out-Null
Set-Content -Path $applied -Value $refHash
}
}
Réglage GPO - GPO-C-Deploy-Sysmon liée à OU=Ordinateurs et OU=Serveurs :
Computer Configuration > Preferences > Control Panel Settings > Scheduled Tasks
New > Scheduled Task (At least Windows 7)
Name : Deploy-Sysmon
Run as : NT AUTHORITY\System (cocher "Run with highest privileges")
Triggers: At startup + Daily (répétition quotidienne)
Action : Start a program
Program : powershell.exe
Args : -NoProfile -ExecutionPolicy Bypass -File
\\corp.lab.local\Deploy\Sysmon\Deploy-Sysmon.ps1
Partage de référence - droits en lecture pour les machines :
# [MGMT] Créer le partage et n'autoriser QUE la lecture aux ordinateurs du domaine
New-Item -Path "D:\Deploy\Sysmon" -ItemType Directory -Force
New-SmbShare -Name "Deploy" -Path "D:\Deploy" -ReadAccess "CORP\Domain Computers"
# ACL NTFS : lecture pour Domain Computers, écriture réservée aux admins T0
icacls "D:\Deploy" /grant "CORP\Domain Computers:(OI)(CI)RX"
2. WEF / WEC - collecte centralisée¶
2.1 Collecteur (WEC)¶
# [WEC] Activer le service de collecte
wecutil qc /q
Set-Service Wecsvc -StartupType Automatic ; Start-Service Wecsvc
2.2 Souscription source-initiated (subscription.xml)¶
Fichier de souscription qui remonte les Event IDs de détection (Security + Sysmon + PowerShell) :
<Subscription xmlns="http://schemas.microsoft.com/2006/03/windows/events/subscription">
<SubscriptionId>WEC-Detection</SubscriptionId>
<SubscriptionType>SourceInitiated</SubscriptionType>
<Description>Collecte de détection AD (Security, Sysmon, PowerShell)</Description>
<Enabled>true</Enabled>
<Uri>http://schemas.microsoft.com/wbem/wsman/1/windows/EventLog</Uri>
<ConfigurationMode>Custom</ConfigurationMode>
<Delivery Mode="Push">
<Batching>
<MaxItems>50</MaxItems>
<MaxLatencyTime>30000</MaxLatencyTime> <!-- 30s : quasi temps réel (anti-effacement) -->
</Batching>
</Delivery>
<Query>
<![CDATA[
<QueryList>
<Query Id="0">
<!-- Sécurité : logons, Kerberos, réplication, groupes, effacement -->
<Select Path="Security">
*[System[(EventID=4624 or EventID=4625 or EventID=4662 or
EventID=4768 or EventID=4769 or EventID=4776 or
EventID=4728 or EventID=4732 or EventID=4756 or
EventID=4720 or EventID=1102 or EventID=4719)]]
</Select>
<Select Path="Microsoft-Windows-Sysmon/Operational">*</Select>
<Select Path="Microsoft-Windows-PowerShell/Operational">
*[System[(EventID=4103 or EventID=4104)]]
</Select>
<Select Path="System">
*[System[(EventID=7045 or EventID=7040)]]
</Select>
</Query>
</QueryList>
]]>
</Query>
<ReadExistingEvents>false</ReadExistingEvents>
<TransportName>HTTP</TransportName>
<ContentFormat>RenderedText</ContentFormat>
<Locale Language="fr-FR"/>
<LogFile>ForwardedEvents</LogFile>
<AllowedSourceNonDomainComputers></AllowedSourceNonDomainComputers>
<AllowedSourceDomainComputers>
O:NSG:NSD:(A;;GA;;;DC)(A;;GA;;;DD)
</AllowedSourceDomainComputers>
</Subscription>
# [WEC] Créer / gérer la souscription
wecutil cs subscription.xml
wecutil es # lister
wecutil gr WEC-Detection # état + sources connectées
2.3 Sources - GPO GPO-C-WEF-Sources¶
Computer Configuration > Policies > Administrative Templates > Windows Components >
Event Forwarding >
"Configure target Subscription Manager" = Enabled
Server=http://WEC01.corp.lab.local:5985/wsman/SubscriptionManager/WEC,Refresh=60
Computer Configuration > Policies > Windows Settings > Security Settings >
System Services : "Windows Remote Management (WS-Management)" = Automatic
Computer Configuration > Preferences > Control Panel Settings > Local Users and Groups :
Group "Event Log Readers" > Add member : "NT AUTHORITY\NETWORK SERVICE"
# [source, si besoin manuel] activer WinRM
winrm quickconfig -q
# Vérifier la remontée côté WEC :
Get-WinEvent -LogName ForwardedEvents -MaxEvents 10
3. Detection Baseline - GPO GPO-C-Detection-Baseline¶
3.1 Politique d'audit avancée¶
Réglage GPO :
Computer Configuration > Policies > Windows Settings > Security Settings >
Advanced Audit Policy Configuration > Audit Policies :
Account Logon : Credential Validation = Success, Failure
: Kerberos Authentication Service = Success, Failure
: Kerberos Service Ticket Operations= Success, Failure
Account Mgmt : Security Group Management = Success, Failure
: User Account Management = Success, Failure
DS Access : Directory Service Access = Success, Failure
: Directory Service Changes = Success, Failure
Logon/Logoff : Logon = Success, Failure
: Special Logon = Success
Detailed Tracking: Process Creation = Success
Privilege Use : Sensitive Privilege Use = Success, Failure
auditpol) :
:: [cible] vérifier l'état effectif
auditpol /get /category:*
:: équivalents ponctuels (le GPO prime en domaine)
auditpol /set /subcategory:"Kerberos Service Ticket Operations" /success:enable /failure:enable
auditpol /set /subcategory:"Directory Service Changes" /success:enable /failure:enable
3.2 Ligne de commande dans l'event 4688¶
GPO : Administrative Templates > System > Audit Process Creation > "Include command line in process creation events" = Enabled
Équivalent registre :
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Audit" `
-Name "ProcessCreationIncludeCmdLine_Enabled" -Value 1 -Type DWord
3.3 PowerShell logging¶
GPO : Administrative Templates > Windows Components > Windows PowerShell → activer Script Block Logging, Module Logging (ModuleNames = *), Transcription (+ répertoire).
Équivalent registre :
$base = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell"
New-Item "$base\ScriptBlockLogging" -Force | Out-Null
Set-ItemProperty "$base\ScriptBlockLogging" -Name EnableScriptBlockLogging -Value 1 -Type DWord
New-Item "$base\ModuleLogging" -Force | Out-Null
Set-ItemProperty "$base\ModuleLogging" -Name EnableModuleLogging -Value 1 -Type DWord
New-Item "$base\ModuleLogging\ModuleNames" -Force | Out-Null
Set-ItemProperty "$base\ModuleLogging\ModuleNames" -Name "*" -Value "*"
New-Item "$base\Transcription" -Force | Out-Null
Set-ItemProperty "$base\Transcription" -Name EnableTranscripting -Value 1 -Type DWord
Set-ItemProperty "$base\Transcription" -Name OutputDirectory -Value "\\WEC01\PSTranscripts$"
Les transcripts partent sur un partage centralisé (append-only, hors de portée d'un admin local de la source).
4. gMSA - cycle de vie complet¶
# [DC] 1. Clé racine KDS (UNE fois par forêt). En prod : sans le -10h, attendre 10h de propagation.
Add-KdsRootKey -EffectiveTime ((Get-Date).AddHours(-10))
# [DC] 2. Groupe des serveurs autorisés à récupérer le mot de passe géré
New-ADGroup -Name "G_SIEM_Servers" -GroupScope Global -GroupCategory Security `
-Path "OU=SIEM,OU=Security-Tooling,OU=Tier0-Infrastructure,DC=corp,DC=lab,DC=local"
Add-ADGroupMember "G_SIEM_Servers" -Members "SIEM01$","WEC01$"
# [DC] 3. Créer le gMSA (lecture seule pour un forwarder SIEM)
New-ADServiceAccount -Name "gmsa-siemfwd" `
-DNSHostName "gmsa-siemfwd.corp.lab.local" `
-PrincipalsAllowedToRetrieveManagedPassword "G_SIEM_Servers" `
-Path "OU=SIEM,OU=Security-Tooling,OU=Tier0-Infrastructure,DC=corp,DC=lab,DC=local"
# [cible SIEM01] 4. Installer & tester (nécessite la fonctionnalité RSAT-AD-PowerShell)
Install-ADServiceAccount gmsa-siemfwd
Test-ADServiceAccount gmsa-siemfwd # -> True attendu
# 5a. Affecter le gMSA à un SERVICE Windows
sc.exe config "MonServiceForwarder" obj= "CORP\gmsa-siemfwd$" password= ""
# (ou via services.msc : Log On As = CORP\gmsa-siemfwd$ , mot de passe vide)
# 5b. Affecter le gMSA à une TÂCHE PLANIFIÉE
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File C:\Tools\collect.ps1"
$trigger = New-ScheduledTaskTrigger -AtStartup
$principal = New-ScheduledTaskPrincipal -UserId "CORP\gmsa-siemfwd$" -LogonType Password -RunLevel Highest
Register-ScheduledTask -TaskName "SIEM-Collect" -Action $action -Trigger $trigger -Principal $principal
5. Délégations dsacls - moindre privilège¶
5.1 SOAR : droit de désactiver un compte (et rien d'autre)¶
# [DC] gMSA du SOAR
New-ADServiceAccount -Name "gmsa-soar" -DNSHostName "gmsa-soar.corp.lab.local" `
-PrincipalsAllowedToRetrieveManagedPassword "G_SOAR_Servers" `
-Path "OU=SOAR,OU=Security-Tooling,OU=Tier0-Infrastructure,DC=corp,DC=lab,DC=local"
$ouUsers = "OU=Utilisateurs,OU=CORP,DC=corp,DC=lab,DC=local"
# Écriture SUR le seul attribut userAccountControl (permet enable/disable), objets user, héritage sous-arbre
dsacls "$ouUsers" /I:S /G "CORP\gmsa-soar$:WP;userAccountControl;user"
# (Optionnel) droit de reset de mot de passe pour le confinement - control access right
dsacls "$ouUsers" /I:S /G "CORP\gmsa-soar$:CA;Reset Password;user"
# VÉRIFIER qu'il n'a AUCUN droit ailleurs (surtout pas sur les OU d'admin ni les DC)
dsacls "OU=Admin,DC=corp,DC=lab,DC=local" | Select-String "gmsa-soar" # -> doit être vide
dsacls "OU=Domain Controllers,DC=corp,DC=lab,DC=local" | Select-String "gmsa-soar" # -> vide
5.2 SIEM : lecture seule des logs¶
# Appartenance au groupe intégré "Event Log Readers" (lire les journaux)
Add-ADGroupMember "Event Log Readers" -Members "G_SIEM_Servers"
# Lecture LDAP : par défaut les utilisateurs authentifiés lisent la plupart des attributs ;
# NE JAMAIS accorder d'écriture au compte SIEM. Auditer l'absence de droits d'écriture :
dsacls "DC=corp,DC=lab,DC=local" | Select-String "gmsa-siemfwd" # -> aucun WP/GA attendu
5.3 Retrait d'une délégation (offboarding)¶
dsacls "$ouUsers" /R "CORP\gmsa-soar$" # révoque toutes les ACE de ce principal sur l'OU
6. JEA - endpoint de confinement SOC (fichiers complets)¶
6.1 Role capability SOC-Response.psrc¶
# [cible ADMGMT01] Générer puis éditer
New-Item -Path "C:\JEA\Roles" -ItemType Directory -Force | Out-Null
New-PSRoleCapabilityFile -Path "C:\JEA\Roles\SOC-Response.psrc"
C:\JEA\Roles\SOC-Response.psrc :
@{
GUID = 'a1b2c3d4-0000-0000-0000-000000000001'
Author = 'SOC CORP'
Description = 'Capacités de confinement SOC - strictement limitées'
# Modules nécessaires aux cmdlets AD
ModulesToImport = 'ActiveDirectory'
VisibleCmdlets = @(
'Get-ADUser',
@{ Name = 'Disable-ADAccount'; Parameters = @{ Name = 'Identity' } },
'Unlock-ADAccount',
@{ Name = 'Set-ADAccountPassword'; Parameters = @{ Name = 'Identity' }, @{ Name = 'Reset' } },
'Get-ADPrincipalGroupMembership',
@{ Name = 'Remove-ADGroupMember'; Parameters = @{ Name = 'Identity' }, @{ Name = 'Members' } }
)
# Aucune commande externe, aucun accès au système de fichiers, pas de langage complet
VisibleExternalCommands = @()
}
6.2 Session configuration SOC-Response.pssc¶
New-PSSessionConfigurationFile -Path "C:\JEA\SOC-Response.pssc"
C:\JEA\SOC-Response.pssc :
@{
SchemaVersion = '2.0.0.0'
GUID = 'a1b2c3d4-0000-0000-0000-000000000002'
Author = 'SOC CORP'
SessionType = 'RestrictedRemoteServer' # runspace verrouillé, NoLanguage
# S'exécute sous un gMSA délégué (droits du §5), l'analyste n'a AUCUN privilège propre
GroupManagedServiceAccount = 'CORP\gmsa-socresponse$'
TranscriptDirectory = 'C:\JEA\Transcripts' # traçabilité totale pour postmortem
RunAsVirtualAccount = $false
RoleDefinitions = @{
'CORP\G_SOC_Response' = @{ RoleCapabilities = 'SOC-Response' }
}
LanguageMode = 'NoLanguage'
}
6.3 Enregistrement, test, audit¶
# [cible] Le dossier des rôles doit être : C:\Program Files\WindowsPowerShell\Modules\<Mod>\RoleCapabilities
# Le plus simple : placer le .psrc dans un module dédié référencé par la pssc.
Register-PSSessionConfiguration -Name "JEA-SOC-Response" -Path "C:\JEA\SOC-Response.pssc" -Force
Restart-Service WinRM
# [analyste, non-admin] Se connecter à l'endpoint contraint
Enter-PSSession -ComputerName ADMGMT01 -ConfigurationName "JEA-SOC-Response" -Credential CORP\soc1
# Disable-ADAccount -Identity jdupont -> OK, transcrit
# Get-Process -> REFUSÉ (hors liste blanche)
# Stop-Computer -> REFUSÉ
# [audit] Lister les capacités effectives d'un endpoint
Get-PSSessionCapability -ConfigurationName "JEA-SOC-Response" -Username "CORP\soc1"
# [audit] Relire l'action dans le transcript
Get-Content "C:\JEA\Transcripts\*soc1*" -Tail 30
7. Ingestion SIEM¶
7.1 Elastic - winlogbeat.yml¶
# winlogbeat.yml - collecte des canaux de détection
winlogbeat.event_logs:
- name: Security
ignore_older: 72h
- name: Microsoft-Windows-Sysmon/Operational
- name: Microsoft-Windows-PowerShell/Operational
event_id: 4103, 4104
- name: System
event_id: 7045, 7040
- name: ForwardedEvents # si Winlogbeat tourne SUR le WEC (recommandé)
# Enrichissement / normalisation ECS
processors:
- add_host_metadata: ~
- add_fields:
target: environment
fields: { site: "corp-lab", tier: "prod" }
# Sortie : Logstash (parsing) ou Elasticsearch direct
output.elasticsearch:
hosts: ["https://siem01.corp.lab.local:9200"]
username: "${ES_USER}" # via keystore, jamais en clair
password: "${ES_PWD}"
ssl.certificate_authorities: ["C:/certs/ca.crt"] # CA de ta PKI (P2)
setup.kibana:
host: "https://siem01.corp.lab.local:5601"
# [cible] Installer / dashboards / démarrer
.\winlogbeat.exe keystore create
.\winlogbeat.exe keystore add ES_USER ; .\winlogbeat.exe keystore add ES_PWD
.\winlogbeat.exe setup -e # charge templates & dashboards
.\winlogbeat.exe install ; Start-Service winlogbeat
Modèle recommandé : n'installe Winlogbeat que sur le WEC et lis
ForwardedEvents→ un seul point d'ingestion, pas d'agent sur chaque hôte.
7.2 Wazuh - ossec.conf (agent Windows)¶
<ossec_config>
<client>
<server>
<address>siem.corp.lab.local</address>
<port>1514</port>
<protocol>tcp</protocol>
</server>
</client>
<!-- Journaux Windows par canal d'événements -->
<localfile>
<location>Security</location>
<log_format>eventchannel</log_format>
<query>Event/System[EventID=4624 or EventID=4625 or EventID=4662 or
EventID=4768 or EventID=4769 or EventID=4728 or EventID=4732 or
EventID=1102 or EventID=4719]</query>
</localfile>
<localfile>
<location>Microsoft-Windows-Sysmon/Operational</location>
<log_format>eventchannel</log_format>
</localfile>
<localfile>
<location>Microsoft-Windows-PowerShell/Operational</location>
<log_format>eventchannel</log_format>
</localfile>
</ossec_config>
# [manager Wazuh] Sysmon est décodé nativement ; règles dans /var/ossec/etc/rules/local_rules.xml
# Redémarrer après modif :
systemctl restart wazuh-manager
8. Détections d'auto-défense du tooling (règles + requêtes)¶
8.1 Journal de sécurité effacé (1102)¶
# Sigma
title: Journal d'audit de sécurité effacé
logsource: { product: windows, service: security }
detection:
selection: { EventID: 1102 }
condition: selection
level: high
tags: [attack.defense_evasion, attack.t1070.001]
// Sentinel/Elastic KQL
SecurityEvent | where EventID == 1102
8.2 Politique d'audit modifiée (4719)¶
title: Modification de la politique d'audit systeme
logsource: { product: windows, service: security }
detection:
selection: { EventID: 4719 }
condition: selection
level: high
tags: [attack.defense_evasion, attack.t1562.002]
8.3 Arrêt / sabotage du capteur Sysmon¶
title: Service Sysmon arrete ou reconfigure (sabotage possible)
logsource: { product: windows, service: system }
detection:
svc_stop:
Provider_Name: 'Service Control Manager'
EventID: 7036
param1|contains: 'Sysmon'
param2: 'stopped'
condition: svc_stop
level: high
tags: [attack.defense_evasion, attack.t1562.001]
---
title: Changement de configuration Sysmon hors GPO
logsource: { product: windows, service: sysmon }
detection:
selection: { EventID: 16 } # Sysmon logue sa propre reconfiguration
condition: selection
level: medium
8.4 Capteur muet (aveuglement) - logique d'agrégation SIEM¶
// Elastic/Sentinel KQL - un hôte qui émettait des events Sysmon se tait sur 1h
let baseline = Sysmon | summarize by host.name; // hôtes censés émettre
Sysmon
| summarize events = count() by host.name, bin(TimeGenerated, 1h)
| where events == 0
| join kind=inner baseline on host.name
| project TimeGenerated, host.name, events
-- Splunk équivalent : détecter l'absence via | tstats + comparaison à la baseline
| tstats count where index=sysmon by host span=1h
| where count=0
8.5 Usage d'un compte break-glass (sévérité maximale)¶
title: Authentification d'un compte break-glass (incident P1)
logsource: { product: windows, service: security }
detection:
selection:
EventID: 4624
TargetUserName:
- 'brk-glass-01'
- 'brk-glass-02'
condition: selection
level: critical
tags: [attack.privilege_escalation]
9. Gouvernance as code¶
9.1 Sauvegarde versionnable des GPO¶
# [MGMT] Export de toutes les GPO vers le dépôt Git (à committer)
$repo = "C:\Git\ad-governance"
Backup-GPO -All -Path "$repo\gpo"
# Rapport HTML lisible pour la revue de PR
Get-GPO -All | ForEach-Object {
Get-GPOReport -Guid $_.Id -ReportType Html -Path "$repo\gpo-reports\$($_.DisplayName).html"
}
# Rejeu contrôlé depuis Git
Import-GPO -BackupGpoName "GPO-C-Detection-Baseline" -TargetName "GPO-C-Detection-Baseline" `
-Path "$repo\gpo" -CreateIfNeeded
9.2 Structure du dépôt Git¶
ad-governance/
├── gpo/ # backups GPO (Backup-GPO)
├── gpo-reports/ # rapports HTML pour revue
├── sysmon/sysmonconfig.xml # config capteur versionnée
├── wef/subscription.xml # souscription WEC
├── jea/*.psrc *.pssc # endpoints JEA
├── delegations/dsacls.ps1 # délégations idempotentes
├── detections/*.yml # règles Sigma (P7)
├── ou-structure.ps1 # provisioning OU/groupes (idempotent)
└── .gitlab-ci.yml # lint + compile Sigma + tests
9.3 Détection de dérive (DSC)¶
# Exemple DSC : garantir la présence du service Sysmon (drift = alerte)
Configuration EnsureSysmon {
Import-DscResource -ModuleName PSDesiredStateConfiguration
Node $AllNodes.NodeName {
Service Sysmon {
Name = "Sysmon64"
State = "Running"
Ensure = "Present"
}
}
}
# Vérifier la conformité (drift) sur le parc :
Test-DscConfiguration -ComputerName (Get-ADComputer -Filter *).Name -Detailed
# Équivalent Ansible (mode contrôle) : détecter la dérive sans corriger
ansible windows -m win_service -a "name=Sysmon64" --check
10. Runbook - ordre de déploiement¶
Applique dans cet ordre (chaque étape prépare la suivante) :
1. [DC] OU Security-Tooling + groupes SOC (AGDLP) §Partie 7-bis M76
2. [DC] Clé KDS + gMSA (SIEM, SOAR, SOC-Response) §4
3. [DC] Délégations dsacls (SOAR/SIEM) + vérif d'absence ailleurs §5
4. [MGMT] Partage \\...\Deploy (RX Domain Computers) §1.3
5. [GPO] GPO-C-Detection-Baseline (audit, 4688 cmdline, PS log) §3
6. [WEC] wecutil qc + subscription.xml §2.1-2.2
7. [GPO] GPO-C-WEF-Sources (SubscriptionManager, WinRM, ELR) §2.3
8. [GPO] GPO-C-Deploy-Sysmon (tâche planifiée idempotente) §1.3
9. [cible]SIEM : Winlogbeat sur WEC (ForwardedEvents) / agents Wazuh §7
10. [SIEM] Règles Sigma détection + AUTO-DÉFENSE (§8) déployées §8 / P7 M71
11. [cible]JEA-SOC-Response enregistré + testé §6
12. [tooling] Tier 0 : Protected Users, PAW-only, break-glass §Partie 7-bis M79
13. [MGMT] Tout dans Git + CI + drift (DSC/Ansible) §9
14. [valid]Contrôle de couverture Sysmon/logs = 100 % §Partie 7-bis M77
15. [valid]Rejouer une attaque P6 -> la détection s'allume ? boucle purple
Vérification finale : rejoue un Kerberoasting (P6) et un
wevtutil cl Securitysur une source. Attendu : (a) l'event 4769 RC4 déclenche ta règle sur le SIEM ; (b) l'effacement local déclenche 1102 et les logs sont déjà sur le WEC. Si les deux passent, ta gouvernance tient.
Fin de l'annexe technique. Tout ce qui est ici est versionnable : configs de capteurs, GPO, gMSA, délégations, JEA, règles. Le principe d'ingénieur inchangé - rien à la main, tout déclaratif, tout tracé, le gardien mieux gardé que ce qu'il garde.