Blog

Zabezpečenie Docker kontajnerov pre multi-tenant hosting: Sprievodca izoláciou krok za krokom

Naučte sa, ako zabezpečiť Docker kontajnerov pre multi-tenant prostredia pomocou praktických bezpečnostných opatrení, ako sú používatelia bez root práv, odobraté schopnosti, súborové systémy iba na čítanie a sieťová izolácia.

Zhrnutie

Prevádzka multi-tenant Docker hostingovej platformy vyžaduje vzduchotesnú izoláciu kontajnerov, aby sa zabránilo vzájomnému rušeniu tenantov alebo úniku na hostiteľa. Tento sprievodca poskytuje konkrétny, krok za krokom proces zabezpečenia, ktorý môžete aplikovať už dnes. Naučíte sa konfigurovať používateľov bez root práv, odobrať nepotrebné schopnosti Linuxu, pripojiť súborové systémy ako len na čítanie, vynútiť limity zdrojov cez cgroups, segmentovať siete a aplikovať profily seccomp alebo AppArmor. Tiež sa pozrieme na to, kedy doplniť kontajnery virtuálnymi strojmi pre maximálnu bezpečnosť. Na konci budete mať kontrolný zoznam na systematické odstránenie bežných vektorov úniku z kontajnerov a udržanie vašej multi-tenant infraštruktúry skutočne izolovanej.

Skutočný problém s multi-tenant kontajnermi

Docker kontajnery zdieľajú jadro hostiteľa, a ak je izolácia nesprávne nakonfigurovaná, jeden tenant môže teoreticky získať prístup k údajom iného, spotrebovať všetok CPU alebo dokonca uniknúť na hostiteľa. Ako poskytovateľ hostingu potrebujete vzduchotesné hranice bez obetovania výkonnostných výhod kontajnerov. Mnoho tímov začína s predvolenými nastaveniami Dockeru, ktoré sú určené pre vývoj, nie pre produkčný multi-tenant hosting. Dobrá správa: so systematickým kontrolným zoznamom zabezpečenia môžete uzamknúť každý kontajner na úroveň izolácie blízku VM, pričom si zachováte rýchlosť Dockeru.

Tento článok vás prevedie každým krokom zabezpečenia s praktickými príkladmi a upozorneniami. Na konci budete mať opakovateľný proces na nasadenie bezpečných multi-tenant kontajnerov.

Krok 1: Spúšťajte kontajnery ako používateľ bez root práv

Predvolene sa Docker kontajnery spúšťajú ako root. Ak je kontajner napadnutý, útočník získa root privilegiá v kontajneri a môže sa pokúsiť o únik. Najprv vytvorte vyhradeného používateľa v Dockerfile a prepnite na neho:

FROM ubuntu:22.04
RUN useradd -m appuser
USER appuser

Upozornenie: Niektoré procesy (napr. viazanie na porty pod 1024) vyžadujú root. V takých prípadoch použite príznak --cap-add na udelenie len potrebnej schopnosti, napríklad --cap-add=NET_BIND_SERVICE, a stále spúšťajte proces pod používateľom bez root práv.

Viac o základnej izolácii nájdete v našom sprievodcovi o dosiahnutí skutočnej multi-tenant izolácie v Docker.

Krok 2: Odoberte všetky schopnosti Linuxu a pridajte späť len to, čo potrebujete

Linuxové schopnosti rozdeľujú root privilegiá na malé jednotky. Docker kontajnery prichádzajú s predvolenou sadou schopností, ktoré sú príliš permisívne pre multi-tenant hosting. Odoberte všetky a pridajte späť len tie, ktoré vaša aplikácia vyžaduje:

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

Bežné schopnosti, ktorým sa vyhnúť: SYS_ADMIN (únik z kontajnera), NET_RAW (odpočúvanie paketov), SYS_PTRACE (ladenie procesov). Použite docker run s --security-opt no-new-privileges na zabránenie eskalácie privilegií prostredníctvom setuid binárok.

Krok 3: Pripojte koreňový súborový systém ako len na čítanie

Útočníci často píšu škodlivé skripty do súborového systému kontajnera. Tým, že koreňový súborový systém nastavíte ako len na čítanie, tomu zabránite:

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

--tmpfs vytvára dočasný zapisovateľný mount pre adresáre ako /tmp a /var/run. Príznak noexec zabraňuje spúšťaniu z tohto mountu. Tento prístup núti útočníkov prechádzať cez zapisovateľné adresáre, ktoré môžete monitorovať.

Krok 4: Vynúťte limity zdrojov pomocou cgroups

Neobmedzené kontajnery môžu vykonávať denial-of-service útoky vyčerpaním pamäte alebo CPU hostiteľa. Použite runtime obmedzenia Dockeru:

docker run --memory=512m --memory-swap=512m --cpus=0.5 --pids-limit=100 my-app
  • --memory a --memory-swap nastavujú pevné limity (bez swapu).
  • --cpus obmedzuje CPU.
  • --pids-limit zabraňuje fork bombám obmedzením počtu procesov.

Upozornenie: Limity zdrojov sú vynucované cgroups, ale nezabránia exfiltrácii údajov cez sieť. Kombinujte so sieťovou izoláciou (ďalší krok).

Krok 5: Segmentujte siete pomocou vlastných Docker sietí

Predvolene zdieľajú Docker kontajnery mostovú sieť. V multi-tenant nastavení musíte izolovať sieťový stack každého tenanta. Vytvorte vyhradenú sieť pre každého tenanta:

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

Použite príznak --internal na blokovanie odchádzajúceho internetového prístupu, potom vystavte iba potrebné porty cez -p. Pre pokročilejšiu segmentáciu siete zvážte zabezpečenie webových aplikácií pomocou Docker izolácie.

Upozornenie: Interné siete zabraňujú priamej komunikácii kontajnerov medzi tenantmi, ale úniky DNS sa môžu stále vyskytnúť, ak používate hostiteľskú sieť. Držte sa mostových alebo overlay sietí.

Krok 6: Aplikujte profily seccomp a AppArmor

Seccomp filtruje systémové volania a AppArmor (alebo SELinux) vynucuje povinné prístupové kontroly. Docker poskytuje predvolený seccomp profil, ktorý blokuje nebezpečné syscally ako clone s určitými príznakmi. Pre prísnejšiu izoláciu vytvorte vlastný profil:

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

Môžete vygenerovať základný profil pomocou docker run --rm -it --security-opt seccomp=unconfined my-app strace -c -S time a potom ho orezat. Upozornenie: Príliš reštriktívne profily môžu narušiť legitímnu funkcionalitu. Dôkladne testujte v stagingu.

Krok 7: Zvážte hybridnú izoláciu s virtuálnymi strojmi

Ak vaši tenanti vyžadujú absolútnu izoláciu (napr. regulované odvetvie), spúšťajte kontajnery v ľahkom VM. Nástroje ako Sysbox alebo Kata Containers poskytujú oddelenie na úrovni hardvéru bez obetovania rýchlosti kontajnerov. Tento prístup používa Docker Enhanced Container Isolation (ECI). Aj keď je réžia vyššia ako pri holých kontajneroch, je oveľa nižšia ako pri plných VM na pracovné zaťaženie.

Viac o výbere správnej úrovne izolácie si prečítajte v navrhovaní multi-tenant Docker architektúry.

Zhrnutie do jedného: Kontrolný zoznam zabezpečenia

  1. Vytvorte kontajnery s používateľom bez root práv.
  2. Odoberte všetky schopnosti, pridajte len potrebné.
  3. Pripojte súborový systém len na čítanie s dočasnými zapisovateľnými mountmi.
  4. Nastavte limity pamäte, CPU a PID.
  5. Vytvorte izolované Docker siete pre každého tenanta.
  6. Aplikujte vlastné profily seccomp a AppArmor.
  7. Zvážte hybridné VM kontajnery pre vysoké bezpečnostné potreby.

Záver

Zabezpečenie kontajnerov nie je jednorazová úloha – je to neustála disciplína. Vyššie uvedené kroky tvoria bezpečnostnú základňu pre multi-tenant hosting. Pamätajte, že žiadne jedno opatrenie nezaručuje bezpečnosť; kľúčová je hĺbková obrana. Začnite so základmi: používatelia bez root práv a odobraté schopnosti. Potom vrstvite limity zdrojov a sieťovú segmentáciu. Pre najcitlivejšie pracovné zaťaženia kombinujte kontajnery s VM. S týmto sprievodcom môžete s istotou nasadiť multi-tenant Docker prostredia, ktoré sú efektívne aj bezpečné.

Sources (5)