Linux kernel hardening: kako zaštititi sistem od eskalacije privilegija

Published:

Najopasniji scenario na Linuxu nije uvek virus u klasičnom smislu. Često je mnogo tiši. Napadač prvo dobije običan korisnički nalog, pokrene zaražen program, iskoristi ranjiv browser, loš dodatak, star paket ili servis koji radi pod slabim dozvolama. Tek onda dolazi pravi cilj: eskalacija privilegija. Drugim rečima, običan korisnik pokušava da postane root.

Root je apsolutna vlast nad sistemom. Kada neko dođe do root naloga, može menjati fajlove, instalirati module, čitati tuđe podatke, gasiti zaštite i sakriti tragove. Zato kernel hardening nije paranoja, nego normalna zaštita ozbiljne mašine. Kernel je jezgro sistema. On stoji između hardvera, programa i korisnika. Ako se tu napravi propust, posledice mogu biti mnogo veće nego kod obične aplikacije.

Dobra vest je da Linux već ima mnogo zaštitnih mehanizama. Loša vest je da nisu svi jednako podešeni na svakoj distribuciji. Zato odbrana mora biti slojevita. Nije dovoljno instalirati antivirus. Nije dovoljno uključiti firewall. Potrebno je smanjiti ono što običan korisnik vidi, ograničiti šta procesi mogu da rade, uključiti sigurnosne module i redovno ažurirati kernel. To je suština moderne Linux odbrane.

Prvi sloj odbrane: zakrpe, kernel i manje curenja informacija

Prva stvar je najdosadnija, ali najvažnija. Kernel mora biti redovno ažuriran. Kod eskalacije privilegija često se ne napada ceo Linux, nego konkretna greška u određenoj verziji kernela. Zato stari kernel nije samo tehnički dug. On je otvoren prozor. Na desktopu to znači redovan update preko sistema. Na Fedori je osnovna komanda:

sudo dnf upgrade

Reč sudo znači da komandu pokrećeš sa administratorskim pravima. dnf je Fedorin alat za instaliranje i ažuriranje paketa. upgrade kaže sistemu da povuče novije verzije programa i kernela. Dakle, ova komanda ne radi ništa misteriozno. Ona samo govori Fedori da se osveži i zakrpi.

Na Ubuntu i Debian sistemima koristi se drugačiji alat. Prvo se osvežava lista dostupnih paketa, a zatim se instaliraju novije verzije. To se radi ovako:

sudo apt update && sudo apt upgrade

Prvi deo, sudo apt update, ne instalira ništa. On samo proverava šta je novo u repozitorijumima. Drugi deo, sudo apt upgrade, instalira nove verzije. Znakovi && znače da se druga komanda pokreće samo ako prva prođe uspešno. Posle ažuriranja kernela najčešće treba restart. Novi kernel se obično učitava tek pri sledećem pokretanju sistema.

Drugi deo prve odbrane je smanjenje informacija koje običan korisnik može da vidi. Napadaču često nije dovoljna samo greška. Potrebni su mu i detalji o sistemu. Kernel logovi, adrese u memoriji i informacije o procesima mogu pomoći pri napadu. Zato se koriste sysctl podešavanja. To su kernel parametri koji menjaju ponašanje sistema dok radi. Zvanična dokumentacija za kernel parametre jasno pokazuje da ove vrednosti nisu ukras, već direktno menjaju ponašanje sistema.

Praktičan primer je fajl /etc/sysctl.d/99-kernel-hardening.conf. To je običan tekstualni fajl. Sistem čita takve fajlove prilikom pokretanja. U njega se mogu staviti vrednosti koje smanjuju curenje informacija iz kernela:

kernel.dmesg_restrict = 1 kernel.kptr_restrict = 2 kernel.perf_event_paranoid = 3 kernel.yama.ptrace_scope = 2

Prva vrednost ograničava čitanje kernel logova. Druga sakriva osetljive kernel adrese. Treća ograničava perf alate koji mogu otkriti previše detalja. Četvrta otežava jednom procesu da špijunira drugi proces. Posle izmene fajla koristi se sledeća komanda:

sudo sysctl --system

Ona učitava sva sysctl podešavanja iz sistemskih konfiguracionih fajlova odmah, bez čekanja restarta. Za početnika je najvažnije da razume jednu stvar. Ove vrednosti ne čine sistem neprobojnim, ali napadaču oduzimaju korisne informacije.

eBPF, user namespaces i lockdown: moćne funkcije koje treba držati pod kontrolom

Moderni Linux ima funkcije koje su izuzetno korisne, ali opasne ako su preširoko otvorene. Jedna od njih je eBPF. To je tehnologija koja omogućava da se mali programi izvršavaju veoma blizu kernela. Koristi se za mrežu, monitoring, bezbednost i analizu performansi. Problem je očigledan. Sve što radi blizu kernela mora biti strogo kontrolisano. Ako običan korisnik može previše lako da koristi eBPF, površina napada postaje veća.

Zato je na mnogim sistemima razumno isključiti neprivilegovani BPF. Komanda za proveru je:

cat /proc/sys/kernel/unprivileged_bpf_disabled

Reč cat samo prikazuje sadržaj fajla. Ovde fajl nije klasičan dokument, nego prozor u kernel podešavanje. Ako želiš da postaviš strože pravilo, u sysctl fajl se dodaje:

kernel.unprivileged_bpf_disabled = 1

To znači da obični korisnici ne mogu koristiti BPF na način koji je rizičan. Za prosečan desktop, laptop ili server to je dobra mera. Za razvojne mašine treba proveriti zavisnosti. Neki alati za monitoring mogu tražiti BPF.

Druga osetljiva tema su user namespaces. Oni omogućavaju izolaciju procesa. Zbog njih sandboxi i rootless kontejneri mogu raditi bez klasičnog root pristupa. To je korisno. Ipak, time se otvara dodatni put ka kernel funkcijama. Zato ova opcija nije jednostavna. Ako je potpuno ugasiš, neke aplikacije mogu prestati da rade. Ako je potpuno otvoriš, povećavaš površinu napada.

Na nekim sistemima postoji vrednost koja zabranjuje običnim korisnicima da sami prave takve izolovane prostore:

kernel.unprivileged_userns_clone = 0

Ovo može pojačati bezbednost, ali može polomiti Flatpak, Chromium sandbox ili rootless kontejnere. Zato se ova mera ne uvodi naslepo. Najbolji hardening nije uvek isključivanje svega. Bolji pristup je da dozvoliš samo ono što tvom sistemu stvarno treba.

Treća važna stvar je kernel lockdown. To je režim koji pokušava da spreči direktan ili indirektan pristup pokrenutom kernelu. Ideja je jednostavna. Čak i kada neko dobije visoke privilegije, ne bi trebalo lako da menja kernel ili učitava nepoveren kod. Opis kernel lockdown mehanizma dobro pokazuje zašto je to važan sloj zaštite, posebno uz Secure Boot.

Stanje možeš proveriti komandom:

cat /sys/kernel/security/lockdown

Ako vidiš opcije u uglastim zagradama, trenutno aktivna vrednost je ona označena. Na nekim sistemima Secure Boot automatski uključuje lockdown. To nije savršena zaštita, ali otežava napadaču prelazak sa kontrole sistema na kontrolu kernela.

SELinux, AppArmor, sandbox i sudo: zaštita mora važiti i za aplikacije

Kernel hardening nije samo podešavanje kernela. Ako browser, PDF čitač, video plejer ili server proces imaju preširoke dozvole, svaka njihova greška postaje veći problem. Zato su važni SELinux i AppArmor. To su sigurnosni slojevi koji ograničavaju šta aplikacija sme da radi. Klasični Linux pita ko si ti kao korisnik. SELinux i AppArmor pitaju i šta ta konkretna aplikacija sme da dira. To je ogromna razlika.

Na Fedori se najčešće koristi SELinux. Provera je jednostavna:

getenforce

Ako komanda vrati Enforcing, zaštita je aktivna i pravila se primenjuju. Ako vrati Permissive, kršenja se beleže, ali se ne blokiraju. Ako vrati Disabled, SELinux je isključen. Za običnog korisnika najvažnije pravilo glasi: ne isključuj SELinux zato što ti smeta jedna aplikacija. Bolje je pronaći konkretan problem. Isključivanje celog sloja zaštite zbog jedne greške liči na skidanje ulaznih vrata zbog zaglavljene brave.

Na Ubuntu sistemima češći je AppArmor. Provera se radi komandom:

sudo aa-status

Ona prikazuje koji profili postoje, koji su aktivni i koje aplikacije su ograničene. AppArmor ograničava mogućnosti aplikacija kroz profile, pa program ne dobija automatski pravo da čita sve što korisnik može da čita. Zato je za desktop korisnike posebno važan kao dodatni sloj odbrane. AppArmor ograničava mogućnosti aplikacija kroz jasna pravila i dopunjuje obične Linux dozvole.

Treći sloj je sandbox. Flatpak, Snap, browser sandbox i systemd zaštite smanjuju štetu kada aplikacija pukne. Kod systemd servisa posebno su korisne opcije koje se dodaju u servisni fajl. One ne treba da se ubacuju nasumično, ali dobro pokazuju kako izgleda ograničavanje servisa:

[Service] NoNewPrivileges=yes PrivateTmp=yes ProtectSystem=strict ProtectHome=yes ProtectKernelTunables=yes ProtectControlGroups=yes RestrictSUIDSGID=yes LockPersonality=yes MemoryDenyWriteExecute=yes

Opcija NoNewPrivileges=yes sprečava servis da naknadno dobije veće privilegije. PrivateTmp=yes daje mu privremeni prostor odvojen od ostatka sistema. ProtectSystem=strict štiti sistemske fajlove od pisanja. ProtectHome=yes ograničava pristup korisničkim folderima. Poenta nije da se sistem polomi. Poenta je da svaki servis dobije samo ono što mu stvarno treba.

Na kraju dolaze sudo i SUID fajlovi. Komanda ispod pokazuje šta tvoj korisnik sme da pokrene kao administrator:

sudo -l

Ako tu vidiš preširoka pravila, to je slabost. Druga komanda traži SUID programe:

find / -perm -4000 -type f 2>/dev/null

find / znači pretraži ceo sistem. -perm -4000 traži posebnu SUID dozvolu. -type f znači samo fajlove. Deo 2>/dev/null sakriva poruke o mestima gde nemaš pristup. SUID nije sam po sebi zlo. Ali svaki nepotreban SUID fajl je dodatna meta.

Zaključak: dobar Linux ne veruje nijednom sloju odbrane

Linux kernel hardening nije jedna komanda. To je stav prema sistemu. Redovan update zatvara poznate rupe. Sysctl podešavanja smanjuju curenje informacija. Ograničen eBPF smanjuje rizičnu površinu. Pažljivo podešeni user namespaces čuvaju balans između sigurnosti i funkcionalnosti. Lockdown štiti kernel od direktnog diranja. SELinux i AppArmor ograničavaju aplikacije. Sandbox smanjuje štetu. Dobro podešen sudo sprečava glupe administrativne greške.

Najvažnije je razumeti suštinu. Ne postoji neprobojan Linux. Postoji samo sistem koji napadaču stalno zatvara sledeća vrata. To je prava odbrana od eskalacije privilegija. Ne jedna magična zaštita, nego niz prepreka. Što ih je više, napad postaje teži, bučniji i manje isplativ.

Linux kernel self-protection upravo tako posmatra sigurnost: kao skup mehanizama koji uklanjaju klase grešaka, otežavaju eksploataciju i pokušavaju da prepoznaju napad pre nego što postane potpuna kontrola sistema.

Povezani članci

Nedavno