Licence pro ASS&RProductionLecture : 6 min

Du SIEM au SOC : plusieurs couches de détection autour de Wazuh

Les journaux de l'entreprise restaient sur chaque machine : j'ai créé un serveur SIEM Wazuh, puis ajouté trois couches de détection, des postes au réseau jusqu'à un leurre.

Contexte
Production · PME d'une vingtaine de personnes, SIEM sur une VM Ubuntu (Hyper-V)
Période
Juin 2026
Mon rôle
Conception, installation et validation en autonomie
Outils
Wazuh · Suricata · OpenCanary · Auditd · Ubuntu Server · Hyper-V

En bref

Le problème

Dans une PME d'une vingtaine de personnes, chaque machine gardait ses journaux : rien ne les centralisait ni ne les croisait.

Ce que j'ai fait

J'ai créé un serveur SIEM Wazuh sur Hyper-V, puis ajouté trois couches : intégrité et configuration des postes, trafic réseau avec Suricata, leurre OpenCanary isolé.

Le résultat

Connexion au leurre signalée en moins de 30 s, 50 682 règles réseau actives, conformité CIS des postes mesurée à 28-29 %, annotation MITRE ATT&CK réparée.

< 30sentre une connexion au leurre et l'alerte de niveau 13
50 682règles Suricata actives (Emerging Threats Open), sur 66 607
3couches de détection ajoutées : postes, réseau, leurre

Contexte

L'entreprise, une PME de distribution d'une vingtaine de personnes, repose sur Windows Server, Active Directory, un pare-feu en frontière et Microsoft 365. Chaque machine gardait ses journaux pour elle : rien ne les centralisait ni ne les croisait.

Une attaque combine souvent fichiers modifiés, trafic inhabituel et déplacement vers d'autres machines ; vue isolément, chaque étape semble anodine. D'où plusieurs couches de détection, avec trois contraintes : aucun coût logiciel, détecter sans bloquer, valider chaque module sur l'infrastructure réelle.

Ce que j'ai fait

  1. Créer un serveur SIEM dédiéUne VM Ubuntu Server 22.04 LTS sur Hyper-V (8 vCPU, 32 Go de RAM), à l'adresse figée dès la conception : tous les agents et flux Syslog pointent vers elle.
  2. Surveiller les machinesIntégrité des fichiers sensibles en temps réel, configuration des postes comparée aux guides CIS, et Auditd sur le SIEM lui-même, la cible la plus sensible.
  3. Écouter le réseauSuricata en IDS passif, avec 50 682 règles Emerging Threats Open actives : il observe sans bloquer, le temps de connaître le trafic normal.
  4. Poser un leurreOpenCanary simule des services tentants pour un attaquant, sur sa propre VM isolée. Personne n'a de raison de s'y connecter : ses événements lèvent une alerte de niveau 13 sur 15.
  5. Réparer l'annotation MITRE ATT&CKElle n'avait jamais fonctionné : deux pannes se cumulaient. Après réinstallation du manager, elle est active, sans perte de règles ni d'intégrations.
Voir les détails techniques

Serveur. 400 Go de disque. Ubuntu Server 22.04 LTS est la plateforme que l'éditeur de Wazuh teste en priorité, avec cinq ans de support. Manager, indexer (OpenSearch) et tableau de bord sont installés ensemble par le script officiel ; le mot de passe administrateur, affiché une fois, est rangé dans un coffre dédié.

Terminal Linux : journal du script wazuh-install.sh montrant l'installation et le démarrage successifs de l'indexer, du manager, de Filebeat et du dashboard ; le mot de passe administrateur est masqué.
Fig. 1Installation tout-en-un de Wazuh (indexer, manager, Filebeat et dashboard) terminée sans erreur en environ 8 minutes.

Machines. Intégrité des fichiers (FIM) en temps réel plutôt qu'en scan périodique, avec report_changes : l'alerte contient le détail du changement. Le contrôle de configuration (SCA) tourne toutes les douze heures ; faute de vue consolidée, j'ai lu le score de chaque agent par l'API REST, avec un jeton JWT. Auditd surveille sur le SIEM les commandes des comptes à privilèges, les accès à la configuration de Wazuh et les règles du pare-feu local. Les autres protections de ce serveur font l'objet d'un projet à part.

Bash · API REST Wazuh

# 1. Obtenir un jeton JWT (mot de passe masqué)
TOKEN=$(curl -sk -u wazuh:'********' -X POST \
  'https://localhost:55000/security/user/authenticate' \
  | python3 -c 'import sys,json; print(json.load(sys.stdin)["data"]["token"])')

# 2. Score SCA d'un agent (ici le 001), puis la même requête pour chaque agent actif
curl -sk -H "Authorization: Bearer $TOKEN" 'https://localhost:55000/sca/001?pretty=true'

Réseau. Suricata en mode af-packet multi-threads. Parmi les règles désactivées : celles des protocoles industriels (Modbus, DNP3), sans objet ici. Un IPS mal calibré peut couper un flux légitime ; un passage en blocage, sur quelques règles maîtrisées, ne viendrait qu'ensuite. Pour valider la chaîne de bout en bout, une alerte simulée de scan SSH a déclenché la règle Wazuh 86601 (« ET SCAN Potential SSH Scan », niveau 3, signature ET 2001219).

Wazuh · ossec.conf

<ossec_config>
  <localfile>
    <log_format>json</log_format>
    <location>/var/log/suricata/eve.json</location>
  </localfile>
</ossec_config>

Leurre. Sa propre VM, pour qu'un attaquant qui chercherait à en sortir n'atterrisse pas sur l'outil qui surveille tout le reste ; une machine dédiée est aussi plus crédible. La règle se déclenche dès qu'un événement contient « opencanary ».

Wazuh · local_rules.xml

<group name="local,">
  <!-- Règle racine : parent local, ne produit aucune alerte -->
  <rule id="100001" level="0">
    <match>.</match>
    <description>Regle racine locale.</description>
  </rule>

  <!-- Toute trace du leurre : alerte de niveau 13 -->
  <rule id="100002" level="13">
    <if_sid>100001</if_sid>
    <match>opencanary</match>
    <description>OpenCanary: Intrusion detectee sur le honeypot</description>
  </rule>
</group>

MITRE, panne 1 : l'interface de Wazuh ne répond plus

Problème

Interface web bloquée, tableaux de bord inaccessibles. Lancé au premier plan, le moteur d'analyse montrait que le fichier d'archive du jour appartenait à root au lieu de wazuh : il refusait de démarrer.

Résolution

Correction récursive des propriétaires des journaux de Wazuh : API, interface et moteur sont repartis aussitôt.

MITRE, panne 2 : la base de référence ne se régénère pas

Problème

La détection fonctionnait, mais aucune alerte n'était annotée. La base MITRE interne était corrompue ; la supprimer ne la régénérait pas, et l'extraire du paquet ne donnait qu'une coquille vide, non compilée.

Résolution

Réinstallation du manager, dont les scripts officiels de post-installation compilent cette base ; la version de Wazuh a été mise à jour au passage. Un test de force brute SSH, remonté par un agent Windows, a confirmé l'annotation.

L'incident

Le mode test de Wazuh ne trouve plus aucune règle

Problème

Pour valider la règle du leurre, le mode test du moteur (wazuh-analysisd -t) ne chargeait pas les règles de base : faux négatif systématique. La règle n'était pas fausse, le test l'était.

Résolution

Deux règles locales : une racine de niveau 0 sert de parent, la règle du leurre en hérite par if_sid. Test direct en production, après redémarrage du manager.

Résultats

Architecture du SOC : trois sources de journaux convergent vers le serveur SIEM, qui héberge Wazuh, Suricata et Auditd ; le leurre, sur une VM isolée, envoie ses événements en Syslog. Sources de journaux Agents Windows / AD journaux, FIM, SCA Pare-feu journaux en Syslog Microsoft 365 messagerie, Azure Serveur SIEM Ubuntu sur Hyper-V Wazuh Manager décodeurs, règles, MITRE Indexer + Dashboard vues MITRE, PCI-DSS, RGPD Suricata (IDS passif) ET Open, 50 682 règles Auditd surveille le SIEM lui-même VM dédiée et isolée Leurre OpenCanary simule des services tentants pour un attaquant Syslog Machine du réseau qui touche le leurre connexion
Fig. 2Les journaux convergent vers le serveur SIEM. Suricata et Auditd tournent sur ce même serveur ; le leurre, sur sa propre VM, envoie ses événements en Syslog.

Une requête HTTP vers le leurre fait apparaître l'alerte en moins de 30 secondes. Il détecte une connexion à lui-même, pas tout mouvement latéral, et un outil d'inventaire légitime peut le toucher : chaque alerte se qualifie avant réaction.

La première mesure CIS des postes Windows a donné 28 à 29 %, le score attendu sans GPO de durcissement. Chaque contrôle en échec indique la GPO qui le corrige : une liste de travail. Les tableaux PCI-DSS et RGPD de Wazuh classent les alertes par exigence : utile pour préparer un audit, sans prouver la conformité.

Tableau de bord Wazuh PCI DSS : liste des exigences avec leur nombre d'alertes, l'exigence 10 (journalisation) et l'exigence 11 (tests de sécurité) en tête.
Fig. 3Module de conformité PCI DSS de Wazuh : les alertes sont rattachées aux exigences, dont 49 728 pour l'exigence 10 et 18 793 pour l'exigence 11.

Ce SOC est le premier volet d'un même projet, mené en juin 2026 ; le second protège le serveur SIEM lui-même et fait expliquer ses alertes par une IA locale. Ensuite, l'audit de l'Active Directory a ajouté au SIEM l'audit avancé des contrôleurs de domaine, et un cyber range en homelab a montré ce qu'une chaîne pare-feu → SIEM laisse passer.

Ce que j'améliorerais

  • Prévoir dès la conception un port miroir (SPAN) sur le switch cœur : un IDS ne détecte que le trafic qu'on lui montre.
  • Suivre dès le départ la couverture du parc, « agents actifs / machines inventoriées », pour savoir ce que le SIEM ne voit pas.
  • Ajouter une réponse active pas à pas, en commençant par le leurre : observer quels outils légitimes le touchent, puis bloquer temporairement l'adresse source.

Compétences

  • Architecture de détection en couches
  • Administration d'un SIEM Wazuh
  • Détection réseau avec Suricata
  • Leurre et qualification d'alertes
  • Dépannage en production
  • MITRE ATT&CK et CIS Benchmarks