PSAD: Protezione dai Port Scan per Linux

In questo articolo presenterò il software PSAD, uno strumento in grado di rilevare i port scan e bloccare tramite iptables chi li attua.

Nello specifico, la guida si focalizzerà su distro basate su Debian, ma cambierà ben poco (ad esempio dovrete individuare il corretto file di log di iptables, se questo non fosse già corretto nel file di configurazione pre-installato).

Per prima cosa diamo i seguenti comandi, omettendo la parola chiave sudo se avete eseguito l’accesso come root:

sudo apt-get update
sudo apt-get install psad

Configurazione di iptables

A questo punto configuriamo iptables per salvare i logs dei pacchetti scartati:

sudo iptables -A INPUT -j LOG
sudo iptables -A FORWARD -j LOG

Per evitare di incorrere in eventuali problemi, assicuriamoci che queste due regole siano immediatamente prima dell’eventuale regola che dropperà tutti i pacchetti, nello specifico:

-A INPUT -i lo -j ACCEPT #Accetta il traffico in locale
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT #Accetta le connessioni già stabilite
-A INPUT -p tcp -m tcp -m multiport --dports 80,443 -j ACCEPT #Accetta le connessioni (porte 80 e 443)
-A INPUT -j LOG #Per psad
-A INPUT -j DROP #Regola di DROP dei pacchetti
-A FORWARD -j LOG #Per psad

Per verificare che le regole immesse siano corrette, potete visualizzare tramite il comando:

sudo iptables -S

Nel caso in cui siano errate, potete eseguire un flush o in alternativa, se avete installato il pacchetto iptables-persistent avrete la possibilità di modificare le regole direttamente nel file situato in /etc/iptables/rules.v4 e /etc/iptables/rules.v6 per IPv6, ricaricando le regole una volta modificate, con l’apposito comando iptables-restore < /etc/iptables/rules.v4. Ricordo anche che per gestire le regole per l’IPv6 bisogna utilizzare il comando ip6tables.

Configurazione di psad

Dando per scontato che abbiate configurato correttamente le regole di iptables, visto anche che vi ho allegato una parte basilare della mia configurazione, passiamo adesso alla configurazione di psad.

Apriamo quindi con un editor e i permessi di root il file di config:

sudo nano /etc/psad/psad.conf

E sostituiamo subito le voci EMAIL_ADRESSES con gli indirizzi e-mail al quale psad invierà delle e-mail di notifica, separati da una virgola e HOSTNAME dove dovrete inserire l’hostname del vostro server.

EMAIL_ADDRESSES     indirizzo@dominio.it, indirizzo2@altrodominio.it;

HOSTNAME            server1.miodominio.it;

Se siete all’interno di una rete privata potrebbe farvi comodo la variabile HOME_NET, ma in caso contrario vi consiglio di configurare tutto come segue:

HOME_NET                    NOT_USED;
EXTERNAL_NET                any;

A questo punto passiamo alla configurazione della soglia entro la quale bisogna attivare un evento di allerta per port scan. Cerchiamo quindi queste righe, all’interno del config:

DANGER_LEVEL1           5;
DANGER_LEVEL2           15;
DANGER_LEVEL3           150;
DANGER_LEVEL4           1500;
DANGER_LEVEL5           10000;

Potete modificare ciascun livello a vostro piacere, anche perché l’eventuale soglia che farà scattare il blocco da iptables è configurabile andando poco più avanti nel file di configurazione e tra l’altro, potrete decidere per quanti secondi tenere bloccato un IP.
Scorrendo poco più avanti, sarà possibile impostare da quale file recuperare i logs di iptables, nello specifico dovete modificare la seguente voce:

IPT_SYSLOG_FILE         /var/log/syslog;

Nel caso di Debian, bisogna impostarlo così:

IPT_SYSLOG_FILE             /var/log/messages;

Se utilizzate il port knocking per sbloccare le porte, vi tornerà utile aggiungere delle eccezioni per determinate porte. Dovrete quindi configurare questa voce:

IGNORE_PORTS            porte_o_range_da_ignorare;

Ad esempio:

IGNORE_PORTS        tcp/61000-61356, udp/53, udp/5000;

Passiamo ora alla configurazione degli avvertimenti e delle azioni da intraprendere in base a una determinata soglia, configurando le seguenti voci:

MIN_DANGER_LEVEL           1;  # Controlla il logging e le allerte via email
EMAIL_ALERT_DANGER_LEVEL   3;  # Si applica solo alle allerte via email

Una volta arrivati a questo punto, assicuratevi che sia abilitata la gestione automatica di iptables da parte di psad:

ENABLE_AUTO_IDS             Y;

E ricordate di configurare anche:

AUTO_IDS_DANGER_LEVEL       3;

Sostituendo 3 con il numero della soglia che dovrà far attivare il blocco automatico dell’IP che ha effettuato un port scan.
Vi ricordo anche che potete decidere per quanto tempo bloccare un IP, con le opportune voci (questa è di default):

AUTO_BLOCK_TIMEOUT          604800;

E anche per soglia:

AUTO_BLOCK_DL1_TIMEOUT      300;
AUTO_BLOCK_DL2_TIMEOUT      900;
AUTO_BLOCK_DL3_TIMEOUT      1200;
AUTO_BLOCK_DL4_TIMEOUT      $AUTO_BLOCK_TIMEOUT;
AUTO_BLOCK_DL5_TIMEOUT      0;   ### permanente

Adesso possiamo finalmente ultimare la configurazione scaricando le firme aggiornate necessarie per psad, in modo tale che possa riconoscere eventuali attacchi correttamente, tramite l’apposito comando:

sudo psad --sig-update

Una volta fatto ciò riavviamo il servizio di psad:

sudo service psad restart

Vi ricordo che potete monitorare lo stato di psad tramite:

sudo psad -S

A questo punto dovreste verificare che il tutto funzioni effettuando un port scan. Vi consiglio di evitare di farlo dal vostro IP pubblico, se non volete finire bloccati fuori. Online trovate dei servizi che vi permettono di effettuare port scan.

Aggiunta di eccezioni

Potete inserire anche delle eccezioni per un range di indirizzi IP o per un singolo indirizzo IP, in maniera tale che psad non blocchi assolutamente niente. Per farlo dovete modificare il file auto_dl:

sudo nano /etc/psad/auto_dl

E inserire una stringa del tipo:

indirizzo_ip          ;

Ad esempio se volete mettere un’eccezione (cosa consigliatissima) per l’indirizzo IP locale, dovrete scrivere:

127.0.0.1         0;

Oppure se avete un range di indirizzi, dovrete specificare anche la subnet:

192.168.0.0/24    0;

Ovviamente con la soglia 0 si intede che quell’IP sarà sempre considerato “buono”. Se invece volete considerare sempre un indirizzo IP come malevolo vi basterà cambiare 0 con 5, oppure con una qualsiasi altra soglia dalla quale vorrete partire.
Una volta fatto ciò, riavviate psad con:

sudo service psad restart

Oppure tramite:

sudo psad -H

Quest’ultimo è consigliato, perché non perderete eventuali ban effettuati tramite iptables da parte di psad, in quanto ad ogni riavvio, a causa di un’impostazione (disattivabile nel file di configurazione), i ban effettuati da psad vengono rimossi.