NET_ADMIN on Linux-kyvykkyys, joka sallii prosessin tehdä verkonhallintaa, ja kontissa se tekee juuri sitä siinä verkkonimiavaruudessa, jossa prosessi toimii. Se ei ole lisenssi avata socketia eikä korvaa laitetta tai reittiä. Kiinnostava kysymys ei ole koskaan se, onko kyvykkyys myönnetty, vaan se, mikä nimiavaruus muutoksen vastaanottaa.

Mitä kyvykkyys kattaa

Nimiavaruutensa sisällä prosessi, jolla on NET_ADMIN, voi nostaa ja laskea rajapintoja, osoittaa osoitteita, lisätä ja poistaa reittejä ja kirjoittaa palomuurisääntöjä, mikä on se toimintoryhmä, jonka capabilities(7) kokoaa tämän kyvykkyyden alle. Se voi myös säätää rajapintatason asetuksia, jotka ohjaavat, miten ydin asettaa liikennettä jonoon ja suodattaa sitä. VPN-asiakas tarvitsee yleensä muutamia niistä käynnistyksessä eikä sen jälkeen mitään muuta. Siksi useimmat imaget pyytävät laajempaa ulottuvuutta kuin käyttävät.

Kyseisen nimiavaruuden ulkopuoliset toiminnot eivät kuulu piiriin, ja viereiset oikeudet ovat erillisiä. Raakapakettien lukeminen ja kirjoittaminen kuuluu NET_RAW-kyvykkyydelle, ja tun-laitteen luominen vaatii sekä kyvykkyyden että pääsyn laitesolmuun. Prosessi ilman laitetta saa käyttöoikeusvirheen, joka näyttää verkkongelmalta mutta ei ole sitä.

Nimiavaruus määrää vahingon säteen

Oman siltäverkkonsa kontti tavoittaa oman loopbackinsa, omat rajapintansa ja oman reititystaulunsa. NET_ADMIN-kyvykkyyden myöntäminen siellä antaa VPN-asiakkaan rakentaa tunnelin koskematta isännän reitityspäätöksiin, mikä on järjestely, jonka useimmat kontti-imaget olettavat.

Vaihda tuo kontti isäntäverkkoon, ja sama myönnytys muokkaa nyt isännän reittejä ja isännän palomuuria, koska erillistä nimiavaruutta ei ole enää jäljellä. Asiakas, jonka piti hallita yhtä tunnelia, voi silloin ohjata koko koneen liikennettä, ja virhe sen purkuskoippauksessa jättää isännälle säännöt, joita kukaan ei kirjoittanut. Itse kyvykkyydessä ei muuttunut mikään; konteksti muuttui. Siksi sama compose-tiedosto käyttäytyy eri tavoin kahdella isännällä.

Kolme edellytystä, jotka sulautuvat yhdeksi

VPN-konttien käynnistysvirheet koskevat yleensä yhtä kolmesta erillisestä asiasta: kyvykkyyttä, tunnelilaitetta ja ytimen tukea protokollalle. Kaikkien kolmen myöntäminen yhdessä toimii, ja se tekee myös seuraavasta virheestä mahdotonta kohdistaa. Minimaalinen compose-katkelma myöntää kyvykkyyden ja välittää laitesolmun nimenomaisesti:

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

Lue imagen oma dokumentaatio siitä, mitkä sysctlit se tarvitsee, koska kontin sysctl voi vaatia lisäoikeuden tai isäntätason asetuksen. Kun image tukee vain käyttäjätilan tilaa, laitetta ei tarvita lainkaan ja kyvykkyysluettelo pienenee vastaavasti.

Myönnä kapea toiminto, älä tilaa

Etuoikeutettu tila luovuttaa kaikki kyvykkyydet ja laajentaa laitekäyttöä samanaikaisesti, joten se kätkee, mikä kolmesta edellytyksestä puuttui. Se tekee myös kontin vikatilat mahdottomiksi erottaa isännän muutoksista. Suosi nimenomaista luetteloa, vaikka sen kirjoittaminen olisi pidempää.

Rootittomat ja käyttäjänimiavaruuden käyttöönotot muuttavat sitä, mitä kyvykkyys käytännössä tarkoittaa, koska prosessi voi pitää sitä vain karttetussa nimiavaruudessa. Kyvykkyysluettelon kopioiminen rootillisesta esimerkistä rootittomaan ajonaikaiseen ympäristöön ja saman ulottuvuuden odottaminen on tavallinen tapa menettää iltapäivä.

Salaisuudet kuuluvat erilliseen päätökseen. NET_ADMIN-kyvykkyyden hallussapito ei kerro mitään siitä, minkä vertaisidentiteetin asiakas esittää, mitkä tunnukset se lataa tai miten niitä kierrätetään. Verkonhallinta ei tarjoa luottamusta.

Vahvista muutos ja kirjaa, miksi myönnytys on olemassa

Vahvista, mitä kontti todella sai, ennen kuin teet tunnelille vianmääritystä. Alla oleva tarkastus raportoi lisätyt kyvykkyydet ja verkkotilan ja näyttää sitten, miltä rajapintaluettelo näyttää sisältäpäin:

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

Jos kyvykkyys on läsnä ja rajapintaluettelo on yhä tyhjä, asiakas epäonnistui ennen kuin ehti luoda mitään, ja seuraava katsottava paikka ovat kontin lokit. Jos tunneli on olemassa mutta liikenne ei virtaa, kontin sisäinen reititystaulu vastaa seuraavaan kysymykseen.

Testaa myös purkupolku, koska palomuurisääntöjä kirjoittava asiakas voi jättää ne jälkeensä. Pysäytä kontti ja tarkista isännän sääntöjoukko uudelleen, jos isäntäverkkoa käytetään. Myönnytystä, jota tarvitaan vain kaksi sekuntia käynnistyksessä, ei pitäisi kuvata compose-tiedostossa pysyvänä vaatimuksena ilman sen selittävää huomautusta.

Kirjoita syy jokaisen kyvykkyyden viereen: mikä toiminto sitä tarvitsi ja mikä epäonnistuu ilman sitä. Se huomautus kestää image-päivitykset, ja se on ero tarkistetun oikeusluettelon ja kopioimalla kasvaneen luettelon välillä.

Aiheeseen liittyvät artikkelit