Aller au contenu

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

  1. Sysmon - config de base + déploiement GPO
  2. WEF/WEC - collecteur, souscription, sources
  3. Detection Baseline - audit, 4688 cmdline, PowerShell logging
  4. gMSA - cycle de vie complet + affectation
  5. Délégations dsacls - SOAR & SOC
  6. JEA - fichiers complets + enregistrement
  7. Ingestion SIEM - Winlogbeat & Wazuh
  8. Détections d'auto-défense - règles Sigma + requêtes
  9. Gouvernance as code - Git, sauvegarde GPO, drift
  10. 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
Vérification / équivalent local (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"
Contenu final de 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"
Contenu final de 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 Security sur 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.