Kokių Linux galimybių reikia jūsų VPN procesui?
Sąsajos sąranka, maršrutai, prieiga prie įrenginių ir įprasti lizdai yra atskiri privilegijų lygmenys. Įvardykite nepavykusią operaciją prieš suteikdami CAP_NET_ADMIN.
VPN demonui reikia privilegijuotų tinklo operacijų, nors įprastos programos atidaro išeinančius lizdus visiškai be jokių privilegijų. Būtent šiame tarpelyje prasideda dauguma galimybių klaidų: kas nors pamato leidimų klaidą, suteikia visą rinkinį, o paslauga veikia dėl priežasčių, kurių vėliau niekas negali paaiškinti. Toliau pateikta eiga prasideda nuo nepavykusios operacijos, susieja ją su vienu įgaliojimu ir tada patikrina kontekstą, kuriame procesas iš tikrųjų veikia. Veikimas kaip neribotas root yra tinkamas atsakymas kai kuriems diegimams, bet tai turėtų būti sprendimas, o ne numatytoji reikšmė.
Pradėkite nuo nepavykusios operacijos
Perskaitykite klaidą prieš skaitydami mokymo medžiagą. „Operacija neleidžiama“ keičiant sąsają, atsisakymas atidaryti įrenginio mazgą ir bind klaida žemame porte yra trys skirtingos problemos su trimis skirtingais leidimais. Jei procesas paleidžiamas ir nepavyksta tik pirmojo maršruto pakeitimo metu, tai taip pat reiškia, kad sąsajos sukūrimas jau pavyko, o tai gerokai susiaurina atsakymą.
Atkurkite klaidą sustabdžius paslaugą, tada paleiskite ją priekiniame plane tuo pačiu naudotoju, jei diegimas tai leidžia. Klaida, kurią matote, yra geriau nei žurnalo eilutė, kurią reikia spėti, ir ji aiškiai parodo skirtumą tarp galimybių problemos ir SELinux ar AppArmor atsisakymo.
Susiekite kiekvieną operaciją su vienu įgaliojimu
Lentelė yra pradinis žemėlapis, o ne diegimo dokumentacijos pakaitalas:
| 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 |
Dvi tos lentelės eilutės yra tos, kurias žmonės painioja. Atidaryti /dev/net/tun yra failo leidimų klausimas; prašyti branduolio sukonfigūruoti tai, ką atidarėte, yra galimybių klausimas. CAP_NET_ADMIN suteikimas nepataiso įrenginio mazgo, kurio jūsų paslaugos naudotojas negali perskaityti, o mazgo pataisymas nesuteikia jums maršruto įgaliojimo. Patikrinkite abu prieš keisdami bet kurį.
Branduolio WireGuard ir vartotojo erdvės tunelių programos taip pat neturi identiškų reikalavimų. Branduolio modulio kelias konfigūruoja esamą sąsają per netlink, o vartotojo erdvės diegimas taip pat gali reikalauti įrenginio ir kai kuriems transportams neapdorotų lizdų.
Perskaitykite kontekstą: paslauga, konteineris ar apvalkalas
Galimybė pagrindinio kompiuterio tinklo vardų erdvėje gali turėti daug didesnį poveikį nei ta pati operacija tyčia izoliuotame rietuvėje. Konteinerių vykdymo aplinka paprastai pradedama nuo sumažinto ribų rinkinio; NET_ADMIN pridėjimas prie konteinerio, kuris dalijasi pagrindinio kompiuterio tinklu, yra daug didesnis leidimas nei jo pridėjimas prie konteinerio su savo tinklo vardų erdve ir be pagrindinio kompiuterio prijungimų.
Systemd unitams skaitykite, kas iš tikrųjų taikoma, o ne tai, ką tarsi sako unit failas: systemctl show -p CapabilityBoundingSet -p AmbientCapabilities praneša efektyvias reikšmes, kurias gali būti nustatęs pamirštas drop-in. Prašykite efektyvios reikšmės, niekada – numatytosios. Ambient galimybės svarbios, nes ne root paslauga praranda galimybes per exec be jų.
Kaip pagrindą imkite palaikomą paketo ar atvaizdžio sąranką. Nepridėkite neapdorotų lizdų leidimų ar privilegijuoto režimo vien todėl, kad kitas vadovas juos išvardijo kitam įrankiui; toks samprotavimas nieko neperkelia ir kainuoja jūsų sumokėtą izoliaciją. Jei abejojate, nieko nesuteikite ir perskaitykite diegimo pastabas dėl tikslios operacijos, kurios jums reikia.
Stebėkite, kas nutinka po privilegijų kritimo
Daugelis demonų paleidžiami su privilegijomis, sukonfigūruoja sąsają, tada pereina prie naudotojo be privilegijų ir išlaiko tunelį. Nuo to momento procesas nebegali pridėti maršruto, perrašyti ugniasienės taisyklės ar atidaryti naujo privilegijuoto įrenginio, o tai gerai, kol pakartotinis prisijungimas pareikalauja būtent to. Vėlesnis failų skaitymas ir kabliukų vykdymas gali nepavykti dėl tos pačios priežasties.
Išbandykite visą gyvavimo ciklą, o ne pirmąją sekundę: paleidimą, atnaujinimą ar pakartotinį prisijungimą ir valymą sustabdžius. Pirmasis sėkmingas sąsajos sukūrimas neįrodo, kad kiekviena vėlesnė privilegijuota operacija vis dar veiks, o klaida paprastai pasirodo po kelių valandų produkcijoje.
Diegimai, kurie išlaiko tunelį atidarytą per naudotojo pakeitimą, paprastai tai derina su parinktimis išsaugoti tunelį ir raktus. Systemd pusėje lygiavertis klausimas yra, ar unito galimybių rinkinys išgyvena jūsų sukonfigūruotą naudotojo pakeitimą.
Užrašykite suteiktą leidimą ir jo priežastį
Užrašykite tikslų leidimą, operaciją, kurią jis įgalina, ir klaidą, kurią jis ištaisė. Viena eilutė diegimo pastabose — „CAP_NET_ADMIN unito tinklo vardų erdvėje, reikalingas maršrutų pakeitimams po pakartotinio prisijungimo“ — pakanka, kad kitas žmogus vėl neišplėstų leidimo.
Tada po kiekvieno atnaujinimo dar kartą perskaitykite efektyvų rinkinį. Tiekėjai prideda funkcijų, atvaizdžiai keičia numatytąsias reikšmes, o galimybė, kuri pernai buvo nereikalinga, gali tapti laikančia niekam nepastebint.