Publié le 6 février 2021 - par

Détection d’intrusion (IDS) avec Suricata sur Raspberry Pi

Cet article détaille l’installation et configuration de l’IDS Suricata sur un Raspberry Pi pour surveiller votre réseau local. Afin de surveiller l’ensemble des équipements de votre réseau local, nous utiliserons la fonctionnalité “port mirroring” d’un switch manageable ainsi qu’un petit routeur Wifi connecté à ce switch.

Repérez des activités anormales sur votre réseau local avec le système de détection d’intrusion (IDS) Suricata sur Raspberry Pi

Présentation

Suricata est un IDS (Intrusion Detection System) réseau basé sur des détections par signatures. Il analyse le trafic réseau afin d’y détecter des activités anormales et les tentatives d’intrusion.

Un Raspberry Pi est un hôte parfait pour Suricata dans le cadre d’un petit réseau local.

Afin de surveiller tous les équipements de votre réseau, l’IDS doit être en mesure d’en analyser tout le trafic. Ceci est possible grâce à l’utilisation d’un switch manageable supportant la fonction « port mirroring » permettant de dupliquer le trafic de tous les équipements et de l’envoyer vers l’IDS.

Afin de pouvoir également surveiller le trafic des équipements sans fil, il est nécessaire d’utiliser un petit routeur Wifi. Ce routeur doit être relié à un port du switch afin que le trafic Wifi soit également dupliqué vers l’IDS par la fonction « port mirroring ».

Matériel nécessaire

  • Raspberry Pi 3B ou Pi 4 – Modèle B
  • Switch manageable avec port mirroring Zyxel GS1200
  • Routeur Wifi TP-LINK TL-WR902AC

Architecture

L’IDS doit être capable d’analyser les trames provenant de tous les équipements de votre réseau.

Pour cela il faut que tous vos équipements soient reliés au switch qui utilise la fonction port mirroring pour transmettre toutes les trames reçues des « mirrored port » vers le « analysis port ». Le Raspberry Pi sur lequel l’IDS Suricata est installé est bien entendu relié sur cet « analysis port ».

Si vous souhaitez également surveiller vos équipement connectés via le réseau Wifi, il ne faudra pas les connecter au réseau Wifi de la box internet mais utiliser un petit routeur Wifi également connecté au switch sur un « mirrored port ».

Mon réseau local est le 192.168.1.0/24 et tous mes équipements y compris ceux qui sont connectés via le point d’accès Wifi appartiennent à ce réseau local.

Installation de Suricata sur votre Raspberry Pi

Installez Raspberry Pi OS ou Raspberry Pi OS Lite sur votre Raspberry Pi (Modèle 3B ou 4) disponible sur le site https://www.raspberrypi.org/software/

Installer l’IDS open source Suricata

Préparer l’installation en installant les dépendances nécessaires :

Télécharger les sources de Suricata :

Décompresser les sources :

Se placer dans le dossier Suricata :

Configurer l’installation du logiciel :

Compiler suricata :

Installer suricata :

Se placer dans le dossier suricata-update :

Compiler suricata-update :

Installer suricata-update :

Se placer dans le dossier Suricata :

Finaliser l’installation de suricata en y incluant ses règles :

Mettre à jour les règles de suricata :

Configurer Suricata

Configurer suricata en éditant le fichier suricata.yaml :

Modifier la variable HOME_NET afin qu’elle contienne votre réseau local, par exemple :

Lancer Suricata

Lancer suricata avec la commande suivante :

-c <chemin> : fichier de configuration à utiliser

-i <interface> : interface Ethernet à surveiller

-S <chemin> : fichier contenant les règles à utiliser

Tester Suricata

Afin de tester le bon fonctionnement de suricata, il est utile de rajouter une règle qui affiche un avertissement à chaque réception d’un ICMP Echo (ping). Il faudra supprimer cette règle après ce test.

Ajouter la règle suivante dans /var/lib/suricata/rules/suricata.rules

Afficher le contenu du fichier de log :

Vous devriez voir dans le fichier de log l’alerte suivante :

Voici d’autres façons de tester le bon fonctionnement de Suricata :

  • Aller sur ce site avec un navigateur depuis un équipement de votre réseau local :

http://testmyids.com/

Doit produire l’alerte suivante :

  • Lancer la commande suivante depuis un shell Linux :

Doit produire l’alerte suivante :

Utiliser Suricata en mode service

Afin de pouvoir utiliser Suricata en tant que service, il faut créer le fichier « /etc/systemd/system/suricata.service » :

Avec le contenu suivant :

Et ensuite activer ce nouveau service avec la commande :

Nous pouvons maintenant utiliser Suricata en tant que service, et le démarrer avec la commande :

Pour le stopper :

Pour le relancer :

Pour vérifier l’état du service :

Le service se lancera maintenant automatiquement au démarrage du Raspberry Pi.

Éviter la perte de paquets

Suricata peut nécessiter quelques optimisations afin de fonctionner de façon optimale sur votre réseau. Cela dépend bien entendu du nombre d’équipements à surveiller et du trafic
généré.
Vérifier que la variable capture.kernel_drops dans le fichier /var/log/suricata/stats.log ne soit pas trop élevée. Idéalement elle doit rester à 0 et donc ne pas être affichée dans la liste des compteurs.

Dans le cas ci-dessus, 21617 paquets sur 2310188 ont été perdus, soit environ 1 %. C’est
acceptable mais cette perte peut être évitée.

Vous pouvez par exemple augmenter la valeur de la variable “ring-size” dans le fichier de configuration “/etc/suricata/suricata.yaml“. Attention, il faut bien entendu supprimer le “#” devant la variable dans le fichier suricata.yaml. Cette modification est en général suffisante pour éviter de perdre des paquets.

Modifier la valeur de ring-size en changeant la ligne suivante dans le fichier /etc/suricata/suricata.yaml :

par :

Après avoir augmenté cette variable à 30000, je n’observe plus de perte de paquets, même avec 7.8 millions de paquets reçus.

Je vous invite à lire la documentation de Suricata pour régler finement les paramètres de configuration ayant  un impact sur lesperformances du logiciel

Exploiter les fichiers de logs de Suricata

Suricata génère des fichiers de log dans le répertoire /var/log/suricata. En plus du trafic réseau et des activités suspectes qu’il détecte, Suricata logue également des informations de service et des statistiques sur le trafic réseau. Sur un Raspberry Pi il faudra prêter attention à la taille des logs générés qui peuvent rapidement saturer la carte SD utilisée pour leur stockage. Il faudra mettre en place un mécanisme de rotation de log afin d’éviter tout problème.

Les différents fichiers de logs

Voici les 4 fichiers de log générés par Suricata :

  • suricata.log : messages de démarrage de Suricata
  • stats.log : statistiques sur votre trafic réseau
  • fast.log : activités suspectes découvertes par Suricata
  • eve.json : trafic de votre réseau local ainsi que les activités suspectes au format JSON

Fichier de log des activités suspectes

Pour visualiser en direct les activités suspectes détectées par Suricata, il suffit de jeter un œil au fichier fast.log :

Voici un exemple d’activités suspectes détectées par Suricata enregistrées dans le fichier fast.log :

Rotation des fichiers de logs

La taille du fichier de log eve.json peut devenir rapidement très importante et occuper tout l’espace de la carte SD. L’utilisation du mécanisme logrotate intégré à Linux est très utile pour éviter ceci. Nous allons le configurer pour qu’il journalise les log de Suricata pendant 10 jours tout en limitant la taille de chaque fichier à 1 GB. Ainsi les logs ne pourront pas occuper plus de 10 GB sur la carte SD tout en ayant un historique sur les 10 derniers jours. Les historiques plus anciens sont automatiquement supprimés.
Créer un fichier « /etc/logrotate.d/suricata » ayant le contenu suivant :

Afin de vérifier que la rotation est correctement configurée et qu’elle fonctionne, vous pouver la forcer manuellement avec la commande :

Vous devriez alors bien voir les logs journalisés dans le répertoire /var/log/suricata/

Fichier de log du trafic réseau

La taille du fichier de log du trafic réseau « eve.json » peut devenir importante en fonction du trafic de votre réseau.
Si seules les alertes du fichier fast.log vous intéressent, désactivez les logs du fichier eve.json dans le fichier de configuration /etc/suricata/suricata.yaml. Mais attention, vous n’aurez pas de logs vous permettant d’analyser la cause des alertes.

Gérer les règles

L’efficacité de l’IDS Suricata repose sur la bonne gestion des règles. Il faut à la fois éviter les faux positifs et s’assurer que les règles utilisées sont à jour et permettent de détecter les menaces récentes.
Les règles de Suricata activées par défaut génèrent de nombreux faux positifs (alertes qui ne sont pas de réels problèmes). Je recommande de laisser tourner Suricata quelques heures en utilisant normalement vos équipements et d’analyser finement les alertes du fichier fast.log et désactiver certaines règles. Par exemple si vous utilisez Dropbox ou Skype sur votre réseau vous devrez désactiver les règles correspondantes afin de ne pas générer d’alertes inutiles pour votre réseau.
Afin de renforcer la sécurité de vos installations, vous pouvez également avoir besoin d’ajouter de nouvelles sources de règles ou de créer vos propres règles.
Nous allons voir comment gérer ceci dans les chapitres suivants.

Format des règles

Chaque règle Suricata est composée de la façon suivante :

action  en-tête   options

L’action correspond à l’action effectuée en cas de détection (alert, drop, pass…).

L’en-tête permet de définir le protocole (tcp, http, ftp, dns, tls…) ainsi que l’adresse IP et le port de la source et de la destination du trafic impliqué dans l’alerte.

Les options de la règle sont indiquées entre parenthèses et séparées par des virgules. Certaines options ont des paramètres, qui sont spécifiés par leur mot clé suivi de deux points et de la valeur du paramètres.

Les règles sont identifiées par leur identifiant de signature, le paramètre sid.
Par exemple, voici la règle 2012647 relative à l’utilisation de Dropbox :

Vous pouvez jeter un œil aux règles en éditant le fichier de règle de Suricata :

Désactiver certaines règles

En fonction de votre utilisation, certaines règles doivent être désactivées. Par exemple, si vous autorisez l’utilisation de Dropbox au sein de votre réseau, la règle de SID 2012647 doit être désactivée.
Éditer le fichier qui contient les règles à désactiver :

Ajouter la liste des règles à désactiver, identifiées par leur identifiant de signature (SID).
Voici un exemple de règles que j’ai désactivé sur mon installation :

Si besoin il est possible de désactiver toutes les règles appartenant à un même type de classification classtype. Par exemple, la classification Generic Protocol Command Decode génère beaucoup trop d’alertes à mon goût et il est possible de désactiver toutes les règles de cette classification.

Ensuite il faut mettre à jour les règles (cf.Mettre à jour les règles).

Ajouter une nouvelle source de règles

Il est possible d’ajouter de nouvelles règles provenant d’une source particulière.
Tout d’abord mettre à jour la liste de sources disponibles :

Ensuite visualiser les sources disponibles :

Afin de vérifier quelles sont les sources qui sont déjà activées, lancer la commande suivante :

Activer une nouvelle source, par exemple la source de règles oisf/trafficid.

Ensuite il faut mettre à jour les règles (cf.Mettre à jour les règles).

Mettre à jour les règles

Afin d’intégrer la détection des dernières menaces, il faut régulièrement mettre à jour les règles de Suricata en lançant la commande suivante :

Il suffit ensuite de relancer le service Suricata :

Utilisation des ressources du Raspberry Pi

A titre d’information, voici la consommation des ressources d’un Raspberry Pi 3 Modèle B faisant tourner Suricata.

Utilisation du processeur

En moyenne 27 % de CPU utilisés :

Utilisation de la mémoire

569 MB de mémoire utilisés :

Utilisation de la carte SD

2.6GB de disque utilisés :

Configuration du port mirroring sur le switch Zyxel GS1200-5

L’IDS Suricata tourne sur le Raspberry Pi qui est relié au port 5 du switch. Les équipements à surveiller sont reliés aux ports 1 à 4 du switch.
Afin de permettre d’analyser le trafic de tous les équipements reliés à ce switch, il faut configuré le port 5 comme monitor port et les ports 1 à 4 en tant que mirrored port dans leurs deux directions entrantes et sortantes.
Ainsi tous le trafic entrant ou sortant des ports 1 à 4 du switch sera recopié (mirrored) vers le port 5 afin d’être analysé par notre IDS Suricata tournant sur le Raspberry Pi.

Configuration du routeur Wifi

Le routeur Wifi est relié à un mirrored port du switch, il doit être configuré en mode Access Point. Ainsi les équipements qui y seront reliés en Wifi se trouveront sur le même réseau local et pourront être surveillés par notre IDS.

Voir la documentation du routeur si besoin, mais la configuration est très simple car il suffit de déclarer le mode d’opération Access Point et d’utiliser le type de LAN Smart IP (DHCP).

Conclusion

Merci stéphane pour cet article très complet qui permettra aux lecteurs intéressés par ce sujet de se lancer dans la détection d’intrusion grâce à un Raspberry Pi et à Suricata.

Si vous mettez cette solution en oeuvre, n’hésitez pas à laisser vos impressions et vos remarques dans la zone des commentaires ci-dessous.

Sources

 

 

 

Share Button

16 réflexions au sujet de « Détection d’intrusion (IDS) avec Suricata sur Raspberry Pi »

  1. Ping : Détection d’intrusion (IDS) avec Suricata sur Raspberry Pi – Framboise 314, le Raspberry Pi à la sauce française…. – Jhc Info

    1. Stéphane Potier Auteur de l’article

      Bonjour,
      Il est tout d’abord indispensable d’ajouter un switch qui gère le port mirroring afin de dupliquer tous les paquets qui transitent par ce switch et de les envoyer à l’IDS. Ensuite il faut tout simplement relier le câble Ethernet du TP-Link Wifi Mesh Deco M9 sur un port du switch plutôt que sur la box.
      Si cet équipement gère le mode point d’accès il faut le configurer ainsi. Sinon le seul inconvénient du mode routeur c’est que tous les équipements reliés via ce routeur Wifi seront visibles avec la même adresse IP (celle de ce routeur Wifi) par l’IDS.
      C’est le gros avantage du petit routeur Wifi que j’utilise dans le tuto. Car comme son nom ne l’indique pas, il n’est pas utilisé comme un routeur mais comme un simple point d’accès. Ce qui fait que les équipements reliés à ce point d’accès Wifi appartiennent au même réseau LAN que le switch et apparaissent bien avec leur adresse IP.
      Voilà j’espère avoir répondu à la question.

      Répondre
  2. tco

    Salut,

    Merci beaucoup, bonne lecture pour un dimanche matin 🙂
    Si le suricata ecoute deja que le wan en qq sorte, c’est déjà pas mal non ?, surveiller l’interne, est ce vraiment important ? (je manque de port sur le sw manageable et 2 wifi en routeur (pas en ap). Mais je pense que je vais essayer voir ce que ça donne. Merci pour l’article

    Répondre
    1. Stéphane Potier Auteur de l’article

      Oui si vous pouvez surveiller le WAN avec un IDS s’est déjà très bien, en général les menaces sont plutôt externes sur un petit réseau local à la maison (cadre de cet article).

      Répondre
  3. Nico

    Bonjour a tous,

    J’ai mis en place la solution ce weekend, avec un élément actif de chez HP.
    Par contre perte énorme du débit lan.
    Sans la surveillance des ports je suis en copie local à environ 70mb/s avec la surveillance je tombe à 5mb/s

    Répondre
    1. Stéphane Potier Auteur de l’article

      Bonjour,
      Par curiosité quel est cet élément actif de chez HP ?
      Avec la configuration du tuto je n’ai pas remarqué de perte de débit LAN.

      Répondre
    1. Stéphane Potier Auteur de l’article

      Le port utilisé pour analyser le trafic est bien configuré en GB ?
      Car je lis ceci sur un forum : Also another important factor. HP port mirror is limiting. Say you port mirror all your switch to a port which is 100mbit. Your whole network will run at the speed of 100mbit at best. https://www.reddit.com/r/networking/comments/1opeoq/port_mirroring_hp18108g_not_sure_if_im/

      https://support.hpe.com/hpesc/public/docDisplay?docId=kc0123166en_us&docLocale=en_US

      Répondre
  4. rubictus

    Merci pour l’article.
    La principale découverte pour moi reste le Zyxel GS1200 qu’on trouve à moins de 25€ sur amazon !
    Car effectivement, comme souligné au début de l’article, le principale prérequis pour utiliser un IDS, c’est de pouvoir dupliquer le flux réseau que l’on veut superviser. Un TAP cuivre coûte plus de 200€ (dispositif dédié pour dupliquer un flux réseau), un switch manageable même grand publique, c’est souvent autour de 50€

    Septique quant à la puissante du RPI3 pour analyser un flux gigabit (surtout que le port ethernet plafonne à environ 300 M/s), mais l’article me pousse à essayer (sur mon réseau domestique). Le but étant de choper des bruits fonds malveillant, pas forcément quand il y a un pic de charge.

    Répondre
    1. Stéphane Potier Auteur de l’article

      Bonjour,
      Oui le Pi 3 est limitant surtout à cause de son Ethernet 100 Mbit/s qui passe par un hub USB interne. Cependant sur un petit réseau local cela me suffit pour surveiller quelques PC, tablettes et smartphones.
      Le Pi 4 semble en effet une bonne alternative avec son Ethernet Gbit/s et un processeur plus puissant. Je vais l’utiliser par la suite. Autre point plus important est l’utilisation intensive de la SD pour les logs. Il est préférable d’installer un disque SSD sur le Pi pour éviter qu’elle ne tombe en panne au bout de 6 mois…

      Répondre
  5. Ping : Spot suspicious activity on your local network with Suricata Intrusion Detection System (IDS) on Raspberry Pi – Juliana Fajardini

  6. Ping : Spot suspicious activity on your local network with Suricata Intrusion Detection System (IDS) on Raspberry Pi – Juliana Fajardini

  7. Grsqual

    Franchement top ! Je suis sur RPI4 avec boot sur un SSD120Go + SW qui fait le job du mirroring !

    La prochaine étape serait de faire tourner un ELK pour exploiter l’ensemble 🙂

    Je suis à la recherche d’un tuto pour installer la stack …. si vous avez quelque chose je suis preneur !

    Ensuite on ira exploiter le eve.json ….

    Répondre
    1. Stéphane Potier Auteur de l’article

      Merci pour votre commentaire. 🙂
      Oui un tuto sur l’installation de la suite ELK serait une suite logique à cet article…
      Je mets ça sur ma todo pour les prochaines soirées et week-end 🙂
      PS : pour les non initiés ELK (Elasticsearch + Logstash + Kibana) est une suite de logiciels qui simplifierait la recherche et la visualisation des informations contenues dans les fichiers de logs générés par Suricata

      Répondre
  8. Metaplop

    Il faut voir si SELKS fonctionne sur rpi mais j’ai comme un doute. Je l’ai testé il y a quelques années sur un vieux serveur (mais néanmoins bi-xeon et 16 Go) et ça ramait bien (java est gourmand et elastic search en io n’en parlons pas). Réseau plus conséquent il est vrai (~200 utilisateurs, switch HP 3800 pour le mirror).

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Complétez ce captcha SVP * Time limit is exhausted. Please reload CAPTCHA.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.