NET_ADMIN je zmožnost Linuxa, ki procesu omogoča izvajanje omrežne administracije, in v vsebniku počne natanko to v tistem omrežnem imenskem prostoru, v katerem teče proces. To ni licenca za odpiranje vtičnice in ni nadomestilo za napravo ali pot. Zanimivo vprašanje ni nikoli, ali je zmožnost dodeljena, ampak kateri imenski prostor prejme spremembo.

Kaj zmožnost pokriva

Znotraj svojega imenskega prostora lahko proces z NET_ADMIN dviga in spušča vmesnike, dodeljuje naslove, dodaja in odstranjuje poti ter piše pravila požarnega zidu, kar je skupina operacij, ki jih capabilities(7) zbira pod to zmožnostjo. Lahko tudi prilagaja nastavitve na ravni vmesnika, ki nadzorujejo, kako jedro uvršča in filtrira promet. Odjemalec VPN običajno ob zagonu potrebuje nekaj od teh, pozneje pa ničesar več. Zato večina podob zahteva večji doseg, kot ga uporablja.

Operacije zunaj tega imenskega prostora niso zajete, sosednje pravice pa so ločene. Branje in pisanje surovih paketov spada k NET_RAW, ustvarjanje naprave tun pa zahteva tako zmožnost kot dostop do vozlišča naprave. Proces brez naprave prejme napako dovoljenja, ki je videti kot omrežna težava, pa ni.

Imenski prostor določa obseg škode

Vsebnik na svojem mostovnem omrežju doseže svoj loopback, svoje vmesnike in svojo usmerjevalno tabelo. Dodelitev NET_ADMIN tam omogoči odjemalcu VPN, da zgradi tunel, ne da bi se dotaknil usmerjevalnih odločitev gostitelja, kar je ureditev, ki jo predpostavlja večina vsebniških podob.

Preklopite ta vsebnik na gostiteljsko omrežje in ista dodelitev zdaj ureja poti gostitelja in požarni zid gostitelja, ker ni ostal noben ločen imenski prostor. Odjemalec, ki naj bi upravljal en tunel, lahko nato preusmeri promet celotnega stroja, napaka v njegovi skripti za razgradnjo pa gostitelju pusti pravila, ki jih ni nihče napisal. V sami zmožnosti se ni nič spremenilo; spremenil se je kontekst. Zato se ista datoteka compose na dveh gostiteljih obnaša različno.

Trije predpogoji, zliti v enega

Napake pri zagonu v vsebnikih VPN običajno zadevajo eno od treh ločenih stvari: zmožnost, tunelsko napravo in podporo jedra za protokol. Dodelitev vseh treh naenkrat deluje in tudi onemogoči pripisovanje naslednje napake. Minimalni delček compose dodeli zmožnost in izrecno posreduje vozlišče naprave:

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

Preberite dokumentacijo same podobe, katere sysctl potrebuje, ker lahko sysctl v vsebniku zahteva dodatno pravico ali nastavitev na ravni gostitelja. Kjer podoba podpira samo način uporabniškega prostora, naprava sploh ni potrebna in seznam zmožnosti se ustrezno skrči.

Dodelite ozko operacijo, ne načina

Posebni način preda vsako zmožnost in hkrati razširi dostop do naprav, zato skrije, kateri od treh predpogojev je manjkal. Prav tako naredi načine okvare vsebnika nerazločljive od sprememb na gostitelju. Raje uporabite izrecen seznam, tudi ko ga je dlje pisati.

Namestitve brez roota in v uporabniških imenskih prostorih spremenijo, kaj zmožnost pomeni v praksi, saj jo lahko proces drži le znotraj preslikanega imenskega prostora. Kopiranje seznama zmožnosti iz primera z rootom v okolje brez roota in pričakovanje enakega dosega je pogost način, kako izgubiti popoldne.

Skrivnosti spadajo k ločeni odločitvi. Imeti NET_ADMIN ne pove ničesar o tem, katero identiteto sopotnika predstavlja odjemalec, katere poverilnice nalaga ali kako se te zamenjujejo. Omrežna administracija ne daje zaupanja.

Preverite spremembo in zapišite, zakaj dodelitev obstaja

Preden začnete odpravljati napake v tunelu, potrdite, kaj je vsebnik res prejel. Spodnji pregled navaja dodane zmožnosti in omrežni način, nato pa pokaže, kako je videti seznam vmesnikov od znotraj:

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

Če je zmožnost prisotna in je seznam vmesnikov še vedno prazen, je odjemalec odpovedal, preden je lahko kar koli ustvaril, in naslednje mesto za pogled so dnevniki vsebnika. Če tunel obstaja, promet pa ne teče, na naslednje vprašanje odgovori usmerjevalna tabela znotraj vsebnika.

Preizkusite tudi pot razgradnje, ker lahko odjemalec, ki piše pravila požarnega zidu, ta pusti za seboj. Ustavite vsebnik in znova preverite nabor pravil gostitelja, če se uporablja gostiteljsko omrežje. Dodelitve, ki je potrebna le dve sekundi ob zagonu, v datoteki compose ne bi smeli opisati kot trajne zahteve brez opombe, ki to pojasnjuje.

Ob vsaki zmožnosti zapišite razlog: katera operacija jo je potrebovala in kaj brez nje ne deluje. Ta opomba preživi posodobitve podobe in je razlika med pregledanim seznamom pravic in tistim, ki je zrasel s kopiranjem in lepljenjem.

Sorodni članki