Rédaction de règles Snort

CybersécuritéBeginner
Pratiquer maintenant

Introduction

Snort est un système de détection d'intrusion réseau (NIDS) open-source puissant. L'une de ses caractéristiques les plus marquantes est son langage flexible basé sur des règles, qui permet aux professionnels de la sécurité de définir des signatures pour les activités réseau malveillantes.

Les règles constituent le pont entre la théorie et la détection. Une idée de sécurité telle que « les scans de ports sont suspects » ne devient opérationnellement utile que lorsque vous l'exprimez sous une forme que le moteur peut évaluer face au trafic réel. Apprendre la syntaxe des règles enseigne donc bien plus que Snort lui-même : cela apprend aux défenseurs à traduire un comportement en une logique lisible par une machine.

Dans ce laboratoire, vous apprendrez la syntaxe fondamentale et l'anatomie des règles Snort personnalisées. Vous rédigerez des règles de base définissant les actions, protocoles, adresses IP, ports et options pour détecter et alerter spécifiquement sur des pings ICMP ciblés et des modèles de trafic TCP anormaux. À la fin de ce laboratoire, vous saurez comment construire, tester et valider vos propres règles Snort.

Comprendre la syntaxe et l'en-tête des règles

Dans cette étape, vous apprendrez la structure de base d'une règle Snort et créerez un fichier pour stocker vos règles personnalisées.

L'en-tête est en réalité une définition de périmètre. Il détermine quel trafic mérite d'être évalué plus en profondeur. C'est crucial, car une détection efficace commence par la réduction au maximum de l'ensemble du trafic candidat avant que des vérifications de contenu plus approfondies ne soient appliquées. Les en-têtes larges sont plus faciles à écrire, mais ils peuvent également générer davantage de bruit.

Une règle Snort est divisée en deux sections logiques principales : l'En-tête de règle (Rule Header) et les Options de règle (Rule Options).

L'En-tête de règle contient l'action de la règle, le protocole, les adresses IP source et destination, ainsi que les ports source et destination. Il dicte qui communique avec qui et quel protocole est utilisé. La syntaxe de base ressemble à ceci :

[Action] [Protocol] [Source IP] [Source Port] -> [Destination IP] [Destination Port] (Options)

Voici une décomposition des composants de l'en-tête :

  • Action : Ce que Snort doit faire lorsqu'il trouve un paquet correspondant aux critères de la règle (par exemple, alert, log, drop).
  • Protocol : Le protocole du trafic (par exemple, tcp, udp, icmp, ip).
  • IP Addresses : Les adresses IP source et destination. Vous pouvez utiliser any pour correspondre à toutes les adresses IP.
  • Ports : Les ports réseau source et destination. Vous pouvez utiliser any pour correspondre à tous les ports.
  • Direction Operator : Le symbole -> indique la direction du trafic (de la source vers la destination). Vous pouvez également utiliser <> pour un trafic bidirectionnel.

Pour commencer à écrire nos propres règles, nous avons besoin d'un fichier dédié. Assurez-vous d'être dans votre répertoire de travail par défaut (~/project) et créez un nouveau fichier nommé local.rules.

Utilisez la commande touch pour créer un fichier vide :

touch ~/project/local.rules

Vous pouvez vérifier que le fichier a été créé avec succès en listant le contenu de votre répertoire :

ls -l ~/project/local.rules

Vous devriez voir une sortie similaire à celle-ci, confirmant que le fichier existe et qu'il est actuellement vide :

-rw-r--r-- 1 labex labex 0 Jul 25 10:00 /home/labex/project/local.rules

Rédiger une règle de détection ICMP

Dans cette étape, vous allez rédiger votre première règle Snort pour détecter le trafic ICMP. L'ICMP (Internet Control Message Protocol) est couramment utilisé par des utilitaires réseau comme ping pour vérifier la connectivité.

L'ICMP est un bon exemple pédagogique car il est simple et facile à reconnaître, mais il illustre également un point opérationnel réel : toute détection ne signifie pas nécessairement une attaque. De nombreux réseaux utilisent légitimement le ping. Le travail de l'analyste consiste à combiner ce que la règle a détecté avec le contexte environnemental avant de décider si l'événement est bénin ou suspect.

Nous allons rédiger une règle qui déclenche une alerte chaque fois qu'un paquet ICMP circule depuis n'importe quelle source vers n'importe quelle destination.

Ouvrez votre fichier local.rules à l'aide de l'éditeur de texte nano :

nano ~/project/local.rules

Tapez la règle suivante dans l'éditeur :

alert icmp any any -> any any (msg:"ICMP Ping Detected"; sid:1000001; rev:1;)

Analysons ce que signifie cette règle :

  • alert : L'action à entreprendre. Snort générera une alerte.
  • icmp : Le protocole que nous surveillons.
  • any any -> any any : Le trafic peut provenir de n'importe quelle IP et n'importe quel port, et aller vers n'importe quelle IP et n'importe quel port.
  • (msg:"ICMP Ping Detected"; sid:1000001; rev:1;) : Ce sont les options de la règle. msg est le message d'alerte, sid est un identifiant Snort unique (les règles personnalisées doivent avoir un ID de 1 000 000 ou plus), et rev est le numéro de révision de la règle.

Après avoir tapé la règle, enregistrez le fichier et quittez nano en appuyant sur Ctrl+O, Enter pour confirmer le nom du fichier, puis Ctrl+X pour quitter.

Maintenant, testons si Snort comprend notre fichier de règles. Snort dispose d'un mode test (-T) qui vérifie la configuration et les règles pour détecter les erreurs de syntaxe sans réellement démarrer le moteur de détection.

Exécutez la commande suivante pour tester votre fichier de règles :

sudo snort -T -c ~/project/local.rules

Vous verrez beaucoup de texte s'afficher lors de l'initialisation de Snort. Regardez vers la fin de la sortie pour trouver un message de succès indiquant que Snort a validé la configuration avec succès :

Snort successfully validated the configuration!
Snort exiting

Si vous voyez ce message, votre règle ICMP est syntaxiquement correcte.

Rédiger une règle d'alerte sur port TCP

Dans cette étape, vous allez rédiger une règle pour détecter un trafic TCP spécifique. Alors que l'ICMP n'utilise pas de ports, le TCP et l'UDP en utilisent. Cela nous permet d'écrire des règles ciblant des services spécifiques, tels que HTTP (port 80) ou SSH (port 22).

Les ports vous donnent un contexte applicatif approximatif. Ils ne racontent pas toute l'histoire, mais ils sont souvent la première approximation utilisée par les défenseurs pour séparer les types de services. Une règle basée sur le port de destination 80 revient essentiellement à dire : « Je m'intéresse au trafic qui est probablement destiné à un service web ».

Nous allons rédiger une règle qui nous alerte chaque fois que quelqu'un tente de se connecter à un serveur web sur le port 80.

Ouvrez à nouveau votre fichier local.rules avec nano :

nano ~/project/local.rules

Ajoutez une nouvelle ligne sous votre règle ICMP existante et tapez la règle TCP suivante :

alert tcp any any -> any 80 (msg:"HTTP Traffic to Port 80 Detected"; sid:1000002; rev:1;)

Analysons l'en-tête de cette nouvelle règle :

  • alert tcp : Nous générons une alerte pour le protocole TCP.
  • any any : La source peut être n'importe quelle adresse IP et n'importe quel port.
  • -> : Le trafic circule vers la destination.
  • any 80 : La destination peut être n'importe quelle adresse IP, mais le port de destination doit être 80.

Notez que nous avons incrémenté le sid à 1000002. Chaque règle Snort doit avoir un identifiant Snort unique.

Enregistrez le fichier (Ctrl+O, Enter) et quittez nano (Ctrl+X).

Une fois de plus, il est recommandé de tester la syntaxe de votre règle pour vous assurer qu'il n'y a pas de fautes de frappe. Exécutez la commande de test Snort :

sudo snort -T -c ~/project/local.rules

Faites défiler jusqu'au bas de la sortie pour confirmer que Snort a validé la configuration avec succès. Vous devriez maintenant avoir deux règles chargées correctement.

Inclure les options de règle (Msg, SID, Rev)

Dans cette étape, nous allons approfondir la section Options de règle. La section des options est placée entre parenthèses () et contient des paires mot-clé/valeur séparées par des points-virgules ;.

Les options de règle permettent de transformer une catégorie de trafic brute en une alerte significative. Un msg clair aide un humain à comprendre l'événement. Un sid unique permet aux systèmes de suivre quelle règle s'est déclenchée. Une valeur rev permet aux équipes de gérer le contenu de détection au fil du temps. Ces champs soutiennent les opérations, pas seulement la syntaxe.

Vous avez déjà utilisé les trois options les plus fondamentales. La première est msg, qui est le message qui sera imprimé dans les journaux d'alerte et qui doit être descriptif. La seconde est sid, qui signifie Snort ID ; les règles écrites par les utilisateurs doivent avoir un SID supérieur à 1 000 000. La troisième est rev, représentant le numéro de révision ; chaque fois que vous modifiez une règle, vous devez incrémenter ce nombre pour suivre les versions.

Rédigeons une règle pour détecter les tentatives de connexion SSH (port 22) afin de pratiquer l'utilisation de ces options.

Ouvrez votre fichier local.rules :

nano ~/project/local.rules

Ajoutez la règle suivante à la fin du fichier :

alert tcp any any -> any 22 (msg:"SSH Connection Attempt"; sid:1000003; rev:1;)

Dans cette règle, nous avons défini un msg de base et lui avons attribué un nouvel identifiant unique (1000003).

Supposons que nous décidions plus tard de mettre à jour le message de cette règle pour être plus précis. Nous modifierions le msg et incrémenterions le rev à 2. Faisons cela maintenant. Modifiez la règle SSH que vous venez d'écrire au bas du fichier pour qu'elle ressemble à ceci :

alert tcp any any -> any 22 (msg:"Possible SSH Brute Force Attempt"; sid:1000003; rev:2;)

Enregistrez le fichier (Ctrl+O, Enter) et quittez nano (Ctrl+X).

Enfin, exécutez la vérification de syntaxe une dernière fois pour vous assurer que vos trois règles sont parfaitement formatées :

sudo snort -T -c ~/project/local.rules

Recherchez le message de validation réussie. Vous avez maintenant rédigé et structuré avec succès plusieurs règles Snort personnalisées en utilisant des en-têtes et des options.

Résumé

Dans ce laboratoire, vous avez acquis les compétences fondamentales nécessaires pour rédiger des règles Snort personnalisées. Vous avez exploré l'anatomie d'une règle, en la divisant en en-tête de règle et en options de règle. Vous avez rédigé avec succès des règles pour détecter le trafic ICMP général et le trafic sur des ports TCP spécifiques. De plus, vous avez appris à utiliser des options de règle essentielles comme msg, sid et rev pour rendre vos alertes descriptives et identifiables de manière unique. Ces compétences constituent la base de la création de signatures avancées de détection d'intrusion réseau.