Exekutatu VPN konexio osteko ekintza erabiltzaile gisa, ez daemon gisa
USER=alice dioen ingurumen-aldagaiak ez du aldatzen zein konturekin exekutatzen den hook bat. Banandu gertaera, abiarazlea eta ekintza, eta gero frogatu UID-a.
VPN daemon baten konexio-hookak daemon gisa exekutatzen dira, eta horrek normalean esan nahi du root gisa exekutatzen direla. Hook horietako batek norbaiten hasierako direktorioan idazten duen edo mahaigaineko laguntzaile bat berrabiarazten duen unean, sareko gertaera bati edozein tokiko erabiltzaileren izenean jarduteko gaitasuna eman diozu. Ohiko lasterbideak, ingurumen-aldagai batetik erabiltzaile-izena irakurri eta pasatzeak, ez du hori konpontzen. Ekintza berriz etiketatzen du, baina ez du aldatzen zein kontuk exekutatzen duen. Funtzionatzen duena hiru zatiko eskualdaketa da: pauso pribilegiatuak zer gertatu den esaten du eta unitate bereizi batek ekintza identitate egokiarekin egiten du.
Ingurumenean dagoen erabiltzaile-izena ez da identitate-etengailu bat
Unixek prozesu batek zer ukitu dezakeen bere erabiltzaile-ID eraginkorrarekin erabakitzen du, ez bere ingurumeneko kateekin. USER=alice ezartzeak edo LOGNAME esportatzeak arretagabeko softwareak bere irteeran zer inprimatzen duen aldatzen du; fitxategien jabetza-egiaztapenetan ez du ezer aldatzen. Root gisa exekutatzen den hook batek, aldagai hori ezarrita, Alice-en fitxategiak root gisa irekitzen jarraitzen du.
Izenak ere ez dira izen bera. Urruneko sarbideko saioa, tokiko Unix kontua eta ziurtagiriaren izen arrunta hiru identifikatzaile dira, askotan bat etortzen direnak eta batzuetan ez. a.smith gisa autentifikatzen den erabiltzaileak agian ez du tokiko konturik bat ere, edo agian asmith-ra mapatzen da direktorio-zerbitzu baten bidez. Kate batek hiru rol horiek betetzen dituela suposatzen duen edozein diseinuk lehen kontratistarekin huts egingo du.
Beraz, lehen galdera ez da «zein erabiltzaile dago konektatuta» baizik eta «zein tokiko kontuk du ekintza hau egiteko baimena». Erantzun hori zure kontu-datu-baseetatik, bezeroak bidali duenetik ez:
id -u alice
getent passwd alice | cut -d: -f1,3,6
stat -c '%U:%G %a %n' /home/alice/.local/state/vpn-status.json
Hirugarren komandoa jendeak saltatzen duena da. Helburuko fitxategia root-ena bada aurreko hookak sortu zuelako, behar bezala konfiguratutako erabiltzaile-ekintza batek baimen-errore batekin huts egingo du, systemd arazoa dirudiena eta ez dena.
Daemona bere lekuan geratzen da
VPN zerbitzuaren User= propioa Alice-ra aldatzea palanka okerra da. Daemonak nola lotzen dituen interfazeak, nola irakurtzen dituen gakoak, nola idazten duen bere egoera-fitxategia eta nola kudeatzen dituen ibilbideak aldatzen ditu, eta arrisku hori guztia funtzionatzen zuen unitate batera eramaten du. Daemonak bere pribilegioak behar ditu; ondorengo ekintzak ez.
Begiratu unitateak benetan zer egiten duen ukitu aurretik. Bi komandok exekuzio-identitatea eta indarrean dauden komando-lerro zehatzak esaten dizkizute, gainidazketa batek gehitutakoa barne:
systemctl show -p User -p Group -p ExecStart openvpn-server@server
systemctl cat openvpn-server@server
Pakete-instalazio lehenetsi batean daemona root da eta --up scriptak hori heredatzen du. Egiaztatu hori suposatu beharrean, zeren distribuzio gogortu batek kontu dedikatu batera eraman zezakeen, eta eskuz idatzitako drop-in batek hooka beste arau batzuk dituen bilgarri baten bidez exekuta dezake.
Hiru zati izendatu, abiarazle estu bat
Mantentzeari eusten dion antolamenduak gertaera bat, abiarazle bat eta ekintza bat ditu. Daemonak izendatutako saio bat altxatu dela jakinarazten du. Abiarazle batek gertaera txiki hori onartzen du eta ekintza finko bat eskatzen du. Ekintza ukitzen dituen fitxategien jabea den tokiko kontuaren pean exekutatzen da. Kateko ezerk ez du komando-bide arbitrariorik onartzen.
Ekintza bera zerbitzu-unitate arrunta da, eta identitatea haren barruko direktiba bakarra da:
[Service]
Type=oneshot
User=alice
Group=alice
ExecStart=/usr/local/bin/refresh-vpn-status --slot %i
Kontuan izan User=alice unitate osoari aplikatzen zaiola, eta systemd-ek ezagutzea merezi duen salbuespen bat dokumentatzen duela: + aurrizkia duen komandoa pribilegio osoz exekutatzen da hala ere. Aurrizki hori pauso pribilegiatu bakarrerako tresna zilegia da eta orain eraiki berri duzun bereizketa desegiteko modu erosoa, beraz, unitate horretako edozein + berrikuspenean justifikatu beharreko zerbait bezala tratatu.
Mantendu abiarazlearen sarrera minimoa eta ez-sekretua. Saio-identifikatzailea, mapatutako kontua eta denbora-marka bat dira normalean beharrezko guztia. Inoiz ez pasa mugarren shell-zati bat, exekutagarri baten bidea edo bezeroak emandako ingurumen-bloke bat, hargailuak ez baitu modurik balio zilegi bat injektatutako batetik bereizteko.
Egiaztatu benetan exekutatu zen identitatea
Konfigurazioaren berrikuspena ez da froga. Onartutako proba-konexio baten ondoren, egiaztatu fitxategia ukitu zuen UID-a eta daemonak oraindik erabiltzen duen UID-a:
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
Lehen lerroak Alice eta zure proba-leihoaren barruko denbora-marka bat erakutsi behar lituzke. Bigarrenak oraindik root edo paketearen zerbitzu-kontua erakutsi behar luke, eta horrek frogatzen du daemona ez zela mugitu. Hirugarrena ekintzaren baimenak probatzeko modurik merkeena da benetako berrikonexio baten zain egon gabe.
Fitxategiaren jabea Alice bada baina haren taldea edo modua exekuzioen artean aldatu bada, bilatu UMask= bat edo direktorio-baimenen aldea, eta ez logika-errore bat. Denbora-marka batere ez bada mugitu, abiarazlea ez zen inoiz piztu, eta hurrengo pauso erabilgarria journalctl -u da ekintza-unitaterako, ez bezeroaren beste berrikonexio bat.
Konexio-gertaera batek oraindik frogatzen ez duena
Ezarritako tunel bat gertaera bakarra da. Ez du esan nahi mahaigaineko saioa desblokeatuta dagoenik, saio-busa irisgarria denik edo ekintzak nahi duen baliabide pribatua dagoenik. Aliceren UID-aren peko oneshot unitate batek haren identitatea du eta haren saiotik ezer ez, beraz bus grafikoa behar duen edozerk onartutako erabiltzaile-saio mekanismotik pasa behar du eta zehaztu zer gertatzen den hura saioa itxita dagoenean.
Berrikonexioak ere errepikatzen dira. Trenean lo egiten duen ordenagailu eramangarri batek dozena bat konexio-gertaera sor ditzake ordubetean, eta aldi bakoitzean lerro bat gehitzen duen hook batek egoera-fitxategi bat inork irakurri ezin duen erregistro bihurtzen du. Egin ekintza idempotente, edo utzi saioaren arabera giltzatutako erregistro bakar bat ordezkatzen.
Azkenik, mugatu kalte-eremua unitatean bertan: egoera-direktorioaz kanpoko irakurtzeko soilik den fitxategi-sistemaren ikuspegia, pribilegio berririk gabe eta itxaron-denboraldi esplizitu batekin. Daemonaren eta erabiltzaile-ekintzaren arteko bereizketa bere horretan merezi du, baina askoz gehiago merezi du ekintzak onartu duzun gauza bakarra ez beste ezer egin ezin duenean.