Blog
Docker-containers harden voor multi-tenant hosting: een stapsgewijze isolatiegids
Leer hoe u Docker-containers kunt beveiligen voor multi-tenant omgevingen met praktische beveiligingsmaatregelen zoals niet-rootgebruikers, verwijderde mogelijkheden, alleen-lezen bestandssystemen en netwerkisolatie.

Samenvatting
Het draaien van een multi-tenant Docker-hostplatform vereist een waterdichte containerisolatie om te voorkomen dat tenants elkaar hinderen of ontsnappen naar de host. Deze gids biedt een concreet, stapsgewijs hardeningsproces dat u vandaag nog kunt toepassen. U leert niet-rootgebruikers configureren, onnodige Linux-capabilities verwijderen, bestandssystemen alleen-lezen maken, resource-limieten afdwingen via cgroups, netwerken segmenteren en seccomp- of AppArmor-profielen toepassen. We behandelen ook wanneer u containers moet aanvullen met virtuele machines voor maximale beveiliging. Aan het einde heeft u een checklist om veelvoorkomende container-escape-vectoren systematisch te elimineren en uw multi-tenant infrastructuur echt geïsoleerd te houden.
Het praktijkprobleem met multi-tenant containers
Docker-containers delen de hostkernel en als isolatie verkeerd is geconfigureerd, kan een tenant theoretisch toegang krijgen tot de gegevens van een andere, alle CPU verbruiken of zelfs uitbreken naar de host. Als hostingprovider heeft u waterdichte grenzen nodig zonder de prestatievoordelen van containers op te offeren. Veel teams beginnen met standaard Docker-instellingen, die zijn ontworpen voor ontwikkeling, niet voor productie multi-tenancy. Het goede nieuws: met een systematische hardeningschecklist kunt u elke container vergrendelen tot bijna VM-niveau van isolatie terwijl u de snelheid van Docker behoudt.
Dit artikel doorloopt elke hardeningsstap met praktische voorbeelden en kanttekeningen. Aan het einde heeft u een herhaalbaar proces om veilige multi-tenant containers te implementeren.
Stap 1: Containers uitvoeren als niet-root
Standaard draaien Docker-containers als root. Als een container wordt gecompromitteerd, krijgt de aanvaller rootrechten binnen de container en kan proberen te ontsnappen. Maak eerst een speciale gebruiker aan in uw Dockerfile en schakel over:
FROM ubuntu:22.04
RUN useradd -m appuser
USER appuser
Let op: Sommige processen (bijv. binden aan poorten < 1024) vereisen root. Gebruik in dat geval de --cap-add vlag om alleen de benodigde capability toe te staan, zoals --cap-add=NET_BIND_SERVICE, en voer het proces nog steeds uit onder een niet-rootgebruiker.
Voor meer informatie over fundamentele isolatie, zie onze gids over het bereiken van echte multi-tenant isolatie in Docker.
Stap 2: Verwijder alle Linux-capabilities en voeg alleen toe wat u nodig heeft
Linux-capabilities verdelen rootrechten in kleine eenheden. Docker-containers worden geleverd met een standaardset capabilities die te permissief zijn voor multi-tenant hosting. Verwijder alles en voeg alleen toe wat uw applicatie vereist:
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE my-app
Veelvoorkomende capabilities om te vermijden: SYS_ADMIN (container-escape), NET_RAW (packetsniffen), SYS_PTRACE (processdebuggen). Gebruik docker run met --security-opt no-new-privileges om privilege-escalatie via setuid-binary's te voorkomen.
Stap 3: Koppel het rootbestandssysteem als alleen-lezen
Aanvallers schrijven vaak kwaadaardige scripts naar het containerbestandssysteem. Door het rootbestandssysteem alleen-lezen te maken, voorkomt u dat:
docker run --read-only --tmpfs /tmp:rw,noexec,nosuid,size=64m my-app
--tmpfs maakt een tijdelijk beschrijfbaar koppelpunt voor directories zoals /tmp en /var/run. De vlag noexec voorkomt uitvoering vanaf dat koppelpunt. Deze aanpak dwingt aanvallers om via beschrijfbare directories te schakelen, die u kunt monitoren.
Stap 4: Resource-limieten afdwingen met cgroups
Onbegrensde containers kunnen denial-of-service-aanvallen uitvoeren door hostgeheugen of CPU uit te putten. Gebruik Docker's runtime-beperkingen:
docker run --memory=512m --memory-swap=512m --cpus=0.5 --pids-limit=100 my-app
--memoryen--memory-swapstellen harde limieten in (geen swap).--cpusbeperkt CPU.--pids-limitvoorkomt fork-bommen door het aantal processen te beperken.
Let op: Resource-limieten worden afgedwongen door cgroups, maar voorkomen niet dat gegevens via het netwerk worden geëxfiltreerd. Combineer met netwerkisolatie (volgende stap).
Stap 5: Netwerken segmenteren met aangepaste Docker-netwerken
Standaard delen Docker-containers een bridgenetwerk. In een multi-tenant opstelling moet u de netwerkstack van elke tenant isoleren. Maak een dedicated netwerk per tenant:
docker network create tenant-alpha --internal
docker run --network tenant-alpha my-app
Gebruik de vlag --internal om uitgaande internettoegang te blokkeren en stel alleen noodzakelijke poorten bloot via -p. Voor meer geavanceerde netwerksegmentatie, overweeg het beveiligen van webapps met Docker-isolatie.
Let op: Interne netwerken voorkomen directe container-naar-container communicatie tussen tenants, maar DNS-lekken kunnen nog steeds optreden als u hostnetworking gebruikt. Houd bij bridge- of overlay-netwerken.
Stap 6: Seccomp- en AppArmor-profielen toepassen
Seccomp filtert systeemaanroepen en AppArmor (of SELinux) dwingt verplichte toegangscontroles af. Docker biedt een standaard seccomp-profiel dat gevaarlijke syscalls zoals clone met bepaalde vlaggen blokkeert. Voor strengere isolatie maakt u een aangepast profiel:
docker run --security-opt seccomp=./custom.json --security-opt apparmor=docker-default my-app
U kunt een basisprofiel genereren met docker run --rm -it --security-opt seccomp=unconfined my-app strace -c -S time en vervolgens bijsnijden. Let op: Overmatig restrictieve profielen kunnen legitieme functionaliteit breken. Test grondig in een stagingomgeving.
Stap 7: Overweeg hybride isolatie met virtuele machines
Als uw tenants absolute isolatie vereisen (bijv. gereguleerde industrie), voer dan containers uit in een lichtgewicht VM. Tools zoals Sysbox of Kata Containers bieden hardwarematige scheiding zonder de snelheid van containers op te offeren. Dit is de aanpak die wordt gebruikt door Docker's Enhanced Container Isolation (ECI). Hoewel de overhead hoger is dan bij kale containers, is deze veel lager dan bij volledige VMs per workload.
Voor meer informatie over het kiezen van het juiste isolatieniveau, lees het ontwerpen van een multi-tenant Docker-architectuur.
Alles samenbrengen: een hardeningschecklist
- Bouw containers met een niet-rootgebruiker.
- Verwijder alle capabilities, voeg alleen vereiste toe.
- Koppel bestandssysteem alleen-lezen met tijdelijke beschrijfbare koppelpunten.
- Stel geheugen-, CPU- en PID-limieten in.
- Maak geïsoleerde Docker-netwerken per tenant.
- Pas aangepaste seccomp- en AppArmor-profielen toe.
- Evalueer hybride VM-containers voor hoge beveiligingsbehoeften.
Conclusie
Containerharden is geen eenmalige taak; het is een doorlopende discipline. De bovenstaande stappen vormen een beveiligingsbasis voor multi-tenant hosting. Onthoud dat geen enkele maatregel veiligheid garandeert; defense in depth is de sleutel. Begin met de basis: niet-rootgebruikers en verwijderde capabilities. Voeg vervolgens resource-limieten en netwerksegmentatie toe. Voor de meest gevoelige workloads combineert u containers met VMs. Met deze gids kunt u vol vertrouwen multi-tenant Docker-omgevingen implementeren die zowel efficiënt als veilig zijn.
