OpenVPN CAP_NET_ADMIN ginn ouni him root ze ginn
Eng Unit, déi als onprivilegéierte Benotzer start, brauch ëmmer nach de richtegen Capacitéitsset. Kontrolléiert d'Unit, de lafende Prozess an d'exec-Grenz, an där Rei.
Den Service start, de Log beschwéiert sech, datt en den tun-Apparat net kann opmaachen, an d'Routen erschéngen ni. Fuert capsh --print an Ärer Shell aus an cap_net_admin ass direkt do, wat de Feeler onméiglech ausgesi léisst. Wat tëschent Ärer Shell an der Unit ënnerscheet, ass den Iwwergang vun de Privilegien, net dem Kernel seng Bereetschaft d'Capacitéit ze ginn. Gitt déi véier Kontrollen hei drënner an der Rei duerch a stoppt bei der éischter, déi den Ënnerscheed erklärt.
Eng fehlend Capacitéit vun engem verstoppten Apparat trennen
Zwee Feeler gesinn aus der Logzeil gläich aus. E Prozess ouni CAP_NET_ADMIN kann den Tunnelinterface net uleeën oder konfiguréieren, an e Prozess, deem seng Sandbox /dev/net/tun verstoppt, kann en iwwerhaapt net opmaachen. Capacitéite bäisetze reparéiert den zweeten Fall net.
Kontrolléiert, ob den Apparat am Nummraum vum Service existéiert, ier Dir eppes ännert. PrivateDevices=yes ass eng üblech Haardungszeil, déi den tun-Knuet komplett ewech hëlt, an eng restriktiv ProtectSystem kann de Konfiguratiounspad nëmme liesbar maachen op eng Manéier, déi wéi e Berechtegungsfeeler gelies gëtt. Béid produzéiere Logzeilen, déi den Tunnel ernimmen, dofir kréien d'Capacitéite Schold. Bestätegt éischt, datt de Knuet do ass an opzemaachen ass, a gitt dann weider.
Wësst, wéi ee Capacitéitsset Dir ukuckt
Linux hält erlaabte, effektive, ierflechen, begrenzende an ambient Sätz, an den ambient Set ass deen, deen en exec vun engem Net-root-Benotzer iwwerlieft. Datei-Capacitéite op der Binär kënnen erlaabt an effektiv Rechter beim exec iwwerginn, awer nëmme soulaang nach näischt an der Kette deen Transfer blockéiert.
Hei féiert sudo d'Leit an d'Ier. Eng Kommando, déi duerch sudo -u laf, fänkt en neien Iwwergang vun de Privilegien un an den ambient Set ass fort, sou datt déiselwecht Kontroll, déi als root geléngt, do feelt. Den Déngschtmanager ass nach eng aner Iwwerleeung, an en vergëtt näischt ambient, ausser d'Unit seet et.
Gitt d'Capacitéit an der Unit, net an engem Wrapper
En minimale Serviceabschnitt fir en Tunnel, deen en Apparat muss uleeën an d'Routen installéieren, liest sech sou.
[Unit]
Description=OpenVPN client, office profile
After=network-online.target
[Service]
Type=notify
User=openvpn
Group=openvpn
NoNewPrivileges=yes
AmbientCapabilities=CAP_NET_ADMIN
CapabilityBoundingSet=CAP_NET_ADMIN
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/office.confAmbientCapabilities setzt d'Recht an den ambient Set, ier de Prozess start, an CapabilityBoundingSet verhënnert, datt de Prozess eppes baussent där Lëscht hält. NoNewPrivileges=yes blockéiert de Privileggegewënn duerch setuid oder Datei-Capacitéiten, wärend d'Capacitéit, déi d'Unit ausdrécklech gëtt, weider gëllt. Setzt CAP_NET_BIND_SERVICE nëmme bäi, wann de Service en nidderegen Port muss binden, a setzt ni CAP_SYS_ADMIN bäi, just well en Forenthread et gemaach huet.
Wann d'Unit d'Binär an sudo wéckelt, huelt de Wrapper ewech. systemd applizéiert schonn User=, an déi zousätzlech Schicht ass de warscheinlechste Grond, datt den ambient Set eidel ass.
Verifizéiert géint de lafende Prozess, net d'Unitdatei
Liest, wat de Manager tatsächlech applizéiert huet, a liest dann de Prozess, deen en erstallt huet.
unit=openvpn-client@office
systemctl show -p User -p AmbientCapabilities "$unit"
systemctl show -p MainPID --value "$unit" | xargs -r getpcaps
grep -E '^Cap(Eff|Amb)' /proc/$(systemctl show -p MainPID --value "$unit")/statusWann d'Unit d'Capacitéit oplëscht an CapEff se nach ëmmer net huet, iwwerschreift en drop-in d'Astellung oder en ExecStartPre-Schrëtt ännert d'Ëmwelt. Sicht den Unitnumm an den drop-in-Verzeechnisser, ier Dir unhëlt, datt d'Haaptdatei autoritativ ass, well eng méi spéit Datei stëll gewënnt. Wann souwuel d'Unit wéi och de Prozess d'Capacitéit weisen an den Tunnel nach ëmmer feelt, gitt zréck op d'Apparat- an d'Padkontrollen amplaz de begrenzende Set ze vergréisseren. E vergréisseren verstoppt déi richteg Ursaach a léisst de Service méi privilegéiert wéi virdrun.
Verléiert léiwer Privilegien nom Start
OpenVPN kann privilegéiert starten an dann iwwer seng eege user- an group-Optiounen op e onprivilegéierte Kont goen, woubäi persist-key an persist-tun den Tunnel duerno brauchbar halen. Dës Anuerdnung verengt d'Fënster, an där de Prozess Rechter huet, an et passt dacks besser wéi den ganzen Daemon onprivilegéiert mat permanente Capacitéiten ze starten.
Wéi ee Modell Dir och sicht, start d'Unit nei a widderhuelt d'Kontrollen no engem Neistart, well e Service, deen aus enger interaktiver root-Shell funktionéiert an beim Boot feelt, meeschtens en Ënnerscheed bei Capacitéit, Apparat oder Dateiberechtegung ass. Notéiert d'Unitastellunge niewent der Capacitéitsausgab vum Prozess, sou datt déi nächst Prüfung gesäit, ob e Packageupdate oder en drop-in d'Grenz verschob huet.