Ktoré schopnosti Linuxu váš proces VPN potrebuje?
Nastavenie rozhrania, trasy, prístup k zariadeniam a bežné sockety sú oddelené oprávnenia. Pomenujte operáciu, ktorá zlyhala, pred udelením CAP_NET_ADMIN.
Démon VPN potrebuje privilegované sieťové operácie, aj keď bežné aplikácie otvárajú odchádzajúce sockety úplne bez oprávnení. Práve v tejto medzere začína väčšina chýb so schopnosťami: niekto uvidí chybu oprávnení, udelí celú sadu a služba funguje z dôvodov, ktoré potom nikto nedokáže vysvetliť. Nasledujúci postup začína pri zlyhanej operácii, priradí ju k jednému oprávneniu a potom skontroluje kontext, v ktorom proces skutočne beží. Prevádzka ako neobmedzený root je pre niektoré nasadenia platná odpoveď, ale malo by to byť rozhodnutie, nie predvolená hodnota.
Začnite pri operácii, ktorá zlyhala
Prečítajte chybu skôr, než začnete čítať návod. „Operácia nie je povolená“ pri zmene rozhrania, odmietnutie otvoriť uzol zariadenia a zlyhanie bind na nízkom porte sú tri rôzne problémy s tromi rôznymi oprávneniami. Ak sa proces spustí a zlyhá až pri prvej zmene trasy, znamená to aj to, že vytvorenie rozhrania už prebehlo úspešne, čo odpoveď výrazne zužuje.
Reprodukujte zlyhanie so zastavenou službou a potom ju spustite v popredí pod rovnakým používateľom, ak to implementácia umožňuje. Chyba, ktorú vidíte, je lepšia ako riadok v logu, ktorý musíte hádať, a zreteľne ukáže rozdiel medzi problémom so schopnosťami a odmietnutím SELinuxu alebo AppArmoru.
Priraďte každú operáciu jednému oprávneniu
Tabuľka je východisková mapa, nie náhrada dokumentácie implementácie:
| Operation | Usual authority | Watch for |
|---|---|---|
| Create or configure tun/tap | CAP_NET_ADMIN in the relevant namespace | Creating the device and opening it are separate steps |
| Add routes, rules, firewall entries | CAP_NET_ADMIN | Same capability, different namespace than you think |
| Open /dev/net/tun | Device permissions, not a capability | Group membership or a udev rule may be enough |
| Raw sockets | CAP_NET_RAW | Needed by some user-space tunnel implementations |
| Bind a port below 1024 | CAP_NET_BIND_SERVICE | Irrelevant for most modern tunnel ports |
Dva riadky v tejto tabuľke sú tie, ktoré si ľudia mýlia. Otvorenie /dev/net/tun je otázka oprávnení k súboru; požiadavka, aby jadro nakonfigurovalo to, čo ste otvorili, je otázka schopností. Udelenie CAP_NET_ADMIN neopraví uzol zariadenia, ktorý váš používateľ služby nemôže čítať, a oprava uzla vám nedá oprávnenie na trasy. Skontrolujte oboje, než zmeníte čokoľvek z toho.
WireGuard v jadre a tunelové programy v používateľskom priestore tiež nemajú rovnaké požiadavky. Cesta cez modul jadra konfiguruje existujúce rozhranie cez netlink, zatiaľ čo implementácia v používateľskom priestore môže potrebovať aj zariadenie a pre niektoré transporty surové sockety.
Prečítajte kontext: služba, kontajner alebo shell
Schopnosť v sieťovom mennom priestore hostiteľa môže ovplyvniť oveľa viac než tá istá operácia v zámerne izolovanom zásobníku. Prostredie kontajnerov zvyčajne začína so zmenšenou sadou limitov; pridanie NET_ADMIN ku kontajneru, ktorý zdieľa sieť hostiteľa, je oveľa väčšie oprávnenie než pridanie ku kontajneru s vlastným sieťovým menným priestorom a bez pripojení z hostiteľa.
Pri jednotkách systemd čítajte, čo sa skutočne uplatňuje, a nie čo podľa súboru jednotky vyzerá: systemctl show -p CapabilityBoundingSet -p AmbientCapabilities hlási efektívne hodnoty, ktoré môže nastaviť drop-in, na ktorý ste zabudli. Pýtajte sa na efektívnu hodnotu, nikdy na zamýšľanú. Ambient schopnosti sú dôležité, pretože služba bez rootu stráca schopnosti pri exec bez nich.
Za základ berte podporované nastavenie balíka alebo image. Nepridávajte oprávnenia k surovým socketom ani privilegovaný režim len preto, že ich iný návod uviedol pre iný nástroj; taká úvaha nič neprenáša a stojí vás izoláciu, ktorú ste zaplatili. Ak si nie ste istí, nič neudeľujte a prečítajte si poznámky k implementácii pre presnú operáciu, ktorú potrebujete.
Sledujte, čo sa deje po poklese oprávnení
Mnohé démoni štartujú privilegovane, nakonfigurujú rozhranie, potom prejdú na neprivilegovaného používateľa a tunel si ponechajú. Od tej chvíle proces nemôže pridať trasu, prepísať pravidlo firewallu ani otvoriť nové privilegované zariadenie, čo je v poriadku, kým opätovné pripojenie nepotrebuje presne to. Neskoršie čítanie súborov a spúšťanie hookov môže zlyhať z rovnakého dôvodu.
Testujte celý životný cyklus, nie prvú sekundu: štart, obnovenie alebo opätovné pripojenie a čistenie pri zastavení. Prvé úspešné vytvorenie rozhrania nepreukazuje, že každá ďalšia privilegovaná operácia bude fungovať, a zlyhanie sa zvyčajne objaví až hodiny neskôr v produkcii.
Implementácie, ktoré držia tunel otvorený pri zmene používateľa, to zvyčajne spájajú s možnosťami zachovať tunel a kľúče. Na strane systemd je ekvivalentnou otázkou, či sada schopností jednotky prežije zmenu používateľa, ktorú ste nastavili.
Zapíšte oprávnenie aj jeho dôvod
Zapíšte presné oprávnenie, operáciu, ktorú umožňuje, a chybu, ktorú opravilo. Jeden riadok v poznámkach k nasadeniu — „CAP_NET_ADMIN v sieťovom mennom priestore jednotky, potrebný na zmeny trás po opätovnom pripojení“ — stačí na to, aby ďalší človek oprávnenie znova nerozšíril.
Potom po každej aktualizácii znova prečítajte efektívnu sadu. Dodávatelia pridávajú funkcie, image menia predvolené hodnoty a schopnosť, ktorá bola vlani zbytočná, sa môže stať nosnou, bez toho aby si to niekto všimol.