NET_ADMIN je linuxová schopnost, která procesu umožňuje provádět správu sítě, a v kontejneru dělá přesně to v tom síťovém jmenném prostoru, ve kterém proces běží. Není to licence k otevření socketu a není to náhrada za zařízení nebo trasu. Zajímavá otázka nikdy není, zda je schopnost udělena, ale který jmenný prostor změnu přijme.

Co schopnost pokrývá

Uvnitř svého jmenného prostoru může proces s NET_ADMIN rozhraní zapínat a vypínat, přiřazovat adresy, přidávat a odebírat trasy a psát pravidla firewallu, což je skupina operací, kterou capabilities(7) shrnuje pod tuto schopnost. Může také upravovat nastavení na úrovni rozhraní, která řídí, jak jádro řadí a filtruje provoz. VPN klient obvykle při startu potřebuje několik z nich a potom nic dalšího. Většina obrazů proto žádá širší dosah, než využívá.

Operace mimo tento jmenný prostor pokryté nejsou a sousední oprávnění jsou oddělená. Čtení a zápis surových paketů patří NET_RAW a vytvoření zařízení tun vyžaduje jak schopnost, tak přístup k uzlu zařízení. Proces bez zařízení dostane chybu oprávnění, která vypadá jako síťový problém, ale není.

Jmenný prostor určuje poloměr škod

Kontejner na vlastní mostové síti dosáhne svého loopbacku, svých rozhraní a své směrovací tabulky. Udělení NET_ADMIN tam umožní VPN klientovi postavit tunel, aniž by se dotkl směrovacích rozhodnutí hostitele, což je uspořádání, které většina kontejnerových obrazů předpokládá.

Přepněte tento kontejner na hostitelskou síť a stejné oprávnění nyní upravuje trasy hostitele a jeho firewall, protože nezůstal žádný oddělený jmenný prostor. Klient, který měl spravovat jeden tunel, pak může přesměrovat provoz celého stroje, a chyba v jeho odstraňovacím skriptu nechá hostiteli pravidla, která nikdo nenapsal. Na samotné schopnosti se nic nezměnilo; změnil se kontext. Proto se stejný soubor compose chová na dvou hostitelích jinak.

Tři předpoklady sloučené v jeden

Selhání při startu VPN kontejnerů obvykle zahrnují jednu ze tří oddělených věcí: schopnost, tunelové zařízení a podporu protokolu v jádru. Udělení všech tří najednou funguje a zároveň činí další selhání nepřiřaditelným. Minimální fragment compose uděluje schopnost a předává uzel zařízení explicitně:

services:
  vpn:
    image: example/vpn-client:latest
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/net/tun
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1

Přečtěte si vlastní dokumentaci obrazu, které sysctly potřebuje, protože sysctl v kontejneru může vyžadovat další oprávnění nebo nastavení na úrovni hostitele. Kde obraz podporuje režim pouze v uživatelském prostoru, není zařízení vůbec potřeba a seznam schopností se odpovídajícím způsobem zmenší.

Udělte úzkou operaci, ne režim

Privilegovaný režim předává každou schopnost a zároveň rozšiřuje přístup k zařízením, takže skrývá, který ze tří předpokladů chyběl. Také činí způsoby selhání kontejneru nerozeznatelnými od změn hostitele. Dejte přednost explicitnímu seznamu, i když je delší na psaní.

Nasazení bez roota a v uživatelských jmenných prostorech mění, co schopnost v praxi znamená, protože proces ji může držet jen v mapovaném jmenném prostoru. Zkopírovat seznam schopností z rootového příkladu do běhového prostředí bez roota a očekávat stejný dosah je běžný způsob, jak ztratit odpoledne.

Tajemství patří k samostatnému rozhodnutí. Držení NET_ADMIN nic neříká o tom, jakou identitu partnera klient předkládá, jaké přihlašovací údaje načítá ani jak se obměňují. Správa sítě nedodává důvěru.

Ověřte změnu a zaznamenejte, proč oprávnění existuje

Než začnete tunel ladit, potvrďte, co kontejner skutečně dostal. Inspekce níže uvádí přidané schopnosti a síťový režim a poté ukazuje, jak vypadá seznam rozhraní zevnitř:

docker inspect --format '{{.HostConfig.CapAdd}} {{.HostConfig.NetworkMode}} {{.HostConfig.Privileged}}' vpn
docker exec vpn sh -c 'grep CapEff /proc/self/status'
docker exec vpn ip -br addr
docker exec vpn ip route

Pokud je schopnost přítomná a seznam rozhraní je stále prázdný, klient selhal dřív, než mohl cokoli vytvořit, a dalším místem, kam se podívat, jsou protokoly kontejneru. Pokud tunel existuje, ale provoz neteče, na další otázku odpovídá směrovací tabulka uvnitř kontejneru.

Otestujte i cestu odstranění, protože klient, který píše pravidla firewallu, je může nechat za sebou. Zastavte kontejner a znovu zkontrolujte sadu pravidel hostitele, pokud se používá hostitelská síť. Oprávnění potřebné jen dvě sekundy při startu by se nemělo v souboru compose popisovat jako trvalý požadavek bez poznámky, která to vysvětluje.

K každé schopnosti napište důvod: která operace ji potřebovala a co bez ní selhává. Ta poznámka přežije aktualizace obrazu a je rozdílem mezi zrevidovaným seznamem oprávnění a seznamem, který vyrostl kopírováním a vkládáním.

Související články