Hvernig finna má hvaða systemd-sandbox hafnaði OpenVPN-hookinu þínu
Hookið virkar sem root og mistekst undir systemd því unitið heldur færri getu, minna /dev og aðeins-lesanlegum slóðum.
Hookið virkar þegar þú keyrir það í höndunum sem root og skilar Operation not permitted á þeirri stundu sem þjónustan ræsir það. Skráin breyttist ekki milli þessara keyrslna; umhverfið gerði það. systemd gefur ferlinu minni heim: færri getu, annað /dev, aðeins-læsilegar slóðir skráakerfisins og þak á verk. Lestu mistökin sem mörk sem höfnuðu einni tiltekinni aðgerð, ekki sem skriftu sem brotnaði.
Byrjaðu á aðgerðinni sem var hafnað
Logglína sem segir að unitið hafi mistekist segir þér nánast ekkert. Gagnlega línan nefnir kallið sem var hafnað: tækjahníting sem ekki var hægt að opna, mappa sem ekki var hægt að skrifa í, nafnrými sem ekki var hægt að búa til. Finndu það kall áður en þú snertir eina einustu tilskipun, því hver þeirra svarar til mismunandi takmörkunar. Lestu síðan unitið sem raunverulega rann, drop-in þar með talið, í stað skrárinnar sem pakkinn sendi.
Fyrirspurnin hér að neðan prentar slóð brotsins, drop-in möppurnar og þá eiginleika sem skipta máli fyrir höfnun tækis eða skráakerfis. Lestu þá alla áður en þú ákveður hvaða mörk eiga við:
systemctl show "[email protected]" -p FragmentPath -p DropInPaths -p PrivateDevices -p DevicePolicy -p DeviceAllow -p ProtectHome -p ProtectSystem -p TasksMax
journalctl -u "[email protected]" -b --no-pager | grep -iE 'operation not permitted|permission denied|cannot open|failed'Ekkert í þeim blokki skrifar. Ef hafnaða kallið vantar í dagbókina skaltu hækka smáatriðastig biðlarans fyrir eina keyrslu í stað þess að giska á tilskipanir. Ferli sem er í gangi sannar að unitið ræstist, ekki að hookið hafi runnið með þeim réttindum sem það þurfti.
Nafnrými þarf mount-réttindi sem TUN-tæki notar aldrei
Tvær aðgerðir sem líta eins út innan eins hooks hafa mismunandi heimildarsnið. Að opna /dev/net/tun og búa til viðmótið þarf netstjórnun auk aðgangs að þeirri hnítingu. Að búa til nefnt netnafnrými þarf líka mount-vinnu, því nafnrýmisverkfærið mountar nýja /sys sýn og bindur stöðumöppu á sinn stað. biðlara-unit frá upstream lætur stjórnun mount viljandi vera utan markmengis síns, svo nafnrýmisþrepinu er hafnað á meðan göngin sjálf hefðu virkað.
Þess vegna bjargar það skriftunni ekki að gefa tækjahnítinguna. Tækjaheimild svarar einni spurningu, hvort þetta ferli megi opna þessa hnítingu, og spurning nafnrýmisins er önnur. Paraðu kall sem mistekst við getu þess áður en þú víkkar nokkuð.
Prófun í skelinni þinni erfir alla getu sem ótakmarkað root hefur, og unitið erfir það sem markmengi þess hélt. Þessar tvær keyrslur eru mismunandi tilraunir jafnvel þótt tvíundarskráin sé eins.
Tæki, varðar slóðir og þök á verk
Þegar hafnaða aðgerðin er þekkt útskýra þrír hópar tilskipana flest mistök. Aðgang að tækjum stýrir PrivateDevices, sem kemur í stað /dev með lágmarksmengi gervitækja, og DevicePolicy með DeviceAllow, sem ákveða hvað cgroup leyfir. /dev/net/tun er ekki hluti af því lágmarksmengi, svo unit með PrivateDevices=yes getur ekki opnað hana, hvað sem tækjastefnan segir.
Vernd skráakerfisins svarar annarri spurningu. ProtectHome=yes gerir /home, /root og /run/user óaðgengilegar, og ProtectSystem=full gerir /usr, /boot og /etc aðeins-læsilegar. Þess vegna virkar hook sem skrifar við hlið eigin stillingarskrár í skelinni þinni og mistekst undir unitinu, með sama heimildarformi og geta sem vantar. Færðu skrifanlega inntakið á slóð sem stefnan leyfir, eða bættu við þröngri ReadWritePaths= færslu.
Auðlindatakmarkanir eru þriðji hópurinn, og sá sem er minnst augljós. TasksMax= takmarkar hversu mörg verk unitið má búa til, og þak á skráarlýsa hagar sér eins fyrir sökkl og handföng. Uppsetning sem hefur vaxið fram yfir þakið mistekst með auðlindavillu í stað heimildarvillu, og þess vegna skiptir nákvæma skilaboðið enn máli.
Færðu nafnrýmisþrepið út úr hookinu
Undirbúningur sem þarf réttindi sem biðlarinn má ekki hafa á heima í sínu eigin uniti. oneshot sem rann fyrir biðlarann, heldur niðurstöðu sinni og er raðað á undan tengingunni gefur nafnrýmisþrepinu það sem það þarf án þess að afhenda þessi réttindi ferli ganganna. Biðlarinn vísar þá í það unit í stað þess að kalla skriftuna úr sínu up-hooki.
Sniðmátið hér að neðan er byrjunarform, ekki eitthvað sem á að beita ólesið. Það heldur undirbúningnum þar sem réttindin búa og lætur unit ganganna ósnortið:
# /etc/systemd/system/[email protected]
[Unit]
Description=Namespace preparation for %i
Before=openvpn-client@%i.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/sbin/netns-up.sh %i
CapabilityBoundingSet=CAP_NET_ADMIN CAP_SYS_ADMIN
[Install]
WantedBy=multi-user.targetBættu röðinni við með drop-in í stað þess að breyta pakkaða unitinu, svo uppfærsla geti ekki látið breytinguna þína falla í þögn. Mappan er lykluð að nafni tilviksins, svo annað snið þarf sína eigin skrá:
sudo mkdir -p /etc/systemd/system/[email protected]
sudo tee /etc/systemd/system/[email protected]/10-namespace.conf >/dev/null <<'CONF'
[Unit]
[email protected]
[email protected]
CONF
sudo systemctl daemon-reloadEndurtaktu sama kall eftir breytinguna
Viðgerð er aðeins staðfest þegar sama kall gefur aðra niðurstöðu. Endurræstu bæði unitin, keyrðu aðgerðina sem mistókst og berðu niðurstöðu hennar saman við logglínuna sem þú vistaðir fyrir breytinguna. Unit sem ræsist á meðan hookið rann aldrei aftur er ekki viðgerð.
Röðin hér að neðan heldur samanburðinum heiðarlegum, því hún athugar hafnaða kallið en ekki lit unitsins. Vistaðu úttak hennar við hlið logglínunnar sem þú namst fyrir breytinguna:
sudo systemctl restart "[email protected]" "[email protected]"
systemctl status "[email protected]" --no-pager
journalctl -u "[email protected]" -b --no-pager | grep -c 'Operation not permitted'
ip -brief addr show tun0Teldu höfnunina í stað þess að lesa síðustu línuna, því hook getur mistekist, reynt aftur og tekist, og aðeins talan sýnir hvort mörkin færðust. Skildu eftir athugasemd í drop-ininu sem nefnir tilskipunina sem þú slakaðir á og ástæðuna, því næsta uppfærsla ber saman stillingarnar þínar við pakkaða sjálfgefna gildið. Unit sem ræsist aðeins þegar öll vernd er slökkt hefur ekki verið lagað.