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 suricataInstal.la Ansible:
$ ./ansible.shMira quines inteficies té la màquina virtual:
$ ip --brief addr
lo UNKNOWN 127.0.0.1/8 ::1/128enp1s0 UP 192.168.123.11/22 fe80::b4a1:54f4:7454:d2fd/64enp2s0 UP 10.2.76.37/16 fe80::d18f:22b8:b29b:935c/64A continuació instal.larem Suricata a la interficie enp1s0 amb el playbook suricata.yaml:
$ ansible-playbook suricata.yaml --ask-become-passPer 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 onlyNotice: 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 ms64 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 1001msrtt min/avg/max/mdev = 1.042/1.070/1.099/0.028 msVerifica 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:005/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:0Pots 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/128enp1s0 UP 192.168.123.11/22 fe80::b4a1:54f4:7454:d2fd/64enp2s0 UP 10.2.76.37/16 fe80::d18f:22b8:b29b:935c/64El 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.comPING 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 UnreachableFrom 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 1023mspipe 2Signatures
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 3063msPots 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:0Modifica 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 loadBorra 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 logModifica la regla per tal que faci un reject: elimina el paquet i torna un paquete TCP “reset”.
$ nano local.rules$ ./suricata.sh loadVerifica que funciona:
$ ping -c 1 google.es > /dev/nullImportant documentació, i revisant! de Google Docs - Suricata.
TODO
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 | jqAzure
Crea una nova màquina a Azure:
> New-Azure suricata -size 2> Connect-Azure suricataLa 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 resetTorna a connectar-te a la màquina virtual:
> Connect-Azure suricata