Aller au contenu

Découverte de Snort 3

Mise à jour :

Logo Snort 3

Dans le domaine de la sécurité réseau, Snort est un outil incontournable pour détecter et analyser les intrusions en temps réel. Open source et largement utilisé, il permet de surveiller le trafic réseau et de repérer toute activité suspecte grâce à des règles personnalisées.

Dans ce premier guide, d’autres vont suivre, je vais vous montrer comment installer, configurer et utiliser Snort pour détecter les intrusions. Nous aborderons également la création de règles personnalisées pour répondre aux besoins spécifiques de votre infrastructure et l’analyse des alertes générées pour vous aider à interpréter les données et agir rapidement en cas d’incident.

C’est quoi Snort ?

Snort est un logiciel de détection d’intrusion réseau (Network Intrusion Detection System ou NIDS) reconnu pour sa capacité à surveiller et protéger les réseaux informatiques en temps réel.

Ce qui fait la force de Snort, c’est sa capacité à capturer le trafic réseau et à le comparer à une base de règles pour détecter les comportements suspects. Lorsque Snort identifie une activité suspecte, il génère une alerte qui peut être analysée pour mieux comprendre et répondre à l’incident. Ses fonctionnalités permettent ainsi de détecter des intrusions en temps réel, mais aussi de prévenir certaines attaques en agissant comme une barrière proactive.

Snort fonctionne selon plusieurs modes :

  • Mode sniffer : dans ce mode, Snort capture le trafic réseau en temps réel et l’affiche dans la console, ce qui est utile pour obtenir une vue immédiate de ce qui circule sur le réseau.
  • Mode enregistreur de paquets : ici, Snort capture le trafic et enregistre les paquets dans un fichier, permettant une analyse approfondie plus tard.
  • Mode IDS (Intrusion Detection System) : ce mode est le plus avancé, car il compare les paquets réseau à des règles prédéfinies et génère des alertes lorsque des menaces potentielles sont détectées.

Un peu d’Histoire

Depuis sa création en 1998 par Martin Roesch, Snort a évolué pour devenir l’un des outils de détection d’intrusion réseau les plus utilisés dans le monde. Initialement conçu comme un simple logiciel de capture de paquets, Snort a rapidement gagné en popularité grâce à sa flexibilité et à sa capacité à détecter un large éventail de menaces réseau.

Dans ses premières versions, Snort se limitait à des fonctionnalités de base, telles que la capture et l’enregistrement du trafic réseau. Cependant, avec le développement de la cybersécurité et l’apparition de nouvelles menaces, Snort a dû évoluer pour offrir des fonctionnalités plus avancées, comme le mode IDS qui permet de détecter les comportements malveillants à l’aide de règles définies par l’utilisateur ou téléchargées depuis des bases de données communautaires.

En 2013, Cisco Systems a acquis Sourcefire, la société derrière Snort, consolidant ainsi l’outil dans l’écosystème de sécurité de Cisco. Cette acquisition a permis d’accélérer le développement de nouvelles fonctionnalités, notamment l’intégration avec d’autres outils de sécurité réseau et la mise en place d’un support de haut niveau pour les entreprises. Depuis, Snort continue d’être amélioré, avec des mises à jour régulières de ses règles et des évolutions pour rester pertinent face aux menaces de plus en plus sophistiquées.

Installation de Snort

Passons à l’installation de Snort. Je vous propose d’installer la version 3.5.0 sur une machine Debian 12 (elle fonctionne également sur une Ubuntu 24.04), cette machine est ma machine de rebonds de mon homelab.

Étape 1 : Préparation de l’environnement et installation des dépendances

Commencez par mettre à jour votre système pour vous assurer que tous les paquets sont récents et compatibles avec l’installation.

Terminal window
sudo -i
apt update && apt upgrade -y

Ensuite, installez les dépendances essentielles pour compiler et exécuter Snort 3.5.0 :

Terminal window
apt install -y git wget build-essential libpcap-dev libpcre3-dev \
libdumbnet-dev zlib1g-dev libluajit-5.1-dev libssl-dev cmake libunwind-dev \
luajit hwloc bison flex liblzma-dev openssl pkg-config libhwloc-dev \
cpputest libsqlite3-dev uuid-dev libcmocka-dev libnetfilter-queue-dev \
libmnl-dev autotools-dev libfl-dev libgoogle-perftools-dev ethtool

Étape 2 : Installation de DAQ (Data Acquisition Library)

DAQ est une bibliothèque indispensable pour Snort puisqu’elle gère la capture de paquets. DAQ permet à Snort de fonctionner avec plusieurs moteurs de capture comme pcap ou afpacket.

  1. Clonez le dépôt DAQ :

    Terminal window
    git clone https://github.com/snort3/libdaq.git
  2. Configurez, compilez et installez DAQ :

    Terminal window
    cd libdaq
    ./bootstrap
    ./configure
    make
    sudo make install
    ldconfig

    DAQ est maintenant installé et prêt à être utilisé comme bibliothèque de capture pour Snort.

Étape 3 : Téléchargement et installation de Snort 3.5.0

  1. Téléchargez Snort 3.5.0 depuis le site officiel :

    Terminal window
    cd ..
    wget https://github.com/snort3/snort3/archive/refs/tags/3.5.0.0.tar.gz
  2. Extrayez l’archive :

    Terminal window
    tar -xzvf 3.5.0.0.tar.gz
    cd snort3-3.5.0.0
  3. Configurez Snort en incluant les options pour gperftools et DAQ :

    Terminal window
    ./configure_cmake.sh --prefix=/usr/local --enable-tcmalloc
  4. Compilez et installez Snort :

    Terminal window
    cd build
    make
    make install
    ldconfig
  5. Vérifiez l’installation de Snort :

    Terminal window
    snort -V
    root@test:~/libdaq/snort3-3.5.0.0/build# snort -V
    ,,_ -*> Snort++ <*-
    o" )~ Version 3.5.0.0
    '''' By Martin Roesch & The Snort Team
    http://snort.org/contact#team
    Copyright (C) 2014-2024 Cisco and/or its affiliates. All rights reserved.
    Copyright (C) 1998-2013 Sourcefire, Inc., et al.
    Using DAQ version 3.0.17
    Using libpcap version 1.10.4 (with TPACKET_V3)
    Using LuaJIT version 2.1.1703358377
    Using LZMA version 5.4.5
    Using OpenSSL 3.0.13 30 Jan 2024
    Using PCRE version 8.39 2016-06-14
    Using ZLIB version 1.3

Snort 3 est maintenant installé et prêt à être configuré et utilisé pour la détection d’intrusions réseau.

Configuration de l’interface réseau

Pour que Snort puisse analyser l’ensemble du trafic réseau sur une interface, il est souvent nécessaire de placer l’interface réseau en mode promiscuous (ou mode promisc). Cette configuration est essentielle pour un système de détection d’intrusion, car elle permet de capturer tous les paquets qui passent par l’interface, même ceux qui ne lui sont pas directement destinés. Voyons en détail ce qu’est le mode promisc et comment l’activer pour une interface réseau, ici enp1s0.

Qu’est-ce que le mode PROMISC ?

En fonctionnement normal, une carte réseau filtre le trafic pour ne traiter que les paquets adressés spécifiquement à son adresse MAC ou diffusés en broadcast. Autrement dit, elle ignore les paquets destinés aux autres adresses du réseau, ce qui est généralement suffisant pour des usages standards.

En revanche, en mode promiscuous (ou mode promisc), l’interface réseau capture tous les paquets qui transitent, peu importe leur destination. Cette configuration est idéale pour des outils de surveillance réseau comme Snort, car elle permet d’obtenir une vue complète du trafic circulant sur le réseau. Cela aide Snort à détecter des menaces, même si celles-ci visent d’autres hôtes que celui sur lequel Snort est installé.

Configuration de l’interface

Sous Linux, il est simple d’activer le mode promisc pour une interface réseau en utilisant des commandes comme ip ou ifconfig. Voici les étapes pour activer ce mode pour l’interface enp1s0. Remplacez le nom de l’interface réseau en fonction de votre configuration.

Par ailleurs, pour éviter que Snort ne tronque les paquets volumineux, nous devons désactiver certaines fonctions d’offloading au niveau de l’interface réseau. Ces fonctions sont souvent activées par défaut pour améliorer les performances du réseau, mais elles peuvent interférer avec la capture de paquets complète requise par Snort.

Étape 1 : Activer le mode promiscuous

  1. Pour activer le mode promiscuous sur l’interface réseau enp1s0, exécutez la commande suivante :

    Terminal window
    sudo ip link set enp1s0 promisc on
    • enp1s0 doit être remplacé par le nom de l’interface que vous souhaitez utiliser si celui-ci diffère.
  2. Vérifiez que l’interface est bien en mode promiscuous avec la commande suivante :

    Terminal window
    ip link show enp1s0

    Vous devriez voir une mention PROMISC dans la liste des options de l’interface enp1s0, ce qui confirme qu’elle est bien configurée pour capturer l’ensemble du trafic.

Étape 2 : Désactiver l’Interface Offloading

L’Interface Offloading est une série d’optimisations matérielles utilisées pour décharger le traitement des paquets vers la carte réseau, ce qui peut réduire la charge CPU. Cependant, ces options peuvent causer des problèmes avec Snort, notamment en tronquant les paquets de plus de 1518 octets, ce qui empêche Snort de capturer certaines menaces de manière complète.

Nous devons désactiver les fonctionnalités GRO (Generic Receive Offload) et LRO (Large Receive Offload), qui sont souvent activées par défaut sur les interfaces réseau.

  1. Pour vérifier si GRO et LRO sont activés, exécutez la commande suivante :

    Terminal window
    ethtool -k enp1s0 | grep -E 'generic-receive-offload|large-receive-offload'

    Vous verrez un résultat similaire à ceci si GRO ou LRO sont activés :

    Terminal window
    generic-receive-offload: on
    large-receive-offload: off [fixed]

    Note : Si vous voyez on [fixed] pour l’une de ces options, cela signifie que l’interface réseau ne permet pas de les désactiver, et il pourrait être nécessaire de changer de matériel ou d’interface si ce problème persiste.

  2. Désactivation de GRO et LRO

    Pour désactiver ces fonctions et garantir que Snort puisse capturer des paquets de taille maximale, exécutez les commandes suivantes :

    Terminal window
    ethtool -K enp1s0 gro off
    ethtool -K enp1s0 lro off
    • gro off désactive le Generic Receive Offload.
    • lro off désactive le Large Receive Offload.
  3. Vérifiez de nouveau les paramètres pour vous assurer que GRO et LRO sont bien désactivés :

    Terminal window
    ethtool -k enp1s0 | grep -E 'generic-receive-offload|large-receive-offload'
    generic-receive-offload: off
    large-receive-offload: off [fixed]

    Le résultat devrait désormais montrer que ces options sont désactivées (off), ce qui garantit que l’interface capturera les paquets dans leur intégralité, même pour ceux dépassant 1518 octets.

Étape 3 : Rendre les changements permanents

Les configurations effectuées pour le mode promiscuous et la désactivation de l’offloading peuvent être temporaires et réinitialisées après un redémarrage. Pour rendre ces modifications permanentes :

  1. Activer le mode promiscuous au démarrage

    Créez ou éditez un fichier de service pour appliquer cette configuration au démarrage. Par exemple, créez un script dans /etc/systemd/system/promisc-mode.service :

    Terminal window
    sudo nano /etc/systemd/system/promisc-mode.service

    Ajoutez-y les lignes suivantes :

    [Unit]
    Description=Set Snort 3 NIC in promiscuous mode and Disable GRO, LRO on boot
    After=network.target
    [Service]
    Type=oneshot
    ExecStart=/usr/sbin/ip link set dev enp1s0 promisc on
    ExecStart=/usr/sbin/ethtool -K enp1s0 gro off lro off
    TimeoutStartSec=0
    RemainAfterExit=yes
    [Install]
    WantedBy=default.target
    EOL

    Activez ensuite le service pour qu’il démarre automatiquement :

    Terminal window
    sudo systemctl enable promisc-mode.service

Configuration de base de Snort

Après avoir installé Snort 3.5.0 avec toutes les dépendances, la prochaine étape est la configuration initiale pour que Snort puisse analyser le trafic réseau efficacement. Le fichier de configuration principal de Snort est snort.lua (au lieu de snort.conf dans les versions précédentes). Nous allons voir comment configurer Snort pour surveiller une interface spécifique, ici enp1s0, et comment définir les paramètres de base.

Étape 1 : Ouvrir et éditer le fichier de configuration

Le fichier de configuration par défaut pour Snort 3 est un fichier Lua généralement situé dans /usr/local/etc/snort/snort.lua. Commencez par ouvrir ce fichier dans un éditeur de texte :

Terminal window
sudo nano /usr/local/etc/snort/snort.lua

Étape 2 : Configurer l’interface réseau

Dans le fichier de configuration, spécifiez l’interface réseau à surveiller. Dans ce cas, nous utiliserons enp1s0 comme interface pour capturer le trafic.

  1. Localisez la section qui définit l’interface réseau et modifiez-la pour qu’elle pointe vers enp1s0 :

    -- Interface à surveiller
    interface = "enp1s0"
  2. Cette interface sera maintenant surveillée en continu par Snort, permettant de capturer tout le trafic entrant et sortant sur cette interface.

Étape 3 : Définir les réseaux surveillés et externes

Pour que Snort puisse distinguer le trafic local du trafic externe, il est essentiel de définir les variables HOME_NET et EXTERNAL_NET dans le fichier snort.lua. Cela aide Snort à générer des alertes spécifiques au réseau surveillé.

  1. Dans la section des variables réseau, configurez les valeurs pour HOME_NET et EXTERNAL_NET. Par exemple :

    HOME_NET = '192.168.20.0/24'
    EXTERNAL_NET = 'any'
    • HOME_NET : définit le sous-réseau local (remplacez 192.168.20.0/24 par votre réseau local).
    • EXTERNAL_NET : any signifie que tout ce qui n’est pas dans HOME_NET sera considéré comme externe.

Étape 6 : Activer les règles de détection

Les règles de détection permettent à Snort d’identifier les menaces. En fonction de votre environnement, vous pouvez activer des règles spécifiques dans le fichier snort.lua :

  1. Incluez les fichiers de règles nécessaires pour analyser les menaces. Si vous avez téléchargé des règles, comme les règles de base ou les règles communautaires de Snort, assurez-vous de spécifier leur emplacement dans snort.lua :

    ips =
    {
    -- use this to enable decoder and inspector alerts
    enable_builtin_rules = true,
    include = RULE_PATH .. "/local.rules",
    -- use include for rules files; be sure to set your path
    -- note that rules files can include other rules files
    -- (see also related path vars at the top of snort_defaults.lua)
    variables = default_variables
    }

    Modifiez le chemin vers le fichier local.rules selon l’emplacement de vos fichiers de règles.

  2. Enregistrez les modifications et quittez l’éditeur de texte.

Etape 6 : Créer une règle

Pour tester la configuration, nous allons créer une règle simple qui déclenche une alerte lorsqu’un paquet ICMP (ping) est reçu.

Commençons par créer les dossiers et les fichiers nécessaires :

Terminal window
mkdir /usr/local/etc/rules
mkdir /usr/local/etc/so_rules/
mkdir /usr/local/etc/lists/
touch /usr/local/etc/rules/local.rules
touch /usr/local/etc/lists/default.blocklist
mkdir /var/log/snort

Editez le fichier local.rules pour y ajouter la règle suivante :

alert icmp any any -> $HOME_NET any (msg:"Ping ICMP détecté"; sid:1000001; rev:1;)

Étape 7 : Tester la configuration

Avant de lancer Snort en mode de détection, vérifiez que le fichier de configuration ne contient pas d’erreurs :

Terminal window
sudo snort -T -c /usr/local/etc/snort/snort.lua -i enp1s0

Cette commande teste la configuration et renvoie un message de succès si aucune erreur n’est détectée.

Test simple

Une fois que Snort est installé et configuré, il est essentiel de tester son bon fonctionnement pour s’assurer qu’il détecte bien les événements réseau. Un test simple consiste à utiliser la commande ping depuis une autre machine pour générer un type de trafic réseau courant. Cette opération permettra de vérifier que Snort capture les paquets ICMP (Internet Control Message Protocol) et génère une alerte en conséquence.

Étape 1 : Démarrer Snort

Pour que la nouvelle règle soit prise en compte, Démarrez Snort en spécifiant le fichier de configuration, le fichier de règles et l’interface à surveiller :

Terminal window
sudo snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules -i enp1s0 -A alert_fast -s 65535 -k none

Snort est maintenant prêt à surveiller le trafic ICMP et à générer des alertes lorsqu’il détecte un ping.

Étape 2 : Lancer un ping depuis une autre machine

  1. Depuis une autre machine sur le même réseau, envoyez un ping vers l’adresse IP de la machine sur laquelle Snort est configuré. Par exemple :

    Terminal window
    ping 192.168.20.92

    Remplacez 192.168.20.92 par l’adresse IP de la machine surveillée par Snort.

  2. Pendant que le ping est en cours, Snort devrait capturer les paquets ICMP et déclencher la règle que nous avons ajoutée, générant ainsi une alerte.

Étape 3 : Vérifier les messages

Sur la machine où a été lancé Snort, vérifiez les messages d’alerte dans la sortie standard :

Terminal window
--------------------------------------------------
pcap DAQ configured to passive.
Commencing packet processing
++ [0] enp1s0
11/04-12:09:02.738312 [**] [1:10000001:0] "ICMP Traffic Detected" [**] [Priority: 0] {ICMP} 192.168.1.92 -> 192.168.1.1
11/04-12:09:02.738900 [**] [1:10000001:0] "ICMP Traffic Detected" [**] [Priority: 0] {ICMP} 192.168.1.92 -> 192.168.1.1
11/04-12:09:02.738921 [**] [1:10000001:0] "ICMP Traffic Detected" [**] [Priority: 0] {ICMP} 192.168.1.92 -> 192.168.1.1
11/04-12:09:02.739560 [**] [1:10000001:0] "ICMP Traffic Detected" [**] [Priority: 0] {ICMP} 192.168.1.92 -> 192.168.1.1
11/04-12:09:02.739579 [**] [1:10000001:0] "ICMP Traffic Detected" [**] [Priority: 0] {ICMP} 192.168.1.92 -> 192.168.1.1
11/04-12:09:02.740159 [**] [1:10000001:0] "ICMP Traffic Detected" [**] [Priority: 0] {ICMP} 192.168.1.92 -> 192.168.1.1

Si aucune alerte n’est générée, voici quelques étapes de dépannage :

  • Assurez-vous que Snort est bien en mode promiscuous (ip link show enp1s0 doit montrer PROMISC).
  • Vérifiez que Snort utilise le fichier local.rules et que la règle ICMP y est bien ajoutée.
  • Assurez-vous que la commande ping est envoyée vers l’adresse IP exacte de la machine sur laquelle Snort est configuré.

Conclusion

Ce guide constitue une première étape dans l’apprentissage et l’utilisation de Snort pour surveiller et protéger un réseau. Nous avons abordé l’installation de Snort 3.5.0, la configuration de base, l’activation du mode promiscuous, ainsi qu’un test simple pour vérifier la détection de trafic ICMP. En suivant ces étapes, vous avez maintenant une installation opérationnelle capable de détecter des événements de base, un socle essentiel pour renforcer la sécurité de votre réseau.

Les possibilités offertes par Snort sont vastes, et de nombreux sujets restent à explorer pour approfondir vos connaissances et adapter davantage Snort aux besoins spécifiques de votre environnement. Dans les prochains guides, nous aborderons des sujets plus avancés, tels que :

  • Téléchargement de règles de détection de la communauté : comprendre la syntaxe des règles pour concevoir des alertes adaptées aux menaces spécifiques de votre réseau.
  • Automatisation des mises à jour des règles : mise en place de PulledPork pour automatiser les mises à jour des règles et rester à jour face aux nouvelles menaces.
  • Utilisation avancée des préprocesseurs : configurer des préprocesseurs comme HTTP Inspect et Stream5 pour analyser en profondeur le trafic spécifique.
  • Analyse et gestion des logs avec des outils tiers : utilisation de Snorby, ELK Stack, ou Wireshark pour analyser et gérer les alertes générées par Snort.

Ces prochaines étapes vous permettront de tirer le meilleur parti de Snort et d’en faire un allié précieux pour une surveillance réseau proactive et efficace.

Liste des ressources pour approfondir Snort

  • Site officiel de Snort : https://www.snort.org/ Accès aux dernières versions de Snort, téléchargements, règles et documentation officielle.

  • Documentation de Snort 3 : https://docs.snort.org/ Guide complet pour la configuration, les préprocesseurs, et les règles spécifiques à Snort 3.

  • Projet GitHub de Snort : https://github.com/snort Code source, issues, et contributions communautaires pour Snort.

  • Sources utilisées :