Suricata est un système d'analyse du réseau utilisé sur la machine Snowden. C'est un IDS possédant des fonctions IPS (permet de bloquer le trafic détecté à la manière d'un pare-feu). Il est aussi multithreadé, ce qui lui permet d'utiliser plusieurs coeurs pour la détection des attaques. Il est plus orienté signature, comme Snort (il va comparer des chaines de caractères de sa base de données à celles contenues dans les paquets pour détecter des attaques), alors que Bro est plus orienté comportement réseau (trop de connexions venant de la même personne pourront être interpretées comme une attaque).
Tous les logs générés par Suricata sont stockés au format JSON dans le fichier /var/log/suricata/eve.json
.
Ils sont ensuite analysés par un Logstash et envoyés vers un noeud Elasticsearch .
Afin de monitorer suricata, on peut par exemple voir le nombre de paquets droppés en regardant le fichier stats.log
(toujours dans le dossier /var/log/suricata
) et en greppant kernel
, ce qui donne la commande : # tail -f stats.log | grep kernel
.
On commence par télécharger la dernière version depuis le site officiel.
Les paquets suivants sont necessaires pour que suricata fonctionne. Pour les installer :
# apt-get -y install libpcre3 libpcre3-dbg libpcre3-dev \ build-essential autoconf automake libtool libpcap-dev libnet1-dev \ libyaml-0-2 libyaml-dev zlib1g zlib1g-dev libmagic-dev libcap-ng-dev \ libjansson-dev pkg-config
On se rend ensuite dans le dossier décompressé et on tape :
./configure –prefix=/usr –sysconfdir=/etc –localstatedir=/var –disable-gccmarch-native –enable-profiling
Ensuite, on effectue un make
suivi d'un make install-full
(il installera les règles et les fichiers de conf avec).
Suricata est maintenant installé et nous devons le configurer.
On ouvre le fichier /etc/suricata/suricata.yaml
(ou suricata-minet.yaml
si on veut garder une version par défaut du fichier de conf).
Dans la configuration de eve.json, on décommente les lignes suivantes :
payload: yes # enable dumping payload in Base64 payload-printable: yes # enable dumping payload in printable (lossy) format packet: yes # enable dumping of packet (without stream segments)
Cela permet d'avoir plus de details dans les logs que l'on récupère, notamment ce qui a été détecté.
Puis on commente les lignes suivantes :
#- http: # extended: yes # enable this for extended logging information [...] #- dns #- tls: # extended: yes # enable this for extended logging information #- files: # force-magic: no # force logging magic on all logged files # force-md5: no # force logging of md5 checksums [...] #- smtp #- ssh
Cela permet de réduire la quantité de logs produite.
On doit aussi régler unified2-alert
et http-log
sur no :
- unified2-alert: enabled: no [...] - http-log: enabled: no
Là encore afin de reduire les logs.
Ensuite, il faut configurer af-packet
, l'utilitaire qui va séparer le flux entre les différentes instances du programme et lui dire d'utiliser l'interface eth1 et 4 threads :
af-packet: - interface: eth1 threads: 4
On retire toutes ces lignes :
- interface: eth1 threads: auto cluster-id: 98 cluster-type: cluster_flow defrag: yes # buffer-size: 32768 # disable-promisc: no # Put default values here
On commente également ces lignes pour désactiver netmap :
#netmap: # - interface: eth2 [...] # threads: auto [...] # - interface: default
Ensuite, il faut régler le memcap pour le flux et le stream comme suit :
flow: memcap: 512mb [...] stream: memcap: 512mb
On désactive le pcap en commentant :
#pcap: # - interface: eth0 [...] # - interface: default
Réglons le réseau interne comme suit :
HOME_NET: “[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12,157.159.40.0/21,157.159.47.0/23]”
On desactive modbus, parce que le scada n'est pas trop notre truc à MiNET :
modbus: # How many unreplied Modbus requests are considered a flood. # If the limit is reached, app-layer-event:modbus.flooded; will match. #request-flood: 500 enabled: no
Enfin, on modifie le fichier /etc/default/suricata
pour qu'il ressemble à celui-là (n'oubliez pas de spécifier le bon fichier de conf) :
# Default config for Suricata # set to yes to start the server in the init.d script RUN=yes # Configuration file to load SURCONF=/etc/suricata/suricata-minet.yaml # Listen mode: pcap, nfqueue or af-packet # depending on this value, only one of the two following options # will be used (af-packet uses neither). # Please note that IPS mode is only available when using nfqueue LISTENMODE=af-packet # Interface to listen on (for pcap mode) IFACE=eth1 # Queue number to listen on (for nfqueue mode) NFQUEUE=0 # Load Google TCMALLOC if libtcmalloc-minimal0 is installed # This _might_ give you very very small performance gain.... TCMALLOC="NO" # Pid file PIDFILE=/var/run/suricata.pid
Passons maintenant à la sélection des règles.
Les règles séléctionnées actuellement sont les suivantes :
# - botcc.rules # - ciarmy.rules # - compromised.rules - drop.rules - dshield.rules # - emerging-activex.rules # - emerging-attack_response.rules # - emerging-chat.rules - emerging-current_events.rules # - emerging-dns.rules - emerging-dos.rules - emerging-exploit.rules # - emerging-ftp.rules - emerging-games.rules # - emerging-icmp_info.rules # - emerging-icmp.rules # - emerging-imap.rules # - emerging-inappropriate.rules - emerging-malware.rules - emerging-misc.rules - emerging-mobile_malware.rules # - emerging-netbios.rules - emerging-p2p.rules # - emerging-policy.rules # - emerging-pop3.rules # - emerging-rpc.rules # - emerging-scada.rules - emerging-scan.rules # - emerging-shellcode.rules # - emerging-smtp.rules # - emerging-snmp.rules - emerging-sql.rules # - emerging-telnet.rules # - emerging-tftp.rules - emerging-trojan.rules - emerging-user_agents.rules # - emerging-voip.rules # - emerging-web_client.rules # - emerging-web_server.rules # - emerging-web_specific_apps.rules # - emerging-worm.rules - tor.rules # - decoder-events.rules # available in suricata sources under rules dir # - stream-events.rules # available in suricata sources under rules dir # - http-events.rules # available in suricata sources under rules dir # - smtp-events.rules # available in suricata sources under rules dir # - dns-events.rules # available in suricata sources under rules dir # - tls-events.rules # available in suricata sources under rules dir #- modbus-events.rules # available in suricata sources under rules dir #- app-layer-events.rules # available in suricata sources under rules dir
Nous gérons les règles avec oinkmaster qui met à jour les règles.
Pour l'installer :
# apt-get install oinkmaster
On modifie le fichier de conf /etc/oinkmaster.conf
pour ajouter la ligne :
url = http://rules.emergingthreats.net/open/suricata/emerging.rules.tar.gz
On crée également le dossier /etc/suricata/rules
puis :
# oinkmaster -C /etc/oinkmaster.conf -o /etc/suricata/rules
On change les lignes suivantes dans le fichier /etc/suricata/suricata.yaml
afin qu'elles prennent en compte les nouvelles règles :
classification-file: /etc/suricata/rules/classification.config reference-config-file: /etc/suricata/rules/reference.config
Pour mettre à jour les règles, nous pouvons utiliser oinkmaster -C /etc/oinkmaster.conf -o /etc/suricata/rules
.
Afin que cela se fasse à un rythme regulier, la crontab se présente comme suit :
0 0 * * * /usr/sbin/oinkmaster -C /etc/oinkmaster.conf -o /etc/suricata/rules 5 0 * * * /etc/init.d/suricata restart