Rechten in Linux beantwoorden de vraag «wie mag dit bestand lezen». AppArmor stelt een andere: «wat mag dit programma überhaupt doen». Het verschil blijkt tijdens een inbraak. Een webshell draait onder de gebruiker van de webserver en erft al diens rechten — dat is leestoegang tot het halve systeem. Een AppArmor-profiel beperkt het proces tot de lijst met wat het voor zijn werk nodig heeft, en een poging om /etc/shadow te lezen of /bin/bash te starten eindigt in een weigering, ongeacht de rechten van de gebruiker.
Wat er al aanstaat
sudo aa-status
De uitvoer beantwoordt drie vragen: hoeveel profielen zijn geladen, hoeveel daarvan staan in enforce en complain, en welke processen draaien zonder enig profiel. Op een gangbare Ubuntu zijn er enkele tientallen profielen, maar vrijwel alle voor hulpprogramma's als man en tcpdump. De kerndiensten — nginx, Apache, PHP-FPM — ontbreken doorgaans in de lijst met beperkte processen.
Drie modi om uit elkaar te houden:
- enforce — de regels gelden, al het overtollige is verboden;
- complain — overtredingen worden alleen genoteerd, er wordt niets geblokkeerd. De modus om af te regelen;
- unconfined — er is geen profiel, het programma draait zonder beperkingen.
Het nuttigste deel van de aa-status-uitvoer is het laatste: processen die op het netwerk luisteren en door niets worden beperkt. Dat is de lijst om mee te beginnen.
De hulpmiddelen
sudo apt install apparmor-utils
Zonder dat pakket bestaan de commando's aa-complain, aa-enforce en aa-logprof niet in het systeem, ook al draait AppArmor zelf.
Hoe u een profiel aanzet zonder de dienst te stoppen
De volgorde is essentieel. Een profiel dat meteen in enforce wordt gezet, verbiedt de dienst met grote waarschijnlijkheid iets noodzakelijks, en die houdt op te werken — doorgaans niet meteen, maar bij een zeldzame handeling zoals een bestandsupload of het versturen van mail.
De juiste volgorde:
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx
Een week draaien in die modus, met alle uitzonderlijke scenario's erbij: een reservekopie, een update, het uploaden van grote bestanden. Daarna het doorlopen van wat zich heeft opgehoopt:
sudo aa-logprof
Het commando loopt de vastgelegde overtredingen langs en vraagt bij elke of ze mag worden toegestaan. Hier is aandacht vereist: sta toe wat werkelijk bij het werk van de dienst hoort, en niet alles op rij — anders krijgt u een profiel dat alles toestaat, en is de zin verdwenen.
En pas daarna:
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx
Waar u de weigeringen ziet
Alle overtredingen belanden in het kerneljournaal:
sudo journalctl -k | grep -i apparmor
sudo grep 'apparmor="DENIED"' /var/log/audit/audit.log
Het tweede bestand bestaat als auditd is geïnstalleerd — en daarmee zijn de records merkbaar uitvoeriger. Een weigeringsrecord toont de profielnaam, de gevraagde handeling en het benaderde pad; dat volstaat om te weten of u het profiel moet bijstellen of blij mag zijn dat het afging.
Eén symptoom is het onthouden waard: een dienst gedraagt zich vreemd — leest een configuratie niet, schrijft niet in een map, opent geen socket — terwijl in zijn eigen logboeken een fout «toegang geweigerd» staat bij kennelijk juiste rechten. Dat is vrijwel altijd AppArmor, en het eerste wat u doet is in het kerneljournaal kijken.
Een praktische maatregel, geen theoretische
Een profiel voor PHP-FPM of nginx betaalt zich concreet terug. Is het proces beperkt, dan kan een webshell die op de site is beland noch systeembestanden lezen, noch een shell starten, noch buiten de toegestane mappen schrijven. Een gehackte site blijft een gehackte site in plaats van te veranderen in toegang tot de hele machine — en juist die overgang vormt het leeuwendeel van de schade.
Een verstandige volgorde van invoering: eerst een profiel voor wat naar internet kijkt (webserver, PHP-FPM), daarna voor de databases, vervolgens naar behoefte. Alles tegelijk aanzetten hoeft niet, en een universele kant-en-klare set bestaat niet: een profiel hangt af van waar uw bestanden staan.
Wat u regelmatig moet controleren
Profielen vallen vaker terug in de onbeperkte toestand dan het lijkt: een pakketupdate kan een profielbestand vervangen, handmatig foutzoeken laat een dienst in complain achter, en een nieuwe dienst arriveert helemaal zonder profiel. Twee getallen zijn nuttig: hoeveel profielen in enforce staan en hoeveel netwerkprocessen zonder beperkingen draaien. Een verandering in één daarvan is het weten waard. Hoe dat op één pagina samengebracht oogt, toont de demo hieronder.