Blindare SSH tramite il Port Knocking

Da Wizard linux team wiki.

Jump to: navigation, search

Contents

Cos'è il Port Knocking?

E' un sistema che sta in ascolto sui log del firewall (o direttamente in sniffing) che cerca di catturare i "knocking" su una sequenza di porte. Per una migliore spiegazione: http://it.wikipedia.org/wiki/Port_knocking


Funzionamento

Immaginiamo di trovarci all'inizio di un corridoio di un hotel, intorno a noi solamente delle porte. Abbiamo la necessità di entrare nella nostra stanza, che ha il numero 22, ma purtroppo troviamo la porta chiusa a chiave. Per poterla aprire dobbiamo bussare nella sequenza giusta ad un numero X di porte intorno a noi, aventi anch'esse un numero identificativo. Se la sequenza è corretta e abbiamo fatto il tutto in un tempo breve, la nostra camera numero 22 si aprirà per magia.
Questo esempio della vita reale non si distacca molto dal funzionamento del port knocking!
Nel funzionamento informatico la "magia" sta nel fatto di creare una nuova regola IPtables che consente ad un indirizzp IP l'accesso alla porta 22 se e solo se si è ricevuta la sequenza corretta di porte su cui abbiamo "bussato".


Con cosa si bussa?

L'unia cosa che ci serve è il programma knockd (su alcune distribuzioni è presente nei repositories). Possiamo scaricarlo da qui: http://www.zeroflux.org/projects/knock knockd è il demone che si occupa di stare in ascolto per prendere la sequenza esatta;
knock è il programma che serve per "bussare" alle porte;

Configurazione di knockd

Una volta installato knockd ci troviamo (e se non c'è ce lo creiamo) un file chiamato /etc/knockd.conf
Al suo interno ci sono delle regola base. Vediamo a cosa servono:

[options]
        logfile = /var/log/knockd.log

[openSSH]
        sequence    = 700,800,900
        seq_timeout = 5
        command     = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

[closeSSH]
        sequence    = 900,800,700
        seq_timeout = 5
        command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

Nel riquadro [options] c'è specificato solo dove inserire il file di log.
Nel riquadro [openSSH] possiamo notare:
1= La sequenza delle porte corretta prima di inviare il comando `command`
2= Il timeout in secondi prima che scarti il tentativo di azzeccare la sequenza
3= Tipologia del flag del pacchetto ricevuto. Le altre tipologie sono: fin|syn|rst|psh|ack|urg
Nel riquadro [closeSSH] fa' la stessa identica cosa, solo cambiando `command`
A questo punto andiamo ad analizzare cosa fa' il comando che viene inviato nel caso di sequenza giusta:

/sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

Questo comando aggiunge una nuova regola iptables che permette ad %IP% (viene gestito da knockd ed è l'ip di chi ha azzeccato la sequenza) di poter vedere la porta 22 aperta!

/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

Toglie ad %IP% la possibilità di vedere la porta 22 aperta.
Piu' semplice di cosi'?
Ricordiamoci pero' di far attenzione ad impostare, prima di far partire knockd, una regola IPtables che inibisce a TUTTI la visualizzazione della porta 22 in ascolto:

/sbin/iptables -A INPUT -p tcp -m tcp --dport 22 -j DROP

Ora non ci rimane altro da fare che avviare in formato 'demonized' knockd tramite il comando:

knockd -i venet0:0 -d

Dove con il parametro -i specifichiamo l'interfaccia di ascolto (eth0, wlan0... quella che vogliamo)
mentre con il -d diciamo di avviarsi come demone.


Configurazione di knock

Non ci rimane che bussare alle nostre porte per vedere di nuovo la porta 22 aperta tramite il comando:

knock 127.0.0.1 700 800 900

e possiamo vedere la porta 22 aperta:

Starting Nmap 5.00 ( http://nmap.org ) at 2009-08-05 13:57 CEST
Interesting ports on XX.XX.XX.XX:
PORT   STATE    SERVICE VERSION
22/tcp open ssh

Mentre se eseguiamo la sequenza di chiusura (knock 127.0.0.1 900 800 700) vedremo:

Starting Nmap 5.00 ( http://nmap.org ) at 2009-08-05 13:57 CEST
Interesting ports on XX.XX.XX.XX:
PORT   STATE    SERVICE VERSION
22/tcp filtered ssh

Conclusioni

Abbiamo visto come si può rafforzare la sicurezza di un servizio già di suo blindato.
L'utilizzo di knockd può essere esteso ad ulteriori servizi, tipo webmin (porta 10000) e qualsiasi altra cosa! Anche qui l'unico freno è la fantasia di chi lo utilizza! ;)

wizard linux team