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.