Configurazione
Prima di tutto si ricorda che servknock deve essere eseguito sulla macchina che agisce da firewall (in modo da gestire le regole di filtraggio tramite iptables). Possibili posizionamenti del portknocking server all'interno di una rete potrebbero, quindi, essere i seguenti :
1. Servizi applicativi e firewall in esecuzione sulla medesima macchina;
2. Ambiente con un singolo server direttamente connesso al firewall, ad esempio per mezzo di un cavo crossover;
3. Ambiente con diversi server connessi al firewall per mezzo di un hub oppure di uno switch;
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 testati sono stati i cinque algoritmi a chiave simmetrica Blowfish, Twofish, Rijndael, Serpent ed Xtea.
- password : la passowrd necessaria per generare la chiave utilizzata nelle 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 : un'altra password utilizzata per generare il vettore di inizializzazione. Come per la chiave, essa deve essere uguale sia lato server che client. 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 siano 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 del file di configurazione:
#open ssh on demand
<seq>
name=ssh_open
seq_timeout=40
sequence=UDP:222,ICMP,TCP:56,UDP:22,TCP:99
tcp_flags=syn,ack,psh
command=/etc/init.d/ssh start
command=iptables -A INPUT -s $IP -p tcp --dport 22 -j ACCEPT
</seq>
#close ssh
<seq>
name=ssh_close
seq_timeout=40
sequence=UDP:212,TCP:149,ICMP,UDP:42,TCP:199,TCP:180
tcp_flags=syn,psh,fin
command=iptables -D INPUT -s $IP -p tcp --dport 22 -j ACCEPT
command=/etc/init.d/ssh stop
</seq>
#open apache port
<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>
Un esempio completo di file di configurazione, utilizzabile come riferimento, e' invece presente nella sezione 4.4, oppure nel tarball di servknock.
Perche' il sistema funzioni correttamente e' infine necessario impostare le regole iniziali di filtraggio di netfilter (il firewall integrato nel kernel Linux), ricorrendo ad iptables. Per automatizzare l'operazione si potrebbe utilizzare uno shellscript, ove inserire tutti i comandi necessari.
All'interno del tarball di servknock e' infatti 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.
[... ]
### start firewall
start()
{
# caricamento moduli necessari
/sbin/insmod ip_tables > /dev/null 2> /dev/null
/sbin/insmod iptable_NAT > /dev/null 2> /dev/null
/sbin/insmod ip_conntrack > /dev/null 2> /dev/null
/sbin/insmod ipt_MASQUERADE > /dev/null 2> /dev/null
[...]
# flush regole
echo -n "Flushing delle regole eventualmente presenti : "
$IPTABLES -F INPUT > /dev/null
$IPTABLES -F OUTPUT > /dev/null
$IPTABLES -F FORWARD > /dev/null
$IPTABLES -t nat -F > /dev/null
echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]"
# attivazione ip_forward
echo -n "Disattivazione del Forward dei pacchetti: "
echo 1 > /proc/sys/net/ipv4/ip_forward
echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]"
# regole filtraggio
echo -n "Impostazioni delle regole di filtraggio : "
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -d 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -j DROP
}
### stop firewall
stop()
{
echo "Disattivazione del Firewall in corso..."
$IPTABLES -F
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD DROP
$IPTABLES -t nat -F
echo -n "Rimozione dei moduli necessari : "
/sbin/rmmod ip_conntrack > /dev/null 2> /dev/null
/sbin/rmmod ipt_MASQUERADE > /dev/null 2> /dev/null
/sbin/rmmod iptable_nat > /dev/null 2> /dev/null
echo -e "\t\t[ ${GREEN}OK ${WHITE}]"
echo -n "Disattivazione IP forwarding : "
echo 0 > /proc/sys/net/ipv4/ip_forward
echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]"
echo -e "${YELLOW}ATTENZIONE: IL FIREWALL NON E' PIU' OPERATIVO${WHITE}"
}
[...]
Configurazione di Module Knock
La configurazione di Module Knock non presenta particolari differenze rispetto a servknock. Le varie opzioni sono tuttavia all'interno del file di configurazione di Hogwash test.config (presente nell'archivio di Module Knock), delimitate dai demarcatori <module knock> e <module>.