Démon zabeleži neuspeh chroot, profil pa je že videti širok, zato je vabljiva rešitev razširiti pravilo za pot in znova zagnati. To običajno ne spremeni ničesar, ker chroot zapira privilegij, ki ga profil nikoli ni mogel podeliti. Odločitev, katere plasti se dotakniti, zahteva tri preverjanja in ta so poceni: kaj proces sme imeti, kaj politika dovoljuje in kaj je zaganjalnik odstranil, preden je bilo katero od tega sploh pomembno.

Dve ločeni vratci in samo ena pripadajo AppArmorju

chroot potrebuje CAP_SYS_CHROOT v uporabniškem imenskem prostoru, v katerem proces teče. To je običajni privilegij Linuxa, ki ga jedro preveri, preden klic karkoli naredi s potmi. Ločeno od tega lahko uveljavljajoči profil AppArmor zavrne zmožnost tudi takrat, ko jo proces ima, ker se obvezna politika upošteva poleg poverilnic in ne namesto njih. Razlika je v praksi pomembna: plasti živita v različnih datotekah in ju običajno vzdržujejo različni ljudje.

Oboja vratca spodletita z istim errno. Oba ustvarita EPERM in oba se v dnevniku démona pokažeta kot splošna pritožba glede dovoljenja, zato ugibanje o vsebini profila izgubi toliko časa. Pravilo za pot, ki ste ga nameravali dodati, nadzoruje dostop do datotek šele po uspešnem chroot; na to, ali je operacija sploh dovoljena, ne vpliva.

Tretja vratca stojijo pred obema. Če je upravitelj storitev ali ovoj zagnal proces brez te zmožnosti v njegovi mejni množici, je nobena sprememba AppArmorja ne more vrniti, dodajanje zmožnosti v profil pa samo dokumentira namero, ki je jedro ne bo izpolnilo.

Pred urejanjem politike preberite stanje privilegijev

Začnite pri tekočem procesu, ne pri konfiguraciji, za katero mislite, da je dejavna. Stanje v datoteki razkrije pet mask zmožnosti in zastavico no-new-privileges, ki odgovarjata na različna vprašanja:

grep -E '^(CapInh|CapPrm|CapEff|CapBnd|CapAmb|NoNewPrivs):' /proc/$(pidof openvpn)/status
sudo aa-status | grep -i openvpn

CapEff je množica, ki je pomembna za klic: zmožnost, ki je v CapBnd, a je ni v CapEff, dovoljuje zgornja meja in je trenutno ne drži. CapAmb je pomembna, ko binarna datoteka ni privilegirana v običajnem pomenu setuid, ker so okoljske zmožnosti način, kako storitev obdrži privilegij čez exec brez datotečnih zmožnosti. CapInh hrani bite, ki bi se lahko podedovali čez exec, a samo takrat, ko to dovoljuje dedovalna množica izvajane datoteke, zato bit tam sam po sebi nič ne podeli.

Nato preverite, kateri profil je v resnici pripet. Proces je lahko omejen s profilom z imenom, ki ga niste pričakovali, še posebej ko distribucija dobavi svojo enoto in svoj profil skupaj, branje /proc/PID/attr/current pa to razreši v eni vrstici. Primerjava vaše urejene datoteke s profilom, ki ga poroča jedro, je razlika med odpravo vzroka in urejanjem datoteke, ki je nihče ne naloži.

Pravilo zmožnosti dodajte le, kadar tako pravi revizijska sled

Zapisi jedra in revizije poimenujejo plast, ki je zavrnila. Poiščite zavrnitev z operacijo capable in imenom sys_chroot skupaj s profilom, ki jo je ustvaril. Če tak zapis obstaja, je proces zmožnost že imel in AppArmor jo je zavrnil, ciljna sprememba pa je pravilo zmožnosti v resničnem profilu:

capability sys_chroot,

Obdržite ga kot fragment v profilu, ki je resnično pripet, in preverite ključno besedo v referenci profilov apparmor.d, namesto da bi prepisali pravilo iz nepovezane vadnice. Če ga vstavite v skupni include, ga podelite vsakemu omejenemu programu, ki to datoteko naloži, preklop profila v način complain pa skrije naslednjo zavrnitev, namesto da bi razrešil to. Pravilo v profilu odpravi zavrnitev politike; ne ustvari privilegija, zato bo proces, ki nikoli ni imel CAP_SYS_CHROOT v svoji učinkoviti množici, spodletel tudi s pravilom na mestu.

Če revizijski zapis ne kaže nobene zavrnitve AppArmorja, prenehajte urejati profil. Spopadate se s težavo s poverilnicami in preostalo delo je v enoti ali v nadrejenem procesu, ne v jeziku politike.

Upravitelj storitev drži svojo zgornjo mejo

systemd vsaki storitvi nastavi mejno množico zmožnosti in ta je privzeto ozka. Kar je tam izključeno, procesu ni na voljo ne glede na to, kaj pravi profil, zato lahko utrjene enote spodletijo pri operaciji, ki je delovala, ko je bil démon zagnan ročno. Ustrezne direktive je v enoti lahko prebrati in jih je lahko spregledati, ko napako sporoči aplikacija sama. Drop-in datoteke, ki jih dobavi paket distribucije, so običajen vir meje, za katero se nihče ne spomni, da jo je nastavil.

Dvig meje in podelitev zmožnosti sta dve spremembi, ne ena. Vnos v mejni množici pravi, da proces zmožnost sme imeti; ne doda je v učinkovito množico, NoNewPrivs pa lahko prepreči uspeh poznejšega povišanja, tudi ko se vse drugo ujema. Dodajte samo tisto, kar operacija potrebuje, ohranite preostalo utrjevanje nedotaknjeno in se uprite bližnjici, ki podeli vse zmožnosti, da bi en klic uspel.

Tudi tukaj je vrstni red pomemben. Najprej spremenite mejo enote, preverite, da CapEff zdaj vsebuje ta bit, in šele nato odločite, ali AppArmor še zavrača. Če naredite obe spremembi hkrati, boste ob vztrajni napaki spet ugibali.

Ko zavrnitev izgine, preglejte samo ječo

Uspešen chroot premakne koren, zato se vsaka pot, ki se je démon dotakne pozneje, razreši znotraj novega drevesa. Manjkajoča konfiguracija, odsotno vozlišče naprave ali imenik potrdil, ki se ni prekopiral, se zdaj pokažejo kot napaka datoteke in ta napaka je težava postavitve, ne zmožnosti. Preberite naslednji dogodek, namesto da dodate še eno široko dovoljenje. Premik spremeni tudi pomen relativne poti, zato priročniki za utrjevanje vztrajajo pri absolutnih poteh v konfiguraciji démona.

Koristno se je spomniti tudi, česa chroot ne počne. Je meja poti, ne peskovnik: proces, ki obdrži privilegij, lahko iz njega pobegne, zato se zmožnost običajno po klicu spusti in zato mora omejitev ostati okoli démona. Ohraniti skupaj profil AppArmor, mejno množico zmožnosti in datotečnosistemske omejitve je smisel vaje, ne ostanek, ki bi ga odstranili po zagonu storitve.

Pravilo odločitve je kratko. Če revizijski zapis poimenuje AppArmor, dodajte eno pravilo zmožnosti v pripeti profil. Če je učinkovita množica prazna, popravite mejo enote in vrstni red odstopanja privilegijev. Če profil ni tisti, ki ste ga urejali, prenehajte urejati in poiščite pravega.

Sorodni članki