Blog

Hærdning af Docker-containere til multi-tenant hosting: En trin-for-trin isoleringsguide

Lær, hvordan du låser Docker-containere ned til multi-tenant miljøer med praktiske sikkerhedsforanstaltninger som ikke-root-brugere, fjernede kapaciteter, skrivebeskyttede filsystemer og netværksisolering.

Resumé

At køre en multi-tenant Docker-hostingplatform kræver lufttæt containerisolering for at forhindre lejere i at forstyrre hinanden eller slippe ud til værten. Denne guide leverer en konkret, trin-for-trin hærdningsproces, du kan anvende i dag. Du lærer at konfigurere ikke-root-brugere, fjerne unødvendige Linux-kapaciteter, montere filsystemer som skrivebeskyttet, håndhæve ressourcegrænser via cgroups, segmentere netværk og anvende seccomp- eller AppArmor-profiler. Vi vil også dække, hvornår man skal supplere containere med virtuelle maskiner for maksimal sikkerhed. Til sidst vil du have en tjekliste til systematisk at eliminere almindelige container-escape-vektorer og holde din multi-tenant infrastruktur virkelig isoleret.

Det virkelige problem med multi-tenant-containere

Docker-containere deler værtskernen, og hvis isoleringen er forkert konfigureret, kan en lejer teoretisk få adgang til en andens data, forbruge al CPU eller endda bryde ud til værten. Som hostingudbyder har du brug for lufttætte grænser uden at ofre containernes ydelsesfordele. Mange teams starter med standard Docker-indstillinger, som er designet til udvikling, ikke produktions-multi-tenant. Den gode nyhed: med en systematisk hærdningstjekliste kan du låse hver container ned til næsten VM-niveaus isolering, mens du bevarer Dockets hastighed.

Denne artikel gennemgår hvert hærdningstrin med praktiske eksempler og forbehold. Til sidst vil du have en gentagelig proces til at implementere sikre multi-tenant-containere.

Trin 1: Kør containere som ikke-root

Som standard kører Docker-containere som root. Hvis en container kompromitteres, får angriberen root-rettigheder inde i containeren og kan forsøge en container-escape. Opret først en dedikeret bruger i din Dockerfile og skift til den:

FROM ubuntu:22.04
RUN useradd -m appuser
USER appuser

Forbehold: Nogle processer (f.eks. binding til porte < 1024) kræver root. I sådanne tilfælde skal du bruge flaget --cap-add for kun at give den nødvendige kapacitet, som --cap-add=NET_BIND_SERVICE, og stadig køre processen under en ikke-root-bruger.

For mere om grundlæggende isolering, se vores guide om at opnå ægte multi-tenant-isolering i Docker.

Trin 2: Fjern alle Linux-kapaciteter og tilføj kun det, du har brug for

Linux-kapaciteter opdeler root-rettigheder i små enheder. Docker-containere leveres med et standardsæt af kapaciteter, der er for tilladende til multi-tenant hosting. Fjern alle og tilføj kun, hvad din applikation kræver:

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

Almindelige kapaciteter at undgå: SYS_ADMIN (container-escape), NET_RAW (pakkesniffing), SYS_PTRACE (procesfejlfinding). Brug docker run med --security-opt no-new-privileges for at forhindre privilegieeskalering via setuid-binærfiler.

Trin 3: Monter rod-filsystemet som skrivebeskyttet

Angribere skriver ofte ondsindede scripts til containerens filsystem. Ved at gøre rod-filsystemet skrivebeskyttet forhindrer du dette:

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

--tmpfs opretter en midlertidig skrivbar montering til mapper som /tmp og /var/run. Flaget noexec forhindrer udførelse fra denne montering. Denne tilgang tvinger angribere til at pivotere gennem skrivbare mapper, som du kan overvåge.

Trin 4: Håndhæv ressourcegrænser med cgroups

Ubundne containere kan udføre denial-of-service-angreb ved at udtømme værtshukommelse eller CPU. Brug Dockets runtime-begrænsninger:

docker run --memory=512m --memory-swap=512m --cpus=0.5 --pids-limit=100 my-app
  • --memory og --memory-swap sætter hårde grænser (ingen swap).
  • --cpus begrænser CPU.
  • --pids-limit forhindrer fork-bomber ved at begrænse antallet af processer.

Forbehold: Ressourcegrænser håndhæves af cgroups, men de forhindrer ikke dataeksfiltrering via netværk. Kombiner med netværksisolering (næste trin).

Trin 5: Segmenter netværk med brugerdefinerede Docker-netværk

Som standard deler Docker-containere et bridge-netværk. I et multi-tenant setup skal du isolere hver tenants netværksstack. Opret et dedikeret netværk per tenant:

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

Brug flaget --internal til at blokere udgående internetadgang, og eksponer derefter kun nødvendige porte via -p. For mere avanceret netværkssegmentering, overvej at sikre webapps med Docker-isolering.

Forbehold: Interne netværk forhindrer direkte container-til-container-kommunikation på tværs af lejere, men DNS-lækager kan stadig forekomme, hvis du bruger værtsnetværk. Hold dig til bridge- eller overlay-netværk.

Trin 6: Anvend Seccomp- og AppArmor-profiler

Seccomp filtrerer systemkald, og AppArmor (eller SELinux) håndhæver obligatorisk adgangskontrol. Docker leverer en standard Seccomp-profil, der blokerer farlige syscalls som clone med visse flag. For strengere isolering skal du oprette en brugerdefineret profil:

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

Du kan generere en basisprofil med docker run --rm -it --security-opt seccomp=unconfined my-app strace -c -S time og derefter trimme ned. Forbehold: For restriktive profiler kan bryde legitim funktionalitet. Test grundigt i staging.

Trin 7: Overvej hybridisolering med virtuelle maskiner

Hvis dine lejere kræver absolut isolering (f.eks. reguleret industri), skal du køre containere inde i en letvægts-VM. Værktøjer som Sysbox eller Kata Containers giver hardware-niveaus adskillelse uden at ofre containerhastighed. Dette er tilgangen brugt af Dockets Enhanced Container Isolation (ECI). Mens overhead er højere end bare containere, er den langt lavere end fulde VM'er per arbejdsbyrde.

For mere om at vælge det rigtige isoleringsniveau, læs design af en multi-tenant Docker-arkitektur.

Samling af det hele: En hærdningstjekliste

  1. Byg containere med ikke-root-bruger.
  2. Fjern alle kapaciteter, tilføj kun nødvendige.
  3. Monter filsystem skrivebeskyttet med midlertidige skrivbare monteringer.
  4. Sæt hukommelses-, CPU- og PID-grænser.
  5. Opret isolerede Docker-netværk per tenant.
  6. Anvend brugerdefinerede Seccomp- og AppArmor-profiler.
  7. Vurder hybrid VM-containere til høje sikkerhedsbehov.

Konklusion

Containerhærdning er ikke en engangsopgave – det er en løbende disciplin. Trinene ovenfor udgør en sikkerhedsbaseline for multi-tenant hosting. Husk, at ingen enkelt foranstaltning garanterer sikkerhed; forsvar i dybden er nøglen. Start med det grundlæggende: ikke-root-brugere og fjernede kapaciteter. Læg derefter ressourcegrænser og netværkssegmentering ovenpå. For de mest følsomme arbejdsbyrder skal du kombinere containere med VM'er. Med denne guide kan du trygt implementere multi-tenant Docker-miljøer, der både er effektive og sikre.

Sources (5)