Cum să utilizați Port Knocking pe Linux (și de ce nu ar trebui)

Protejarea serverului tău poate fi realizată prin diverse metode, una dintre ele fiind blocarea porturilor prin firewall. Chiar și cele pe care le crezi necesare pot fi ținute închise, deschizându-se doar atunci când o cerere de conectare include o secvență secretă, un fel de „cod de acces”.

„Ciocănirea secretă” prin port knocking

În perioada prohibiției, în anii ’20, pentru a intra într-un bar clandestin, era necesar să cunoști un anumit cod de bătaie în ușă. Acest cod, executat corect, îți permitea accesul. Port knocking funcționează pe același principiu, dar în lumea digitală. Dacă vrei ca anumite servicii de pe calculatorul tău să fie accesibile, dar nu vrei să deschizi permanent firewall-ul, poți folosi această metodă. Porturile sunt închise și se deschid automat în urma unei secvențe specifice de încercări de conectare. Această secvență este, practic, codul de bătaie la ușă. O altă secvență similară închide portul înapoi.

Deși este o idee interesantă, este crucial să înțelegem că port knocking reprezintă un exemplu de securitate prin obscuritate, un concept considerat fundamental defectuos. Siguranța unui sistem depinde de păstrarea secretului metodei de acces, dar odată ce acest secret este compromis, fie prin divulgare, observare sau ghicire, securitatea devine nulă. Este mai eficient să securizezi serverul prin metode mai robuste, cum ar fi autentificarea bazată pe chei pentru SSH.

O abordare solidă a securității cibernetice implică utilizarea mai multor straturi de protecție, iar port knocking poate fi unul dintre ele. Cu cât mai multe straturi, cu atât mai bine, nu-i așa? Totuși, mulți consideră că port knocking nu adaugă prea mult (sau chiar deloc) unui sistem deja securizat corespunzător.

Securitatea cibernetică este un domeniu amplu și complex. Port knocking nu ar trebui folosit ca unic mijloc de apărare.

Instalarea knockd

Pentru a demonstra cum funcționează port knocking, vom folosi un exemplu cu portul 22, cel utilizat de SSH. Vom utiliza instrumentul knockd. Pe Ubuntu sau alte distribuții bazate pe Debian, instalați-l folosind apt-get. Pe alte distribuții Linux, utilizați managerul de pachete specific.

Introduceți comanda:

sudo apt-get install knockd

Este foarte probabil să ai deja firewall-ul iptables instalat, dar ar putea fi necesar să adaugi pachetul iptables-persistent. Acesta salvează și reîncarcă automat regulile iptables.

Pentru instalare, introduceți:

sudo apt-get install iptables-persistent

Când apare fereastra de configurare IPV4, apasă bara de spațiu pentru a selecta „Da”.

Apasă din nou bara de spațiu în fereastra de configurare IPv6 pentru a selecta opțiunea „Da” și continuă.

Următoarea comandă instruiește iptables să permită conexiunile deja stabilite să continue. Acum vom bloca portul SSH.

Nu vrem să întrerupem conexiunile SSH deja active, așadar, introducem:

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Această comandă adaugă o regulă în firewall:

-A: Adaugă regula la sfârșitul listei de reguli.
INPUT: Este o regulă pentru conexiunile de intrare.
-m conntrack: iptables folosește module suplimentare pentru a identifica pachetele, în acest caz, modulul conntrack care monitorizează conexiunile.
–ctstate ESTABLISHED,RELATED: Regula se aplică conexiunilor deja stabilite și celor asociate. Conexiunile asociate sunt cele create de o conexiune existentă, de exemplu, descărcarea unui fișier printr-o conexiune SSH.
-j ACCEPT: Dacă traficul corespunde regulii, este acceptat de firewall.

Acum, putem închide portul SSH prin:

sudo iptables -A INPUT -p tcp --dport 22 -j REJECT

Această comandă adaugă o regulă la firewall, cu următoarele semnificații:

-A: Adaugă regula la sfârșitul listei.
INPUT: Regula se referă la conexiunile de intrare.
-p tcp: Se aplică traficului TCP.
–dport 22: Se aplică traficului TCP care țintește portul 22 (SSH).
-j REJECT: Dacă traficul corespunde regulii, este respins de firewall.

Acum pornim demonul netfilter-persistent:

sudo systemctl start netfilter-persistent

Netfilter-persistent salvează și reîncarcă automat regulile iptables.

Introdu comenzile următoare:

sudo netfilter-persistent save

sudo netfilter-persistent reload

Acum, utilitarele necesare sunt instalate, iar portul SSH este închis (fără a întrerupe conexiunile deja active). Urmează configurarea „codului secret”.

Configurarea knockd

Pentru a configura knockd, trebuie să modificăm două fișiere. Primul este fișierul de configurare:

sudo gedit /etc/knockd.conf

Editorul gedit se va deschide cu fișierul de configurare knockd.

Vom adapta acest fișier nevoilor noastre. Secțiunile relevante sunt „openSSH” și „closeSSH”. Fiecare secțiune conține următoarele patru elemente:

secvență: Secvența de porturi care trebuie accesate pentru a deschide sau închide portul 22. Implicit, acestea sunt 7000, 8000 și 9000 pentru a deschide și 9000, 8000 și 7000 pentru a închide. Poți modifica sau adăuga mai multe porturi. Pentru acest exemplu, vom folosi valorile implicite.
seq_timeout: Timpul limită în care porturile trebuie accesate pentru a declanșa acțiunea.
comandă: Comanda trimisă firewall-ului iptables la declanșarea acțiunii de deschidere sau închidere. Aceste comenzi fie adaugă o regulă (pentru a deschide portul), fie o elimină (pentru a închide).
tcpflags: Tipul de pachet pe care fiecare port trebuie să-l primească în secvență. Un pachet SYN (sincronizare) este primul dintr-o cerere de conectare TCP, parte a protocolului de strângere de mână în trei căi.

Secțiunea „openSSH” se interpretează astfel: „O cerere de conexiune TCP trebuie trimisă către porturile 7000, 8000 și 9000 – în această ordine și în 5 secunde – pentru ca firewall-ul să primească comanda de a deschide portul 22.”

Secțiunea „closeSSH” se interpretează astfel: „O cerere de conexiune TCP trebuie trimisă către porturile 9000, 8000 și 7000 – în această ordine și în 5 secunde – pentru ca firewall-ul să primească comanda de a închide portul 22.”

Regulile firewall-ului

Comenzile din secțiunile „openSSH” și „closeSSH” sunt similare, diferind doar prin anumiți parametri. Iată cum sunt compuse:

-A: Adaugă regula la sfârșitul listei (pentru comanda openSSH).
-D: Șterge regula din listă (pentru comanda closeSSH).
INPUT: Regula se referă la traficul de rețea de intrare.
-s %IP%: Adresa IP a dispozitivului care solicită conexiunea.
-p: Protocol de rețea; în acest caz, TCP.
–dport: Portul de destinație; în exemplul nostru, portul 22.
-j ACCEPT: Permite pachetului să treacă de restul regulilor fără a fi oprit.

Modificarea fișierului de configurare knockd

Modificările pe care le vom face fișierului sunt evidențiate cu roșu mai jos:

Am extins „seq_timeout” la 15 secunde. Este o valoare generoasă, dar utilă dacă cineva inițiază manual solicitările.

În secțiunea „openSSH”, am schimbat opțiunea -A (adaugă) cu -I (inserează) în comandă. Astfel, regula nouă va fi adăugată la începutul listei. Dacă am fi lăsat -A, regula s-ar fi adăugat la sfârșit.

Traficul este evaluat conform fiecărei reguli din firewall, de sus în jos. Avem deja o regulă care închide portul 22. Dacă traficul ar fi testat întâi împotriva acestei reguli, conexiunea ar fi respinsă. De aceea, trebuie să inserăm noua regulă la început, astfel încât conexiunea să fie permisă.

Comanda de închidere elimină regula adăugată de „openSSH”. Traficul SSH va fi din nou gestionat de regula „portul 22 este închis”.

După ce ai făcut aceste modificări, salvează fișierul de configurare.

Modificarea fișierului de control knockd

Fișierul de control knockd este mai simplu. Înainte de a-l modifica, trebuie să aflăm numele intern al conexiunii noastre de rețea. Folosește această comandă:

ip addr

În acest exemplu, conexiunea se numește enp0s3. Notează numele conexiunii tale.

Acum, modificăm fișierul de control knockd:

sudo gedit /etc/default/knockd

Acesta este fișierul knockd în gedit.

Modificările de efectuat sunt evidențiate cu roșu:

Am modificat „START_KNOCKD=” de la 0 la 1.

Am eliminat și caracterul # de la începutul liniei „KNOCKD_OPTS=” și am înlocuit „eth1” cu numele conexiunii de rețea, enp0s3. Dacă conexiunea ta se numește eth1, nu trebuie să faci modificări.

Testarea sistemului

Să vedem dacă funcționează. Pornim demonul knockd cu:

sudo systemctl start knockd

Acum, vom trece la alt computer și vom încerca să ne conectăm. Am instalat knockd și pe acel computer, nu pentru port knocking, ci pentru instrumentul „knock” pe care pachetul îl oferă. Acest instrument va trimite secvența secretă în locul nostru.

Pentru a trimite secvența de conexiuni către computerul cu IP-ul 192.168.4.24, folosim:

knock 192.168.4.24 7000 8000 9000 -d 500

Această comandă instruiește „knock” să vizeze IP-ul 192.168.4.24 și să trimită solicitări de conexiune către porturile 7000, 8000 și 9000, cu o întârziere de 500 de milisecunde între ele.

Un utilizator, numit „dave”, încearcă să se conecteze prin SSH la 192.168.4.24:

ssh [email protected]

Conexiunea este acceptată, introduce parola și începe sesiunea la distanță. Promptul se schimbă din [email protected] în [email protected] Pentru a se deconecta, scrie:

exit

Linia de comandă revine la computerul local. Folosește din nou „knock”, dar de această dată vizează porturile în ordine inversă pentru a închide portul SSH:

knock 192.168.4.24 9000 8000 7000 -d 500

Această sesiune nu a fost una productivă, dar a demonstrat deschiderea și închiderea portului prin port knocking și a încăput într-o singură captură de ecran.

Cum arată lucrurile din cealaltă parte? Administratorul sistemului de pe serverul cu port knocking folosește următoarea comandă pentru a vizualiza intrările noi în jurnalul sistemului:

tail -f /var/log/syslog

Observăm trei intrări „openSSH”. Acestea apar pe măsură ce fiecare port este accesat de utilitarul „knock” de la distanță.
După parcurgerea celor trei etape ale secvenței, apare mesajul „DESCHIDE-TE, SESAM.”
Comanda de inserare a regulii în lista iptables este trimisă. Acum este permis accesul prin SSH pe portul 22 de la adresa IP a computerului care a trimis „codul secret” corect (192.168.4.23).
Utilizatorul „dave” se conectează pentru câteva secunde și se deconectează.
Apar trei intrări „closeSSH”. Acestea corespund accesării porturilor de „knock” de la distanță, ceea ce instruiește serverul cu port knocking să închidă portul 22.
După parcurgerea celor trei etape, primim din nou mesajul „DESCHIDE-TE, SESAM”. Comanda este trimisă firewall-ului pentru a elimina regula. (De ce nu „ÎNCHIDE SESAM” când închide portul? Nu știm.)

Acum, singura regulă din lista iptables pentru portul 22 este cea pe care am introdus-o la început pentru a închide portul. Portul 22 este închis din nou.

Concluzie

Acesta este mecanismul din spatele port knocking. Îl poți trata ca pe o distracție, dar nu te baza pe el ca pe singura formă de securitate.