Servknock 1.11
Servknock e' un sistema di portknocking composto da client e
server. Il portKnocking e' un metodo che permette a due macchine di comunicare
attraverso porte chiuse, analizzando il traffico in transito su una data
interfaccia.
Prima di accedere ad uno specifico servizio, gli utenti generano, tramite
un apposito client, una speciale sequenza di tentativi di connessione verso
porte di rete chiuse, come meccanismo di autenticazione.
Prima che la connessione ad uno specifico servizio possa venire stabilita, il
richiedente ?bussa alle porte?, facendosi riconoscere prima di poter accedere
al servizio desiderato.
Lato server queste sequenze vengono analizzate e nel caso siano riconosciute,
potranno essere svolte delle azioni specifiche, come ad esempio modificare
dinamicamente le regole del filtraggio del firewall, per consentire l'accesso
ad una data porta per l'indirizzo IP del richiedente.
Le principali features del sistema sono le seguenti :
- Rilevamento delle sequenze tramite analisi real-time del traffico di rete,
Utilizzo di sequenze di knock crittate, comprendenti anche l'indirizzo IP del
richiedente
- Possibilita' di includere nella sequenza di knock sia pacchetti TCP, UDP che
ICMP
- Possibilita' di discriminare i pacchetti TCP della sequenza in base ai flag
impostati.
- Possibilita' di specificare diverse sequenze di knock per eventi differenti
Elementi della sequenza di knock mischiati con un pattern casuale di traffico
di rete.
- Possibilita' di eseguire comandi shell arbitrari e non solamente manipolare le
regole di filtraggio del firewall.
- Possibilita' di eseguire piu' di un comando al riconoscimento di una sequenza
- Possibilita' di eseguire due differenti serie di comandi, la prima al
riconoscimento della sequenza , e la seconda trascorso un timeout specificato.
- Logging dell'attivita' del portknocking server e dei comandi eseguiti.
- Possibilita' di utilizzare il sistema in modo centralizzato, con i servizi
distribuiti su host different
Servknock e' basato sull'idea originaria di Martin Krzywinski, che proponeva di analizzare i log del firewall per rilevare le sequenze di pacchetti dirette verso porte chiuse, descritta in Sysadmin magazine, linuxjournal.com e www.portknocking.org.

Download : servkock_1.11.tar.gz
Configurazione
Nel tarball di servknock e' incluso il relativo file di configurazione,
servknock.conf. Prima di modificarlo per adattarlo alle proprie necessita' si
consiglia di farne una copia, che potrebbe sempre tornare utile come
riferimento.
La prima parte del file e' costituita dalla successiva serie di coppie
chiave=valore, che descrivono le opzioni di configurazione generali :
- iface : nome del'interfaccia sulla quale catturare il traffico, come ad
esempio eth0, ppp0 ecc.
- cypher : l'algoritmo da utilizzare nelle operazioni di cifratura/decifratura
delle sequenze di knock. Attualmente gli unici cifrari supportati sono i due
algoritmi a chiave simmetrica blowfish, twofish ed xtea.
- key : la chiave necessaria per le operazioni crittografiche. Ovviamente
lavorando con algoritmi a chiave simmetrica, anche il richiedente deve
utilizzare la medesima chiave per la costruzione delle sequenze di knock dirette
al server.
- iv : il vettore di inizializzazione, come per la chiave, deve essere uguale
sia lato server che client. La lunghezza di tale stringa deve essere al massimo
16 caratteri in caso si utilizzi l'algoritmo twofish, oppure 8 per blowfish. Se
si specifica una stringa di lunghezza superiore, i caratteri in eccesso verranno
semplicemente ignorati.
- span : gli intervalli di porte monitorati da servknock , per il
riconoscimento delle sequenze. Perche' il programma possa essere correttamente
avviato e' necessario che la somma di tutti i range di porte valga esattamente
255.
- logfile : il nome del file dove loggare le sequenze riconosciute ed i comandi
eseguiti.
Nella seconda parte vengono invece definite le diverse sequenze di knock.
Ognuna di esse e' compresa entro i tag <seq> e </seq>, ed include le seguenti
opzioni :
- name : il nome della sequenza;
- sequence : i pacchetti di rete che la compongono, comprese le rispettive
porte di destinazione, nel caso si dei pacchetti TCP ed UDP ;
- tcp_flags : i flag che devono essere settati nei pacchetti TCP ;
- seq_timeout : intervallo di tempo espresso in secondi entro il quale deve
venire completata la sequenza;
- command : comando da eseguire al riconoscimento della sequenza. Nel caso alla
sequenza fossero associati piu' comandi, devono essere presenti diverse linee
con l'opzione command : una per ognuno di essi.
- cmd_timeout : intervallo di tempo a partire dal momento del riconoscimento
della sequenza, trascorso il quale eseguire i comandi specificati dall'opzione
stop_command.
- stop_command : comando da eseguire una volta trascorsi un numero di secondi
secondi pari al valore specificato in cmd_timeout, a partire dal riconoscimento
della sequenza di knock. Nel caso si desideri associare piu' comandi alla
sequenza, e' sufficiente inserire diverse righe stop_command.
Per la manipolazione delle regole di filtraggio, e' qundi possibile seguire due
approcci : avere sequenze diverse per l'inserimento e la rimozione della regola
stessa, oppure una sequenza singola, utilizzando le opzioni cmd_timeout e
stop_command. A titolo esemplificativo, viene riportato il seguente stralcio di
file di configurazione:
<seq>
name=ssh_open
sequence=UDP:222,ICMP,TCP:56,UDP:22,TCP:99
seq_timeout=45
tcp_flags=syn,ack,psh
command=iptables -A INPUT -s $IP -p tcp --dport 22 -j ACCEPT
command=touch ciccio.txt
cmd_timeout=400
stop_command=iptables -D INPUT -s $IP -p tcp --dport 22 -j ACCEPT
</seq>
<seq>
name=ssh_close
sequence=UDP:212,TCP:149,ICMP,UDP:42,TCP:199,TCP:180
seq_timeout=45
tcp_flags=syn,psh,fin
command=iptables -D INPUT -s $IP -p tcp --dport 22 -j ACCEPT
</seq>
<seq>
name=apache_dnat
sequence=TCP:90,UDP:44,ICMP
tcp_flags=syn,ack,psh
seq_timeout=40
command=iptables -A PREROUTING -t nat -d 192.168.0.1 -p tcp --dport 80 -s $IP
-j DNAT --to-destination 192.168.0.4:80
cmd_timeout=40
stop_command=iptables -D PREROUTING -t nat -d 192.168.0.1 -p tcp --dport 80 -s
$IP -j DNAT --to-destination 192.168.0.4:80
</seq>
Perche' il sistema funzioni correttamente e' infine necessario impostare le
regole iniziali di filtraggio di netfilter, ricorrendo ad iptables. All'interno
del tarball di ServkKnock e' compreso a titolo esemplificativo lo shellscript
fwall.sh, utilizzabile per i test o come base per una politica di filtraggio
piu' accurata. Naturalmente esso non e' indicato per l'utilizzo in un ambiente
di produzione.
Portknocking server
ServKnock puo' essere semplicemente avviato con il comando 'servknock' .
Un'altro metodo, utilizzabile nei sistemi con init System-V, e' quello di
inserire uno shellscript per l'avvio di ServKnock (chiamandolo ad esempio
servknock.sh) nella directory /etc/init.d .In questo modo sara' possibile
avviare e fermare il programma con i comandi /etc/init.d/servknock.sh start ed
/etc/init.d/servknock.sh stop
Infine se si desidera avviare il server in fase di boot, o comunque associarne
l'esecuzione ad uno specifico runlevel e' necessario aggiungere una ?chiamata?
a servknock nella struttura di init del sistema con un link simbolico del tipo
/etc/rc3.d/S90servknock.sh che punti a /etc/init.d/servknock.sh).
Per semplicita', negli esempi riportati ServKnock verra' sempre avviato
direttamente da shell, dove la linea di comando da utilizzare e' cosi'
strutturata :
servknock [OPTION] [ -f <conf_file> ]
Le opzioni ammissibili sono le seguenti :
-d : daemon mode. Permette di fare girare il programma come un processo demone,
eseguito in background.
-h : stampa a video una pagina di help
-D : debug mode . Se specificata, questa opzione consente di stampare sullo
standard output diverse informazioni, relative ai parametri di configurazione,
le operazioni svolte ed i pacchetti analizzati. Si sottolinea come non sia
permesso specificarecontemporaneamente le opzioni -d e -D .
-f : permette di utilizzare un file di configurazione alternativo a quello di
default ( /etc/servknock.conf ). E' possibile specificare sia path relativi
che assoluti, come nei due esempi :
servknock -f /home/andrea/servknock/alt.conf
servknock -f ./servknock/alt.conf
-V : verbose mode. Consente di stampare sullo standard output alcune
informazioni sintetiche sulle sequenze riconosciute ed i comandi eseguiti. Come
per il debug mode, anche in questo caso non e' permesso specificare
contemporaneamente le opzioni -V e -d .
Knocking client
Nel tarball di ServKnock e' presente anche un secondo programma chiamato knock.
Scopo di tale software e' generare le sequenze di knock ed inviarle al
PortKnocking server, dal quale possono essere riconosciute e di conseguenza
portare all'esecuzione delle azioni previste in risposta.
Come per il PortKnocking server, anche per il client esiste il relativo file di
configurazione, chiamato knockrc. La sua struttura e' del tutto simile a quella
di servknock.conf, con la prima parte del file costituita da una serie di coppie
chiave=valore, che descrivono le opzioni di configurazione generali, e la
seconda in cui sono definite le diverse sequenze.
Non ci si sofferma sul significato delle opzioni ammissibili in knockrc,
poiche' gia' descritte per il file di configurazione di servknock. E' comunque
necessario ricordare come alcune di esse siano specifiche di servknock.conf e
quindi non utilizzabili. Non e' infatti prevista l'opzione logfile, mentre nella
definizione di una sequenza di knock sono ammesse esclusivamente name, sequence,
e tcp_flags.
NOTA : perche' le sequenze possano essere riconosciute, tutte le opzioni
utilizzate debbono corrispondere con quelle definite nel file di configurazione
del PortKnocking server, con name come unica possibile eccezione.
cypher=twofish
iv=PsychoticWaltz
key=pippo
span=7000-7100,7500-7655
#open port 22
<seq>
name=open_ssh
sequence=UDP:222,ICMP,TCP:56,UDP:22,TCP:99
tcp_flags=syn,ack,psh
</seq>
#close port 22
<seq>
name=close_ssh
sequence=UDP:212,TCP:149,ICMP,UDP:42,TCP:199,TCP:180
tcp_flags=syn,psh,fin
</seq>
#open port 80
<seq>
name=apache_dnat
sequence=TCP:90,UDP:44,ICMP
tcp_flags=syn,ack,psh
</seq>
Il programma puo' venire invocato con la seguente linea di comando :
knock -d <host> -i <interface> -s <sequence name> [-g <address>]
[-f <conf file>]
Le opzioni ammissibili sono le seguenti :
-d : indica l'host al quale inviare la sequenza di knock. E' possibile
specificare indifferentemente un nome oppure direttamente l'indirizzo IP
di destinazione.
-f : permette di utilizzare un file di configurazione alternativo a quello di
default ( ~/.knockrc).
-g : indica l'indirizzo IP dell'eventuale gateway utilizzato.
-h : stampa a video la seguente pagina di help
-i : l'interfaccia da utilizzare per l'invio dei pacchetti, ad esempio eth0,
eth1, ppp0 ecc.
-s : il nome della sequenza di knock da generare. Tale nome deve coincidere con
l'opzione name di una delle sequenze definite nel file di configurazione.
Se tutti i parametri necessari sono stati specificati correttamente, il
programma e' in grado di creare i pacchetti della sequenza ed inviarli a
destinazione, utilizzando il device indicato :
[TCP] 10359 Smoke packet
[TCP] 7559 Knock packet
[TCP] 5805 Smoke packet
[UDP] 8272 Smoke packet
[TCP] 2567 Smoke packet
[UDP] 7612 Knock packet
[TCP] 7656 Smoke packet
[TCP] 12807 Smoke packet
[ICMP] Knock packet
[TCP] 14457 Smoke packet
[TCP] 7582 Knock packet
[TCP] 8303 Smoke packet
[TCP] 7525 Knock packet
[UDP] 12872 Smoke packet
[TCP] 9951 Smoke packet
[TCP] 7569 Knock packet
[UDP] 4006 Smoke packet
[TCP] 7620 Knock packet
[TCP] 6497 Smoke packet
Come si puo' notare come gli elementi della sequenza di knock vengono inviati
all'interno di una sequenza casuale di pacchetti TCP ed UDP.
E' possibile impostare alcuni parametri in fase di compilazione riguardanti
la generazione degli smoke packets, modificando il valore delle seguenti
costanti definite in knock.h :
/*max nr. of smoke elements between right packets*/
#define SMOKE_NR 3
/*prob. of a smoke packet to be included in the sequence*/
#define SMOKE_PERC 60
/*max port number in a smoke packet, max 65535*/
#define SMOKE_MAX_PORT 9000
/*min port number in a smoke packet, min 1024*/
#define SMOKE_MIN_PORT 4000
Esempio
1) Il client con indirizzo IP 192.168.0.4 invia una specifica sequenza di knock
al server, con il comando 'knock -d stargazer.localdomain -i eth0 -s
apache_dnat' :
[TCP] 9543 Smoke packet
[UDP] 4328 Smoke packet
[TCP] 7055 Knock packet
[TCP] 6293 Smoke packet
[TCP] 9625 Smoke packet
[UDP] 7005 Knock packet
[UDP] 8424 Smoke packet
[UDP] 11426 Smoke packet
[ICMP] Knock packet
[TCP] 14587 Smoke packet
[TCP] 7014 Knock packet
[TCP] 7554 Knock packet
[UDP] 6726 Smoke packet
[TCP] 8073 Smoke packet
[TCP] 13369 Smoke packet
[UDP] 4020 Smoke packet
[TCP] 7618 Knock packet
[UDP] 8396 Smoke packet
[UDP] 13206 Smoke packet
[UDP] 9848 Smoke packet
[TCP] 7526 Knock packet
[UDP] 13656 Smoke packet
[TCP] 11985 Smoke packet
2) Il server riconosce tra i pacchetti ricevuti la sequenza TCP:90,UDP:44,ICMP
ed esegue i comandi ad essa associati :
iptables -A PREROUTING -t nat -d 192.168.0.1 -p tcp --dport 80 -s 192.168.0.1
-j DNAT --to-destination 192.168.0.4:80
3) Il client puo' connettersi all'applicazione protetta, in esecuzione sul
webserver.
4) Allo scadere del timeout specificato nel file di configurazione il server
esegue i comandi di "chiusura" associati alla sequenza riconosciuta in
precedenza :
iptables -D PREROUTING -t nat -d 192.168.0.1 -p tcp --dport 80 -s 192.168.0.1
-j DNAT --to-destination 192.168.0.4:80
Copyright
Servkock e' un progetto sviluppato da Beretta Andrea <beretta[dot]andrea[at]libero[dot]it>
e Bianchi Riccardo <ikir[at]iol[dot]it> presso il polo didattico e di ricerca di Crema.
Il software e' completamente opensource, e distribuito secondo i termini della
GNU General Public License.
Si ringraziano Judd Vinet <jvinet[at]zeroflux[dot]org>, Marco Balduzzi <embyte[at]spine-group[dot]org>, Paolo Carpo <snifth[at]spine-group[dot]org>, ed il prof. Marco Cremonini <cremonini[at]dti[dot]unimi[dot]it>
Posted by stargazer on 2004-11-18
[ Stampa ] | [ Email ]



