Blog

Dosiahnutie skutočnej izolácie viacerých nájomníkov v Dockeri

Model zdieľaného jadra Dockeru prináša riziká pre prostredia s viacerými nájomníkmi. Táto príručka poskytuje konkrétne kroky na posilnenie izolácie pomocou užívateľských menných priestorov, seccomp, AppArmor, nástrojov na sandboxing a osvedčených postupov orchestrácie.

Zhrnutie

Kontajnery Dockeru zdieľajú jadro hostiteľa, čo môže byť bezpečnostným problémom pre prostredia s viacerými nájomníkmi, kde si nájomníci nemusia navzájom dôverovať. Tento článok vysvetľuje medzery v izolácii v predvolených nastaveniach Dockeru a poskytuje konkrétne kroky na posilnenie izolácie pomocou Linuxových menných priestorov, cgroups, užívateľských menných priestorov, seccomp, AppArmor a hardvérovej virtualizácie. Dozviete sa, ako nakonfigurovať Docker démony pre jednotlivých nájomníkov, používať nástroje na sandboxing ako gVisor alebo Firecracker pre silnejšiu izoláciu a orchestráciu s Kubernetes pre viacnájomnícke prostredie. Tiež sa budeme venovať výberu správneho poskytovateľa infraštruktúry, ktorý ponúka virtualizáciu založenú na KVM pre ďalšiu vrstvu oddelenia. Na konci budete mať plán na bezpečné spúšťanie viacnájomníckych úloh s Dockerom.

Pri hostovaní viacerých nájomníkov na jednom hostiteľovi Dockeru predvolená izolácia kontajnerov—postavená na Linuxových menných priestoroch a cgroups—často nestačí. Únik z kontajnera jedného nájomníka by mohol ohroziť celého hostiteľa a všetky ostatné kontajnery. Tento problém je obzvlášť výrazný v zdieľanom hostingu, SaaS platformách alebo v akomkoľvek scenári, kde nedôveryhodný kód beží vedľa vášho. Dobrá správa: môžete kombinovať viacero izolačných techník na vytvorenie odolného viacnájomníckeho prostredia. Táto príručka prechádza šiestimi praktickými krokmi, od nízko visiacich plodov ako užívateľské menné priestory až po pokročilé opatrenia ako sandboxované runtime a výber infraštruktúry.

Pochopenie predvolenej izolácie Dockeru

Docker používa Linuxové menné priestory na izoláciu procesov, siete, súborového systému a ďalších zdrojov. Cgroups obmedzujú CPU, pamäť a I/O. Tieto však zdieľajú jedno jadro—zraniteľnosť v jadre môže ovplyvniť všetky kontajnery. Pre skutočnú viacnájomníckosť, najmä s nedôveryhodnými nájomníkmi, potrebujete obranu do hĺbky. Ako je uvedené v Navrhovanie viacnájomníckej architektúry Dockeru: Výber správnej úrovne izolácie, úrovne izolácie siahajú od slabej (iba menné priestory) po silnú (hardvérovo virtualizovanú). Poďme stavať od najslabšej.

Krok 1: Povoliť užívateľské menné priestory

V predvolenom nastavení sa root vo vnútri kontajnera mapuje na root na hostiteľovi. Únik z kontajnera poskytuje plný prístup k hostiteľovi. Užívateľské menné priestory remapujú root kontajnera na nerootového užívateľa vonku. Povoľte ich globálne pomocou dockerd --userns-remap=default alebo pre jednotlivý kontajner pomocou --userns=host. Tento jednoduchý krok eliminuje mnoho útokov na eskaláciu privilégií. Otestujte svoje aplikácie: niektoré, ktoré vyžadujú privilégiá na úrovni hostiteľa (napr. montovanie súborových systémov), môžu prestať fungovať. Pre stránky Drupal alebo WordPress je to zvyčajne bezpečné.

Krok 2: Aplikovať profily Seccomp a AppArmor

Seccomp obmedzuje systémové volania, ktoré môže kontajner vykonávať. Docker obsahuje predvolený profil seccomp, ktorý blokuje nebezpečné syscally ako mount a reboot. Pre viacnájomnícke prostredie ho ešte viac sprísnite—blokujte neobvyklé syscally, ktoré používajú nástroje na únik. Podobne AppArmor môže obmedziť procesy kontajnera. Vytvorte vlastný profil AppArmor, ktorý zakáže zápis do rozhraní jadra a obmedzí cesty k súborom. Oba sa nastavujú pomocou prepínačov --security-opt. Skombinujte ich pre vrstvenú obranu.

Krok 3: Použiť Docker démony pre jednotlivých nájomníkov

Spúšťanie jedného Docker démona pre všetkých nájomníkov je riskantné—akýkoľvek únik z kontajnera by mohol získať prístup k socketu démona. Izolujte démony pre každého nájomníka pomocou Docker-in-Docker (DinD) alebo vzdialených koncových bodov démona. Napríklad spustite Docker démona vo vnútri kontajnera s --privileged (to však oslabuje izoláciu). Lepší prístup: spúšťajte samostatné démony na samostatných VM alebo použite experimentálnu funkciu Dockeru --group s užívateľskými mennými priestormi. Pre orchestráciu je praktickejšia izolácia založená na menných priestoroch Kubernetes, ako je uvedené v Obrana proti úniku z kontajnera: Praktická príručka izolácie Dockeru pre viacnájomnícky hosting.

Krok 4: Zvážiť sandboxované runtime

Keď samotné Linuxové jadro nie je dôveryhodné, použite sandboxovaný runtime, ktorý pridáva ľahkú VM vrstvu. gVisor (runsc) zachytáva syscally a implementuje vlastné jadro, zatiaľ čo Firecracker používa mikrovirtuálne stroje s hardvérovou virtualizáciou. Oba sa integrujú s Dockerom cez containerd runtime. Napríklad pridajte "runtimes": {"runsc": {}} do konfigurácie Docker démona a spúšťajte kontajnery s --runtime=runsc. Režijné náklady na výkon sú 5–15%, ale izolácia je oveľa silnejšia. Ideálne pre vysokobezpečnostné viacnájomnícke nastavenia.

Krok 5: Orchestrovať s Kubernetes a bezpečnostnými politikami

Kubernetes poskytuje natívnu viacnájomníckosť prostredníctvom menných priestorov, Pod Security Standards a NetworkPolicies. Definujte menné priestory pre jednotlivých nájomníkov s kvótami zdrojov a presadzujte obmedzené bezpečnostné kontexty podov (zrušiť všetky schopnosti, súborový systém iba na čítanie). Vstupné kontroléry ako OPA/Gatekeeper môžu blokovať nesprávne konfigurácie. Ak spravujete veľa nájomníkov, Kubernetes automatizuje presadzovanie izolácie. Pre orchestráciu v produkčnom meradle pozri Za Docker Compose: Orchestrácia produkčne pripravených kontajnerizovaných aplikácií.

Krok 6: Vybrať správneho poskytovateľa hostingu

Hypervisor vášho poskytovateľa infraštruktúry je dôležitý. Docker na zdieľanom hostingu (OpenVZ) poskytuje slabú izoláciu—jeden nájomník môže vidieť iné procesy. Uprednostnite poskytovateľov používajúcich KVM alebo VMware, ktorí ponúkajú oddelenie na hardvérovej úrovni. Poskytovatelia ako DigitalOcean, Kamatera alebo AWS ponúkajú VPS založené na KVM s vyhradenými zdrojmi. Pre bare-metal zabezpečte, aby bola virtualizácia na úrovni BIOS povolená pre vnorené kontajnery. Poskytovateľ, ktorý izoluje nájomníkov na vrstve hypervisora, dopĺňa vašu izoláciu kontajnerov. Ako je podrobne uvedené v Zvládnutie izolácie Dockeru pre bezpečný a efektívny web hosting, hostiteľský OS by mal byť tiež spevnený s minimálnym útočným povrchom.

Výhrady a kompromisy

Každá ďalšia vrstva pridáva zložitosť a náklady na výkon. Užívateľské menné priestory môžu narušiť zväzky montované na hostiteľovi. Profily Seccomp vyžadujú ladenie pre každú aplikáciu. Sandboxované runtime ako gVisor nepodporujú všetky syscally—vaša aplikácia nemusí fungovať. Docker démony pre jednotlivých nájomníkov zvyšujú režiu pamäte. Vyberte úroveň izolácie, ktorá zodpovedá vášmu modelu hrozieb: pre dôveryhodných nájomníkov môžu postačovať predvolené menné priestory; pre verejný SaaS investujte do runtime sandboxov a politík Kubernetes. Pred produkciou dôkladne otestujte.

Záver

Skutočná viacnájomnícka izolácia v Dockeri je dosiahnuteľná vrstvením viacerých funkcií jadra, runtime sandboxov a orchestrátorských kontrol. Začnite s užívateľskými mennými priestormi a seccomp, potom prejdite na démony pre jednotlivých nájomníkov alebo sandboxované runtime. Pre veľké nasadenia poskytuje Kubernetes izoláciu riadenú politikami. Vždy kombinujte s hostiteľom oddeleným na úrovni hypervisora od renomovaného poskytovateľa. Žiadna technika nie je nepriestrelná, ale ich kombinácia vytvára robustnú obranu. Vaši nájomníci vám poďakujú—a rovnako aj váš bezpečnostný audit.

Sources (5)