
Il port knocking è un modo per proteggere un server chiudendo le porte del firewall, anche quelle che conosci verranno utilizzate. Tali porte vengono aperte su richiesta se — e solo se — la richiesta di connessione fornisce il bussare segreto.
Port Knocking è un “Knock segreto”
Negli anni '20, quando il divieto era in pieno svolgimento, se volevi entrare in un talkeasy, dovevi conoscere il colpo segreto e toccarlo correttamente per entrare.
Il bussare al porto è un equivalente moderno. Se desideri che le persone abbiano accesso ai servizi sul tuo computer ma non desideri aprire il firewall su Internet, puoi utilizzare il port knocking. Ti consente di chiudere le porte sul firewall che consentono le connessioni in entrata e di aprirle automaticamente quando viene effettuato un modello prestabilito di tentativi di connessione. La sequenza dei tentativi di connessione funge da bussata segreta. Un altro bussare segreto chiude il porto.
Il bussare ai porti è una novità, ma è importante sapere che è un esempio di sicurezza attraverso l'oscurità e che il concetto è fondamentalmente imperfetto. Il segreto su come accedere a un sistema è sicuro perché solo quelli di un gruppo specifico lo sanno. Ma una volta scoperto quel segreto, sia perché rivelato, osservato, indovinato o risolto, la tua sicurezza è nulla. È meglio proteggere il server in altri modi più efficaci, come richiedere accessi basati su chiavi per un server SSH.
Gli approcci più solidi alla sicurezza informatica sono a più livelli, quindi forse il port knocking dovrebbe essere uno di quei livelli. Più strati, meglio è, giusto? Tuttavia, si potrebbe sostenere che il knocking delle porte non aggiunge molto (se non altro) a un sistema sicuro e adeguatamente temprato.
La sicurezza informatica è un argomento vasto e complicato, ma non dovresti usare il port knock come unica forma di difesa.
RELAZIONATO: Come creare e installare le chiavi SSH dalla shell di Linux
Installazione knockd
Per dimostrare il port knocking, lo useremo per controllare la porta 22, che è la porta SSH. Useremo uno strumento chiamato knockd. Uso apt-get per installare questo pacchetto sul tuo sistema se usi Ubuntu o un'altra distribuzione basata su Debian. Su altre distribuzioni Linux, usa invece lo strumento di gestione dei pacchetti della tua distribuzione Linux.
Digita quanto segue:
sudo apt-get install knockd

Probabilmente hai già installato il firewall iptables sul tuo sistema, ma potresti aver bisogno di installare il iptables-persistent pacchetto. Gestisce il caricamento automatico dei salvati iptable regole.
Digitare 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 di nuovo la barra spaziatrice nella schermata di configurazione IPv6 per accettare l'opzione “Sì” e andare avanti.

Il seguente comando dice iptables per consentire le connessioni stabilite e in corso per continuare. Ora emettiamo un altro comando per chiudere la porta SSH.
Se qualcuno viene connesso tramite SSH quando emettiamo questo comando, non vogliamo che vengano tagliati:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Questo comando aggiunge una regola al firewall, che dice:
- -UN: Aggiunge la regola alla tabella delle regole del firewall. Cioè, aggiungilo in fondo.
- INGRESSO: Questa è una regola relativa alle connessioni in entrata.
-
-m conntrack: Le regole del firewall agiscono sul traffico di rete (pacchetti) che soddisfano i criteri della regola. Il
-mcause dei parametriiptablesper utilizzare moduli di corrispondenza dei pacchetti extra, in questo caso quello chiamatoconntrackfunziona con le funzionalità di tracciamento della connessione di rete del kernel. - –Stato STABILITO, CORRELATO: Specifica il tipo di connessione a cui verrà applicata la regola, vale a dire connessioni STABILITE e CORRELATE. Una connessione stabilita è già in corso. Una connessione correlata viene stabilita a seguito 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 ACCETTA: Se il traffico corrisponde alla regola, passa 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:
- -UN: Aggiungi la regola alla tabella delle regole del firewall, ovvero aggiungila in fondo.
- INGRESSO: 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 destinato alla porta 22 (porta SSH).
- -j RIFIUTA: Se il traffico corrisponde alla regola, passa al target REJECT nel firewall. Pertanto, se il traffico viene rifiutato, non è consentito tramite il firewall.
Dobbiamo iniziare il netfilter-persistent demone. Possiamo farlo con questo comando:
sudo systemctl start netfilter-persistent

Vogliamo netfilter-persistent per passare attraverso un ciclo di salvataggio e ricarica, quindi carica e controlla il iptable regole.
Digita i seguenti comandi:
sudo netfilter-persistent save

sudo netfilter-persistent reload

Ora hai installato i programmi di utilità e la porta SSH è chiusa (si spera, senza interrompere la connessione di nessuno). Ora è il momento di configurare il colpo segreto.
Configurazione knockd
Esistono due file che si modificano per configurare knockd. Il primo è il seguente knockd file di configurazione:
sudo gedit /etc/knockd.conf

Il gedit l'editor si apre con il knockd file di configurazione caricato.

Modificheremo questo file per soddisfare le nostre esigenze. Le sezioni a cui siamo interessati sono “openSSH” e “closeSSH”. Le seguenti quattro voci sono in ogni sezione:
- sequenza: Sequenza di 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, restiamo fedeli alle 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 a
iptablesfirewall quando viene attivata l'azione di apertura o chiusura. Questi comandi aggiungono una regola al firewall (per aprire la porta) o eliminarla (per chiudere la porta). - tcpflags: Il tipo di pacchetto che ciascuna porta deve ricevere nella sequenza segreta. Un pacchetto SYN (sincronizzazione) è il primo di una richiesta di connessione TCP, chiamato handshake a tre vie.
La sezione “openSSH” può essere letta come “una richiesta di connessione TCP deve essere fatta alle porte 7000, 8000 e 9000 — in questo ordine ed entro 5 secondi — affinché il comando di aprire la porta 22 sia inviato al firewall.”
La sezione “closeSSH” può essere letta come “una richiesta di connessione TCP deve essere fatta alle porte 9000, 8000 e 7000 — in questo ordine ed entro 5 secondi — affinché il comando chiuda la porta 22 da inviare al firewall.”
Le regole del firewall
Le voci “command” nelle sezioni openSSH e closeSSH rimangono invariate, ad eccezione di un parametro. Ecco come sono composti:
- -UN: 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).
- INGRESSO: 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 ACCETTA: Passa al target accetta 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. È generoso, ma se qualcuno attiva manualmente le richieste di connessione, potrebbe aver bisogno di molto tempo.
Nella sezione “openSSH”, cambiamo il -A (aggiungi) opzione nel comando a -I (inserire). Questo comando inserisce una nuova regola del firewall in superiore dell'elenco delle regole del firewall. Se lasci il file -A opzione, esso accodamento l'elenco delle regole del firewall e lo mette in parte inferiore.
Il traffico in entrata viene testato in base a ciascuna regola del 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 di vedere la regola che consente il traffico, la connessione viene rifiutata; se vede prima questa nuova regola, la connessione è consentita.
Il comando di chiusura rimuove la regola aggiunta da openSSH dalle regole del firewall. Il traffico SSH viene nuovamente gestito dalla regola preesistente “porta 22 chiusa”.
Dopo aver apportato queste modifiche, salvare il file di configurazione.
RELAZIONATO: Come modificare graficamente i file di testo su Linux con gedit
Le modifiche al file di controllo knockd
Il knockd il file di controllo è del tutto più semplice. Prima di immergerci e modificarlo, tuttavia, dobbiamo conoscere il nome interno per la nostra connessione di rete; per trovarlo, digitare questo comando:
ip addr

Viene chiamata la connessione utilizzata da questa macchina per ricercare questo articolo enp0s3. Prendi nota del nome della tua connessione.
Il seguente comando modifica il knockd file di controllo:
sudo gedit /etc/default/knockd

Ecco il knockd file 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. Naturalmente, se la tua connessione di rete è eth1, non lo cambierai.
La prova è nel budino
È tempo di vedere se funziona. Inizieremo il knockd demone con questo comando:
sudo systemctrl start knockd

Ora, salteremo su un altro computer e proveremo a connetterci. Abbiamo installato il knockd strumento anche su quel computer, non perché vogliamo impostare il port knocking, ma perché knockd pacchetto fornisce un altro strumento chiamato knock. Useremo questa macchina per sparare nella nostra sequenza segreta e bussare per noi.
Utilizzare il comando seguente per inviare la sequenza segreta di richieste di connessione alle porte sul computer host che bussa alla porta con l'indirizzo IP 192.168.4.24:
knock 192.168.4.24 7000 8000 9000 -d 500
Questo dice knock indirizzare il computer all'indirizzo IP 192.168.4.24 ed eseguire una richiesta di connessione alle porte 7000, 8000 e 9000, a sua volta, con un -d (ritardo) di 500 millisecondi tra di loro.
Un utente chiamato “dave” quindi effettua 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 sessione remota. Il suo prompt dei comandi cambia da dave@nostromo per dave@howtogeek. Per disconnettersi dal computer remoto, digita:
exit
Il suo prompt dei comandi ritorna sul suo computer locale. Lui usa knock ancora una volta, e questa volta, indirizza 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 bussare alla porta e si inserisce in un singolo screenshot.
Allora, che aspetto aveva dall'altra parte? L'amministratore di sistema sull'host che bussa alla porta utilizza il comando seguente per visualizzare le nuove voci che arrivano nel registro di sistema:
tail -f /var/log/syslog

- Vengono visualizzate tre voci openSSH. Questi vengono sollevati quando ciascuna porta è indirizzata dall'utilità di knock remoto.
- Quando vengono soddisfatte tutte e tre le fasi della sequenza di trigger, viene registrata una voce che dice “OPEN SESAME”
- Il comando per inserire la regola in
iptablesl'elenco delle regole viene inviato. Permette l'accesso tramite SSH sulla porta 22 dall'indirizzo IP specifico del PC che ha dato il corretto bussare segreto (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 scelta come destinazione dall'utilità di knock remoto: indica all'host che bussa alla porta di chiudere la porta 22.
- Dopo l'attivazione di tutte e tre le fasi, viene visualizzato nuovamente il messaggio “OPEN SESAME”. Il comando viene inviato al firewall per rimuovere la regola. (Perché non “CHIUDI SESAME” quando sta chiudendo la porta? Chi lo sa?)
Ora l'unica regola nel iptables l'elenco delle regole relativo alla porta 22 è quello che abbiamo digitato all'inizio per chiudere quella porta. Quindi, la porta 22 è ora chiusa di nuovo.
Bussalo alla testa
Questo è il trucco del 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.
