Proteggere il servizio SSH (e non solo) tramite la tecnica Single Packet Authorization (SPA) utilizzando il software fwknop

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:

[[email protected]serverspa]# yum install libpcap libpcap-devel

Su Ubuntu 14.04:

[[email protected]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:

[[email protected]serverspa]# iptables-save > /etc/sysconfig/iptables

Su Ubuntu 14.04:

[[email protected]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).

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

Da root:

[[email protected]serverspa]# make install # CentOS
[[email protected]serverspa]$ sudo make install # *Ubuntu

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

[[email protected]serverspa]# cd fwknop-2.6.2
[[email protected]serverspa]# 
[[email protected]serverspa]# cp extras/fwknop.init.redhat /etc/init.d/fwknop
[[email protected]serverspa]# chkconfig fwknop on

 

*Ubuntu
[[email protected]serverspa]$ cd fwknop-2.6.2
[[email protected]serverspa]$ 
[[email protected]serverspa]$ sudo cp extras/fwknop.init.debian /etc/init.d/fwknop-server
[[email protected]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:
[email protected]serverspa:~$ sudo apt-get install fwknop-server

per il client:

[email protected]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:

[email protected]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
[email protected]clientspa:~$
[email protected]clientspa:~$ grep KEY /home/claudio/.fwknoprc
KEY_BASE64                  NPhe11+ORlK1Yfr4ipzW+ngQxzRt8kjI6UTDXLZYSv0=
HMAC_KEY_BASE64             SypMEUIhiAKTjeHlHoWR5dfu7hrLVvLnoIXINPbGTOowST1vUIs+tOtMc/XlKl6+JcVw7qc2jrpqmKujZxvnqw==
[email protected]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:

[[email protected]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:

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

Ubuntu:

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

4) Test di connessione

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

[email protected]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:

[email protected]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 :

[email protected]clientspa:~$ fwknop -n 2.2.2.2 -a 1.1.1.1
[email protected]clientspa:~$ ssh [email protected]
[email protected]'s password:
Last login: Wed Apr 30 23:06:51 2014 from 5.5.5.5
[[email protected]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