P16 - Détection d’intrusion : HIDS (Wazuh) et NIDS (Suricata)

Objectif

Savoir ce que sont un HIDS (surveille une machine) et un NIDS (surveille le réseau), installer Wazuh et son agent, brancher Suricata dessus, et comprendre pourquoi un rootkit échappe aux commandes habituelles.

Source

Fiche rédigée à partir de cours de lidstah (TP de lidstah).


1. Superviser ne suffit pas

La supervision (P04 - Supervision (SNMP, Zabbix)) dit si les machines fonctionnent. Elle ne dit pas si elles sont compromises. Menaces citées par le cours :

OrigineExemples
HumainePhishing, ingénierie sociale, vol de matériel, ancien salarié mécontent
LogicielleServices mal configurés, failles non corrigées
MatérielleVieux routeurs ou switchs dont le firmware n’est plus mis à jour
RésultatTrojans / rootkits / backdoors, spywares (keyloggers), webshells, ransomwares

2. HIDS ou NIDS ?

flowchart LR
  INT["Internet"] --> R["Routeur / pare-feu"]
  R --> N["NIDS Suricata<br/>(analyse le trafic)"]
  N --> LAN["Réseau interne"]
  LAN --> S1["Serveur web<br/>+ agent Wazuh"]
  LAN --> S2["Serveur BDD<br/>+ agent Wazuh"]
  S1 & S2 & N -->|"événements"| W["Manager Wazuh<br/>(tableau de bord, alertes)"]
HIDS (Host)NIDS (Network)
OùUn agent sur chaque machineUne sonde placée sur le passage du trafic
Ce qu’il voitFichiers modifiés, journaux, rootkits, conformité, logiciels vulnérablesPaquets : scans, exploits connus, trafic suspect
ExemplesWazuh (basé sur OSSEC), OSSEC, AIDESuricata, Snort, Zeek
LimiteUne machine sans agent est invisibleLe trafic chiffré est opaque

IDS ou IPS ?

Un IDS détecte et alerte. Un IPS (Prevention) bloque en plus. Suricata sait faire les deux selon son mode.

3. Wazuh (HIDS)

Wazuh = serveur (manager + indexeur + tableau de bord) + agents (Linux, Windows, macOS…). Il vérifie la conformité (CIS, PCI-DSS, RGPD, MITRE ATT&CK), surveille l’intégrité des fichiers (FIM), lit les journaux et liste les CVE des paquets installés.

Serveur en labo (Docker)

Besoin : VM 2 vCPU minimum, 4 Go de RAM conseillés (le moteur de recherche est gourmand).

sudo apt install docker.io docker-compose git
sudo usermod -aG docker "$USER"            # puis se reconnecter
# réglage noyau demandé par l'indexeur
echo "vm.max_map_count=262144" | sudo tee /etc/sysctl.d/10-vmmaxmap.conf
sudo sysctl --system
 
git clone https://github.com/wazuh/wazuh-docker.git -b v4.7.0
cd wazuh-docker/single-node
docker-compose -f generate-indexer-certs.yml run --rm generator   # certificats de test
docker-compose up -d

Interface : https://IP_DE_LA_VM, compte par défaut admin / SecretPassword → à changer immédiatement.

Agent sur une machine à surveiller (Debian)

sudo apt install curl gnupg
# clé du dépôt (méthode moderne, apt-key est obsolète)
curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | sudo gpg --dearmor -o /usr/share/keyrings/wazuh.gpg
echo "deb [signed-by=/usr/share/keyrings/wazuh.gpg] https://packages.wazuh.com/4.x/apt/ stable main" | sudo tee /etc/apt/sources.list.d/wazuh.list
sudo apt update
# l'astuce : l'IP du manager est passée dans une variable au moment de l'installation
sudo WAZUH_MANAGER="10.50.0.1" apt install wazuh-agent
grep -A2 '<server>' /var/ossec/etc/ossec.conf     # doit contenir la vraie IP, pas MANAGER_IP
sudo systemctl enable --now wazuh-agent

Dans l’interface, la machine apparaît avec ses non-conformités (et la correction proposée pour chacune). Bonne pratique : appliquer ces corrections avec Ansible (P10 - Automatisation avec Ansible) plutôt qu’à la main.

Le TP rootkit (sur une VM jetable !)

Diamorphine est un module noyau de démonstration qui se cache : il n’apparaît pas dans lsmod, et permet à un utilisateur de devenir root (kill -64 0). On compare ensuite ce que voient chkrootkit, rkhunter et Wazuh.

Uniquement en VM de labo isolée

Un rootkit chargé dans le noyau compromet toute la machine. On utilise une VM dédiée, qu’on supprime après le TP.

4. Suricata (NIDS)

Placement : entre le routeur d’entrée et le réseau (ou sur un port miroir du switch). En labo, une VM sert de routeur + sonde :

# Suricata en conteneur, qui écoute l'interface eth0 de l'hôte
# (image jasonish/suricata, network_mode: host, cap_add NET_ADMIN — voir la page lidstah)
docker exec -it suricata_suricata_1 suricata-update   # télécharger les règles
docker exec -it suricata_suricata_1 tail -f /var/log/suricata/fast.log
 
# depuis une machine qui passe par la sonde : déclencher une règle de test
curl http://testmynids.org/uid/index.html
# → alerte « GPL ATTACK_RESPONSE id check returned root »

Faire de la VM un routeur pour le poste de test :

# activer le routage
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/90-routage.conf && sudo sysctl --system
# NAT du réseau interne vers l'extérieur
sudo iptables -t nat -A POSTROUTING -s 192.168.110.0/24 -o eth0 -j MASQUERADE
# sur le poste de test : passer par la sonde
sudo ip route replace default via 192.168.110.1

Envoyer les alertes Suricata dans Wazuh : installer l’agent Wazuh sur la sonde, puis ajouter dans /var/ossec/etc/ossec.conf (avant </ossec_config>) :

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

Redémarrer l’agent, puis chercher rules.groups:suricata dans Security Events. Alternative tout-en-un : SELKS (8 Go de RAM minimum).

Exercices

  1. Un serveur web a un fichier PHP inconnu dans /var/www. Quel outil l’aurait signalé, et grâce à quelle fonction ?
  2. Pourquoi un NIDS ne voit-il pas une attaque dans une requête HTTPS ?
  3. Pourquoi lsmod ne montre-t-il pas Diamorphine ?

Erreurs fréquentes / dépannage

SymptômeCause probable
L’indexeur Wazuh redémarre en bouclevm.max_map_count pas réglé ou pas assez de RAM
Agent « never connected »MANAGER_IP resté dans ossec.conf, ou ports 1514/1515 bloqués
Suricata ne voit rienMauvaise interface (-i eth0), ou le trafic ne passe pas par la sonde
Aucune alerte avec testmynids.orgRègles pas téléchargées : suricata-update

Voir aussi