Installation d'un NIDS : Suricata

Bonjour à tous, dans cet article nous allons voir comment installer et configurer l'IDS Suricata (qui est pour un être plus précis un NIDS).

Tout d'abord, qu'est ce qu'un IDS (Intrusion Detection System) ?
C'est un outil qui permet d'analyser les flux (provenant du réseau ou d'une machine (système d'exploitation par exemple)), et va permettre de faire une remonter d'alerte en fonction de son fichier de signature.
Suricata est un NIDS (Network Intrusion Detection System) : un IDS qui est basé sur le réseau.

En parallèle, il y a également des HIDS qui sont orientés « machines » (Host Intrusion Detection System).
Vous pouvez visiter cet excellent article écrit par M.Rigonnaux : https://homputersecurity.com/2018/06/10/wazuh-hids-presentation-installation/>

Préparation

Pour l’installation et la configuration de Suricata, nous avons choisi CentOS connu pour sa fiabilité et sa robustesse.

Avant de pouvoir l'installer, il faut installer toutes ses dépendances :

1yum -y install gcc libpcap-devel pcre-devel libyaml-devel \ 
2file-devel zlib-devel jansson-devel nss-devel libcap-ng-devel \ 
3libnet-devel tar make  libnetfilter_queue-devel lua-devel \ 
4python-yaml epel-release lz4-devel cargo

Installation

Afin d’installer Suricata, il faut se rendre sur la page officielle afin de le télécharger: https://openinfosecfoundation.org/download/

On récupère le fichier avec la dernière version stable.

NB : En date du 13/02/2019, la dernière version stable est : suricata-4.1.2.

Puis nous effectuons un téléchargement directement à partir de notre serveur:

1wget https://openinfosecfoundation.org/download/suricata-4.1.2.tar.gz

On décompresse le fichier:

1tar -xvzf suricata-4.1.2.tar.gz

On se rend à l’intérieur du dossier:

1cd suricata-4.1.2

Et on lance l’installation du logiciel:

1./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-nfqueue --enable-lua
  • –prefix=/usr : installation des binaires de Suricata dans /usr/bin/suricata
  • –sysconfdir=/etc : installation des fichiers de configuration de suricata dans /etc/suricata
  • –localstatedir=/var : configuration de suricata pour placer les logs dans /var/log/suricata
  • –enable-nfqueue : activation du module IPS (pour une future utilisation)
  • –enable-lua : activation du module Lua pour la détection et l’affichage en fonction de différent filtre.

Il faut vérifier si les options LRO et GRO de vos cartes réseaux sont désactivées:

1ethtool -k enp2s0 | grep "large-receive-offload"
2ethtool -k enp2s0 | grep "generic-receive-offload"

Si les deux modules sont à «Off», vous pouvez poursuivre, sinon je vous invite à les désactiver:

1ethtool -K enp2s0 gro off lro off

NB : L’argument -k de la commande «ethtool» permet de spécifier une carte réseau: attention au nom de votre carte réseau.

NB 2 :

  • LRO (Large Receive Offload) permet de réduire le traitement des paquets réseau par le CPU (c’est le processeur de la carte réseau qui va travailler). Si la carte reçoit 5 paquets provenant de la même source avec des entêtes similaires (entête MAC), l’hôte va les stocker dans un tampon et va transférer un seul paquet en les regroupant.
  • GRO (Generic Receive Offload) : permet de former un seul paquet (regroupant une multitude paquet) qui possèdent tous une entête MAC commune (et des données TCP / IP différentes).

On lance la compilation et l’installation de Suricata en lui demandant de récupérer les règles de Suricata mais également la configuration de base:

1make install-full

Si vous souhaitez installer seulement la configuration de Suricata:

1make install-conf

Enfin, si vous souhaitez installer seulement les règles de Suricata:

1make install-rules

A la fin de l’installation, nous pouvons vérifier si Suricata est bien installé:

1suricata -h

Configuration

La configuration de base

Nous devons maintenant éditer le fichier de configuration de Suricata:

1vi /etc/suricata/suricata.yaml

Nous devons modifier la variable «HOME_NET» afin qu’il y figure votre réseau local:

  • HOME_NET: « [10.13.0.0/16] »

Nous avons trois interfaces réseaux sur le poste:

  • enp4s0 est l'interface de management: 10.13.9.19
  • enp2s0 est l'interface miroir des bornes wifi: 10.13.9.17
  • enp3s0 est l'interface miroir des prises brassés (prise rj-45 murale): 10.13.9.18

L’interface miroir va nous permettre de récupérer une copie de tout le trafic sortant des bornes wifi et des prises brassés sur les différents switch.
La configuration du switch est à faire en amont (pas traité dans cet article).

A l’installation de Suricata, il copie un fichier contenant toutes les règles dans /var/lib/suricata/rules et se nomme «suricata.rules». C’est se fichier de règle que nous allons utiliser (en écrasant les autres fichiers de règles).
Pour lancer suricata sur les interfaces ci-dessus:

1suricata -c /etc/suricata/suricata.yaml -i enp2s0 -i enp3s0 -S /var/lib/suricata/rules/suricata.rules -D
  • -c : pour indiquer le fichier de configuration
  • -i : pour indiquer sur quelle interface suricata va écouter
  • -S : pour spécifier le fichier de règle pour Suricata (et ne pas récupérer les règles indiquées dans le fichier de configuration)
  • -D : lance suricata en mode démon

Nous pouvons tester notre configuration en rajoutant l’argument «-T» à la fin de notre commande pour éviter de faire une fausse manipulation:

1suricata -c /etc/suricata/suricata.yaml -i enp2s0 -i enp3s0 -S /var/lib/suricata/rules/suricata.rules -T

Deux fichiers vont se créer:

  • eve.json : fichier structuré et très verbeux, qui va être envoyé à un SIEM (Splunk dans notre cas)

  • fast.log : c’est un fichier où toutes les alertes seront notifiés, il est plus facile à lire car une ligne correspond à une informatio

Le mode service

Nous allons maintenant ajouter Suricata en tant que service.

Il faut commencer par créer un fichier /etc/systemd/system/suricata.service:

 1[Unit]
 2Description=Suricata IDPS Daemon
 3Wants=network.target syslog.target
 4After=network.target syslog.target
 5Restart=on-failure
 6 
 7[Service]
 8Type=forking
 9PIDFile=/var/run/suricata.pid
10ExecStart=/usr/bin/suricata -c /etc/suricata/suricata.yaml -i enp2s0 -i enp3s0 -S /var/lib/suricata/rules/suricata.rules -D
11ExecReload=/bin/kill -HUP $MAINPID
12ExecStopPost=/bin/kill $MAINPID
13Restart=on-failure
14 
15[Install]
16WantedBy=multi-user.target 

Attention: il faut modifier la valeur de «ExecStart» en fonction de vos cartes réseaux.

Puis il faut activer le service :

1systemctl enable suricata.service

Enfin, nous pouvons démarrer Suricata:

1systemctl start suricata.service

Ou le stopper:

1systemctl stop suricata.service

Ou le redémarrer:

1systemctl restart suricata.service

Ou vérifier son statut:

1systemctl status suricata.service

NB : Nous pouvons appeler directement «suricata» au lieu de «suricata.service» pour gagner du temps.

Au prochain redémarrage de votre serveur, suricata se lancera automatiquement.

La récupération des règles

Nous allons maintenant créer un script qui va gérer la récupération des règles tous les jours.

Nous créons donc un script /home/rotateRulesSuricata.sh:

 1#!/bin/sh
 2 
 3# Téléchargement du fichier contenant toutes les règles dans /root #
 4wget http://rules.emergingthreats.net/open/suricata/emerging-all.rules -P /root
 5 
 6# On déplace le fichier que l’on vient de télécharger dans le dossier des règles #
 7mv /root/emerging-all.rules /var/lib/suricata/rules/suricata.rules
 8 
 9# On redémarre suricata pour prendre en compte la modification #
10systemctl restart suricata 

Nous donnons le droit à root de l’exécuter:

1crontab -e
2
3# Rotation des règles tous les jours à 2h00 du matin #
400 02 * * * /home/rotateRulesSuricata.sh 

La gestion des logs

Nous allons voir maintenant l’installation et la configuration de LogRotate (pour la rotation des logs).
Le paquet «LogRotate» est présent par défaut dans CentOS 7, si ce n’est pas le cas:

1apt install logrotate

On va créer le fichier /etc/logrotate.d/suricata :

 1/var/log/suricata/*.log /var/log/suricata/*.json
 2{
 3    daily
 4    rotate 45
 5    missingok
 6    nocompress
 7    create
 8    sharedscripts
 9    dateext
10    dateformat -%d%m%Y
11    postrotate
12            systemctl restart suricata
13    endscript
14} 

Nous planifions donc une rotation de logs sur 45 jours, sans compression, en incluant la date du jour dans le nom du fichier.

Nous vérifions à quelle heure se lance le «cron.daily»:

1grep run-parts /etc/anacrontab

Pour ma part, il se lance à 1h05 du matin:

NB : Pour une machine serveur, il est préférable d’utiliser «cron» qui est un démon (contrairement à anacron qui est plus approprié pour des ordinateurs fixes ou portables).
Dans mon cas, le «cron.daily» était déjà configuré dans anacron, c’est la raison pour laquelle j’ai laissé cela.

Votre IDS Suricata est maintenant configuré et opérationnel.

J'espère que cet article vous aura plu.
N'hésitez pas à me faire un retour pour tout problème rencontré.

A bientôt,

Fabio Pace.