Blog
Un ghid practic de securitate pentru izolarea Docker în găzduirea multi-tenant
Asigură-ți găzduirea multi-tenant Docker cu acest ghid practic care acoperă utilizatori non-root, capabilități, seccomp, spații de nume utilizator, limite de resurse și sisteme de fișiere read-only.
Rezumat
Găzduirea multi-tenant Docker necesită o izolare puternică pentru a preveni evadările din containere. Acest articol oferă un ghid practic de securitate care acoperă șase domenii cheie: rulați ca non-root, eliminați capabilitățile, aplicați profiluri seccomp, activați remaparea spațiilor de nume utilizator, stabiliți limite de resurse și utilizați sisteme de fișiere rădăcină read-only. Fiecare pas include un exemplu concret de configurare pentru Docker Compose. Veți învăța și capcane comune, cum ar fi probleme de compatibilitate a kernelului cu spațiile de nume utilizator și compromisuri de performanță la aplicarea seccomp. Urmând acest ghid, puteți reduce semnificativ suprafața de atac fără a adăuga complexitate inutilă. Articolul se încheie cu o configurare de bază recomandată pentru medii multi-tenant de producție.
Dacă administrați un mediu Docker multi-tenant, spectrul unui atac de evadare din container vă ține treaz noaptea. O singură exploatare a kernelului poate ieși dintr-un container și poate oferi unui atacator acces nelimitat la gazdă și la datele celorlalți chiriași. Deși Docker oferă primitive puternice de izolare—namespaces, cgroups și capabilități—configurarea greșită lasă lacune. Acest articol prezintă un ghid de securitate pas cu pas pe care îl puteți aplica astăzi. Fiecare pas include un fragment funcțional Docker Compose și avertismente cheie. La final, veți avea o bază de securizare care echilibrează securitatea și performanța.
1. Rulați containerele ca utilizator non-root
Containerele rulează implicit ca root în interiorul containerului. Dacă un atacator obține acces root în container, are un avantaj în a evada. Definiți întotdeauna un utilizator non-root în Dockerfile.
FROM alpine:3.18
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
În Compose, puteți seta și utilizatorul direct:
services:
app:
image: myapp
user: "1000:1000"
Avertisment: Unele aplicații necesită root pentru operațiuni legitime (de exemplu, legarea la porturi sub 1024). Utilizați CAP_NET_BIND_SERVICE în loc să rulați întregul container ca root. Pentru o privire mai profundă asupra elementelor fundamentale ale izolării, consultați ghidul nostru despre realizarea izolării multi-tenant adevărate în Docker.
2. Eliminați toate capabilitățile și adăugați doar ceea ce este necesar
Capabilitățile Linux oferă privilegii fine containerelor. Implicit, Docker acordă un set de capabilități. Eliminați totul și acordați doar ceea ce este necesar.
services:
app:
image: myapp
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE # if needed
Avertisment: Capabilități precum SYS_ADMIN sau NET_RAW sunt rareori necesare. Auditați aplicația pentru a determina setul minim. Eliminarea tuturor capabilităților blochează multe vectori de evadare.
3. Aplicați un profil seccomp
Seccomp (mod de calcul securizat) filtrează apelurile de sistem disponibile unui container. Docker include un profil seccomp implicit care blochează apeluri de sistem periculoase precum clone cu anumite flaguri. Îl puteți personaliza în continuare.
services:
app:
image: myapp
security_opt:
- seccomp=/path/to/custom-profile.json
Un profil securizat ar putea bloca unshare, ptrace și mount. Începeți cu profilul implicit Docker și restricționați mai mult. Avertisment: Profilele prea stricte pot afecta aplicațiile. Testați temeinic într-un mediu de staging. Pentru mai multe informații despre apărarea împotriva evadării din containere, citiți apărarea împotriva evadării din containere.
4. Activați remaparea spațiilor de nume utilizator
Spațiile de nume utilizator mapează utilizatorul root al containerului la un utilizator neprivilegiat al gazdei. Aceasta înseamnă că, chiar dacă un atacator obține root în interiorul containerului, nu are privilegii speciale pe gazdă.
Activați-l pe daemonul Docker editând /etc/docker/daemon.json:
{
"userns-remap": "default"
}
Apoi reporniți Docker. Avertisment: Remaparea spațiilor de nume utilizator are două dezavantaje: afectează montarea volumelor atunci când nu este configurată cu atenție (fișierele sunt deținute de utilizatorul remapat) și este incompatibilă cu unele drivere de stocare precum overlay2 pe kerneluri mai vechi. Testați temeinic.
5. Stabiliți limite de resurse cu cgroups
Limitele de resurse împiedică un container compromis să lanseze un atac de denial-of-service asupra gazdei. Utilizați cgroups pentru a limita CPU, memoria și I/O-ul discului.
services:
app:
image: myapp
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
Pentru Docker Compose v3, utilizați secțiunea deploy (funcționează cu swarm sau compose v2). Pentru Docker simplu, utilizați --memory și --cpus. Avertisment: Setarea limitelor prea mici poate cauza ucideri OOM. Monitorizați utilizarea și ajustați în consecință.
6. Utilizați un sistem de fișiere rădăcină read-only
Un sistem de fișiere rădăcină read-only împiedică atacatorii să scrie binare malițioase sau să modifice fișiere de configurare în interiorul containerului.
services:
app:
image: myapp
read_only: true
tmpfs:
- /tmp:noexec,nosuid,size=64m
Montați tmpfs pe directoarele care necesită acces de scriere (precum /tmp). Acest lucru forțează toate datele inscriptibile să fie efemere. Avertisment: Unele aplicații necesită stocare persistentă; utilizați volume denumite în acest caz.
Capcane comune
- Compatibilitatea kernelului: Remaparea spațiilor de nume utilizator și unele reguli seccomp necesită un kernel Linux recent (4.14+). Verificați versiunea kernelului dumneavoastră.
- Impactul asupra performanței: Seccomp și spațiile de nume utilizator adaugă un mic overhead, dar este neglijabil pentru majoritatea sarcinilor de lucru. Evaluați aplicația specifică.
- Complexitatea: Adăugarea tuturor celor șase măsuri odată poate cauza probleme. Aplicați-le una câte una, testați fiecare schimbare.
Pentru o viziune mai largă asupra modelelor de orchestrare, consultați ghidul nostru despre proiectarea unei arhitecturi Docker multi-tenant.
Concluzie
O gazdă Docker multi-tenant sigură nu necesită instrumente exotice—ci doar utilizarea corectă a funcțiilor încorporate Docker. Începeți cu un utilizator non-root, eliminați toate capabilitățile, aplicați un profil seccomp, activați remaparea spațiilor de nume utilizator, stabiliți limite de resurse și utilizați un sistem de fișiere read-only. Acest ghid formează o bază solidă care blochează cele mai comune tehnici de evadare. După implementare, rulați instrumente de securitate precum docker-bench-security pentru a verifica configurația. Amintiți-vă: securitatea este un proces, nu un produs. Pe măsură ce apar noi vulnerabilități ale kernelului, revizuiți setările. Pentru pagini de destinație automate care vă prezintă serviciul de găzduire, utilizați Pagenza pentru a vă lansa site-ul în câteva minute.
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

