Blog

Zabezpečení Docker kontejnerů pro multi-tenant hosting: Průvodce izolací krok za krokem

Naučte se, jak zabezpečit Docker kontejnery pro multi-tenant prostředí pomocí praktických bezpečnostních opatření, jako jsou neroot uživatelé, odebrané schopnosti, systémy souborů pouze pro čtení a izolace sítě.

Shrnutí

Provoz multi-tenant Docker hostingové platformy vyžaduje vzduchotěsnou izolaci kontejnerů, aby se zabránilo vzájemnému rušení tenantů nebo úniku na hostitele. Tento průvodce poskytuje konkrétní, krok za krokem postup zabezpečení, který můžete použít dnes. Naučíte se konfigurovat neroot uživatele, odebírat nepotřebné Linuxové schopnosti, připojovat souborové systémy jako pouze pro čtení, vynucovat omezení zdrojů pomocí cgroups, segmentovat sítě a používat profily seccomp nebo AppArmor. Také se budeme zabývat tím, kdy doplnit kontejnery virtuálními stroji pro maximální bezpečnost. Na konci budete mít kontrolní seznam pro systematické odstranění běžných vektorů úniku z kontejnerů a udržení vaší multi-tenant infrastruktury skutečně izolované.

Skutečný problém s multi-tenant kontejnery

Docker kontejnery sdílejí jádro hostitele a pokud je izolace špatně nakonfigurována, jeden tenant teoreticky může přistupovat k datům jiného, spotřebovat veškerý CPU nebo dokonce uniknout na hostitele. Jako poskytovatel hostingu potřebujete vzduchotěsné hranice bez obětování výkonnostních výhod kontejnerů. Mnoho týmů začíná s výchozím nastavením Dockeru, které je navrženo pro vývoj, ne pro produkční multi-tenancy. Dobrá zpráva: s systematickým kontrolním seznamem zabezpečení můžete uzamknout každý kontejner na úroveň izolace blízkou VM, přičemž si zachováte rychlost Dockeru.

Tento článek vás provede každým krokem zabezpečení s praktickými příklady a upozorněními. Na konci budete mít opakovatelný proces pro nasazení bezpečných multi-tenant kontejnerů.

Krok 1: Spouštějte kontejnery jako neroot uživatel

Ve výchozím nastavení Docker kontejnery běží jako root. Pokud je kontejner napaden, útočník získá root oprávnění uvnitř kontejneru a může se pokusit o únik z kontejneru. Nejprve vytvořte vyhrazeného uživatele v Dockerfile a přepněte na něj:

FROM ubuntu:22.04
RUN useradd -m appuser
USER appuser

Upozornění: Některé procesy (např. vazba na porty < 1024) vyžadují root. V těchto případech použijte příznak --cap-add pro udělení pouze potřebné schopnosti, jako --cap-add=NET_BIND_SERVICE, a proces stále spouštějte pod neroot uživatelem.

Pro více informací o základní izolaci si přečtěte našeho průvodce o dosažení skutečné multi-tenant izolace v Dockeru.

Krok 2: Odeberte všechny Linuxové schopnosti a přidejte zpět pouze to, co potřebujete

Linuxové schopnosti rozdělují root oprávnění na malé jednotky. Docker kontejnery přicházejí s výchozí sadou schopností, které jsou pro multi-tenant hosting příliš benevolentní. Odeberte všechny a přidejte zpět jen to, co vaše aplikace vyžaduje:

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

Běžné schopnosti, kterým se vyhnout: SYS_ADMIN (únik z kontejneru), NET_RAW (odposlouchávání paketů), SYS_PTRACE (ladění procesů). Použijte docker run s --security-opt no-new-privileges pro zabránění eskalaci oprávnění pomocí setuid binárek.

Krok 3: Připojte kořenový souborový systém jako pouze pro čtení

Útočníci často zapisují škodlivé skripty do souborového systému kontejneru. Tím, že nastavíte kořenový souborový systém jako pouze pro čtení, tomu zabráníte:

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

--tmpfs vytváří dočasný zapisovatelný mount pro adresáře jako /tmp a /var/run. Příznak noexec zabraňuje spouštění z tohoto mountu. Tento přístup nutí útočníky k přechodu přes zapisovatelné adresáře, které můžete monitorovat.

Krok 4: Vynucujte omezení zdrojů pomocí cgroups

Neomezené kontejnery mohou provádět útoky denial-of-service vyčerpáním paměti nebo CPU hostitele. Použijte runtime omezení 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 omezuje CPU.
  • --pids-limit zabraňuje fork bombám omezením počtu procesů.

Upozornění: Omezení zdrojů jsou vynucována cgroups, ale nezabraňují úniku dat přes síť. Zkombinujte s izolací sítě (další krok).

Krok 5: Segmentujte sítě pomocí vlastních sítí Dockeru

Ve výchozím nastavení Docker kontejnery sdílejí bridge síť. V multi-tenant nastavení musíte izolovat síťový stack každého tenanta. Vytvořte vyhrazenou síť pro každého tenanta:

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

Použijte příznak --internal pro blokování odchozího přístupu k internetu a poté vystavte pouze nezbytné porty přes -p. Pro pokročilejší segmentaci sítě zvažte zabezpečení webových aplikací pomocí Docker izolace.

Upozornění: Interní sítě zabraňují přímé komunikaci mezi kontejnery napříč tenanty, ale k únikům DNS může stále dojít, pokud používáte host networking. Držte se bridge nebo overlay sítí.

Krok 6: Použijte profily Seccomp a AppArmor

Seccomp filtruje systémová volání a AppArmor (nebo SELinux) vynucuje povinné řízení přístupu. Docker poskytuje výchozí seccomp profil, který blokuje nebezpečná syscalla jako clone s určitými příznaky. Pro přísnější izolaci vytvořte vlastní profil:

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

Základní profil můžete vygenerovat pomocí docker run --rm -it --security-opt seccomp=unconfined my-app strace -c -S time a poté zúžit. Upozornění: Příliš restriktivní profily mohou narušit legitimní funkčnost. Důkladně testujte ve stagingu.

Krok 7: Zvažte hybridní izolaci s virtuálními stroji

Pokud vaši tenanti vyžadují absolutní izolaci (např. regulované odvětví), spouštějte kontejnery uvnitř lehkého VM. Nástroje jako Sysbox nebo Kata Containers poskytují oddělení na úrovni hardwaru bez obětování rychlosti kontejnerů. Toto je přístup používaný Docker Enhanced Container Isolation (ECI). I když je režie vyšší než u holých kontejnerů, je mnohem nižší než u plných VM na jednu zátěž.

Pro více informací o výběru správné úrovně izolace si přečtěte navrhování multi-tenant Docker architektury.

Shrnutí: Kontrolní seznam zabezpečení

  1. Sestavte kontejnery s neroot uživatelem.
  2. Odeberte všechny schopnosti, přidejte pouze potřebné.
  3. Připojte souborový systém jako pouze pro čtení s dočasnými zapisovatelnými mounty.
  4. Nastavte limity paměti, CPU a PID.
  5. Vytvořte izolované Docker sítě na tenanta.
  6. Použijte vlastní profily seccomp a AppArmor.
  7. Zvažte hybridní VM kontejnery pro vysoké bezpečnostní potřeby.

Závěr

Zabezpečení kontejnerů není jednorázový úkol – je to neustálá disciplína. Výše uvedené kroky tvoří bezpečnostní základ pro multi-tenant hosting. Pamatujte, že žádné jednotlivé opatření nezaručuje bezpečnost; klíčová je obrana do hloubky. Začněte se základy: neroot uživatelé a odebrané schopnosti. Poté přidejte omezení zdrojů a segmentaci sítě. Pro nejcitlivější zátěže zkombinujte kontejnery s VM. S tímto průvodcem můžete s jistotou nasadit multi-tenant Docker prostředí, která jsou jak efektivní, tak bezpečná.

Sources (5)