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.
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
rootim 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. User-Namespace-Remapping aktivieren
Begriff: User-Namespace-Remapping. Bricht ein Angreifer aus einem Container aus, der als
rootläuft, ist er auch auf dem Host root — Totalschaden. Remapping bildet das Container-rootauf 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 dockerBei einem Tippfehler startet Docker nicht — prüfe dann mit
sudo journalctl -u docker -n 30.Kontrolle:
/etc/docker/daemon.jsonenthältuserns-remap, undsystemctl is-active dockermeldetactive.2. Container ohne Root starten
Begriff:
USER-Direktive. Container laufen standardmäßig alsroot— das gefährlichste Docker-Default. Mit derUSER-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 appuserist der entscheidende Teil — der Wert darf nichtrootoder0sein.Kontrolle:
/home/student/secure-app/Dockerfileenthält eineUSER-Direktive.3. Unnötige Capabilities entfernen
Begriff: Capabilities.
rootist in viele Capabilities unterteilt (z. B.NET_ADMIN,SYS_TIME). Die meisten Container brauchen keine davon. Mit--cap-drop=ALLentziehst 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-appKontrolle:
docker inspect --format '{{.HostConfig.CapDrop}}' secure-appenthältALL.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-appKontrolle:
docker inspect --format '{{.HostConfig.ReadonlyRootfs}}' secure-appergibttrue.5. Container-Netzwerk isolieren
Begriff: internes Netzwerk. Ein mit
--internalerstelltes 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-netKontrolle:
docker network lslistetsecure-net.6. Docker-Daemon absichern
Begriff: Daemon-Härtung. Zwei wichtige Daemon-Optionen:
no-new-privilegesverhindert, dass Prozesse über SUID nachträglich mehr Rechte erlangen;icc: falseverbietet, dass beliebige Container ungefragt miteinander reden (Schutz vor Lateral Movement).Ergänze
/etc/docker/daemon.jsonso, dass es zusätzlich enthält:{ "userns-remap": "default", "no-new-privileges": true, "icc": false }Danach Docker neu starten:
sudo systemctl restart dockerKontrolle:
/etc/docker/daemon.jsonenthältno-new-privileges(true) undicc(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 startenLab-Inhalte unter CC BY 4.0 – frei nutzbar mit Namensnennung (© TechLogia).
