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:

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 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.

Povezani članci