NET_ADMIN v vsebniku VPN: kaj in kje lahko spremeni
Zmožnost omogoča spremembe vmesnikov, poti in požarnega zidu znotraj enega omrežnega imenskega prostora. Pri gostiteljskem omrežju je ta prostor gostiteljev lastni sklad.
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=1Preberite 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.