A Linux jogosultságai arra a kérdésre válaszolnak, hogy „ki olvashatja ezt a fájlt”. Az AppArmor mást kérdez: „mit szabad egyáltalán ennek a programnak csinálnia”. A különbség behatoláskor mutatkozik meg. A webshell a webszerver felhasználójának jogosultságaival fut, és örökli annak minden jogát — azaz a rendszer jó felének olvasását. Az AppArmor-profil arra a listára korlátozza a folyamatot, amire a munkájához szüksége van, és az /etc/shadow olvasására vagy a /bin/bash indítására tett kísérlet elutasítással végződik, a felhasználó jogosultságaitól függetlenül.

Mi van már bekapcsolva

sudo aa-status

A kimenet három kérdésre válaszol: hány profil van betöltve, ezek közül hány fut enforce és complain üzemmódban, és mely folyamatok futnak egyáltalán profil nélkül. Egy tipikus Ubuntuban néhány tucat profil lesz, de szinte mindegyik olyan segédprogramokhoz, mint a man és a tcpdump. A kulcsszolgáltatások — nginx, Apache, PHP-FPM — a korlátozottak listájáról általában hiányoznak.

Három üzemmódot kell megkülönböztetni:

  • enforce — a szabályok érvényesek, minden fölösleges tiltott;
  • complain — a szabálysértéseket csak rögzíti, semmit nem blokkol. Behangolási üzemmód;
  • unconfined — nincs profil, a program korlátozás nélkül fut.

Az aa-status kimenetének leghasznosabb része az utolsó: a hálózaton figyelő, semmivel nem korlátozott folyamatok. Ezzel a listával érdemes kezdeni.

Az eszközök

sudo apt install apparmor-utils

E csomag nélkül az aa-complain, aa-enforce és aa-logprof parancsok nincsenek a rendszerben, noha maga az AppArmor működik.

Hogyan kapcsolj be profilt a szolgáltatás leállítása nélkül

A sorrend alapvető jelentőségű. A rögtön enforce üzemmódba kapcsolt profil nagy valószínűséggel megtilt a szolgáltatásnak valami szükségeset, és az leáll — általában nem azonnal, hanem valamilyen ritka műveletnél, például fájl vagy levél küldésekor.

A helyes sorrend:

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

Egy hét munka ebben az üzemmódban, beleértve az összes szokatlan forgatókönyvet: mentés, frissítés, nagy fájlok küldése. Utána nézd át, mi gyűlt össze:

sudo aa-logprof

A parancs végigmegy a rögzített szabálysértéseken, és mindegyiknél megkérdezi, engedélyezd-e. Itt figyelem kell: azt engedélyezd, ami valóban a szolgáltatás munkájához tartozik, ne mindent sorban — különben mindent megengedő profil születik, és az értelme elvész.

És csak azután:

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

Hol nézd az elutasításokat

Minden szabálysértés a kernel naplójába kerül:

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

A második fájl akkor létezik, ha az auditd telepítve van — és akkor a bejegyzések lényegesen bőségesebbek. Az elutasítási bejegyzésben látszik a profil neve, a kért művelet és az útvonal, amelyhez hozzá akartak férni; ez elég annak eldöntéséhez, hogy a profilt kell-e javítani, vagy örülni annak, hogy működött.

Külön jegyezd meg a tünetet: a szolgáltatás furcsán viselkedik — nem olvassa a konfigurációt, nem ír egy könyvtárba, nem nyit socketet —, a saját naplóiban pedig „hozzáférés megtagadva” hiba szerepel, teljesen helyes jogosultságok mellett. Ez majdnem mindig az AppArmor, és az első dolog belenézni a kernel naplójába.

Gyakorlati, nem elméleti intézkedés

Egy PHP-FPM- vagy nginx-profil kézzelfoghatóan megtérül. Korlátozott folyamat mellett a webhelyre került webshell sem rendszerfájlokat nem tud olvasni, sem shellt indítani, sem bárhová írni az engedélyezett könyvtárakon kívül. A webhely feltörése a webhely feltörése marad ahelyett, hogy az egész géphez való hozzáféréssé alakulna — és éppen ez az átmenet adja a kár lényegi részét.

Észszerű bevezetési sorrend: először profil annak, ami az internetre néz (webszerver, PHP-FPM), aztán az adatbázisoknak, tovább szükség szerint. Mindent egyszerre nem kell bekapcsolni, és univerzális kész készlet nincs: a profil attól függ, hol vannak a fájljaid.

Mit ellenőrizz rendszeresen

A profilok gyakrabban esnek vissza korlátozás nélküli módba, mint gondolnád: egy csomagfrissítés lecserélheti a profilfájlt, a kézi hibakeresés complain módban hagyja a szolgáltatást, egy új szolgáltatás pedig egyáltalán profil nélkül érkezik. Két szám hasznos: hány profil van enforce módban, és hány hálózati folyamat fut korlátozás nélkül. Bármelyik változása figyelmet érdemel. Hogy néz ki mindez egy oldalra gyűjtve, azt az alábbi bemutató mutatja.