Introducció

Suricata és un motor de detecció d'amenaces que ofereiex capacitats com ara la detecció d’intrusions (IDS – Intrusion Detection System), la prevenció d'intrusions (IPS – Intrusion Prevention System) i la monitorització de seguretat de xarxa (NSM – Network Security Monitoring).

Entorn de treball

Crea un màquina virtual Ubuntu 22.04 a Isard VDI.

Baixa el projecte suricata de xtec:

$ sudo apt install git
$ git clone https://gitlab.com/xtec/suricata
$ cd suricata

Instal.la Ansible:

$ ./ansible.sh

Mira quines inteficies té la màquina virtual:

$ ip --brief addr

lo               UNKNOWN        127.0.0.1/8 ::1/128 
enp1s0           UP             192.168.123.11/22 fe80::b4a1:54f4:7454:d2fd/64 
enp2s0           UP             10.2.76.37/16 fe80::d18f:22b8:b29b:935c/64 

A continuació instal.larem Suricata a la interficie enp1s0 amb el playbook suricata.yaml:

$ ansible-playbook suricata.yaml --ask-become-pass

Per probar Suricata farem servir un fitxer amb regles local enlloc de les més de 30000 regles amb les que ve per defecte la instal.lació.

Carrega la configuració de regles locals:

./suricata.sh load

Notice: suricata: This is Suricata version 7.0.4 RELEASE running in SYSTEM mode
...
Info: detect: 2 signatures processed. 1 are IP-only rules, 0 are inspecting packet payload, 1 inspect application layer, 0 are decoder event only
Notice: suricata: Configuration provided was successfully loaded. Exiting.

Verifica que s’ha creat un fitxer local.rules amb dos regles d’exemple:

$ cat local.rules

alert ssh any any -> any any (msg: "SSH connection found"; flow:to_server, not_established; sid:1000001; rev:1;)
alert icmp any any -> any any (msg: "ICMP Packet found"; sid:1000002; rev:1;)

Fes un ping a google.es:

$ ping -c 2 google.es

PING google.es (172.217.18.3) 56(84) bytes of data.
64 bytes from fra24s22-in-f3.1e100.net (172.217.18.3): icmp_seq=1 ttl=118 time=1.04 ms
64 bytes from fra02s19-in-f3.1e100.net (172.217.18.3): icmp_seq=2 ttl=118 time=1.10 ms

--- google.es ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 1.042/1.070/1.099/0.028 ms

Verifica que suricata a registra’t el ping

$ ./suricata.sh log

05/12/2024-20:17:22.622369  [**] [1:1000002:1] ICMP Packet found [**] [Classification: (null)] [Priority: 3] {ICMP} 192.168.123.11:8 -> 172.217.18.3:0
05/12/2024-20:17:22.623347  [**] [1:1000002:1] ICMP Packet found [**] [Classification: (null)] [Priority: 3] {ICMP} 172.217.18.3:0 -> 192.168.123.11:0

Pots veure que suricata captura el paquet d’anada i de tornada del ping a google.es (172.217.18.3) mijançant la regla 1000002.

També que encara que has fet dos pings Suricata només registra el primer.

Activitat. Verifica que si tornes a fer un altre ping a google.es no queda registrat a no ser que el ping es faci a una altra ip.

Activitat. Verifica que si fas un ping a google.com queda registrat

La màquina virtual té dues interfícies i només hem habilitat suricata a la interficie enp1s0.

Verifica que si fem un ping a facebook.com a través de la interficie enp2s0 no queda registrat (tampoc funciona)

$ ip -brief addr

lo               UNKNOWN        127.0.0.1/8 ::1/128 
enp1s0           UP             192.168.123.11/22 fe80::b4a1:54f4:7454:d2fd/64 
enp2s0           UP             10.2.76.37/16 fe80::d18f:22b8:b29b:935c/64

El ping s'ha fet per la interfície enp1s0 que té la IP 192.168.123.122.

També pots fer un ping a través de la interfície enp2s0 (no funciona):

$ ping -c 2 -I enp2s0 facebook.com
PING facebook.com (157.240.0.35) from 10.2.76.37 enp2s0: 56(84) bytes of data.
From ubuntu (10.2.76.37) icmp_seq=1 Destination Host Unreachable
From ubuntu (10.2.76.37) icmp_seq=2 Destination Host Unreachable

--- facebook.com ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 1023ms
pipe 2

Signatures

Una signatura és semblant a una regla nftables de Netfilter.

Una signatura consta de tres parts: action, header y options.

Farem servir aquesta regla como exemple:

alert icmp any any -> any any (msg: "ICMP Packet found"; sid:1000002; rev:1;

Action

Una regla comença indicant que fer quan la regla fa "match": pass, alert, reject o drop.

En el nostre exemple la regla genera una alerta que queda registrada per un anàlisis posterior.

Si hem configurat suricata en mode IPS (ho hem fet), podem fer que suricata actui com un firewall bloquejant paquets.

Modifica la regla per tal de que suricata elimini els paquets icmp (`drop) i verifica que funciona:

$ nano local.rules
$ ./suricata.sh load
$ ping google.es

PING google.es (172.217.18.3) 56(84) bytes of data.
^C
--- google.es ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3063ms

Pots veure el log:

$ ./suricata.sh log | tail -n 1

05/12/2024-20:30:53.002917  [Drop] [**] [1:1000002:1] ICMP Packet found [**] [Classification: (null)] [Priority: 3] {ICMP} 192.168.123.11:8 -> 172.217.18.3:0

Modifica la regla icmp per tal que suricata deixi d'escanejar el paquet y aquest segueixi el seu fluxe normal amb pass.

$ nano local.rules
$ ./suricata load

Borra el log de suricata i verifica que el ping a google.es ja no es registra:

$ ./suricata.sh log reset
$ ping -c 1 google.es > /dev/null
$ ./suricata.sh log

Modifica la regla per tal que faci un reject: elimina el paquet i torna un paquete TCP "reset".

$ nano local.rules
$ ./suricata.sh load

Verifica que funciona:

$ ping -c 1 google.es > /dev/null

Important documentació, i revisant! de Google Docs - Suricata.

TODO

silent drops

SID

El interval 1000000-1999999 està reservat per a regles personalitzades.

EL interval 2200000-2299999 està reservat per a regles integrades de Suricata.

Altres interval de SID estan documentats a la pàgina Emerging Threats SID Allocation .

JSON

Els logs de suricata es guarden a la carpeta /var/log/suricata.

$ sudo apt install -y jq
$ cat /var/log/suricata/eve.json | jq

Azure

Crea una nova màquina a Azure:

> New-Azure suricata -size 2
> Connect-Azure suricata

La màquina Azure només té una interficie eth0.

A azure l'usuari box no necessita password per fer sudo:

$ ansible-playbook suricata.yaml

TODO connection reset

Torna a connectar-te a la màquina virtual:

> Connect-Azure suricata

Referències