Installer Suricata sur un Raspberry Pi

4.9
(18)

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

Présentation

Dans ce tuto j’explique comment installer Suricata sur un Raspberry Pi.

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.

Vous pouvez également utiliser un TAP réseau pour surveiller les activités suspectes d’un équipement, voir cet article.

1 – Installer Suricata sur votre Raspberry Pi

Installez Raspberry Pi OS Lite 64 bits sur votre Raspberry Pi avec l’outil Raspberry Pi Imager disponible sur le site https://www.raspberrypi.org/software/. J’utilise cette version de Raspberry Pi OS car ce tutoriel n’a pas besoin d’interface graphique et il est recommandé d’utiliser la version 64 bits pour le Raspberry Pi 4. Mais vous pouvez utiliser la Raspberry Pi OS (32 bits) incluant Raspberry Pi Desktop si vous le souhaitez.

a. Installer le package Suricata

Il est possible d’installer le package Suricata facilement depuis Raspberry Pi OS de la façon suivante :

sudo apt update
sudo apt install suricata

En mars 2022, la version 6.0.1 de Suricata est installée avec cette procédure. Si vous souhaitez utiliser une version plus récente de Suricata, vous pouvez l’installer depuis les source.

b. Installer Suricata depuis ses sources

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

sudo apt install libpcre3 libpcre3-dbg libpcre3-dev build-essential libpcap-dev libyaml-0-2 libyaml-dev pkg-config zlib1g zlib1g-dev make libmagic-dev libjansson-dev rustc cargo python3-yaml liblua5.1-0-dev python3-distutils git

Télécharger les sources de Suricata :

wget https://www.openinfosecfoundation.org/download/suricata-6.0.4.tar.gz

La dernière version en mars 2022 est 6.0.4, voir le chapitre dédié à la mise à jour des versions de Suricata.

Décompresser les sources :

tar -xvf suricata-6.0.4.tar.gz

Se placer dans le dossier Suricata et configurer l’installation du logiciel :

cd $HOME/suricata-6.0.4/
./configure --prefix=/usr/ --sysconfdir=/etc/ --localstatedir=/var/

Compiler et installer Suricata :

make
sudo make install-full

2 – Configurer Suricata

Configurer Suricata en éditant le fichier suricata.yaml :

sudo vi /etc/suricata/suricata.yaml

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

HOME_NET: "[192.168.0.0/24]"

a. Lancer Suricata pour valider son bon fonctionnement

Lancer Suricata avec la commande suivante :

sudo suricata -c /etc/suricata/suricata.yaml -i eth0 -S /var/lib/suricata/rules/suricata.rules

-c : fichier de configuration à utiliser
-i : interface Ethernet à surveiller
-S : fichier contenant les règles à utiliser

Le message suivant devrait s’afficher si Suricata est bien installé et qu’il se lance correctement :

26/3/2022 -- 17:07:46 - <Notice> - This is Suricata version 6.0.4 RELEASE running in SYSTEM mode

b. 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 penser à supprimer cette règle après ce test.

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

alert icmp any any -> any any (msg: "ICMP Packet found"; sid: 1; rev: 1;)

Afficher le contenu du fichier de log avec la commande suivante :

tail -f /var/log/suricata/fast.log

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

01/23/2021-21:22:26.898963 [**] [1:1:1] ICMP Packet found [**] [Classification: (null)] [Priority: 3] {ICMP} 192.168.1.16:8 -> 192.168.1.25:0

Vous pouvez également taper la commande suivante pour générer une alerte :

curl http://testmynids.org/uid/index.html

Cette commande doit générer l’alerte suivante dans le fichier de logs :

02/03/2021-16:13:42.020071 [**] [1:2100498:7] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 31.3.245.133:80 -> 192.168.1.10:46196

c. Configurer 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 :

# Sample Suricata systemd unit file.
[Unit]
Description=Suricata Intrusion Detection Service
After=network.target syslog.target
[Service]
ExecStart=/usr/bin/suricata -c /etc/suricata/suricata.yaml -i eth0 -S /var/lib/suricata/rules/suricata.rules
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill $MAINPID
[Install]
WantedBy=multi-user.target

Activer ce nouveau service avec la commande :

sudo systemctl enable suricata.service

Démarrer le service Suricata :

sudo systemctl start suricata.service
systemctl daemon-reload

Vérifier l’état du service avec la commande suivante :

sudo systemctl status suricata.service

Cette commande doit indiquer que le service est « active (running)« , comme le montre la capture ci-dessous.

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

d. Comment é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. Cette modification est en général suffisante pour éviter de perdre des paquets.

Remplacer :

#ring-size: 2048

Par :

ring-size: 30000

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.

Notez que les statistiques sont enregistrées dans le fichier /var/log/suricata/stats.log toutes les 8 secondes par défaut. Je vous recommande de changer la valeur du paramètre interval pour qu’il n’y ait qu’un enregistrement par heure dans ce fichier. C’est en effet largement suffisant et évite de saturer la carte SD.

# Global stats configuration
stats:
  enabled: yes
  # The interval field (in seconds) controls the interval at
  # which stats are updated in the log.
  interval: 3600

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

e. 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 :

sudo tail -n 100 -f /var/log/suricata/fast.log

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

01/29/2021-19:25:45.132975 [**] [1:2025012:3] ET MALWARE Powershell commands sent B64 3 [**] [Classification: A Network Trojan was detected] [Priority: 1] {TCP} XXX.XXX.XXX.XXX:80 -&gt; 192.168.1.22:45986
01/29/2021-19:26:10.183249 [**] [1:2013147:3] ET SHELLCODE Possible %u4141%u4141 UTF-16 Heap Spray Attempt [**] [Classification: Executable code was detected] [Priority: 1] {TCP} XXX.XXX.XXX.XXX:80 -&gt; 192.168.1.22:45986
01/31/2021-10:08:08.889128 [**] [1:2002157:12] ET CHAT Skype User-Agent detected [**] [Classification: Potential Corporate Privacy Violation] [Priority: 1] {TCP} 192.168.1.2:53937 -&gt; XXX.XXX.XXX.XXX:80

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 :

/var/log/suricata/*.log /var/log/suricata/*.json
{
    daily
    maxsize 1G
    rotate 10
    missingok
    nocompress
    create
    sharedscripts
    postrotate
    systemctl restart suricata.service
    endscript
}

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

sudo logrotate -f /etc/logrotate.conf

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

pi@raspberrypi3:~ $ ls -l /var/log/suricata/
total 30024
drwxr-xr-x 2 root root 4096 Jan 23 18:17 certs
-rw-r--r-- 1 root root 0 Feb 2 15:03 eve.json
-rw-r--r-- 1 root root 5162813 Feb 2 15:03 eve.json.1
-rw-r--r-- 1 root root 19174088 Feb 2 14:44 eve.json.2
-rw-r--r-- 1 root root 0 Feb 2 15:03 fast.log
-rw-r--r-- 1 root root 354 Feb 2 14:45 fast.log.1
-rw-r--r-- 1 root root 1944 Feb 2 14:35 fast.log.2
drwxr-xr-x 2 root root 4096 Jan 23 18:17 files
-rw-r--r-- 1 root root 0 Feb 2 15:03 stats.log
-rw-r--r-- 1 root root 550978 Feb 2 15:03 stats.log.1
-rw-r--r-- 1 root root 5810640 Feb 2 14:44 stats.log.2
-rw-r--r-- 1 root root 965 Feb 2 15:03 suricata.log
-rw-r--r-- 1 root root 1737 Feb 2 15:03 suricata.log.1
-rw-r--r-- 1 root root 1740 Feb 2 14:44 suricata.log.2

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.

- eve-log:
   enabled: no

3 – 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 autorisez 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.

a. 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 :

# alert tls
[108.160.162.0/20,162.125.0.0/16,192.189.200.0/23,199.47.216.0/22,205.189.0.0/24,209.99.70.0/24,45.58.64.0/20] 443 -> $HOME_NET any (msg:"ET POLICY Dropbox.com Offsite File Backup in Use"; flow:established,from_server; content:"|55 04 03|"; content:"|0d|*.dropbox.com"; distance:1; within:14; threshold: type limit, count 1, seconds 300, track by_src; reference:url,www.dropbox.com; reference:url,dereknewton.com/2011/04/dropbox-authentication-static-host-ids/; classtype:policy-violation; sid:2012647; rev:5; metadata:created_at 2011_04_07, updated_at 2019_01_16;)

Vous pouvez jeter un œil aux règles en éditant le fichier de règle de Suricata /var/lib/suricata/rules/suricata.rules.

b. 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. Le fichier /etc/suricata/disable.conf contient les règles à désactiver.

Ajouter dans ce fichier 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 :

# suricata-update - disable.conf
1:2012647 # Dropbox
1:2013504 # APT package management
1:2210044 # SURICATA STREAM Packet with invalid timestamp
1:2029706 # COVID
1:2029707 # COVID
1:2029709 # COVID
1:2027865 # DNS Query to .cloud
1:2210054 # SURICATA STREAM excessive retransmissions
1:2260000 # Applayer Mismatch protocol both directions
1:2210020 # STREAM ESTABLISHED packet out of window
1:2016150 # INFO Session Traversal Utilities for NAT
1:2027758 # DNS Query for .cc
1:2002157 # CHAT Skype User-Agent detected

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.

# suricata-update - disable.conf
# Disable all rules from protocol command decode class type
re:classtype:protocol-command-decode

Une fois que les règles à désactiver sont configurées, il faut mettre à jour les règles (cf.Mettre à jour les règles).

e. 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 :

sudo suricata-update update-sources

Ensuite visualiser les sources disponibles :

sudo suricata-update list-sources

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

sudo suricata-update list-enabled-sources

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

sudo suricata-update enable-source oisf/trafficid

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

f. 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 :

sudo suricata-update --disable-conf=/etc/suricata/disable.conf

Il suffit ensuite de relancer le service Suricata :

sudo systemctl restart suricata.service

g. Mettre à jour les règles automatiquement la nuit

Vous pouvez utiliser un cron (table de planification sous Linux) pour mettre à jour les règles Suricata automatiquement toutes les nuits.

Editer le fichier des planifications avec la commande :

crontab -e

Et insérer la ligne suivante à la fin du fichier :

37 1 * * * sudo suricata-update --disable-conf=/etc/suricata/disable.conf && sudo systemctl restart suricata.service

Avec cette ligne, nous configurons cron pour qu’il mette à jour les règles toutes les nuits à 1h37 du matin et qu’il relance le service Suricata ensuite.

4 Mise à jour de la version de Suricata

Vérifier si une nouvelle version de Suricata est disponible avec la commande :

sudo suricata-update update-sources
sudo suricata-update check-versions

Si une nouvelle version est disponible, cette commande l’indique par un avertissement :

6/6/2021 -- 15:59:03 - <Info> -- Using data-directory /var/lib/suricata.
6/6/2021 -- 15:59:03 - <Info> -- Using Suricata configuration /etc/suricata/suricata.yaml
6/6/2021 -- 15:59:03 - <Info> -- Using /usr/share/suricata/rules for Suricata provided rules.
6/6/2021 -- 15:59:03 - <Info> -- Found Suricata version 6.0.1 at /usr/bin/suricata.
6/6/2021 -- 15:59:03 - <Warning> -- Suricata version 6.0.1 is outdated. Please
upgrade to 6.0.2.

L’installation de la nouvelle version se déroule comme l’installation normale , et si vous le souhaitez vous pouvez le faire dans le même dossier.

L’utilisation d’une variable contenant la dernière version de Suricata sera très utile pour les prochaines mises à jour, aussi je le conseille :

export LATEST_SURICATA=6.0.4

Vous pouvez ensuite faire la procédure d’installation décrite plus haut en utilisant cette variable :

wget https://www.openinfosecfoundation.org/download/suricata-$LATEST_SURICATA.tar.gz
tar -xvf suricata-$LATEST_SURICATA.tar.gz
cd $HOME/suricata-$LATEST_SURICATA/
./configure --prefix=/usr/ --sysconfdir=/etc/ --localstatedir=/var/
make
sudo make install-full
sudo systemctl restart suricata

5 Utilisation des ressources du Raspberry Pi

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

CPU utilisé à 15% environ
638 MB de mémoire utilisée
2,8 GB utilisés sur la carte SD
Métriques htop

6 – 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 configurer le port 5 comme « monitor port » et les ports 1 à 4 en tant que « mirrored port » dans leurs deux directions entrantes et sortantes.

Ainsi tout 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.

7 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) ».

Utilisation de mon TAP réseau pour surveiller un équipement

Comme je l’explique plus haut, les équipements à surveiller sont reliés au commutateur (Switch) qui va copier toutes les trames Ethernet vers son port miroir. Le Raspberry Pi recevra ainsi toutes les trames par son port Ethernet qui est connecté à ce port miroir du commutateur.

Une autre possibilité est d’utiliser mon TAP réseau pour écouter le trafic qui transite sur un câble. Il faudra 2 ports Ethernet pour être en mesure d’écouter le trafic. Un des câbles bleu va recevoir les trames Ethernet transitant de l’équipement qui est relié au câble jaune vers l’équipement qui est relié au câble vert. L’autre câble bleu va recevoir les messages transitant dans l’autre sens (équipement relié au câble vert vers celui relié au câble jaune).

Le TAP permet d’envoyer vers les câbles bleus les trames qui transitent entre le câble jaune et le vert

Mais il est possible d’utiliser un adaptateur double Ethernet vers USB pour pouvoir recevoir toutes les trames Ethernet sur un Raspberry Pi. Il suffira de connecter les 2 câbles bleus du TAP à l’adaptateur que l’on connectera sur un port USB du Raspberry Pi. L’adaptateur sera vu par le Raspberry Pi comme 2 ports Ethernet et il sera possible de les utiliser comme source pour Suricata.

Utilisation d’un TAP Ethernet et d’un adaptateur Ethernet vers USB pour écouter le trafic via la port USB du Raspberry

Notez ce tutoriel !

Cliquez sur une étoile pour voter

Note moyenne : 4.9 / 5. Nombre de votes : 18

Pas encore de vote pour ce tutoriel

Désolé si cet article ne vous a pas intéressé

Merci de commenter afin que je puisse l’améliorer.

Dites-moi comment améliorer cette page.