Table des matières

Suricata

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).

Utilisation de Suricata

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.

Installation de Suricata

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.

Configuration

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

Gestion des règles

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