Zum Inhalt

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:

sudo mkdir -p /etc/docker
sudo vim /etc/docker/daemon.json

Empfohlene Konfiguration

/etc/docker/daemon.json
{
  "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:

sudo systemctl restart docker

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:

ls -la /var/run/docker.sock

Sollte zeigen:

srw-rw---- 1 root docker 0 Jan 15 10:00 /var/run/docker.sock

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
  1. Container-Dateisystem nur lesbar
  2. Keine neuen Privilegien erlaubt
  3. Alle Linux Capabilities entfernen
  4. Nur benötigte Capabilities hinzufügen
  5. Speicherlimit
  6. CPU-Limit
  7. 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:

# Status prüfen
sudo aa-status

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:

docker run --network none your-image

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

docker-compose.yml
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-privileges aktiviert
  • 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