Blog

Docker konténerek megerősítése többszereplős hostinghoz: lépésről lépésre elkülönítés útmutató

Tanulja meg, hogyan zárhatja le a Docker konténereket többszereplős környezetekben gyakorlati biztonsági intézkedésekkel, mint a nem root felhasználók, a képességek elvétele, az írásvédett fájlrendszerek és a hálózati elkülönítés.

Összefoglaló

A többszereplős Docker hosting platform futtatása légmentes konténer elkülönítést követel meg, hogy megakadályozza a bérlők egymásba avatkozását vagy a gazdagéphez való kiszökését. Ez az útmutató egy konkrét, lépésről lépésre történő megerősítési folyamatot kínál, amelyet ma alkalmazhat. Megtanulja, hogyan konfiguráljon nem root felhasználókat, hagyja el a szükségtelen Linux képességeket, csatolja a fájlrendszereket írásvédettként, kényszerítsen ki erőforráskorlátokat cgroupok segítségével, szegmentálja a hálózatokat, és alkalmazzon seccomp vagy AppArmor profilokat. Azt is bemutatjuk, mikor érdemes konténereket virtuális gépekkel kiegészíteni a maximális biztonság érdekében. Végül egy ellenőrző listát kap, amellyel szisztematikusan kiküszöbölheti a gyakori konténer kiszökési vektorokat, és valóban elkülönítetté teheti többszereplős infrastruktúráját.

Valós probléma a többszereplős konténerekkel

A Docker konténerek megosztják a gazdagép kernelét, és ha az elkülönítés rosszul van konfigurálva, egy bérlő elméletileg hozzáférhet egy másik adataihoz, kimerítheti az összes CPU-t, vagy akár ki is szökhet a gazdagépre. Szolgáltatóként légmentes határokra van szüksége anélkül, hogy feláldozná a konténerek teljesítménybeli előnyeit. Sok csapat az alapértelmezett Docker beállításokkal kezdi, amelyek fejlesztésre lettek tervezve, nem éles többszereplős használatra. A jó hír: egy szisztematikus megerősítési ellenőrző listával minden konténert a VM-ekéhez közeli elkülönítési szintre zárhat le, miközben megtartja a Docker sebességét.

Ez a cikk végigvezeti Önt minden megerősítési lépésen gyakorlati példákkal és figyelmeztetésekkel. A végére egy ismételhető folyamata lesz a biztonságos többszereplős konténerek telepítéséhez.

1. lépés: Konténerek futtatása nem root felhasználóként

Alapértelmezés szerint a Docker konténerek rootként futnak. Ha egy konténer feltörésre kerül, a támadó root jogosultságokat szerez a konténerben, és megkísérelhet konténer kiszökést. Először hozzon létre egy dedikált felhasználót a Dockerfile-ban, és váltson rá:

FROM ubuntu:22.04
RUN useradd -m appuser
USER appuser

Figyelmeztetés: Egyes folyamatok (pl. 1024 alatti portokhoz való kötés) root hozzáférést igényelnek. Ezekben az esetekben használja a --cap-add zászlót, hogy csak a szükséges képességet adja meg, mint a --cap-add=NET_BIND_SERVICE, és továbbra is futtassa a folyamatot nem root felhasználó alatt.

Az alapvető elkülönítésről bővebben lásd útmutatónkat: valódi többszereplős elkülönítés elérése Dockerben.

2. lépés: Az összes Linux képesség elvétele és csak a szükségesek visszaadása

A Linux képességek a root jogosultságokat kis egységekre bontják. A Docker konténerek egy alapértelmezett képességkészlettel érkeznek, amely túl megengedő a többszereplős hostinghoz. Vegyen el mindent, és csak azt adja vissza, amire az alkalmazásának szüksége van:

docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE my-app

Kerülendő gyakori képességek: SYS_ADMIN (konténer kiszökés), NET_RAW (csomagok szimatolása), SYS_PTRACE (folyamat hibakeresés). Használja a docker run-t a --security-opt no-new-privileges kapcsolóval a setuid binárisok általi jogosultság-emelkedés megakadályozására.

3. lépés: A gyökér fájlrendszer csatolása írásvédettként

A támadók gyakran rosszindulatú szkripteket írnak a konténer fájlrendszerébe. Ha a gyökér fájlrendszert írásvédetté teszi, ezt megakadályozza:

docker run --read-only --tmpfs /tmp:rw,noexec,nosuid,size=64m my-app

A --tmpfs ideiglenes írható csatolást hoz létre olyan könyvtárak számára, mint a /tmp és a /var/run. A noexec zászló megakadályozza a végrehajtást erről a csatolásról. Ez a módszer arra kényszeríti a támadókat, hogy írható könyvtárakon keresztül mozogjanak, amelyet figyelemmel kísérhet.

4. lépés: Erőforráskorlátok kényszerítése cgroupokkal

A korlátlan konténerek szolgáltatásmegtagadási támadásokat hajthatnak végre a gazdagép memóriájának vagy CPU-jának kimerítésével. Használja a Docker futásidejű korlátait:

docker run --memory=512m --memory-swap=512m --cpus=0.5 --pids-limit=100 my-app
  • A --memory és --memory-swap kemény korlátokat állít be (nincs swap).
  • A --cpus korlátozza a CPU-t.
  • A --pids-limit megakadályozza a fork bombákat a folyamatok számának korlátozásával.

Figyelmeztetés: Az erőforráskorlátokat a cgroupok kényszerítik ki, de nem akadályozzák meg az adatok kiszivárogtatását a hálózaton keresztül. Kombinálja hálózati elkülönítéssel (következő lépés).

5. lépés: Hálózatok szegmentálása egyedi Docker hálózatokkal

Alapértelmezés szerint a Docker konténerek egy közös bridge hálózaton osztoznak. Többszereplős beállításban el kell különítenie minden bérlő hálózati vermét. Hozzon létre egy dedikált hálózatot bérlőnként:

docker network create tenant-alpha --internal
docker run --network tenant-alpha my-app

Használja a --internal zászlót a kimenő internet-hozzáférés blokkolásához, majd csak a szükséges portokat tegye elérhetővé a -p kapcsolóval. Fejlettebb hálózati szegmentáláshoz fontolja meg webalkalmazások biztosítását Docker elkülönítéssel.

Figyelmeztetés: A belső hálózatok megakadályozzák a közvetlen konténer-konténer kommunikációt a bérlők között, de DNS-szivárgások továbbra is előfordulhatnak, ha gazdagép-hálózatot használ. Ragaszkodjon a bridge vagy overlay hálózatokhoz.

6. lépés: Seccomp és AppArmor profilok alkalmazása

A Seccomp szűri a rendszerhívásokat, az AppArmor (vagy SELinux) pedig kötelező hozzáférés-szabályozást kényszerít ki. A Docker egy alapértelmezett seccomp profilt biztosít, amely blokkolja a veszélyes rendszerhívásokat, mint a clone bizonyos zászlókkal. Szigorúbb elkülönítéshez hozzon létre egyedi profilt:

docker run --security-opt seccomp=./custom.json --security-opt apparmor=docker-default my-app

Generálhat egy alap profilt a docker run --rm -it --security-opt seccomp=unconfined my-app strace -c -S time paranccsal, majd szűkítheti. Figyelmeztetés: A túlzottan korlátozó profilok megtörhetik a legitim működést. Tesztelje alaposan tesztkörnyezetben.

7. lépés: Hibrid elkülönítés megfontolása virtuális gépekkel

Ha bérlői abszolút elkülönítést igényelnek (pl. szabályozott iparág), futtassa a konténereket egy könnyűsúlyú VM-en belül. Az olyan eszközök, mint a Sysbox vagy a Kata Containers, hardverszintű elkülönítést biztosítanak anélkül, hogy feláldoznák a konténer sebességét. Ezt a megközelítést használja a Docker Enhanced Container Isolation (ECI) is. Bár a többletterhelés magasabb, mint a puszta konténereké, sokkal alacsonyabb, mint a teljes VM-eké munkaterhelésenként.

A megfelelő elkülönítési szint kiválasztásáról bővebben olvassa el többszereplős Docker architektúra tervezése.

Minden összerakva: Megerősítési ellenőrző lista

  1. Építsen konténereket nem root felhasználóval.
  2. Vegyen el minden képességet, csak a szükségeseket adja hozzá.
  3. Csatolja a fájlrendszert írásvédettként ideiglenes írható csatolásokkal.
  4. Állítson be memória, CPU és PID korlátokat.
  5. Hozzon létre elkülönített Docker hálózatokat bérlőnként.
  6. Alkalmazzon egyedi seccomp és AppArmor profilokat.
  7. Értékelje a hibrid VM konténereket magas biztonsági igényekhez.

Következtetés

A konténerek megerősítése nem egyszeri feladat – folyamatos fegyelmet igényel. A fenti lépések egy biztonsági alapvonalat képeznek a többszereplős hostinghoz. Ne feledje, hogy egyetlen intézkedés sem garantálja a biztonságot; a réteges védelem a kulcs. Kezdje az alapokkal: nem root felhasználók és elvett képességek. Ezután rétegezze az erőforráskorlátokat és a hálózati szegmentálást. A legérzékenyebb munkaterhelésekhez kombinálja a konténereket VM-ekkel. Ezzel az útmutatóval magabiztosan telepíthet többszereplős Docker környezeteket, amelyek egyszerre hatékonyak és biztonságosak.

Sources (5)