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 --privileged udeľ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_ADMIN alebo CAP_NET_ADMIN pripojiť 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-data a mysql).
  • 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)