techlogia — KI- und Web-Dienstleister Berlin
Alle Kurse
Frei lesbar – ohne Anmeldung

Docker-Container absichern

Du härtest eine Docker-Installation nach dem CIS Docker Benchmark: Root-Container eliminieren, Capabilities einschränken, Read-only-Filesysteme aktivieren, Netzwerk-Isolation konfigurieren und den Docker-Daemon absichern. Voraussetzung: docker-basics-Modul. 6 Aufgaben, ca. 90 Minuten.

Dauer: 90 Min.Niveau: ProfiAufgaben: 6

Docker-Installation nach CIS-Benchmark härten

Docker-Container absichern (nach CIS-Benchmark)

Docker verpackt Anwendungen in Container — isolierte Einheiten, die das Betriebssystem-Kernel teilen, aber eigene Dateisysteme und Prozesse haben. Standardmäßig sind Container aber unsicher konfiguriert: Sie laufen als root, dürfen viel und teilen sich ein Netzwerk.

Der CIS Docker Benchmark ist ein anerkannter Industrie-Standard mit Härtungs-Empfehlungen. Du setzt die wichtigsten davon um.

Wichtige Begriffe

  • Daemon (dockerd): der Hintergrund-Dienst, der Container verwaltet. Seine Konfiguration steht in /etc/docker/daemon.json.
  • Capabilities: fein abgestufte Teil-Rechte von root (z. B. „Ports unter 1024 öffnen"). Ein Container braucht meist fast keine.
  • User-Namespace-Remapping: bildet root im Container auf einen unprivilegierten Benutzer auf dem Host ab.

Dein Ziel

Du härtest eine Docker-Installation: User-Namespaces, Container ohne root, Capabilities entfernen, Read-only-Dateisystem, Netzwerk-Isolation und einen abgesicherten Daemon. Voraussetzung: das Modul Docker-Basics.

Aufgaben

  1. 1. User-Namespace-Remapping aktivieren

    Begriff: User-Namespace-Remapping. Bricht ein Angreifer aus einem Container aus, der als root läuft, ist er auch auf dem Host root — Totalschaden. Remapping bildet das Container-root auf einen unprivilegierten Host-Benutzer ab: Ein Ausbruch landet dann als harmloser Nutzer. Die wichtigste Container-Härtung überhaupt.

    Trage in /etc/docker/daemon.json (sudo nano /etc/docker/daemon.json) ein:

    {
      "userns-remap": "default"
    }

    Danach Docker neu starten:

    sudo systemctl restart docker

    Bei einem Tippfehler startet Docker nicht — prüfe dann mit sudo journalctl -u docker -n 30.

    Kontrolle: /etc/docker/daemon.json enthält userns-remap, und systemctl is-active docker meldet active.

  2. 2. Container ohne Root starten

    Begriff: USER-Direktive. Container laufen standardmäßig als root — das gefährlichste Docker-Default. Mit der USER-Anweisung im Dockerfile läuft der Prozess als unprivilegierter Benutzer.

    Erstelle /home/student/secure-app/Dockerfile (mkdir -p /home/student/secure-app && nano /home/student/secure-app/Dockerfile) mit:

    FROM alpine:3.20
    RUN adduser -D appuser
    USER appuser
    CMD ["sleep", "3600"]

    Die Zeile USER appuser ist der entscheidende Teil — der Wert darf nicht root oder 0 sein.

    Kontrolle: /home/student/secure-app/Dockerfile enthält eine USER-Direktive.

  3. 3. Unnötige Capabilities entfernen

    Begriff: Capabilities. root ist in viele Capabilities unterteilt (z. B. NET_ADMIN, SYS_TIME). Die meisten Container brauchen keine davon. Mit --cap-drop=ALL entziehst du alle und gibst nur das Nötige gezielt zurück (--cap-add) — das verkleinert die Angriffsfläche drastisch.

    Baue das Image und starte den Container mit entzogenen Capabilities:

    cd /home/student/secure-app
    docker build -t secure-app .
    docker run -d --name secure-app --cap-drop=ALL secure-app

    Kontrolle: docker inspect --format '{{.HostConfig.CapDrop}}' secure-app enthält ALL.

  4. 4. Read-only-Dateisystem erzwingen

    Begriff: Read-only-Root-Dateisystem. Ein schreibgeschütztes Container-Dateisystem verhindert, dass Malware Programme verändert oder sich einnistet. Wo der Container doch schreiben muss (z. B. /tmp), gibt man gezielt ein flüchtiges tmpfs frei.

    Starte den Container neu mit read-only Dateisystem (vorher den alten entfernen):

    docker rm -f secure-app
    docker run -d --name secure-app --cap-drop=ALL --read-only --tmpfs /tmp secure-app

    Kontrolle: docker inspect --format '{{.HostConfig.ReadonlyRootfs}}' secure-app ergibt true.

  5. 5. Container-Netzwerk isolieren

    Begriff: internes Netzwerk. Ein mit --internal erstelltes Docker-Netzwerk hat keine Verbindung ins Internet. Perfekt für eine Datenbank, die nur vom App-Container, aber nie von außen erreichbar sein soll — Eindämmung (Containment) statt freier Kommunikation.

    Erstelle ein internes Netzwerk:

    docker network create --internal secure-net

    Kontrolle: docker network ls listet secure-net.

  6. 6. Docker-Daemon absichern

    Begriff: Daemon-Härtung. Zwei wichtige Daemon-Optionen: no-new-privileges verhindert, dass Prozesse über SUID nachträglich mehr Rechte erlangen; icc: false verbietet, dass beliebige Container ungefragt miteinander reden (Schutz vor Lateral Movement).

    Ergänze /etc/docker/daemon.json so, dass es zusätzlich enthält:

    {
      "userns-remap": "default",
      "no-new-privileges": true,
      "icc": false
    }

    Danach Docker neu starten:

    sudo systemctl restart docker

    Kontrolle: /etc/docker/daemon.json enthält no-new-privileges (true) und icc (false).

Jetzt selbst üben

Lesen ist gut – selbst machen ist besser. Starte diesen Kurs an einer echten Linux-VM, direkt im Browser. Ein kostenloses Konto genügt.

Kostenlos starten

Lab-Inhalte unter CC BY 4.0 – frei nutzbar mit Namensnennung (© TechLogia).

Docker-Container absichern