Drepturile în Linux răspund la întrebarea „cine poate citi acest fișier”. AppArmor pune alta: „ce are voie să facă în general acest program”. Diferența se vede la o intruziune. Un webshell se execută cu drepturile utilizatorului serverului web și moștenește toate privilegiile lui — adică citirea unei bune jumătăți din sistem. Profilul AppArmor limitează procesul la lista a ceea ce îi trebuie pentru lucru, iar încercarea de a citi /etc/shadow sau de a porni /bin/bash se încheie cu refuz, indiferent de drepturile utilizatorului.

Ce este deja activat

sudo aa-status

Ieșirea răspunde la trei întrebări: câte profiluri sunt încărcate, câte dintre ele rulează în modurile enforce și complain și ce procese rulează complet fără profil. Într-un Ubuntu tipic vor fi câteva zeci de profiluri, dar aproape toate pentru utilitare precum man și tcpdump. Serviciile cheie — nginx, Apache, PHP-FPM — lipsesc de obicei din lista celor limitate.

Trei moduri trebuie deosebite:

  • enforce — regulile se aplică, tot ce este de prisos este interzis;
  • complain — încălcările sunt doar înregistrate, nimic nu este blocat. Modul de reglare;
  • unconfined — profil nu există, programul rulează fără limitări.

Cea mai utilă parte din ieșirea aa-status este ultima: procesele care ascultă în rețea și nu sunt limitate de nimic. Aceasta este lista cu care merită să începi.

Instrumentele

sudo apt install apparmor-utils

Fără acest pachet, comenzile aa-complain, aa-enforce și aa-logprof nu există în sistem, deși AppArmor în sine funcționează.

Cum activezi un profil fără să oprești serviciul

Ordinea este esențială. Un profil pus direct în enforce va interzice cu mare probabilitate serviciului ceva necesar, iar acesta va înceta să funcționeze — de obicei nu imediat, ci la o operațiune rară, precum trimiterea unui fișier sau a unui e-mail.

Ordinea corectă:

sudo aa-complain /etc/apparmor.d/usr.sbin.nginx

O săptămână de lucru în acest mod, incluzând toate scenariile atipice: copiere de rezervă, actualizare, trimiterea de fișiere mari. Apoi parcurgerea a ceea ce s-a adunat:

sudo aa-logprof

Comanda trece prin încălcările înregistrate și întreabă la fiecare dacă să fie permisă. Aici este nevoie de atenție: permite ceea ce ține cu adevărat de munca serviciului, nu tot la rând — altfel va ieși un profil care permite orice, iar sensul dispare.

Și abia apoi:

sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx

Unde se văd refuzurile

Toate încălcările ajung în jurnalul nucleului:

sudo journalctl -k | grep -i apparmor
sudo grep 'apparmor="DENIED"' /var/log/audit/audit.log

Al doilea fișier există dacă este instalat auditd — și atunci înregistrările sunt considerabil mai bogate. Într-o înregistrare de refuz se văd numele profilului, operațiunea cerută și calea la care s-a încercat accesul; asta este suficient pentru a decide dacă se corectează profilul sau te bucuri că a funcționat.

Reține separat simptomul: serviciul se comportă ciudat — nu citește configurația, nu scrie într-un director, nu deschide un socket — iar în propriile jurnale are eroarea „acces refuzat” cu drepturi perfect corecte. Aceasta este aproape întotdeauna AppArmor, iar primul lucru este să te uiți în jurnalul nucleului.

O măsură practică, nu teoretică

Un profil pentru PHP-FPM sau nginx se amortizează concret. Cu procesul limitat, un webshell ajuns pe site nu poate nici să citească fișiere de sistem, nici să pornească un shell, nici să scrie undeva în afara directoarelor permise. Compromiterea site-ului rămâne compromiterea site-ului, în loc să se transforme în acces la toată mașina — iar tocmai această trecere constituie partea esențială a pagubei.

Ordinea rezonabilă de implementare: mai întâi profil pentru ceea ce privește spre internet (serverul web, PHP-FPM), apoi pentru baze de date, apoi după nevoie. Nu trebuie activate toate deodată, iar un set universal gata făcut nu există: profilul depinde de locul în care se află fișierele tale.

Ce verifici periodic

Profilurile revin la modul nelimitat mai des decât pare: o actualizare de pachet poate înlocui fișierul profilului, depanarea manuală lasă serviciul în complain, iar un serviciu nou vine complet fără profil. Două cifre sunt utile: câte profiluri sunt în enforce și câte procese de rețea rulează fără limitări. Modificarea oricăreia merită atenție. Cum arată asta adunat pe o singură pagină arată demonstrația de mai jos.