Linuxin oikeudet vastaavat kysymykseen ”kuka saa lukea tätä tiedostoa”. AppArmor esittää toisen: ”mitä tämä ohjelma ylipäätään saa tehdä”. Ero näkyy murron yhteydessä. Verkkokuori ajetaan verkkopalvelinkäyttäjän oikeuksilla ja perii kaikki sen oikeudet — siis lukuoikeuden hyvään osaan järjestelmää. AppArmor-profiili rajaa prosessin siihen listaan, jota se työhönsä tarvitsee, ja yritys lukea tiedostoa /etc/shadow tai käynnistää /bin/bash päättyy epäämiseen käyttäjän oikeuksista riippumatta.

Mikä on jo päällä

sudo aa-status

Tuloste vastaa kolmeen kysymykseen: kuinka monta profiilia on ladattu, kuinka moni niistä on enforce- ja complain-tilassa, ja mitkä prosessit toimivat täysin ilman profiilia. Tyypillisessä Ubuntussa profiileja on muutama kymmen, mutta lähes kaikki apuohjelmille kuten man ja tcpdump. Keskeiset palvelut — nginx, Apache, PHP-FPM — puuttuvat yleensä rajoitettujen listalta.

Kolme tilaa on erotettava toisistaan:

  • enforce — säännöt ovat voimassa, kaikki ylimääräinen on kielletty;
  • complain — rikkomukset vain kirjataan, mitään ei estetä. Virittelytila;
  • unconfined — profiilia ei ole, ohjelma toimii ilman rajoituksia.

Hyödyllisin osa aa-status-tulosteesta on viimeinen: prosessit, jotka kuuntelevat verkkoa eikä mikään rajoita niitä. Se on lista, josta kannattaa aloittaa.

Työkalut

sudo apt install apparmor-utils

Ilman tuota pakettia komentoja aa-complain, aa-enforce ja aa-logprof ei järjestelmässä ole, vaikka AppArmor itse toimiikin.

Miten profiili otetaan käyttöön palvelua pysäyttämättä

Järjestyksellä on ratkaiseva merkitys. Suoraan enforce-tilaan asetettu profiili kieltää suurella todennäköisyydellä palvelulta jotain tarpeellista, ja se lakkaa toimimasta — yleensä ei heti vaan jonkin harvinaisen toiminnon kohdalla, kuten tiedoston tai kirjeen lähetyksessä.

Oikea järjestys:

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

Viikko tuossa tilassa, mukaan lukien kaikki epätavalliset kulut: varmuuskopiointi, päivitys, suurten tiedostojen lataus. Sitten kertyneen läpikäynti:

sudo aa-logprof

Komento käy läpi kirjatut rikkomukset ja kysyy jokaisen kohdalla, sallitaanko se. Tässä tarvitaan tarkkaavaisuutta: salli se, mikä todella kuuluu palvelun työhön, eikä kaikkea peräkkäin — muuten tuloksena on profiili, joka sallii kaiken, ja pointti katoaa.

Ja vasta sen jälkeen:

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

Missä epäykset näkyvät

Kaikki rikkomukset päätyvät ytimen lokiin:

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

Toinen tiedosto on olemassa, jos auditd on asennettu — ja silloin merkinnät ovat huomattavasti rikkaampia. Epäysmerkinnässä näkyy profiilin nimi, pyydetty toiminto ja polku, johon yritettiin päästä; se riittää päättämään, korjataanko profiilia vai iloitaanko siitä että se toimi.

Pane erikseen merkille oire: palvelu käyttäytyy oudosti — ei lue asetuksia, ei kirjoita hakemistoon, ei avaa pistoketta — ja sen omissa lokeissa on virhe ”pääsy evätty” täysin oikeilla oikeuksilla. Se on lähes aina AppArmor, ja ensimmäinen asia on katsoa ytimen lokia.

Käytännön keino, ei teoreettinen

Profiili PHP-FPM:lle tai nginxille maksaa itsensä takaisin konkreettisella tavalla. Kun prosessi on rajattu, sivustolle päätynyt verkkokuori ei voi lukea järjestelmätiedostoja, käynnistää komentotulkkia eikä kirjoittaa minnekään sallittujen hakemistojen ulkopuolelle. Murto sivustolle pysyy murtona sivustolle sen sijaan että muuttuisi pääsyksi koko koneeseen — ja juuri tuo siirtymä muodostaa vahingon olennaisen osan.

Järkevä käyttöönottojärjestys: ensin profiili sille, mikä katsoo internetiin (verkkopalvelin, PHP-FPM), sitten tietokannoille, sen jälkeen tarpeen mukaan. Kaikkea ei tarvitse ottaa käyttöön kerralla, eikä valmista yleiskokoelmaa ole: profiili riippuu siitä, missä tiedostosi ovat.

Mitä tarkistaa säännöllisesti

Profiilit palautuvat rajoittamattomaan tilaan useammin kuin luulisi: paketin päivitys voi vaihtaa profiilitiedoston, käsin tehty vianetsintä jättää palvelun complain-tilaan, ja uusi palvelu tulee täysin ilman profiilia. Kaksi lukua on hyödyllistä: kuinka monta profiilia on enforce-tilassa ja kuinka monta verkkoprosessia toimii ilman rajoituksia. Kummankin muutos ansaitsee huomiota. Miltä se näyttää yhdelle sivulle koottuna, näkyy alla olevassa esittelyssä.