Présentation de l'activité
Vous avez précédemment étudié l'analyse des paquets ainsi que la syntaxe de base et les composants des règles et des signatures des systèmes de détection des intrusions (IDS). Vous avez également appris à examiner une signature prérédigée et la sortie de son journal dans Suricata, un système de détection et de prévention des intrusions, et un outil d'analyse réseau Open Source.
Dans cet atelier, vous allez en apprendre plus sur les alertes et les journaux de Suricata, y compris sur le processus général de création de règles.
L'outil Suricata surveille les interfaces réseau et applique des règles aux paquets transmis via l'interface. Suricata détermine si chaque paquet doit générer une alerte et être abandonné, rejeté ou autorisé à être transmis via l'interface.
Les réseaux source et de destination doivent être spécifiés dans la configuration de Suricata. Vous pouvez rédiger des règles personnalisées pour spécifier le trafic à traiter.
Vous examinerez une règle et vous vous entraînerez à déclencher des alertes sur le trafic réseau à l'aide de Suricata. Vous analyserez également les sorties des journaux, comme les fichiers fast.log et eve.json. Cela vous aidera à comprendre certains des journaux et des alertes générés par Suricata.
C'est parti !
Remarque : Les termes règles et signatures sont utilisés de manière interchangeable dans cet atelier.
Scénario
Dans ce scénario, vous êtes un analyste de sécurité et devez surveiller le trafic sur le réseau de votre employeur. Vous devrez configurer Suricata et l'utiliser pour déclencher des alertes.
Voici comment vous allez réaliser cette activité : Pour commencer, vous allez découvrir les règles personnalisées dans Suricata. Ensuite, vous allez exécuter Suricata avec une règle personnalisée pour le déclencher, puis examiner les journaux de sortie dans le fichier fast.log. Pour terminer, vous allez examiner la sortie supplémentaire générée par Suricata dans le fichier journal eve.json standard.
Pour les tests que vous devrez réaliser dans cet atelier, nous vous avons fourni un fichier sample.pcap et un fichier custom.rules. Vous les trouverez dans votre dossier de base.
Commençons par définir les fichiers avec lesquels vous allez travailler dans cet atelier :
-
Le fichier sample.pcap est un fichier de capture de paquets qui contient un exemple de données de trafic réseau, dont vous vous servirez pour tester les règles de Suricata. Cela vous permettra de simuler et de reproduire l'exercice qui consiste à surveiller le trafic réseau.
-
Le fichier custom.rules contient une règle personnalisée au début de l'atelier. Vous y ajouterez des règles et les exécuterez en fonction des données du trafic réseau contenues dans le fichier sample.pcap.
-
Le fichier fast.log contiendra les alertes générées par Suricata. Au début de l'atelier, ce fichier est vide. Chaque fois que vous testez une règle, ou un ensemble de règles, par rapport à l'exemple de données du trafic réseau, Suricata ajoute une nouvelle ligne d'alerte au fichier fast.log lorsque toutes les conditions de l'une des règles sont satisfaites. Vous trouverez le fichier fast.log dans le répertoire /var/log/suricata une fois Suricata lancé. Le format du fichier fast.log est considéré comme obsolète et n'est pas recommandé pour les tâches de gestion des incidents ou de recherche de menaces. Vous pouvez toutefois l'utiliser pour effectuer des vérifications rapides ou des tâches liées à l'assurance qualité.
-
Le fichier eve.json est le journal principal standard par défaut pour les événements générés par Suricata. Il contient des informations détaillées sur les alertes déclenchées, ainsi que sur d'autres événements de télémétrie concernant le réseau, au format JSON. Le fichier eve.json est généré lorsque Suricata s'exécute et se trouve également dans le répertoire /var/log/suricata.
Lorsque vous créez une règle, vous devez la tester pour vérifier qu'elle fonctionne comme prévu. Vous pouvez utiliser le fichier fast.log afin de comparer rapidement le nombre d'alertes générées chaque fois que vous exécutez Suricata pour tester une signature par rapport au fichier sample.pcap.
C'est parti !
Remarque : Au début de l'atelier, votre compte utilisateur analyst est déjà connecté à un shell Bash. Vous pouvez commencer l'exercice dès que vous avez cliqué sur le bouton Start Lab (Démarrer l'atelier).
Avis de non-responsabilité : Pour des performances et une compatibilité optimales, nous vous recommandons d'utiliser Google Chrome ou Mozilla Firefox pour accéder aux ateliers.
Démarrer l'atelier
Vous devez démarrer l'atelier pour accéder aux supports de cours. Pour cela, cliquez sur le bouton vert "Démarrer l'atelier" en haut de l'écran.

Après avoir cliqué sur le bouton Démarrer l'atelier, vous verrez une interface système où vous pourrez suivre les prochaines étapes de l'atelier. Elle devrait se présenter comme suit :

Une fois que vous aurez terminé toutes les tâches, reportez-vous à la section "Terminer l'atelier" qui suit les tâches pour savoir comment mettre fin à l'atelier.
Tâche 1 : Examiner une règle personnalisée dans Suricata
Le répertoire /home/analyst contient un fichier custom.rules qui définit les règles du trafic réseau et que Suricata capture.
Dans cette tâche, vous allez découvrir la composition de la règle Suricata définie dans le fichier custom.rules.
- Utilisez la commande
cat pour afficher la règle dans le fichier custom.rules :
cat custom.rules
Remarque : Vous pouvez aussi utiliser la commande less pour lire le contenu du fichier une page à la fois, ce qui est pratique pour lire une sortie longue.
La commande renvoie la règle sous la forme d'une sortie dans le shell :
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"GET on wire"; flow:established,to_server; content:"GET"; http_method; sid:12345; rev:3;)
Cette règle se compose de trois éléments : une action, un en-tête et des options de règles.
Voyons chaque élément en détail.
Action

L'action est la première partie de la signature. Elle détermine l'action à réaliser lorsque toutes les conditions sont remplies.
Les actions varient en fonction du langage des règles du système de détection des intrusions du réseau (IDS réseau ou NIDS), mais alert, drop, pass et reject sont des actions courantes.
Dans notre exemple, le fichier ne contient qu'une seule action : alert. Le mot clé alert signifie qu'une alerte doit être émise pour le trafic réseau sélectionné. L'IDS inspectera les paquets de trafic et émettra une alerte si les conditions sont remplies.
Notez que l'action drop génère également une alerte, mais abandonne le trafic. L'action drop n'est effectuée que lorsque Suricata s'exécute en mode IPS.
L'action pass autorise le trafic à circuler via l'interface réseau. Elle peut être utilisée pour ignorer d'autres règles. Une règle pass peut permettre la création d'une exception à la règle drop. Par exemple, la signature de la règle suivante est identique à l'exemple précédent, si ce n'est qu'elle spécifie la seule adresse IP depuis laquelle le trafic peut être transmis :
pass http 172.17.0.77 any -> $EXTERNAL_NET any (msg:"BAD USER-AGENT";flow:established,to_server;content:!”Mozilla/5.0”; http_user_agent; sid: 12365; rev:1;)
L'action reject ne permet pas au trafic d'être transmis. Au lieu de cela, un paquet de réinitialisation TCP est envoyé et Suricata abandonne le paquet correspondant. Un paquet de réinitialisation TCP indique aux ordinateurs d'arrêter de s'envoyer des messages.
Dans cet atelier, vous utiliserez le plus souvent la règle alert.
Remarque :
L'ordre des règles désigne l'ordre dans lequel elles sont évaluées par Suricata. Les règles sont chargées dans l'ordre dans lequel elles sont définies dans le fichier de configuration. Cependant, Suricata les traite dans un ordre par défaut différent : pass, drop, reject et alert. L'ordre des règles affecte le verdict final pour un paquet.
En-tête

L'élément suivant de la signature est l'en-tête. L'en-tête définit le trafic réseau de la signature, qui inclut des attributs comme les protocoles, les adresses IP source et de destination, les ports source et de destination, ainsi que le sens du trafic.
Après le mot clé de l'action vient le champ du protocole. Dans cet exemple, le protocole http indique que la règle ne s'applique qu'au trafic HTTP.
Les paramètres du champ de protocole http sont $HOME_NET any -> $EXTERNAL_NET any. La flèche indique le sens du trafic, qui provient de l'adresse $HOME_NET et se dirige vers l'adresse IP de destination $EXTERNAL_NET.
$HOME_NET est une variable Suricata définie dans /etc/suricata/suricata.yaml. Vous pouvez l'utiliser dans les définitions de vos règles comme espace réservé pour votre réseau local ou domestique, afin d'identifier le trafic connecté aux systèmes au sein de votre organisation.
Dans cet atelier, $HOME_NET est défini comme le sous-réseau 172.21.224.0/20.
Le mot any signifie que Suricata capture le trafic provenant de n'importe quel port défini dans le réseau $HOME_NET.
Remarque : Le symbole $ marque le début d'une variable. Les variables servent d'espaces réservés pour stocker des valeurs.
Pour l'instant, nous savons que cette signature déclenche une alerte lorsqu'elle détecte n'importe quel trafic HTTP provenant du réseau domestique et se dirigeant vers le réseau externe.
Options des règles

Les nombreuses options des règles vous permettent de personnaliser les signatures à l'aide de paramètres supplémentaires. Configurer les options des règles vous permet de mieux définir le trafic réseau pour trouver exactement ce que vous cherchez. Comme dans cet exemple, les options des règles sont généralement placées entre parenthèses et séparées par des points-virgules.
Examinons plus en détail les options de notre exemple :
- L'option
msg: permet d'indiquer le texte de l'alerte. Dans ce cas, l'alerte affiche le texte “GET on wire” qui indique le motif de déclenchement de l'alerte.
- L'option
flow:established,to_server indique que les paquets du client vers le serveur doivent être mis en correspondance. Dans le cas présent, un serveur est défini comme étant l'appareil qui répond au paquet SYN initial par un paquet SYN-ACK.
- L'option
content:"GET" indique à Suricata de rechercher le mot GET dans le contenu de la partie http.method du paquet.
- L'option
sid:12345 (ID de la signature) est une valeur numérique unique qui sert à identifier la règle.
- L'option
rev:3 indique la révision de la signature qui est utilisée pour identifier la version de la signature. Ici, il s'agit de la révision 3.
En résumé, cette signature déclenche une alerte chaque fois que Suricata détecte le texte GET comme méthode HTTP dans un paquet HTTP provenant du réseau domestique et se dirigeant vers le réseau externe.
Cliquez sur Check my progress (Vérifier ma progression) pour vérifier que vous avez correctement effectué cette tâche.
Examiner une règle personnalisée dans Suricata
Tâche 2 : Déclencher une règle personnalisée dans Suricata
Maintenant que vous maîtrisez la composition d'une règle Suricata personnalisée, vous devez déclencher cette règle et examiner les journaux d'alerte générés par Suricata.
- Affichez les fichiers contenus dans le dossier
/var/log/suricata :
ls -l /var/log/suricata
Notez qu'avant l'exécution de Suricata, le répertoire /var/log/suricata est vide.
- Exécutez
suricata à l'aide des fichiers custom.rules et sample.pcap :
sudo suricata -r sample.pcap -S custom.rules -k none
Cette commande lance l'application Suricata et traite le fichier sample.pcap à l'aide des règles du fichier custom.rules. Le résultat renvoyé indique le nombre de paquets traités par Suricata.
Remarque : Dans cet atelier, vous devez utiliser sudo pour traiter les fichiers de capture de paquets avec Suricata, mais ce n'est pas forcément obligatoire dans un environnement réel.
Examinons maintenant les options de la commande :
- L'option
-r sample.pcap spécifie un fichier d'entrée pour simuler un trafic réseau. Il s'agit, dans ce cas, du fichier sample.pcap.
- L'option
-S custom.rules indique à Suricata d'utiliser les règles définies dans le fichier custom.rules.
- L'option
-k none indique à Suricata de désactiver toutes les vérifications de somme de contrôle.
Pour mémoire, les sommes de contrôle permettent de détecter si un paquet a été modifié pendant le transit. Comme vous utilisez un trafic réseau provenant d'un exemple de fichier de capture de paquets, vous n'avez pas besoin que Suricata vérifie l'intégrité de la somme de contrôle.
Suricata ajoute une nouvelle ligne d'alerte au fichier /var/log/suricata/fast.log lorsque toutes les conditions de l'une des règles sont remplies.
- Affichez à nouveau les fichiers contenus dans le dossier
/var/log/suricata :
ls -l /var/log/suricata
Notez qu'après avoir exécuté Suricata, le répertoire /var/log/suricata contient quatre fichiers, dont fast.log et eve.json. Vous allez examiner ces fichiers plus en détail.
- Utilisez la commande
cat pour afficher le fichier fast.log généré par Suricata :
cat /var/log/suricata/fast.log
Le journal renvoyé contient des entrées d'alerte :
11/23/2022-12:38:34.624866 [**] [1:12345:3] GET on wire [**] [Classification: (null)] [Priority: 3] {TCP} 172.21.224.2:49652 -> 142.250.1.139:80
11/23/2022-12:38:58.958203 [**] [1:12345:3] GET on wire [**] [Classification: (null)] [Priority: 3] {TCP} 172.21.224.2:58494 -> 142.250.1.139:80
Chaque ligne ou entrée du fichier fast.log correspond à une alerte générée par Suricata quand il traite un paquet qui remplit les conditions d'une règle de génération d'alerte. Chaque ligne d'alerte inclut le message qui identifie la règle à l'origine de l'alerte, ainsi que la source, la destination et le sens du trafic.
Cliquez sur Check my progress (Vérifier ma progression) pour vérifier que vous avez correctement effectué cette tâche.
Déclencher une règle personnalisée dans Suricata
Tâche 3 : Examiner la sortie du fichier eve.json
Dans cette tâche, vous allez examiner la sortie supplémentaire que Suricata génère dans le fichier eve.json.
Comme indiqué précédemment, ce fichier se trouve dans le répertoire /var/log/suricata/.
Le fichier eve.json est le fichier journal standard principal de Suricata. Il contient beaucoup plus de données que le fichier fast.log. Ces données sont stockées au format JSON, ce qui est bien plus pratique pour l'analyse et le traitement avec d'autres applications.
- Utilisez la commande
cat pour afficher les entrées du fichier eve.json :
cat /var/log/suricata/eve.json
Le contenu brut du fichier est renvoyé. Comme vous pouvez le constater, un grand nombre de données est renvoyé, mais le format ne permet pas de les comprendre aisément.
- Utilisez la commande
jq pour afficher les entrées dans un meilleur format :
jq . /var/log/suricata/eve.json | less
Remarque : Vous pouvez utiliser les touches f et b (minuscules) pour avancer ou reculer dans la sortie. De plus, si vous saisissez une commande incorrecte et qu'elle ne parvient pas à revenir à l'invite de ligne de commande, vous pouvez appuyer sur CTRL+C pour arrêter le processus et forcer le shell à revenir à l'invite de ligne de commande.
- Appuyez sur Q pour quitter la commande
less et revenir à l'invite de ligne de commande.
Notez que la sortie est bien plus facile à lire qu'avec le résultat de la commande cat.
Remarque :
L'outil jq est très pratique pour traiter les données JSON. Toutefois, une explication complète de ses fonctionnalités sort du cadre de cet atelier.
Réponse : La première alerte indique une valeur de 3 en propriété de gravité.
- Utilisez la commande
jq pour extraire des données d'événement spécifiques du fichier eve.json :
jq -c "[.timestamp,.flow_id,.alert.signature,.proto,.dest_ip]" /var/log/suricata/eve.json
Remarque : La commande jq ci-dessus extrait de la charge utile JSON les champs spécifiés dans la liste entre crochets. Les champs sélectionnés sont le code temporel (.timestamp), le flux (.flow_id), la signature ou le message d'alerte (.alert.signature), le protocole (.proto), et l'adresse IP de destination (.dest_ip).
Réponse : L'adresse IP de destination est 142.250.1.102.
Réponse : Le premier événement du fichier eve.json a la signature d'alerte "GET on WIRE".
- Utilisez la commande
jq pour afficher tous les journaux d'événements associés à un flow_id spécifique du fichier eve.json. La valeur de flow_id est un nombre à 16 chiffres. Elle varie pour chaque entrée de journal. Remplacez X par n'importe quelle valeur de flow_id renvoyée par la requête précédente :
jq "select(.flow_id==X)" /var/log/suricata/eve.json
Remarque :
Un flux réseau désigne une séquence de paquets entre une source et une destination qui partagent certaines caractéristiques, comme des adresses IP, des protocoles, etc. En cybersécurité, le flux du trafic réseau aide les analystes à comprendre le comportement du trafic réseau, et ainsi à identifier et analyser les menaces. Suricata attribue un flow_id unique à chaque flux réseau. Tous les journaux d'un flux réseau partagent le même flow_id. Le champ flow_id est dès lors bien pratique pour corréler le trafic réseau appartenant aux mêmes flux réseau.
Cliquez sur Check my progress (Vérifier ma progression) pour vérifier que vous avez correctement effectué cette tâche.
Examiner la sortie du fichier eve.json
Conclusion
Bravo !
Vous avez terminé cette activité ! Vous êtes désormais capable d'utiliser Suricata pour déclencher des alertes concernant le trafic réseau.
Vous venez d'acquérir une expérience pratique concernant l'utilisation de Suricata pour :
- créer des règles personnalisées et les exécuter dans Suricata ;
- surveiller le trafic capturé dans un fichier de capture de paquets ;
- examiner la sortie des fichiers
fast.log et eve.json.
Vous avez acquis une compétence essentielle pour devenir analyste de sécurité.
Terminer l'atelier
Avant de terminer l'atelier, assurez-vous d'avoir accompli toutes les tâches à votre convenance et prenez connaissance des étapes ci-dessous :
- Cliquez sur End Lab (Terminer l'atelier), puis sur Submit (Envoyer). La fermeture de l'atelier supprimera votre accès au shell bash. Vous ne pourrez plus accéder au travail que vous y avez accompli.
- Après la fermeture de l'atelier, une boîte de dialogue d'enquête apparaît. Vous pouvez y noter l'atelier et laisser vos commentaires, si vous le souhaitez.
- Fermez l'onglet de navigateur de l'atelier pour revenir à votre cours.
- Rafraîchissez l'onglet de navigateur du cours après avoir indiqué que cet élément est terminé.