Cum să utilizați Port Knocking pe Linux (și de ce nu ar trebui)
Publicat: 2022-01-29Port knocking este o modalitate de a securiza un server prin închiderea porturilor firewall-chiar și cele despre care știți că vor fi folosite. Acele porturi sunt deschise la cerere dacă – și numai dacă – cererea de conectare oferă un cioc secret.
Ciocănirea în port este o „ciocănire secretă”
În anii 1920, când prohibiția era în plină desfășurare, dacă voiai să intri într-un speakeasy, trebuia să cunoști ciocănirea secretă și să o apeși corect pentru a intra înăuntru.
Locația în port este un echivalent modern. Dacă doriți ca oamenii să aibă acces la serviciile de pe computerul dvs., dar nu doriți să vă deschideți firewall-ul la internet, puteți utiliza port knocking. Vă permite să închideți porturile de pe firewall care permit conexiunile de intrare și să le deschideți automat atunci când se face un model prestabilit de încercări de conectare. Secvența încercărilor de conectare acționează ca ciocănirea secretă. Un alt ciocănit secret închide portul.
Locația în port este o noutate, dar este important să știm că este un exemplu de securitate prin obscuritate, iar acest concept este fundamental defectuos. Secretul modului de accesare a unui sistem este sigur, deoarece numai cei dintr-un anumit grup îl cunosc. Dar odată ce secretul a fost dezvăluit – fie pentru că a fost dezvăluit, observat, ghicit sau rezolvat – securitatea ta este nulă. Este mai bine să vă securizați serverul în alte moduri mai puternice, cum ar fi solicitarea autentificărilor bazate pe chei pentru un server SSH.
Cele mai robuste abordări ale securității cibernetice sunt multistratificate, așa că, probabil, baterea porturilor ar trebui să fie unul dintre aceste straturi. Cu cât mai multe straturi, cu atât mai bine, nu? Cu toate acestea, ați putea susține că lovirea portului nu adaugă prea mult (dacă ceva) unui sistem sigur, bine întărit.
Securitatea cibernetică este un subiect vast și complicat, dar nu ar trebui să utilizați baterea în port ca singura formă de apărare.
LEGATE: Cum se creează și se instalează chei SSH din Shell Linux
Instalarea knockd
Pentru a demonstra declanșarea portului, îl vom folosi pentru a controla portul 22, care este portul SSH. Vom folosi un instrument numit knockd. Utilizați apt-get
pentru a instala acest pachet pe sistemul dvs. dacă utilizați Ubuntu sau o altă distribuție bazată pe Debian. Pe alte distribuții Linux, utilizați instrumentul de gestionare a pachetelor din distribuția dvs. Linux.
Introduceți următoarele:
sudo apt-get install knockd
Probabil că aveți deja instalat firewall-ul iptables pe sistemul dvs., dar este posibil să aveți nevoie să instalați pachetul iptables-persistent
. Se ocupă de încărcarea automată a regulilor iptable
salvate.
Introduceți următoarele pentru a-l instala:
sudo apt-get install iptables-persistent
Când apare ecranul de configurare IPV4, apăsați bara de spațiu pentru a accepta opțiunea „Da”.
Apăsați din nou bara de spațiu în ecranul de configurare IPv6 pentru a accepta opțiunea „Da” și continuați.
Următoarea comandă îi spune iptables
să permită conexiunilor stabilite și în curs de desfășurare să continue. Acum vom lansa o altă comandă pentru a închide portul SSH.
Dacă cineva este conectat prin SSH când lansăm această comandă, nu vrem să fie tăiat:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Această comandă adaugă o regulă la firewall, care spune:
- -A : Adăugați regula la tabelul de reguli de firewall. Adică adăugați-l în partea de jos.
- INPUT : Aceasta este o regulă despre conexiunile de intrare.
- -m conntrack : Regulile firewall acționează asupra traficului de rețea (pachete) care corespund criteriilor din regulă. Parametrul
-m
face caiptables
să utilizeze module suplimentare de potrivire a pachetelor - în acest caz, cel numitconntrack
funcționează cu capabilitățile de urmărire a conexiunii de rețea ale nucleului. - –cstate ESTABLISHED,RELATED : Acesta specifică tipul de conexiune la care se va aplica regula, și anume conexiunile ESTABLISHED și RELATED. O conexiune stabilită este una care este deja în curs. O conexiune asociată este una care se realizează datorită unei acțiuni dintr-o conexiune stabilită. Poate că cineva care este conectat dorește să descarce un fișier; asta se poate întâmpla printr-o nouă conexiune inițiată de gazdă.
- -j ACCEPT : Dacă traficul se potrivește cu regula, săriți la ținta ACCEPT în firewall. Cu alte cuvinte, traficul este acceptat și permis să treacă prin firewall.
Acum putem lansa comanda pentru a închide portul:
sudo iptables -A INPUT -p tcp --dport 22 -j REJECT
Această comandă adaugă o regulă la firewall, care spune:
- -A : Adăugați regula la tabelul de reguli de firewall, adică adăugați-o în partea de jos.
- INTRARE : Această regulă se referă la conexiunile de intrare.
- -p tcp : Această regulă se aplică traficului care utilizează protocolul de control al transmisiei.
- –dport 22 : Această regulă se aplică în mod specific traficului TCP care vizează portul 22 (portul SSH).
- -j REJECT : Dacă traficul se potrivește cu regula, săriți la ținta REJECT din firewall. Deci, dacă traficul este respins, nu este permis prin firewall.
Trebuie să pornim demonul netfilter-persistent
. Putem face acest lucru cu această comandă:
sudo systemctl start netfilter-persistent
Dorim ca netfilter-persistent
să treacă printr-un ciclu de salvare și reîncărcare, astfel încât să încarce și să controleze regulile iptable
.
Tastați următoarele comenzi:
sudo netfilter-salvare persistentă
sudo netfilter-reîncărcare persistentă
Acum ați instalat utilitățile, iar portul SSH este închis (sperăm că, fără a întrerupe conexiunea nimănui). Acum, este timpul să configurați ciocănirea secretă.
Se configurează knockd
Există două fișiere pe care le editați pentru a configura knockd
. Primul este următorul fișier de configurare knockd
:
sudo gedit /etc/knockd.conf
Editorul gedit
se deschide cu fișierul de configurare knockd
încărcat.
Vom edita acest fișier pentru a se potrivi nevoilor noastre. Secțiunile care ne interesează sunt „openSSH” și „closeSSH”. Următoarele patru intrări sunt în fiecare secțiune:
- secvență : secvența de porturi pe care cineva trebuie să le acceseze pentru a deschide sau închide portul 22. Porturile implicite sunt 7000, 8000 și 9000 pentru a-l deschide și 9000, 8000 și 7000 pentru a-l închide. Puteți să le modificați sau să adăugați mai multe porturi la listă. În scopurile noastre, vom rămâne cu valorile implicite.
- seq_timeout : perioada de timp în care cineva trebuie să acceseze porturile pentru a declanșa deschiderea sau închiderea acestuia.
- comandă : Comanda trimisă la paravanul de protecție
iptables
când este declanșată acțiunea de deschidere sau închidere. Aceste comenzi fie adaugă o regulă la firewall (pentru a deschide portul), fie o scot (pentru a închide portul). - tcpflags : tipul de pachet pe care trebuie să îl primească fiecare port în secvența secretă. Un pachet SYN (sincronizare) este primul dintr-o cerere de conexiune TCP, numită strângere de mână în trei căi.
Secțiunea „openSSH” poate fi citită ca „o solicitare de conexiune TCP trebuie făcută către porturile 7000, 8000 și 9000 — în această ordine și în 5 secunde — pentru ca comanda de deschidere a portului 22 să fie trimisă către firewall”.
Secțiunea „closeSSH” poate fi citită ca „o solicitare de conexiune TCP trebuie făcută către porturile 9000, 8000 și 7000 — în această ordine și în decurs de 5 secunde — pentru ca comanda de închidere a portului 22 să fie trimisă către firewall”.
Regulile pentru firewall
Intrările „comandă” din secțiunile openSSH și closeSSH rămân aceleași, cu excepția unui parametru. Iată cum sunt compuse:
- -A : Adăugați regula în partea de jos a listei de reguli de firewall (pentru comanda openSSH).
- -D : Ștergeți comanda din lista de reguli de firewall (pentru comanda closeSSH).
- INTRARE : Această regulă se referă la traficul de rețea de intrare.
- -s %IP% : adresa IP a dispozitivului care solicită o conexiune.
- -p : Protocol de rețea; în acest caz, este TCP.
- –dport : portul de destinație; în exemplul nostru, este portul 22.
- -j ACCEPT : Salt la ținta acceptată din firewall. Cu alte cuvinte, lăsați pachetul să treacă prin restul regulilor fără a acționa în conformitate cu el.
Editările fișierului de configurare knockd
Modificările pe care le vom face fișierului sunt evidențiate cu roșu mai jos:
Extindem „seq_timeout” la 15 secunde. Acest lucru este generos, dar dacă cineva declanșează manual solicitările de conectare, ar putea avea nevoie de atât de mult timp.
În secțiunea „openSSH”, schimbăm opțiunea -A
(adăugați) din comandă în -I
(inserați). Această comandă inserează o nouă regulă de firewall în partea de sus a listei de reguli de firewall. Dacă părăsiți opțiunea -A
, aceasta adaugă lista de reguli de firewall și o pune în partea de jos .
Traficul de intrare este testat în funcție de fiecare regulă de firewall din listă, de sus în jos. Avem deja o regulă care închide portul 22. Deci, dacă traficul de intrare este testat împotriva acelei reguli înainte de a vedea regula care permite traficul, conexiunea este refuzată; dacă vede mai întâi această nouă regulă, conexiunea este permisă.
Comanda de închidere elimină regula adăugată de openSSH din regulile firewall. Traficul SSH este din nou gestionat de regula preexistentă „portul 22 este închis”.
După ce faceți aceste modificări, salvați fișierul de configurare.
LEGATE: Cum să editați fișierele text grafic pe Linux cu gedit
Editările fișierului de control knockd
Fișierul de control knockd
este cu totul mai simplu. Totuși, înainte de a ne arunca și edita asta, trebuie să cunoaștem numele intern al conexiunii noastre de rețea; pentru a-l găsi, tastați această comandă:
adresa ip
Conexiunea pe care o folosește această mașină pentru a cerceta acest articol se numește enp0s3
. Notați numele conexiunii dvs.
Următoarea comandă editează fișierul de control knockd
:
sudo gedit /etc/default/knockd
Iată fișierul knockd
în gedit
.
Câteva modificări pe care trebuie să le facem sunt evidențiate cu roșu:
Am schimbat intrarea „START_KNOCKD=" la 0 la 1.
De asemenea, am eliminat codul hash #
de la începutul intrării „KNOCKD_OPTS=" și am înlocuit „eth1” cu numele conexiunii noastre de rețea, enp0s3
. Desigur, dacă conexiunea dvs. la rețea este eth1
, nu o veți schimba.
Dovada este în budincă
Este timpul să vedem dacă funcționează. Vom porni demonul knockd
cu această comandă:
sudo systemctrl start knockd
Acum, vom sări pe o altă mașină și vom încerca să ne conectăm. Am instalat instrumentul knockd
și pe acel computer, nu pentru că dorim să setăm port knocking, ci pentru că pachetul knockd
oferă un alt instrument numit knock
. Vom folosi această mașină pentru a trage în secvența noastră secretă și a bate pentru noi.
Utilizați următoarea comandă pentru a trimite secvența secretă de solicitări de conexiune către porturile de pe computerul gazdă care lovește porturile cu adresa IP 192.168.4.24:
bate 192.168.4.24 7000 8000 9000 -d 500
Aceasta îi spune lui knock
să vizeze computerul la adresa IP 192.168.4.24 și să lanseze o solicitare de conexiune la porturile 7000, 8000 și 9000, la rândul lor, cu un -d
(întârziere) de 500 de milisecunde între ele.
Un utilizator numit „dave” face apoi o solicitare SSH la 192.168.4.24:
ssh [email protected]
Conexiunea lui este acceptată, își introduce parola și începe sesiunea la distanță. Linia lui de comandă se schimbă de la dave@nostromo
la dave@howtogeek
. Pentru a se deconecta de la computerul de la distanță, el tastează:
Ieșire
Linia de comandă revine la computerul local. Folosește încă o dată knock
ul și de data aceasta țintește porturile în ordine inversă pentru a închide portul SSH de pe computerul de la distanță.
bate 192.168.4.24 9000 8000 7000 -d 500
Desigur, aceasta nu a fost o sesiune la distanță deosebit de fructuoasă, dar demonstrează deschiderea și închiderea portului prin lovirea portului și se potrivește într-o singură captură de ecran.
Deci, cum arăta asta din cealaltă parte? Administratorul de sistem de pe gazda de batere a portului folosește următoarea comandă pentru a vedea noile intrări care ajung în jurnalul de sistem:
coada -f /var/log/syslog
- Vedeți trei intrări openSSH. Acestea sunt ridicate pe măsură ce fiecare port este vizat de utilitarul de declanșare de la distanță.
- Când toate cele trei etape ale secvenței de declanșare sunt îndeplinite, o intrare care spune „OPEN SESAME” este înregistrată.
- Este trimisă comanda de inserare a regulii în lista de reguli
iptables
. Permite accesul prin SSH pe portul 22 de la adresa IP specifică a PC-ului care a dat lovitura secretă corectă (192.168.4.23). - Utilizatorul „dave” se conectează doar pentru câteva secunde, apoi se deconectează.
- Vedeți trei intrări closeSSH. Acestea sunt ridicate pe măsură ce fiecare port este vizat de utilitarul de declanșare de la distanță – acesta îi spune gazdei care declanșează portul să închidă portul 22.
- După ce sunt declanșate toate cele trei etape, primim din nou mesajul „OPEN SESAME”. Comanda este trimisă la firewall pentru a elimina regula. (De ce nu „ÎNCHIDE SESAME” când închide portul? Cine știe?)
Acum singura regulă din lista de reguli iptables
referitoare la portul 22 este cea pe care am tastat-o la început pentru a închide acel port. Deci, portul 22 este acum închis din nou.
Bate-l pe cap
Ăsta e trucul de la bătaia în port. Tratați-o ca pe o diversiune și nu o faceți în lumea reală. Sau, dacă trebuie, nu vă bazați pe ea ca pe singura voastră formă de securitate.