Inserire uno strato di controllo (oltre al firewall) davanti ad alcuni servizi strategici, può rilevarsi molto efficace sotto l’aspetto della sicurezza.

Prendiamo per esempio il servizio SSH,  essendo un demone utilizzato esclusivamente per amministrare e dare l’accesso al sistema, perchè renderlo accessibile da tutta la rete internet?

Esistono varie tecniche per limitare l’accesso solo a connessioni autorizzate, tra quelle più interessanti c’è il Single Packet Authorization (SPA).

SPA è una versione avanzata del Port Knocking e viene utilizzata su linux dal software fwknop (FireWall KNock OPerator).

Cosa è il Port Knocking?

Il port knocking è un sistema che viene utilizzato per aprire delle porte su un firewall dall’esterno inviando tentativi di connessione ad una sequenza prestabilita di porte chiuse; una volta che ciò è stato fatto le regole del firewall vengono aggiornate dinamicamente per consentire all’host che ha inviato la giusta sequenza di connettersi alla porta voluta.

Fonte wikipedia

SPA si comporta alla stessa maniera solo che  invia un singolo pacchetto criptato verso il server di destinazione.
Questo comporta una migliore velocità nell’accedere al servizio nascosto, una migliore indiscrezione sulla rete (al contrario il Port Knocking può essere scambiato per un tentativo di port scanning da un IDS) e soprattutto protegge dai tentativi di connessioni replicate ( il singolo pacchetto criptato viene creato tutte le volte con valore casuale e non può essere riutilizzato!).

Fwknop è composto da un client ed un server.
Il demone fwknopd installato sul server sniffa le connesioni che arrivano sull’interfaccia di rete tramite la libreria libpcap, appena riceve dal client il pacchetto criptato e firmato con la chiave giusta abilita la connessione dell’indirizzo IP sorgente verso il servizio prestabilito (iptables).
Una volta inviato il pacchetto tramite il client fwknop si ha un lasso di tempo per stabilire la connessione verso il servizio protetto (di default 30 sec.), sfiorata questa tempistica il server chiude la connessione.

Per maggiori informazioni è possibile fare riferimento alla documentazione ufficiale: http://www.cipherdyne.org/fwknop/docs/

1) Installazione requisiti

1A) Lato client non ci sono dipendenze da soddisfare mentre per quanto riguarda il server i pacchetti sono due:

  • iptables
  • libpcap

Iptables si trova praticamente già preinstallato su tutte le distro mentre libpcap va installato autonomamente.

Su CentOS 6.5:

[root@serverspa]# yum install libpcap libpcap-devel

Su Ubuntu 14.04:

[claudio@serverspa]$ sudo apt-get install libpcap-dev

1B) Oltre ai pacchetti vanno inserite due regole iptables fondamentali per il funziomaneto di fwknop:

iptables -I INPUT 1 -i eth0 -p tcp --dport 22 -j DROP
iptables -I INPUT 1 -i eth0 -p tcp --dport 22 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

La prima blocca tutte le connessioni in entrata per il servizio SSH, la seconda invece accetta le connessioni già stabilite (questa servirà quando fwknop server ci autorizzerà a collegarsi verso il demone ssh).

ATTENZIONE!!!
Così facendo chiuderete tutte le connessioni verso ssh, accertatevi di poter accedere al server 
dalla console locale o abilitate la connessione a un singolo ip.
Es: 
iptables -I INPUT -i eth0 -s 3.3.3.3 -p tcp --dport 22 -j ACCEPT

In questo caso le configurazioni sul server remoto le eseguirò da una connessione con
ip 3.3.3.3 che ha libero accesso.

1C) Per non perdere le regole del firewall al riavvio di CentOS 6.5 scrivere:

[root@serverspa]# iptables-save > /etc/sysconfig/iptables

Su Ubuntu 14.04:

[claudio@serverspa]$ sudo sh -c "iptables-save > /etc/iptables.rules"


Dopo di che inserire nel file "/etc/network/interfaces" la stringa
pre-up iptables-restore < /etc/iptables.rules
sotto la riga "iface lo inet loopback". 

Naturalmente potete usufruire di un eventuale file di regole iptables preesistente.

2) Installazione fwknop server/client

Sia per Ubuntu che CentOS la mia scelta è ricaduta sulla versione 2.6.x, il motivo principale è il supporto HMAC (keyed-hash message authentication code) per i pacchetti SPA criptati con gli algoritmi Rijndael e GnuPG (disponibile dalla 2.5.0).

2A-1) Installazione CenOS 6.x :

L’installazione sarà identica sia lato server che lato client dato che l’archivio dei sorgenti contiene entrambi i software (fwknopd e fwknop).

[claudio@serverspa]$ wget http://www.cipherdyne.org/fwknop/download/fwknop-2.6.2.tar.gz
[claudio@serverspa]$
[claudio@serverspa]$ tar xvfz fwknop-2.6.2.tar.gz
[claudio@serverspa]$ cd fwknop-2.6.2
[claudio@serverspa]$
[claudio@serverspa]$ ./configure --prefix=/usr --sysconfdir=/etc --libdir=/lib64 && make # --libdir=/lib per 32bit

Da root:

[claudio@serverspa]# make install # CentOS

[claudio@serverspa]$ sudo make install # Ubuntu

2A-2) Copiare il file init per il demone fwknop:

[root@serverspa]# cd fwknop-2.6.2
[root@serverspa]# 
[root@serverspa]# cp extras/fwknop.init.redhat /etc/init.d/fwknop
[root@serverspa]# chkconfig fwknop on
 
*Ubuntu
[claudio@serverspa]$ cd fwknop-2.6.2
[claudio@serverspa]$ 
[claudio@serverspa]$ sudo cp extras/fwknop.init.debian /etc/init.d/fwknop-server
[claudio@serverspa]$ sudo update-rc.d fwknop-server defaults

Per installare il client, sulla macchina prestabilita (clientspa), andrà eseguita la stessa operazione d’installazione tranne il punto “2A-2“.

IMPORTANTE!!! Nel repository ufficiale di Ubuntu 13.10 è presente la versione server/client di fwknop 2.0.4, per avere il supporto HMAC installare il software tramite sorgenti (vedi punto “2A-1”).

2B) Installazione Ubuntu 14.04:

L’installazione per Ubuntu è semplice, da terminale scrivere:

claudio@serverspa:~$ sudo apt-get install fwknop-server

per il client:

claudio@clientspa:~$ sudo apt-get install fwknop-client

3) Configurazione fwknop server/client

Immaginiamo lo scenario:

ServerSPA: 2.2.2.2

ClientSPA: 1.1.1.1

UserClientSPA: claudio

Algoritmo SPA: Rijndael con HMAC

3A) Geneare le chiavi sul client e prenderne nota:

claudio@clientspa:~$ fwknop -A tcp/22 -D 2.2.2.2 --key-gen --use-hmac --save-rc-stanza
[*] Creating initial rc file: /home/claudio/.fwknoprc.
[+] Wrote Rijndael and HMAC keys to rc file: /home/claudio/.fwknoprc
claudio@clientspa:~$
claudio@clientspa:~$ grep KEY /home/claudio/.fwknoprc
KEY_BASE64                  NPhe11+ORlK1Yfr4ipzW+ngQxzRt8kjI6UTDXLZYSv0=
HMAC_KEY_BASE64             SypMEUIhiAKTjeHlHoWR5dfu7hrLVvLnoIXINPbGTOowST1vUIs+tOtMc/XlKl6+JcVw7qc2jrpqmKujZxvnqw==
claudio@clientspa:~$

3B) Creare sul serverspa (2.2.2.2) il file “/etc/fwknop/access.conf” inserendo le chiavi del client:

SOURCE                     ANY
REQUIRE_SOURCE_ADDRESS     Y
KEY_BASE64                  NPhe11+ORlK1Yfr4ipzW+ngQxzRt8kjI6UTDXLZYSv0=
HMAC_KEY_BASE64             SypMEUIhiAKTjeHlHoWR5dfu7hrLVvLnoIXINPbGTOowST1vUIs+tOtMc/XlKl6+JcVw7qc2jrpqmKujZxvnqw==

3C) Controllare che sul file di configurazione del serverspa (2.2.2.2) sia configurata l’interfaccia di rete (WAN) corretta su cui fwknopd starà in ascolto:

[root@serverspa]# grep PCAP_INTF /etc/fwknop/fwknopd.conf
# the PCAP_INTF setting.
PCAP_INTF                   eth0;

3D) Far partire il demone fwknop sul serverspa (2.2.2.2):

CentOS:

[root@serverspa]# /etc/init.d/fwknop start
Avvio di fwknopd:                                          [  OK  ]
[root@serverspa]#

Ubuntu:

[claudio@serverspa]$ sudo /etc/init.d/fwknop-server start
Avvio di fwknopd:                                          [  OK  ]
[claudio@serverspa]$

4) Test di connessione

4A) Controllare che il serverspa (2.2.2.2) blocchi di default le connessioni verso il servizio SSH:

claudio@clientspa:~$ nmap 2.2.2.2 -p22

Starting Nmap 6.40 ( http://nmap.org ) at 2014-04-30 23:21 CEST
Nmap scan report for 2.2.2.2
Host is up (0.0011s latency).
PORT   STATE    SERVICE
22/tcp filtered ssh

Nmap done: 1 IP address (1 host up) scanned in 1.97 seconds

4B) Spedire il pacchetto SPA al serverspa ed abilitare l’accesso SSH al clientspa:

claudio@clientspa:~$ fwknop -n 2.2.2.2 -a 1.1.1.1 # in assenza di ip statico 1.1.1.1 dovrà essere
                                                    sempre sostituito dall'ip pubblico assegnato
                                                    dal vostro ISP.

4C) Collegarsi dal clientspa verso il serverspa tramite ssh client entro 30 secondi :

claudio@clientspa:~$ fwknop -n 2.2.2.2 -a 1.1.1.1
claudio@clientspa:~$ ssh [email protected]
[email protected]'s password:
Last login: Wed Apr 30 23:06:51 2014 from 5.5.5.5
[root@serverspa ~]#

5) Conclusioni

Fwknop non garantisce  una sicurezza assoluta (chi lo fa?) ma integrato con altri sistemi ne può aumentare notevolmente il livello.Un altro aspetto interessante è la compatibilità del client con i vari dispositivi, infatti oltre ad essere supportato dai sistemi unix-like, Windows e OSX è possibile installarlo su smartphone/tablet Android e iOS.

Pro:

  • Protegge i servizi da eventuali 0-day
  • Riduce i tempi di risposta del Port Knocking
  • Cripta il playload
  • Disponibilità del client per vari dispositivi

Contro:

  • Non è utilizzabile con tutti i servizi (soprattutto quelli pubblici a cui devono accedere qualsiasi utente)
  • Devi sempre avere un client disponibile