NET_ADMIN on Linuxi võime, mis lubab protsessil võrguadministratsiooni teha, ja konteineris teeb see täpselt seda selles võrgupäimeruumis, kus protsess töötab. See ei ole litsents soketi avamiseks ega asendus seadmele või marsruudile. Huvitav küsimus ei ole kunagi see, kas võime on antud, vaid see, milline päimeruum muudatuse saab.

Mida võime katab

Oma päimeruumis saab NET_ADMIN omav protsess liideseid üles ja alla tõsta, aadresse määrata, marsruute lisada ja eemaldada ning tulemüürireegleid kirjutada, mis on see toimingute rühm, mille capabilities(7) selle võime alla koondab. Ta saab ka reguleerida liidese tasandi seadeid, mis juhivad, kuidas tuum liiklust järjekorda paneb ja filtreerib. VPN-klient vajab tavaliselt käivitamisel mõnda neist ja pärast seda mitte midagi muud. Seetõttu küsivad enamik kuvandeid suuremat ulatust, kui nad kasutavad.

Toimingud väljaspool seda päimeruumi ei ole kaetud ja naaberprivileegid on eraldi. Toorandmepakettide lugemine ja kirjutamine kuulub NET_RAW alla ning tun-seadme loomine nõuab nii võimet kui ka juurdepääsu seadme sõlmele. Protsess, kellel seadet pole, saab loa vea, mis näeb välja nagu võrguprobleem, aga ei ole.

Päimeruum määrab kahjupiirkonna

Oma sildvõrgus olev konteiner jõuab oma loopbackini, oma liidesteni ja oma marsruutimistabelini. Seal NET_ADMIN andmine lubab VPN-kliendil tunneli ehitada hosti marsruutimisotsuseid puutumata, mis on paigutus, mida enamik konteineri kuvandeid eeldab.

Lülitage see konteiner hostvõrku ja sama luba muudab nüüd hosti marsruute ja hosti tulemüüri, sest eraldi päimeruumi enam alles ei jää. Klient, mis pidi haldama ühte tunnelit, saab siis kogu masina liiklust ümber suunata, ja viga selle lammutusskriptis jätab hostile reeglid, mida keegi ei kirjutanud. Võimes endas ei muutunud midagi; muutus kontekst. Sellepärast käitub sama compose-fail kahes hostis erinevalt.

Kolm eeltingimust, mis sulanduvad üheks

VPN-konteinerite käivitusvead puudutavad tavaliselt ühte kolmest eraldi asjast: võimet, tunneliseadet ja tuuma tuge protokollile. Kõigi kolme korraga andmine töötab ja teeb ka järgmise vea omistamatuks. Minimaalne compose-katkend annab võime ja edastab seadme sõlme selgesõnaliselt:

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

Lugege kuvandi enda dokumentatsiooni, milliseid sysctle see vajab, sest konteineris võib sysctl nõuda täiendavat privileegi või hostitasandi seadet. Kus kuvand toetab ainult kasutajaruumi režiimi, pole seadet üldse vaja ja võimete loend kahaneb vastavalt.

Andke kitsas toiming, mitte režiim

Privilegeeritud režiim annab üle iga võime ja laiendab samal ajal seadmejuurdepääsu, nii et see varjab, millist kolmest eeltingimusest puudu oli. See teeb ka konteineri rikkerežiimid hosti muudatustest eristamatuks. Eelistage selgesõnalist loendit ka siis, kui seda on pikem kirjutada.

Juureta ja kasutajapäimeruumi juurutused muudavad seda, mida võime praktikas tähendab, sest protsess saab seda hoida ainult kaardistatud päimeruumis. Võimete loendi kopeerimine juurega näitest juureta töökeskkonda ja sama ulatuse ootamine on tavaline viis kaotada üks pärastlõuna.

Saladused kuuluvad eraldi otsuse alla. NET_ADMIN omamine ei ütle midagi selle kohta, millist partneri identiteeti klient esitab, milliseid volitusi see laadib või kuidas neid pööratakse. Võrguadministratsioon ei anna usaldust.

Kontrollige muudatust ja kirjutage üles, miks luba olemas on

Enne tunneli silumist veenduge, mida konteiner tegelikult sai. Allolev kontroll väljendab lisatud võimeid ja võrgurežiimi ning näitab seejärel, kuidas liideste loend seestpoolt välja näeb:

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

Kui võime on olemas ja liideste loend on endiselt tühi, siis klient ebaõnnestus enne, kui suutis midagi luua, ja järgmine koht on konteineri logid. Kui tunnel on olemas, aga liiklus ei voola, vastab konteineri sees olev marsruutimistabel järgmisele küsimusele.

Testige ka lammutusteed, sest tulemüürireegleid kirjutav klient võib need maha jätta. Peatage konteiner ja kontrollige hosti reeglistikku uuesti, kui kasutatakse hostvõrku. Luba, mida on vaja ainult kaks sekundit käivitamisel, ei tohiks compose-failis kirjeldada püsiva nõudena ilma seda selgitava märkuseta.

Kirjutage põhjus iga võime kõrvale: milline toiming seda vajas ja mis ilma selleta ebaõnnestub. See märkus elab üle kuvandi uuendused ja see on vahe üle vaadatud privileegiloendi ning kopeerimisega kasvanud loendi vahel.

Seotud artiklid