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:

OperationUsual authorityWatch for
Create or configure tun/tapCAP_NET_ADMIN in the relevant namespaceCreating the device and opening it are separate steps
Add routes, rules, firewall entriesCAP_NET_ADMINSame capability, different namespace than you think
Open /dev/net/tunDevice permissions, not a capabilityGroup membership or a udev rule may be enough
Raw socketsCAP_NET_RAWNeeded by some user-space tunnel implementations
Bind a port below 1024CAP_NET_BIND_SERVICEIrrelevant 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.

Susiję straipsniai