Fier in VPN-aksje nei ferbining út as de brûker, net as de daemon
In omjouwingsfariabele dy’t USER=alice seit, feroaret net ûnder hokker akkount in hook rint. Skied it barren, de trigger en de aksje, en bewiis dan de UID.
De ferbiningshooks op in VPN-daemon rinne as de daemon, en dat betsjut meastentiids dat se as root rinne. It momint dat ien fan dy hooks yn immen syn thúsmap skriuwt of in buroblêdhelper opnij start, hawwe jo in netwurkbarren de mooglikheid jûn om as in willekeurige lokale brûker te hanneljen. De gewoane fluchwei, in brûkersnamme út in omjouwingsfariabele lêze en trochjaan, reparearret dat net. It wernammet de aksje sûnder te feroarjen hokker akkount it útfiert. Wat wurket is in trijedielige oerdracht wêrby’t de befoarrjochte stap seit wat der bard is en in aparte ienheid de hanneling ûnder de juste identiteit docht.
In brûkersnamme yn de omjouwing is gjin identiteitsskeakel
Unix beslút wat in proses oanreitsje mei op grûn fan syn effektive brûkers-ID, net op grûn fan de strings yn syn omjouwing. USER=alice ynstelle of LOGNAME eksportearje feroaret wat slordige software yn syn útfier printsje; it feroaret neat oan eigendomskontrôles fan bestannen. In hook dy’t as root rint mei dy fariabele ynsteld, iepenet noch altyd Alice har bestannen as root.
De nammen binne ek net deselde namme. De oanmelding foar tagong op ôfstân, it lokale Unix-akkount en de mienskiplike namme fan it sertifikaat binne trije identifikatoaren dy’t faak gearfalle en soms net. In brûker dy’t him autentisearret as a.smith hat miskien hielendal gjin lokaal akkount, of wurdt fia in mapstsjinst op asmith mapt. Elk ûntwerp dat oannimt dat ien string alle trije rollen tsjinnet, sil by de earste oannimmer brekke.
Dat de earste fraach is net «hokker brûker is ferbûn» mar «hokker lokaal akkount mei dizze aksje útfiere». Beäntwurdzje dat út jo eigen akkountdatabase, net út wat de klant stjoerd hat:
id -u alice
getent passwd alice | cut -d: -f1,3,6
stat -c '%U:%G %a %n' /home/alice/.local/state/vpn-status.json
It tredde kommando is dejinge dy’t minsken oerslaan. As it doelbestân fan root is om’t de foarige hook it makke hat, sil in goed konfigurearre brûkersaksje mislearje mei in tastimmingflater dy’t op in systemd-probleem liket en dat net is.
De daemon bliuwt wêr’t er is
De eigen User= fan de VPN-tsjinst nei Alice feroarje is de ferkearde hefboom. It feroaret hoe’t de daemon ynterfaces bynt, kaaien lêst, syn statusbestân skriuwt en rûtes beheart, en it ferpleatst al dat risiko nei in ienheid dy’t wurke. De daemon hat syn foarrjochten nedich; de folgjende aksje net.
Sjoch wat de ienheid eins docht foardat jo it oanreitsje. Twa kommando’s fertelle jo de útfieringsidentiteit en de krekte kommandorigels dy’t jilde, ynklusyf alles wat in oerskriuwing tafoege hat:
systemctl show -p User -p Group -p ExecStart openvpn-server@server
systemctl cat openvpn-server@server
By in standert pakketynstallaasje is de daemon root en it skript --up urft dat. Befêstigje dat ynstee fan oan te nimmen, want in hurde distribúsje hat it miskien nei in wijd akkount ferpleatst, en in mei de hân skreaun drop-in kin de hook fia in wrapper mei oare regels rinne litte.
Trije neamde dielen, ien smelle trigger
De opstelling dy’t ûnderhâld oerlibbet hat in barren, in trigger en in aksje. De daemon rapportearret dat in neamde sesje omheech kaam. In trigger akseptearret dat lytse feit en freget om ien fêste aksje. De aksje rint ûnder it lokale akkount dat de bestannen besit dy’t it oanreitsje. Neat yn ’e keatling akseptearret in willekeurich kommandoppel.
De aksje sels is in gewoane tsjinstienheid, en de identiteit is ien rjochtline deryn:
[Service]
Type=oneshot
User=alice
Group=alice
ExecStart=/usr/local/bin/refresh-vpn-status --slot %i
Tink derom dat User=alice foar de hiele ienheid jildt, en systemd dokumintearret ien útsûndering dy’t it witten wurdich is: in kommando mei it foarheaksel + rint likegoed mei folsleine foarrjochten. Dat foarheaksel is in legitym ark foar ien befoarrjochte stap en in handige manier om de skieding dy’t jo krekt bouden ûngedien te meitsjen, behannelje dêrom elk + yn dy ienheid as eat dat by resinsje rjochtfeardige wurde moat.
Hâld de ynfier fan de trigger minimaal en net-geheim. De sesje-identifikator, it mapte akkount en in tiidstimpel binne meastentiids alles wat nedich is. Stjoer nea in shell-fragmint, in paad nei in útfierber bestân of in fan de klant levere omjouwingsblok oer de grins, want de ûntfangende kant hat gjin manier om in legitime wearde fan in ynjeksje te ûnderskieden.
Ferifiearje de identiteit dy’t wier rûn
Konfiguraasje-resinsje is gjin bewiis. Befêstigje nei in goedkarde testferbining de UID dy’t it bestân oanreit en de UID dy’t de daemon noch brûkt:
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
De earste rigel soe Alice sjen moatte litte en in tiidstimpel binnen jo testfinster. De twadde soe noch root of it tsjinstakkount fan it pakket sjen litte, wat bewiist dat de daemon net ferhuze is. De tredde is de goedkeapste manier om de tastimmingen fan de aksje te testen sûnder op in echte werferbining te wachtsjen.
As de eigner fan it bestân Alice is mar syn groep of modus is tusken rinnen feroare, sykje dan nei in UMask= of in ferskil yn mapstastimmingen ynstee fan in logikaflater. As de tiidstimpel hielendal net beweegde, is de trigger nea ôfgien, en de nuttige folgjende stap is journalctl -u foar de aksje-ienheid ynstee fan noch in klantwerferbining.
Wat in ferbiningsbarren noch altyd net bewiist
In fêstige tunnel is ien feit. It betsjut net dat de buroblêdsesje ûntskoattele is, de sesjebus berikber is of dat de partikuliere boarne dy’t de aksje wol al beskikber is. In oneshot-ienheid ûnder Alice har UID hat har identiteit en neat fan har sesje, dat alles wat in grafyske bus nedich hat moat fia it stipe brûkerssesjemeganisme gean en definiearje wat der bart as sy útlokke is.
Werferbiningen werhelje har ek. In laptop dy’t yn ’e trein sliept kin in dosijn ferbiningsbarrens yn in oere produsearje, en in hook dy’t elke kear in rigel taheakket makket fan in statusbestân in log dêr’t nimmen yn lêze kin. Meitsje de aksje idempotint, of lit it ien rekord ferfange dat op sesje kaaie is.
Behein úteinlik de skea-radius yn de ienheid sels: in allinnich-lês werjefte fan it bestânssysteem bûten de statusmap, gjin nije foarrjochten en in eksplisite tiidlimit. De skieding tusken daemon en brûkersaksje is op himsels de muoite wurdich, mar it is folle mear wurdich as de aksje neat oars dwaan kin as it iene ding dat jo goedkard hawwe.