Il port knocking è un modo per proteggere un server chiudendo le porte del firewall, anche quelle che sai verranno utilizzate. Queste porte vengono aperte su richiesta se, e solo se, la richiesta di connessione fornisce il knock segreto.
Sommario:
Port Knocking è un “colpo segreto”
Negli anni ’20, quando divieto era in pieno svolgimento, se volevi entrare in un file speakeasy, dovevi conoscere il bussare segreto e batterlo correttamente per entrare.
Il port knocking è un equivalente moderno. Se vuoi che le persone abbiano accesso ai servizi sul tuo computer ma non vuoi aprire il tuo firewall a Internet, puoi usare il port knocking. Consente di chiudere le porte del firewall che consentono le connessioni in entrata e di aprirle automaticamente quando viene effettuato uno schema prestabilito di tentativi di connessione. La sequenza dei tentativi di connessione funge da bussare segreto. Un altro colpo segreto chiude il porto.
Il port knocking è una novità, ma è importante sapere che è un esempio sicurezza attraverso l’oscurità, e quel concetto è fondamentalmente difettoso. Il segreto di come accedere a un sistema è sicuro perché solo chi fa parte di un gruppo specifico lo sa. Ma una volta che quel segreto è svelato, o perché è stato rivelato, osservato, indovinato o elaborato, la tua sicurezza è nulla. È meglio proteggere il tuo server in altri modi più forti, come la richiesta di accessi basati su chiave per un server SSH.
Gli approcci più robusti alla sicurezza informatica sono a più livelli, quindi forse il port knocking dovrebbe essere uno di questi livelli. Più strati, meglio è, giusto? Tuttavia, si potrebbe sostenere che il port knocking non aggiunge molto (se non altro) a un sistema protetto adeguatamente.
La sicurezza informatica è un argomento vasto e complicato, ma non dovresti usare il port knocking come unica forma di difesa.
Installazione di knockd
Per dimostrare il port knocking, lo useremo per controllare la porta 22, che è la porta SSH. Useremo uno strumento chiamato knockd. Usa apt-get per installare questo pacchetto sul tuo sistema se usi Ubuntu o un’altra distribuzione basata su Debian. Su altre distribuzioni Linux, utilizza invece lo strumento di gestione dei pacchetti della tua distribuzione Linux.
Digita quanto segue:
sudo apt-get install knockd
Probabilmente hai già il file firewall iptables installato sul sistema, ma potrebbe essere necessario installare il pacchetto iptables-persistent. Gestisce il caricamento automatico delle regole iptable salvate.
Digita quanto segue per installarlo:
sudo apt-get install iptables-persistent
Quando viene visualizzata la schermata di configurazione IPV4, premere la barra spaziatrice per accettare l’opzione “Sì”.
Premere nuovamente la barra spaziatrice nella schermata di configurazione IPv6 per accettare l’opzione “Sì” e andare avanti.
Il comando seguente indica a iptables di consentire la continuazione delle connessioni stabilite e in corso. Ora emetteremo un altro comando per chiudere la porta SSH.
Se qualcuno è connesso tramite SSH quando emettiamo questo comando, non vogliamo che venga interrotto:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Questo comando aggiunge una regola al firewall, che dice:
-A: Aggiunge la regola alla tabella delle regole del firewall. Cioè, aggiungilo in fondo.
INPUT: questa è una regola sulle connessioni in entrata.
-m conntrack: le regole del firewall agiscono sul traffico di rete (pacchetti) che corrispondono ai criteri della regola. Il parametro -m fa in modo che iptables utilizzi moduli aggiuntivi per la corrispondenza dei pacchetti: in questo caso, quello chiamato conntrack funziona con le capacità di tracciamento della connessione di rete del kernel.
–Cstate ESTABLISHED, RELATED: Specifica il tipo di connessione a cui si applicherà la regola, ovvero le connessioni ESTABLISHED e RELATED. Una connessione stabilita è già in corso. Una connessione correlata è quella che viene effettuata a causa di un’azione da una connessione stabilita. Forse qualcuno che è connesso vuole scaricare un file; ciò potrebbe accadere su una nuova connessione avviata dall’host.
-j ACCEPT: se il traffico corrisponde alla regola, salta alla destinazione ACCEPT nel firewall. In altre parole, il traffico viene accettato e autorizzato a passare attraverso il firewall.
Ora possiamo emettere il comando per chiudere la porta:
sudo iptables -A INPUT -p tcp --dport 22 -j REJECT
Questo comando aggiunge una regola al firewall, che dice:
-A: Aggiungi la regola alla tabella delle regole del firewall, cioè aggiungila in fondo.
INPUT: questa regola riguarda le connessioni in entrata.
-p tcp: questa regola si applica al traffico che utilizza il protocollo di controllo della trasmissione.
–Dport 22: questa regola si applica specificamente al traffico TCP che ha come destinazione la porta 22 (la porta SSH).
-j REJECT: se il traffico corrisponde alla regola, salta alla destinazione REJECT nel firewall. Quindi, se il traffico viene rifiutato, non è consentito attraverso il firewall.
Dobbiamo avviare il demone netfilter-persistent. Possiamo farlo con questo comando:
sudo systemctl start netfilter-persistent
Vogliamo che netfilter-persistent vada avanti un ciclo di salvataggio e ricarica, quindi carica e controlla le regole di iptable.
Digita i seguenti comandi:
sudo netfilter-persistent save
sudo netfilter-persistent reload
Ora hai installato le utilità e la porta SSH è chiusa (si spera, senza interrompere la connessione di nessuno). Ora è il momento di configurare il colpo segreto.
Configurazione di knockd
Ci sono due file che modifichi per configurare knockd. Il primo è il seguente file di configurazione knockd:
sudo gedit /etc/knockd.conf
L’editor di gedit si apre con il file di configurazione knockd caricato.
Modificheremo questo file in base alle nostre esigenze. Le sezioni che ci interessano sono “openSSH” e “closeSSH”. Le seguenti quattro voci sono in ciascuna sezione:
sequenza: la sequenza delle porte a cui qualcuno deve accedere per aprire o chiudere la porta 22. Le porte predefinite sono 7000, 8000 e 9000 per aprirla e 9000, 8000 e 7000 per chiuderla. Puoi modificarli o aggiungere più porte all’elenco. Per i nostri scopi, manterremo le impostazioni predefinite.
seq_timeout: il periodo di tempo entro il quale qualcuno deve accedere alle porte per attivarne l’apertura o la chiusura.
comando: il comando inviato al firewall iptables quando viene attivata l’azione di apertura o chiusura. Questi comandi aggiungono una regola al firewall (per aprire la porta) o la rimuovono (per chiudere la porta).
tcpflags: il tipo di pacchetto che ciascuna porta deve ricevere nella sequenza segreta. Un pacchetto SYN (sincronizzazione) è il primo di un file TCP richiesta di connessione, chiamata a stretta di mano a tre vie.
La sezione “openSSH” può essere letta come “una richiesta di connessione TCP deve essere effettuata alle porte 7000, 8000 e 9000, in quest’ordine ed entro 5 secondi, affinché il comando di apertura della porta 22 venga inviato al firewall”.
La sezione “closeSSH” può essere letta come “una richiesta di connessione TCP deve essere effettuata alle porte 9000, 8000 e 7000, in quest’ordine ed entro 5 secondi, affinché il comando di chiusura della porta 22 venga inviato al firewall”.
Le regole del firewall
Le voci “comando” nelle sezioni openSSH e closeSSH rimangono le stesse, ad eccezione di un parametro. Ecco come sono composti:
-A: Aggiungi la regola in fondo all’elenco delle regole del firewall (per il comando openSSH).
-D: Elimina il comando dall’elenco delle regole del firewall (per il comando closeSSH).
INPUT: questa regola riguarda il traffico di rete in entrata.
-s% IP%: l’indirizzo IP del dispositivo che richiede una connessione.
-p: protocollo di rete; in questo caso, è TCP.
–Dport: la porta di destinazione; nel nostro esempio, è la porta 22.
-j ACCEPT: salta alla destinazione di accettazione all’interno del firewall. In altre parole, lascia che il pacchetto passi attraverso il resto delle regole senza agire su di esso.
Le modifiche al file di configurazione knockd
Le modifiche che apporteremo al file sono evidenziate in rosso di seguito:
Estendiamo il “seq_timeout” a 15 secondi. Questo è generoso, ma se qualcuno spara manualmente in richieste di connessione, potrebbe aver bisogno di così tanto tempo.
Nella sezione “openSSH”, cambiamo l’opzione -A (append) nel comando in -I (inserisci). Questo comando inserisce una nuova regola del firewall all’inizio dell’elenco delle regole del firewall. Se lasci l’opzione -A, aggiunge l’elenco delle regole del firewall e lo mette in fondo.
Il traffico in entrata viene testato rispetto a ciascuna regola firewall nell’elenco dall’alto verso il basso. Abbiamo già una regola che chiude la porta 22. Quindi, se il traffico in entrata viene testato rispetto a quella regola prima che veda la regola che consente il traffico, la connessione viene rifiutata; se vede prima questa nuova regola, la connessione è consentita.
Il comando close rimuove la regola aggiunta da openSSH dalle regole del firewall. Il traffico SSH è ancora una volta gestito dalla regola preesistente “la porta 22 è chiusa”.
Dopo aver apportato queste modifiche, salva il file di configurazione.
Le modifiche al file di controllo knockd
Il file di controllo knockd è del tutto più semplice. Prima di immergerci e modificarlo, però, dobbiamo conoscere il nome interno della nostra connessione di rete; per trovarlo, digita questo comando:
ip addr
La connessione che questa macchina utilizza per ricercare questo articolo si chiama enp0s3. Prendi nota del nome della tua connessione.
Il seguente comando modifica il file di controllo knockd:
sudo gedit /etc/default/knockd
Ecco il file knockd in gedit.
Le poche modifiche che dobbiamo apportare sono evidenziate in rosso:
Abbiamo modificato la voce “START_KNOCKD =” da 0 a 1.
Abbiamo anche rimosso l’hash # dall’inizio della voce “KNOCKD_OPTS =” e sostituito “eth1” con il nome della nostra connessione di rete, enp0s3. Ovviamente, se la tua connessione di rete è eth1, non la cambierai.
La prova è nel budino
È ora di vedere se funziona. Inizieremo il demone knockd con questo comando:
sudo systemctrl start knockd
Ora salteremo su un’altra macchina e proveremo a connetterci. Abbiamo installato anche lo strumento knockd su quel computer, non perché vogliamo impostare il port knock, ma perché il pacchetto knockd fornisce un altro strumento chiamato knock. Useremo questa macchina per sparare nella nostra sequenza segreta e busseremo per noi.
Usa il seguente comando per inviare la tua sequenza segreta di richieste di connessione alle porte del computer host che colpisce la porta con l’indirizzo IP 192.168.4.24:
knock 192.168.4.24 7000 8000 9000 -d 500
Questo dice a knock di indirizzare il computer all’indirizzo IP 192.168.4.24 e lanciare una richiesta di connessione alle porte 7000, 8000 e 9000, a loro volta, con un -d (ritardo) di 500 millisecondi tra di loro.
Un utente chiamato “dave” effettua quindi una richiesta SSH a 192.168.4.24:
ssh dave@192.168.4.24
La sua connessione viene accettata, inserisce la password e inizia la sua sessione remota. Il suo prompt dei comandi cambia da dave @ nostromo a dave @ howtogeek. Per disconnettersi dal computer remoto, digita:
exit
Il suo prompt dei comandi ritorna al suo computer locale. Usa knock ancora una volta e questa volta prende di mira le porte in ordine inverso per chiudere la porta SSH sul computer remoto.
knock 192.168.4.24 9000 8000 7000 -d 500
Certo, questa non è stata una sessione remota particolarmente fruttuosa, ma dimostra l’apertura e la chiusura della porta tramite il battito della porta e si inserisce in un unico screenshot.
Allora, che aspetto aveva dall’altra parte? L’amministratore di sistema sull’host che effettua il port knocking utilizza il seguente comando per visualizzare le nuove voci che arrivano nel registro di sistema:
tail -f /var/log/syslog
Vengono visualizzate tre voci di openSSH. Questi vengono generati quando ogni porta viene presa di mira dall’utilità di knock remoto.
Quando tutte e tre le fasi della sequenza di attivazione sono soddisfatte, una voce che dice “APRITI SESAMO,“Viene registrato
Viene inviato il comando per inserire la regola nell’elenco delle regole di iptables. Consente l’accesso tramite SSH sulla porta 22 dall’indirizzo IP specifico del PC che ha dato il knock segreto corretto (192.168.4.23).
L’utente “dave” si connette solo per pochi secondi, quindi si disconnette.
Vengono visualizzate tre voci closeSSH. Questi vengono generati quando ciascuna porta viene presa di mira dall’utilità di knock remoto, che indica all’host che effettua il knocking della porta di chiudere la porta 22.
Dopo che tutte e tre le fasi sono state attivate, riceviamo di nuovo il messaggio “OPEN SESAME”. Il comando viene inviato al firewall per rimuovere la regola. (Perché non “CLOSE SESAME” quando chiude il porto? Chi lo sa?)
Ora l’unica regola nell’elenco delle regole di iptables riguardante la porta 22 è quella che abbiamo digitato all’inizio per chiudere quella porta. Quindi, la porta 22 è ora chiusa di nuovo.
Colpiscilo in testa
Questo è il trucco da salotto del port knocking. Trattalo come un diversivo e non farlo nel mondo reale. Oppure, se è necessario, non fare affidamento su di esso come unica forma di sicurezza.