Menu Chiudi

Implementare Port Knocking in un server Linux

Implementare Port Knocking

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.

Port knocking modello
Ambiente di test per dimostrate Port Knocking

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.

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.

Leggi anche:   Setup di un semplice DNS locale con dnsmasq

Preparazione

Per la preparazione dell’ambiente avremo bisogno di:

  1. Un server GNU Linux già installato e funzionante, che sia basato su Debian oppure su RHEL;
  2. Il server dovrà essere equipaggiato con un firewall di sistema, possibilmente basato su iptables (ufw o firewalld);
  3. 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.

Leggi anche:   Come creare un alias per l'interfaccia ethernet di Linux

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 demone knockd 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.

Leggi anche:   Creare una chiavetta USB avviabile con Linux

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.

Condividi

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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Moderazione dei commenti attiva. Il tuo commento non apparirà immediatamente.