Docker Security-Härtung¶
Nach der Installation sollte Docker für den Produktionseinsatz gehärtet werden.
Docker Security-Risiken¶
Docker = Root-Rechte
Der Docker-Daemon läuft als Root. Container können bei falscher Konfiguration auf das Host-System zugreifen.
flowchart TD
subgraph Risiken
A[Container Escape]
B[Privilegierte Container]
C[Host-Dateisystem-Zugriff]
D[Netzwerk-Manipulation]
end
subgraph Maßnahmen
E[User Namespaces]
F[Resource Limits]
G[Read-only Mounts]
H[Network Policies]
end
A --> E
B --> F
C --> G
D --> H
1. Docker-Daemon konfigurieren¶
Erstelle die Daemon-Konfigurationsdatei:
Empfohlene Konfiguration¶
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"storage-driver": "overlay2",
"live-restore": true,
"userland-proxy": false,
"no-new-privileges": true,
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65535,
"Soft": 65535
},
"nproc": {
"Name": "nproc",
"Hard": 65535,
"Soft": 65535
}
},
"icc": false,
"default-address-pools": [
{
"base": "172.17.0.0/16",
"size": 24
},
{
"base": "172.16.0.0/12",
"size": 20
}
]
}
Konfigurationsoptionen erklärt
| Option | Beschreibung | Sicherheitsrelevanz |
|---|---|---|
log-driver |
Logging-Format | Ermöglicht Log-Analyse |
max-size/max-file |
Log-Rotation | Verhindert Disk-Overflow |
overlay2 |
Storage-Treiber | Empfohlen für Performance |
live-restore |
Container laufen bei Daemon-Restart weiter | Hochverfügbarkeit |
userland-proxy |
Deaktiviert User-Space Proxy | Performance, Sicherheit |
no-new-privileges |
Verhindert Privilege Escalation | Kritisch |
icc: false |
Isoliert Container-Netzwerke | Kritisch |
Docker-Dienst neu starten:
2. Docker Socket absichern¶
Docker Socket = Root
Zugriff auf /var/run/docker.sock bedeutet effektiv Root-Zugriff
auf das Host-System.
Prüfe die Berechtigungen:
Sollte zeigen:
Der Socket ist nur für root und die docker-Gruppe zugänglich.
3. Container-Defaults festlegen¶
Empfohlene Container-Einstellungen¶
Beim Erstellen von Containern sollten folgende Optionen verwendet werden:
docker run \
--read-only \ # (1)!
--security-opt=no-new-privileges:true \ # (2)!
--cap-drop=ALL \ # (3)!
--cap-add=CHOWN \ # (4)!
--cap-add=SETGID \
--cap-add=SETUID \
--memory=512m \ # (5)!
--cpus=1.0 \ # (6)!
--pids-limit=100 \ # (7)!
--restart=unless-stopped \
your-image
- Container-Dateisystem nur lesbar
- Keine neuen Privilegien erlaubt
- Alle Linux Capabilities entfernen
- Nur benötigte Capabilities hinzufügen
- Speicherlimit
- CPU-Limit
- Prozess-Limit (Fork-Bomb-Schutz)
Coolify-Container
Coolify konfiguriert diese Optionen für seine Container automatisch. Die Einstellungen dienen als Referenz für eigene Container.
4. AppArmor aktivieren¶
AppArmor ist bei Ubuntu standardmäßig installiert und aktiv:
Docker verwendet automatisch AppArmor-Profile für Container.
5. Netzwerk-Isolation¶
Standard-Bridge-Netzwerk vermeiden¶
Erstelle dedizierte Netzwerke für Anwendungen:
# Netzwerk erstellen
docker network create \
--driver bridge \
--subnet 172.28.0.0/16 \
--opt "com.docker.network.bridge.enable_icc=false" \
myapp-network
Container ohne Netzwerk¶
Für Container die kein Netzwerk benötigen:
6. Secrets Management¶
Niemals Secrets in Images
- Keine Passwörter in Dockerfiles
- Keine API-Keys in Environment-Variablen (sichtbar in
docker inspect) - Keine Secrets in Git-Repositories
Für Compose ohne Swarm¶
services:
app:
image: myapp
secrets:
- db_password
secrets:
db_password:
file: ./secrets/db_password.txt
Coolify Secrets
Coolify bietet eine integrierte Secrets-Verwaltung in der Web-UI. Verwende diese für sensitive Konfigurationsdaten.
TODO ufw-docker¶
Sicherheits-Checkliste¶
- Docker-Daemon konfiguriert (
daemon.json) -
no-new-privilegesaktiviert - Inter-Container-Communication deaktiviert (
icc: false) - Log-Rotation konfiguriert
- Resource-Limits definiert
- AppArmor aktivls -lt /data/coolify/source/*.log | head -5
Zusammenfassung¶
Nach Abschluss dieses Abschnitts:
- Docker-Daemon gehärtet
- Security-Defaults konfiguriert
- Netzwerk-Isolation verstanden
- Secrets-Management gelernt