Dal Port Knocking allo Single Packet Authorization

Qualche settimana fa ho pubblicato un video dedicato al Port Knocking utilizzando knockd, una tecnica tanto semplice quanto affascinante che permette di nascondere un servizio dietro una sequenza di connessioni prestabilita.
L’idea è elegante: il servizio rimane invisibile fino a quando qualcuno non “bussa” nel modo corretto. Una sorta di porta segreta per i nostri server.
Come spesso accade nel mondo della sicurezza informatica, però, una buona idea può essere migliorata. Ed è proprio qui che entra in gioco fwknop, un progetto open source che implementa il concetto di Single Packet Authorization (SPA).
In questo articolo vedremo perché SPA rappresenta l’evoluzione naturale del Port Knocking e come utilizzarlo per proteggere l’accesso SSH ai nostri sistemi Linux.
Un rapido ripasso del Port Knocking
Per chi non avesse visto il video, il Port Knocking è una tecnica che consente di mantenere chiusa una porta di servizio fino a quando un client non esegue una determinata sequenza di connessioni.
Immaginiamo di voler proteggere SSH.
Normalmente la porta 22 è visibile:
Internet
|
v
+-----------+
| SSH :22 |
+-----------+
Con il Port Knocking, invece, la porta rimane chiusa e viene aperta soltanto dopo una sequenza prestabilita:
7000 -> 8000 -> 9000
Quando il demone knockd rileva la sequenza corretta, modifica temporaneamente le regole del firewall consentendo la connessione SSH.
Dal punto di vista pratico è una soluzione semplice, leggera e piuttosto efficace contro gli scanner automatici.
I limiti del Port Knocking
Nonostante il suo fascino, il Port Knocking presenta alcuni limiti strutturali.
Le sequenze sono osservabili
Un eventuale attaccante che abbia la possibilità di osservare il traffico di rete può individuare la sequenza utilizzata.
Ad esempio:
1234
4321
2222
8888
Una volta scoperta, la sequenza può essere riprodotta.
Replay attack
Se qualcuno intercetta i pacchetti utilizzati per il knocking può tentare di riutilizzarli successivamente.
Molte implementazioni moderne introducono contromisure, ma il problema rimane parte integrante dell’approccio.
Configurazioni sempre più complesse
Per aumentare la sicurezza si tende ad allungare le sequenze o a renderle più elaborate.
Il risultato è che la complessità cresce rapidamente senza offrire un miglioramento proporzionale della protezione.
Single Packet Authorization
Il concetto alla base di SPA è sorprendentemente semplice.
Invece di inviare una serie di pacchetti, il client invia un singolo pacchetto cifrato contenente tutte le informazioni necessarie per autorizzare l’accesso.
Client
|
| Pacchetto SPA cifrato
|
v
+---------+
| fwknopd |
+---------+
|
+--> apre SSH temporaneamente
Il server analizza il pacchetto, verifica che sia valido e, solo in quel caso, modifica dinamicamente le regole del firewall.
Dal punto di vista di un osservatore esterno il servizio continua a risultare completamente invisibile.
Perché fwknop è diverso
La differenza principale è che il pacchetto SPA è cifrato.
Questo significa che:
- non esiste una sequenza osservabile;
- non vengono esposte informazioni utili sulla rete;
- il firewall rimane chiuso fino all’autorizzazione;
- vengono utilizzati timestamp e meccanismi anti-replay;
- l’autenticazione e l’autorizzazione avvengono in un unico passaggio.
In pratica si passa da:
“fammi vedere che conosci la sequenza”
a
“dimostrami immediatamente che sei autorizzato”
Un approccio decisamente più moderno.
Mani in pasta
Vediamo come configurare un semplice ambiente Debian.
Installazione
Sul server:
sudo apt update
sudo apt install fwknop-server
Sul client:
sudo apt install fwknop-client
Generazione delle chiavi
fwknop utilizza chiavi condivise per autenticare le richieste.
Possiamo generarne una con:
fwknop --key-gen
L’output sarà simile a:
KEY_BASE64: YWJjZGVmZ2hpamtsbW5vcA==
Conserviamo la chiave in modo sicuro: dovrà essere presente sia sul server sia sul client.
Configurazione del server
Il file principale è:
/etc/fwknop/access.conf
Una configurazione minimale potrebbe essere:
SOURCE ANY
OPEN_PORTS tcp/22
KEY_BASE64 YWJjZGVmZ2hpamtsbW5vcA==
In questo esempio autorizziamo l’apertura temporanea della porta SSH.
Dopo aver salvato la configurazione:
sudo systemctl enable fwknop-server
sudo systemctl restart fwknop-server
Verificare il firewall
Prima di utilizzare SPA la porta SSH dovrebbe risultare filtrata.
Da una macchina esterna:
nmap -p22 server.example.com
Output atteso:
22/tcp filtered ssh
Questo è il comportamento desiderato.
SSH esiste, ma non è raggiungibile.
Configurazione del client
Sul client possiamo utilizzare direttamente la riga di comando:
fwknop -A tcp/22 -D server.example.com
oppure configurare un profilo all’interno del file:
~/.fwknoprc
Esempio:
[myserver]
ALLOW_IP resolve
ACCESS tcp/22
KEY_BASE64 YWJjZGVmZ2hpamtsbW5vcA==
SPA_SERVER server.example.com
A questo punto sarà sufficiente eseguire:
fwknop -n myserver
Test della connessione
Inviamo il pacchetto SPA:
fwknop -n myserver
Subito dopo:
La connessione verrà autorizzata per il tempo configurato sul server.
Terminata la finestra temporale, la porta tornerà automaticamente nascosta.
Quanto tempo rimane aperta la porta?
Una delle domande che sorgono spontanee quando si parla di Single Packet Authorization è: per quanto tempo rimane aperta la porta dopo l’autorizzazione?
La risposta è semplice: dipende dalla configurazione.
Quando fwknopd riceve un pacchetto SPA valido, crea dinamicamente una regola nel firewall che consente all’indirizzo IP del client di raggiungere il servizio richiesto. Questa autorizzazione non è permanente ma ha una durata limitata, definita dal parametro FW_ACCESS_TIMEOUT.
Ad esempio:
SOURCE ANY
OPEN_PORTS tcp/22
KEY_BASE64 YWJjZGVmZ2hpamtsbW5vcA==
FW_ACCESS_TIMEOUT 30
In questo caso il client autorizzato avrà 30 secondi di tempo per stabilire la connessione SSH.
Trascorso il timeout, fwknop rimuoverà automaticamente la regola dal firewall riportando il sistema allo stato iniziale.
Per la maggior parte degli scenari SSH, un valore compreso tra 30 e 60 secondi è più che sufficiente:
FW_ACCESS_TIMEOUT 60
Un aspetto interessante è che il timeout riguarda esclusivamente l’apertura della porta e non la durata della sessione. Una volta stabilita la connessione SSH, questa continuerà a funzionare normalmente anche dopo la rimozione della regola temporanea dal firewall.
In altre parole, il firewall concede una breve finestra temporale per l’avvio della connessione e successivamente torna immediatamente a nascondere il servizio.
È proprio questo uno dei vantaggi più interessanti rispetto alle configurazioni tradizionali: la porta SSH non rimane esposta inutilmente e la superficie di attacco viene ridotta al minimo indispensabile.
E nftables?
Molti esempi presenti online fanno ancora riferimento a iptables.
Fortunatamente le versioni moderne di fwknop supportano anche ambienti basati su nftables, ormai standard nelle distribuzioni Linux più recenti.
Se utilizzate Debian 12 o distribuzioni equivalenti vale la pena verificare la documentazione ufficiale del progetto e testare attentamente le regole generate nel vostro ambiente.
Negli ultimi anni il passaggio da iptables a nftables ha semplificato notevolmente la gestione dei firewall e rende fwknop ancora più interessante in contesti moderni.
Considerazioni finali
Il Port Knocking rimane una tecnica estremamente interessante dal punto di vista didattico.
Aiuta a comprendere come sia possibile ridurre la superficie di attacco senza intervenire direttamente sul servizio esposto e continua ad essere una soluzione valida in molti contesti domestici o di laboratorio.
Tuttavia, quando si parla di ambienti reali, Single Packet Authorization rappresenta un’evoluzione naturale del concetto. fwknop offre una soluzione più elegante, più sicura e più semplice da utilizzare una volta configurata correttamente.
In fondo l’idea non cambia: mantenere SSH invisibile fino a quando non serve davvero.
La differenza è che oggi non dobbiamo più bussare tre volte.
Basta presentare il lasciapassare giusto.
Le opinioni in quanto tali sono opinabili e nulla ti vieta di approfondire l’argomento.
Risorse: