Ievietojiet VPN klientu konteinerā, un jūs iegūstat vienu nosaukumu telpu ar tuneli tajā, nevis resursdatoru, kas visu savu datplūsmu maršrutē caur VPN. Tie ir atsevišķi projekti, un to uztveršana kā viena ir ceļš, kā konteineri nejauši kļūst privileģēti. Šī rokasgrāmata aptver tikai pirmo: viens pārbaudīts attēls, viens aizsargāts profils un klienta process, kas ierobežots ar savu tīkla nosaukumu telpu.

Sāciet ar artefaktu, ko kāds jau ir apstiprinājis. Turpmākie soļi paredz attēlu, kas satur openvpn izpildāmo failu un pilnu klienta profilu, kura sertifikāts un atslēgas materiāls jau ir atrisināts montāžas iekšienē. Tie neveido programmatūru, neizsniedz akreditācijas datus un neaptver vides bez root un vietējos Windows konteinerus, no kuriem katrs maina atbildi.

Ko konteiners iegūst un ko ne

Turiet profilu un visu, uz ko tas atsaucas, vietējā direktorijā ar ierobežotām atļaujām, montētu tikai lasīšanai. Relatīvajiem ceļiem profila iekšienē jāatrisinās šajā montāžā; tas ir sīkums, ko cilvēki palaiž garām, kad sertifikāts atrodas vienu direktoriju virs profila un konteiners to nekad neredz.

services:
  vpn:
    image: ${VPN_CLIENT_IMAGE:?set the reviewed image reference}
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/net/tun:/dev/net/tun
    volumes:
      - ./vpn:/vpn:ro
    working_dir: /vpn
    entrypoint: ["openvpn"]
    command: ["--config", "/vpn/client.ovpn"]

Šis fails dod trīs lietas un neprasa neko citu. Attēla atsauce jānostiprina ar digest, ja jūsu izvietošanas politika tā nosaka, un profilam jābūt pārbaudītajam, nevis kopijai, ko kāds rediģējis uz vietas resursdatorā.

Tikai lasīšana šeit nozīmē, ka konteiners nevar mainīt jūsu failus resursdatorā; tas nenozīmē, ka konteiners nevar nolasīt jūsu montēto privāto atslēgu. Tā ir visa montāžas jēga, un tāpēc failu atļaujām, īpašumtiesībām un tam, kā noslēpums nonāca resursdatorā, joprojām ir nozīme. Nekad nenododiet paroli komandrindā un neiepraktizējiet to attēla slānī, jo abi izdzīvo vietās, kuras vēlāk nevarēsiet notīrīt.

Iespējas, entrypoint un slazds starp tām

Ir nepieciešami divi iestatījumi, un tie veic nesaistītus darbus. NET_ADMIN atļauj manipulēt ar saskarnēm un maršrutiem konteinera nosaukumu telpā. Ierīces ieraksts /dev/net/tun ļauj procesam vispār atvērt tuneļa ierīci. Viena došana bez otra rada skaidru kļūdu, kas ir ērti: trūkstoša TUN ierīce neizdodas atvēršanā, savukārt trūkstoša iespēja neizdodas, kad klients mēģina konfigurēt saskarni.

Neviens no tiem neattaisno privileged: true. Privileģēts konteiners iegūst visas iespējas plus piekļuvi ierīcēm, un tā ir daudz lielāka piešķiršana, nekā šim darba apjomam vajag. izpildes vides privilēģiju un iespēju atsauce izskaidro, cik tālu šī piešķiršana sniedzas. Ja chart vai bloga ieraksts to prasa, vispirms pārbaudiet, vai prasība patiešām nebija trūkstošs ierīces ceļš vai trūkstoša iespēja.

entrypoint pārrakstīšana ir tā daļa, kas kož. openvpn tieša izsaukšana ir pareiza vienkāršam attēlam un nepareiza jebkuram produkta attēlam, kura palaišanas skripts pirms dēmona palaišanas sagatavo ugunsmūra noteikumus, resolvera failus vai akreditācijas datus. Šī skripta pārrakstīšana izlaiž sagatavošanu un atstāj jūs atkļūdot tuneli, kas pacēlās puslīdz konfigurētā nosaukumu telpā.

Palaidiet klientu priekšplānā un ļaujiet tam būt konteinera galvenajam procesam. Process, kas kļūst par dēmonu, nekavējoties iziet, konteiners restartējas cilpā, un nepieciešamie žurnāli ir izkaisīti pa restartiem, kuri visi izskatās vienādi.

Pārbaudiet no nosaukumu telpas iekšienes, nevis no resursdatora

Paceliet steku, žurnālā apstipriniet, ka klients sasniedza savienotu stāvokli, un pēc tam pārbaudiet nosaukumu telpu, kas patiešām satur tuneli.

docker compose up -d
docker compose logs --tail 40 vpn
docker compose exec vpn ip -br addr
docker compose exec vpn ip route

Adrešu sarakstā jābūt tuneļa saskarnei ar adresi no baseina, un maršrutu tabulā jābūt uz to vērstiem aizstumtiem galamērķiem. Ja saskarnes nav, klients nekad nesasniedza tās izveides punktu. Ja tā ir, bet neviens maršruts to neizmanto, meklēšanas vieta ir push vai maršruta opcijas.

Pēc tam pārbaudiet jums svarīgo galamērķi no nosaukumu telpas, kurai tunelis jāizmanto, ar lietojumprogrammu, nevis tikai ar ping. Nosaukumu atrisināšana ir atsevišķa kļūda, ko ir vērts pārbaudīt tieši: aizstumta DNS adrese pati neatsvaidzina konteinera resolveru, un neatkarīgs klients, kas ignorē push, atrisinās nosaukumus ar to, ko attēls ir konfigurējis.

Atvienotais stāvoklis ir līguma daļa

Atkārtotas savienošanas uzvedībai nepieciešama sava pārbaude, jo restartēšanas politika pierāda, ka process restartējas, un neko nepasaka par to, ko datplūsma dara starplaikā. Apturiet tuneli, izmēģiniet paredzēto galamērķi un vērojiet, vai savienojums tiek noraidīts, uzkaras vai klusi izdodas pa konteinera parasto maršrutu. Pēdējais iznākums ir tas, kam ir nozīme, un tas veselā žurnālā nav redzams.

Ja darba apjoms nekad nedrīkst izmantot parasto ceļu, projektējiet to tieši ar ugunsmūra noteikumiem un gatavības signālu nosaukumu telpā. Kill switch ir politika, ko jūs rakstāt un pārbaudāt, nevis īpašība, ko jūs mantojat, palaižot klientu konteinerā.

Visbeidzot, atcerieties robežu: šie maršruti dzīvo konteinera nosaukumu telpā un neaizstāj resursdatora maršrutēšanas tabulu. Docker pārsūtīšanas, tulkošanas un ugunsmūra noteikumi joprojām ir ārējā ceļa daļa, un publicētais ports nav VPN saskarne.

Saistītie raksti