chroot mistekst í OpenVPN: AppArmor-regla eða heimild?
Að bæta slóð við AppArmor-snið veitir aldrei CAP_SYS_CHROOT, og synjað chroot getur komið frá þremur aðskildum lögum. Komdu að því hverju á að breyta.
Dæmoninn skráir chroot-mistök og sniðið virðist þegar ríflegt, svo hið freistandi úrræði er að víkka slóðarreglu og endurræsa. Það breytir venjulega engu, því chroot er stýrt af heimild sem sniðið gat aldrei veitt. Að ákveða hvaða lag á að snerta krefst þriggja ódýrra athugana: hvað ferlinu er heimilt að halda, hvað stefnan leyfir, og hvað ræsirinn fjarlægði áður en hvort tveggja skipti máli.
Tvö aðskilin hlið, og aðeins annað tilheyrir AppArmor
chroot þarf CAP_SYS_CHROOT í notendarýminu sem ferlið keyrir í. Þetta er hefðbundin Linux-heimild sem kjarninn athugar áður en kallið gerir nokkuð við slóðir. Aðskilið getur framfylgjandi AppArmor-snið synjað getunni jafnvel þótt ferlið hafi hana, því skoðuð er bindandi stefna til viðbótar við skírteini en ekki í staðinn fyrir þau. Greinin skiptir máli í reynd: lögin tvö búa í mismunandi skrám og venjulega viðhalda mismunandi aðilar þeim.
Þessi tvö hlið mistakast með sama errno. Bæði framleiða EPERM, og bæði birtast sem almenn heimildakvört í dæmonlokinu, sem er ástæðan fyrir því að að giska á innihald sniðsins eyðir svo miklum tíma. Slóðarreglan sem þú varst að fara að bæta við stýrir skráaaðgangi eftir að chroot tekst; hún hefur ekkert með það að gera hvort aðgerðin sé leyfð yfirleitt.
Þriðja hliðið er ofar báðum. Ef þjónustustjórinn eða umbúðir byrjuðu ferlið án getunnar í takmarkandi mengi sínu, getur engin AppArmor-breyting sett hana aftur, og að bæta getum við sniðið skjalfestir bara áform sem kjarninn mun ekki virða.
Lestu heimildastöðuna áður en stefnan er breytt
Byrjaðu á ferlinu sem keyrir frekar en stillingunni sem þú telur virka. Stöðuskráin sýnir fimm getumaska og no-new-privileges-flagg, og þau svara mismunandi spurningum:
grep -E '^(CapInh|CapPrm|CapEff|CapBnd|CapAmb|NoNewPrivs):' /proc/$(pidof openvpn)/status
sudo aa-status | grep -i openvpnCapEff er mengið sem skiptir máli fyrir kallið: geta sem er í CapBnd en vantar í CapEff er leyfð af loftinu og ekki haldið núna. CapAmb skiptir máli þegar tvíundarskráin er ekki heimilduð í venjulegum setuid-skildi, því umhverfisgetur eru leiðin sem þjónusta heldur heimild yfir exec án skráargetna. CapInh heldur bitum sem geta erfst yfir exec, en aðeins þegar arfleiðanlegt mengi keyrðu skrárinnar leyfir það, svo bit þar veitir ekkert eitt og sér.
Staðfestu síðan hvaða snið er raunverulega tengt. Ferli getur verið lokað inni með sniðsnafni sem þú bjóst ekki við, sérstaklega þegar dreifing sendir eigin einingarskrá og snið saman, og lestur á /proc/PID/attr/current gerir það ljóst í einni línu. Að bera breyttu skránna þína saman við sniðið sem kjarninn greinir frá er munurinn á að laga orsökina og að breyta skrá sem enginn hleður.
Bættu getureglunni við aðeins þegar endurskoðunarferillinn segir svo
Kjarna- og endurskoðunarskrár nefna lagið sem synjaði. Leitaðu að synjun sem ber aðgerðina capable og nafnið sys_chroot, ásamt sniðinu sem framleiddi hana. Ef sú skrá er til, hafði ferlið þegar getuna og AppArmor synjaði, og markviss breyting er geturegla inni í raunverulegu sniðinu:
capability sys_chroot,Haltu henni sem broti í sniðinu sem er raunverulega tengt, og berðu lykilorðið saman við viðmiðun apparmor.d-sniða í stað þess að afrita reglu úr óviðkomandi námskeiði. Að setja hana í sameiginlegt include veitir hana hverju því lokaða forriti sem dregur þá skrá inn, og að skipta sniðinu yfir í complain-stillingu felur næstu synjun í stað þess að leysa þessa. Sniðsreglan fjarlægir stefnusynjun; hún býr ekki til heimild, svo ferli sem aldrei hafði CAP_SYS_CHROOT í virka menginu mistekst samt með regluna.
Ef endurskoðunarskráin sýnir enga AppArmor-synjun, hættu að breyta sniðinu. Þú ert að horfa á vandamál með skírteini, og eftir er vinna í einingarskránni eða foreldraferlinu, ekki í stefnumálinu.
Þjónustustjórinn heldur sínu eigin lofti
systemd setur takmarkandi getumengi fyrir hverja þjónustu, og sjálfgefið er það mengi þröngt. Hvað sem útilokað er þar er ferlinu óaðgengilegt sama hvað sniðið segir, sem er ástæðan fyrir því að hertar einingar geta mistekist í aðgerð sem virkaði þegar dæmoninn var ræstur handvirkt. Viðeigandi tilskipanir er auðvelt að lesa í einingunni og auðvelt að missa sjónar á þegar forritið tilkynnir mistökin. Drop-in-skrár sem dreifingarpakki sendir eru venjulega uppruni lofts sem enginn man eftir að hafa stillt.
Að hækka loftið og veita getuna eru tvær breytingar, ekki ein. Færsla í takmarkandi menginu segir að ferlið megi halda getunni; hún bætir henni ekki við virka mengið, og NoNewPrivs getur komið í veg fyrir að síðari hækkun takist jafnvel þótt allt annað passi. Bættu aðeins við því sem aðgerðin þarf, haltu restinni af herðingunni og stagast á móti skammbragðinu að veita allar getur svo eitt kall gangi í gegn.
Röðin skiptir líka máli hér. Breyttu lofti einingarinnar fyrst, staðfestu að CapEff innihaldi nú bitið, og ákveddu svo hvort AppArmor synji enn. Að gera báðar breytingarnar í einu lætur þig giska aftur ef mistökin vara.
Þegar synjunin hverfur, athugaðu fangelsið sjálft
Árangursríkt chroot færir rótina, svo hver slóð sem dæmoninn snertir síðan er leyst inni í nýja trénu. Vantar stillingu, tækjanóð sem er ekki til eða skírteinamappa sem var ekki afrituð munu nú birtast sem skráarvilla, og sú villa er útlitsvandamál en ekki getuvandamál. Lestu næsta atburð í stað þess að bæta við annarri víðri heimild. Færslan breytir líka merkingu afstæðrar slóðar, sem er ástæðan fyrir því að herðingarleiðbeiningar krefjast algildra slóða í stillingu dæmonsins.
Það hjálpar líka að muna hvað chroot gerir ekki. Það er slóðarmörk, ekki sandkassi: ferli sem heldur heimildinni getur sloppið út, sem er ástæðan fyrir því að getan er venjulega látin falla eftir kallið og ástæðan fyrir því að einangrunin á að vera áfram um dæmoninn. Að halda AppArmor-sniðinu, takmarkandi getumenginu og skráakerfistakmörkunum saman er tilgangurinn með æfingunni, ekki afgangur sem á að fjarlægja þegar þjónustan ræsist.
Ákvörðunarreglan er stutt. Ef endurskoðunarskráin nefnir AppArmor, bættu einni getureglu við tengda sniðið. Ef virka mengið er tómt, lagaðu loft einingarinnar og röðina við að sleppa heimildinni. Ef sniðið er ekki það sem þú breyttir, hættu að breyta og finndu hið raunverulega.