Rättigheter i Linux svarar på frågan ”vem får läsa den här filen”. AppArmor ställer en annan: ”vad får det här programmet över huvud taget göra”. Skillnaden visar sig vid ett intrång. Ett webbskal körs med webbserveranvändarens rättigheter och ärver alla dess privilegier — alltså läsrätt till en god del av systemet. En AppArmor-profil begränsar processen till listan över det den behöver för sitt arbete, och ett försök att läsa /etc/shadow eller starta /bin/bash slutar med avslag, oavsett användarens rättigheter.

Vad som redan är påslaget

sudo aa-status

Utdatan svarar på tre frågor: hur många profiler som är inlästa, hur många av dem som körs i enforce respektive complain, och vilka processer som körs helt utan profil. I ett typiskt Ubuntu blir det några dussin profiler, men nästan alla för hjälpprogram i stil med man och tcpdump. De centrala tjänsterna — nginx, Apache, PHP-FPM — saknas vanligen i listan över begränsade.

Tre lägen behöver hållas isär:

  • enforce — reglerna gäller, allt överflödigt är förbjudet;
  • complain — överträdelser registreras bara, ingenting blockeras. Läget för intrimning;
  • unconfined — ingen profil finns, programmet körs utan begränsningar.

Den nyttigaste delen av aa-status är den sista: processer som lyssnar på nätverket och inte begränsas av något. Det är listan att börja med.

Verktygen

sudo apt install apparmor-utils

Utan det paketet finns kommandona aa-complain, aa-enforce och aa-logprof inte i systemet, även om AppArmor självt fungerar.

Hur du slår på en profil utan att stoppa tjänsten

Ordningen är avgörande. En profil som direkt sätts i enforce kommer med stor sannolikhet att förbjuda tjänsten något den behöver, och då slutar den fungera — vanligen inte genast, utan vid någon sällsynt operation som att skicka en fil eller ett brev.

Rätt ordning:

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

En vecka i det läget, inklusive alla ovanliga förlopp: säkerhetskopiering, uppdatering, uppladdning av stora filer. Sedan en genomgång av det som samlats:

sudo aa-logprof

Kommandot går igenom registrerade överträdelser och frågar vid varje om den ska tillåtas. Här behövs uppmärksamhet: tillåt det som verkligen hör till tjänstens arbete och inte allt i rad — annars blir resultatet en profil som tillåter allt, och poängen försvinner.

Och först därefter:

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

Var du ser avslagen

Alla överträdelser hamnar i kärnloggen:

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

Den andra filen finns om auditd är installerat — och då är posterna betydligt fylligare. I en avslagspost syns profilnamnet, den begärda operationen och sökvägen som efterfrågades; det räcker för att avgöra om profilen ska rättas eller om man ska glädjas åt att den fungerade.

Lägg särskilt symtomet på minnet: tjänsten beter sig underligt — läser inte konfigurationen, skriver inte till en katalog, öppnar inte en socket — och har i sina egna loggar felet ”åtkomst nekad” trots helt korrekta rättigheter. Det är nästan alltid AppArmor, och det första man gör är att titta i kärnloggen.

En praktisk åtgärd, inte en teoretisk

En profil för PHP-FPM eller nginx lönar sig på ett konkret sätt. Med processen begränsad kan ett webbskal som hamnat på sajten varken läsa systemfiler, starta ett skal eller skriva någonstans utanför de tillåtna katalogerna. Ett intrång på sajten förblir ett intrång på sajten i stället för att bli åtkomst till hela maskinen — och just den övergången utgör den väsentliga delen av skadan.

En rimlig införandeordning: först en profil för det som vetter mot internet (webbservern, PHP-FPM), sedan för databaserna, därefter efter behov. Allt behöver inte slås på på en gång, och någon färdig universell uppsättning finns inte: profilen beror på var dina filer ligger.

Vad du kontrollerar regelbundet

Profiler faller tillbaka till obegränsat oftare än man tror: en paketuppdatering kan byta ut profilfilen, manuell felsökning lämnar tjänsten i complain, och en ny tjänst kommer helt utan profil. Två tal är användbara: hur många profiler som är i enforce och hur många nätverksprocesser som körs utan begränsningar. En förändring i endera är värd uppmärksamhet. Hur det ser ut samlat på en sida visar demonstrationen nedan.