Howto port knocking
<adsense> google_ad_client = "pub-6334840821237294"; google_ad_width = 728; google_ad_height = 90; google_ad_format = "728x90_as"; google_ad_type = "text_image"; google_ad_channel = ""; </adsense>
Contents |
[edit] Introduzione
Il port knocking è una tecnica che vi permette di stabilire una connessione, per esempio ssh, anche se il vostro sistema è protetto da una firewall (iptables). E tramite un certo ordine di invio di certi pacchetti a determinate porte (questa configurazione è da fare tra client/server ma la vedremo più avanti) e se tutte le condizioni si sono avverate il sistema ci aprirà la porta desiderata. Ovviamente quando abbiamo finito per richiudere la porta ci sarà la bussata di chiusura.
[edit] Installare i pacchetti necessari
Esistono diversi pacchetti che ci mettono a disposizione questa caratteristica interessante ma noi analizzeremo questo pacchetto. http://www.portknocking.org/distribution/portknocking-0.30.tgz è interamente scritto in Perl quindi dovrete averlo installato dopo averlo spacchettato con il solito:
tar xvzf portknocking-0.30.tgz
per visualizzare la guida fate:
./knockclient -man
se vi da questo:
-bash:./knockclient: /usr/local/bin/perl:bad interpreter: No such file o directory
errore nello script è specificata la directory sbagliata del perl quindi modificatela manualmente. ora riproviamoci se adesso l'errore è:
Can't locate nomemodulo.pm in @INC
eseguite da root:
perl -MCPAN -e shell
a questo punto se vi rende la shell cpan>
install Nome::Modulo
al posto di Nome::Modulo dovete mettere queste dipendenze Config::General , File::Tail , Crypt::CBC , Crypt::Blowfish , Math::VecStat , Net::Pcap , Netpacket , Pod::Usage , Schedule::At , Storable. Adesso dando ./knockclient -man. Per il server c'è lo script knockdaemon.
[edit] Configurazione
Ecco la parte più importante. La configurazione del client si fa tramite il file knockclient.conf (scommetto non l'avreste mai immaginato). Per prima cosa indichiamo a quale sistema vogliamo connetterci tramite l'opzione remote e poi in knock ci va messo il tipo di knock che vogliamo effettuare:
- RAND valore casuale tra 0-255
- THIS YEAR valore dato dall'anno modulo 256
- THISDAY giorno modulo 256
- THISHOUR ora modulo 256
- THISMINUTE immaginate
- THISSECOND .......
- CHECKSUM somma di tutti i campi del knock modulo 256
- CLIENT indirizzo ip pubblico del client
- PORT porta che deve essere bloccata/sbloccata
- FLAGm valore arbitrario tra 0-255 anche m(contatore) può assumere un valore tra 0-255
Per le varie impostazioni delle variabili:
- client = xxx.xxx.xxx.xxx
- port = 10000
- flag0 = 12
- flag1 = 134
- encrypt = yes/no(consigliato si)
- key = (chiave decidete voi)
- cipher = Blowfish/IDEA/DES
- timeout = (tempo di attesa tra l'invio dei pacchetti)
- portspan = (range di porte)
Per la configurazione del client abbiamo finito adesso sta al server. Il file di configurazione è knockdaemon.conf vediamo i parametri fondamentali:
- runmode = network/file la differenza è che nel primo caso abbiamo uno sniffing del dei dati dalla rete invece nel secondo verrà utilizzato il file di log consultato in real-time
- interface = (interfaccia su cui verrà ascoltato il knock)
- useethfilter = tcpconn(per esempio) ma dopo dovrà essere specificato questo blocco:
<ethfilter tcpconn> proto = IP_PROTO_TCP flags = SYN dest_ip = yyy.yyy.yyy.yyy </ethfilter> l'unica da spiegare è dest_ip che restringe il campo di analisi a tutti i pacchetti ricevuti dall'ip che è l'interfaccia pubblica del server
- knock deve essere uguale a quella indicata nel file di configurazione del server
- adesso dobbiamo configurare l'azione che deve essere eseguita all ricezione di un knock corretto
<action> condition = PORT == 10000 && FLAG0 == 12 && FLAG1 == 134 template = iptables_open use = yes </action>
- dopo di che dobbiamo scrivere il blocco template che viene eseguito se la condizione è verificata
<template iptables_open> system = "/sbin/iptables -i INPUT -p TCP -s IP --dport PORT -j ACCEPT" </template>
- per concludere la configurazione settate decrypt , key , cipher e portspan agli stessi valori del client
[edit] Conclusioni
E' vero questa tecnica non è assolutamente usata per un client (io stesso non la metterei mai) ma se si tratta di avere un po' di sicurezza in più perché no e poi fare esperienza fa sempre bene. Comunque io ho parlato soltanto bene di questa tecnica e quindi adesso un po' di critiche:
- c'è la possibilità che a causa della latenza della rete i pacchetti non arrivino nell'ordine giusto
- la massiccia richiesta da parte del client potrebbe diminuire le prestazioni del sistema. Un attacco DOS di piccole dimensioni
Comunque ci sono anche molti vantaggi.
- non far vedere a malintenzionati i servizi a rischio tramite un port scan
- la crittografazione dei dati per una maggior sicurezza ancora
Ciao
<adsense> google_ad_client = "pub-6334840821237294"; google_ad_width = 728; google_ad_height = 90; google_ad_format = "728x90_as"; google_ad_type = "text_image"; google_ad_channel = ""; </adsense>