Tutoriel

Self-host Wazuh sur VPS : SOC en moins d'une heure

Sécurité & Monitoring9 min de lecture9 étapes

La directive NIS2 oblige les entités essentielles et importantes à mettre en place des outils de journalisation, de surveillance et de réponse aux incidents (article 21). En parallèle, les CVE récentes sur Jira, Confluence et GitLab rappellent qu'un périmètre non observé est un périmètre compromis en silence. Wazuh est un SIEM open source actif qui couvre exactement ces trois exigences — et sa distribution Docker Compose officielle permet de le déployer sur un seul nœud VPS en moins d'une heure, sans expertise préalable en infrastructure de sécurité.

Sommaire· Pourquoi Wazuh pour répondre à NIS2 art. 211/11
  1. 01Pourquoi Wazuh pour répondre à NIS2 art. 21
  2. 02Wazuh vs alternatives SIEM self-hosted
  3. 03Prérequis matériels et logiciels
  4. 04Ce que Wazuh surveille dès l'activation des agents
  5. 05Déploiement pas à pas sur un VPS Debian/Ubuntu
  6. 06Architecture du stack single-node
  7. 07Configurer la rétention et les alertes email
  8. 08Générer des rapports de conformité NIS2 / GDPR
  9. 09Mettre à jour Wazuh sans perdre les données
  10. 10Dépannage — erreurs courantes
  11. 11Erreurs fréquentes et remèdes

Pourquoi Wazuh pour répondre à NIS2 art. 21

L'article 21 de NIS2 impose quatre capacités : la journalisation des événements, la détection des incidents, la réponse et la notification. Wazuh couvre les trois premières nativement — collecte de logs, règles de détection, réponse active — et son tableau de bord produit les rapports d'audit nécessaires à la quatrième. Contrairement à un SIEM SaaS, les données restent sur votre infrastructure : aucun transfert vers des serveurs tiers, ce qui simplifie aussi la conformité RGPD pour les entités traitant des données personnelles. La version 4.14.8 (publiée le 25 septembre 2026) est la version stable actuelle ; elle regroupe le manager Wazuh, l'indexeur (moteur de recherche basé sur OpenSearch) et le tableau de bord dans un seul stack Docker Compose.

Wazuh vs alternatives SIEM self-hosted

Faites défiler le tableau

OutilLicenceStack déploiementCouverture NIS2 art. 21
Wazuh 4.14GPLv2 (manager) / Apache 2 (indexer)Docker Compose officielJournalisation + détection + réponse active
Elastic SIEMSSPL (Elastic Stack)Docker ou packagesJournalisation + détection (réponse via SOAR externe)
Graylog OpenSSPLDocker ComposeJournalisation (détection limitée sans plugins)
Security OnionGPLv2ISO bare-metal ou VMComplet mais nécessite un serveur dédié

Prérequis matériels et logiciels

Les prérequis officiels pour un déploiement single-node couvrant jusqu'à 25 agents sont : 4 vCPU, 8 Go de RAM et 50 Go de stockage (pour 90 jours de données indexées). Un VPS de gamme intermédiaire suffit pour une équipe jusqu'à 25 postes ou serveurs surveillés ; au-delà de 50 agents, passez à 8 vCPU et envisagez un volume supplémentaire. Côté logiciel, vous avez besoin de Docker Engine (version 24 minimum), Docker Compose v2, et Git. Le noyau Linux doit autoriser au moins 262 144 zones mémoire virtuelles pour l'indexeur — sans quoi le service refuse de démarrer.

Ce que Wazuh surveille dès l'activation des agents

  • Intégrité des fichiers (FIM) — détecte toute modification, création ou suppression sur les chemins critiques (/etc, /bin, /usr/bin par défaut)
  • Journaux système — collecte et indexe les logs d'authentification, syslog, journald et les logs applicatifs configurés
  • Évaluation de la configuration (SCA) — compare l'état réel du système aux benchmarks CIS pour Ubuntu, Debian, RHEL et Windows
  • Détection de rootkits — analyse les processus cachés et les anomalies du noyau via rootcheck
  • Vulnérabilités — corrèle les paquets installés sur les agents avec les CVE de la National Vulnerability Database
  • Réponse active — bloque automatiquement une IP après N tentatives d'authentification échouées, sans agent SOAR tiers
  • Logs cloud — ingère les events AWS CloudTrail, Azure Activity Log et GCP Audit Log via des modules dédiés

Déploiement pas à pas sur un VPS Debian/Ubuntu

  1. Préparer le système

    Mettez à jour les paquets et installez les dépendances :

    apt update && apt upgrade -y
    apt install -y docker.io docker-compose-v2 git curl
    systemctl enable --now docker

    Ajoutez votre utilisateur non-root au groupe docker si nécessaire :

    usermod -aG docker $USER
  2. Configurer vm.max_map_count

    L'indexeur Wazuh (OpenSearch) exige au moins 262 144 zones de mémoire virtuelle. Appliquez le paramètre à chaud et rendez-le permanent :

    sysctl -w vm.max_map_count=262144
    echo 'vm.max_map_count=262144' >> /etc/sysctl.conf

    Sans cette étape, le conteneur wazuh.indexer s'arrête avec l'erreur max virtual memory areas vm.max_map_count [65530] is too low.

  3. Cloner le dépôt officiel

    Clonez la branche correspondant à la version stable actuelle :

    git clone https://github.com/wazuh/wazuh-docker.git -b v4.14.8
    cd wazuh-docker/single-node/

    Le répertoire single-node/ contient le docker-compose.yml principal et le generate-indexer-certs.yml nécessaire à l'étape suivante.

  4. Générer les certificats TLS inter-services

    Wazuh chiffre toutes les communications internes (manager → indexer → dashboard). Générez les certificats avec l'utilitaire fourni :

    docker compose -f generate-indexer-certs.yml run --rm generator

    Les certificats sont déposés dans config/wazuh_indexer_ssl_certs/. Ne les régénérez pas sans recréer le stack entier — les certificats sont signés mutuellement.

  5. Démarrer le stack

    Lancez les trois services en arrière-plan :

    docker compose up -d

    Suivez le démarrage en temps réel :

    docker compose logs -f

    L'indexeur a besoin d'environ 60 secondes pour être prêt. Attendez la ligne Node 'node-1' initialized avant de continuer.

  6. Accéder au tableau de bord et changer le mot de passe

    Ouvrez https://IP-DU-VPS dans votre navigateur. Acceptez l'avertissement de certificat auto-signé pour la première connexion. Identifiants par défaut : utilisateur admin, mot de passe SecretPassword. Changez immédiatement le mot de passe via Security → Internal users → admin → Edit. Pour une automatisation en ligne de commande :

    docker exec -it single-node-wazuh.manager-1 \
      /var/ossec/bin/wazuh-passwords-tool.sh \
      -u admin -p 'NouveauMotDePasse!'
  7. Ouvrir les ports firewall nécessaires

    Sur le VPS, autorisez le trafic entrant pour les agents et le tableau de bord :

    ufw allow 443/tcp   # Dashboard HTTPS
    ufw allow 1514/tcp  # Agents (protocole Wazuh)
    ufw allow 1515/tcp  # Enregistrement des agents
    ufw allow 514/udp   # Réception syslog
    ufw allow 55000/tcp # API REST Wazuh (restreindre à vos IP)
    ufw enable

    Restreignez le port 55000 à vos IP de gestion uniquement (ufw allow from 203.0.113.10 to any port 55000).

  8. Installer l'agent Wazuh sur un serveur à surveiller

    Sur chaque machine à observer, installez l'agent et pointez-le vers votre VPS. Exemple sur Debian/Ubuntu :

    curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | 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" \
      > /etc/apt/sources.list.d/wazuh.list
    apt update && apt install -y wazuh-agent
    WAZUH_MANAGER='IP-DE-VOTRE-VPS' \
    WAZUH_AGENT_NAME='votre-serveur-01' \
      dpkg-reconfigure wazuh-agent
    systemctl enable --now wazuh-agent

    L'agent apparaît dans le tableau de bord sous Agents dans les 30 secondes suivant son enregistrement.

  9. Maillage — aller plus loin

    Pour renforcer votre posture de sécurité au-delà de Wazuh, consultez nos guides connexes : [nis2-securite-informatique-hebergement-obligations] pour les obligations légales détaillées, [crowdsec-vs-fail2ban-securite-vps] pour le blocage collaboratif en amont au niveau réseau, et [zitadel-sso-self-hosted-vps] pour centraliser l'authentification et réduire la surface d'attaque sur votre tableau de bord Wazuh.

Architecture du stack single-node

Le stack Docker Compose officiel déploie trois services interdépendants. Le manager Wazuh est le cœur : il reçoit les événements des agents via le port 1514, applique les règles de détection, déclenche les réponses actives et transmet les alertes à l'indexeur. L'indexeur Wazuh (OpenSearch) stocke et rend ces alertes interrogeables ; il communique avec le manager sur le port 9200 et nécessite les ressources noyau spécifiques au moteur de recherche. Le tableau de bord Wazuh expose l'interface utilisateur sur le port 443 et interroge l'indexeur en HTTPS. Les trois services partagent des certificats TLS autosignés générés à l'étape de préparation ; modifier l'un sans régénérer les autres provoque des erreurs de validation mutuelle. Les données persistantes — configuration du manager, queue d'alertes, données d'index — sont stockées dans des volumes Docker nommés, séparés du cycle de vie des conteneurs : une mise à jour par remplacement d'image ne perd pas l'historique.

Configurer la rétention et les alertes email

Par défaut, Wazuh conserve les données 90 jours. Pour ajuster la rétention, modifiez le paramètre max_age dans le fichier de politique ISM de l'indexeur, accessible via Index Management → Policies dans le tableau de bord. Vous pouvez par exemple porter la rétention à 180 jours pour répondre aux exigences NIS2 de conservation des journaux, ou la réduire à 30 jours sur un VPS au stockage limité. Pour les alertes email, éditez /var/ossec/etc/ossec.conf dans le conteneur manager — ajoutez un bloc <email_notification> avec votre serveur SMTP et les niveaux d'alerte souhaités (niveau 7 et au-dessus est un bon point de départ pour les alertes critiques, niveau 5 pour inclure les alertes moyennes). Wazuh peut aussi envoyer des notifications via des webhooks vers Slack, Teams ou PagerDuty grâce à son mécanisme d'intégration. Redémarrez le manager après chaque modification de configuration :

docker compose restart wazuh.manager

Générer des rapports de conformité NIS2 / GDPR

Le tableau de bord Wazuh inclut des tableaux dédiés aux frameworks de conformité : GDPR, PCI DSS, HIPAA et NIST 800-53. Ces tableaux permettent d'exporter des rapports PDF listant les contrôles couverts et les événements associés — utiles pour justifier votre posture auprès d'un auditeur ou d'une autorité compétente NIS2. Pour NIS2 spécifiquement, utilisez la vue GDPR comme base (les obligations de journalisation et de détection se recoupent largement) et complétez avec les règles de détection d'incidents classées par catégorie Mitre ATT&CK disponibles sous Threat intelligence → Mitre ATT&CK. NIS2 imposant une notification dans les 72 heures suivant la détection d'un incident significatif, configurez des alertes de niveau 12 (critique) pour déclencher immédiatement une notification — Wazuh inclut des règles prêtes à l'emploi pour les tentatives d'exploitation de CVE connues, les mouvements latéraux et les escalades de privilèges. La vue d'ensemble Security events filtrée par agent fournit le contexte chronologique nécessaire pour rédiger la notification réglementaire.

Activez la politique de mots de passe forts dans Wazuh dès l'installation : sous Security → Security settings, cochez 'Require complex passwords' et 'Enable audit logging'. Ces deux options sont désactivées par défaut et doivent être activées manuellement avant la mise en production.

Mettre à jour Wazuh sans perdre les données

Les données de l'indexeur sont persistées dans des volumes Docker nommés. La procédure de mise à jour consiste à cloner la nouvelle version du dépôt dans un répertoire séparé, à copier les volumes existants, puis à redémarrer le stack. La documentation officielle recommande une sauvegarde des volumes avant toute mise à jour majeure :

docker run --rm \
  -v single-node_wazuh-indexer-data:/data \
  -v $(pwd)/backup:/backup \
  alpine tar czf /backup/indexer-data-$(date +%Y%m%d).tar.gz /data

Pour une mise à jour de version mineure (ex. 4.14.7 → 4.14.8), il suffit de mettre à jour le tag dans le docker-compose.yml et de relancer avec docker compose up -d --pull always.

Dépannage — erreurs courantes

Voici les cinq erreurs les plus fréquentes lors d'un premier déploiement Wazuh Docker, avec leurs causes et remèdes.

Erreurs fréquentes et remèdes

  • max virtual memory areas vm.max_map_count [65530] is too low — Le paramètre noyau n'a pas été appliqué. Exécutez sysctl -w vm.max_map_count=262144 et vérifiez avec sysctl vm.max_map_count avant de relancer le stack.
  • Connection refused sur le port 443 après docker compose up -d — L'indexeur n'est pas encore prêt. Attendez 60 à 90 secondes et consultez docker compose logs wazuh.indexer pour confirmer l'initialisation du nœud.
  • Agent disconnected dès l'enregistrement — Le port 1514/TCP ou 1515/TCP est bloqué côté VPS. Vérifiez ufw status et les règles de sécurité réseau de votre hébergeur (groupes de sécurité cloud).
  • certificate verify failed dans les logs du dashboard — Les certificats auto-générés ne correspondent pas à l'IP ou au hostname utilisé. Régénérez les certificats (docker compose -f generate-indexer-certs.yml run --rm generator) après avoir vérifié que WAZUH_DASHBOARD_HOST dans le docker-compose.yml correspond à votre IP ou nom de domaine.
  • Wazuh API 401 Unauthorized — Le changement de mot de passe admin n'a pas été propagé à la configuration du dashboard. Après modification du mot de passe, mettez également à jour DASHBOARD_PASSWORD dans le fichier .env ou dans les variables d'environnement du service wazuh.dashboard, puis redémarrez avec docker compose restart wazuh.dashboard.

Un VPS taillé pour Wazuh

Nos VPS professionnels incluent des configurations optimisées pour les charges SIEM : 8 vCPU, 16 Go de RAM, stockage NVMe rapide et réseau isolé. Déployez Wazuh en production avec la bande passante et les ressources qu'il mérite.

Besoin d'aide ?

Parcourez notre centre d'aide et notre FAQ, ou contactez notre équipe — rappel, WhatsApp ou e-mail. Support en français, anglais et arabe.

Écrire sur WhatsApps'ouvre dans un nouvel onglet