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 :
| Origine | Exemples |
|---|---|
| Humaine | Phishing, ingénierie sociale, vol de matériel, ancien salarié mécontent |
| Logicielle | Services mal configurés, failles non corrigées |
| Matérielle | Vieux routeurs ou switchs dont le firmware n’est plus mis à jour |
| Résultat | Trojans / 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 machine | Une sonde placée sur le passage du trafic |
| Ce qu’il voit | Fichiers modifiés, journaux, rootkits, conformité, logiciels vulnérables | Paquets : scans, exploits connus, trafic suspect |
| Exemples | Wazuh (basé sur OSSEC), OSSEC, AIDE | Suricata, Snort, Zeek |
| Limite | Une machine sans agent est invisible | Le 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 -dInterface : 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-agentDans 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.1Envoyer 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
- Un serveur web a un fichier PHP inconnu dans
/var/www. Quel outil l’aurait signalé, et grâce à quelle fonction ? - Pourquoi un NIDS ne voit-il pas une attaque dans une requête HTTPS ?
- Pourquoi
lsmodne montre-t-il pas Diamorphine ?
Correction
- Le HIDS (Wazuh) grâce à la surveillance d’intégrité des fichiers (FIM) : création d’un fichier dans un dossier surveillé. C’est typiquement un webshell.
- Le contenu est chiffré par TLS : la sonde ne voit que l’IP, le port, et le nom du site. Il faut analyser sur le serveur (HIDS, journaux) ou déchiffrer au niveau d’un reverse proxy.
- C’est un rootkit noyau : il modifie le noyau lui-même pour se retirer de la liste des modules. Les outils qui demandent au noyau compromis voient donc une liste falsifiée.
Erreurs fréquentes / dépannage
| Symptôme | Cause probable |
|---|---|
| L’indexeur Wazuh redémarre en boucle | vm.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 rien | Mauvaise interface (-i eth0), ou le trafic ne passe pas par la sonde |
| Aucune alerte avec testmynids.org | Règles pas téléchargées : suricata-update |
Voir aussi
- P04 - Supervision (SNMP, Zabbix) · S03 - Pare-feu Linux (iptables et nftables) · P09 - Cybersécurité (RGPD, ANSSI, PKI) · P21 - Forensique (analyse après incident)
- Cours complet : cours de lidstah · cours de lidstah
- Retour : P00 - Programme pas encore vu