Chapitre 615 minIntermédiaire
Lire une alerte Wazuh : décodeurs, règles et niveaux
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- suivre un journal à travers le prédécodage, le décodage et les règles ;
- interpréter le niveau d'une alerte et sa tranche de gravité ;
- lire une règle fournie par Wazuh, y compris une règle de fréquence ;
- lire le contenu d'une alerte et distinguer la machine qui rapporte de la source.
2 exercices corrigés2 schémas
Lire une alerte Wazuh, c'est comprendre comment une ligne de journal est devenue une alerte : un décodeur a extrait ses champs (l'utilisateur, l'adresse source, l'action), puis une règle a décidé qu'elle méritait une alerte et lui a donné un niveau, de 0 (ignoré) à 16 (gravité maximale). Wazuh fournit des milliers de décodeurs et de règles. Ce chapitre suit une ligne de journal à travers le moteur d'analyse, explique les niveaux d'alerte, et apprend à lire une règle fournie par Wazuh et le contenu d'une alerte ; le chapitre 7 passe à l'écriture de tes propres règles.
Le chemin d'un journal dans le moteur d'analyse
Prends cette ligne, écrite par srv-web et lue par son agent dans journald :
Nov 3 03:12:44 srv-web sshd-session[2214]: Failed password for root from 192.168.10.71 port 51514 ssh2
Le moteur d'analyse du serveur (wazuh-analysisd) la traite en trois phases.
Phase 1, le prédécodage. Wazuh reconnaît l'en-tête au format syslog et en extrait trois champs : l'horodatage (Nov 3 03:12:44), le nom de la machine (srv-web) et le nom du programme (sshd-session). Le reste est le message.
Phase 2, le décodage. Wazuh cherche le décodeur qui correspond. Le décodeur parent sshd s'applique à tout programme dont le nom commence par sshd. Parmi ses décodeurs enfants, ssh-failed reconnaît le début Failed password et extrait, grâce à une expression régulière, l'utilisateur (root), l'adresse source (192.168.10.71) et le port source (51514).
Phase 3, les règles. Les règles forment un arbre : une règle « enfant » ne s'évalue que si sa règle « parent » a correspondu. La règle 5700 regroupe tous les événements du décodeur sshd, sans alerte. Son enfant 5716 reconnaît un message qui commence par Failed. Son enfant à lui, 5760, reconnaît Failed password : c'est la règle la plus précise qui correspond, elle donne l'alerte « sshd: authentication failed. », niveau 5. Si les échecs venus de la même adresse atteignent huit en deux minutes, la règle de fréquence 5763 « sshd: brute force trying to get access to the system », de niveau 10, se déclenche.
Le niveau final est comparé au seuil d'enregistrement, log_alert_level, qui vaut 3 par défaut : en dessous, l'événement est analysé mais aucune alerte n'est écrite.
Les niveaux d'alerte
Chaque règle a un niveau de 0 à 16. La documentation de Wazuh donne à chaque niveau un sens précis :
| Niveau | Nom dans la documentation | Sens |
|---|---|---|
| 0 | Ignored | Aucune action. Sert à écarter des faux positifs : ces règles sont évaluées avant les autres |
| 1 | Low relevance information | Information sans valeur de sécurité seule, utile comme contexte ou comme parent d'autres règles |
| 2 | System low priority notification | Notification ou message d'état du système, sans enjeu de sécurité |
| 3 | Successful/Authorized events | Succès attendus : connexion réussie, flux autorisé par le pare-feu |
| 4 | System low priority error | Erreur de configuration mineure, composant inutilisé |
| 5 | User generated error | Erreur d'un utilisateur : mot de passe mal tapé, action refusée |
| 6 | Low relevance attack | Bruit de vers ou de virus sans effet, événements d'IDS fréquents |
| 7 | "Bad word" matching | Message qui contient un mot inquiétant, sans classement plus précis |
| 8 | First time seen | Première occurrence : premier événement d'une signature d'IDS, première connexion d'un utilisateur |
| 9 | Error from invalid source | Connexion d'un utilisateur inconnu ou depuis une source invalide, erreur sur le compte administrateur |
| 10 | Multiple user generated errors | Erreurs répétées : échecs de connexion multiples, signe d'une attaque ou d'un mot de passe oublié |
| 11 | Integrity checking warning | Modification d'un programme, trace de rootkit : signe possible d'une attaque réussie |
| 12 | High importance event | Message d'erreur ou d'alerte du système ou du noyau qui peut signaler une attaque |
| 13 | Unusual error (high importance) | Erreur qui correspond le plus souvent à un motif d'attaque connu |
| 14 | High importance security event | Produit en général par corrélation : il indique une attaque |
| 15 | Severe attack | Très faible risque de faux positif : attention immédiate |
| 16 | Maximum severity | Niveau maximal, utilisé par aucune règle fournie : réservé à tes règles personnalisées les plus graves |
En pratique, on raisonne par tranches, et on règle les notifications en conséquence :
Lire une règle
Voici les deux règles SSH rencontrées plus haut, telles qu'elles sont dans /var/ossec/ruleset/rules/0095-sshd_rules.xml (on a retiré pour la lisibilité les groupes de conformité PCI DSS, RGPD, HIPAA et NIST, qui servent aux tableaux de bord de conformité) :
<rule id="5760" level="5">
<if_sid>5700,5716</if_sid>
<match>Failed password|Failed keyboard|authentication error</match>
<description>sshd: authentication failed.</description>
<mitre>
<id>T1110.001</id>
<id>T1021.004</id>
</mitre>
<group>authentication_failed,</group>
</rule>
<rule id="5763" level="10" frequency="8" timeframe="120" ignore="60">
<if_matched_sid>5760</if_matched_sid>
<same_source_ip />
<description>sshd: brute force trying to get access to the system. Authentication failed.</description>
<mitre>
<id>T1110</id>
</mitre>
<group>authentication_failures,</group>
</rule>
| Élément | Sens |
|---|---|
id | Identifiant unique de la règle |
level | Niveau de l'alerte, de 0 à 16 |
<if_sid> | La règle ne s'évalue que si l'une de ces règles a correspondu : c'est le lien parent-enfant |
<if_group> | Idem, mais pour toute règle d'un groupe donné |
<match> | Le message doit contenir ce texte ; | sépare des possibilités, ^ ancre au début |
<regex>, <field name="…"> | Expression régulière sur le message, ou sur un champ décodé (win.eventdata.targetUserName, par exemple) ; type="pcre2" pour la syntaxe PCRE2 |
<user>, <srcip>, <action> | Compare un champ décodé standard ; negate="yes" inverse la condition |
frequency, timeframe | La règle se déclenche quand la condition s'est produite frequency fois en timeframe secondes |
<if_matched_sid> | Pour une règle de fréquence : les événements à compter sont ceux de cette règle |
<same_srcip />, <same_user />, <same_field> | Ne compter que les événements qui partagent la même adresse source, le même utilisateur, la même valeur d'un champ (les règles fournies écrivent encore <same_source_ip />, l'ancienne forme) |
<different_user />, <different_field> | À l'inverse, compter des événements dont la valeur diffère |
ignore | Après s'être déclenchée, la règle se tait pendant ce nombre de secondes, pour éviter une avalanche d'alertes identiques |
<time>, <weekday> | Plage horaire ou jours de la semaine, selon l'heure du serveur Wazuh |
<mitre> | Techniques ATT&CK associées (chapitre 10) |
<group> | Étiquettes de l'alerte, utilisables par d'autres règles (if_group) et dans les recherches |
Lis donc la règle 5763 ainsi : « si la règle 5760 (échec de mot de passe SSH) s'est produite 8 fois en 120 secondes depuis la même adresse source, lève une alerte de niveau 10, rattachée à la technique T1110 Brute Force, puis tais-toi 60 secondes ».
Lire une alerte
Chaque alerte est écrite en JSON dans /var/ossec/logs/alerts/alerts.json, une par ligne, et envoyée à l'indexeur. Le tableau de bord en affiche les champs dans le détail d'un événement. Voici l'alerte de la règle 5760 pour la ligne du début, mise en forme et abrégée :
{
"timestamp": "2026-11-03T03:12:44.418+0100",
"rule": {
"level": 5,
"description": "sshd: authentication failed.",
"id": "5760",
"mitre": {
"id": ["T1110.001", "T1021.004"],
"tactic": ["Credential Access", "Lateral Movement"],
"technique": ["Password Guessing", "SSH"]
},
"firedtimes": 3,
"groups": ["syslog", "sshd", "authentication_failed"]
},
"agent": { "id": "006", "name": "srv-web", "ip": "192.168.10.225" },
"manager": { "name": "srv-journaux" },
"full_log": "Nov 3 03:12:44 srv-web sshd-session[2214]: Failed password for root from 192.168.10.71 port 51514 ssh2",
"predecoder": { "program_name": "sshd-session", "timestamp": "Nov 3 03:12:44", "hostname": "srv-web" },
"decoder": { "parent": "sshd", "name": "sshd" },
"data": { "srcip": "192.168.10.71", "srcport": "51514", "dstuser": "root" },
"location": "journald"
}
| Champ | Ce qu'il te dit |
|---|---|
rule.level, rule.description, rule.id | La gravité et la règle : c'est par là qu'on commence |
rule.mitre | La ou les techniques ATT&CK, avec leur tactique |
rule.firedtimes | Combien de fois cette règle s'est déclenchée depuis le démarrage du serveur : un chiffre qui grimpe signale une rafale |
agent.name, agent.ip | La machine qui a envoyé l'événement (ici la cible, pas l'attaquant) |
data.srcip, data.dstuser | Les champs décodés : l'adresse d'où vient la tentative, le compte visé |
full_log | La ligne d'origine, à relire en cas de doute |
location | D'où l'agent a lu l'événement : journald, un fichier, un canal Windows (EventChannel) |
Pour un événement Windows, les champs décodés sont rangés sous data.win : data.win.system.eventID, data.win.eventdata.targetUserName, data.win.eventdata.ipAddress, data.win.eventdata.logonType. Ce sont ces noms qu'on utilise dans les recherches du tableau de bord et, sans le préfixe data., dans les règles (win.eventdata.targetUserName).
Exercices
Exercice 1 sur 2 Lire une règle Réussi À revoir
Voici une règle fournie par Wazuh pour pfSense. Explique en une phrase ce qu'elle détecte, puis dis si elle se déclenche dans chacun des cas suivants : (a) 20 paquets bloqués en 30 secondes depuis 203.0.113.8 ; (b) 30 paquets bloqués en 30 secondes, depuis 30 adresses différentes ; (c) 18 paquets bloqués en 40 secondes depuis 192.168.10.71, puis encore 18 dans les deux minutes suivantes.
<rule id="87702" level="10" frequency="18" timeframe="45" ignore="240">
<if_matched_sid>87701</if_matched_sid>
<same_source_ip />
<description>Multiple pfSense firewall blocks events from same source.</description>
<mitre>
<id>T1110</id>
</mitre>
</rule>
Voir la réponseMasquer la réponse de l'exercice 1
La règle détecte beaucoup de paquets bloqués par le pare-feu (règle 87701) venant d'une même adresse en peu de temps : 18 en 45 secondes. C'est le signe d'un balayage de ports ou d'une machine qui insiste vers une destination interdite.
- (a) Oui : plus de 18 blocages en moins de 45 secondes, depuis la même source.
- (b) Non :
same_source_ipimpose que les blocages viennent de la même adresse ; 30 sources différentes ne se cumulent pas. Un balayage réparti sur de nombreuses adresses échappe à cette règle. - (c) Une seule alerte : la première rafale la déclenche, puis
ignore="240"la fait taire pendant 240 secondes ; la seconde rafale, dans les deux minutes, tombe dans ce silence.
Tu avais trouvé ?
Exercice 2 sur 2 Lire une alerte Réussi À revoir
Voici les champs principaux d'une alerte reçue un lundi à 8 h 12 :
| Champ | Valeur |
|---|---|
rule.id, rule.level | 60204, 10 |
rule.description | Multiple Windows Logon Failures |
rule.mitre.id | T1110 |
rule.groups | windows, windows_security, authentication_failures |
rule.firedtimes | 1 |
agent.name, agent.ip | srv-ad, 192.168.10.177 |
data.win.system.eventID | 4625 |
data.win.eventdata.targetUserName | clambert |
data.win.eventdata.ipAddress | 192.168.10.84 |
- Quelle machine a écrit l'événement, et d'où viennent les tentatives ?
- Que signifie le niveau 10 d'après la documentation de Wazuh ? Dans quelle tranche se trouve-t-il ?
- À quelle technique ATT&CK l'alerte est-elle rattachée, et que signifie ce rattachement ?
- Quelles sont les deux hypothèses principales, et que vérifies-tu en premier ?
Voir la réponseMasquer la réponse de l'exercice 2
- L'événement a été écrit par le contrôleur de domaine
srv-ad(agent.name), qui a refusé les connexions. Les tentatives viennent de la machine192.168.10.84(data.win.eventdata.ipAddress), dans le VLAN 10 des postes. Le compte visé estclambert. - Le niveau 10, « Multiple user generated errors », signale des erreurs répétées d'un utilisateur, comme des échecs de connexion multiples : signe d'une attaque ou d'un mot de passe oublié. Il est dans la tranche 8 à 11, à examiner dans la journée ; il ne part pas par courriel avec le seuil par défaut de 12.
T1110, Brute Force. Le rattachement dit que l'événement ressemble à une force brute ; il ne prouve ni l'attaque ni sa réussite.- Première hypothèse : Chloé Lambert (technicienne) a changé son mot de passe vendredi, et une application ou un lecteur réseau de son poste essaie encore l'ancien chaque matin. Seconde hypothèse : quelqu'un essaie de deviner son mot de passe depuis le poste
.84. On vérifie d'abord à qui est le poste.84et s'il y a eu un succès (4624) declambertdepuis cette adresse juste après les échecs ; puis on appelle l'utilisatrice, par téléphone.firedtimesà 1 indique que c'est la première alerte de ce type depuis le démarrage du serveur : pas une rafale qui dure depuis des heures.
Tu avais trouvé ?