Aller au contenu
Réussir mon BTS SIO

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

Par exemple

Chapitre 813 minIntermédiaire

Contrôle d'intégrité des fichiers (FIM) avec Wazuh

Par Josselyn C., prof de BTS SIO. Mis à jour le .

À la fin de ce chapitre, tu sauras

  • expliquer comment Wazuh détecte qu'un fichier a changé ;
  • surveiller un dossier en temps réel et savoir qui l'a modifié ;
  • lire une alerte d'ajout, de modification ou de suppression ;
  • repérer des modifications en masse typiques d'un rançongiciel.

3 exercices corrigés

Le contrôle d'intégrité des fichiers, ou FIM (File Integrity Monitoring), consiste à calculer l'empreinte et les attributs de fichiers choisis, puis à alerter dès qu'un fichier est ajouté, modifié ou supprimé. Dans Wazuh, c'est le module syscheck de l'agent qui s'en charge, sur les fichiers de Linux et de Windows et sur les clés du registre Windows. Ce chapitre explique ce qu'il compare, sa configuration par défaut, la surveillance en temps réel avec l'auteur de la modification, la lecture d'une alerte FIM et la détection d'un rançongiciel par les modifications en masse.

Ce que compare le contrôle d'intégrité

À chaque analyse, l'agent relève pour chaque fichier surveillé :

  • ses empreintes (MD5, SHA-1 et SHA-256) : la moindre modification du contenu change l'empreinte ;
  • sa taille, sa date de modification, son numéro d'inode sous Linux ;
  • son propriétaire, son groupe et ses permissions (droits Unix, ou liste de contrôle d'accès sous Windows).

Il compare avec l'état enregistré lors de l'analyse précédente, garde le nouvel état dans sa base locale et envoie au serveur un événement pour chaque différence : ajout, modification ou suppression. Le serveur en fait une alerte.

Les empreintes servent ici de preuve d'intégrité, comme dans le cours Cryptographie : on ne peut pas modifier un fichier en gardant la même empreinte SHA-256. Un attaquant qui remplace un programme système, ajoute une ligne au fichier sudoers ou modifie une page du site web est donc vu, même s'il a soigneusement remis la date de modification d'origine.

La configuration par défaut

L'agent surveille déjà, sans rien régler, les emplacements que les attaquants modifient le plus souvent :

SystèmeEmplacements surveillés par défautRythme
Linux/etc, /usr/bin, /usr/sbin, /bin, /sbin, /bootAnalyse toutes les 12 heures, et au démarrage de l'agent
WindowsUne liste de programmes de C:\Windows\System32 (cmd.exe, net.exe, reg.exe, sc.exe, schtasks.exe…), le dossier drivers\etc (avec le fichier hosts), powershell.exeAnalyse toutes les 12 heures
WindowsLe dossier Démarrage commun (C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup)Temps réel
Windows (registre)Les clés de démarrage automatique (Run, RunOnce), les services (HKLM\System\CurrentControlSet\Services), Winlogon, les stratégiesAnalyse toutes les 12 heures

Quelques fichiers ne sont jamais montrés en détail : pour /etc/shadow et les clés privées TLS, Wazuh signale le changement sans jamais en afficher le contenu (option nodiff).

Une analyse toutes les 12 heures, c'est utile pour un contrôle de fond, mais trop lent pour les fichiers qui comptent : un site web défiguré à 9 h serait signalé le soir. Pour ceux-là, on passe en temps réel.

Surveiller un dossier en temps réel, et savoir qui l'a modifié

Trois attributs de la balise <directories> changent tout :

AttributEffet
realtime="yes"L'agent est prévenu par le système à chaque modification, sans attendre l'analyse planifiée (pour des dossiers)
whodata="yes"Temps réel, plus l'auteur : le compte et le processus qui ont fait la modification. Sous Windows, Wazuh s'appuie sur l'audit des objets (il pose lui-même les listes de contrôle d'accès système nécessaires)
report_changes="yes"Joint à l'alerte la différence de contenu, pour les fichiers texte (une ligne ajoutée dans un fichier de configuration, par exemple)

Sur srv-web, le contenu du site et la configuration de SSH et de sudo. Dans l'agent.conf du groupe serveurs-web :

xml
<agent_config>
  <syscheck>
    <directories realtime="yes" report_changes="yes">/var/www/html</directories>
    <directories realtime="yes" report_changes="yes">/etc/ssh,/etc/sudoers.d</directories>
    <ignore type="sregex">\.log$|/cache/</ignore>
  </syscheck>
</agent_config>

Sur srv-fichiers, les partages sensibles, avec l'auteur des modifications. Une section <agent_config> peut viser une seule machine par son nom (l'attribut name est une expression régulière : ancre-la avec ^ et $ pour ne pas viser aussi srv-fichiers2), dans l'agent.conf du groupe windows-serveurs :

xml
<agent_config name="^srv-fichiers$">
  <syscheck>
    <directories whodata="yes">D:\Partages\Direction</directories>
    <directories whodata="yes">D:\Partages\Paie</directories>
  </syscheck>
</agent_config>

Sur les contrôleurs de domaine, le dossier SYSVOL, où vivent les scripts et les GPO : un script de connexion modifié par un attaquant s'exécute sur toutes les machines du domaine.

xml
<agent_config name="^srv-ad$|^srv-ad2$">
  <syscheck>
    <directories whodata="yes">C:\Windows\SYSVOL\domain\scripts</directories>
    <directories realtime="yes">C:\Windows\SYSVOL\domain\Policies</directories>
  </syscheck>
</agent_config>

Lire une alerte FIM

RègleNiveauDescriptionÉvénement
5545File added to the system.Fichier ajouté
5507Integrity checksum changed.Fichier modifié
5537File deleted.Fichier supprimé
752, 750, 7515(valeur de registre ajoutée, modifiée, supprimée)Registre Windows

L'alerte porte, sous syscheck, les informations utiles : le chemin (syscheck.path), le type d'événement (syscheck.event : added, modified, deleted), les empreintes avant et après (syscheck.sha256_before, syscheck.sha256_after), la taille, le propriétaire, le mode de détection (syscheck.mode : scheduled, realtime ou whodata) et, avec report_changes, la différence (syscheck.diff). Avec whodata, elle ajoute l'auteur : syscheck.audit.user.name et le processus, syscheck.audit.process.name.

Par exemple, une alerte 550 sur srv-fichiers :

ChampValeur
syscheck.pathd:\partages\paie\virements-novembre.xlsx
syscheck.eventmodified
syscheck.modewhodata
syscheck.audit.user.namejlefevre
syscheck.audit.process.nameC:\Windows\explorer.exe
syscheck.size_before, syscheck.size_after48211, 48506

Le tableau de bord présente ces événements dans Endpoint security > File Integrity Monitoring, avec un inventaire des fichiers surveillés par agent et l'historique de leurs modifications.

Lire, c'est décider. Une modification n'est pas une attaque : la comptable modifie un fichier de virements, c'est son travail. La question est toujours : cette modification était-elle attendue ?

  • Une mise à jour du site a été planifiée ce matin : les modifications de /var/www/html à 9 h sont normales. À 3 h, sans intervention prévue, elles ne le sont pas.
  • jlefevre, comptable, modifie un fichier de la paie un mardi à 10 h : normal. Le même compte modifie 400 fichiers de la direction en deux minutes : anormal.
  • Le fichier hosts d'un serveur change : presque jamais normal. C'est une technique pour détourner un nom (le serveur de mises à jour, l'annuaire) vers une adresse contrôlée par l'attaquant.

Repérer un rançongiciel par les modifications en masse

Un rançongiciel chiffre les fichiers les uns après les autres, aussi vite qu'il peut : chaque fichier chiffré est un fichier modifié (ou supprimé puis recréé avec une nouvelle extension). Sur un partage surveillé en temps réel, cela produit une avalanche d'alertes 550, 553 et 554 en quelques secondes, sur une même machine. Une règle de fréquence transforme cette avalanche en une alerte grave :

xml
<group name="sorbier,syscheck,">
  <rule id="100200" level="12" frequency="50" timeframe="60">
    <if_matched_group>syscheck_entry_modified</if_matched_group>
    <same_location />
    <description>Sorbier : modifications de fichiers en masse sur une même machine (rançongiciel ?)</description>
    <mitre>
      <id>T1486</id>
    </mitre>
  </rule>
</group>

Les alertes de modification de fichiers appartiennent au groupe syscheck_entry_modified ; if_matched_group compte les événements de ce groupe et <same_location /> impose qu'ils viennent du même endroit, donc du même agent. Cinquante modifications en une minute sur la même machine déclenchent une alerte de niveau 12, rattachée à la technique T1486 Data Encrypted for Impact. Le seuil se règle sur ton activité normale : regarde combien de modifications un partage reçoit, au plus fort, en une minute de travail ordinaire, et place le seuil nettement au-dessus.

La détection de rootkits

Le module rootcheck, actif par défaut, complète le FIM : il cherche des fichiers et des signatures de rootkits connus, des processus et des ports cachés (visibles pour le noyau mais pas pour les commandes du système), des permissions anormales. Ses trouvailles donnent la règle 510 « Host-based anomaly detection event (rootcheck) », de niveau 7. Il produit parfois des faux positifs sur des systèmes récents ; chaque alerte se vérifie à la main avant de conclure.

Exercices

Exercice 1 sur 3 Configurer le contrôle d'intégrité Réussi À revoir

Le site de suivi des colis est installé dans /srv/suivi sur srv-web : le code dans /srv/suivi/app, les fichiers déposés par les clients dans /srv/suivi/uploads, un cache dans /srv/suivi/app/cache. Le fichier de configuration de la base de données est /srv/suivi/app/config.php. Écris la section <syscheck> de l'agent.conf du groupe serveurs-web qui surveille ce qu'il faut, au bon rythme, en justifiant chaque choix.

Voir la réponseMasquer la réponse de l'exercice 1
xml
<agent_config>
  <syscheck>
    <directories realtime="yes" report_changes="yes">/srv/suivi/app</directories>
    <ignore>/srv/suivi/app/cache</ignore>
    <nodiff>/srv/suivi/app/config.php</nodiff>
  </syscheck>
</agent_config>
  • /srv/suivi/app en temps réel avec les différences : le code ne change que lors d'un déploiement ; une modification hors déploiement (porte dérobée ajoutée dans un fichier PHP) doit être vue tout de suite, avec la ligne ajoutée.
  • Le cache exclu : il change à chaque requête, il noierait les alertes.
  • config.php sans différence (nodiff) : il contient le mot de passe de la base ; on veut savoir qu'il change, pas recopier le mot de passe dans l'alerte et dans l'indexeur.
  • /srv/suivi/uploads non surveillé par le FIM : les clients y déposent des fichiers en permanence. Ce dossier se protège autrement (pas d'exécution de scripts dans ce dossier, antivirus sur les fichiers déposés).

Tu avais trouvé ?

Exercice 2 sur 3 Lire des alertes FIM Réussi À revoir

Voici quatre alertes reçues un jeudi. Pour chacune, dis si tu la juges normale, à vérifier ou grave, et ce que tu fais.

HeureAgentRègleCheminDétail
09:02srv-web550/var/www/html/index.phpMode realtime ; un déploiement est prévu à 9 h dans le planning
10:47srv-gestion550c:\windows\system32\drivers\etc\hostsMode scheduled ; aucune intervention prévue
14:15srv-fichiers554d:\partages\direction\lisez-moi.txtMode whodata, utilisateur iroux ; 220 alertes 550 dans la même minute sur ce partage
16:30srv-ad550c:\windows\sysvol\domain\scripts\connexion.batMode whodata, utilisateur adm0-amercier ; ticket de changement ouvert ce jour
Voir la réponseMasquer la réponse de l'exercice 2
  • 09:02, normale : la modification correspond au déploiement planifié. On vérifie juste que l'heure et le fichier collent avec le planning (et, avec report_changes, que la différence ressemble au code attendu).
  • 10:47, grave : le fichier hosts d'un serveur ne change pas sans raison. On ouvre le fichier (la différence n'est pas jointe sans report_changes), on cherche quel nom a été redirigé vers quelle adresse, on vérifie les connexions récentes au serveur et on traite comme un incident tant que l'auteur n'est pas identifié. Le mode scheduled signifie que la modification a pu avoir lieu jusqu'à 12 heures plus tôt : il faudrait passer ce dossier en temps réel.
  • 14:15, grave et urgente : un fichier lisez-moi.txt créé au milieu de 220 modifications en une minute, c'est le schéma d'un rançongiciel (fichiers chiffrés, puis note de rançon). La règle de fréquence 100200 s'est déclenchée. On isole immédiatement le poste de iroux du réseau (c'est depuis sa session que les fichiers sont modifiés), on coupe éventuellement l'accès au partage, et on déclenche la procédure de réponse à un rançongiciel.
  • 16:30, normale, à documenter : un administrateur nominatif modifie un script de connexion, avec un ticket de changement. On rattache l'alerte au ticket. Sans ticket, ce serait grave : un script de SYSVOL modifié s'exécute sur tout le domaine.

Tu avais trouvé ?

Exercice 3 sur 3 FIM ou journal d'audit ? Réussi À revoir

Le responsable veut savoir « qui a lu le fichier des salaires » dans D:\Partages\Paie. Le contrôle d'intégrité de Wazuh, même en whodata, peut-il répondre ? Sinon, quelle source le peut, et comment l'amener dans Wazuh ?

Voir la réponseMasquer la réponse de l'exercice 3

Non : le FIM ne voit que les changements (ajout, modification, suppression, attributs). Une lecture ne change rien au fichier, donc aucun événement. La source qui voit les lectures est l'audit des accès aux objets de Windows : sous-catégorie Accès à l'objet > Système de fichiers activée par GPO, plus une liste de contrôle d'accès système (onglet Audit des paramètres de sécurité avancés du dossier) qui demande d'auditer la lecture pour les comptes concernés. Windows écrit alors l'événement 4663 dans le journal Sécurité. Mais la requête par défaut de l'agent Wazuh exclut le 4663, très bavard : il faut l'autoriser, idéalement seulement pour srv-fichiers, en adaptant la requête du canal Sécurité de cette machine. On le limite au seul dossier de la paie pour ne pas noyer le serveur.

Tu avais trouvé ?

Chapitre terminé !

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

chapitres
–
de série
–
du cours
–
Chapitre suivant : Vulnérabilités et conformité CIS : Vulnerability Detection et SCARevoir le sommaire du cours