Koje Linux mogućnosti treba vaš VPN proces?
Postavljanje interfejsa, rute, pristup uređajima i obični soketi su odvojene privilegije. Imenujte operaciju koja nije uspela pre nego što dodelite CAP_NET_ADMIN.
VPN demon treba privilegovane mrežne operacije iako obične aplikacije otvaraju odlazne sokete bez ikakve privilegije. U tom jazu počinje većina grešaka sa mogućnostima: neko vidi grešku dozvole, dodeli ceo skup, a usluga radi iz razloga koje kasnije niko ne može objasniti. Prikaz ispod počinje od neuspele operacije, preslikava je na jedan autoritet i zatim proverava kontekst u kome proces zaista radi. Rad kao neograničeni root valjan je odgovor za neka postavljanja, ali to treba da bude odluka, a ne podrazumevana vrednost.
Pođite od operacije koja nije uspela
Pročitajte grešku pre nego što pročitate uputstvo. «Operacija nije dozvoljena» pri promeni interfejsa, odbijanje otvaranja čvora uređaja i neuspelo povezivanje na nizak port tri su različita problema sa tri različite dozvole. Ako se proces pokrene i ne uspe samo pri prvoj promeni rute, to takođe govori da je kreiranje interfejsa već uspelo, što odgovor znatno sužava.
Reprodukujte neuspeh 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 da pogađate, i čini očiglednom razliku između problema sa mogućnostima i odbijanja SELinuxa ili AppArmora.
Preslikajte svaku operaciju na jedan autoritet
Tabela je početna mapa, a ne zamena 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 mešaju. Otvaranje /dev/net/tun pitanje je dozvole za datoteku; zahtev jezgru da konfiguriše ono što ste otvorili pitanje je mogućnosti. Dodela CAP_NET_ADMIN ne popravlja čvor uređaja koji vaš korisnik usluge ne može da čita, a popravljanje čvora ne daje vam autoritet nad rutama. Proverite oboje pre nego što promenite bilo šta.
WireGuard u jezgru i tunelski programi u korisničkom prostoru takođe nemaju iste zahteve. Put kroz modul jezgra konfiguriše postojeći interfejs preko netlinka, dok implementacija u korisničkom prostoru može da treba i uređaj, a za neke prenose i sirove sokete.
Pročitajte kontekst: usluga, kontejner ili ljuska
Mogućnost u mrežnom prostoru imena hosta može uticati mnogo više od iste operacije u namerno izolovanom steku. Kontejnersko okruženje obično počinje sa smanjenim skupom granica; dodavanje NET_ADMIN kontejneru koji deli mrežu hosta mnogo je veća dozvola od dodavanja onom sa sopstvenim mrežnim prostorom imena i bez montiranja hosta.
Za systemd jedinice čitajte šta se stvarno primenjuje, a ne šta se čini da jedinična datoteka kaže: systemctl show -p CapabilityBoundingSet -p AmbientCapabilities prijavljuje efektivne vrednosti, koje može postaviti drop-in koji ste zaboravili. Tražite efektivnu vrednost, nikad nameravanu. Ambient mogućnosti su važne jer usluga koja nije root gubi mogućnosti kroz exec bez njih.
Uzmite podržano postavljanje paketa ili slike kao osnovu. Ne dodajte dozvole za sirove sokete ni privilegovani režim zato što ih je drugo uputstvo navelo za drugi alat; to zaključivanje ništa ne prenosi i košta vas izolacije koju ste platili. Kad sumnjate, ne dodeljujte ništa i pročitajte beleške implementacije za tačnu operaciju koja vam treba.
Gledajte šta se dešava posle pada privilegija
Mnogi demoni počinju privilegovano, konfigurišu interfejs, zatim pređu na neprivilegovanog korisnika i zadrže tunel. Od te tačke proces više ne može da doda rutu, prepiše pravilo vatrozida ili otvori novi privilegovani uređaj, što je u redu dok ponovno povezivanje ne zatraži upravo to. Kasnija čitanja datoteka i izvršavanje kukica mogu da ne uspeju iz istog razloga.
Testirajte ceo životni ciklus, a ne prvu sekundu: pokretanje, obnavljanje ili ponovno povezivanje i čišćenje pri zaustavljanju. Prvo uspešno kreiranje interfejsa ne dokazuje da će svaka kasnija privilegovana operacija raditi, a neuspeh se obično pojavi satima kasnije u produkciji.
Implementacije koje drže tunel otvoren tokom promene korisnika obično to povezuju sa opcijama za čuvanje tunela i ključeva. Na strani systemda ekvivalentno pitanje je da li skup mogućnosti jedinice preživljava promenu korisnika koju ste konfigurisali.
Zapišite dodelu i njen razlog
Zapišite tačnu dodelu, operaciju koju omogućava i grešku koju je ispravila. Jedan red u beleškama za postavljanje — «CAP_NET_ADMIN u mrežnom prostoru imena jedinice, potreban za promene ruta posle ponovnog povezivanja» — dovoljan je da spreči sledeću osobu da ponovo proširi dodelu.
Zatim ponovo pročitajte efektivni skup posle svakog nadograđivanja. Dobavljači dodaju funkcije, slike menjaju podrazumevane vrednosti, a mogućnost koja je prošle godine bila nepotrebna može postati nosiva bez da iko primeti.