NET_ADMIN je linuxová schopnosť, ktorá procesu umožňuje vykonávať správu siete, a v kontajneri robí presne to v tom sieťovom mennom priestore, v ktorom proces beží. Nie je to licencia na otvorenie socketu a nie je to náhrada za zariadenie alebo trasu. Zaujímavá otázka nikdy nie je, či je schopnosť udelená, ale ktorý menný priestor zmenu prijme.

Čo schopnosť pokrýva

V rámci svojho menného priestoru môže proces s NET_ADMIN zapínať a vypínať rozhrania, prideľovať adresy, pridávať a odoberať trasy a písať pravidlá firewallu, čo je skupina operácií, ktorú capabilities(7) zhromažďuje pod túto schopnosť. Môže tiež upravovať nastavenia na úrovni rozhrania, ktoré riadia, ako jadro zaraďuje a filtruje prevádzku. VPN klient zvyčajne pri štarte potrebuje niekoľko z nich a potom nič ďalšie. Preto väčšina obrazov žiada širší rozsah, než využíva.

Operácie mimo tohto menného priestoru nie sú pokryté a susedné oprávnenia sú oddelené. Čítanie a zápis surových paketov patrí NET_RAW a vytvorenie zariadenia tun vyžaduje aj schopnosť, aj prístup k uzlu zariadenia. Proces bez zariadenia dostane chybu oprávnenia, ktorá vyzerá ako sieťový problém, ale nie je.

Menný priestor určuje polomer škôd

Kontajner na vlastnej mostovej sieti dosiahne svoj loopback, svoje rozhrania a svoju smerovaciu tabuľku. Udelenie NET_ADMIN tam umožní VPN klientovi postaviť tunel bez toho, aby sa dotkol smerovacích rozhodnutí hostiteľa, čo je usporiadanie, ktoré predpokladá väčšina kontajnerových obrazov.

Prepnete tento kontajner na hostiteľskú sieť a to isté udelenie teraz upravuje trasy hostiteľa a firewall hostiteľa, pretože nezostal žiadny oddelený menný priestor. Klient, ktorý mal spravovať jeden tunel, potom môže presmerovať prevádzku celého stroja, a chyba v jeho odstraňovacom skripte nechá hostiteľovi pravidlá, ktoré nikto nenapísal. Na samotnej schopnosti sa nič nezmenilo; zmenil sa kontext. Preto sa ten istý súbor compose správa na dvoch hostiteľoch inak.

Tri predpoklady zlúčené do jedného

Zlyhania pri štarte VPN kontajnerov sa zvyčajne týkajú jednej z troch oddelených vecí: schopnosti, tunelového zariadenia a podpory protokolu v jadre. Udelenie všetkých troch naraz funguje a zároveň robí ďalšie zlyhanie nepriraditeľným. Minimálny fragment compose udeľuje schopnosť a explicitne odovzdáva uzol zariadenia:

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

Prečítajte si vlastnú dokumentáciu obrazu, ktoré sysctls potrebuje, pretože sysctl v kontajneri môže vyžadovať ďalšie oprávnenie alebo nastavenie na úrovni hostiteľa. Kde obraz podporuje iba režim používateľského priestoru, zariadenie vôbec nie je potrebné a zoznam schopností sa primerane zmenší.

Udeľte úzku operáciu, nie režim

Privilegovaný režim odovzdáva každú schopnosť a zároveň rozširuje prístup k zariadeniam, takže skrýva, ktorý z troch predpokladov chýbal. Tiež robí spôsoby zlyhania kontajnera nerozoznateľnými od zmien hostiteľa. Uprednostnite explicitný zoznam, aj keď je dlhší na písanie.

Nasadenia bez roota a v používateľských menných priestoroch menia, čo schopnosť v praxi znamená, pretože proces ju môže držať iba v namapovanom mennom priestore. Kopírovanie zoznamu schopností z rootového príkladu do runtime bez roota a očakávanie rovnakého rozsahu je bežný spôsob, ako stratiť popoludnie.

Tajomstvá patria k samostatnému rozhodnutiu. Držanie NET_ADMIN nič nehovorí o tom, akú identitu partnera klient predkladá, aké prihlasovacie údaje načítava ani ako sa obmieňajú. Správa siete nedodáva dôveru.

Overte zmenu a zaznamenajte, prečo oprávnenie existuje

Pred ladením tunela potvrďte, čo kontajner skutočne dostal. Inšpekcia nižšie uvádza pridané schopnosti a sieťový režim a potom ukazuje, ako vyzerá zoznam rozhraní zvnútra:

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

Ak je schopnosť prítomná a zoznam rozhraní je stále prázdny, klient zlyhal skôr, než mohol čokoľvek vytvoriť, a ďalším miestom na pohľad sú protokoly kontajnera. Ak tunel existuje, ale prevádzka neprúdi, na ďalšiu otázku odpovedá smerovacia tabuľka vnútri kontajnera.

Otestujte aj cestu odstránenia, pretože klient, ktorý píše pravidlá firewallu, ich môže nechať za sebou. Zastavte kontajner a znova skontrolujte sadu pravidiel hostiteľa, ak sa používa hostiteľská sieť. Oprávnenie potrebné iba dve sekundy pri štarte by sa v súbore compose nemalo opisovať ako trvalá požiadavka bez poznámky, ktorá to vysvetľuje.

Ku každej schopnosti napíšte dôvod: ktorá operácia ju potrebovala a čo bez nej zlyhá. Tá poznámka prežije aktualizácie obrazu a je rozdielom medzi zrevidovaným zoznamom oprávnení a zoznamom, ktorý narástol kopírovaním a vkladaním.

Súvisiace články