Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

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 :

text
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.

sshd-session: Failed password for root from 192.168.10.71 port 515141. Prédécodagehorodatage, machine srv-web,programme sshd-session2. Décodagedécodeur sshd, puis son enfant ssh-failed :user root, srcip 192.168.10.71, srcport 515143. Règles5700 (niv. 0)5716 (niv. 5)5760 : niveau 5même adresse5763 : niveau 10si 8 échecs en 120 sun enfant ne s'évalueque si son parenta corresponduSeuil : niveau 3 ou plus, alors l'alerte est écrite dans alerts.json et part vers l'indexeur
Prédécodage, décodage, puis descente dans l'arbre des règles : la règle la plus précise donne le niveau de l'alerte

Les niveaux d'alerte

Chaque règle a un niveau de 0 à 16. La documentation de Wazuh donne à chaque niveau un sens précis :

NiveauNom dans la documentationSens
0IgnoredAucune action. Sert à écarter des faux positifs : ces règles sont évaluées avant les autres
1Low relevance informationInformation sans valeur de sécurité seule, utile comme contexte ou comme parent d'autres règles
2System low priority notificationNotification ou message d'état du système, sans enjeu de sécurité
3Successful/Authorized eventsSuccès attendus : connexion réussie, flux autorisé par le pare-feu
4System low priority errorErreur de configuration mineure, composant inutilisé
5User generated errorErreur d'un utilisateur : mot de passe mal tapé, action refusée
6Low relevance attackBruit de vers ou de virus sans effet, événements d'IDS fréquents
7"Bad word" matchingMessage qui contient un mot inquiétant, sans classement plus précis
8First time seenPremière occurrence : premier événement d'une signature d'IDS, première connexion d'un utilisateur
9Error from invalid sourceConnexion d'un utilisateur inconnu ou depuis une source invalide, erreur sur le compte administrateur
10Multiple user generated errorsErreurs répétées : échecs de connexion multiples, signe d'une attaque ou d'un mot de passe oublié
11Integrity checking warningModification d'un programme, trace de rootkit : signe possible d'une attaque réussie
12High importance eventMessage d'erreur ou d'alerte du système ou du noyau qui peut signaler une attaque
13Unusual error (high importance)Erreur qui correspond le plus souvent à un motif d'attaque connu
14High importance security eventProduit en général par corrélation : il indique une attaque
15Severe attackTrès faible risque de faux positif : attention immédiate
16Maximum severityNiveau 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 :

log_alert_level = 3email_alert_level = 12012345678910111213141516non enregistréconsulté dansle tableau de bordà examinerdans la journéeurgent :courriel
Quatre tranches de niveaux, et les deux seuils de la configuration par défaut : enregistrement à 3, courriel à 12

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é) :

xml
<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émentSens
idIdentifiant unique de la règle
levelNiveau 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, timeframeLa 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
ignoreAprè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 :

json
{
  "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"
}
ChampCe qu'il te dit
rule.level, rule.description, rule.idLa gravité et la règle : c'est par là qu'on commence
rule.mitreLa ou les techniques ATT&CK, avec leur tactique
rule.firedtimesCombien 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.ipLa machine qui a envoyé l'événement (ici la cible, pas l'attaquant)
data.srcip, data.dstuserLes champs décodés : l'adresse d'où vient la tentative, le compte visé
full_logLa ligne d'origine, à relire en cas de doute
locationD'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.

xml
<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_ip impose 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 :

ChampValeur
rule.id, rule.level60204, 10
rule.descriptionMultiple Windows Logon Failures
rule.mitre.idT1110
rule.groupswindows, windows_security, authentication_failures
rule.firedtimes1
agent.name, agent.ipsrv-ad, 192.168.10.177
data.win.system.eventID4625
data.win.eventdata.targetUserNameclambert
data.win.eventdata.ipAddress192.168.10.84
  1. Quelle machine a écrit l'événement, et d'où viennent les tentatives ?
  2. Que signifie le niveau 10 d'après la documentation de Wazuh ? Dans quelle tranche se trouve-t-il ?
  3. À quelle technique ATT&CK l'alerte est-elle rattachée, et que signifie ce rattachement ?
  4. 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
  1. 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 machine 192.168.10.84 (data.win.eventdata.ipAddress), dans le VLAN 10 des postes. Le compte visé est clambert.
  2. 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.
  3. T1110, Brute Force. Le rattachement dit que l'événement ressemble à une force brute ; il ne prouve ni l'attaque ni sa réussite.
  4. 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 .84 et s'il y a eu un succès (4624) de clambert depuis 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é ?

Chapitre terminé !

Fais les 2 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Écrire une règle Wazuh personnalisée et un décodeurRevoir le sommaire du cours