# Wazuh SIEM — Guide de configuration complet
> **Guide pas à pas** — Installation et configuration de Wazuh Manager, Agent et Dashboard sur Ubuntu Server avec hardening de base, SSH sécurisé, pare-feu UFW et Fail2Ban.
---
## Table des matières
1. [Configuration réseau (Netplan)](#1--configuration-réseau-netplan)
2. [Hardening de base du serveur](#2--hardening-de-base-du-serveur)
3. [Sécurisation SSH + UFW + Fail2Ban](#3--sécurisation-ssh--ufw--fail2ban)
4. [Installation Wazuh Manager](#4--installation-wazuh-manager)
5. [Installation Wazuh Agent](#5--installation-wazuh-agent)
6. [Compatibilité des versions Agent/Manager/Dashboard](#6--compatibilité-des-versions-agentmanagerdashboard)
7. [Script d'automatisation de reconnexion](#7--script-dautomatisation-de-reconnexion)
---
## Prérequis
- **Ubuntu Server** 20.04 ou 22.04 LTS installé
- Deux VMs : une pour le **Manager Wazuh** (`192.168.10.20`) et une pour le **serveur durci + Agent** (`192.168.10.10`)
- Accès root ou sudo sur les deux machines
### Architecture cible
```
┌──────────────────────┐ ┌──────────────────────┐
│ Ubuntu Hardened │ │ Wazuh Manager │
│ (Agent) │──1514──▶│ (Server + Dashboard)│
│ IP: 192.168.10.10 │ │ IP: 192.168.10.20 │
└──────────────────────┘ └──────────────────────┘
```
---
## 1 — Configuration réseau (Netplan)
### 1.1 — Éditer la configuration Netplan
```bash
sudo nano /etc/netplan/00-installer-config.yaml
```
Exemple de configuration avec IP statique :
```yaml
network:
version: 2
ethernets:
ens33:
dhcp4: true
ens37:
addresses: [192.168.10.10/24]
gateway4: 192.168.10.1
nameservers:
addresses: [8.8.8.8]
```

> Le fichier Netplan définit les interfaces réseau. Ici, `ens33` est en DHCP (accès Internet via NAT) et `ens37` a une IP statique sur le réseau interne (`192.168.10.10/24`).
### 1.2 — Tester et appliquer
```bash
sudo netplan try # Teste sans appliquer (rollback automatique si erreur)
sudo netplan apply # Applique définitivement
ip a # Vérifie les IP attribuées
```

> ✅ La commande `ip a` confirme que l'IP `192.168.10.10` est bien attribuée à l'interface `ens37`.
> **💡 En cas de problème :** `sudo systemctl restart systemd-networkd` ou en dernier recours `sudo reboot`.
---
## 2 — Hardening de base du serveur
### 2.1 — Mise à jour et outils de sécurité
```bash
sudo apt update && sudo apt upgrade -y
sudo apt install apparmor apparmor-profiles apparmor-utils auditd
sudo systemctl enable --now apparmor
```

> On installe **AppArmor** (contrôle d'accès obligatoire) et **auditd** (journalisation des événements système). Ces outils renforcent la sécurité du noyau Linux.
### 2.2 — Mises à jour automatiques
```bash
sudo apt install unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades
```

> Les mises à jour de sécurité s'installeront automatiquement. C'est une bonne pratique pour limiter les vulnérabilités connues.
### 2.3 — Durcissement du noyau via sysctl
```bash
sudo mkdir -p /etc/sysctl.d
sudo nano /etc/sysctl.d/99-hardening.conf
```
Ajoutez les paramètres suivants :
```
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.rp_filter = 1
```

> Ces paramètres désactivent le routage IP, les redirections ICMP et le source routing — des vecteurs d'attaque réseau courants.
Appliquer les changements :
```bash
sudo sysctl --system
```

> ✅ Les paramètres sont appliqués immédiatement sans redémarrage.
### 2.4 — Vérifier les mises à jour automatiques
```bash
cat /etc/apt/apt.conf.d/20auto-upgrades
```

> ✅ Les deux lignes `APT::Periodic::Update-Package-Lists` et `APT::Periodic::Unattended-Upgrade` doivent être à `"1"`.
---
## 3 — Sécurisation SSH + UFW + Fail2Ban
### 3.1 — Vérifier que SSH est installé et actif
```bash
which sshd
```

> La commande confirme que le binaire `sshd` est bien installé sur le système.
```bash
sudo systemctl start ssh
sudo systemctl enable ssh
sudo systemctl status ssh
```

> ✅ Le service SSH est démarré et configuré pour se lancer automatiquement au boot.
### 3.2 — Durcir la configuration SSH
```bash
sudo nano /etc/ssh/sshd_config
```
Modifiez ces lignes :
```
PermitRootLogin no
PasswordAuthentication no
Port 22
```

> On interdit la connexion root et l'authentification par mot de passe. Seules les clés SSH seront acceptées.
### 3.3 — Générer et configurer les clés SSH
#### Vérifier si une clé existe
```bash
ls ~/.ssh/id_rsa.pub
```

> Si le fichier existe, vous avez déjà une paire de clés.
#### Sinon, en créer une
```bash
ssh-keygen -t rsa -b 4096
```

> La clé privée est stockée dans `/home/abder/.ssh/id_rsa`. Ne la partagez jamais.

> ✅ La paire de clés (privée + publique) est créée.
#### Ajouter la clé publique sur la VM
```bash
mkdir -p ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
```
Collez votre clé publique (format `ssh-rsa AAAAB3Nza...`), puis :
```bash
chmod 600 ~/.ssh/authorized_keys
```

> La clé publique est enregistrée. La VM acceptera maintenant les connexions SSH avec cette clé.
#### Tester la connexion AVANT de redémarrer SSH
```bash
ssh -i ~/.ssh/id_rsa -p 22 abder@192.168.10.10
```

> ✅ La connexion SSH par clé fonctionne sans mot de passe. On peut maintenant redémarrer le service SSH en toute sécurité.
```bash
sudo systemctl restart ssh
```
### 3.4 — Configurer UFW (pare-feu)
```bash
sudo apt install ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw enable
sudo ufw status verbose
```

> ✅ Le pare-feu est actif. Seul le port 22 (SSH) est autorisé en entrée. Tout le reste est bloqué.
### 3.5 — Installer Fail2Ban
```bash
sudo apt install fail2ban
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban
```

> ✅ Fail2Ban surveille les tentatives de connexion SSH échouées et bannit automatiquement les IP suspectes.
---
## 4 — Installation Wazuh Manager
### 4.1 — Préparer la VM Manager
#### Mettre à jour le système
```bash
sudo apt update && sudo apt upgrade -y
```
#### Configurer le réseau (IP statique)
```bash
sudo nano /etc/netplan/00-installer-config.yaml
```
```yaml
network:
version: 2
ethernets:
ens33:
dhcp4: true # NAT avec Internet
ens37:
dhcp4: false
addresses: [192.168.10.20/24]
nameservers:
addresses: [8.8.8.8]
```
```bash
sudo netplan try
sudo netplan apply
ip a
```

> ✅ L'IP `192.168.10.20` est attribuée à la VM qui hébergera Wazuh Manager.
### 4.2 — Télécharger et installer Wazuh
```bash
curl -sO https://packages.wazuh.com/4.7/wazuh-install.sh
ls -l wazuh-install.sh
```

> Le script officiel Wazuh est téléchargé. Il installe automatiquement le Manager, l'Indexer et le Dashboard.
```bash
sudo bash ./wazuh-install.sh -a -i
```
> ⏱️ L'installation prend **5 à 15 minutes**. À la fin, le script affiche les identifiants de connexion au dashboard.

> **⚠️ Important :** Copiez et conservez le **nom d'utilisateur** et le **mot de passe** affichés à la fin de l'installation. Ils sont nécessaires pour se connecter au dashboard.
### 4.3 — Vérifier le service
```bash
sudo systemctl status wazuh-manager
```

> ✅ Le service Wazuh Manager est `active (running)`.
### 4.4 — Accéder au dashboard web
Ouvrez dans votre navigateur :
```
https://192.168.10.20:443
```
> ⚠️ Un avertissement de certificat auto-signé apparaîtra. C'est normal en installation locale — cliquez sur **"Avancé" → "Accepter le risque"**.

> Le certificat SSL est auto-signé car nous n'utilisons pas de domaine avec un certificat validé par une autorité.
#### Se connecter avec les identifiants générés

> Utilisez les identifiants copiés lors de l'installation. Par exemple : `admin` / `28cI1.+5+Zb6XSd34NAKmrB94Kxkm.YC`

> ✅ **Wazuh Manager est opérationnel.** Le dashboard affiche l'état du cluster et attend la connexion d'agents.
### 4.5 — (Optionnel) Sécuriser avec UFW
```bash
sudo apt install ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw enable
```

> ✅ Le pare-feu est actif sur le Manager. Pensez à ouvrir le port **1514** (communication agent) et **443** (dashboard) si nécessaire.
---
## 5 — Installation Wazuh Agent
### Contexte
| Élément | Valeur |
|---|---|
| Manager Wazuh (serveur) | `192.168.10.20` |
| Agent (client) | `192.168.10.10` (Ubuntu Hardened) |
| Nom de l'agent | `agent-abder` |
| Port de communication | `1514` (TCP) |
### 5.1 — Installer l'agent sur la VM durcie
```bash
wget https://packages.wazuh.com/4.x/apt/pool/main/w/wazuh-agent/wazuh-agent_4.7.5-1_amd64.deb
```
Installer avec les variables d'environnement (adaptez le nom et l'IP) :
```bash
sudo WAZUH_MANAGER='192.168.10.20' WAZUH_AGENT_NAME='agent-abder' dpkg -i ./wazuh-agent_4.7.5-1_amd64.deb
```
### 5.2 — Enregistrer l'agent côté Manager
Sur la VM Manager (`192.168.10.20`) :
```bash
sudo /var/ossec/bin/manage_agents
```
Dans le menu interactif :
1. Tapez **A** → Add an agent
2. Nom : `agent-abder`
3. IP : `192.168.10.10`
4. Tapez **E** → Extract key → copiez la clé générée
5. Tapez **L** → vérifiez que l'agent est listé

> ✅ L'agent `agent-abder` est enregistré avec son ID, son nom et son IP.
### 5.3 — Importer la clé sur l'agent
Sur la VM Agent (`192.168.10.10`) :
```bash
sudo /var/ossec/bin/manage_agents
```
Tapez **I** → collez la clé copiée depuis le Manager.

> ✅ La clé est importée. L'agent affiche les informations de confirmation (ID, nom, IP du Manager).
### 5.4 — Vérifier la configuration de l'agent
```bash
sudo nano /var/ossec/etc/ossec.conf
```
Vérifiez la section `<client>` et assurez-vous que l'IP pointe vers le Manager :

> L'adresse `192.168.10.20` doit figurer dans la balise `<server><address>`. Corrigez si nécessaire.
### 5.5 — Enregistrement automatique (alternative)
```bash
sudo /var/ossec/bin/agent-auth -m 192.168.10.20 -A agent-abder
```
> 💡 Si un agent avec ce nom existe déjà, supprimez-le côté Manager avec `manage_agents` → **R** (remove).
### 5.6 — Démarrer et vérifier l'agent
```bash
sudo systemctl daemon-reload
sudo systemctl restart wazuh-agent
sudo systemctl status wazuh-agent
```

> ✅ L'agent est `active (running)`.
### 5.7 — Vérifier depuis le Manager
```bash
sudo /var/ossec/bin/agent_control -l
```
> Résultat attendu : `ID: 001, Name: agent-abder, IP: 192.168.10.10, Active`

> ✅ Le Manager confirme que l'agent est connecté et actif.
### 5.8 — Tests de connectivité (optionnel)
```bash
telnet 192.168.10.20 1514
nc -vz 192.168.10.20 1514
```

> ✅ Le port 1514 du Manager est accessible depuis l'agent.
### 5.9 — Vérification sur le Dashboard

> ✅ L'agent apparaît comme **"Active"** dans l'interface web du Dashboard. La configuration est terminée.
> **⚠️ Si l'agent affiche "Never connected" :** recommencez depuis l'étape 5.2 (enregistrement sur le Manager). Ce problème survient souvent si la clé n'a pas été correctement importée.
### 5.10 — Tableau récapitulatif des commandes de diagnostic
| Étape | Commande | VM | Objectif |
|---|---|---|---|
| Lister les agents | `sudo /var/ossec/bin/agent_control -l` | Manager | Vérifier si l'agent est inscrit et actif |
| Logs de l'agent | `sudo tail -f /var/ossec/logs/ossec.log` | Agent | Suivre les logs en temps réel |
| Log de connexion | `sudo grep "Connected to the server" /var/ossec/logs/ossec.log` | Agent | Confirmer la connexion au Manager |
| Test port TCP | `nc -vz 192.168.10.20 1514` | Agent | Vérifier l'accès au port 1514 |
| Test Telnet | `telnet 192.168.10.20 1514` | Agent | Autre test de connectivité |
| Redémarrer l'agent | `sudo systemctl restart wazuh-agent` | Agent | Appliquer les modifications |
| Recharger les services | `sudo systemctl daemon-reload` | Agent | Recharger les fichiers systemd |
| Vérifier la config | `sudo cat /var/ossec/etc/ossec.conf` | Agent | Vérifier l'IP et le port du Manager |
### Captures des commandes de diagnostic

> Commande `agent_control -l` exécutée sur le Manager — l'agent est listé avec son statut.

> Les logs de l'agent montrent les événements de connexion et de communication avec le Manager.

> La ligne de connexion réussie est présente dans les logs.

> Le port 1514 du Manager est joignable depuis l'agent.

> Telnet confirme également que la connexion TCP est établie.

> Le fichier de configuration de l'agent pointe bien vers `192.168.10.20` sur le port `1514`.
---
## 6 — Compatibilité des versions Agent/Manager/Dashboard
L'agent et le Manager doivent être à la **même version**. Le Dashboard doit aussi être compatible.
### 6.1 — Vérifier les versions
#### Côté Agent
```bash
sudo /var/ossec/bin/wazuh-control info
```

> L'agent est en version `v4.12.0`.
#### Côté Manager
```bash
sudo /var/ossec/bin/wazuh-control info
```

> ✅ Le Manager est aussi en `v4.12.0`. Les versions sont compatibles.
#### Côté Dashboard
```bash
dpkg -l | grep wazuh-dashboard
```

> ❌ Le Dashboard est en version `4.7.5-1`, ce qui est **incompatible** avec le Manager/Agent en `4.12.0`.
### 6.2 — Mettre à jour le Dashboard
```bash
# Sauvegarder la configuration
sudo cp -r /etc/wazuh-dashboard /etc/wazuh-dashboard.bak
# Installer la version compatible
sudo apt update
sudo apt install wazuh-dashboard=4.12.0-1
```

> Le Dashboard est mis à jour vers la version `4.12.0-1` pour correspondre au Manager et à l'Agent.
```bash
# Finaliser l'installation
sudo dpkg --configure -a
# Vérifier la version
dpkg -l | grep wazuh-dashboard
# Redémarrer et vérifier
sudo systemctl restart wazuh-dashboard
sudo systemctl status wazuh-dashboard
```

> ✅ Le Dashboard est maintenant en version `4.12.0` et fonctionne correctement. Toutes les versions sont alignées.
---
## 7 — Script d'automatisation de reconnexion
Ce script vérifie et relance automatiquement l'agent Wazuh à chaque démarrage de la VM.
### 7.1 — Créer le script
```bash
sudo nano /home/abder/reconnect_wazuh_agent.sh
```
```bash
#!/bin/bash
echo "[$(date)] Script reconnect_wazuh_agent lancé automatiquement." >> /var/log/wazuh_reconnect.log 2>&1
echo "==> Vérification du statut du service Wazuh Agent..."
sudo systemctl status wazuh-agent
echo "==> Redémarrage de l'agent Wazuh..."
sudo systemctl restart wazuh-agent
echo "==> Vérification de la connectivité avec le Wazuh Manager (192.168.10.20:1514)..."
ping -c 3 192.168.10.20
nc -zv 192.168.10.20 1514 || echo "⚠️ Le port 1514 n'est pas accessible"
telnet 192.168.10.20 1514 || echo "⚠️ Telnet échoué (peut ne pas être installé)"
echo "==> Relance finale de l'agent..."
sudo systemctl restart wazuh-agent
echo "==> Vérification des 20 dernières lignes de logs Wazuh..."
sudo tail -n 20 /var/ossec/logs/ossec.log
echo "[$(date)] Wazuh Agent redémarré." >> /var/log/wazuh_reconnect.log 2>&1
echo "✅ Script terminé. Vérifie maintenant dans le Dashboard si l'agent est 'Active'."
```

> Le script effectue dans l'ordre : vérification du statut, redémarrage, test de connectivité, relance finale et lecture des logs.
Rendre le script exécutable :
```bash
chmod +x /home/abder/reconnect_wazuh_agent.sh
```
### 7.2 — Planifier l'exécution automatique au démarrage
#### Choisir nano comme éditeur par défaut
```bash
sudo update-alternatives --config editor
```

> Tapez le numéro correspondant à **nano** (ou Entrée pour le défaut).
#### Ajouter le script au crontab root
```bash
sudo crontab -e
```
Ajoutez cette ligne à la fin du fichier :
```
@reboot /home/abder/reconnect_wazuh_agent.sh
```

> Le script sera exécuté automatiquement à chaque démarrage de la VM.
Sauvegardez avec **Ctrl+O** puis quittez avec **Ctrl+X**.
### 7.3 — Tester le script
#### Test après reboot
```bash
sudo reboot
```
Après reconnexion, vérifiez le log :
```bash
cat /var/log/wazuh_reconnect.log
```

> ✅ Le log confirme que le script s'est bien exécuté automatiquement au démarrage.
#### Exécution manuelle (pour diagnostic)
```bash
sudo /home/abder/reconnect_wazuh_agent.sh
```

> Le script affiche chaque étape : statut, redémarrage, ping, test de port...

> ✅ Toutes les vérifications passent. L'agent est connecté et fonctionnel.
### 7.4 — Vérification finale sur le Dashboard

> ✅ L'agent est **"Active"** dans le Dashboard. Le script de reconnexion automatique fonctionne parfaitement.
---
## Récapitulatif de l'architecture
```
┌─────────────────────────────────┐
│ VM Ubuntu Hardened │
│ IP: 192.168.10.10 │
│ │
│ ┌─ AppArmor + auditd │
│ ├─ SSH (clé uniquement) │
│ ├─ UFW (port 22) │
│ ├─ Fail2Ban │
│ ├─ sysctl hardening │
│ ├─ Mises à jour auto │
│ └─ Wazuh Agent ──────────┐ │
└────────────────────────────┼────┘
│ TCP 1514
┌────────────────────────────▼────┐
│ VM Wazuh Manager │
│ IP: 192.168.10.20 │
│ │
│ ┌─ Wazuh Manager (v4.12.0) │
│ ├─ Wazuh Indexer │
│ ├─ Wazuh Dashboard (:443) │
│ └─ UFW (ports 22, 443, 1514) │
└─────────────────────────────────┘
```
### Résumé des mesures de sécurité
| Couche | Mesure | Détail |
|---|---|---|
| Réseau | UFW | Pare-feu avec politique deny par défaut |
| Réseau | sysctl hardening | Désactivation du routage et des redirections |
| Authentification | SSH par clé | Mot de passe désactivé, root interdit |
| Protection brute-force | Fail2Ban | Bannissement automatique des IP suspectes |
| Noyau | AppArmor | Contrôle d'accès obligatoire (MAC) |
| Audit | auditd | Journalisation des événements système |
| Mises à jour | unattended-upgrades | Patchs de sécurité automatiques |
| Monitoring | Wazuh SIEM | Détection d'intrusion et centralisation des logs |
---
> **Guide réalisé par Abder** — Configuration Wazuh SIEM avec hardening Ubuntu Server