Blog
Obrana proti úniku z kontajnera: Praktický sprievodca izoláciou Dockeru pre multitenantné hostovanie
Naučte sa zabezpečiť Docker kontajnery proti zraniteľnostiam úniku a zlyhaniam izolácie v multitenantných prostrediach pomocou konkrétnych krokov a príkladov.

Súhrn
Docker kontajnery zdieľajú hostiteľské jadro, čo robí izoláciu kritickou – najmä v multitenantnom hostovaní, kde jeden únik z kontajnera môže ohroziť všetkých tenantov. Mnohí vývojári predpokladajú, že kontajnery sú dokonale izolované virtuálne stroje, ale realita je iná. Tento článok vysvetľuje funkcie Linuxového jadra, ktoré stoja za izoláciou Dockeru (namespaces, cgroups) a vektory útokov, ktoré ich ohrozujú. Naučíte sa praktické kroky na posilnenie vašej Docker konfigurácie: obmedzenie privilégií, používanie bezpečného runtime, skenovanie obrazov a implementácia sieťovej segmentácie. Sledovaním reálneho príkladu multitenantného poskytovateľa hostingu WordPress uvidíte, ako aplikovať tieto obrany. Pokrývame tiež výhrady, ako sú kompromisy vo výkone a používanie seccomp/AppArmor. Cieľom je poskytnúť vám robustnú izolačnú stratégiu, ktorá zabráni únikom z kontajnerov a udrží vašich tenantov v bezpečí.
Úvod
Ak prevádzkujete multitenantnú hostingovú platformu – či už ide o zdieľaný WordPress hosting, SaaS aplikáciu alebo službu vývojového prostredia – únik z kontajnera je nočná mora. Zraniteľnosť v jadre alebo nesprávna konfigurácia môže jednému tenantovi umožniť únik z jeho kontajnera a prístup k dátam iných tenantov alebo k samotnému hostiteľovi. Izolácia Dockeru sa spolieha na funkcie Linuxového jadra ako namespaces a cgroups, ale predvolené konfigurácie často nie sú dostatočné pre robustné zabezpečenie. Tento článok vás prevedie vektormi útokov a poskytne akčné kroky na uzamknutie vašich Docker kontajnerov, ilustrované reálnym príkladom multitenantného WordPressu. Pre širší pohľad na produkčné orchestrácie si pozrite náš sprievodca Orchestrácia produkčných kontajnerizovaných aplikácií.
Pochopenie izolácie Dockeru
Docker kontajnery používajú Linux namespaces na poskytnutie izolácie na úrovni procesov: PID namespaces izolujú strom procesov, network namespaces oddeľujú sieťové rozhrania, mount namespaces izolujú súborové systémy a user namespaces umožňujú mapovanie root kontajnera na neprivilegovaného hostiteľského používateľa. Control groups (cgroups) obmedzujú využitie zdrojov ako CPU, pamäť a diskové I/O. Tieto funkcie spolu vytvárajú „sandbox“ okolo každého kontajnera. Avšak, na rozdiel od virtuálneho stroja, ktorý beží s vlastným jadrom, kontajnery zdieľajú hostiteľské jadro. To znamená, že zraniteľnosť v jadre (napr. CVE-2022-0492) môže byť zneužitá na únik z izolácie namespace kontajnera. Okrem toho nesprávne konfigurácie, ako je spustenie kontajnerov ako root vo vnútri kontajnera, udelenie všetkých možností kontajneru alebo neupustenie nepotrebných Linuxových možností, môžu rozšíriť povrch útoku.
Vektory útokov
Bežné vektory útokov zahŕňajú:
- Exploity jadra: Zneužitie chyby v hostiteľskom jadre na získanie prístupu k hostiteľovi.
- Privilegované kontajnery: Spustenie s
--privilegedudeľuje všetky možnosti a obchádza väčšinu izolácie. - Zneužitie možností (capabilities): Aj bez plného privilegovaného režimu môže kontajner s nebezpečnými možnosťami ako
CAP_SYS_ADMINaleboCAP_NET_ADMINpripojiť súborové systémy alebo manipulovať sieťové nastavenia. - Nezabezpečené praktiky obrazov: Používanie základných obrazov so známymi zraniteľnosťami alebo zahrnutie nepotrebných nástrojov ako kompilátory alebo shell interpretery.
- Zdieľané mount namespaces: Pripojenie hostiteľských adresárov do kontajnerov môže umožniť únik, ak nie sú iba na čítanie.
Praktické bezpečnostné kroky
1. Spúšťajte kontajnery ako neprivilegovaný používateľ
Predvolene Docker spúšťa kontajnery ako root vo vnútri kontajnera. Ak útočník získa root prístup vo vnútri kontajnera, má väčšiu páku. Vytvorte používateľa vo vašom Dockerfile a použite direktívu USER. Tiež sa vyhnite použitiu --user flagu v Docker Compose na mapovanie na ľubovoľného hostiteľského používateľa, ak je to možné.
2. Pustite všetky možnosti a pridajte len potrebné
Linuxové možnosti rozdeľujú oprávnenia superužívateľa na menšie jednotky. V Docker Compose použite cap_drop: ALL a potom cap_add len tie potrebné (napr. NET_BIND_SERVICE). Vyhnite sa nebezpečným možnostiam ako SYS_ADMIN, NET_ADMIN, SYS_PTRACE.
3. Použite súborový systém root iba na čítanie
Nastavte read_only: true vo vašej definícii kontajnera. Tým zabránite útočníkom zapisovať do súborového systému kontajnera. Ak vaša aplikácia potrebuje zapisovať dočasné súbory, pripojte tmpfs volume na dané miesto.
4. Povoľte presmerovanie používateľských priestorov (User Namespace Remapping)
Presmerovanie používateľských priestorov mapuje root používateľa kontajnera na neprivilegovaného hostiteľského používateľa. To pridáva vrstvu izolácie, pretože aj keď root používateľ kontajnera unikne, bude mať oprávnenia presmerovaného používateľa. Povoľte to v /etc/docker/daemon.json pomocou "userns-remap": "default". Majte na pamäti, že to môže skomplikovať oprávnenia volume. Viac informácií nájdete v Zvládnutie izolácie Dockeru pre bezpečné a efektívne webové hostovanie.
5. Aplikujte Seccomp a AppArmor/AppArmor profily
Seccomp obmedzuje systémové volania, ktoré môže kontajner vykonať. Docker poskytuje predvolený seccomp profil, ktorý blokuje nebezpečné systémové volania. Môžete tiež vytvárať vlastné profily. Podobne AppArmor (alebo SELinux) poskytuje povinnú kontrolu prístupu. Použite AppArmor na obmedzenie vášho kontajnera na minimálnu sadu povolených operácií. Bezpečnostný profil je možné nastaviť pomocou security_opt v Docker Compose.
6. Používajte minimálne základné obrazy a skenujte na zraniteľnosti
Vyberte si malé obrazy ako Alpine alebo Distroless, ktoré majú menší povrch útoku. Pravidelne skenujte obrazy pomocou nástrojov ako Docker Scout, Trivy alebo Clair. Integrujte skenovanie do vášho CI/CD pipeline, aby ste zabránili nasadeniu zraniteľných obrazov.
7. Sieťová segmentácia s vlastnými bridge sieťami
Vytvorte samostatné bridge siete pre každého tenanta alebo aplikačnú vrstvu. Tým sa obmedzí komunikácia medzi službami (east-west traffic). V Docker Compose definujte siete a izolujte služby. Použite internal: true, ak služba nepotrebuje prístup k internetu. Firewall pravidlá na hostiteľovi ďalej obmedzujú komunikáciu medzi kontajnermi.
8. Obmedzte zdroje pomocou cgroups
Nastavte limity CPU a pamäte v Docker Compose pomocou deploy.resources.limits. Tým zabránite kompromitovanému kontajneru spustiť útok vyčerpania zdrojov. Okrem toho nastavte kernel_memory a memory_reservation pre jemnejšie ovládanie.
Príklad z reálneho sveta: Multitenantné WordPress hostovanie s Docker Compose
Zvážte scenár, kde hostujete viacero WordPress stránok pre rôznych klientov, každý vo svojom vlastnom Docker kontajneri. Nebezpečné nastavenie by mohlo vyzerať takto:
version: '3'
services:
wordpress:
image: wordpress:latest
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- ./wp-content:/var/www/html/wp-content
db:
image: mysql:5.7
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_ROOT_PASSWORD: somewordpress
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
Toto nastavenie je zraniteľné: WordPress kontajner beží ako root vo vnútri, má všetky možnosti (keďže žiadne nie sú pustené), pripája hostiteľský adresár s prístupom na zápis a má neobmedzený sieťový prístup.
Teraz ho posilníme:
version: '3'
services:
wordpress:
image: wordpress:latest
user: www-data
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
read_only: true
tmpfs:
- /var/www/html/wp-content/plugins
security_opt:
- seccomp=seccomp-profile.json
- apparmor=wordpress-profile
networks:
- frontend
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- wp-uploads:/var/www/html/wp-content/uploads
deploy:
resources:
limits:
cpus: '0.5'
memory: 256M
db:
image: mysql:5.7
user: mysql
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
networks:
- backend
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_ROOT_PASSWORD: somewordpress
volumes:
- db_data:/var/lib/mysql
deploy:
resources:
limits:
cpus: '0.25'
memory: 128M
networks:
frontend:
driver: bridge
internal: false
backend:
driver: bridge
internal: true
volumes:
wp-uploads:
db_data:
Kľúčové vylepšenia:
- Oba kontajnery bežia ako neprivilegovaní používatelia (
www-dataamysql). - Všetky možnosti sú pustené, pridaná je len
NET_BIND_SERVICE. - Súborový systém WordPress je iba na čítanie okrem tmpfs volume a uploads volume.
- Sú aplikované seccomp a AppArmor profily (boli by ste potrebovali vlastné profily).
- Samostatné siete izolujú web od databázy, pričom databázová sieť je interná.
- Limity zdrojov zabraňujú vyčerpaniu zdrojov.
Pre viac informácií o špecifickom hardeningu Dockeru pre WordPress si pozrite Docker pre WordPress: Prečo izolované kontajnery menia všetko.
Výhrady
- Presmerovanie používateľských priestorov (User Namespace Remapping): Hoci je výkonné, narúša pripájanie volume, pretože presmerované UID hostiteľa nie je rovnaké ako UID kontajnera. Možno budete musieť predvytvoriť adresáre so správnymi oprávneniami alebo použiť Docker volumes s podporou presmerovania.
- Seccomp/AppArmor profily: Vlastné profily vyžadujú pochopenie vzorov systémových volaní a prístupu k súborom vašej aplikácie. Príliš reštriktívne profily môžu narušiť funkčnosť. Dôkladne testujte.
- Výkon: Dodatočné bezpečnostné vrstvy ako seccomp a AppArmor majú minimálny réžiu, ale limity zdrojov a súborové systémy iba na čítanie môžu ovplyvniť aplikácie s intenzívnym zápisom.
- Komplexnosť orchestrácie: V multitenantnom prostredí sa správa Docker Compose súborov pre každého tenanta môže stať nepraktickou. Zvážte použitie orchestrátora vyššej úrovne ako Kubernetes, ale to prináša vlastné bezpečnostné úvahy.
Záver
Únik z kontajnera je reálna hrozba v multitenantnom Docker hostingu, ale je predvídateľný. Pochopením izolačných mechanizmov a aplikovaním obrany v hĺbke – pustením možností, spúšťaním ako neprivilegovaný používateľ, povolením používateľských priestorov, seccomp, AppArmor, sieťovou segmentáciou a pravidelným skenovaním obrazov – môžete dramaticky znížiť riziko. Pamätajte, že predvolené nastavenia Dockeru nie sú pripravené na produkciu pre multitenantné pracovné zaťaženia. Implementujte tieto kroky dnes, aby ste ochránili svojich tenantov a svoju infraštruktúru. Pre komplexný prehľad najlepších bezpečnostných postupov Dockeru si pozrite Zabezpečenie vašich webových aplikácií pomocou Dockeru: Praktický sprievodca izoláciou a najlepšími postupmi.
Sources (5)
- Docker and Container Isolation - Medium
- What is container isolation? Mechanisms, limitations, and secure runtimes | Blog - Northflank
- Container Isolation Explained for Kubernetes and Beyond - Edera
- Docker Security: 5 Risks and 12 Best Practices for Securing Your Containers - Tigera.io
- 9 Security Best Practices for Docker Containers - Kinsta®

