Praticamente tutte le guide su Suricata finiscono con l’installazione di Elasticsearch, Logstash e Kibana. Per un solo VPS è un cattivo consiglio: lo stack chiederà quattro gigabyte di memoria e attenzione costante, mentre lei voleva soltanto vedere che cosa ha catturato l’IDS in un giorno. Suricata funziona benissimo senza di essi, ma ha una particolarità per cui la si installa e la si rimuove una settimana dopo.

La mina nelle impostazioni predefinite

Di fabbrica Suricata scrive in eve.json più di trenta tipi di eventi: non solo gli avvisi, ma ogni richiesta DNS, ogni handshake TLS, ogni transazione HTTP, ARP, DHCP, flusso dopo flusso. In più un stats.log separato ogni otto secondi. E Suricata non configura alcuna rotazione dei registri: è compito dell’amministratore, e da nessuna parte è scritto a caratteri cubitali.

Una cifra da un server reale: 15 gigabyte in due giorni, nove in eve.json e quasi sei in stats.log. Mancavano circa cinque giorni al disco pieno. E il traffico su quel server non era nemmeno elevato; su un nodo carico sarebbe stata questione di ore.

Verifichi subito da lei:

sudo du -sh /var/log/suricata/*

Tenga solo ciò che legge

Se guarda gli avvisi e non fa analisi forense di rete, da eve-log serve esattamente un tipo di evento. In /etc/suricata/suricata.yaml trovi il blocco outputs e sotto types di eve-log lasci solo alert, commentando il resto. Disattivi nello stesso punto l’output delle statistiche:

  - stats:
      enabled: no

Dopo la modifica, la verifica della configurazione è obbligatoria, prima di riavviare il servizio:

sudo suricata -T -c /etc/suricata/suricata.yaml -v

L’ordine conta: il test non passerà se le regole non sono ancora caricate. Prima suricata-update, poi la verifica, poi l’avvio.

Una rotazione che funziona davvero

Il file /etc/logrotate.d/suricata:

/var/log/suricata/*.log /var/log/suricata/*.json {
    daily
    rotate 7
    maxsize 200M
    missingok
    compress
    delaycompress
    create 0664 suricata suricata
    su suricata suricata
    postrotate
        systemctl kill -s HUP suricata
    endscript
}

Due righe lì non sono ovvie ed entrambe sono decisive.

su suricata suricata: senza di essa logrotate salta in silenzio tutti i file. La cartella /var/log/suricata appartiene al gruppo suricata e non a root, e logrotate considera insicura tale disposizione. Nessun errore nella posta, nessuno nel registro; sarà semplicemente convinto che la rotazione ci sia, finché il disco non si riempie. L’unico modo per accorgersene prima è una passata a vuoto:

sudo logrotate -d /etc/logrotate.d/suricata

create 0664 suricata suricata: i permessi del nuovo file. Con i valori predefiniti (0640), qualsiasi pannello o script che legga i registri senza essere root non vedrà più nulla dopo la prima rotazione.

Che cosa configurare oltre ai registri

HOME_NET. Descrive ciò che Suricata considera proprio. Il valore predefinito elenca tutti gli intervalli privati, ma un VPS ha un indirizzo pubblico, quindi alcune regole non scattano o scattano al contrario. Indichi la sua rete in modo esplicito.

Regole. L’insieme Emerging Threats Open viene scaricato da suricata-update, da mettere in cron una volta al giorno. Le singole firme rumorose si disattivano per identificatore in /etc/suricata/disable.conf: non tema di usarlo, quell’insieme è pensato per una rete aziendale, e su un normale server web una dozzina di regole scatterà di continuo e senza motivo.

Modalità. Di default Suricata ascolta una copia del traffico e si limita ad avvisare (IDS). La modalità di blocco (IPS, tramite nfqueue) su un server unico è un rischio soprattutto per lei stesso: un falso positivo e si sarà chiuso l’accesso. Cominci osservando e dedichi un mese a vedere che cosa viene catturato.

Leggere senza Kibana

Gli avvisi brevi stanno in /var/log/suricata/fast.log: una riga per evento, leggibile a occhio:

sudo tail -50 /var/log/suricata/fast.log

Il dettaglio è in eve.json, un oggetto JSON per riga. Tutto ciò per cui di solito si installa Kibana sta in un comando:

sudo jq -r 'select(.event_type=="alert") | .alert.signature' \
    /var/log/suricata/eve.json | sort | uniq -c | sort -rn | head -20

Sono le venti firme più frequenti. Nell’arco di una settimana un elenco simile risponde onestamente a che cosa succede al server e mostra al contempo quali regole è ora di disattivare.

Perché, se c’è già Fail2ban

Hanno natura diversa. Fail2ban legge i registri delle applicazioni e reagisce agli accessi falliti, cioè a ciò che ha già raggiunto un servizio. Suricata guarda il traffico stesso e vede ciò che in nessun registro comparirà: scansioni di porte, tentativi di sfruttamento secondo firme note, connessioni verso server di comando dall’interno della sua macchina. Quest’ultimo punto è particolarmente prezioso: una connessione in uscita verso un server di comando altrui è il segnale più precoce che sul server sta già girando qualcosa che lei non ha avviato.

Tenerli entrambi è normale, non si intralciano. La sola questione è se qualcuno legga il loro output più di una volta a trimestre. Come appaiono gli stessi avvisi su una pagina, suddivisi per categoria e origine, lo mostra la dimostrazione qui sotto.