Blog
Praktični varnostni kontrolni seznam Docker izolacije za večnajemniško gostovanje
Zavarujte svoje večnajemniško Docker gostovanje s tem praktičnim kontrolnim seznamom, ki zajema uporabnike brez root, zmogljivosti (capabilities), seccomp, uporabniške imenske prostore, omejitve virov in datotečne sisteme samo za branje.
Povzetek
Večnajemniško Docker gostovanje zahteva močno izolacijo, da prepreči pobeg zabojnikov. Ta članek vsebuje praktični varnostni kontrolni seznam, ki zajema šest ključnih področij: zagon kot nerooth uporabnik, odstranitev zmogljivosti, uporaba seccomp profilov, omogočanje preusmerjanja uporabniških imenskih prostorov, nastavljanje omejitev virov in uporaba datotečnih sistemov samo za branje. Vsak korak vključuje konkreten primer konfiguracije za Docker Compose. Spoznali boste tudi pogoste pasti, kot so težave s kompatibilnostjo jedra pri uporabniških imenskih prostorih in kompromisi pri zmogljivosti pri uporabi seccomp. Z upoštevanjem tega kontrolnega seznama lahko bistveno zmanjšate napadalno površino, ne da bi dodali nepotrebno zapletenost. Članek se zaključi s priporočeno osnovno konfiguracijo za produkcijska večnajemniška okolja.
Če upravljate večnajemniško Docker okolje, vas strah pred napadom s pobegom zabojnika drži budnih ponoči. En sam izkoriščanje jedra lahko prebije zabojnik in napadalcu omogoči neomejen dostop do gostitelja in vseh podatkov drugih najemnikov. Čeprav Docker ponuja močne izolacijske osnove – imenske prostore, cgroups in zmogljivosti – napačna konfiguracija pušča vrzeli. Ta članek predstavlja postopen varnostni kontrolni seznam, ki ga lahko uporabite še danes. Vsak korak vključuje delujoč izsek Docker Compose in ključne opombe. Na koncu boste imeli utrjeno osnovo, ki uravnoteži varnost in zmogljivost.
1. Zagon zabojnikov kot nerooth uporabnik
Zabojniki se privzeto zaženejo kot root v zabojniku. Če napadalec pridobi root v zabojniku, ima prednost pri pobegu. Vedno določite nerooth uporabnika v svoji Dockerfile.
FROM alpine:3.18
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
V Compose lahko uporabnika nastavite neposredno:
services:
app:
image: myapp
user: "1000:1000"
Opozorilo: Nekatere aplikacije potrebujejo root za legitimne operacije (npr. vezava na vrata pod 1024). Namesto tega uporabite CAP_NET_BIND_SERVICE, namesto da celoten zabojnik zaženete kot root. Za podrobnejši pregled osnov izolacije si oglejte naš vodnik o doseganju prave večnajemniške izolacije v Dockerju.
2. Odstranite vse zmogljivosti in dodajte samo tiste, ki so potrebne
Zmogljivosti (capabilities) Linuxa dajejo zabojnikom natančno določene privilegije. Docker privzeto dodeli nabor zmogljivosti. Odstranite vse in dodelite le tiste, ki so potrebne.
services:
app:
image: myapp
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE # če je potrebno
Opozorilo: Zmogljivosti, kot sta SYS_ADMIN ali NET_RAW, so redko potrebne. Preverite svojo aplikacijo, da določite najmanjši nabor. Odstranitev vseh zmogljivosti blokira številne vektorje pobega.
3. Uporaba seccomp profila
Seccomp (secure computing mode) filtrira sistemske klice, ki so na voljo zabojniku. Docker ima privzet seccomp profil, ki blokira nevarne sistemske klice, kot je clone z določenimi zastavicami. Lahko ga dodatno prilagodite.
services:
app:
image: myapp
security_opt:
- seccomp=/path/to/custom-profile.json
Utrjen profil lahko blokira unshare, ptrace in mount. Začnite z Dockerjevim privzetim in dodatno omejite. Opozorilo: Preveč strogi profili lahko zlomijo aplikacije. Temeljito preizkusite v testnem okolju. Več o obrambi pred pobegom zabojnika preberite v obrambi pred pobegom zabojnika.
4. Omogočite preusmerjanje uporabniških imenskih prostorov
Uporabniški imenski prostori preslikajo korenskega uporabnika zabojnika v neprivilegiranega uporabnika gostitelja. To pomeni, da tudi če napadalec pridobi root v zabojniku, nima posebnih privilegijev na gostitelju.
Omogočite ga v Docker demonu z urejanjem /etc/docker/daemon.json:
{
"userns-remap": "default"
}
Nato znova zaženite Docker. Opozorilo: Preusmerjanje uporabniških imenskih prostorov ima dve pomanjkljivosti: prekine priklope volumnov, če niso skrbno konfigurirani (datoteke so v lasti preusmerjenega uporabnika) in je nekompatibilno z nekaterimi gonilniki za shranjevanje, kot je overlay2 na starejših jedrih. Temeljito preizkusite.
5. Nastavite omejitve virov s cgroups
Omejitve virov preprečijo ogroženemu zabojniku, da izvede napad zavrnitve storitve proti gostitelju. Uporabite cgroups za omejitev CPU, pomnilnika in I/O diska.
services:
app:
image: myapp
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
Za Docker Compose v3 uporabite odsek deploy (deluje z swarm ali compose v2). Za navaden Docker uporabite --memory in --cpus. Opozorilo: Preveč nizke omejitve lahko povzročijo OOM ubijanje. Spremljajte uporabo in prilagodite.
6. Uporaba datotečnega sistema samo za branje
Datotečni sistem samo za branje prepreči napadalcem pisanje zlonamernih binarnih datotek ali spreminjanje konfiguracijskih datotek znotraj zabojnika.
services:
app:
image: myapp
read_only: true
tmpfs:
- /tmp:noexec,nosuid,size=64m
Na imenike, ki potrebujejo zapisovanje (kot /tmp), priklopite tmpfs. To naredi vse zapisljive podatke začasne. Opozorilo: Nekatere aplikacije potrebujejo trajno shranjevanje; za to uporabite imenovane nosilce (named volumes).
Pogoste pasti
- Kompatibilnost jedra: Preusmerjanje uporabniških imenskih prostorov in nekatera seccomp pravila zahtevajo sodobno jedro Linuxa (4.14+). Preverite različico jedra.
- Vpliv na zmogljivost: Seccomp in uporabniški imenski prostori dodajo majhen strošek, vendar je zanemarljiv za večino delovnih obremenitev. Preizkusite svojo specifično aplikacijo.
- Kompleksnost: Dodajanje vseh šestih ukrepov naenkrat lahko povzroči težave. Uvedite jih enega za drugim in preizkusite vsako spremembo.
Za širši pogled na vzorce orkestracije si oglejte naš vodnik o načrtovanju večnajemniške Docker arhitekture.
Zaključek
Varen večnajemniški Docker gostitelj ne zahteva eksotičnih orodij – le pravilno uporabo Dockerjevih vgrajenih funkcij. Začnite z nerooth uporabnikom, odstranite vse zmogljivosti, uporabite seccomp profil, omogočite preusmerjanje uporabniških imenskih prostorov, nastavite omejitve virov in uporabite datotečni sistem samo za branje. Ta kontrolni seznam tvori močno osnovo, ki blokira najpogostejše tehnike pobega. Po implementaciji zaženite varnostna orodja, kot je docker-bench-security, da preverite svojo konfiguracijo. Ne pozabite: varnost je proces, ne izdelek. Ko se pojavijo nove ranljivosti jedra, ponovno preglejte svoje nastavitve. Za avtomatizirane ciljne strani, ki predstavljajo vašo gostiteljsko storitev, uporabite Pagenzo, da ustvarite svoje spletno mesto v nekaj minutah.
Sources (5)
- Docker and Container Isolation
- Chapter 2. Container Hosts and Multi-tenancy | Container Security Guide | OpenShift Container Platform | 3.6 | Red Hat Documentation
- What is Container Escape? - Aqua Security
- Container escape vulnerabilities allow attackers to break out of isolated environments and gain unauthorized access to host systems.
- Enhanced Container Isolation - Docker Docs

