Katere zmogljivosti Linuxa potrebuje vaš VPN proces?
Nastavitev vmesnika, poti, dostop do naprav in običajne vtičnice so ločene pravice. Poimenujte operacijo, ki ni uspela, preden dodelite CAP_NET_ADMIN.
Daemon VPN potrebuje privilegirane omrežne operacije, čeprav običajne aplikacije odpirajo odhodne vtičnice povsem brez pravic. Prav v tej vrzeli se začne večina napak z zmogljivostmi: nekdo vidi napako pravic, dodeli celoten nabor, storitev pa deluje iz razlogov, ki jih pozneje nihče ne zna pojasniti. Sprehod spodaj se začne pri operaciji, ki ni uspela, jo poveže z eno pristojnostjo in nato preveri kontekst, v katerem proces dejansko teče. Delovanje kot neomejeni root je za nekatere namestitve veljaven odgovor, vendar bi moralo biti odločitev in ne privzeta vrednost.
Začnite pri operaciji, ki ni uspela
Preberite napako, preden preberete vodnik. »Operacija ni dovoljena« pri spremembi vmesnika, zavrnitev odpiranja vozlišča naprave in neuspešen bind na nizkem vratih so tri različne težave s tremi različnimi dovoljenji. Če se proces zažene in spodleti šele pri prvi spremembi poti, to pomeni tudi, da je ustvarjanje vmesnika že uspelo, kar odgovor precej zoži.
Ponovite napako z ustavljeno storitvijo in jo nato zaženite v ospredju pod istim uporabnikom, če izvedba to dovoljuje. Napaka, ki jo vidite, je boljša od vrstice v dnevniku, ki jo morate ugibati, in jasno pokaže razliko med težavo z zmogljivostmi in zavrnitvijo SELinuxa ali AppArmorja.
Vsako operacijo povežite z eno pristojnostjo
Tabela je začetni zemljevid, ne nadomestilo za dokumentacijo izvedbe:
| 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 |
Dve vrstici v tej tabeli sta tisti, ki jih ljudje zamenjujejo. Odpiranje /dev/net/tun je vprašanje dovoljenj za datoteko; zahteva, naj jedro nastavi to, kar ste odprli, je vprašanje zmogljivosti. Dodelitev CAP_NET_ADMIN ne popravi vozlišča naprave, ki ga uporabnik storitve ne more brati, popravilo vozlišča pa vam ne da pravice do poti. Preverite oboje, preden spremenite kar koli od tega.
WireGuard v jedru in tunelski programi v uporabniškem prostoru tudi nimajo enakih zahtev. Pot skozi modul jedra nastavi obstoječi vmesnik prek netlinka, medtem ko lahko izvedba v uporabniškem prostoru potrebuje tudi napravo in za nekatere prenose surove vtičnice.
Preberite kontekst: storitev, vsebnik ali lupina
Zmogljivost v omrežnem imenskem prostoru gostitelja lahko vpliva veliko bolj kot ista operacija v namenoma izoliranem skladu. Okolje za vsebnike se običajno začne z zmanjšanim naborom meja; dodajanje NET_ADMIN vsebniku, ki si deli omrežje gostitelja, je veliko večje dovoljenje kot dodajanje tistemu z lastnim omrežnim imenskim prostorom in brez priklopov gostitelja.
Pri enotah systemd berite, kaj se dejansko uporablja, in ne, kaj naj bi po datoteki enote veljalo: systemctl show -p CapabilityBoundingSet -p AmbientCapabilities poroča o učinkovitih vrednostih, ki jih je morda nastavil pozabljen drop-in. Vprašajte za učinkovito vrednost, nikoli za načrtovano. Zmogljivosti ambient so pomembne, ker storitev brez roota izgubi zmogljivosti pri exec brez njih.
Za osnovo vzemite podprto nastavitev paketa ali slike. Ne dodajajte dovoljenj za surove vtičnice ali privilegiranega načina samo zato, ker jih je drug vodnik navedel za drugo orodje; taka utemeljitev ničesar ne prenese in vas stane izolacije, ki ste jo plačali. Če ste v dvomih, ne dodelite ničesar in preberite opombe izvedbe za točno tisto operacijo, ki jo potrebujete.
Opazujte, kaj se zgodi po padcu pravic
Veliko daemonov se zažene privilegirano, nastavi vmesnik, nato preide na neprivilegiranega uporabnika in obdrži tunel. Od tega trenutka proces ne more več dodati poti, prepisati pravila požarnega zidu ali odpreti nove privilegirane naprave, kar je v redu, dokler ponovna povezava ne potrebuje točno tega. Poznejše branje datotek in izvajanje kljuk lahko spodleti iz istega razloga.
Preizkusite celoten življenjski cikel, ne prve sekunde: zagon, obnovitev ali ponovno povezavo in čiščenje ob ustavitvi. Prva uspešna ustvaritev vmesnika ne dokazuje, da bo vsaka poznejša privilegirana operacija še delovala, napaka pa se običajno pojavi ure pozneje v produkciji.
Izvedbe, ki držijo tunel odprt med menjavo uporabnika, to običajno povežejo z možnostmi za ohranitev tunela in ključev. Na strani systemd je enakovredno vprašanje, ali nabor zmogljivosti enote preživi menjavo uporabnika, ki ste jo nastavili.
Zapišite dodelitev in njen razlog
Zapišite točno dodelitev, operacijo, ki jo omogoča, in napako, ki jo je odpravila. Ena vrstica v opombah za namestitev — »CAP_NET_ADMIN v omrežnem imenskem prostoru enote, potreben za spremembe poti po ponovni povezavi« — zadostuje, da naslednjo osebo ustavi pred ponovnim širjenjem dodelitve.
Nato po vsaki nadgradnji znova preberite učinkovit nabor. Ponudniki dodajajo funkcije, slike spreminjajo privzete vrednosti in zmogljivost, ki je bila lani nepotrebna, lahko postane nosilna, ne da bi kdo opazil.