Како користити Порт Кноцкинг на Линуку (и зашто не би требало)

Uklanjanje otvorenih portova na serveru je važan korak ka njegovoj zaštiti. To se postiže zatvaranjem svih portova na firewall-u, čak i onih za koje smatrate da će biti neophodni. Ti portovi se otvaraju tek kada se primi zahtev za konekciju koji sadrži tajnu sekvencu, poznatu kao „port knocking“.

Šta je Port Knocking?

Koncept port knocking-a ima svoje korene u vremenu prohibicije dvadesetih godina prošlog veka. Da biste ušli u tajni bar („speakeasy“), morali ste da znate tajnu „kucnu“ sekvencu. Port knocking funkcioniše na sličnom principu.

Ako želite da omogućite pristup uslugama na vašem računaru, ali ne želite da portovi budu otvoreni na internetu, port knocking je efikasno rešenje. On omogućava da svi portovi na firewall-u, koji primaju dolazne veze, budu zatvoreni. Tek kada se ispravna, unapred definisana sekvenca pokušaja povezivanja pošalje na server, portovi se automatski otvaraju. Ta sekvenca služi kao tajni kod. Pored toga, još jedna tajna sekvenca se koristi da ponovo zatvori port.

Iako je port knocking relativno nov koncept, bitno je napomenuti da spada u kategoriju bezbednosti kroz nejasnost, a taj pristup je u suštini neispravan. Tajnost pristupa sistemu je bezbedna samo dok je poznata samo odabranoj grupi. Kada se ta tajna otkrije (kroz otkrivanje, posmatranje, nagađanje ili dešifrovanje), vaša bezbednost je ugrožena. Zato je preporučljivo da se server zaštiti na druge, pouzdanije načine, kao što je zahtevanje prijave putem ključa za SSH server.

Najefikasniji pristup sajber bezbednosti je višeslojan. Port knocking može da bude jedan od tih slojeva. Ipak, može se tvrditi da port knocking ne donosi mnogo vrednosti kada je u pitanju bezbedan sistem koji je već dobro ojačan.

Sajber bezbednost je izuzetno široka i složena tema. Port knocking ne treba da se koristi kao jedini vid zaštite.

Instalacija knockd alata

U ovom vodiču koristićemo port knocking za kontrolu porta 22, koji se koristi za SSH. Za to ćemo koristiti alat pod imenom knockd. Ako koristite Ubuntu ili neku drugu Debian baziranu distribuciju, instalirajte paket pomoću apt-get komande. Za druge Linux distribucije, koristite odgovarajući alat za upravljanje paketima.

Unesite sledeću komandu:

sudo apt-get install knockd

Verovatno već imate instaliran iptables firewall, ali možda ćete morati da instalirate i iptables-persistent paket, koji automatski učitava sačuvana pravila iptables-a.

Unesite sledeću komandu da biste ga instalirali:

sudo apt-get install iptables-persistent

Kada se pojavi konfiguracioni ekran za IPv4, pritisnite razmaknicu da biste prihvatili opciju „Da“.

Ponovo pritisnite razmaknicu na konfiguracionom ekranu za IPv6 da biste prihvatili opciju „Da“ i nastavili dalje.

Sledeća komanda omogućava iptables-u da dozvoli uspostavljene i tekuće veze. Zatim ćemo uneti još jednu komandu koja zatvara SSH port.

Ne želimo da prekinemo vezu nekome ko je već povezan putem SSH-a, dok unosimo ovu komandu:

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

Ova komanda dodaje pravilo firewall-u koje kaže:

-A: Dodaje pravilo u tabelu pravila firewall-a, tj. dodaje ga na dno.
INPUT: Ovo je pravilo za dolazne veze.
-m conntrack: Pravila firewall-a se primenjuju na mrežni saobraćaj (pakete) koji odgovaraju kriterijumima u pravilu. Parametar -m zahteva da iptables koristi dodatne module za upoređivanje paketa. U ovom slučaju, modul conntrack se koristi za mogućnost praćenja mrežnih veza kernel-a.
–ctstate ESTABLISHED,RELATED: Ovo specificira tip veze na koji se pravilo primenjuje, a to su ESTABLISHED i RELATED veze. Uspostavljena veza je ona koja je već u toku. Povezana veza je ona koja je nastala kao rezultat akcije uspostavljene veze. Na primer, ako neko ko je povezan želi da preuzme datoteku; to može da se dogodi putem nove veze koju je pokrenuo host.
-j ACCEPT: Ako saobraćaj odgovara pravilu, „skoči“ na cilj ACCEPT u firewall-u. Drugim rečima, saobraćaj se prihvata i dozvoljava da prođe kroz firewall.

Sada možemo da unesemo komandu za zatvaranje porta:

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

Ova komanda dodaje pravilo u firewall koje kaže:

-A: Dodaje pravilo u tabelu pravila firewall-a, tj. dodaje ga na dno.
INPUT: Ovo pravilo se odnosi na dolazne veze.
-p tcp: Ovo pravilo se primenjuje na saobraćaj koji koristi Transmission Control Protocol.
–dport 22: Ovo pravilo se primenjuje konkretno na TCP saobraćaj koji cilja port 22 (SSH port).
-j REJECT: Ako saobraćaj odgovara pravilu, „skoči“ na cilj REJECT u firewall-u. Dakle, ako je saobraćaj odbijen, on ne može da prođe kroz firewall.

Moramo da pokrenemo netfilter-persistent demon. To se može uraditi sledećom komandom:

sudo systemctl start netfilter-persistent

Želimo da netfilter-persistent prođe kroz ciklus čuvanja i ponovnog učitavanja, tako da učitava i kontroliše iptables pravila.

Unesite sledeće komande:

sudo netfilter-persistent save

sudo netfilter-persistent reload

Sada ste instalirali potrebne uslužne programe, a SSH port je zatvoren (nadamo se, bez prekidanja bilo čije veze). Sada je vreme da konfigurišete tajnu sekvencu.

Konfiguracija knockd alata

Postoje dve datoteke koje treba da uredite da biste konfigurisali knockd. Prva je knockd konfiguraciona datoteka:

sudo gedit /etc/knockd.conf

Gedit editor se otvara sa učitanom knockd konfiguracionom datotekom.

Uredićemo ovu datoteku prema našim potrebama. Sekcije koje nas zanimaju su „openSSH“ i „closeSSH“. U svakoj sekciji se nalaze sledeća četiri polja:

sequence: Redosled portova kojima neko mora da pristupi da bi otvorio ili zatvorio port 22. Podrazumevani portovi su 7000, 8000 i 9000 da bi se otvorio, a 9000, 8000 i 7000 da bi se zatvorio. Možete ih promeniti ili dodati još portova na listu. Za ovaj primer, zadržaćemo se na podrazumevanim vrednostima.
seq_timeout: Vremenski period u kome neko mora da pristupi portovima da bi pokrenuo njihovo otvaranje ili zatvaranje.
command: Komanda koja se šalje firewall-u iptables kada se pokrene akcija otvaranja ili zatvaranja. Ove komande dodaju pravilo u firewall (za otvaranje porta) ili ga uklanjaju (za zatvaranje porta).
tcpflags: Tip paketa koji svaki port mora da primi u tajnom nizu. SYN (sinhronizacija) paket je prvi paket u TCP zahtevu za povezivanje, poznatom kao trostruko rukovanje.

Sekcija „openSSH“ se može pročitati kao „zahtev za TCP vezu mora da se uputi na portove 7000, 8000 i 9000 – tim redosledom i u roku od 5 sekundi – da bi komanda za otvaranje porta 22 bila poslata firewall-u“.

Sekcija „closeSSH“ se može pročitati kao „zahtev za TCP vezu mora da se uputi na portove 9000, 8000 i 7000 – tim redosledom i u roku od 5 sekundi – da bi komanda za zatvaranje porta 22 bila poslata firewall-u“.

Pravila Firewall-a

Unosi „command“ u sekcijama openSSH i closeSSH ostaju isti, osim jednog parametra. Oni su sastavljeni na sledeći način:

-I: Dodaje pravilo na vrh liste pravila firewall-a (za openSSH komandu).
-D: Briše pravilo sa liste pravila firewall-a (za closeSSH komandu).
INPUT: Ovo pravilo se odnosi na dolazni mrežni saobraćaj.
-s %IP%: IP adresa uređaja koji zahteva vezu.
-p: Mrežni protokol; u ovom slučaju, to je TCP.
–dport: Odredišni port; u našem primeru, to je port 22.
-j ACCEPT: Skače na cilj prihvatanja unutar firewall-a. Drugim rečima, dozvoljava paketu da prođe kroz ostala pravila bez reagovanja na njega.

Uređivanje knockd konfiguracione datoteke

Izmene koje ćemo izvršiti u datoteci su označene crvenom bojom ispod:

Produžavamo „seq_timeout“ na 15 sekundi. Ovo je prilično vremena, ali ako neko ručno pokreće zahteve za povezivanje, možda će mu trebati ovoliko vremena.

U sekciji „openSSH“, menjamo opciju -A (dodaj) u komandi u -I (ubaci). Ova komanda ubacuje novo pravilo firewall-a na vrh liste pravila firewall-a. Ako ostavite opciju -A, ona dodaje listu pravila firewall-a na dno.

Dolazni saobraćaj se testira u odnosu na svako pravilo firewall-a na listi, odozgo nadole. Već imamo pravilo koje zatvara port 22. Dakle, ako se dolazni saobraćaj testira u odnosu na to pravilo pre nego što vidi pravilo koje dozvoljava saobraćaj, veza se odbija. Ako prvo vidi ovo novo pravilo, veza je dozvoljena.

Komanda za zatvaranje uklanja pravilo koje je dodao openSSH iz pravila firewall-a. SSH saobraćajem se ponovo upravlja prema već postojećem pravilu „port 22 je zatvoren“.

Nakon što izvršite ove izmene, sačuvajte konfiguracionu datoteku.

Uređivanje knockd kontrolne datoteke

Knockd kontrolna datoteka je mnogo jednostavnija. Međutim, pre nego što je otvorimo i uredimo, moramo da znamo interno ime naše mrežne veze. Da biste ga pronašli, unesite ovu komandu:

ip addr

Veza koju ovaj računar koristi za ovaj vodič se zove enp0s3. Zapišite ime vaše veze.

Sledeća komanda otvara knockd kontrolnu datoteku za uređivanje:

sudo gedit /etc/default/knockd

Evo knockd datoteke u gedit-u.

Nekoliko izmena koje treba da izvršimo je označeno crvenom bojom:

Promenili smo unos „START_KNOCKD=“ sa 0 na 1.

Takođe smo uklonili znak # sa početka unosa „KNOCKD_OPTS=“ i zamenili „eth1“ imenom naše mrežne veze, enp0s3. Naravno, ako je vaša mrežna veza eth1, ne morate je menjati.

Provera funkcionalnosti

Vreme je da vidimo da li ovo radi. Pokrenućemo knockd demon sa ovom komandom:

sudo systemctl start knockd

Sada ćemo preći na drugi računar i pokušati da se povežemo. Instalirali smo knockd alat na tom računaru takođe, ne zato što želimo da podesimo port knocking, već zato što knockd paket pruža još jedan alat koji se zove knock. Koristićemo ovaj računar da generišemo našu tajnu sekvencu umesto nas.

Koristite sledeću komandu da biste poslali tajnu sekvencu zahteva za povezivanje na portove na ciljanom računaru sa IP adresom 192.168.4.24:

knock 192.168.4.24 7000 8000 9000 -d 500

Ovo govori knock-u da cilja računar sa IP adresom 192.168.4.24 i pokrene zahtev za povezivanje na portove 7000, 8000 i 9000, jedan po jedan, sa -d (kašnjenjem) od 500 milisekundi između njih.

Korisnik po imenu „dave“ zatim šalje SSH zahtev na 192.168.4.24:

ssh [email protected]

Njegova veza je prihvaćena, unosi svoju lozinku i njegova udaljena sesija počinje. Njegova komandna linija se menja sa [email protected] u [email protected] Da bi se odjavio sa udaljenog računara, kuca:

exit

Njegova komandna linija se vraća na njegov lokalni računar. On još jednom koristi knock, i ovog puta cilja portove obrnutim redosledom da bi zatvorio SSH port na udaljenom računaru.

knock 192.168.4.24 9000 8000 7000 -d 500

Iako ovo nije bila naročito produktivna udaljena sesija, ona pokazuje otvaranje i zatvaranje porta putem port knocking-a i staje u jedan snimak ekrana.

Dakle, kako je ovo izgledalo sa druge strane? Administrator sistema na ciljanom računaru koristi sledeću komandu da vidi nove unose koji pristižu u sistemski dnevnik:

tail -f /var/log/syslog

Videćete tri openSSH unosa. Oni se pojavljuju kada svaki port targetira uslužni program za udaljeni knock.

Kada su sve tri faze sekvence okidača ispunjene, pojavljuje se unos sa tekstom „OTVORI SE SEZAME„.
Šalje se komanda da se ubaci pravilo na listu pravila iptables-a. Dozvoljava pristup putem SSH-a na portu 22 sa određene IP adrese računara koji je dao ispravnu tajnu sekvencu (192.168.4.23).
Korisnik „dave“ se povezuje samo na nekoliko sekundi, a zatim prekida vezu.
Videćete tri closeSSH unosa. Oni se pojavljuju kada svaki port targetira uslužni program za udaljeni knock – govori ciljanom računaru da zatvori port 22.
Nakon što su sve tri faze aktivirane, ponovo dobijamo poruku „OTVORI SE SEZAME“. Komanda se šalje firewall-u da ukloni pravilo. (Zašto ne „ZATVORI SE SEZAME“ kada se zatvara port? Ko zna?)

Sada je jedino pravilo na listi pravila iptables-a koje se odnosi na port 22 ono koje smo uneli na početku kako bismo zatvorili taj port. Dakle, port 22 je sada ponovo zatvoren.

Zaključak

Ovo je samo jedan mali trik. Tretirajte ga kao zabavu i ne primenjujte ga u stvarnom okruženju. Ili ako morate, nemojte se oslanjati na njega kao jedini oblik sigurnosti.