Koje Linux sposobnosti su potrebne vašem VPN procesu?
Postavljanje interfejsa, rute, pristup uređajima i obični soketi su odvojene privilegije. Navedite operaciju koja je neuspjela prije nego što dodijelite CAP_NET_ADMIN.
VPN daemon treba privilegovane mrežne operacije iako obične aplikacije otvaraju odlazne sokete bez ikakve privilegije. Taj jaz je mjesto gdje počinje većina grešaka sa sposobnostima: neko vidi grešku dozvole, dodijeli cijeli skup, a usluga radi iz razloga koje kasnije niko ne može objasniti. Prikaz ispod počinje od neuspjele operacije, preslikava je na jedan autoritet, a zatim provjerava kontekst u kojem proces zaista radi. Rad kao neograničeni root valjan je odgovor za neka postavljanja, ali to treba biti odluka, a ne zadana vrijednost.
Pođite od operacije koja je neuspjela
Pročitajte grešku prije nego što pročitate tutorijal. «Operacija nije dozvoljena» pri promjeni interfejsa, odbijanje otvaranja čvora uređaja i neuspjelo povezivanje na nizak port tri su različita problema s tri različite dozvole. Ako se proces pokrene i ne uspije samo pri prvoj promjeni rute, to također govori da je kreiranje interfejsa već uspjelo, što odgovor znatno sužava.
Reproducirajte neuspjeh dok je usluga zaustavljena, zatim je pokrenite u prvom planu pod istim korisnikom ako implementacija to dozvoljava. Greška koju vidite bolja je od linije dnevnika koju morate nagađati, i čini očiglednom razliku između problema sa sposobnostima i odbijanja SELinuxa ili AppArmora.
Preslikajte svaku operaciju na jedan autoritet
Tabela je početna mapa, a ne zamjena za dokumentaciju implementacije:
| 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 reda u toj tabeli su oni koje ljudi miješaju. Otvaranje /dev/net/tun pitanje je dozvole za datoteku; zahtjev jezgru da konfiguriše ono što ste otvorili pitanje je sposobnosti. Dodjela CAP_NET_ADMIN ne popravlja čvor uređaja koji vaš korisnik usluge ne može čitati, a popravljanje čvora ne daje vam autoritet nad rutama. Provjerite oboje prije nego što promijenite bilo šta.
WireGuard u jezgru i tunelski programi u korisničkom prostoru također nemaju iste zahtjeve. Put preko modula jezgra konfiguriše postojeći interfejs kroz netlink, dok implementacija u korisničkom prostoru može trebati i uređaj, a za neke transporte i sirove sokete.
Pročitajte kontekst: usluga, kontejner ili ljuska
Sposobnost u mrežnom prostoru imena hosta može uticati mnogo više od iste operacije u namjerno izolovanom steku. Kontejnersko okruženje obično počinje sa smanjenim skupom granica; dodavanje NET_ADMIN kontejneru koji dijeli mrežu hosta mnogo je veća dozvola od dodavanja onom s vlastitim mrežnim prostorom imena i bez montiranja hosta.
Za systemd jedinice čitajte šta se stvarno primjenjuje, a ne šta se čini da jedinična datoteka kaže: systemctl show -p CapabilityBoundingSet -p AmbientCapabilities prijavljuje efektivne vrijednosti, koje može postaviti drop-in koji ste zaboravili. Tražite efektivnu vrijednost, nikad namjeravanu. Ambient sposobnosti su važne jer usluga koja nije root gubi sposobnosti kroz exec bez njih.
Koristite podržano postavljanje paketa ili slike kao osnovu. Ne dodajte dozvole za sirove sokete ili privilegovani način zato što ih je drugi tutorijal naveo za drugi alat; to zaključivanje ništa ne prenosi i košta vas izolacije koju ste platili. Kad sumnjate, ne dodjeljujte ništa i pročitajte napomene implementacije za tačnu operaciju koja vam treba.
Gledajte šta se dešava nakon pada privilegija
Mnogi daemoni počinju privilegovano, konfigurišu interfejs, zatim pređu na neprivilegovanog korisnika i zadrže tunel. Od te točke proces više ne može dodati rutu, prepisati pravilo firewall-a ili otvoriti novi privilegovani uređaj, što je u redu dok ponovno povezivanje ne zatraži upravo to. Kasnija čitanja datoteka i izvršavanje hook-ova mogu neuspjeti iz istog razloga.
Testirajte cijeli životni ciklus, a ne prvu sekundu: pokretanje, obnavljanje ili ponovno povezivanje i čišćenje pri zaustavljanju. Prvo uspješno kreiranje interfejsa ne dokazuje da će svaka kasnija privilegovana operacija raditi, a neuspjeh se obično pojavi satima kasnije u produkciji.
Implementacije koje drže tunel otvoren tokom promjene korisnika obično to uparuju s opcijama za čuvanje tunela i ključeva. Na systemd strani ekvivalentno pitanje je preživljava li skup sposobnosti jedinice promjenu korisnika koju ste konfigurisali.
Zapišite dozvolu i njen razlog
Zapišite tačnu dozvolu, operaciju koju omogućava i grešku koju je ispravila. Jedan red u napomenama za postavljanje — «CAP_NET_ADMIN u mrežnom prostoru imena jedinice, potreban za promjene ruta nakon ponovnog povezivanja» — dovoljan je da spriječi sljedeću osobu da ponovo proširi dozvolu.
Zatim ponovo pročitajte efektivni skup nakon svakog nadograđivanja. Dobavljači dodaju funkcije, slike mijenjaju zadane vrijednosti, a sposobnost koja je prošle godine bila nepotrebna može postati nosiva bez da iko primijeti.