SSH je standardni protokol za udaljenu administraciju linux računala. S obzirom da se po uspješnom spajanju i autentifikaciji na ssh servisu pristupa praktično neograničenim mogućnostima upravljanja računalom, ssh servis je česta “meta” zlonamjernih računala (99,99999% automatiziranih skripti i malware-a) koji nastoje dobiti pristup što većem broju računala za iskorištavanje resursa (miniranje kriptivaluta i slično) ili kakve druge zlonamjerne radnje. Ukratko ćemo opisati neke od načina za ojačavanje zaštite ssh servisa na linux računalu.

Ja nisam stručnjak za računalnu sigurnost i ovo su sve moji osobni stavovi. Smatram da je to bitno naglasiti, jer općenito vlada stav da je public-key autentifikacija sigurnija od korištenja lozinke, no ja se ne slažem s time. Definitivno sigurnija je od loše lozinke, no od dobre smatram da nije iz razloga jer ako računalo čiji javni ključ se nalazi na popisu autoriziranih ključeva postane kompromitirano, napadača više ništa ne spriječava u prijavljivanju na ssh protokol. A računalo s autoriziranim javnim ključem može biti kompromitirano na različite načine, ili uslijed mrežnog napada, virusa i sličnih softverskih načina, ili s druge strane fizičkim pristupom od strane neovlaštene osobe (npr. krađa laptopa i slično). U takvim slučajevima, postojanje lozinke umjesto javnog ključa je bolja opcija.

No, vratimo se na temu. Kako povećati sigurnost ssh servisa? Uzet ćemo primjer da to želimo uraditi na serveru. Tri su zgodne strategije:

1) omogućavanje pristupa ssh servisu samo za određena računala (po IP adresi),

2) korištenje port-knock metode i

3) korištenje fail2ban programa. Niže su ukratko opisane prednosti i nedostaci pojedine metode. Treba naglasiti, da ih možete i kombinirati za bolji učinak, iako je to vjerojatno overkill.

Firewall (white list IP)

Ova metoda podrazumijeva da određenim IP adresama (ili rasponima) dozvolimo pristup (na ssh port 22 ili neograničeni pristup) a zatim isključimo port 22 iz popisa eksplicitno otvorenih portova. Prednost metode je praktično apsolutna sigurnost ssh protokola kojem nitko ne može pristupiti s mreže osim računala s eksplicitno navedenim IP adresama. Nedostatak je što ne možemo pristupiti ni mi ako se fizički nađemo negdje gdje imamo drugačiji IP. Ovaj nedostatak je moguće razriješiti tako da se prvo od tamo spojimo na računalo koje je na popisu dopuštenih adresa pa zatim na ciljani server, tako da to nije značajno ograničavajuć faktor. Mali problem je i kod adresa koje se mijenjaju dinamički ali tad možemo postaviti cijele raspone dozvoljenih adresa, kao u primjeru. Uzet ćemo da je operativni sustav Centos 8, i da koristimo standardni FirewallD za konfiguraciju filtriranja paketa. Recimo da želimo dopustiti samo adresama iz raspona 10.0.45.0 – 10.0.45.254 pristup ssh servisu na serveru. Prvi korak je dodavanje IP raspona u trusted zonu:

# firewall-cmd --zone=trusted --add-source=10.0.45.0/24 --permanent

Drugi korak je onemogućavanje svim ostalima pristup ssh servisu tako što ćemo ga izbaciti iz popisa servisa public zone (najvjerojatnije se tamo nalazi; provjeriti sa firewall-cmd –list-all (ako je public zona default) ili firewall-cmd –zone=public –list-all …):

# firewall-cmd --zone-public --remove-service=ssh --permanent

Nakon ovih operacija reloadamo firewall:

# firewall-cmd --reload

Važno: ovdje je navedena generalna procedura koja se može razlikovati od one koju je potrebno uraditi na vašem serveru, zavisno o trenutačnom setupu vašeg firewalla. U slučaju da ste uradili nekakvu grešku, moglo bi se dogoditi da vam firewall blokira pristup nakon ovih radnji te ako vam server nije fizički dostupan da mu više ne možete pristupiti. Zgodan trik za se osigurati od takve opasnosti je da unaprijed uprogramirate gašenje firewalla u određeno vrijeme u budućnosti. Za to možete koristiti cron, ali zgodnije rješenje za ovu namjenu je at servis. Ako nije instaliran i pokrenut:

# dnf install at
# systemctl enable --now atd.service

Sad možete postaviti gašenje firewalla, npr. nakon 1 sat:

# at now + 1 hour

Te u “at prompt” upisati:

at> systemctl stop firewalld

i stisnuti Ctrl-D za izaći iz at prompta. Nakon sat vremena, firewall će se ugasiti, te ako ste slučajno ostali zaključani bez pristupa na ssh port, po gašenju firewalla moći ćete mu ponovo pristupiti i popraviti grešku. Naravno, da bi ovo imalo efekta, potrebno je uraditi prije “igranja” sa firewallom. Za više at opcija, pogledajte primjerice ovaj link. BTW, ne zaboravite kasnije upaliti firewall 🙂 ili pročitajte na linku kako opozvati zadan at zadatak prije nego dođe na red za izvršavanje.

Port-knock

Port knock podrazumijeva da je ssh port standardno zatvoren firewallom za svih, ali se nakratko otvara iniciranje konekcije za onoga tko pristupi točno određenom drugom portu. Npr. ako je “knock port” 25439, onda je prije spajanja na port 22, nakratko potrebno inicirati konekciju za 25439 – nije važno čime, normalno sa ssh klijentom, npr. s linuxa:

ssh <adresa-servera> -p 25439

i nakon toga unutar vremenskog razdoblja u kojem je otvoren port 22 (samo za vaš IP), spojiti se na ssh servis – nakon spajanja konekcija vam je otvorena neograničeno, dok se ne odspojite, a tad trebate ponovo “kucati” na 25439… Proceduru konfiguracije port-knock metode nećemo opisivati, ali sve detalje lako možete izgooglati ili posjetite ovaj knockd man-page te za konifiguraciju sa FirewallD, ovaj link. Neostatak ove metode je što moramo izrađivati posebnu proceduru za prijavu za automatizirane sustave, koja će najprije “pokucati” na port, sačekati vrlo kratko vrijeme, i onda se konačno spojiti na ssh, a također i kod normalne prijave takva procedura zna biti pomalo iritirajuća, posebno ako koristimo GUI alate kao npr. grafički SFTP program i slično.

Fail2Ban

Fail2Ban je servis koji blokira firewallom one IP adrese s kojih se detektiraju neuspješna spajanja. To je odlična metoda za onemogućavanje brute-force pokušaja autentifikacije (pomoću testiranja ogromnog broja nasumičnih lozinki u kratkom vremenu). Ovu metod je zgodno koristiti zajedno s jednom od prve dvije kao dodatni sigurnosni sloj. Fail2Ban osim ssh protokola može nadgledati i druge servere koji zahtijevaju autentifikaciju korisnika te blokirati izvorišne adrese s kojih se detektiraju neuspješni pokušaji iste. Primjer za instalaciju na Centos 8, na ovom linku. Nedostatak ove metode je što dozvoljava nekoliko pokušaja (konfigurabilan broj) autentifikacije, a također i može blokirati legitimnog korisnika ako pogriješi unos lozinke…

Koje ćete metode za pojačavanje sigurnosti koristiti, u konačnici zavisi samo o vama. Ja se u posljednje vrijeme opredjeljujem ponajviše za prvoopisanu metodu pri čemu dopuštam spajanje na ssh sa raspona IP adresa od kućnog Internet providera te raspona Carnet IP adresa s obzirom da su mi uredi na Carnetovoj mreži.