Eng VPN-Aktioun no der Verbindung als Benutzer ausféieren, net als Daemon
Eng Ëmweltvariabel mat USER=alice ännert net, ënner wéiem Kont en Hook leeft. Trenn den Evenement, den Ausléiser an d’Aktioun, a bewäis duerno d’UID.
D’Verbindungs-Hooke vun engem VPN-Daemon lafen als den Daemon, an dat heescht meeschtens, datt se als root lafen. Dee Moment, wou ee vun dësen Hooke an engem sengen Home-Verzeechnes schreift oder en Desktop-Helfer nei start, hutt Dir engem Netzwierk-Evenement d’Fäegkeet ginn, als e beliebegen lokale Benutzer ze handelen. De gewéinlechen Ofkierzung, e Benutzernumm aus enger Ëmweltvariabel ze liesen an en weiderzeginn, behieft dat net. Et gëtt der Aktioun just en anert Etikett, ouni ze änneren, wéi Kont se ausféiert. Wat funktionéiert, ass eng Dräi-Deeler-Iwwergab, an där de privilegéierte Schrëtt seet, wat geschitt ass, an eng separat Eenheet d’Handlung ënner der richteger Identitéit mécht.
E Benutzernumm an der Ëmwelt ass keen Identitéits-Schalter
Unix entscheet, wat e Prozess dierf beréieren, unhand vu senger effektiver Benutzer-ID, net vun de Stringen an senger Ëmwelt. USER=alice ze setzen oder LOGNAME z’exportéieren ännert, wat onvirsiichteg Software an hirem Output dréckt; et ännert näischt un de Kontrollen vum Fichierbesëtz. En Hook, deen als root leeft mat dëser Variabel, mécht nach ëmmer dem Alice seng Fichieren als root op.
D’Nimm sinn och net dee selwechten Numm. De Login fir den Fernzougrëff, de lokalen Unix-Kont an den allgemenge Numm vum Zertifikat sinn dräi Identifikatoren, déi dacks iwwerenee falen an heiansdo net. E Benutzer, deen sech als a.smith authentifizéiert, huet vläicht guer kee lokale Kont, oder gëtt iwwer en Verzeechnesdéngscht op asmith gemappt. All Design, dat unhëlt, ee String déngt allen dräi Rollen, brécht beim éischten Handwierker.
Dofir ass déi éischt Fro net «wéi ee Benutzer ass verbonnen», mä «wéi ee lokale Kont dierf dës Aktioun ausféieren». Äntwert dorop aus Ärer eegener Kontendatebank, net aus deem, wat de Client geschéckt huet:
id -u alice
getent passwd alice | cut -d: -f1,3,6
stat -c '%U:%G %a %n' /home/alice/.local/state/vpn-status.json
Den drëtte Kommando ass deen, deen d’Leit iwwersprangen. Wann d’Zilfichier dem root gehéiert, well den virege Hook en ugeluecht huet, da wäert eng richteg konfiguréiert Benutzerakt mat engem Berechtegungsfeeler feelen, dee wéi e systemd-Problem ausgesäit an keent ass.
Den Daemon bleift, wou en ass
Dem VPN-Service säin eegene User= op den Alice z’änneren ass de falsche Grëff. Et ännert, wéi den Daemon Interfaces bind, Schlësselen liest, seng Statusfichier schreift a Route geréiert, an et verréckelt all dee Risiko an eng Eenheet, déi funktionéiert huet. Den Daemon brauch seng Privilegien; d’Nofollegakt net.
Kuckt, wat d’Eenheet tatsächlech mécht, ier Dir se beréiert. Zwee Kommandoen soen Iech d’Ausféierungsidentitéit an déi genau Kommandozeilen, déi gëllen, inklusiv alles, wat en Iwwerschreiwen derbäigemaach huet:
systemctl show -p User -p Group -p ExecStart openvpn-server@server
systemctl cat openvpn-server@server
Bei enger Standard-Paketinstallatioun ass den Daemon root an de Skript --up ierft dat. Bestätegt et, amplaz et unzehuelen, well eng gehärtet Distributioun en op en eegene Kont verluecht ka hunn, an en handgeschriwwenen Drop-in den Hook iwwer en Ëmmantel mat anere Regele ka lafen loossen.
Dräi genannt Deeler, een enke Ausléiser
D’Anuerdnung, déi d’Ënnerhalt iwwerlieft, huet en Evenement, en Ausléiser an eng Aktioun. Den Daemon mellt, datt eng genannt Sessioun eropkomm ass. En Ausléiser hëlt déi kleng Tatsaach un a freet no enger fixer Aktioun. D’Aktioun leeft ënner deem lokale Kont, deem d’Fichiere gehéieren, déi se beréiert. Näischt an der Kette hëlt ene belibegen Kommandoswee un.
D’Aktioun selwer ass eng gewéinlech Service-Eenheet, an d’Identitéit ass eng eenzeg Direktiv dran:
[Service]
Type=oneshot
User=alice
Group=alice
ExecStart=/usr/local/bin/refresh-vpn-status --slot %i
Notéiert, datt User=alice fir déi ganz Eenheet gëllt, an systemd dokumentéiert eng Ausnam, déi et wäert ass ze kennen: e Kommando mat dem Prefix + leeft onofhängeg dovun mat alle Privilegien. Dee Prefix ass e legitimit Instrument fir een eenzegen privilegéierte Schrëtt an eng bequem Manéier, déi Trennung, déi Dir just gebaut hutt, ëmzegoen, also behandelt all + an där Eenheet als eppes, wat an der Iwwerpréiwung muss gerechtfäerdegt ginn.
Hält den Input vum Ausléiser minimal an net geheim. De Sessiouns-Identifikator, de gemappte Kont an en Zäitstempel sinn normalerweis alles, wat néideg ass. Gitt ni e Shell-Fragment, en ausféierbare Wee oder en Ëmweltblock vum Client iwwer d’Grenz, well d’Säit, déi en empfängt, keen Wee huet, e legitime Wäert vun engem injizéierten ze ënnerscheeden.
Iwwerpréift d’Identitéit, déi tatsächlech gelaf ass
D’Iwwerpréiwung vun der Konfiguratioun ass kee Beweis. Nom enger geneemegter Testverbindung bestätegt d’UID, déi de Fichier beréiert huet, an d’UID, déi den Daemon nach benotzt:
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
Déi éischt Linn sollt den Alice an en Zäitstempel an Ärem Testfënster weisen. Déi zweet sollt nach ëmmer root oder de Servicekont vum Paket weisen, wat bewäist, datt den Daemon sech net geréckelt huet. Déi drëtt ass dee bëllegste Wee, d’Berechtegungen vun der Aktioun ze testen, ouni op eng richteg Reconnectioun ze waarden.
Wann de Besëtzer vum Fichier den Alice ass, awer seng Grupp oder säi Modus sech tëscht de Läif geännert huet, sicht no engem UMask= oder engem Ënnerscheed vun de Verzeechnesberechtegungen an net no engem Logikfeeler. Wann den Zäitstempel sech guer net geréckelt huet, ass den Ausléiser ni ausgeléist ginn, an de nützlechsten nächste Schrëtt ass journalctl -u fir d’Aktiouns-Eenheet an net nach eng Client-Reconnectioun.
Wat en Verbindungsevenement nach ëmmer net bewäist
En etabléierten Tunnel ass eng eenzeg Tatsaach. Et heescht net, datt d’Desktop-Sessioun opgespaart ass, de Sessiounsbus erreechbar ass, oder datt déi privat Ressource, déi d’Aktioun well, schonn disponibel ass. Eng oneshot-Eenheet ënner dem Alice senger UID huet hir Identitéit an näischt vun hirer Sessioun, dofir muss alles, wat e grafesche Bus brauch, iwwer dee ënnerstëtzte Benutzersessiouns-Mechanismus goen an definéieren, wat geschitt, wann se ausgeloggt ass.
Reconnectiounen widderhuelen sech och. En Laptop, deen am Zuch schléift, kann eng Dosen Verbindungsevenementer an enger Stonn produzéieren, an en Hook, deen all Kéier eng Zeil derbäisetzt, mécht aus enger Statusfichier e Log, deen keen liesen kann. Maacht d’Aktioun idempotent, oder loosst se eng eenzeg Opzeechnung ersetzen, déi no der Sessioun geschlësselt ass.
Schlussendlech begrenzt de Schuedradius an der Eenheet selwer: eng nëmme liesbar Vue vum Dateiesystem ausserhalb vum Statusverzeechnes, keng nei Privilegien an en expliziten Timeout. D’Trennung tëscht Daemon a Benutzerakt ass et wäert fir sech selwer, mä se ass vill méi wäert, wann d’Aktioun näischt anescht ka maachen wéi déi eng Saach, déi Dir geneemegt hutt.