La tecnica del Port Knocking
Il Port Knocking è una semplice ma al tempo stesso efficace politica di sicurezza per modificare da remoto ed in modo dinamico, le regole di firewalling di un server.
Configurando un Port Knocking daemon sul proprio server, si può decidere di rendere accessibili le porte di alcuni demoni esclusivamente previa una precisa sequenza di pacchetti mandati dal client al server su determinate porte.
In parole semplici, il Port Knocking consente di aprire un determinato servizio solo “bussando” a delle porte specifiche (chiuse) con una sequenza precisa e in un certo periodo di tempo. E’ bene evitare infatti di mostrare al “mondo” alcune porte tcp/udp di un server che deve fornire un determinato servizio in rete “on demand” e di lasciarle sempre attive.
Vediamo come attuare questa tecnica con Linux. Per prima cosa dobbiamo installare il demone nel nostro sistema. Su Ubuntu, ma in generale su sistemi Debian possiamo usare il comando:
sudo apt-get install knockd
knockd è il port-knock server. Esso intercetta tutto il traffico di una interfaccia ethernet (o PPP), alla ricerca di speciali sequenze dette “knock” su particolari porte. knockd è in grado di rilevare tutto il traffico in ingresso, anche quello destinato a porte in stato closed.
Quando il server rileva la sequenza esatta, manda in esecuzione un comando definito nel proprio file di configurazione, attraverso il quale il server può cambiare dinamicamente la configurazione del proprio firewall e consentire per esempio l’attivazione e l’accesso al servizio SSH.
I file di configurazione del demone sono due: /etc/default/knock e /etc/knock.conf.
Il primo file si presenta in questo modo:
################################################
#
# knockd’s default file, for generic sys config
#
################################################# control if we start knockd at init or not
# 1 = start
# anything else = don’t startSTART_KNOCKD=0
# command line options
#KNOCKD_OPTS=-i eth0
Il parametro START_KNOCKD definisce l’attivazione del demone. Impostato a zero il demone non è in ascolto. Il secondo parametro, KNOCKD_OPTS identifica l’interfaccia sulla quale il demone è in ascolto (eth0, ppp0, wlan0…). Il secondo file invece è qualcosa di simile a questo:
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 5
command = /sbin/iptables -A INPUT -s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags = syn
I pacchetti di tipo “syn” identificano la richiesta di connessione. Il comando command viene lanciato solo se viene rilevata una sequenza sulle porte 7000 8000 9000 in questo ordine, in un tempo non superiore a 5 secondi. Il comando modifica iptables aprendo la porta 22, quella di SSH appunto. Come è facilmente intuibile, il file di configurazione ci dice che per richiudere la porte dovremo “bussare” sulle porte 9000 8000 7000 in quest’ordine, sempre entro 5 secondi.
Ma come effettuiamo le “bussate”?
Supponendo che l’indirizzo del server remoto sia 10.0.0.1, possiamo effettuare le “bussate” con il comando:
knock -v 10.0.0.1 7000 8000 9000
Per vedere se effettivamente si è attivato il servizio possiamo cercare di effettuare il login:
ssh nome_utente_ssh@remote_server.org
A questo punto dovrebbe venirci richiesta la password e avremo accesso alla nostra shell.
E’ inoltre possibile specificare se la porta su cui bussare sia TCP o UDP (per complicare la sequenza) ed è anche possibile verificare la presenza/assenza di determinati flag tcp.
In modo analogo è possibile per esempio aprire la porta FTP. Al file di configurazione possiamo aggiungere queste righe:
[openFTP]
sequence = 10000,11000,12000
seq_timeout = 5
command = /sbin/iptables -A INPUT -s %IP% -p tcp –dport 20:21 -j ACCEPT
tcpflags = syn[closeFTP]
sequence = 12000,11000,10000
seq_timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp –dport 20:21 -j ACCEPT
tcpflags = syn
Dal punto di vista strutturale ci sono diversi modi per utilizzare un sistema di Port Knocking:
- Singola porta e mappatura fissa (quello che abbiamo visto)
- Porta Multipla, mapping dinamico
- Mappatura con crittografia (il metodo più sicuro)
Ulteriori articoli:
- La tecnica del port knocking – Parte 2
- Port Knocking per leggere in tail i log remoti (in arrivo)