Dozvole u Linuxu odgovaraju na pitanje „ko sme da pročita ovaj fajl". AppArmor odgovara na drugo: „šta je ovom programu uopšte dozvoljeno da radi". Razlika se pokazuje pri provali. Veb ljuska radi kao korisnik veb servera i nasleđuje sva njegova prava — što je pristup za čitanje dobroj polovini sistema. AppArmor profil ograničava proces na listu onoga što mu treba za posao, a pokušaj čitanja /etc/shadow ili pokretanja /bin/bash završava se odbijanjem bez obzira na dozvole korisnika.
Šta je već uključeno
sudo aa-status
Izlaz odgovara na tri pitanja: koliko je profila učitano, koliko ih je u enforce a koliko u complain režimu i koji procesi rade bez ikakvog profila. Na tipičnom Ubuntuu biće nekoliko desetina profila, ali su gotovo svi za pomoćne programe poput man i tcpdump. Ključni servisi — nginx, Apache, PHP-FPM — obično nedostaju na listi ograničenih.
Tri režima vredi razlikovati:
- enforce — pravila se primenjuju, sve suvišno se odbija;
- complain — prekršaji se samo beleže u dnevnik, ništa se ne blokira. Režim za podešavanje;
- unconfined — profila nema, program radi bez ograničenja.
Najkorisniji deo izlaza aa-status je poslednji: procesi koji osluškuju mrežu i nisu ničim ograničeni. Od te liste se počinje.
Alati
sudo apt install apparmor-utils
Bez tog paketa komande aa-complain, aa-enforce i aa-logprof ne postoje u sistemu, iako sam AppArmor radi.
Kako uključiti profil bez zaustavljanja servisa
Redosled je suštinski. Profil prebačen odmah u enforce sa velikom verovatnoćom će servisu odbiti nešto što mu treba, i on će prestati da radi — obično ne odmah nego na nekoj retkoj operaciji poput otpremanja fajla ili slanja pošte.
Ispravan niz:
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx
Nedelja rada u tom režimu, uz pokrivanje svakog neobičnog scenarija: pravljenja rezervne kopije, ažuriranja, otpremanja velikih fajlova. Zatim prođite kroz ono što se nakupilo:
sudo aa-logprof
Komanda prolazi kroz zabeležene prekršaje i za svaki pita da li ga dozvoliti. Ovde je potrebna pažnja: dozvolite ono što zaista pripada poslu servisa, a ne sve što vam se nađe pred očima — inače dobijate profil koji dozvoljava sve i smisao je izgubljen.
I tek onda:
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx
Gde se vide odbijanja
Svi prekršaji završavaju u dnevniku jezgra:
sudo journalctl -k | grep -i apparmor
sudo grep 'apparmor="DENIED"' /var/log/audit/audit.log
Drugi fajl postoji ako je auditd instaliran — a sa njim su zapisi osetno detaljniji. Zapis odbijanja prikazuje naziv profila, traženu operaciju i putanju kojoj se pristupalo; to je dovoljno da procenite treba li popraviti profil ili se radovati što se aktivirao.
Jedan simptom vredi zapamtiti: servis se ponaša čudno — ne čita konfiguraciju, ne piše u direktorijum, ne otvara socket — dok njegovi sopstveni dnevnici prikazuju grešku „permission denied" sa dozvolama koje su očigledno ispravne. To je gotovo uvek AppArmor, i prvo što treba uraditi jeste pogledati u dnevnik jezgra.
Praktična mera, a ne teorijska
Profil za PHP-FPM ili nginx isplati se na konkretan način. Sa ograničenim procesom, veb ljuska koja dođe do sajta ne može ni da čita sistemske fajlove, ni da pokrene ljusku, ni da upiše bilo šta izvan dozvoljenih direktorijuma. Provaljen sajt ostaje provaljen sajt umesto da se pretvori u pristup celoj mašini — a upravo taj prelaz čini najveći deo štete.
Razuman redosled uvođenja: prvo profil za ono što gleda na internet (veb server, PHP-FPM), zatim za baze podataka, pa dalje po potrebi. Nema potrebe uključivati sve odjednom i ne postoji univerzalan gotov skup: profil zavisi od toga gde su vaši fajlovi.
Šta redovno proveravati
Profili se vraćaju u unconfined češće nego što biste pomislili: ažuriranje paketa može zameniti fajl profila, ručno otklanjanje grešaka ostavi servis u complain, a nov servis dolazi bez ikakvog profila. Dve brojke su korisne: koliko je profila u enforce i koliko procesa okrenutih mreži je unconfined. Promenu bilo koje od njih vredi znati. Kako to izgleda sabrano na jednoj stranici pokazuje demo ispod.