Il port knocking è un metodo per aprire dinamicamente le porte di rete "bussando" (cioè connettendo) su una sequenza predefinita di porte. Ciò è particolarmente utile per oscurare una porta di rete aperta dalla scansione delle porte poiché la porta in questione verrà chiusa a meno che non venga eseguita la sequenza di bussare alla porta. Una sequenza di port knocking sufficientemente lunga è praticamente impossibile per la forza bruta:ad esempio, per indovinare con successo (con la forza bruta) una combinazione di 3 porte TCP, un utente malintenzionato dovrebbe provare a bussare a ciascuna delle 281 trilioni di combinazioni possibili e cercare aprire le porte dopo ogni sequenza di battito delle porte. Come probabilmente puoi immaginare, ci vorrebbe molto, molto tempo.
Questa guida ti aiuterà nell'installazione di knockd, un demone flessibile per il port knocking, su Debian 10. A scopo dimostrativo, lo configureremo per oscurare la porta SSH, sebbene qualsiasi altra porta/servizio possa essere protetto con questo approccio.
Requisiti
- Un server che esegue Debian 10.
- Accesso root al tuo server.
- La variabile d'ambiente $EDITOR dovrebbe essere impostata.
- Un secondo sistema di test.
NOTA:se intendi utilizzare il port knocking per oscurare la porta SSH, assicurati di disporre di un metodo di accesso alternativo (ad esempio tramite console), che sarà utile se ti blocchi accidentalmente.
Prima di installare knockd, controlla il nome dell'interfaccia di rete pubblica del tuo sistema con il seguente comando:
ip link show | grep -v lo
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
Prendere nota del nome dell'interfaccia (ens18 in questo caso). Sarà necessario in seguito.
Passaggio 1:installazione di Knockd
knockd è un demone che blocca le porte che ascolta le connessioni e apre le porte di conseguenza. Useremo le regole knockd con iptables per implementare il port knocking. Installa i pacchetti richiesti come segue:
apt update apt install knockd iptables-persistent
Fase 2:configurazione di Knockd
Knockd utilizza un unico file di configurazione, /etc/knockd.conf, per definire sequenze di colpi e altri parametri. Sono disponibili due pratiche modalità di funzionamento. Il primo richiede un'unica sequenza di colpi per aprire e chiudere la porta predefinita, mentre l'altro utilizza sequenze di apertura e chiusura separate. Utilizzeremo il primo in quanto richiede una minore interazione da parte dell'utente.
Innanzitutto, esegui il backup del file di configurazione esistente:
mv /etc/knockd.conf /etc/knockd.conf.bak
In secondo luogo, apri il file di configurazione nel tuo editor di testo:
$EDITOR /etc/knockd.conf
E inserisci la configurazione mostrata di seguito:
(sostituisci ens18 con il nome della tua interfaccia di rete.)
[options] UseSyslog Interface = ens18 [SSH] sequence = 1000,2000,3000 seq_timeout = 15 tcpflags = syn start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT cmd_timeout = 20
Questo indicherà a knockd di abilitare il traffico verso la porta 22 dopo aver ricevuto la sequenza di bussare corretta (1000.2000.3000 in questo caso), quindi di riattivare il traffico dopo un ritardo di 20 secondi. Le connessioni SSH saranno quindi accettate solo durante questa finestra di 20 secondi.
Quindi, abilita knockd modificando il file /etc/default/knockd:
$EDITOR /etc/default/knockd
E imposta START_KNOCKD su 1:
START_KNOCKD=1
Salva il file ed esci. Modificheremo anche l'unità systemd per knockd. Per fare ciò, crea un nuovo file di unità per sovrascrivere l'impostazione predefinita:
$EDITOR /etc/systemd/system/knockd.service
E incolla quanto segue:
[Unit] Description=Port-Knock Daemon After=network.target Requires=network.target Documentation=man:knockd(1) [Service] EnvironmentFile=-/etc/default/knockd ExecStartPre=/usr/bin/sleep 1 ExecStart=/usr/sbin/knockd $KNOCKD_OPTS ExecReload=/bin/kill -HUP $MAINPID KillMode=mixed Restart=always SuccessExitStatus=0 2 15 ProtectSystem=full CapabilityBoundingSet=CAP_NET_RAW CAP_NET_ADMIN [Install] WantedBy=multi-user.target
Quindi utilizzare il seguente comando per caricare e abilitare la nuova unità:
systemctl daemon-reload systemctl enable --now knockd.service
Fase 3:regole del firewall
A questo punto Knockd è pronto, ma tutto il traffico è abilitato per impostazione predefinita attraverso il firewall. Creeremo regole firewall per negare l'accesso alla porta 22/tcp.
I seguenti comandi assicurano che le connessioni esistenti non vengano interrotte.
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Di seguito sono riportate le regole per eliminare le connessioni alla porta 22/tcp:
iptables -A INPUT -p tcp --destination-port 22 -j DROP ip6tables -A INPUT -p tcp --destination-port 22 -j DROP
Quindi, salva le catene di regole correnti per la persistenza tra i riavvii:
iptables-save > /etc/iptables/rules.v4 ip6tables-save > /etc/iptables/rules.v6
Fase 4:test
Da un sistema diverso, prova ad avviare una nuova sessione SSH sul tuo server. Non dovresti essere in grado di connetterti. Per eseguire la sequenza di colpi, possono essere utilizzati diversi strumenti, anche se dimostreremo con knock, il client di bussare incluso in Knockd. Installa il pacchetto knockd come mostrato nel passaggio 1 su un sistema diverso, quindi esegui i comandi:
knock server_ip_address 1000 2000 3000 ssh [email protected]_ip_address
La connessione SSH ora dovrebbe riuscire.
Configurazione alternativa
Knockd può in alternativa essere configurato per richiedere due sequenze distinte per l'apertura e la chiusura delle porte di rete. Ciò è utile se si desidera mantenere le porte aperte per lunghi periodi di tempo. Per configurare Knockd in questo modo, apri il suo file di configurazione:
$EDITOR /etc/knockd.conf
E sostituisci la configurazione esistente con la seguente:
[options] UseSyslog Interface = your_interface [openSSH] sequence = 1000,2000,3000 seq_timeout = 15 tcpflags = syn start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT [closeSSH] sequence = 3000,2000,1000 seq_timeout = 15 tcpflags = syn start_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
Quindi riavvia il servizio per caricare la nuova configurazione:
systemctl restart knockd.service
Conclusione
Knockd può essere una soluzione efficace agli attacchi di forza bruta, che sono molto comuni su SSH e altri servizi. Anche se systemd riavvierà Knockd se fallisce, dovresti sempre avere un metodo di backup per accedere al tuo server se usi il port knocking per nascondere la porta SSH.