knockd, Port knocking su Linux
Port knocking è un software utilizzato per accedere in modo sicuro ad un server chiudendo le porte (anche quelle che occorrono) con il firewall. Queste porte vengono successivamente aperte su richiesta se la connessione richiedente fornisce una “Bussata Segreta” (Secret Knock).
Port Knocking e la “Secret Knock”
Durante il Proibizionismo, se volevi accedere in uno speakeasy dovevi conoscere una sequenza di bussate specifica e segreta per poter entrare dentro.
Questo servizio è l’equivalente in chiave informatica. Se vuoi far accedere persone o comunicazioni a dei servizi sul tuo server ma non vuoi aprire le porte del firewall a tutto l’internet puoi utilizzare port knocking. Ti Permette di chiudere le porte sul tuo firewall e aprirle quando una sequenza definita di connessioni viene eseguita, la sequenza di questa connessione aggisce come una bussata segreta, un ulteriore bussata può far richiudere le porte.
Sicuramente può sembrare una novità, ma è importante tenere a mente che è un perfetto esempio di sicurezza tramite segretezza e questo concetto è fondamentalmente difettoso. Tra i modelli cardini della cybersecurity vi è quello della Zero-Trust
(“Non fidarti di nessuno, verifica tutto”)
Il segreto quindi di come si accede al sistema è sicuro soltanto perchè conosciuto da uno specifico gruppo o pochi “prescelti”. Ma se questo segreto esce fuori perchè magari rilevato, osservato, indovinato o elaborato in qualche modo, la sicurezza viene meno. Ci sono diversi modi per rendere sicuro l’accesso, in precedenza avevo scritto qualcosa
L’approccio migliore e concettualmente più diffuso della cybersecurity è la stratificazione delle difese, quindi port knocking può diventare uno di questi strati. Comunque non aggiunge neanche nulla di migliore rispetto a ben altri step di hardening di un ambiente. La Cybersecurity è un mondo vasto e complicato, NON considerare port knocking come unica fonte di difesa in un ambiente/server.
Come funziona?
- Il demone Knockd è installato e running sul server.
- Configuriamo delle sequenze di porte (protocolli tcp, udp, o entrambi) e per ogni sequenza definiamo delle azioni.
- Quando knockd vede una di queste sequenze di porte definite, eseguirà l’azione definita per quella sequenza
Prendete in considerazione di avere iptables
come firewall installato sul sistema, necessitiamo anche ulteriormente del pacchetto iptables-persistent
, seguirà in automatico il caricamentro delle regole iptable salvate, in modo tale che le regole impostate rimangano tali anche dopo un eventuale riavvio della macchina.
1
sudo apt-get install iptables-persistent -y
e avviare il servizio
1
sudo service iptables-persistent start
Configurazione Firewall
Iniziamo creando delle regole necessarie a configurare il firewall. configuriamo il traffico che rimane confinato all’interno del sistema, il loopback:
1
sudo iptables -A INPUT -i lo -j ACCEPT
abilitiamo poi il traffico per le connessioni già stabilite, ad esempio è possibile che vi siate collegati via SSH alla vostra macchina remota per non venire chiusi fuori:
1
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
ora quali porte aprire al pubblico, aprite se state esponete un webserver
o qualche porta usata da un servizio che volete far raggiungere, ad esempio le seguenti porte HTTP/HTTPS:
1
2
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
una volta definite le vostre porte aperte necessarie, blocchiamo tutto il traffico non esplicitato:
1
sudo iptables -A INPUT -j DROP
ora possiamo chiudere la nostra porta SSH:
1
sudo iptables -A INPUT -p tcp --dport 22 -j REJECT
facciamo partire il demone netfilter-persistent
1
sudo systemctl start netfilter-persistent
tramite il netfilter-persistent
salva e ricarica tramite un ciclo di salvataggio e ricarica in modo di controllare e caricare le regole iptable
1
sudo netfilter-persistent save
1
sudo netfilter-persistent reload
ora che le nostre utility e la porta SSH è chiusa, configuriamo la nostra bussata segreta.
Configurare knockd
installiamo knockd, con il comando:
1
sudo apt-get install knockd -y
e modifichiamo il file di configurazione /etc/knockd.conf
.
Il file di configurazione predefinito ha il seguente contenuto:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[options]
UseSyslog
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 5
command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
la sequenza delle porte si imposta nella voce sequence
, il tempo limite durante il quale eseguire la connessione verso le porte è il parametro seq_timeout
(portatelo ad un massimo di 15 secondi) il comando che ne scaturisce si trova invece in command
, lasciate tranquillamente quello che c’è già, poiché sblocca la porta 22 solo per il vostro IP (%IP%
è una variabile), nel nostro caso specifico di questa guida è bene utilizzare il comando /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
piuttosto che quello dichiarato come default. Il campo tcpflags
serve invece per impostare i flags TCP da tenere in considerazione durante la vostra connessione sulle porte indicate nella sequenza.
Da notare che il file di log di knockd, così come specificato, è quello di sistema /var/log/messages
.
Per cambiarlo bisogna valorizzare il parametro:
1
LogFile = /percorso/file.log
nel caso in cui desideriate impostare la chiusura automatica della porta, è necessario aggiungere i seguenti parametri:
1
2
cmd_timeout = 60
stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
ci garantisce, così configurato, di chiudere la porta automaticamente allo scadere del 60° secondo dal momento dell’apertura (esegue il comando specificato in stop_command
dopo i secondi definiti nel parametro cmd_timeout
).
ora verifichiamo il seguente file /etc/default/knockd
assicuriamoci di impostarlo come segue:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
################################################
#
# knockd's default file, for generic sys config
#
################################################
# 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 venet0:0"
l’opzione impostata così "-i venet0:0"
ci assicura nel caso utilizzassimo un VPS, knockd analizzi i logs della scheda di rete giusta (che solitamente è quella impostata sopra). Dovrebbe bastare eth0/eth1 o wlan0/wlan1, tuttavia dovrebbero essere rilevate automaticamente nel caso di una macchina reale e non virtualizzata, con ifconfig
potete subito verificare il nome della scheda
configurato eseguiamo il restart del demone
1
sudo service knockd restart
Se state usando un pc con Linux come OS, potete utilizzare un apposito pacchetto knock
.
Bussiamo
1
sudo apt-get install knock
1
knock -v [ip-della-macchina-da-raggiungere] 7000 8000 9000 ;ssh [ip-della-macchina-da-raggiungere]
stiamo bussando alla sequenza di porta scelta e configurata presente nel file /etc/knockd.conf
. Cambiatela ovvimanete con una a vostra scelta ricordatevi di dichiarlarla nel file.