Entfernen von Fähigkeiten aus Docker-Containern
In diesem Schritt lernen wir, wie man mithilfe des Flags --cap-drop
Fähigkeiten aus Docker-Containern entfernt. Dies ist eine wichtige Sicherheitspraxis, die dem Prinzip der geringsten Privilegien (Principle of Least Privilege) folgt – Container sollten nur die Fähigkeiten haben, die sie unbedingt benötigen.
Grundlegende Syntax zum Entfernen von Fähigkeiten
Die grundlegende Syntax zum Entfernen einer Fähigkeit aus einem Docker-Container lautet:
docker run --cap-drop=<CAPABILITY> <IMAGE> <COMMAND>
Versuchen wir, die Fähigkeit CHOWN
zu entfernen, die das Ändern des Dateieigentums erlaubt:
docker run --rm -it --cap-drop=CHOWN ubuntu:22.04 capsh --print
In der Ausgabe werden Sie feststellen, dass cap_chown
nicht mehr unter den Fähigkeiten aufgeführt ist:
Current: cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep
Entfernen mehrerer Fähigkeiten
Sie können mehrere Fähigkeiten entfernen, indem Sie das Flag --cap-drop
mehrmals angeben:
docker run --rm -it --cap-drop=CHOWN --cap-drop=NET_RAW ubuntu:22.04 capsh --print
Dieser Befehl entfernt sowohl die Fähigkeiten CHOWN
als auch NET_RAW
aus dem Container.
Praktisches Beispiel: Testen von Fähigkeitsbeschränkungen
Erstellen wir einen Container, bei dem die Fähigkeit CHOWN
entfernt wurde, und versuchen wir, das Dateieigentum zu ändern:
docker run --rm -it --cap-drop=CHOWN ubuntu:22.04 /bin/bash
Erstellen wir innerhalb des Containers eine Testdatei und versuchen wir, ihr Eigentum zu ändern:
touch test_file
ls -l test_file
chown nobody:nogroup test_file
Sie sollten eine Fehlermeldung sehen, die darauf hinweist, dass der Vorgang nicht erlaubt ist:
chown: changing ownership of 'test_file': Operation not permitted
Dies zeigt, dass das Entfernen der Fähigkeit CHOWN
verhindert, dass der Container das Dateieigentum ändert, obwohl der Container als Root ausgeführt wird. Geben Sie exit
ein, um den Container zu verlassen.
Verwenden von --cap-add und --cap-drop
Sie können sowohl die Flags --cap-add
als auch --cap-drop
im selben Befehl verwenden, um die Fähigkeiten Ihres Containers präzise zu steuern:
docker run --rm -it --cap-add=NET_ADMIN --cap-drop=CHOWN ubuntu:22.04 capsh --print
Dieser Befehl fügt die Fähigkeit NET_ADMIN
hinzu und entfernt gleichzeitig die Fähigkeit CHOWN
.
Entfernen aller Fähigkeiten und Hinzufügen bestimmter Fähigkeiten
Für maximale Sicherheit können Sie alle Fähigkeiten entfernen und dann nur die spezifischen hinzufügen, die Ihre Anwendung benötigt:
docker run --rm -it --cap-drop=ALL --cap-add=NET_BIND_SERVICE ubuntu:22.04 capsh --print
Dieser Befehl erstellt einen Container nur mit der Fähigkeit NET_BIND_SERVICE
, die das Binden an privilegierte Ports (unter 1024) ermöglicht.
Testen eines Containers mit allen entfernten Fähigkeiten
Erstellen wir einen Container, bei dem alle Fähigkeiten entfernt wurden, und beobachten wir die Einschränkungen:
docker run -d --name no-caps --cap-drop=ALL ubuntu:22.04 sleep 3600
Lassen Sie uns nun eine Verbindung zum Container herstellen und versuchen, verschiedene Operationen durchzuführen:
docker exec -it no-caps /bin/bash
Versuchen Sie innerhalb des Containers, einen externen Host anzupingen:
apt-get update && apt-get install -y iputils-ping
ping -c 1 google.com
Sie werden wahrscheinlich eine Fehlermeldung sehen, da der Container nicht über die notwendigen Fähigkeiten verfügt, um Raw-Netzwerk-Sockets zu erstellen, die für Ping erforderlich sind.
Verlassen Sie den Container, indem Sie exit
eingeben, und räumen Sie dann auf:
docker stop no-caps
docker rm no-caps
Indem Sie verstehen, wie man Fähigkeiten aus Docker-Containern entfernt, können Sie die Sicherheit Ihrer containerisierten Anwendungen erheblich verbessern, indem Sie streng einschränken, was jeder Container tun kann.