Démon VPN potřebuje privilegované síťové operace, i když běžné aplikace otevírají odchozí sockety zcela bez oprávnění. Právě v této mezeře začíná většina chyb se schopnostmi: někdo uvidí chybu oprávnění, udělí celou sadu a služba funguje z důvodů, které pak nikdo nedokáže vysvětlit. Následující postup začíná u selhané operace, přiřadí ji k jedné pravomoci a poté zkontroluje kontext, ve kterém proces skutečně běží. Provoz jako neomezený root je pro některá nasazení platná odpověď, ale mělo by to být rozhodnutí, nikoli výchozí stav.

Začněte u operace, která selhala

Přečtěte chybu dřív, než začnete číst návod. „Operace není povolena“ při změně rozhraní, odmítnutí otevřít uzel zařízení a selhání bind na nízkém portu jsou tři různé problémy se třemi různými oprávněními. Pokud se proces spustí a selže až při první změně trasy, znamená to také, že vytvoření rozhraní už proběhlo úspěšně, což odpověď značně zužuje.

Reprodukujte selhání se zastavenou službou a poté ji spusťte v popředí pod stejným uživatelem, pokud to implementace umožňuje. Chyba, kterou vidíte, je lepší než řádek v logu, který musíte hádat, a zřejmě ukáže rozdíl mezi problémem se schopnostmi a odmítnutím SELinuxu nebo AppArmoru.

Přiřaďte každou operaci jedné pravomoci

Tabulka je výchozí mapa, nikoli náhrada dokumentace implementace:

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 řádky v této tabulce jsou ty, které si lidé pletou. Otevření /dev/net/tun je otázka oprávnění k souboru; požadavek, aby jádro nakonfigurovalo to, co jste otevřeli, je otázka schopností. Udělení CAP_NET_ADMIN neopraví uzel zařízení, který váš uživatel služby nemůže číst, a oprava uzlu vám nedá pravomoc nad trasami. Zkontrolujte obojí, než změníte cokoli z toho.

WireGuard v jádře a tunelové programy v uživatelském prostoru také nemají stejné požadavky. Cesta přes modul jádra konfiguruje existující rozhraní přes netlink, zatímco implementace v uživatelském prostoru může potřebovat i zařízení a pro některé transporty surové sockety.

Přečtěte kontext: služba, kontejner nebo shell

Schopnost v síťovém jmenném prostoru hostitele může ovlivnit mnohem víc než stejná operace v záměrně izolovaném zásobníku. Prostředí pro kontejnery obvykle startuje se zmenšenou sadou limitů; přidání NET_ADMIN ke kontejneru, který sdílí síť hostitele, je mnohem větší oprávnění než přidání ke kontejneru s vlastním síťovým jmenným prostorem a bez připojení z hostitele.

U jednotek systemd čtěte, co se skutečně uplatňuje, ne co podle souboru jednotky vypadá: systemctl show -p CapabilityBoundingSet -p AmbientCapabilities hlásí efektivní hodnoty, které může nastavit drop-in, na který jste zapomněli. Ptejte se na efektivní hodnotu, nikdy na zamýšlenou. Ambient schopnosti jsou důležité, protože služba bez rootu ztrácí schopnosti při exec bez nich.

Za základ berte podporované nastavení balíčku nebo image. Nepřidávejte oprávnění k surovým socketům ani privilegovaný režim jen proto, že je jiný návod vypsal pro jiný nástroj; taková úvaha nic nepřenáší a stojí vás izolaci, kterou jste zaplatili. Když si nejste jisti, nic neudělujte a přečtěte si poznámky k implementaci pro přesnou operaci, kterou potřebujete.

Sledujte, co se děje po poklesu oprávnění

Mnoho démonů startuje privilegovaně, nakonfiguruje rozhraní, pak přejde na neprivilegovaného uživatele a tunel si ponechá. Od té chvíle proces nemůže přidat trasu, přepsat pravidlo firewallu ani otevřít nové privilegované zařízení, což je v pořádku, dokud opětovné připojení nepotřebuje právě to. Pozdější čtení souborů a spouštění hooků může selhat ze stejného důvodu.

Testujte celý životní cyklus, ne první sekundu: start, obnovení nebo opětovné připojení a úklid při zastavení. První úspěšné vytvoření rozhraní neprokazuje, že každá další privilegovaná operace bude fungovat, a selhání se obvykle objeví až hodiny později v produkci.

Implementace, které drží tunel otevřený při změně uživatele, to obvykle spojují s možnostmi zachovat tunel a klíče. Na straně systemd je ekvivalentní otázkou, zda sada schopností jednotky přežije změnu uživatele, kterou jste nastavili.

Zapište oprávnění i jeho důvod

Zapište přesné oprávnění, operaci, kterou umožňuje, a chybu, kterou opravilo. Jeden řádek v poznámkách k nasazení — „CAP_NET_ADMIN v síťovém jmenném prostoru jednotky, potřebný pro změny tras po opětovném připojení“ — stačí k tomu, aby další člověk oprávnění znovu nerozšířil.

Potom po každé aktualizaci znovu přečtěte efektivní sadu. Dodavatelé přidávají funkce, image mění výchozí hodnoty a schopnost, která byla loni zbytečná, se může stát nosnou, aniž si toho někdo všimne.

Související články