next   previous   contents

Overview

 Attualmente sono disponibili diverse implementazioni di sistemi di portknocking, essenzialmente in linguaggio C e Perl. In seguito alla loro analisi si e' notato che ognuna di esse aveva delle feature o delle idee particolarmente interessanti che la distingueva dalle altre. D'altro canto, prese singolarmente presentavano dei limiti e delle mancanze evidenti.
 Il limite piu' evidente di alcuni di questi sistemi era il fatto di strasmettere le sequenze di knock "in chiaro". Cosi' facendo un eventuale attacker potrebbe ricostruire la sequenza stessa, semplicemente sniffando il traffico di rete e controllando i vari pacchetti e le loro porte di destinazione. Un sistema cosi' implementato e' quindi estremamente vulnerabile ai replay attacks.
 Altri sistemi adottano invece metodi differenti, come cercare di nascondere le sequenze entro patterne casuali o pseudocasuali di traffico di rete. L'unico sistema che prevedesse la cifratura delle sequenze ha invece i limiti nel fatto di essere scritto in linguaggio PERL e di rilevare le sequenze tramite il persing dei log di sistema
 Tentando di superare questi problema, abbiamo cercato di implementare un prototipo, in cui riunire gli aspetti piu' interessanti dei sistemi esistenti.
 Nel prototipo sviluppato le sequenze vengono rilevate tramite l'analisi real-time del traffico di rete, in modo da non dovere ricorrere al parsing dei log di sistema, poiche' considerato troppo pesante dal punto di vista computazionale e meno efficiente. Esse possono essere costituite indifferentamente da pacchetti di ICMP, UDP e TCP.
 Nel caso dei pacchetti TCP, inoltre, e' possibile specificare anche delle particolari configurazioni dei flag. Utilizzando combinazioni specifiche, e' sicuramente piu' difficile che del normale traffico di rete possa interferire invalidando una sequenza. Infatti se un pacchetto non ha la combinazione di flag TCP richiesta, esso verra' ignorato, senza alcuna conseguenza sul riconoscimento di eventuali sequenze di knock.
 Simili accorgimenti, pero', non risolvono il problema della vulnerabilita' della tecnica del portknocking ai replay attacks. Quindi, prendendo esempio dall'implementazione di Martin Krzywinski, anche nel prototipo sviluppato le sequenze di knock comprendono l'indirizzo IP del richiedente ed il numero della porta di destinazione vien cifrato prima dell'invio da parte del client, per essere poi decifrato quando ricevuto dal portknocking server.
 Per rendere ancora piu' complesso l'operato di un eventuale attacker che abbia la possibilita' di “sniffare” il traffico diretto al portknocking server, i pacchetti della sequenza inviati vengono inseriti in posizione casuale entro una sequenza random di pacchetti TCP ed UDP. Tale soluzione ha il difetto di aumentare il traffico generato dal richiedente, ma il vantaggio della maggiore difficolta per un attacker nel riconoscere le sequenze ne giustifica l'adozione.
 Il programma client, prevede inoltre la possibilita' di funzionare anche dietro ad un gateway, costruendo le sequenze utilizzando il suo indirizzo IP anziche' il proprio.
 Al riconoscimento di una sequenza il portknocking server provvede ad eseguire le azioni definite in un file di configurazione. Tali azioni non devono necessariamente limitarsi alla manipolazione delle regole di filtraggio, ma possono essere costituite da una qualsiasi sequenza di comandi arbitrari della shell.
 E' inoltre possibile, come nel sistema knockd di Judd Vinet, specificare un timeout rispetto al momento del riconoscimento della sequenza, trascorso il quale eseguire una seconda serie di comandi. Una feature simile puo' rivelarsi particolarmente utile, ad esempio, per eliminare automaticamente dopo un certo intervallo di tempo delle regole di filtraggio precedentemente inserite.
 Naturalmente tutte le operazioni eseguite in risposta alle sequenze vengono loggate in un apposito file, in modo da tenere traccia dell'operato del programma e delle sequenze riconosciute.

 Nell'ambito di questo progetto, abbiamo sviluppato due prototipi della tecnica del portknocking: servknock un processo demone basato sulla libreria LibPcap e Module Knock un modulo per hogwash, un intrusion detection system opensource. Le funzionalita' svolte e le features principali sono comunque le medesime in entrambi i casi .
 Oltre al portknkocking server, inoltre, e' stato implementato anche un programma client da utilizzarsi per la generazione delle sequenze stesse.
 Il sistema standalone servknock potrebbe essere indicato nel caso si abbia bisogno esclusivamente di un portknocking server oppure non si voglia utilizzare hogwash come intrusion detection system.
 L'altro principale vantaggio di servknock e' rappresentato dalla maggiore liberta' e flessibilita' nel caso si vogliano apportare modifiche al codice, poiche' esso non e' legato all'architettura di un'altro software come invece avviene per il modulo Module Knock .
 E' necessario pero' evidenziare che l'utilizzo di un secondo software per processare i pacchetti quando sia gia' presente un intrusion detection system potrebbe non essere una soluzione particolarmente efficiente. Sarebbe decisamente piu' indicato sfruttare l'intrusion detection system gia' disponibile, anche se configurarlo e mantenerlo correttamente richiederebbe un maggiore impegno rispetto al solo portknkocking server.
 Va inoltre sottolineato come Module Knock talvolta non riesca a riconoscere delle sequenze di knock quando queste vengono ricevute troppo rapidamente. Il problema non e' comunque dipendente dal modulo, ma da hogwash stesso. Ogni pacchetto ricevuto dal programma, infatti, viene passato al modulo per essere processato, ma possono verificarsi casi nei quali due pacchetti siano consegnati al modulo in ordine inverso rispetto a quello con cui sono in realta' arrivati alla scheda di rete. Il problema si puo' pero' risolvere in maniera piuttosto semplice, alzando il timeout entro cui completare le sequenze di knock e rallentando la velocita' con la quale il client invia i pacchetti. Esso costituisce comunque una limitazione del prototipo attuale di Module Knock rispetto alla soluzione standalone servknock.

 Ricapitolando, le principali features dei due prototipi sviluppati sono :

1. Rilevamento delle sequenze tramite analisi real-time del traffico di rete;
2.Utilizzo di sequenze di knock crittate, comprendenti anche l'indirizzo IP del richiedente;
3.Possibilita' di includere nella sequenza di knock sia pacchetti TCP, UDP che ICMP;
4.Possibilita' di discriminare i pacchetti TCP della sequenza in base ai flag impostati;
5.Possibilita' di specificare diverse sequenze di knock per eventi differenti;
6.Elementi della sequenza di knock mischiati con un pattern casuale di traffico di rete;
7.Possibilita' di eseguire comandi shell arbitrari e non solamente manipolare le regole di filtraggio del firewall;
8.Possibilita' di eseguire piu' di un comando al riconoscimento di una sequenza;
9.Possibilita' di eseguire due differenti serie di comandi, la prima al riconoscimento della sequenza , e la seconda trascorso un timeout specificato;
10.Logging dell'attivita' del portknocking server e dei comandi eseguiti;
11.Possibilita' di utilizzare il sistema in modo centralizzato, con i servizi distribuiti su host differenti;
12.Possibilita' di usare il client per anche dietro ad un gateway;

next   previous   contents