Emuārs

Docker konteineru nostiprināšana vairāku nomnieku mitināšanai: soli pa solim izolācijas ceļvedis

Uzziniet, kā nostiprināt Docker konteinerus vairāku nomnieku vidēs ar praktiskiem drošības pasākumiem, piemēram, ne-root lietotājiem, atņemtām iespējām, tikai lasāmiem failu sistēmām un tīkla izolāciju.

Kopsavilkums

Lai nodrošinātu vairāku nomnieku Docker mitināšanas platformu, nepieciešama hermētiska konteineru izolācija, lai novērstu nomnieku savstarpēju ietekmēšanu vai izkļūšanu uz resursdatoru. Šis ceļvedis sniedz konkrētu, soli pa solim izklāstītu nostiprināšanas procesu, ko varat piemērot jau šodien. Jūs uzzināsiet, kā konfigurēt ne-root lietotājus, atņemt nevajadzīgās Linux iespējas, montēt failu sistēmas kā tikai lasāmas, ieviest resursu ierobežojumus, izmantojot cgroups, segmentēt tīklus un piemērot seccomp vai AppArmor profilus. Mēs arī apskatīsim, kad papildināt konteinerus ar virtuālajām mašīnām maksimālai drošībai. Beigās jums būs kontrolsaraksts, lai sistemātiski novērstu tipiskus konteineru izkļūšanas veidus un uzturētu jūsu vairāku nomnieku infrastruktūru patiesi izolētu.

Reālās pasaules problēma ar vairāku nomnieku konteineriem

Docker konteineri koplieto resursdatora kodolu, un, ja izolācija ir nepareizi konfigurēta, viens nomnieks teorētiski var piekļūt cita datiem, patērēt visu CPU vai pat izkļūt uz resursdatoru. Kā mitināšanas pakalpojumu sniedzējam jums ir nepieciešamas hermētiskas robežas, nezaudējot konteineru veiktspējas priekšrocības. Daudzas komandas sāk ar noklusējuma Docker iestatījumiem, kas ir paredzēti izstrādei, nevis ražošanas vairāku nomnieku darbam. Labā ziņa: ar sistemātisku nostiprināšanas kontrolsarakstu jūs varat nostiprināt katru konteineru līdz gandrīz VM līmeņa izolācijai, saglabājot Docker ātrumu.

Šis raksts jūs iepazīstinās ar katru nostiprināšanas soli, sniedzot praktiskus piemērus un brīdinājumus. Beigās jums būs atkārtojams process, lai izvietotu drošus vairāku nomnieku konteinerus.

1. solis: Palaist konteinerus kā ne-root lietotājs

Pēc noklusējuma Docker konteineri darbojas kā root. Ja konteiners tiek apdraudēts, uzbrucējs iegūst root tiesības konteinerā un var mēģināt izkļūt. Vispirms izveidojiet īpašu lietotāju savā Dockerfile un pārslēdzieties uz to:

FROM ubuntu:22.04
RUN useradd -m appuser
USER appuser

Brīdinājums: Dažiem procesiem (piemēram, piesiešanai pie portiem < 1024) ir nepieciešams root. Šādos gadījumos izmantojiet karogu --cap-add, lai piešķirtu tikai nepieciešamo iespēju, piemēram, --cap-add=NET_BIND_SERVICE, un joprojām palaidiet procesu kā ne-root lietotājs.

Plašāk par pamata izolāciju skatiet mūsu ceļvedī par patiesas vairāku nomnieku izolācijas panākšanu Docker.

2. solis: Atņemiet visas Linux iespējas un pievienojiet atpakaļ tikai nepieciešamās

Linux iespējas sadala root tiesības mazās vienībās. Docker konteineriem ir noklusējuma iespēju kopa, kas ir pārāk atļaujoša vairāku nomnieku mitināšanai. Atņemiet visas un pievienojiet atpakaļ tikai to, ko jūsu lietojumprogramma prasa:

docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE my-app

Bieži izvairieties no šādām iespējām: SYS_ADMIN (konteinera izkļūšana), NET_RAW (pakešu noklausīšanās), SYS_PTRACE (procesu atkļūdošana). Izmantojiet docker run ar --security-opt no-new-privileges, lai novērstu privilēģiju eskalāciju, izmantojot setuid bināros failus.

3. solis: Montējiet saknes failu sistēmu kā tikai lasāmu

Uzbrucēji bieži ieraksta ļaunprātīgus skriptus konteinera failu sistēmā. Padarot saknes failu sistēmu tikai lasāmu, jūs to novēršat:

docker run --read-only --tmpfs /tmp:rw,noexec,nosuid,size=64m my-app

--tmpfs izveido pagaidu rakstāmu montējumu direktorijiem, piemēram, /tmp un /var/run. Karogs noexec novērš izpildi no šī montējuma. Šī pieeja piespiež uzbrucējus manevrēt caur rakstāmiem direktorijiem, ko varat uzraudzīt.

4. solis: Ieviest resursu ierobežojumus ar cgroups

Neierobežoti konteineri var veikt pakalpojuma atteikuma uzbrukumus, izsmeļot resursdatora atmiņu vai CPU. Izmantojiet Docker izpildlaika ierobežojumus:

docker run --memory=512m --memory-swap=512m --cpus=0.5 --pids-limit=100 my-app
  • --memory un --memory-swap nosaka stingras robežas (bez maiņas).
  • --cpus ierobežo CPU.
  • --pids-limit novērš fork bumbas, ierobežojot procesu skaitu.

Brīdinājums: Resursu ierobežojumus uzrauga cgroups, taču tie nenovērš datu noplūdi caur tīklu. Apvienojiet ar tīkla izolāciju (nākamais solis).

5. solis: Segmentējiet tīklus ar Docker pielāgotiem tīkliem

Pēc noklusējuma Docker konteineri koplieto tilta tīklu. Vairāku nomnieku iestatījumos jums ir jāizolē katra nomnieka tīkla steks. Izveidojiet īpašu tīklu katram nomniekam:

docker network create tenant-alpha --internal
docker run --network tenant-alpha my-app

Izmantojiet karogu --internal, lai bloķētu izejošo interneta piekļuvi, pēc tam atklājiet tikai nepieciešamos portus, izmantojot -p. Par uzlabotu tīkla segmentāciju apsveriet tīmekļa lietotņu aizsardzību ar Docker izolāciju.

Brīdinājums: Iekšējie tīkli novērš tiešu konteineru savstarpēju saziņu starp nomniekiem, taču DNS noplūdes joprojām var notikt, ja izmantojat resursdatora tīklu. Pieturieties pie tilta vai pārklājuma tīkliem.

6. solis: Piemērot Seccomp un AppArmor profilus

Seccomp filtrē sistēmas izsaukumus, un AppArmor (vai SELinux) nodrošina obligātas piekļuves kontroles. Docker nodrošina noklusējuma seccomp profilu, kas bloķē bīstamus sistēmas izsaukumus, piemēram, clone ar noteiktiem karogiem. Stingrākai izolācijai izveidojiet pielāgotu profilu:

docker run --security-opt seccomp=./custom.json --security-opt apparmor=docker-default my-app

Jūs varat ģenerēt bāzes profilu ar docker run --rm -it --security-opt seccomp=unconfined my-app strace -c -S time un pēc tam to sašaurināt. Brīdinājums: Pārāk ierobežojoši profili var sabojāt likumīgu funkcionalitāti. Rūpīgi testējiet testa vidē.

7. solis: Apsvērt hibrīda izolāciju ar virtuālajām mašīnām

Ja jūsu nomniekiem nepieciešama absolūta izolācija (piemēram, regulēta nozare), palaidiet konteinerus vieglas virtuālās mašīnas iekšienē. Tādi rīki kā Sysbox vai Kata Containers nodrošina aparatūras līmeņa atdalīšanu, nezaudējot konteineru ātrumu. Šo pieeju izmanto Docker Enhanced Container Isolation (ECI). Lai gan pārslodze ir lielāka nekā tukšiem konteineriem, tā ir daudz mazāka nekā pilnām virtuālajām mašīnām uz vienu darba slodzi.

Plašāk par pareizā izolācijas līmeņa izvēli lasiet vairāku nomnieku Docker arhitektūras izstrādē.

Apvienojot visu: Nostiprināšanas kontrolsaraksts

  1. Veidojiet konteinerus ar ne-root lietotāju.
  2. Atņemiet visas iespējas, pievienojiet tikai nepieciešamās.
  3. Montējiet failu sistēmu tikai lasāmu ar pagaidu rakstāmiem montējumiem.
  4. Iestatiet atmiņas, CPU un PID ierobežojumus.
  5. Izveidojiet izolētus Docker tīklus katram nomniekam.
  6. Piemērojiet pielāgotus seccomp un AppArmor profilus.
  7. Izvērtējiet hibrīda VM konteinerus augstas drošības vajadzībām.

Secinājums

Konteinera nostiprināšana nav vienreizējs uzdevums – tā ir nepārtraukta disciplīna. Iepriekš minētie soļi veido drošības pamatu vairāku nomnieku mitināšanai. Atcerieties, ka neviens atsevišķs pasākums negarantē drošību; būtiska ir aizsardzība dziļumā. Sāciet ar pamatiem: ne-root lietotājiem un atņemtajām iespējām. Pēc tam pievienojiet resursu ierobežojumus un tīkla segmentāciju. Vissensitīvākajām darba slodzēm apvienojiet konteinerus ar VM. Izmantojot šo ceļvedi, jūs varat droši izvietot vairāku nomnieku Docker vides, kas ir gan efektīvas, gan drošas.

Sources (5)