Files
comi-audit-defender/README.md
T

8.2 KiB
Raw Blame History

comit-audit-defender

Paquet WAPT Enterprise 2.6 d'audit en lecture seule de Microsoft Defender. Il ne déploie pas d'agent supplémentaire, ne modifie aucune préférence Defender, ne supprime aucune quarantaine et n'effectue aucun accès réseau externe. Le hook natif audit() retourne exclusivement OK, WARNING ou ERROR.

Le paquet est planifié toutes les 15 minutes par WAPT/control. La collecte PowerShell est locale et bornée à 90 secondes; elle utilise Get-MpComputerStatus, Get-MpThreat et Get-MpThreatDetection. Une erreur PowerShell, un timeout, une réponse vide ou un JSON invalide produit ERROR et un état collection_complete=false, jamais un poste sain.

Classification 0–16

La gravité Defender intrinsèque est conservée dans severity_id et le risque calculé dans event_level. Les identifiants canoniques MPTHREAT_SEVERITY sont 0 Unknown, 1 Low, 2 Moderate, 4 High, 5 Severe; WMI SeverityID (0..4) est normalisé (3 High vers 4, 4 Severe vers 5) avant classification. Les niveaux de base sont respectivement 5, 4, 6, 9 et 12.

Niveau Catégorie
0 Aucun événement
1–3 Information
4–6 Faible
7–9 Modéré
10–12 Élevé
13–14 Critique
15–16 Urgence

Règles par défaut, définies dans DEFAULT_RULES et surchargeables par les fonctions pures pour les tests :

Contexte Defender Modificateur
Cleaned, Quarantined, Removed -3
Blocked -2
Detected / état non résolu +2
Failed remediation +3
Allowed +3
Répétition de la même menace dans la fenêtre +2
Temps réel désactivé en mode Normal +2
Antivirus / service désactivé en mode Normal (chaque signal) +2
Surveillance comportementale ou IOAV désactivée +1 chacun
Signatures anciennes de plus de 3 jours / âge inconnu +1

Le résultat est borné à [0,16]. Ces poids et les corrélations sont des règles métier Comitari, inspirées de Wazuh; ils ne reproduisent pas son moteur. L'échelle WAPT dépend de current_risk_level, jamais du maximum historique : 0–6 OK, 7–9 WARNING, 10–16 ERROR. En mode Normal, antivirus, service ou temps réel désactivé force ERROR indépendamment du score. Passive, SxS Passive Mode et EDR Block Mode ne déclenchent pas à eux seuls de faux incident; les menaces restent classifiées.

Quarantined reçoit une réduction de score mais reste dans active_threats, car la quarantaine ne prouve pas l'absence de compromission. Cleaned, Removed et Blocked ne maintiennent pas seuls le risque courant; toutefois IsActive, DidThreatExecute ou un état d'exécution Allowed/Executing les maintient comme risque non résolu. Les événements récents restent aussi dans detections et l'historique WAPT. DidThreatExecute et CurrentThreatExecutionStatusID sont des signaux explicites, séparés du nom et de la sévérité de signature; aucun nom (y compris « ransomware ») n'est interprété comme preuve d'exécution ou de comportement.

Fenêtres et corrélations

  • Fenêtre glissante par défaut : six heures; une détection y entre si sa première détection ou son dernier changement de statut se trouve dans cette fenêtre.
  • Les événements résolus sont conservés dans la collecte courante pendant 30 jours. Toute menace non résolue est conservée sans limite d'ancienneté, donc une menace active de plus de six heures ne disparaît pas.
  • max_event_level_6h porte sur les événements récents, max_active_level sur toutes les menaces non résolues et current_risk_level sur le maximum du risque actif et de l'état de protection.
  • Corrélations sur six heures : répétition d'une même menace, menaces distinctes multiples, menace High/Severe avec temps réel désactivé, échecs de remédiation répétés et menace explicitement autorisée.
  • DetectionID est la clé de déduplication documentée, combinée à ThreatID. En son absence, un composite stable de ThreatID, dates, statut et empreinte interne des ressources est utilisé; l'identité incomplète est signalée dans le résumé. Les événements distincts avec des DetectionID différents ne sont pas fusionnés parce qu'ils partagent un ThreatID.
  • Il n'y a plus de limite arbitraire à 100 détections. La collecte transmet tous les événements de moins de 30 jours ainsi que les états non résolus plus anciens. Les données étant complètes ou la collecte échouant explicitement, aucun incident critique n'est silencieusement tronqué.

Audit WAPT et Reporting

L'API utilisée est WAPT.write_audit_data_if_changed(section, key, value, ptype=None, value_date=None, expiration_date=None, max_count=2, keep_days=None), documentée dans l'API Setuphelpers WAPT 2.6. Les valeurs sont des dictionnaires/listes JSON natifs, consultables dans Audit Data / Reporting. Le paquet écrit un agrégat snapshot version 2 et conserve aussi les clés historiques summary, detections et active_threats, plus correlations. La collecte n'ajoute pas d'horodatage courant qui rendrait chaque valeur différente. WAPT conserve jusqu'à 512 changements pendant 90 jours, selon la première limite atteinte.

Exemple synthétique de structure :

{
  "schema_version": 2,
  "collection_complete": true,
  "defender": {
    "running_mode": "Normal",
    "antivirus_enabled": true,
    "realtime_enabled": true,
    "behavior_monitor_enabled": true,
    "ioav_enabled": true,
    "signature_age": 0,
    "signature_version": "1.000.0.0",
    "signature_last_updated": "2026-10-27T09:00:00Z",
    "engine_version": "1.1.0.0",
    "service_enabled": true
  },
  "summary": {
    "max_event_level_6h": 0,
    "max_active_level": 0,
    "current_risk_level": 0,
    "current_risk_category": "Aucun événement",
    "audit_status": "OK",
    "collection_complete": true,
    "detection_count_6h": 0,
    "active_count": 0,
    "resolved_count_6h": 0,
    "identity_incomplete_count": 0,
    "unknown_severity_count": 0,
    "protection_issues": [],
    "correlation_count": 0
  },
  "detections": [],
  "active_threats": [],
  "correlations": []
}

Données et limites de collecte

  • Get-MpThreatDetection fournit le ThreatID, DetectionID, ThreatStatusID, dates de détection/changement/remédiation, code d'erreur, réussite d'action, état d'exécution et ressources. Get-MpThreat est joint en Python par ThreatID pour ThreatName, sévérité, IsActive et DidThreatExecute.
  • Les chemins complets des ressources, noms d'utilisateurs et noms de processus ne sont ni sérialisés ni transmis. Seuls le nombre et les catégories file, process, registry, service, url ou other sont conservés.
  • Defender peut ne pas exposer une propriété sur une version donnée. Les valeurs absentes sont traitées comme inconnues; une détection de sévérité inconnue reçoit le niveau de base Unknown. Une panne de la cmdlet entière force ERROR.
  • Les valeurs de ThreatStatusID utilisées viennent de MSFT_MpThreatDetection : 0 Unknown, 1 Detected, 2 Cleaned, 3 Quarantined, 4 Removed, 5 Allowed, 6 Blocked, 102 QuarantineFailed, 103 RemoveFailed, 104 AllowFailed, 105 Abandoned, 107 BlockedFailed. Les différents enums Microsoft peuvent différer selon l'API; ce paquet cible les objets des cmdlets Defender.
  • Defender ne livre pas une chronologie complète des actions humaines ni une preuve d'exécution malveillante. DidThreatExecute et CurrentThreatExecutionStatusID sont exposés lorsque disponibles, sans déduction comportementale sur le nom.
  • La réponse PowerShell contient l'ensemble des événements récents et actifs pertinents; le timeout de 90 s provoque un état ERROR, sans limite de 100 qui masquerait une détection.

Tests locaux

Les tests utilisent uniquement des données synthétiques et des mocks Python; aucune commande Defender réelle ni WAPT n'est invoquée :

python -m unittest discover -s tests -v

Cloner le paquet dans le dossier WAPT de développement

Dans PowerShell, créez C:\waptdev si nécessaire, puis clonez le dépôt en HTTPS dans C:\waptdev\comi-audit-defender :

New-Item -ItemType Directory -Force "C:\waptdev" | Out-Null
git clone https://git.comitari.fr/paquets-publiques/comi-audit-defender.git "C:\waptdev\comi-audit-defender"