Keyrðu VPN-aðgerð eftir tengingu sem notandinn, ekki sem daemoninn
Umhverfisbreyta sem segir USER=alice breytir ekki hvaða reikningur hook keyrir sem. Aðskildu atburðinn, kveikinn og aðgerðina og sannaðu svo UID-ið.
Tengingarkrókar á VPN-daemon keyra sem daemoninn, og það þýðir venjulega að þeir keyra sem root. Um leið og einn þessara króka skrifar í heimaskrá einhvers eða endurræsir skjáborðsaðstoðarmann, hefur þú gefið netatburði getuna til að starfa sem hvaða staðbundinn notandi sem er. Venjulega stuttleiðin, að lesa notandanafn úr umhverfisbreytu og senda það áfram, lagar þetta ekki. Hún endurmerkir aðgerðina án þess að breyta því hvaða reikningur framkvæmir hana. Það sem virkar er þrískipt afhending þar sem hið forréttindafulla skref segir hvað gerðist og sérstök eining framkvæmir aðgerðina undir réttri auðkennu.
Notandanafn í umhverfinu er ekki auðkennarofi
Unix ræður því hvað ferli má snerta út frá virku notandakenni þess, ekki út frá strengjunum í umhverfi þess. Að setja USER=alice eða flytja út LOGNAME breytir því hvað kærulaus hugbúnaður prentar í úttak sitt; það breytir engu um eignarhaldsprófanir skráa. Krókur sem keyrir sem root með þessa breytu stillta opnar enn skrár Alice sem root.
Nöfnin eru heldur ekki sama nafnið. Fjartengingarinnskráning, staðbundinn Unix-reikningur og algengt nafn skírteinisins eru þrjú auðkenni sem falla oft saman og stundum ekki. Notandi sem sannar sig sem a.smith hefur kannski engan staðbundinn reikning eða varpast á asmith í gegnum skrárþjónustu. Sérhver hönnun sem gerir ráð fyrir að einn strengur þjóni öllum þremur hlutverkunum mun brotna hjá fyrsta verktakanum.
Þannig að fyrsta spurningin er ekki „hvaða notandi er tengdur“ heldur „hvaða staðbundni reikningur má framkvæma þessa aðgerð“. Svaraðu því úr þínum eigin reikningsgagnagrunni, ekki úr því sem biðlarinn sendi:
id -u alice
getent passwd alice | cut -d: -f1,3,6
stat -c '%U:%G %a %n' /home/alice/.local/state/vpn-status.json
Þriðja skipunin er sú sem fólk sleppir. Ef markmiðsskráin er í eigu root vegna þess að fyrri krókurinn bjó hana til, mun rétt stillt notendaaðgerð mistakast með heimildarvillu sem lítur út eins og systemd-vandamál og er það ekki.
Daemoninn verður þar sem hann er
Að breyta eigin User= VPN-þjónustunnar í Alice er rangur vogarstöng. Það breytir því hvernig daemoninn bindur tengi, les lykla, skrifar stöðuskrá sína og stýrir leiðum, og færir allan þennan áhættu inn í einingu sem var að virka. Daemoninn þarf forréttindi sín; eftirfylgniaðgerðin þarf þau ekki.
Skoðaðu hvað einingin gerir í raun áður en þú snertir hana. Tvær skipanir segja þér framkvæmdarauðkennið og nákvæmu skipanalínurnar sem gilda, þar á meðal allt sem yfirskrifun bætti við:
systemctl show -p User -p Group -p ExecStart openvpn-server@server
systemctl cat openvpn-server@server
Við sjálfgefna pakkainnsetningu er daemoninn root og --up skriftan erfir það. Staðfestu það í stað þess að gera ráð fyrir því, því hert dreifing gæti hafa flutt hann á sérstakan reikning, og handskrifuð drop-in gæti keyrt krókinn í gegnum umbúðir með öðrum reglum.
Þrír nefndir hlutar, einn þröngur kveikur
Skipulagið sem lifir viðhald hefur atburð, kveik og aðgerð. Daemoninn tilkynnir að nefnd lota hafi komið upp. Kveikur tekur við þessari litlu staðreynd og biður um eina fasta aðgerð. Aðgerðin keyrir undir þeim staðbundna reikningi sem á skrárnar sem hún snertir. Ekkert í keðjunni tekur við handahófskenndri skipanaleið.
Aðgerðin sjálf er venjuleg þjónustueining, og auðkennið er ein tilskipun inni í henni:
[Service]
Type=oneshot
User=alice
Group=alice
ExecStart=/usr/local/bin/refresh-vpn-status --slot %i
Athugaðu að User=alice gildir um alla eininguna, og systemd skjalfestir eina undantekningu sem er þess virði að þekkja: skipun með forskeytinu + keyrir með fullum forréttindum óháð því. Það forskeyti er lögmætt verkfæri fyrir eitt forréttindafullt skref og þægileg leið til að afturkalla aðskilnaðinn sem þú byggðir rétt í búið, svo meðhöndlaðu hvaða + sem er í þeirri einingu sem eitthvað sem þarf að rökstyðja í yfirferð.
Haltu inntaki kveiksins í lágmarki og ekki leyndu. Lotuauðkennið, varpaði reikningurinn og tímastimpill eru venjulega allt sem þarf. Sendu aldrei shell-bút, slóð á keyrsluskrá eða umhverfisblokk frá biðlinum yfir mörkin, því móttökuhliðin hefur enga leið til að greina lögmætt gildi frá innspýttu.
Staðfestu auðkennið sem raunverulega keyrði
Yfirferð stillingar er ekki sönnun. Eftir samþykkta prófunartengingu, staðfestu UID-ið sem snerti skrána og UID-ið sem daemoninn notar enn:
stat -c '%U %G %y %n' /home/alice/.local/state/vpn-status.json
ps -o user=,pid=,cmd= -p "$(pgrep -o -f 'openvpn --daemon')"
systemd-run --uid=alice --pipe /usr/local/bin/refresh-vpn-status --dry-run
Fyrsta línan ætti að sýna Alice og tímastimpil innan prófunargluggans þíns. Önnur ætti enn að sýna root eða þjónustureikning pakkans, sem sannar að daemoninn hreyfðist ekki. Þriðja er ódýrasta leiðin til að prófa heimildir aðgerðarinnar án þess að bíða eftir raunverulegri endurtengingu.
Ef eigandi skrárinnar er Alice en hópur hennar eða háttur breyttist milli keyrslna, leitaðu að UMask= eða mun á heimildum möppu í stað rökvillu. Ef tímastimpillinn hreyfðist alls ekki var kveikurinn aldrei settur af stað, og gagnlegt næsta skref er journalctl -u fyrir aðgerðareininguna í stað annarrar endurtengingar biðlarans.
Hvað tengingaratburður sannar enn ekki
Komin göng eru ein staðreynd. Það þýðir ekki að skjáborðslotan sé opnuð, lotuþjónustan sé aðgengileg eða að einkaaðilinn sem aðgerðin vill sé þegar tiltækur. oneshot-eining undir UID Alice hefur auðkenni hennar og ekkert af lotu hennar, svo allt sem krefst myndrænnar lotu verður að fara í gegnum studda notendalotukerfið og skilgreina hvað gerist þegar hún er skráð út.
Endurtengingar endurtaka sig líka. Fartölva sem sefur í lest getur framleitt tylft tengingaratburða á klukkustund, og krókur sem bætir við línu í hvert sinn gerir stöðuskrá að annál sem enginn getur lesið. Gerðu aðgerðina idempotenta, eða leyfðu henni að skipta út einni færslu sem er lykluð eftir lotu.
Að lokum, takmarkaðu skaðasvæðið í einingunni sjálfri: skrifvarð sýn á skráarkerfið utan stöðumöppunnar, engin ný forréttindi og skýr tímatakmörk. Aðskilnaður daemons og notendaaðgerðar er þess virði út af fyrir sig, en hann er miklu meira virði þegar aðgerðin getur ekkert gert nema það eina sem þú samþykktir.