Blog

Utrjevanje Docker zabojnikov za večnajemniško gostovanje: Vodnik po korakih za izolacijo

Naučite se, kako zavarovati Docker zabojnike za večnajemniška okolja s praktičnimi varnostnimi ukrepi, kot so ne-root uporabniki, odvzete zmogljivosti, datotečni sistemi samo za branje in omrežna izolacija.

Povzetek

Vodenje večnajemniške platforme za gostovanje Docker zahteva nepredušno izolacijo zabojnikov, da preprečite najemnikom, da bi motili drug drugega ali pobegnili v gostiteljski sistem. Ta vodnik ponuja konkreten postopek utrjevanja po korakih, ki ga lahko uporabite že danes. Naučili se boste konfigurirati ne-root uporabnike, odvzeti nepotrebne zmogljivosti Linuxa, namestiti datotečne sisteme kot samo za branje, uveljaviti omejitve virov prek cgroups, segmentirati omrežja in uporabiti profile seccomp ali AppArmor. Pokrili bomo tudi, kdaj dopolniti zabojnike z navideznimi stroji za največjo varnost. Na koncu boste imeli kontrolni seznam za sistematično odpravljanje pogostih vektorjev za pobeg iz zabojnikov in ohranjanje resnično izolirane večnajemniške infrastrukture.

Resnični problem z večnajemniškimi zabojniki

Docker zabojniki si delijo jedro gostitelja, in če je izolacija napačno konfigurirana, lahko en najemnik teoretično dostopa do podatkov drugega, porabi ves CPU ali celo pobegne v gostitelj. Kot ponudnik gostovanja potrebujete nepredušne meje, ne da bi žrtvovali prednosti zmogljivosti zabojnikov. Številne ekipe začnejo s privzetimi nastavitvami Docker, ki so zasnovane za razvoj, ne za produkcijsko večnajemništvo. Dobra novica: s sistematičnim kontrolnim seznamom za utrjevanje lahko zaklenete vsak zabojnik na približno raven izolacije VM, hkrati pa ohranite hitrost Dockerja.

Ta članek vas vodi skozi vsak korak utrjevanja s praktičnimi primeri in opozorili. Na koncu boste imeli ponovljiv postopek za uvajanje varnih večnajemniških zabojnikov.

1. korak: Zagon zabojnikov kot ne-root

Privzeto Docker zabojniki tečejo kot root. Če je zabojnik ogrožen, napadalec pridobi root privilegije v zabojniku in lahko poskusi pobegniti iz zabojnika. Najprej ustvarite namenskega uporabnika v Dockerfile in preklopite nanj:

FROM ubuntu:22.04
RUN useradd -m appuser
USER appuser

Opozorilo: Nekateri procesi (npr. vezava na porte < 1024) zahtevajo root. V takih primerih uporabite zastavico --cap-add, da dodelite samo potrebno zmogljivost, kot je --cap-add=NET_BIND_SERVICE, in še vedno zaženite proces pod ne-root uporabnikom.

Za več o temeljni izolaciji si oglejte naš vodnik o doseganju resnične večnajemniške izolacije v Dockerju.

2. korak: Odvzem vseh zmogljivosti Linuxa in dodajanje samo tistih, ki jih potrebujete

Zmogljivosti Linuxa razčlenijo root privilegije na majhne enote. Docker zabojniki imajo privzet nabor zmogljivosti, ki je preveč permisiven za večnajemniško gostovanje. Odvzemite vse in dodajte nazaj samo tiste, ki jih zahteva vaša aplikacija:

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

Pogoste zmogljivosti, ki se jim je treba izogniti: SYS_ADMIN (pobeg iz zabojnika), NET_RAW (prestrezanje paketov), SYS_PTRACE (razhroščevanje procesov). Uporabite docker run z --security-opt no-new-privileges, da preprečite povišanje privilegijev prek setuid binarnih datotek.

3. korak: Namestitev korenskega datotečnega sistema kot samo za branje

Napadalci pogosto zapišejo zlonamerne skripte v datotečni sistem zabojnika. S tem, ko naredite korenski datotečni sistem samo za branje, to preprečite:

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

--tmpfs ustvari začasno zapisljivo priklopno točko za imenike, kot sta /tmp in /var/run. Zastavica noexec prepreči izvajanje s te priklopne točke. Ta pristop prisili napadalce, da manevrirajo skozi zapisljive imenike, kar lahko spremljate.

4. korak: Uveljavitev omejitev virov s cgroups

Neomejeni zabojniki lahko izvedejo napade zavrnitve storitve z izčrpanjem pomnilnika ali CPU gostitelja. Uporabite Dockerjeve omejitve ob zagonu:

docker run --memory=512m --memory-swap=512m --cpus=0.5 --pids-limit=100 my-app
  • --memory in --memory-swap nastavita trde omejitve (brez swap).
  • --cpus omeji CPU.
  • --pids-limit prepreči fork bombe z omejitvijo števila procesov.

Opozorilo: Omejitve virov se uveljavljajo s cgroups, vendar ne preprečujejo izvleka podatkov prek omrežja. Kombinirajte z omrežno izolacijo (naslednji korak).

5. korak: Segmentacija omrežij z Dockerjevimi namenskimi omrežji

Privzeto Docker zabojniki delijo mostično omrežje. V večnajemniški postavitvi morate izolirati omrežje vsakega najemnika. Ustvarite namensko omrežje za vsakega najemnika:

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

Uporabite zastavico --internal, da blokirate odhodni internetni dostop, nato pa izpostavite samo potrebne porte z -p. Za naprednejšo segmentacijo omrežja razmislite o zavarovanju spletnih aplikacij z Docker izolacijo.

Opozorilo: Notranja omrežja preprečujejo neposredno komunikacijo med zabojniki med najemniki, vendar lahko še vedno pride do uhajanja DNS, če uporabljate gostiteljsko omrežje. Držite se mostičnih ali prekrivnih omrežij.

6. korak: Uporaba profilov Seccomp in AppArmor

Seccomp filtrira sistemske klice, AppArmor (ali SELinux) pa uveljavlja obvezni nadzor dostopa. Docker zagotavlja privzeti profil seccomp, ki blokira nevarne sistemske klice, kot je clone z določenimi zastavicami. Za strožjo izolacijo ustvarite lasten profil:

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

Osnovni profil lahko ustvarite z docker run --rm -it --security-opt seccomp=unconfined my-app strace -c -S time in ga nato skrajšate. Opozorilo: Preveč omejevalni profili lahko zlomijo zakonito funkcionalnost. Temeljito preizkusite v predprodukcijskem okolju.

7. korak: Razmislite o hibridni izolaciji z navideznimi stroji

Če vaši najemniki zahtevajo absolutno izolacijo (npr. regulirana industrija), zaženite zabojnike znotraj lahkega VM. Orodja, kot sta Sysbox ali Kata Containers, zagotavljajo ločitev na ravni strojne opreme brez žrtvovanja hitrosti zabojnikov. To je pristop, ki ga uporablja Docker Enhanced Container Isolation (ECI). Čeprav je obremenitev višja kot pri golih zabojnikih, je precej nižja kot pri polnih VM na delovno obremenitev.

Za več o izbiri prave ravni izolacije preberite načrtovanje večnajemniške Docker arhitekture.

Vse skupaj: Kontrolni seznam za utrjevanje

  1. Zgradite zabojnike z ne-root uporabnikom.
  2. Odvzemite vse zmogljivosti, dodajte samo potrebne.
  3. Namestite datotečni sistem samo za branje z začasnimi zapisljivimi priklopnimi točkami.
  4. Nastavite omejitve pomnilnika, CPU in PID.
  5. Ustvarite izolirana Docker omrežja za vsakega najemnika.
  6. Uporabite lastne profile seccomp in AppArmor.
  7. Ocenite hibridne VM zabojnike za visoke varnostne potrebe.

Zaključek

Utrjevanje zabojnikov ni enkratna naloga – je stalna disciplina. Zgornji koraki tvorijo varnostno izhodišče za večnajemniško gostovanje. Ne pozabite, da noben posamezen ukrep ne zagotavlja varnosti; ključna je obramba v globino. Začnite z osnovami: ne-root uporabniki in odvzete zmogljivosti. Nato dodajte plasti omejitev virov in segmentacije omrežja. Za najbolj občutljive delovne obremenitve kombinirajte zabojnike z VM. S tem vodnikom lahko samozavestno uvajate večnajemniška Docker okolja, ki so hkrati učinkovita in varna.

Sources (5)