Koje Linux sposobnosti treba vaš VPN proces?
Postavljanje sučelja, rute, pristup uređajima i obični sockete odvojena su ovlaštenja. Imenujte operaciju koja nije uspjela prije nego dodijelite CAP_NET_ADMIN.
VPN daemon treba privilegirane mrežne operacije iako obične aplikacije otvaraju odlazne sockete bez ikakvog ovlaštenja. U tom jazu počinje većina pogrešaka sa sposobnostima: netko vidi pogrešku dopuštenja, dodijeli cijeli skup, a usluga radi iz razloga koje kasnije nitko ne može objasniti. Prikaz u nastavku počinje od neuspjele operacije, preslikava je na jedno ovlaštenje i zatim provjerava kontekst u kojem proces doista radi. Rad kao neograničeni root valjan je odgovor za neka postavljanja, ali to bi trebala biti odluka, a ne zadana vrijednost.
Pođite od operacije koja nije uspjela
Pročitajte pogrešku prije nego što pročitate uputu. «Operacija nije dopuštena» pri promjeni sučelja, odbijanje otvaranja čvora uređaja i neuspjelo povezivanje na nizak port tri su različita problema s tri različita dopuštenja. Ako se proces pokrene i ne uspije samo pri prvoj promjeni rute, to također govori da je stvaranje sučelja 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 dopušta. Pogreška koju vidite bolja je od retka u dnevniku koji morate nagađati, i čini očitom razliku između problema sa sposobnostima i odbijanja SELinuxa ili AppArmora.
Preslikajte svaku operaciju na jedno ovlaštenje
Tablica je početna karta, 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 retka u toj tablici su ona koja ljudi miješaju. Otvaranje /dev/net/tun pitanje je dopuštenja za datoteku; zahtjev jezgri da konfigurira 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 ovlaštenje nad rutama. Provjerite oboje prije nego što promijenite bilo što.
WireGuard u jezgri i tunelski programi u korisničkom prostoru također nemaju iste zahtjeve. Put kroz modul jezgre konfigurira postojeće sučelje preko netlinka, dok implementacija u korisničkom prostoru može trebati i uređaj, a za neke prijenose i sirove sockete.
Pročitajte kontekst: usluga, kontejner ili ljuska
Sposobnost u mrežnom prostoru imena hosta može utjecati mnogo više od iste operacije u namjerno izoliranom stogu. Kontejnersko okruženje obično počinje sa smanjenim skupom granica; dodavanje NET_ADMIN kontejneru koji dijeli mrežu hosta mnogo je veće dopuštenje od dodavanja onom s vlastitim mrežnim prostorom imena i bez montiranja hosta.
Za systemd jedinice čitajte što se stvarno primjenjuje, a ne što 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.
Uzmite podržano postavljanje paketa ili slike kao osnovu. Ne dodajte dopuštenja za sirove sockete ni privilegirani način zato što ih je druga uputa navela za drugi alat; to zaključivanje ništa ne prenosi i stoji vas izolacije koju ste platili. Kad sumnjate, ne dodjeljujte ništa i pročitajte bilješke implementacije za točnu operaciju koja vam treba.
Gledajte što se događa nakon pada ovlaštenja
Mnogi daemoni počinju privilegirano, konfiguriraju sučelje, zatim prijeđu na neprivilegiranog korisnika i zadrže tunel. Od te točke proces više ne može dodati rutu, prepisati pravilo vatrozida ili otvoriti novi privilegirani uređaj, što je u redu dok ponovno povezivanje ne zatraži upravo to. Kasnija čitanja datoteka i izvršavanje hookova mogu ne uspjeti iz istog razloga.
Testirajte cijeli životni ciklus, a ne prvu sekundu: pokretanje, obnavljanje ili ponovno povezivanje i čišćenje pri zaustavljanju. Prvo uspješno stvaranje sučelja ne dokazuje da će svaka kasnija privilegirana operacija raditi, a neuspjeh se obično pojavi satima kasnije u produkciji.
Implementacije koje drže tunel otvoren tijekom promjene korisnika obično to povezuju s mogućnostima čuvanja tunela i ključeva. Na strani systemda ekvivalentno pitanje je preživljava li skup sposobnosti jedinice promjenu korisnika koju ste konfigurirali.
Zapišite dodjelu i njezin razlog
Zapišite točnu dodjelu, operaciju koju omogućuje i pogrešku koju je ispravila. Jedan redak u bilješkama 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 ponovno proširi dodjelu.
Zatim ponovno 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 itko primijeti.