Blog

Întărirea containerelor Docker pentru găzduire multi-tenant: Un ghid pas cu pas de izolare

Aflați cum să securizați containerele Docker pentru medii multi-tenant cu măsuri practice de securitate, cum ar fi utilizatori non-root, capabilități eliminate, sisteme de fișiere doar citire și izolare rețea.

Rezumat

Operarea unei platforme de găzduire Docker multi-tenant necesită o izolare etanșă a containerelor pentru a preveni interferența între tenanți sau evadarea către gazdă. Acest ghid oferă un proces concret, pas cu pas, de întărire pe care îl puteți aplica astăzi. Veți învăța să configurați utilizatori non-root, să eliminați capabilitățile Linux inutile, să montați sistemele de fișiere doar citire, să impuneți limite de resurse prin cgroups, să segmentați rețelele și să aplicați profiluri seccomp sau AppArmor. Vom acoperi și când să suplimentați containerele cu mașini virtuale pentru securitate maximă. Până la sfârșit, veți avea o listă de verificare pentru a elimina sistematic vectorii obișnuiți de evadare a containerelor și pentru a menține infrastructura dvs. multi-tenant cu adevărat izolată.

Problema reală cu containerele multi-tenant

Containerele Docker partajează kernel-ul gazdei, iar dacă izolarea este configurată greșit, un tenant poate accesa teoretic datele altuia, poate consuma toată CPU-ul sau chiar poate ieși din container către gazdă. Ca furnizor de găzduire, aveți nevoie de granițe etanșe fără a sacrifica beneficiile de performanță ale containerelor. Multe echipe încep cu setările implicite Docker, care sunt concepute pentru dezvoltare, nu pentru multi-tenant în producție. Vestea bună: cu o listă de verificare sistematică de întărire, puteți bloca fiecare container la niveluri de izolare apropiate de VM, păstrând în același timp viteza Docker.

Acest articol vă ghidează prin fiecare pas de întărire cu exemple practice și avertismente. Până la sfârșit, veți avea un proces repetabil pentru a implementa containere multi-tenant sigure.

Pasul 1: Rulați containerele ca non-root

În mod implicit, containerele Docker rulează ca root. Dacă un container este compromis, atacatorul obține privilegii root în interiorul containerului și poate încerca o evadare. Mai întâi, creați un utilizator dedicat în Dockerfile și comutați la acesta:

FROM ubuntu:22.04
RUN useradd -m appuser
USER appuser

Avertisment: Unele procese (de exemplu, legarea la porturi < 1024) necesită root. În astfel de cazuri, utilizați flag-ul --cap-add pentru a acorda doar capabilitatea necesară, cum ar fi --cap-add=NET_BIND_SERVICE, și rulați totuși procesul sub un utilizator non-root.

Pentru mai multe detalii despre izolarea de bază, consultați ghidul nostru despre realizarea izolării multi-tenant autentice în Docker.

Pasul 2: Eliminați toate capabilitățile Linux și adăugați înapoi doar ceea ce aveți nevoie

Capabilitățile Linux descompun privilegiile root în unități mici. Containerele Docker vin cu un set implicit de capabilități care sunt prea permisive pentru găzduirea multi-tenant. Eliminați-le pe toate și adăugați înapoi doar ceea ce necesită aplicația dvs.:

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

Capabilități comune de evitat: SYS_ADMIN (evadare container), NET_RAW (sniffing pachete), SYS_PTRACE (debugging procese). Utilizați docker run cu --security-opt no-new-privileges pentru a preveni escaladarea privilegiilor prin binare setuid.

Pasul 3: Montați sistemul de fișiere rădăcină ca doar citire

Atacatorii scriu adesea scripturi malițioase în sistemul de fișiere al containerului. Făcând sistemul de fișiere rădăcină doar citire, împiedicați acest lucru:

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

--tmpfs creează un montaj temporar inscripționabil pentru directoare precum /tmp și /var/run. Flag-ul noexec previne executarea din acel montaj. Această abordare forțează atacatorii să pivoteze prin directoare inscripționabile, pe care le puteți monitoriza.

Pasul 4: Impuneți limite de resurse cu cgroups

Containerele nelimitate pot efectua atacuri de tip denial-of-service, epuizând memoria sau CPU-ul gazdei. Utilizați constrângerile de runtime ale Docker:

docker run --memory=512m --memory-swap=512m --cpus=0.5 --pids-limit=100 my-app
  • --memory și --memory-swap stabilesc limite dure (fără swap).
  • --cpus limitează CPU.
  • --pids-limit previne fork bombs prin limitarea numărului de procese.

Avertisment: Limitele de resurse sunt aplicate de cgroups, dar nu împiedică exfiltrarea datelor prin rețea. Combinați cu izolarea rețelei (pasul următor).

Pasul 5: Segmentați rețelele cu rețele Docker personalizate

În mod implicit, containerele Docker partajează o rețea bridge. Într-o configurație multi-tenant, trebuie să izolați stiva de rețea a fiecărui tenant. Creați o rețea dedicată per tenant:

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

Utilizați flag-ul --internal pentru a bloca accesul la internet în exterior, apoi expuneți doar porturile necesare prin -p. Pentru segmentare avansată a rețelei, luați în considerare securizarea aplicațiilor web cu izolare Docker.

Avertisment: Rețelele interne împiedică comunicarea directă container-la-container între tenanți, dar scurgerile DNS pot apărea în continuare dacă utilizați rețeaua gazdei. Rămâneți la rețele bridge sau overlay.

Pasul 6: Aplicați profiluri Seccomp și AppArmor

Seccomp filtrează apelurile de sistem, iar AppArmor (sau SELinux) aplică controale de acces obligatorii. Docker oferă un profil seccomp implicit care blochează apeluri periculoase precum clone cu anumite flag-uri. Pentru o izolare mai strictă, creați un profil personalizat:

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

Puteți genera un profil de bază cu docker run --rm -it --security-opt seccomp=unconfined my-app strace -c -S time și apoi reduceți-l. Avertisment: Profilurile prea restrictive pot întrerupe funcționalitatea legitimă. Testați temeinic în staging.

Pasul 7: Luați în considerare izolarea hibridă cu mașini virtuale

Dacă tenanții dvs. necesită izolare absolută (de exemplu, industrie reglementată), rulați containerele într-o mașină virtuală ușoară. Instrumente precum Sysbox sau Kata Containers oferă separare la nivel hardware fără a sacrifica viteza containerelor. Aceasta este abordarea utilizată de Enhanced Container Isolation (ECI) al Docker. Deși suprasarcina este mai mare decât containerele goale, este mult mai mică decât VM-urile complete per sarcină de lucru.

Pentru mai multe informații despre alegerea nivelului potrivit de izolare, citiți proiectarea unei arhitecturi Docker multi-tenant.

Punerea în practică: O listă de verificare pentru întărire

  1. Construiți containerele cu utilizator non-root.
  2. Eliminați toate capabilitățile, adăugați doar cele necesare.
  3. Montați sistemul de fișiere doar citire cu montaje temporare inscripționabile.
  4. Stabiliți limite de memorie, CPU și PID.
  5. Creați rețele Docker izolate per tenant.
  6. Aplicați profiluri seccomp și AppArmor personalizate.
  7. Evaluați containerele hibride VM pentru nevoi de securitate ridicată.

Concluzie

Întărirea containerelor nu este o sarcină unică—este o disciplină continuă. Pașii de mai sus formează o bază de securitate pentru găzduirea multi-tenant. Amintiți-vă că nicio măsură nu garantează siguranța; apărarea în adâncime este cheia. Începeți cu elementele de bază: utilizatori non-root și capabilități eliminate. Apoi adăugați straturi de limite de resurse și segmentare a rețelei. Pentru sarcinile de lucru cele mai sensibile, combinați containerele cu VM-uri. Cu acest ghid, puteți implementa cu încredere medii Docker multi-tenant care sunt atât eficiente, cât și sigure.

Sources (5)