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:

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

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.

Povezani članci