Implementare il Port Knocking in un server GNU Linux dovrebbe essere una pratica minima di sicurezza che ogni Amministratore di sistema dovrebbe mettere in campo per incrementare le difese contro attacchi cyber.
Abbiamo già visto che cos’è il Port Knocking in un precedente post sulla sicurezza dei server Linux, e quali possono essere vantaggi, svantaggi e criticità nell’utilizzo di questa tecnica.
Cercheremo qui di approfondire come implementare il Port Knocking in un server GNU Linux, sia che si tratti di un server RHEL (Red Hat Enterprise Linux) e sue derivate (CentOS, Fedora, Rocky Linux, ed altre), sia che si tratti di un server Debian e sue derivate (Ubuntu, Kali Linux, knoppix, ed altre).
Vedremo alcuni esempi di come implementare la tecnica del Port Knocking in un server Linux per evitare di esporre costantemente la porta 22/SSH
quando non necessario.
L’ambiente per implementare Port Knocking
Al fine di descrivere al meglio come implementare il Port Knocking, l’immagine qui sotto illustra il contesto generale utilizzato nel redigere questo articolo.
Nel contesto generale, illustrato qui sopra, abbiamo voluto simulare il caso reale in cui il Sysadmin utilizza la tecnica del Port Knocking per accedere ad un server remoto tramite ssh
.
Nota importante sul port knocking e sugli esempi
Vogliamo qui riportare alcune note preliminari importanti, relative al Port Knocking e più precisamente, agli esempi illustrati in questo articolo.
- Gli esempi riportati nel presente post sono puramente a scopo illustrativo e non dovrebbero essere utilizzati in un sistema in produzione!
- Prima di implementare il Port Knocking, il servizio
sshd
dovrebbe già avere una configurazione per la sicurezza opportunamente impostata e verificata. - Il server dovrebbe già essere messo in sicurezza nelle sue configurazioni di base essenziali.
Cosa Serve per implementare il Port Knocking
Considerando che questa guida è riferita alle due maggiori e più popolari classi di distribuzioni GNU Linux (RHEL e Debian), esistono alcuni minime differenze nei path dei quali dovremo tenere conto.
Preparazione
Per la preparazione dell’ambiente avremo bisogno di:
- Un server GNU Linux già installato e funzionante, che sia basato su Debian oppure su RHEL;
- Il server dovrà essere equipaggiato con un firewall di sistema, possibilmente basato su
iptables
(ufw o firewalld); - Un Client, preferibilmente Linux, per inviare la sequenza di Port Knocking ed accedere al server via
ssh
.
Implementare Port Knocking lato Server (Installazione)
Per l’installazione in RHEL e derivate (Es. Fedora, CentOS, ed altre), dovrai installare il pacchetto knock-server
come mostrato qui di seguito.
$ sudo dnf install knock-server
Per l’installazione in Debian e derivate (Es. Ubuntu, Kali, e altre), dovrai invece installare il pacchetto knockd
come mostrato qui di seguito.
$ sudo apt update $ sudo apt install knockd
Configurazione del demone per implementare il Port Knocking
La configurazione del demone del Port Knocking è molto semplice, anche se questa implica la verifica e l’editing di 2 file di configurazione:
- Il file delle opzioni (
options
) - Il file di configurazione del demone
Configurazione del file delle opzioni (Options)
Prima di ogni altra cosa è necessario verificare che il file delle opzioni sia correttamente impostato.
Il file delle opzioni generali del demone knockd
delle distribuzioni RHEL e derivate è:
/etc/sysconfig/knockd
Mentre quello relativo alle distribuzioni Debian e Derivate, è:
/etc/default/knockd
Editare il file con vi
o con nano
, verificando con attenzione che il contenuto corrisponda a quello mostrato qui di seguito:
$ sudo cat /etc/default/knockd # control if we start knockd at init or not # 1 = start # anything else = don't start # PLEASE EDIT /etc/knockd.conf BEFORE ENABLING START_KNOCKD=1 # command line options KNOCKD_OPTS="-i eth0"
Porre particolare attenzione al parametro KNOCKD_OPTS
, ossia all’interfaccia Ethernet sulla quale il demone knockd
deve essere in ascolto. Nell’esempio è stata impostata l’interfaccia Ethernet eth0
. Questo valore dovrà essere sostituito con il nome dell’effettiva interfaccia Ethernet presente nel tuo sistema.
L’altro parametro al quale bisogna porre attenzione è START_KNOCKD
il quale di default potrebbe essere impostato ad un valore diverso da 1
, il che impedirebbe l’effettivo avvio del demone, anche se avviato manualmente.
Configurazione del demone knockd
Per entrambe le classi di distribuzioni GNU Linux, il file di configurazione del servizio ha lo stesso nome e si trova nella medesima directory. Il file di configurazione è /etc/knockd.conf
.
Editare quindi il file /etc/knockd.conf
con vi
o nano
:
$ sudo nano /etc/knockd.conf
Quello riportato qui di seguito è un file di esempio al puro scopo di illustrare il funzionamento del demone knockd per aprire e chiudere la porta ssh
di un server.
$ cat /etc/knockd.conf [options] logfile = /var/log/knockd.log [openSSH] sequence = 10001,10002,10003 seq_timeout = 20 tcpflags = syn command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT [closeSSH] sequence = 10003,10002,10001 seq_timeout = 20 command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn
Il file di configurazione è suddiviso in diverse sezioni. Di queste sezioni options
è l’unica ad essere cablata esattamente con il nome letterale “options” e contiene Tag di configurazione globali del demone.
Il nome delle altre sezioni deve invece corrispondere esattamente al nome dell’evento così come nel file di log.
La sezione options
contiene il Tag logfile
il quale specifica che il demone knockd
utilizzerà il file specificato per scrivere le informazioni diagnostiche. Tipicamente, per convenzione, si tende ad utilizzare il file /var/log/knockd.log
.
La sezione openSSH
contiene i Tag utili a definire il comportamento del demone knockd
quando questo rivela la sequenza di Knocking; ossia, cosa fare quando rileva la sequenza specificata.
- Il Tag
sequence
, definisce la sequenza delle porte dove il demoneknockd
si deve attendere il Knocking (la bussata) da parte del Client. - Il Tag
seq_timeout
stabilisce che l’intera sequenza deve essere ricevuta entro il limite di tempo specificato (in secondi), per essere considerata valida. - Il Tag
tcpflags
indica quale flag TCP deve essere considerata per i pacchetti della sequenza di Knocking. - Il Tag
command
specifica il comando da eseguire nel caso che sia soddisfatta la sequenza di Knocking.
La sezione closeSSH
contiene gli stessi Tag con il medesimo significato. ovviamente relativo alla sequenza da adottare per richiudere la porta ssh nel firewall.
Lo stesso significato vale per la sezione closeSSH
; ovviamente relativo alla sequenza da adottare per richiudere
Il Client Knocker per implementare il Port Knocking
Il Client knocker
, si rivela uno strumento estremamente utile nel caso di sequenze di knocking complesse, ovvero laddove di intenda utilizzare porte UDP
e TCP
per la bussare alle porte del server. Tuttavia, nei casi più semplici la sequenza di knocking può essere sostituita da una sequenza di comandi telnet
da terminale, come nell’esempio qui sotto:
$ telnet my_host 10001 $ telnet my_host 10002 $ telnet my_host 10003
L’esempio dell’utilizzo dei comandi telnet soddisfa pienamente la sequenza del Port Knocking per un demone knockd
configurato come nell’esempio di file di configurazione illustrato più sopra.
Gli sviluppatori della utility Port Knocking hanno comunque pensato bene di fornire anche un Client apposito per semplificare le cose; per inviare cioè una sequenza di Knocking in un unico comando specificando tutte le opzioni disponibili, anche per sequenze più complesse.
Installazione del Client per il Port Knocking
Per l’installazione in RHEL e derivate (Es. Fedora, CentOS, ed altre)
$ sudo dnf install knock
Per l’installazione in Debian e derivate (Es. Ubuntu, Kali, ed altre)
$ sudo apt update $ sudo apt install knocker
Utilizzo del Client
Una volta installato, il client è già pronto per essere utilizzato. Con riferimento al demone di esempio di cui abbiamo discusso più sopra nel presente post, potremo utilizzare il demone come segue:
$ knock -v my_host 10001 10002 10003
Laddove invece il demone sia configurato per una sequenza complessa che include pacchetti sia TCP
che UDP
, di seguito riportiamo la sintassi da utilizzare.
$ knock -v my_host <port1>[:<tcp|udp>][,<port2>[:<tcp|udp>][,<port3>[:<tcp|udp>]
Il file di log del demone knockd
In caso di successo, questo è ciò che potrai vedere nel file di log del demone knockd
.:
[2021-08-11 21:44] 192.168.7.213: opencloseSSH: Stage 1 [2021-08-11 21:44] 192.168.7.213: opencloseSSH: Stage 2 [2021-08-11 21:44] 192.168.7.213: opencloseSSH: Stage 3 [2021-08-11 21:44] 192.168.7.213: opencloseSSH: OPEN SESAME [2021-08-11 21:44] opencloseSSH: running command: /usr/sbin/iptables -A INPUT -s 192.168.7.213 -p tcp --syn -j ACCEPT
Nel caso in cui invece la sequenza di Knocking sia errata, questo è ciò che potremo trovare nel file di log del demone knockd
.
[2021-08-11 21:45] 192.168.7.213: opencloseSSH: command timeout [2021-08-11 21:45] opencloseSSH: running command: /usr/sbin/iptables -D INPUT -s 192.168.7.213 -p tcp --syn -j ACCEPT
Conclusioni
Dopo aver visto cos’è il Port Knocking e perché questa tecnica può aumentare in parte la sicurezza dei server Linux, abbiamo voluto approfondire installazione e configurazione del software necessario.
Inoltre abbiamo anche pensato che fosse utile aggiungere alcune informazioni sul debug dei file di log per la verifica del corretto funzionamento ed diagnosi di eventuali problemi.
Per i sistemi esposti sulla rete, la sicurezza contro i cyber attacchi non è mai abbastanza. Seguendo i suggerimenti e gli esempi di questo articolo qualsiasi Amministratore di sistema può implementare Port Knocking senza troppe difficoltà ed in pochissimo tempo.
Disclaimer
Questa pagina potrebbe contenere link di affiliazione. Gli acquisti o gli ordini che effettuerai tramite tali link possono generare commissioni che ci aiutano a sostenere questo sito web.