Blog

Gyakorlati Docker elkülönítési biztonsági ellenőrzőlista több-bérlős üzemeltetéshez

Tegye biztonságossá több-bérlős Docker üzemeltetését ezzel a gyakorlati ellenőrzőlistával, amely kiterjed a nem root felhasználókra, képességekre, seccomp-ra, felhasználói névterekre, erőforrás-korlátokra és csak olvasható fájlrendszerekre.

Összefoglalás

A több-bérlős Docker üzemeltetés erős elkülönítést igényel a konténerekből való kiszökés megakadályozásához. Ez a cikk egy gyakorlati biztonsági ellenőrzőlistát nyújt, amely hat kulcsfontosságú területet fed le: futás nem root felhasználóként, képességek elvétele, seccomp profilok alkalmazása, felhasználói névtér átképezés engedélyezése, erőforrás-korlátok beállítása és csak olvasható gyökér fájlrendszer használata. Minden lépés egy konkrét konfigurációs példát tartalmaz Docker Compose-hoz. Megismerheti a gyakori buktatókat is, mint a kernel kompatibilitási problémák felhasználói névterekkel és a teljesítménybeli kompromisszumok seccomp alkalmazásakor. Ezen ellenőrzőlista követésével jelentősen csökkentheti a támadási felületet anélkül, hogy szükségtelen bonyolultságot adna hozzá. A cikk egy ajánlott alapkonfigurációval zárul éles több-bérlős környezetekhez.

Ha több-bérlős Docker környezetet üzemeltet, a konténerkiszökési támadás réme ébren tartja éjszakánként. Egyetlen kernel exploit ki tud törni egy konténerből, és korlátlan hozzáférést biztosít a támadónak a gazdagéphez és az összes többi bérlő adataihoz. Bár a Docker erős elkülönítési primitíveket biztosít – névtereket, cgroup-okat és képességeket –, a hibás konfiguráció réseket hagy. Ez a cikk egy lépésről lépésre haladó biztonsági ellenőrzőlistát mutat be, amelyet ma alkalmazhat. Minden lépés tartalmaz egy működő Docker Compose részletet és kulcsfontosságú figyelmeztetéseket. A végére egy megerősített alapkonfigurációval rendelkezik, amely egyensúlyt teremt a biztonság és a teljesítmény között.

1. Futtasson konténereket nem root felhasználóként

A konténerek alapértelmezés szerint root felhasználóként futnak a konténeren belül. Ha egy támadó root hozzáférést szerez a konténerben, előnyben van a kiszökéshez. Mindig adjon meg egy nem root felhasználót a Dockerfile-ban.

FROM alpine:3.18
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

A Compose-ban közvetlenül is beállíthatja a felhasználót:

services:
  app:
    image: myapp
    user: "1000:1000"

Figyelmeztetés: Egyes alkalmazások root hozzáférést igényelnek legitim műveletekhez (pl. 1024 alatti portokhoz való kötődés). Használja a CAP_NET_BIND_SERVICE képességet ahelyett, hogy a teljes konténert rootként futtatná. Az elkülönítés alapjairól bővebben lásd útmutatónkat a valódi több-bérlős elkülönítés eléréséről Dockerben.

2. Vegyen el minden képességet, és adjon hozzá csak a szükségeseket

A Linux képességek finomított jogosultságokat biztosítanak a konténereknek. Alapértelmezés szerint a Docker egy sor képességet ad meg. Vegyen el mindent, és csak a szükségeseket engedélyezze.

services:
  app:
    image: myapp
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE  # ha szükséges

Figyelmeztetés: Az olyan képességek, mint a SYS_ADMIN vagy a NET_RAW, ritkán szükségesek. Vizsgálja meg az alkalmazását, hogy meghatározza a minimális készletet. Az összes képesség elvétele blokkolja a kiszökési vektorok nagy részét.

3. Alkalmazzon Seccomp profilt

A Seccomp (biztonságos számítási mód) szűri a konténer számára elérhető rendszerhívásokat. A Docker egy alapértelmezett seccomp profillal érkezik, amely blokkolja a veszélyes rendszerhívásokat, mint például a clone bizonyos jelzőkkel. Tovább testreszabhatja.

services:
  app:
    image: myapp
    security_opt:
      - seccomp=/path/to/custom-profile.json

Egy megerősített profil blokkolhatja az unshare, ptrace és mount hívásokat. Kezdje a Docker alapértelmezettjével, és korlátozzon tovább. Figyelmeztetés: A túl szigorú profilok megtörhetik az alkalmazásokat. Tesztelje alaposan tesztkörnyezetben. A konténerkiszökés elleni védelemről bővebben olvassa el a konténerkiszökés elleni védekezés című cikket.

4. Engedélyezze a felhasználói névtér átképezést

A felhasználói névterek a konténer root felhasználóját egy nem privilegizált gazdagépi felhasználóra képezik le. Ez azt jelenti, hogy még ha egy támadó root hozzáférést szerez a konténerben, akkor sincs különleges jogosultsága a gazdagépen.

Engedélyezze a Docker démonon a /etc/docker/daemon.json szerkesztésével:

{
  "userns-remap": "default"
}

Ezután indítsa újra a Dockert. Figyelmeztetés: A felhasználói névtér átképezésnek két hátránya van: megtöri a kötet csatolásokat, ha nem gondosan van konfigurálva (a fájlok az átképezett felhasználó tulajdonában lesznek), és nem kompatibilis bizonyos tároló illesztőprogramokkal, mint az overlay2 régebbi kerneleken. Tesztelje alaposan.

5. Állítson be erőforrás-korlátokat Cgroup-okkal

Az erőforrás-korlátok megakadályozzák, hogy egy feltört konténer szolgáltatásmegtagadási támadást indítson a gazdagép ellen. Használjon cgroup-okat a CPU, memória és lemez I/O korlátozására.

services:
  app:
    image: myapp
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M

A Docker Compose v3 esetén használja a deploy szakaszt (swarm vagy compose v2 esetén működik). Egyszerű Docker esetén használja a --memory és --cpus paramétereket. Figyelmeztetés: A túl alacsony korlátok OOM öléseket okozhatnak. Figyelje a használatot, és állítson be ennek megfelelően.

6. Használjon csak olvasható gyökér fájlrendszert

A csak olvasható gyökér fájlrendszer megakadályozza, hogy a támadók rosszindulatú binárisokat írjanak vagy konfigurációs fájlokat módosítsanak a konténeren belül.

services:
  app:
    image: myapp
    read_only: true
    tmpfs:
      - /tmp:noexec,nosuid,size=64m

Csatoljon tmpfs-t az írási hozzáférést igénylő könyvtárakra (mint a /tmp). Ez minden írható adatot átmenetivé tesz. Figyelmeztetés: Egyes alkalmazások állandó tárolást igényelnek; ehhez használjon névvel ellátott köteteket.

Gyakori buktatók

  • Kernel kompatibilitás: A felhasználói névtér átképezés és egyes seccomp szabályok friss Linux kernelt igényelnek (4.14+). Ellenőrizze a kernel verzióját.
  • Teljesítménybeli hatás: A Seccomp és a felhasználói névterek kis többletterhelést jelentenek, de ez elhanyagolható a legtöbb munkaterhelésnél. Mérje be az adott alkalmazást.
  • Bonyolultság: Mind a hat intézkedés egyszerre történő hozzáadása megtörhet dolgokat. Alkalmazza őket egyenként, tesztelje minden változtatást.

Az orchestációs minták szélesebb köréről lásd útmutatónkat a több-bérlős Docker architektúra tervezéséről.

Következtetés

Egy biztonságos több-bérlős Docker gazdagép nem igényel egzotikus eszközöket – csak a Docker beépített funkcióinak helyes használatát. Kezdje egy nem root felhasználóval, vegyen el minden képességet, alkalmazzon seccomp profilt, engedélyezze a felhasználói névtér átképezést, állítson be erőforrás-korlátokat és használjon csak olvasható fájlrendszert. Ez az ellenőrzőlista egy erős alapot képez, amely blokkolja a leggyakoribb kiszökési technikákat. A megvalósítás után futtasson biztonsági eszközöket, mint a docker-bench-security, a konfiguráció ellenőrzéséhez. Ne feledje: a biztonság folyamat, nem termék. Ahogy új kernel sérülékenységek jelennek meg, vizsgálja felül beállításait. Az automatikus landing page-ekhez, amelyek bemutatják üzemeltetési szolgáltatását, használja a Pagenzát, hogy percek alatt élővé tegye webhelyét.

Sources (5)