NET_ADMIN ir Linux iespēja, kas ļauj procesam veikt tīkla administrēšanu, un konteinerā tā dara tieši to tajā tīkla nosaukumtelpā, kurā procese darbojas. Tā nav licence atvērt ligzdu un nav aizvietotājs ierīcei vai maršrutam. Interesantais jautājums nekad nav par to, vai iespēja ir piešķirta, bet gan par to, kura nosaukumtelpa saņem izmaiņas.

Ko iespēja aptver

Savā nosaukumtelpā process ar NET_ADMIN var pacelt un nolaist saskarnes, piešķirt adreses, pievienot un noņemt maršrutus un rakstīt ugunsmūra noteikumus, kas ir tā darbību grupa, ko capabilities(7) apkopo šīs iespējas ietvaros. Tas var arī pielāgot saskarnes līmeņa iestatījumus, kas kontrolē, kā kodols ievieto trafiku rindā un filtrē to. VPN klientam parasti palaišanas laikā ir vajadzīgas dažas no tām un pēc tam nekas cits. Tāpēc lielākā daļa attēlu pieprasa lielāku tvērumu, nekā izmanto.

Darbības ārpus šīs nosaukumtelpas netiek aptvertas, un blakus esošās privilēģijas ir atsevišķas. Neapstrādātu pakešu lasīšana un rakstīšana pieder NET_RAW, un tun ierīces izveidei vajadzīga gan iespēja, gan piekļuve ierīces mezglam. Process bez ierīces saņem atļaujas kļūdu, kas izskatās pēc tīkla problēmas, bet tā nav.

Nosaukumtelpa nosaka bojājuma rādiusu

Konteineris savā tilta tīklā sasniedz savu loopback, savas saskarnes un savu maršrutēšanas tabulu. Piešķirot tur NET_ADMIN, VPN klients var uzbūvēt tuneli, neaizskarot resursdatora maršrutēšanas lēmumus, un tas ir izkārtojums, ko pieņem lielākā daļa konteineru attēlu.

Pārslēdziet šo konteineri uz resursdatora tīklu, un tā pati piešķiršana tagad rediģē resursdatora maršrutus un resursdatora ugunsmūri, jo atsevišķa nosaukumtelpa vairs nav palikusi. Klients, kam bija jāpārvalda viens tunelis, tad var novirzīt visas mašīnas trafiku, un kļūda tā demontāžas skriptā atstāj resursdatorā noteikumus, kurus neviens nav rakstījis. Pašā iespējā nekas nav mainījies; mainījies ir konteksts. Tāpēc viens un tas pats compose fails uz diviem resursdatoriem uzvedas atšķirīgi.

Trīs priekšnosacījumi, kas saplūst vienā

VPN konteineru palaišanas kļūmes parasti saistītas ar vienu no trim atsevišķām lietām: iespēju, tuneļa ierīci un kodola atbalstu protokolam. Visu trīs piešķiršana uzreiz darbojas, un tas arī padara nākamo kļūmi neattributējamu. Minimāls compose fragments piešķir iespēju un skaidri nodod ierīces mezglu:

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

Lasiet paša attēla dokumentāciju par to, kuri sysctl tam nepieciešami, jo sysctl konteinerā var prasīt papildu privilēģiju vai resursdatora līmeņa iestatījumu. Vietās, kur attēls atbalsta tikai lietotāja telpas režīmu, ierīce vispār nav nepieciešama, un iespēju saraksts attiecīgi sarūk.

Piešķiriet šauro darbību, nevis režīmu

Privilēģiju režīms nodod visas iespējas un vienlaikus paplašina piekļuvi ierīcēm, tāpēc tas slēpj, kura no trim priekšnosacījumiem trūka. Tas arī padara konteinera kļūmju veidus neatšķiramus no resursdatora izmaiņām. Dodiet priekšroku skaidram sarakstam pat tad, ja to ir garāk rakstīt.

Izvietojumi bez root un lietotāja nosaukumtelpās maina to, ko iespēja nozīmē praksē, jo process to var turēt tikai kartētā nosaukumtelpā. Iespēju saraksta kopēšana no root piemēra uz vidi bez root un tāda paša tvēruma gaidīšana ir ierasts veids, kā zaudēt pēcpusdienu.

Noslēpumi pieder atsevišķam lēmumam. NET_ADMIN turēšana neko nepasaka par to, kādu partnera identitāti klients uzrāda, kādus akreditācijas datus ielādē vai kā tie tiek rotēti. Tīkla administrēšana nesniedz uzticēšanos.

Pārbaudiet izmaiņas un pierakstiet, kāpēc piešķiršana pastāv

Pirms tuneļa atkļūdošanas pārliecinieties, ko konteiners patiešām saņēma. Tālāk sniegtā pārbaude ziņo par pievienotajām iespējām un tīkla režīmu, pēc tam parāda, kā saskarņu saraksts izskatās no iekšpuses:

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

Ja iespēja ir, bet saskarņu saraksts joprojām ir tukšs, klients neizdevās pirms tam, kad varēja kaut ko izveidot, un nākamā vieta, kur skatīties, ir konteinera žurnāli. Ja tunelis ir, bet trafiks neplūst, uz nākamo jautājumu atbild maršrutēšanas tabula konteinera iekšpusē.

Pārbaudiet arī demontāžas ceļu, jo klients, kas raksta ugunsmūra noteikumus, var tos atstāt aiz sevis. Apturiet konteineri un vēlreiz pārbaudiet resursdatora noteikumu kopu, ja tiek izmantots resursdatora tīkls. Piešķiršanu, kas nepieciešama tikai divas sekundes palaišanas laikā, compose failā nevajadzētu aprakstīt kā pastāvīgu prasību bez to izskaidrojošas piezīmes.

Pierakstiet iemeslu blakus katrai iespējai: kura darbība to prasīja un kas neizdodas bez tās. Šī piezīme pārdzīvo attēla atjauninājumus, un tā ir atšķirība starp pārskatītu privilēģiju sarakstu un tādu, kas izaudzis kopējot un ielīmējot.

Saistītie raksti