Suricata Moteur de détection d'intrusion IDS/IPS open source de référence
Objectifs Expliquer l'architecture interne de Suricata Déployer Suricata en mode IPS Écrire des règles Suricata Utiliser les parseurs protocolaires (HTTP, DNS, TLS, SSH) Analyser EVE JSON avec jq pour extraire les alertes
Suricata Définition Suricata est un moteur NIDS/NIPS open source développé par l'OISF depuis 2009. Multithreadé nativement, il analyse le trafic jusqu'à la couche 7 et produit des logs EVE JSON exploitables par les SIEM. Cas d'usage IDS Passif Surveillance réseau IPS Blocage actif Analyse PCAP Forensique réseau
Architecture interne — Pipeline de traitement Chaque paquet traverse un pipeline en 5 étapes, du réseau jusqu'à la génération de l'alerte. Capture AFPACKET · NFQUEUE PCAP · PFRING Décodage Ethernet · IP · IPv6 TCP · UDP · ICMP App Layer HTTP · DNS · TLS SSH · SMTP · SMB Détection Pattern-match PCRE · Flowbits Outputs EVE JSON · fast.log stats.log Réassemblage de flux TCP Suricata réassemble les flux TCP et parse les protocoles sur le flux reconstitué — permettant de détecter des attaques fragmentées sur plusieurs paquets.
Modes de déploiement Suricata supporte plusieurs modes d'acquisition réseau selon l'environnement et les besoins de performance. IDS Passif Aucun impact sur le trafic. Lecture seule. IPS Inline Suricata dans le chemin réseau. Peut bloquer ou modifier les paquets. Analyse PCAP Lecture d'un fichier .pcap hors-ligne. Forensique post-incident. Méthodes d'acquisition AF_PACKET Mode natif Linux. Haute performance. NFQUEUE Mode IPS via Netfilter. iptables/nftables redirigent vers Suricata. Blocage actif. PCAP (libpcap) Compatibilité universelle. Moins performant. Idéal pour tests et forensic.
Fichier configuration : suricata.yaml Le fichier suricata.yaml est le point central de configuration. vars / address-groups HOMENET: [192.168.0.0/16] EXTERNALNET: !$HOMENET HTTPPORTS: [80, 8080, 443] af-packet interface: eth0 cluster-id: 99 cluster-type: cluster_flow defrag: yes outputs / eve-log enabled: yes filename: eve.json types: [alert, http, dns, tls, flow] rule-files - suricata.rules - local.rules - emerging-threats.rules threading set-cpu-affinity: yes worker-cpu-set: cpu: ["all"] detect-thread-ratio: 1.0 app-layer / protocols http: enabled: yes tls: enabled: yes dns: enabled: yes ssh: enabled: yes
Règle Suricata Une règle Suricata est composée de 3 parties : l'en-tête, les options, et les métadonnées. alert tcp $EXTERNAL_NET any => $HOME_NET 80 (msg:"ET WEB_SERVER SQLi"; content:"UNION SELECT"; nocase; sid:2001234; rev:3;) Décomposition des champs Action alert alert · drop pass · reject Protocole tcp tcp · udp · icmp http · dns · tls Adresse source $EXTERNAL_NET any Variable ou IP/CIDR Port ou any Direction => -> ou <> Adresse dest. $HOME_NET 80 Variable ou IP/CIDR Port ou range Options ( ==. ) msg · content · sid rev · pcre · flow Options essentielles msg: Message humain de l'alerte content: Motif à rechercher dans le payload sid: / rev: Identifiant unique et révision classtype: Catégorie (web-application-attack...)
Options de règles et détection Les options de règles permettent une détection fine : correspondance de contenu, expressions régulières, gestion des flux et seuils. content / nocase / offset content:"GET"; Recherche exacte dans le payload. nocase: insensible à la casse. offset:4; distance:0; within:10; pcre pcre:"/UNION\s+SELECT/i"; Expression régulière Perl. Puissant mais coûteux en CPU. Utiliser après content: pour pré-filtrer. flow / flowbits flow:to_server,established; Inspecte uniquement le sens client-serveur. flowbits:set,http.login; Partage d'état entre règles. threshold threshold:type limit, track by_src, count 5, seconds 60; Limite les alertes répétitives — anti-flood. classtype / priority classtype:web-application-attack; priority:1; Catégorise l'alerte. Priorité 1 = critique, 4 = info. metadata / reference reference:url,cve.mitre.org/cgi-bin/cvename.cgi?n ame=CVE-2021-44228; metadata:affected_product Apache; Exemple complet alert http $EXTERNALNET any => $HTTPSERVERS $HTTPPORTS (msg:"ET SQLi UNION SELECT"; flow:toserver,established; content:"UNION"; nocase; pcre:"/UNION\s+SELECT/i"; threshold:type limit,track by_src,count 3,seconds 60; classtype:web-application-attack; sid:9000001; rev:1;)
Parseurs protocolaires — Inspection L7 Suricata décode nativement les protocoles applicatifs pour exposer des champs structurés dans les règles et les logs EVE JSON. HTTP http.uri · http.method http.host · http.useragent http.status · http.requestbody Mots-clés sticky buffer DNS dns.query · dns.answer dns.rrtype · dns.rcode Détection DGA, tunneling DNS, exfiltration via TXT TLS / SSL tls.sni · tls.subject · tls.issuer tls.fingerprint · tls.version Détection certificats auto-signés, JA3/JA3S fingerprint SSH ssh.client.version · ssh.server.version Détection brute-force, versions vulnérables, hassh fingerprint SMB / SMTP smb.command · smb.filename Détection EternalBlue, ransomware. smtp.mailfrom · smtp.rcptto Logique d'inspection L7 1. Détection du protocole (port + heuristique) 2. Parsing des champs applicatifs 3. Exposition via mots-clés sticky buffer 4. Matching des règles sur champs structurés Formation Suricata · SAR-M2 · Parseurs protocolaires
EVE JSON et journaux EVE JSON est le format de sortie unifié de Suricata — un enregistrement JSON par événement, exploitable par tout SIEM. eve.json — Exemple d'alerte {"timestamp":"2024-01-15T10:23:45.123456+0000", "eventtype":"alert", "srcip":"192.168.1.100", "dest_ip":"10.0.0.5", "proto":"TCP", "alert":{"action":"allowed","signature":"ET SQLi UNION SELECT","severity":1,"category":"Web Application Attack"}, "http":{"url":"/login?id=1 UNION SELECT","method":"GET"}} Champs clés EVE JSON timestamp · eventtype · srcip / dest_ip alert.signature · alert.severity · alert.category flowid · iniface · vlan · app_proto Exploitation avec jq Filtrer les alertes uniquement jq 'select(.event_type=="alert")' eve.json Top 10 des signatures déclenchées jq -r '.alert.signature' eve.json | sort | uniq -c | sort -rn | head Alertes par IP source jq -r 'select(.eventtype=="alert") | .srcip' eve.json | sort | uniq -c | sort -rn Autres journaux fast.log Format texte compact — une ligne par alerte. Idéal pour monitoring temps réel. stats.log Métriques de performance : paquets/s, drops, threads actifs. Toutes les 8 secondes. Intégration SIEM Filebeat, Logstash, Fluentd — ingestion directe d'EVE JSON vers Elastic, Splunk, Graylog.