Blindare SSH tramite il Port Knocking
Da Wizard linux team wiki.
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! ;)

