Chapitre 417 minIntermédiaire
Déployer l'agent Wazuh sur Windows Server et Linux, jusqu'à la GPO
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- expliquer l'inscription d'un agent et la protéger par un mot de passe ;
- installer l'agent sur Windows Server et sur Debian en ligne de commande ;
- déployer l'agent sur tout un parc Windows par stratégie de groupe ;
- centraliser la configuration des agents avec les groupes et agent.conf ;
- dépanner un agent qui reste déconnecté.
3 exercices corrigés1 schéma
L'agent Wazuh est le programme installé sur chaque machine surveillée : il lit ses journaux, contrôle ses fichiers, fait son inventaire et envoie le tout au serveur Wazuh. Le déployer, c'est l'installer, l'inscrire auprès du serveur pour obtenir une clé, puis le ranger dans un groupe qui lui donne sa configuration. Ce chapitre le fait sur Windows Server en ligne de commande, sur tout un parc Windows par stratégie de groupe (GPO), puis sur Debian, et termine par le dépannage d'un agent qui ne remonte rien. Sur un grand parc Linux, Ansible installe l'agent et dépose agent.conf sur tous les serveurs d'un coup (rôles Ansible).
Comment un agent s'inscrit
Un agent ne parle au serveur qu'une fois inscrit (enrolled). L'inscription se fait en deux temps :
- L'inscription, une seule fois. L'agent contacte le service d'inscription du serveur (
wazuh-authd) sur le port TCP 1515, dans une connexion TLS. Il donne son nom, éventuellement son groupe et le mot de passe d'inscription. Le serveur lui attribue un identifiant (001,002…) et une clé, qu'il note dans/var/ossec/etc/client.keys; l'agent garde la même clé dans son propreclient.keys. - La communication, ensuite et en permanence. L'agent se connecte au port TCP 1514 et chiffre chaque message avec sa clé (AES). Le serveur reconnaît l'agent à sa clé et rejette tout message qui ne correspond à aucune clé connue.
Protéger l'inscription par un mot de passe
Sur srv-journaux, dans /var/ossec/etc/ossec.conf, la section <auth> existe déjà. Ajoute-y une ligne :
<auth>
<!-- ... les options existantes restent en place ... -->
<use_password>yes</use_password>
</auth>
Écris ensuite le mot de passe dans un fichier lisible par le seul service, puis redémarre le serveur :
echo "<MOT_DE_PASSE_INSCRIPTION>" | sudo tee /var/ossec/etc/authd.pass > /dev/null
sudo chmod 640 /var/ossec/etc/authd.pass
sudo chown root:wazuh /var/ossec/etc/authd.pass
sudo systemctl restart wazuh-manager
Si tu actives use_password sans créer le fichier, le serveur tire un mot de passe au hasard à chaque redémarrage et l'écrit dans ossec.log : les inscriptions échouent dès qu'il redémarre. Crée toujours le fichier.
Créer les groupes d'agents
Un groupe rassemble des agents qui reçoivent la même configuration centralisée. Chez Sorbier, trois groupes suffisent :
| Groupe | Agents | Configuration particulière |
|---|---|---|
windows-serveurs | srv-ad, srv-ad2, srv-fichiers, srv-gestion, srv-collecte | Journaux PowerShell et Sysmon, intégrité des dossiers sensibles |
windows-postes | Les postes Windows 11 | Journaux PowerShell et Sysmon |
linux | srv-web | Journaux Apache, intégrité de /var/www |
Tout agent appartient aussi au groupe default. Crée les groupes avant d'y inscrire des agents : depuis le tableau de bord (Agents management, rubrique des groupes, Add new group) ou en ligne de commande sur le serveur :
sudo /var/ossec/bin/agent_groups -a -g windows-serveurs -q
sudo /var/ossec/bin/agent_groups -a -g windows-postes -q
sudo /var/ossec/bin/agent_groups -a -g linux -q
sudo /var/ossec/bin/agent_groups -l # liste des groupes
Installer l'agent sur Windows Server
Sur srv-ad, dans une console PowerShell lancée en administrateur. Le nom du paquet comporte la version : il doit correspondre à celle du serveur, ou lui être antérieur, jamais plus récent.
$Msi = "$env:TEMP\wazuh-agent-4.14.9-1.msi"
Invoke-WebRequest -Uri "https://packages.wazuh.com/4.x/windows/wazuh-agent-4.14.9-1.msi" -OutFile $Msi
$Arguments = "/i `"$Msi`" /q " +
'WAZUH_MANAGER="192.168.10.180" ' +
'WAZUH_REGISTRATION_SERVER="192.168.10.180" ' +
'WAZUH_REGISTRATION_PASSWORD="<MOT_DE_PASSE_INSCRIPTION>" ' +
'WAZUH_AGENT_GROUP="windows-serveurs"'
Start-Process -FilePath "msiexec.exe" -ArgumentList $Arguments -Wait
Start-Service -Name WazuhSvc
Get-Service -Name WazuhSvc
Le paquet MSI se pilote par des variables de déploiement :
| Variable | Rôle | Valeur chez Sorbier |
|---|---|---|
WAZUH_MANAGER | Adresse (ou nom) du serveur auquel envoyer les événements | 192.168.10.180 |
WAZUH_REGISTRATION_SERVER | Adresse du service d'inscription, si elle diffère | 192.168.10.180 |
WAZUH_REGISTRATION_PASSWORD | Mot de passe d'inscription | Celui de authd.pass |
WAZUH_AGENT_GROUP | Groupe(s) existant(s), séparés par des virgules | windows-serveurs |
WAZUH_AGENT_NAME | Nom de l'agent, par défaut le nom de l'ordinateur | Laisser par défaut |
Sans variable, l'agent s'installe mais ne s'inscrit pas : il faut alors renseigner l'adresse du serveur dans C:\Program Files (x86)\ossec-agent\ossec.conf et l'inscrire à la main. Le tableau de bord propose aussi un assistant, Agents management > Summary > Deploy new agent, qui génère la commande d'installation pour un système donné à partir de tes réponses : pratique pour vérifier une syntaxe.
Au bout d'une minute, srv-ad apparaît dans Agents management > Summary, avec l'identifiant 001, l'état Active, son système et son groupe.
Déployer l'agent sur tout le parc par GPO
Installer l'agent poste par poste ne passe pas l'échelle. Dans un domaine Active Directory, une stratégie de groupe (GPO) l'installe sur toutes les machines d'une unité d'organisation, y compris celles qui y arriveront plus tard. La création et la liaison des GPO sont expliquées dans le cours Windows Server.
Le paquet d'installation logicielle des GPO ne sait pas passer de variables à un MSI sans fichier de transformation (MST). La méthode la plus simple est un script de démarrage : il s'exécute au démarrage de chaque ordinateur, avec le compte système, avant toute ouverture de session.
1. Le partage. Sur srv-fichiers, un partage caché Deploiement$ contient Wazuh\wazuh-agent-4.14.9-1.msi. Le groupe Ordinateurs du domaine y a le droit de lecture (le script tourne sous le compte de l'ordinateur, pas d'un utilisateur), les administrateurs le contrôle total.
2. Le script Installer-AgentWazuh.ps1, déposé dans \\ad.sorbier.example\NETLOGON\ :
# Installe l'agent Wazuh au démarrage s'il est absent (script de démarrage d'ordinateur, GPO)
$Msi = "\\srv-fichiers.ad.sorbier.example\Deploiement$\Wazuh\wazuh-agent-4.14.9-1.msi"
$Journal = "$env:SystemRoot\Temp\wazuh-agent-installation.log"
# Déjà installé : on ne fait rien (le script s'exécute à chaque démarrage)
if (Get-Service -Name WazuhSvc -ErrorAction SilentlyContinue) { exit 0 }
# ProductType vaut 1 pour un poste de travail, 2 pour un contrôleur de domaine, 3 pour un serveur
$Type = (Get-CimInstance -ClassName Win32_OperatingSystem).ProductType
$Groupe = if ($Type -eq 1) { "windows-postes" } else { "windows-serveurs" }
$Arguments = "/i `"$Msi`" /q /l*v `"$Journal`" " +
'WAZUH_MANAGER="192.168.10.180" ' +
'WAZUH_REGISTRATION_SERVER="192.168.10.180" ' +
'WAZUH_REGISTRATION_PASSWORD="<MOT_DE_PASSE_INSCRIPTION>" ' +
"WAZUH_AGENT_GROUP=`"$Groupe`""
$Installation = Start-Process -FilePath "msiexec.exe" -ArgumentList $Arguments -Wait -PassThru
# 0 : succès ; 3010 : succès, redémarrage demandé
if ($Installation.ExitCode -in 0, 3010) { Start-Service -Name WazuhSvc }
3. La GPO. Dans la console Gestion des stratégies de groupe, crée la GPO ORD - Agent Wazuh et lie-la aux unités d'organisation des serveurs et des ordinateurs. Modifie-la :
- Configuration ordinateur > Stratégies > Paramètres Windows > Scripts (démarrage/arrêt) > Démarrage, onglet Scripts : Ajouter, nom du script
powershell.exe, paramètres-NoProfile -ExecutionPolicy Bypass -File "\\ad.sorbier.example\NETLOGON\Installer-AgentWazuh.ps1". Passer parpowershell.exeavec-ExecutionPolicy Bypassévite que la stratégie d'exécution des postes (restreinte par défaut sous Windows 11) bloque le script. - Configuration ordinateur > Stratégies > Modèles d'administration > Système > Ouverture de session > Toujours attendre le réseau lors du démarrage et de l'ouverture de session de l'ordinateur : Activé. Sans ce réglage, le script peut s'exécuter avant que le réseau soit prêt, et ne pas trouver le partage.
4. La vérification. Sur une machine de test, gpupdate /force puis redémarrage. Après le démarrage, Get-Service WazuhSvc doit répondre et l'agent apparaître dans le tableau de bord. En cas d'échec, lis le journal C:\Windows\Temp\wazuh-agent-installation.log et le résultat de gpresult /r (la GPO est-elle appliquée ?).
Installer l'agent sur Debian
Sur srv-web (Debian 13), en root ou avec sudo. On ajoute le dépôt de Wazuh et sa clé de signature, puis on installe le paquet en lui passant les mêmes variables que sous Windows :
sudo apt-get install -y gnupg curl
curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | sudo gpg --no-default-keyring \
--keyring gnupg-ring:/usr/share/keyrings/wazuh.gpg --import
sudo chmod 644 /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-get update
sudo WAZUH_MANAGER="192.168.10.180" WAZUH_REGISTRATION_PASSWORD="<MOT_DE_PASSE_INSCRIPTION>" \
WAZUH_AGENT_GROUP="linux" apt-get install -y wazuh-agent
sudo systemctl daemon-reload
sudo systemctl enable --now wazuh-agent
Comme sur le serveur, bloque les mises à jour accidentelles de l'agent : une mise à jour ne doit jamais rendre l'agent plus récent que le serveur.
echo "wazuh-agent hold" | sudo dpkg --set-selections
srv-web est dans la DMZ : la matrice des flux du chapitre 2 doit autoriser 192.168.10.225 vers 192.168.10.180 en TCP 1514 et, le temps de l'inscription, TCP 1515. Le téléchargement du paquet passe par le flux HTTPS vers Internet déjà prévu pour les mises à jour.
La configuration centralisée : agent.conf
Chaque agent a son ossec.conf local. Plutôt que de le modifier machine par machine, on écrit la configuration d'un groupe dans /var/ossec/etc/shared/<groupe>/agent.conf sur le serveur : elle est envoyée automatiquement à tous les agents du groupe, qui l'appliquent en plus de leur configuration locale (et la font passer avant en cas de conflit).
Pour le groupe windows-serveurs, /var/ossec/etc/shared/windows-serveurs/agent.conf ajoute deux canaux d'événements, PowerShell et Sysmon, que l'agent ne lit pas par défaut (chapitre 5) :
<agent_config>
<localfile>
<location>Microsoft-Windows-PowerShell/Operational</location>
<log_format>eventchannel</log_format>
</localfile>
<localfile>
<location>Microsoft-Windows-Sysmon/Operational</location>
<log_format>eventchannel</log_format>
</localfile>
</agent_config>
Vérifie la syntaxe avant que les agents la reçoivent :
sudo /var/ossec/bin/verify-agent-conf -f /var/ossec/etc/shared/windows-serveurs/agent.conf
Le tableau de bord permet aussi de modifier ce fichier, depuis la page du groupe ; il refuse un XML mal formé. Les agents récupèrent la nouvelle configuration dans les minutes qui suivent et redémarrent leurs modules d'eux-mêmes.
Vérifier et dépanner un agent
Un agent a l'un de ces états dans le tableau de bord :
| État | Sens | Que vérifier |
|---|---|---|
| Active | Connecté, il envoie ses événements | Rien |
| Disconnected | Inscrit, mais plus de nouvelles depuis un délai fixé dans la configuration du serveur (agents_disconnection_time) | Machine éteinte, service arrêté, flux 1514 coupé |
| Pending | Inscrit, connexion en cours d'établissement | Attendre ; si cela dure, flux 1514 ou clés |
| Never connected | Inscrit, mais jamais connecté | Le flux 1514, l'adresse du serveur dans ossec.conf de l'agent |
Sur le serveur, la liste des agents et leur état :
sudo /var/ossec/bin/agent_control -l
Sur l'agent, le journal de fonctionnement dit presque toujours ce qui ne va pas : C:\Program Files (x86)\ossec-agent\ossec.log sous Windows, /var/ossec/logs/ossec.log sous Linux.
Ce que dit ossec.log de l'agent | Cause | Remède |
|---|---|---|
Échec de connexion vers 192.168.10.180:1515 | Port d'inscription fermé (pare-feu, ufw) | Ouvre TCP 1515 le temps de l'inscription |
| Mot de passe d'inscription refusé | Mauvais mot de passe, ou serveur redémarré sans authd.pass | Compare avec /var/ossec/etc/authd.pass |
| L'inscription est refusée pour un nom déjà utilisé | Une machine réinstallée reprend le nom d'un agent encore inscrit et récemment actif | Supprime l'ancien agent sur le serveur, puis réinscris |
| Groupe invalide | Le groupe demandé n'existe pas | Crée-le, réinscris |
| Connexion au port 1514 impossible | Pare-feu, ou mauvaise adresse dans <client><server><address> | Teste avec Test-NetConnection 192.168.10.180 -Port 1514 |
Pour supprimer un agent (machine détruite, réinstallation), utilise le tableau de bord ou, sur le serveur, sudo /var/ossec/bin/manage_agents -r 004 : sa clé est retirée, il ne peut plus envoyer d'événements.
Exercices
Exercice 1 sur 3 La commande d'installation Réussi À revoir
Écris la commande PowerShell qui installe l'agent Wazuh 4.14.9 sur le poste PC-COMPTA-03 (déjà téléchargé dans C:\Install\), l'inscrit auprès de srv-journaux avec le mot de passe d'inscription Inscription.2026 et le range dans le groupe windows-postes, puis démarre le service.
Voir la réponseMasquer la réponse de l'exercice 1
$Arguments = '/i "C:\Install\wazuh-agent-4.14.9-1.msi" /q ' +
'WAZUH_MANAGER="192.168.10.180" ' +
'WAZUH_REGISTRATION_SERVER="192.168.10.180" ' +
'WAZUH_REGISTRATION_PASSWORD="Inscription.2026" ' +
'WAZUH_AGENT_GROUP="windows-postes"'
Start-Process -FilePath "msiexec.exe" -ArgumentList $Arguments -Wait
Start-Service -Name WazuhSvc
WAZUH_AGENT_NAME est inutile : par défaut, l'agent prend le nom de l'ordinateur, PC-COMPTA-03. Le groupe doit exister sur le serveur avant l'inscription. Dans un vrai déploiement, le mot de passe ne s'écrit pas dans une copie d'écran de compte rendu.
Tu avais trouvé ?
Exercice 2 sur 3 Diagnostiquer un agent Réussi À revoir
Le poste PC-LOGI-07 a reçu la GPO de déploiement. Le service WazuhSvc existe et tourne, mais le poste n'apparaît pas dans le tableau de bord. Le fichier ossec.log du poste répète une erreur de connexion vers 192.168.10.180 sur le port 1515. Le poste est dans le VLAN 10. Que se passe-t-il, et comment le prouves-tu ?
Voir la réponseMasquer la réponse de l'exercice 2
L'agent est installé mais n'a pas pu s'inscrire : il n'atteint pas le service d'inscription (TCP 1515). Sans inscription, pas de clé, donc pas d'apparition dans le tableau de bord. Causes possibles : le port 1515 a été refermé au pare-feu (pfSense entre le VLAN 10 et le VLAN 20, ou ufw sur srv-journaux) après le déploiement initial, ou le service d'inscription du serveur est arrêté. Preuve : depuis le poste, Test-NetConnection 192.168.10.180 -Port 1515 échoue ; depuis le serveur, sudo ss -tlnp | grep 1515 montre (ou non) l'écoute ; sudo ufw status et les journaux de blocage de pfSense montrent la règle en cause. On rouvre 1515 depuis le VLAN 10 le temps de l'inscription.
Tu avais trouvé ?
Exercice 3 sur 3 Un groupe par rôle Réussi À revoir
Sorbier ajoute un second serveur web, srv-web2, et veut que les deux serveurs web reçoivent la même configuration : journaux Apache et intégrité de /var/www. Les contrôleurs de domaine, eux, doivent surveiller le dossier SYSVOL. Propose une organisation des groupes, et dis dans quel groupe ranger chaque machine Linux et Windows du laboratoire.
Voir la réponseMasquer la réponse de l'exercice 3
Un groupe par système pour ce qui est commun, un groupe par rôle pour ce qui est spécifique, un agent pouvant être dans plusieurs groupes :
| Groupe | Contenu de son agent.conf | Membres |
|---|---|---|
windows-serveurs | PowerShell, Sysmon | srv-ad, srv-ad2, srv-fichiers, srv-gestion, srv-collecte |
controleurs-domaine | Intégrité de C:\Windows\SYSVOL | srv-ad, srv-ad2 |
windows-postes | PowerShell, Sysmon | Postes Windows 11 |
linux | Réglages communs aux serveurs Debian | srv-web, srv-web2 |
serveurs-web | Journaux Apache, intégrité de /var/www | srv-web, srv-web2 |
srv-web2 s'inscrit avec WAZUH_AGENT_GROUP="linux,serveurs-web" et reçoit tout seul la bonne configuration.
Tu avais trouvé ?