Blog

Podrobný plán pro multi-tenant izolaci v Dockeru

Izolujte multi-tenant úlohy v Dockeru a mějte náklady na hosting pod kontrolou. Zjistěte, jak konfigurovat namespaces, cgroups, síťové zásady a zabezpečení běhového prostředí.

Shrnutí

Správa sdílené infrastruktury pro kampaně více klientů nebo interní webové projekty často vyvolává neshody s vedením kvůli nákladům na hosting a bezpečnosti dat. Kontejnery Docker představují lehkou alternativu k dedikovaným virtuálním strojům, avšak výchozí nastavení ponechává závažné mezery v izolaci. Skutečná multi-tenancy vyžaduje promyšlené hranice na úrovni jádra, procesů, sítě a úložiště. Tento průvodce přináší praktický pětikrokový rámec pro zabezpečení multi-tenant nasazení Dockeru pomocí nativních izolačních primitiv Linuxu. Dozvíte se, jak vynutit kvóty prostředků, omezit oprávnění procesů, segmentovat kontejnerové sítě a zvolit správnou úroveň izolace. Podle tohoto plánu ochráníte prostředí jednotlivých tenantů a obhájíte rozpočet na infrastrukturu před netechnickým managementem.

Váš netechnický manažer přichází do kanceláře s vytištěnou fakturou za cloudový hosting za minulý měsíc. Náklady vzrostly, a přesto několik prioritních landing pages zaznamenalo výkyvy v latenci během souběžného spuštění produktů. Dostáváte otázky, proč marketingové weby sdílejí servery, zda nejsou vystavena klientská data a proč tým nemůže spustit drahý dedikovaný virtuální stroj pro každou jednotlivou kampaň.

Když každému digitálnímu projektu přidělíte vlastní virtuální stroj (VM), eliminujete problém „hlučných sousedů“ (noisy neighbors), ale rychle vyčerpáte provozní rozpočet. Standardní nasazení Dockeru řeší problém s náklady spuštěním více webů na jediném jádře operačního systému, ale výchozí konfigurace ponechávají nebezpečné bezpečnostní mezery. Pokud se v aplikaci jednoho tenanta vyskytne nekontrolovaný skript nebo dojde k jejímu prolomení, každá další aplikace na daném hostiteli je v ohrožení.

Pomocí tohoto podrobného technického plánu nakonfigurujte důkladnou multi-tenant izolaci v Dockeru. Zaveďte těchto pět provozních kroků, abyste ochránili stabilitu systému, izolovali data tenantů a přeložili technická rozhodnutí o infrastruktuře do srozumitelné obchodní hodnoty pro vedení společnosti.


1. Vynuťte striktní kvóty prostředků pomocí Control Groups

Okamžitě nastavte explicitní limity pro CPU, paměť a diskové I/O operace u každého kontejneru. Když více tenantů sdílí společného hostitele, neomezené kontejnery soupeří o systémové prostředky. Jeden nekontrolovaný databázový dotaz nebo kampaň s vysokou návštěvností může spotřebovat veškerou paměť hostitele a spustit Linux Out-Of-Memory (OOM) killer, který začne ukončovat náhodné systémové procesy.

Linuxové control groups (cgroups) řídí, jakou výpočetní kapacitu může daný kontejner spotřebovat. Aplikujte tyto hranice přímo v definicích nasazení:

services:
  tenant_app:
    image: nginx:alpine
    deploy:
      resources:
        limits:
          cpus: '0.75'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M
  • Limity paměti (limits.memory): Stanovují pevný strop. Pokud kontejner překročí 512 megabajtů, jádro ukončí procesy uvnitř tohoto kontejneru, aniž by to ovlivnilo sousední tenanty.
  • Rezervace paměti (reservations.memory): Garantují základní alokaci paměti, aby aplikace s nízkou návštěvností zůstaly responzivní.
  • Limity CPU (limits.cpus): Omezují kontejner na maximální podíl dostupných jader CPU, čímž brání vyčerpání CPU jedním tenantem.

Při obhajobě této architektury před netechnickými manažery přirovnejte cgroups k automatizovaným podružným elektroměrům. Stejně jako nájemci v kancelářské budově platí za svou vlastní spotřebu elektřiny, místo aby přetížili hlavní jistič, cgroups zajišťují, že jedna vysoce navštěvovaná landing page nikdy neshodí portál pro sběr leadů jiného klienta. Podrobnější pohled na kompromisy v architektuře naleznete v našem průvodci návrhem multi-tenant architektury.


2. Segmentujte procesy tenantů pomocí Namespaces a non-root uživatelů

Nikdy nespouštějte kontejnerové procesy pod výchozím uživatelem root. Ve standardních linuxových kontejnerových prostředích odpovídá uživatel root uvnitř kontejneru uživateli root na hostitelském jádře, pokud není explicitně přemapován. Pokud útočník prolomí webovou aplikaci běžící pod rootem, získá zvýšená oprávnění nad celým sdíleným hostitelem.

Vynuťte izolaci procesů prostřednictvím uživatelských jmenných prostorů (user namespaces) a explicitního spouštění bez rootovských práv:

  1. Definujte neprivilegované běhové uživatele: Vytvořte ve svých Dockerfiles vyhrazené služební uživatele s nízkými oprávněními.
    FROM php:8.2-fpm-alpine
    RUN addgroup -g 10001 tenantgroup && \n       adduser -u 10001 -D -G tenantgroup tenantuser
    USER tenantuser
    
  2. Povolte User Namespaces (userns-remap): Nakonfigurujte daemona Dockeru (/etc/docker/daemon.json) tak, aby přemapoval ID uživatelů kontejneru na neprivilegovaný rozsah na hostiteli.
    {
      "userns-remap": "default"
    }
    

Linuxové jmenné prostory (namespaces) rozdělují viditelnost systému. Jmenný prostor Process ID (PID) zajišťuje, že Tenant A nemůže vidět, posílat signály ani ukončovat procesy patřící Tenantovi B. Mount (MNT) namespace poskytuje každému tenantovi izolovaný pohled na souborový systém, zatímco IPC namespaces blokují neautorizovanou meziprocesovou komunikaci.

Přemapování uživatelských jmenných prostorů eliminuje vektory úniku z kontejneru (container escape): proces, který se uvnitř svého kontejneru považuje za root (UID 0), je na hostitelském počítači namapován na neprivilegované ID (například UID 165536). Pokud exploit překoná bariéry kontejneru, útočník se ocitne v neprivilegovaném shellu a nemůže upravovat konfigurace hostitele ani přistupovat k adresářům sousedních tenantů.


3. Odeberte oprávnění jádra a vynuťte souborové systémy pouze pro čtení

Omezte dostupné linuxové schopnosti (capabilities) a nastavte kořenový souborový systém kontejneru při startu jako neměnný. Výchozí běhová prostředí kontejnerů udělují přibližně tucet schopností linuxového jádra, z nichž mnohé webové aplikace vůbec nepotřebují. Nadbytečné schopnosti poskytují útočníkům nástroje pro manipulaci se směrováním sítě, změnu systémového času hostitele nebo obcházení řízení přístupu k souborům.

Zabezpečte běžící kontejnery odebráním všech výchozích capabilities a přidáním pouze nezbytných provozních příznaků:

services:
  tenant_web:
    image: custom-nginx:latest
    read_only: true
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE
    security_opt:
      - no-new-privileges:true
      - seccomp=default.json
    tmpfs:
      - /tmp:rw,noexec,nosuid,size=64m
      - /var/run:rw,noexec,nosuid,size=16m
  • cap_drop: - ALL: Odebere procesu kontejneru veškeré schopnosti jádra.
  • cap_add: - NET_BIND_SERVICE: Explicitně povolí navázání na privilegované porty (jako 80 a 443), přičemž zablokuje přímou manipulaci se síťovými sockety (raw sockets).
  • read_only: true: Připojí celý kořenový souborový systém kontejneru pouze pro čtení. Útočníci tak nemohou stahovat škodlivé binární soubory, upravovat PHP skripty ani měnit konfigurační soubory webového serveru.
  • tmpfs: Alokuje dočasné adresáře v paměti RAM pro nezbytné odkládací soubory (např. /tmp) a zároveň blokuje spouštění binárních souborů (noexec) a eskalaci oprávnění (nosuid).

Aplikujte filtry Secure Computing Mode (seccomp) a bezpečnostní moduly jako AppArmor nebo SELinux k zachycení a omezení systémových volání směřujících na sdílené jádro hostitele. Pokud váš tým spravuje vlastní sestavení webových aplikací, postupujte podle našich strukturovaných kroků pro zabezpečení a hardening Docker kontejnerů v rámci vašich deployment pipelines.


4. Rozdělte sítě mezi prostředími tenantů

Vypněte výchozí bridge síť a vytvořte vlastní, izolované softwarově definované bridge sítě pro stack každého tenanta. Ve výchozím nastavení mohou kontejnery umístěné ve standardní bridge síti Dockeru navzájem komunikovat a objevovat se prostřednictvím interních IP adres. Zranitelnost v marketingové mikroslužbě jednoho tenanta tak umožňuje laterální pohyb ke všem ostatním interním databázím a aplikacím na daném hostiteli.

Zcela izolujte provoz jednotlivých tenantů deklarací nezávislých síťových bridge rozhraní pro každého z nich:

networks:
  tenant_alpha_net:
    driver: bridge
    internal: true
  tenant_beta_net:
    driver: bridge
    internal: true
  public_gateway_net:
    driver: bridge

services:
  alpha_app:
    image: tenant_a_app:latest
    networks:
      - tenant_alpha_net
      - public_gateway_net

  alpha_db:
    image: mariadb:10.11
    networks:
      - tenant_alpha_net

  beta_app:
    image: tenant_b_app:latest
    networks:
      - tenant_beta_net
      - public_gateway_net

  beta_db:
    image: mariadb:10.11
    networks:
      - tenant_beta_net
  • Izolace tenantů: alpha_app a alpha_db komunikují výhradně přes tenant_alpha_net. beta_app nemá k alpha_db přístup, a to ani v případě, že útočník proskenuje interní podsíť.
  • Příznak Internal (internal: true): Zabraňuje databázovým sítím směrovat provoz přímo do vnějšího internetu a omezuje příchozí i odchozí přístup výhradně na aplikační kontejnery.
  • Reverse Proxy Gateway: K síti public_gateway_net se připojuje pouze vstupní proxy, která směruje příchozí HTTP/HTTPS požadavky do určeného kontejneru tenanta podle názvu hostitele.

Pro pokročilejší prostředí zvažte režimy Enhanced Container Isolation (ECI) v Dockeru nebo runtime nástroje jako Sysbox, které automaticky vynucují přísnější hranice uživatelských jmenných prostorů a virtualizované souborové systémy /proc a /sys bez nutnosti složitého manuálního skriptování sítě.


5. Stanovte objektivní rozhodovací matici pro multi-tenancy

Odmítněte předpoklad, že všechny digitální projekty vyžadují dedikované virtuální stroje. Marketingoví lídři se často domnívají, že izolace na hardwarové úrovni virtuálních strojů je jediným obhajitelným bezpečnostním modelem. V praxi však zřizování dedikovaných VM pro jednoduché landing pages nebo krátkodobé kampaňové weby způsobuje obrovský nárůst nákladů a provozní zátěž při údržbě, aniž by to reálně zvýšilo bezpečnost webové aplikace.

Použijte následující srovnávací matici k vyhodnocení požadavků na pracovní zátěž a předložte osobám s rozhodovací pravomocí racionální strategii nasazení:

Úroveň izolacePodkladová technologieBezpečnostní hraniceRežie prostředkůNejvhodnější případ užití
Kontejnery se sdíleným stackemNamespaces a Cgroups na jednom OSLogická izolace na úrovni OSVelmi nízkáVelkoobjemové landing pages, interní staging, dočasné weby kampaní
Hardened kontejnery (ECI / Sysbox)User namespaces, AppArmor, Read-Only rootPokročilá úroveň OS a virtualizaceNízkáAgenturní hosting pro více klientů, autentizované portály, citlivé marketingové formuláře
Dedikované virtuální stroje (VM)Hardwarová virtualizace přes HypervisorStriktní hardwarové oddělení / oddělení jádraVysokáZpracování plateb, regulovaná data HIPAA/PCI, spouštění nedůvěryhodného vlastního kódu
Hybridní řešení (kontejnery v dedikovaných VM)Zabezpečené kontejnery uvnitř VM specifických pro tenantaVícevrstvé hranice na úrovni hardwaru i OSStřední až vysokáPrémioví enterprise klienti vyžadující dedikovaný smluvní soulad

Před přidělením rozpočtu na infrastrukturu vyhodnoťte každý projekt podle přísných kritérií:

  1. Citlivost dat: Ukládá projekt regulovaná data (např. záznamy o kreditních kartách nebo zdravotní údaje)? Pokud ano, nasaďte jej na dedikovaný virtuální stroj.
  2. Původ kódu: Nasazujete standardizovaný kód auditovaný týmem, nebo povolujete neověřené pluginy třetích stran? Standardní kód patří do zabezpečených kontejnerů; neotestovaný kód třetích stran vyžaduje izolaci na úrovni hypervizoru.
  3. Rozpočet a životnost: U sezónních landing pages a hlavních firemních webů poskytuje multi-tenancy v zabezpečených kontejnerech maximální poměr výkonu a ceny.

Při prezentaci plánů infrastruktury managementu využijte našeho průvodce vyhodnocením, kdy klienti potřebují dedikované virtuální stroje, abyste svá doporučení podložili jasnými argumenty založenými na úrovních izolace.


Závěr: Převod bezpečnostních mechanismů na obchodní návratnost (ROI)

Zabezpečení multi-tenant prostředí Dockeru nevyžaduje rozpočet na podnikovou cloudovou architekturu. Vyžaduje důsledné a disciplinované uplatňování ovládacích prvků operačního systému.

Až budete infrastrukturu procházet s netechnickým vedením, zasaďte tyto technické konfigurace do kontextu tří klíčových manažerských metrik:

  • Nákladová efektivita: Multi-tenant kontejnery umožňují týmu hostovat desítky marketingových webů na zlomku výpočetního výkonu, který by vyžadovaly jednotlivé virtuální stroje.
  • Ochrana dostupnosti (Uptime): Control groups zaručují, že nárůsty návštěvnosti v rámci sezónní kampaně nesníží výkon hlavních webů značky.
  • Omezení dosahu incidentu (Blast Radius): Souborové systémy pouze pro čtení, odebrané schopnosti a izolované síťové bridge zajišťují, že exploit na jednom webu nemůže získat přístup k databázím ostatních klientů ani k ovládání hostitele.

Implementujte tato bezpečnostní pravidla systematicky napříč svými kontejnerovými šablonami. Získáte vysoce výkonnou a nákladově efektivní infrastrukturu, která vyhoví jak bezpečnostním standardům inženýrského týmu, tak rozpočtovým limitům vedení.

Sources (5)