Suricata : IDS/IPS reseau open-source

Suricata : IDS/IPS reseau open-source

Deployez Suricata pour inspecter le trafic reseau en temps reel et detecter (IDS) ou bloquer (IPS) les attaques. Moteur multi-thread, regles Emerging Threats, capacite multi-gigabit.

Introduction

Suricata est le successeur moderne de Snort : engine multi-thread, deep packet inspection, support TLS/HTTP/SSH/DNS/SMB, capable d'inspecter 10 Gbps avec le hardware adequat.

Trois modes possibles :

  • IDS : inspecte et logge les alertes (passif)
  • IPS : inspecte et bloque les paquets malveillants (actif, inline)
  • NSM : enregistre le trafic pour analyse forensique

Regles incluses : Emerging Threats (gratuit), Talos (gratuit avec snort.org), Proofpoint (commercial).

Prerequis

  • VPS Debian / Ubuntu
  • 2 vCPU minimum, 4+ recommande
  • 4 Go RAM
  • Acces root
  • Interface reseau primaire identifiee (eth0, ens3, etc.)

Etape 1 : Installation

sudo add-apt-repository ppa:oisf/suricata-stable
sudo apt update
sudo apt install -y suricata

Verifiez :

sudo suricata --build-info

Etape 2 : Configuration de base

Identifiez votre interface :

ip a

Editez /etc/suricata/suricata.yaml :

af-packet:
  - interface: ens3        # adaptez
    cluster-id: 99
    cluster-type: cluster_flow
    defrag: yes
    use-mmap: yes

Definissez vos reseaux internes :

vars:
  address-groups:
    HOME_NET: "[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]"
    EXTERNAL_NET: "!$HOME_NET"

Etape 3 : Telecharger les regles ET

sudo suricata-update

Telecharge les regles Emerging Threats Open. Pour activer plus de sources :

sudo suricata-update list-sources
sudo suricata-update enable-source et/open
sudo suricata-update enable-source oisf/trafficid
sudo suricata-update enable-source ptresearch/attackdetection
sudo suricata-update

Etape 4 : Demarrer Suricata

sudo systemctl enable --now suricata
sudo systemctl status suricata

Verifiez les logs :

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

Cherchez engine started qui confirme le bon demarrage.

Etape 5 : Voir les alertes

Les alertes sont loggees dans /var/log/suricata/eve.json (format JSON).

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

Format fast.log :

05/16/2026-14:32:01.123456 [**] [1:2008581:11] ET SCAN Nmap Scripting Engine [**] [Classification: Web Application Attack] [Priority: 1] {TCP} 1.2.3.4:54321 -> 5.6.7.8:80

Test : depuis une autre machine, lancez un nmap sur votre serveur :

nmap -sS -O votre-vps.fr

Verifiez :

sudo grep nmap /var/log/suricata/fast.log

Etape 6 : Parser eve.json

sudo apt install -y jq
sudo tail -n 100 /var/log/suricata/eve.json | jq 'select(.event_type=="alert")'

Compter les alertes par signature :

sudo cat /var/log/suricata/eve.json | jq -r 'select(.event_type=="alert") | .alert.signature' | sort | uniq -c | sort -rn | head

Top des IPs sources d'alertes :

sudo cat /var/log/suricata/eve.json | jq -r 'select(.event_type=="alert") | .src_ip' | sort | uniq -c | sort -rn | head

Etape 7 : Mode IPS (bloquant)

Passer en mode bloquant requiert nftables / iptables et un peu de patience.

Avec nftables

sudo apt install -y nftables
sudo nano /etc/nftables.conf
table inet filter {
    chain forward {
        type filter hook forward priority 0;
        queue num 0
    }
}
sudo systemctl enable --now nftables

Suricata en mode nfqueue

/etc/default/suricata :

RUN=yes
LISTENMODE=nfqueue
sudo systemctl restart suricata

Suricata recevra maintenant les paquets via nfqueue. Quand une regle a action drop, le paquet est bloque.

Etape 8 : Ecrire une regle custom

Format : action proto src dst (options)

sudo nano /etc/suricata/rules/local.rules

Bloquer un user-agent connu :

drop http any any -> any any (msg:"Bloque sqlmap"; content:"sqlmap"; http_user_agent; sid:1000001;)

Detecter une tentative de connexion sur un port unusual :

alert tcp any any -> $HOME_NET 31337 (msg:"Port 31337 (backdoor classique)"; sid:1000002;)

Activez la regle dans suricata.yaml :

rule-files:
  - suricata.rules
  - local.rules
sudo systemctl restart suricata

Etape 9 : Detection TLS / chiffrement

Suricata extrait les metadonnees TLS meme sur HTTPS :

alert tls any any -> any any (msg:"TLS auto-signe detecte"; tls.subject; content:"CN=self"; sid:1000003;)

Identifier les SNI (Server Name Indication) des connexions HTTPS, meme si vous ne dechiffrez pas :

sudo cat /var/log/suricata/eve.json | jq -r 'select(.event_type=="tls") | .tls.sni' | sort -u | head

Utile pour : detecter du C2 (command and control), du DNS over HTTPS suspect, du Tor.

Etape 10 : Performance

Suricata est multi-thread. Sur 4 cores :

threading:
  cpu-affinity:
    - management-cpu-set:
        cpu: [ 0 ]
    - receive-cpu-set:
        cpu: [ 0 ]
    - worker-cpu-set:
        cpu: [ "1-3" ]
        mode: "exclusive"
        prio:
          default: "high"

Mettez Suricata sur des cores dedies via cpu-affinity.

Activez l'offload kernel :

af-packet:
  - interface: ens3
    ring-size: 32768
    block-size: 32768

Etape 11 : Visualisation

Pour explorer vos alertes facilement, integrez Suricata avec :

  • ELK (Elasticsearch + Kibana) via Filebeat
  • Grafana + Loki
  • Wazuh (Suricata est nativement supporte)
  • SELKS (distribution all-in-one Suricata + ELK + dashboards)

Pour un demarrage rapide, telechargez SELKS : https://www.stamus-networks.com/selks

Etape 12 : Tuner les faux positifs

Identifier les regles bruyantes :

sudo cat /var/log/suricata/eve.json | jq -r 'select(.event_type=="alert") | .alert.signature_id' | sort | uniq -c | sort -rn | head

Desactiver une regle precise :

echo "2008581" | sudo tee -a /etc/suricata/disable.conf
sudo suricata-update
sudo systemctl restart suricata

Depannage

Suricata ne demarre pas

sudo suricata -T -c /etc/suricata/suricata.yaml

Affiche les erreurs de syntaxe yaml ou de regles.

Aucune alerte (test nmap pourtant lance)

Verifiez l'interface :

sudo suricata --list-runmodes
sudo grep interface /etc/suricata/suricata.yaml

Verifiez que les paquets passent bien par cette interface :

sudo tcpdump -i ens3 host 8.8.8.8 -c 5

Performance basse / paquets dropped

sudo suricatasc -c "iface-stat ens3"

Si beaucoup de drops : augmentez ring-size, ajoutez des workers, ou montez en gamme.

"rule-files: file does not exist"

sudo suricata-update

Les regles ne sont pas telechargees.

Commandes utiles

# Status
sudo systemctl status suricata

# Voir les regles actives
sudo suricata --dump-rules-info

# Reload regles sans restart
sudo suricatasc -c reload-rules

# Stats temps reel
sudo suricatasc -c "dump-counters"

# Tester un fichier pcap
sudo suricata -r capture.pcap -l /tmp/out

# Logs principaux
sudo tail -f /var/log/suricata/suricata.log
sudo tail -f /var/log/suricata/fast.log
sudo tail -f /var/log/suricata/eve.json | jq

# Update regles
sudo suricata-update && sudo systemctl restart suricata

Conclusion

Suricata vous donne :

  • Detection / blocage des attaques reseau connues
  • Visibilite TLS, DNS, HTTP, SMB
  • Compatible avec les ecosystemes SIEM standards
  • Performance multi-gigabit avec le bon tuning

Pour aller plus loin :

  • Combinez avec Zeek (anciennement Bro) pour la visibilite reseau
  • Integrez avec Wazuh comme source d'evenements
  • Utilisez SELKS pour une stack pretes a l'emploi

Ressources

Join our Discord community server

For any questions, suggestions, or just to chat with the community, join us on Discord!

900+Members