Blog
Eine praktische Docker-Isolations-Sicherheitscheckliste für Multi-Tenant-Hosting
Sichern Sie Ihr Multi-Tenant-Docker-Hosting mit dieser praktischen Checkliste, die Nicht-Root-Benutzer, Capabilities, Seccomp, User Namespaces, Ressourcenlimits und schreibgeschützte Dateisysteme abdeckt.
Zusammenfassung
Multi-Tenant-Docker-Hosting erfordert eine starke Isolierung, um Containerausbrüche zu verhindern. Dieser Artikel bietet eine praktische Sicherheitscheckliste, die sechs Schlüsselbereiche abdeckt: als Nicht-Root ausführen, Capabilities entfernen, Seccomp-Profile anwenden, User-Namespace-Remapping aktivieren, Ressourcenlimits setzen und schreibgeschützte Root-Dateisysteme verwenden. Jeder Schritt enthält ein konkretes Konfigurationsbeispiel für Docker Compose. Sie lernen auch häufige Fallstricke wie Kernel-Kompatibilitätsprobleme mit User Namespaces und Leistungskompromisse bei der Anwendung von Seccomp kennen. Wenn Sie dieser Checkliste folgen, können Sie die Angriffsfläche erheblich reduzieren, ohne unnötige Komplexität hinzuzufügen. Der Artikel schließt mit einer empfohlenen Basiskonfiguration für Multi-Tenant-Produktionsumgebungen.
Wenn Sie eine Multi-Tenant-Docker-Umgebung betreiben, hält Sie das Gespenst eines Containerausbruchs nachts wach. Ein einziger Kernel-Exploit kann aus einem Container ausbrechen und einem Angreifer uneingeschränkten Zugriff auf den Host und alle Daten anderer Mandanten verschaffen. Obwohl Docker leistungsstarke Isolationsprimitive bereitstellt – Namespaces, Cgroups und Capabilities – hinterlassen Fehlkonfigurationen Lücken. Dieser Artikel präsentiert eine Schritt-für-Schritt-Sicherheitscheckliste, die Sie noch heute anwenden können. Jeder Schritt enthält ein funktionierendes Docker-Compose-Snippet und wichtige Hinweise. Am Ende haben Sie eine gehärtete Basis, die Sicherheit und Leistung in Einklang bringt.
1. Container als Nicht-Root-Benutzer ausführen
Container laufen standardmäßig als root innerhalb des Containers. Wenn ein Angreifer root im Container erlangt, hat er einen Vorsprung bei der Flucht. Definieren Sie immer einen Nicht-Root-Benutzer in Ihrem Dockerfile.
FROM alpine:3.18
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
In Compose können Sie den Benutzer auch direkt festlegen:
services:
app:
image: myapp
user: "1000:1000"
Hinweis: Einige Anwendungen benötigen root für legitime Operationen (z.B. Binden an Ports unter 1024). Verwenden Sie CAP_NET_BIND_SERVICE anstatt den gesamten Container als root auszuführen. Für einen tieferen Einblick in die Grundlagen der Isolierung lesen Sie unseren Leitfaden zum Erreichen echter Multi-Tenant-Isolation in Docker.
2. Alle Capabilities entfernen und nur das Nötigste hinzufügen
Linux-Capabilities gewähren Containern fein granulare Berechtigungen. Standardmäßig gewährt Docker eine Reihe von Capabilities. Entfernen Sie alle und gewähren Sie nur die erforderlichen.
services:
app:
image: myapp
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE # if needed
Hinweis: Capabilities wie SYS_ADMIN oder NET_RAW werden selten benötigt. Überprüfen Sie Ihre Anwendung, um die minimale Menge zu ermitteln. Das Entfernen aller Capabilities blockiert viele Ausbruchsvektoren.
3. Ein Seccomp-Profil anwenden
Seccomp (Secure Computing Mode) filtert die Systemaufrufe, die einem Container zur Verfügung stehen. Docker wird mit einem standardmäßigen Seccomp-Profil ausgeliefert, das gefährliche Syscalls wie clone mit bestimmten Flags blockiert. Sie können es weiter anpassen.
services:
app:
image: myapp
security_opt:
- seccomp=/path/to/custom-profile.json
Ein gehärtetes Profil könnte unshare, ptrace und mount blockieren. Beginnen Sie mit dem Docker-Standard und schränken Sie weiter ein. Hinweis: Zu strenge Profile können Anwendungen beschädigen. Testen Sie gründlich in einer Staging-Umgebung. Weitere Informationen zur Verteidigung gegen Containerausbrüche finden Sie unter Verteidigung gegen Container Escape.
4. User-Namespace-Remapping aktivieren
User Namespaces ordnen den Root-Benutzer des Containers einem unprivilegierten Host-Benutzer zu. Das bedeutet, selbst wenn ein Angreifer root innerhalb des Containers erlangt, hat er keine besonderen Rechte auf dem Host.
Aktivieren Sie es auf dem Docker-Daemon, indem Sie /etc/docker/daemon.json bearbeiten:
{
"userns-remap": "default"
}
Starten Sie dann Docker neu. Hinweis: Das User-Namespace-Remapping hat zwei Nachteile: Es unterbricht Volume-Mounts, wenn diese nicht sorgfältig konfiguriert sind (Dateien gehören dem remappten Benutzer) und ist mit einigen Storage-Treibern wie overlay2 auf älteren Kernels inkompatibel. Gründlich testen.
5. Ressourcenlimits mit Cgroups setzen
Ressourcenlimits verhindern, dass ein kompromittierter Container einen Denial-of-Service-Angriff gegen den Host startet. Verwenden Sie Cgroups, um CPU, Speicher und Festplatten-I/O zu begrenzen.
services:
app:
image: myapp
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
Für Docker Compose v3 verwenden Sie den Abschnitt deploy (funktioniert mit Swarm oder Compose v2). Für normales Docker verwenden Sie --memory und --cpus. Hinweis: Zu niedrige Limits können OOM-Kills verursachen. Überwachen Sie die Nutzung und passen Sie entsprechend an.
6. Schreibgeschütztes Root-Dateisystem verwenden
Ein schreibgeschütztes Root-Dateisystem verhindert, dass Angreifer schädliche Binärdateien schreiben oder Konfigurationsdateien im Container ändern.
services:
app:
image: myapp
read_only: true
tmpfs:
- /tmp:noexec,nosuid,size=64m
Mounten Sie tmpfs auf Verzeichnissen, die Schreibzugriff benötigen (wie /tmp). Dadurch werden alle beschreibbaren Daten flüchtig. Hinweis: Einige Anwendungen benötigen persistenten Speicher; verwenden Sie dafür benannte Volumes.
Häufige Fallstricke
- Kernel-Kompatibilität: User-Namespace-Remapping und einige Seccomp-Regeln erfordern einen aktuellen Linux-Kernel (4.14+). Überprüfen Sie Ihre Kernel-Version.
- Leistungseinbußen: Seccomp und User Namespaces verursachen einen geringen Overhead, der für die meisten Arbeitslasten vernachlässigbar ist. Testen Sie Ihre spezifische Anwendung.
- Komplexität: Das gleichzeitige Hinzufügen aller sechs Maßnahmen kann Dinge beschädigen. Wenden Sie sie einzeln an und testen Sie jede Änderung.
Für einen breiteren Überblick über Orchestrierungsmuster lesen Sie unseren Leitfaden zum Entwurf einer Multi-Tenant-Docker-Architektur.
Fazit
Ein sicheres Multi-Tenant-Docker-Host erfordert keine exotischen Werkzeuge – nur die korrekte Verwendung der integrierten Docker-Funktionen. Beginnen Sie mit einem Nicht-Root-Benutzer, entfernen Sie alle Capabilities, wenden Sie ein Seccomp-Profil an, aktivieren Sie das User-Namespace-Remapping, setzen Sie Ressourcenlimits und verwenden Sie ein schreibgeschütztes Dateisystem. Diese Checkliste bildet eine starke Basis, die die häufigsten Ausbruchstechniken blockiert. Nach der Implementierung führen Sie Sicherheitstools wie docker-bench-security aus, um Ihre Konfiguration zu überprüfen. Denken Sie daran: Sicherheit ist ein Prozess, kein Produkt. Wenn neue Kernel-Sicherheitslücken auftauchen, überprüfen Sie Ihre Einstellungen erneut. Für automatisierte Landingpages, die Ihren Hosting-Service präsentieren, nutzen Sie Pagenza, um Ihre Website in Minuten live zu schalten.
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

