Docker Fähigkeiten hinzufügen oder entfernen: Anleitung mit Befehlen

DockerDockerBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Docker ist ein leistungsstarkes Werkzeug zur Containerisierung von Anwendungen, und das Verständnis der Verwaltung von Container-Fähigkeiten ist entscheidend für die Optimierung von Sicherheit und Leistung. Dieses Tutorial führt Sie durch den Prozess des Hinzufügens und Entfernens von Fähigkeiten mithilfe von Docker-Befehlen und hilft Ihnen, Ihre Containerumgebung auf spezifische Bedürfnisse zuzuschneiden.

In diesem Lab lernen Sie, was Docker-Fähigkeiten sind, wie sie die Containersicherheit verbessern und wie Sie sie effektiv verwalten können. Am Ende dieses Tutorials werden Sie in der Lage sein, selbstbewusst Fähigkeiten zu Ihren Docker-Containern hinzuzufügen und zu entfernen.

Docker-Fähigkeiten verstehen

Docker-Fähigkeiten sind eine Sicherheitsfunktion, mit der Sie einem Container bestimmte Linux-Kernel-Berechtigungen gewähren oder entziehen können. Bevor wir mit dem Experimentieren mit Fähigkeiten beginnen, wollen wir verstehen, was sie sind und warum sie wichtig sind.

Was sind Docker-Fähigkeiten?

Fähigkeiten in Docker basieren auf dem Capability-System des Linux-Kernels, das die Privilegien, die traditionell mit dem Root-Benutzer verbunden sind, in separate Einheiten aufteilt. Dieser Ansatz ist sicherer als das traditionelle Alles-oder-Nichts-Root-Privilegienmodell.

Standardmäßig werden Docker-Container mit einer begrenzten Anzahl von Fähigkeiten ausgeführt, was ein vernünftiges Gleichgewicht zwischen Funktionalität und Sicherheit bietet. Möglicherweise müssen Sie jedoch je nach Ihren Anwendungsanforderungen Fähigkeiten hinzufügen oder entfernen.

Lassen Sie uns die Standardfähigkeiten eines Docker-Containers untersuchen. Führen Sie den folgenden Befehl aus, um einen Container zu starten und seine Fähigkeiten anzuzeigen:

docker run --rm -it ubuntu:22.04 capsh --print

Sie sollten eine ähnliche Ausgabe wie diese sehen:

Current: cap_chown,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
Bounding set =cap_chown,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
Ambient set =
Current IAB: cap_chown,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
Securebits: 00/0x0/1'b0
 secure-noroot: no (unlocked)
 secure-no-suid-fixup: no (unlocked)
 secure-keep-caps: no (unlocked)
 secure-no-ambient-raise: no (unlocked)
uid=0(root) gid=0(root) groups=0(root)

Diese Ausgabe zeigt die Fähigkeiten, die dem Container standardmäßig gewährt werden. Diese Fähigkeiten steuern, was der Container innerhalb des Systems tun kann.

Warum Fähigkeiten wichtig sind

Die ordnungsgemäße Verwaltung von Docker-Fähigkeiten ist entscheidend für:

  1. Erhöhte Sicherheit: Durch die Einschränkung der Fähigkeiten reduzieren Sie den potenziellen Schaden, wenn ein Container kompromittiert wird.
  2. Feingranulare Kontrolle: Sie können bestimmte privilegierte Operationen zulassen, ohne vollen Root-Zugriff zu gewähren.
  3. Prinzip der geringsten Privilegien (Principle of Least Privilege): Container sollten nur die Fähigkeiten haben, die sie zum ordnungsgemäßen Funktionieren benötigen.

Als Nächstes wollen wir untersuchen, wie man Docker-Containern Fähigkeiten hinzufügt.

Hinzufügen von Fähigkeiten zu Docker-Containern

In diesem Schritt lernen wir, wie man einem Docker-Container mithilfe des Flags --cap-add bestimmte Fähigkeiten hinzufügt. Dies ist nützlich, wenn Ihre Anwendung bestimmte Privilegien benötigt, die nicht im Standardsatz enthalten sind.

Grundlegende Syntax zum Hinzufügen von Fähigkeiten

Die grundlegende Syntax zum Hinzufügen einer Fähigkeit zu einem Docker-Container lautet:

docker run --cap-add=<CAPABILITY> <IMAGE> <COMMAND>

Versuchen wir, die Fähigkeit NET_ADMIN hinzuzufügen, die dem Container erlaubt, verschiedene netzwerkbezogene Operationen durchzuführen:

docker run --rm -it --cap-add=NET_ADMIN ubuntu:22.04 capsh --print

Die Ausgabe zeigt, dass die Fähigkeit NET_ADMIN zum Container hinzugefügt wurde:

Current: cap_chown,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,cap_net_admin=ep

Beachten Sie die Hinzufügung von cap_net_admin am Ende der Fähigkeitenliste.

Hinzufügen mehrerer Fähigkeiten

Oft müssen Sie einem Container mehrere Fähigkeiten hinzufügen. Dies können Sie tun, indem Sie das Flag --cap-add mehrmals angeben:

docker run --rm -it --cap-add=NET_ADMIN --cap-add=SYS_TIME ubuntu:22.04 capsh --print

Dieser Befehl fügt dem Container sowohl die Fähigkeiten NET_ADMIN als auch SYS_TIME hinzu. Die Fähigkeit SYS_TIME erlaubt dem Container, die Systemuhr zu ändern.

Praktisches Beispiel: Ändern von Netzwerkschnittstellen

Um eine praktische Anwendung von Fähigkeiten zu demonstrieren, erstellen wir einen Container mit der Fähigkeit NET_ADMIN und versuchen, die Einstellungen der Netzwerkschnittstelle zu ändern:

docker run --rm -it --cap-add=NET_ADMIN ubuntu:22.04 /bin/bash

Sie befinden sich jetzt im Container mit einer Bash-Shell. Installieren wir das Paket iproute2, um mit Netzwerkschnittstellen zu arbeiten:

apt-get update && apt-get install -y iproute2

Versuchen Sie nun, eine Dummy-Netzwerkschnittstelle zu erstellen:

ip link add dummy0 type dummy
ip link show dummy0

Sie sollten eine Ausgabe sehen, die die neu erstellte Dummy-Netzwerkschnittstelle zeigt:

6: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 2a:d5:cd:70:91:f4 brd ff:ff:ff:ff:ff:ff

Dieser Vorgang würde ohne die Fähigkeit NET_ADMIN fehlschlagen. Sie können den Container verlassen, indem Sie exit eingeben.

Anzeigen von Container-Fähigkeiten

Um die Fähigkeiten eines laufenden Containers zu überprüfen, können Sie den Befehl docker inspect verwenden. Starten wir zuerst einen Container mit hinzugefügten Fähigkeiten im Detached-Modus:

docker run -d --name cap-test --cap-add=NET_ADMIN ubuntu:22.04 sleep 3600

Überprüfen Sie nun den Container, um seine Fähigkeiten anzuzeigen:

docker inspect cap-test | grep -A 20 CapAdd

Die Ausgabe zeigt, dass die Fähigkeit NET_ADMIN hinzugefügt wurde:

            "CapAdd": [
                "NET_ADMIN"
            ],

Denken Sie daran, nach diesem Schritt aufzuräumen:

docker stop cap-test
docker rm cap-test

Das Verständnis, wie man Docker-Containern Fähigkeiten hinzufügt, gibt Ihnen mehr Kontrolle darüber, was Ihre Container tun können, während Sie gleichzeitig die Sicherheit gewährleisten.

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.

Kombination von Fähigkeitsmanagement mit Sicherheitsbest Practices

In diesem letzten Schritt werden wir untersuchen, wie man das Docker-Fähigkeitsmanagement mit anderen Sicherheitsbest Practices kombiniert, um sichere Container mit minimalen Privilegien zu erstellen.

Erstellen eines Containers mit benutzerdefiniertem Fähigkeitsprofil

Erstellen wir ein komplexeres Beispiel, das das Fähigkeitsmanagement mit anderen Sicherheitsmerkmalen kombiniert:

docker run -d --name secure-container \
  --cap-drop=ALL \
  --cap-add=NET_BIND_SERVICE \
  --read-only \
  --tmpfs /tmp \
  ubuntu:22.04 sleep 3600

Dieser Befehl:

  • Entfernt alle Fähigkeiten
  • Fügt nur die Fähigkeit NET_BIND_SERVICE hinzu
  • Macht das Container-Dateisystem schreibgeschützt
  • Erstellt ein temporäres Dateisystem unter /tmp für Schreibvorgänge

Untersuchen wir diesen Container, um seine Konfiguration zu sehen:

docker inspect secure-container | grep -A 5 CapAdd
docker inspect secure-container | grep -A 5 CapDrop
docker inspect secure-container | grep ReadonlyRootfs

Sie sollten eine Ausgabe sehen, die diese Sicherheitseinstellungen bestätigt:

            "CapAdd": [
                "NET_BIND_SERVICE"
            ],
            "CapDrop": [
                "ALL"
            ],
"ReadonlyRootfs": true,

Testen der Einschränkungen

Verbinden wir uns mit unserem sicheren Container und testen wir die Einschränkungen:

docker exec -it secure-container /bin/bash

Versuchen Sie im Container, eine Systemdatei zu ändern:

echo "test" > /etc/test

Sie sollten einen Fehler sehen, da das Dateisystem schreibgeschützt ist:

bash: /etc/test: Read-only file system

Versuchen Sie nun, in das Verzeichnis /tmp zu schreiben:

echo "test" > /tmp/test
cat /tmp/test

Dies sollte funktionieren, da wir ein beschreibbares tmpfs unter /tmp gemountet haben:

test

Verlassen Sie den Container, indem Sie exit eingeben.

Verwenden von Fähigkeiten mit Nicht-Root-Benutzern

Für zusätzliche Sicherheit können Sie Container als Nicht-Root-Benutzer ausführen und gleichzeitig Fähigkeiten verwalten. Erstellen wir zunächst einen neuen Container, der einen Nicht-Root-Benutzer mit bestimmten Fähigkeiten kombiniert:

docker run -d --name nonroot-container \
  --cap-drop=ALL \
  --cap-add=NET_BIND_SERVICE \
  --user 1000:1000 \
  ubuntu:22.04 sleep 3600

Beachten Sie, dass Linux-Fähigkeiten standardmäßig nur auf Prozesse angewendet werden, die als Root ausgeführt werden, auch wenn wir die Fähigkeit NET_BIND_SERVICE hinzugefügt haben und als Nicht-Root-Benutzer arbeiten. Um Nicht-Root-Benutzern die Verwendung von Fähigkeiten zu ermöglichen, sind zusätzliche Konfigurationen wie setuid-Binärdateien oder Ambient-Fähigkeiten erforderlich.

Fähigkeiten in docker-compose

Wenn Sie docker-compose zur Verwaltung mehrerer Container verwenden, können Sie Fähigkeiten in Ihrer Datei docker-compose.yml angeben:

version: "3"
services:
  webapp:
    image: ubuntu:22.04
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE
    read_only: true
    tmpfs:
      - /tmp

Dies bietet eine konsistente Möglichkeit, Fähigkeiten über Ihre Container-Bereitstellungen hinweg zu verwalten.

Aufräumen

Räumen wir die Container auf, die wir erstellt haben:

docker stop secure-container nonroot-container
docker rm secure-container nonroot-container

Zusammenfassung der Best Practices

Hier sind einige Best Practices für die Verwaltung von Docker-Fähigkeiten:

  1. Entfernen Sie alle Fähigkeiten und fügen Sie nur das hinzu, was Sie benötigen
  2. Kombinieren Sie das Fähigkeitsmanagement mit anderen Sicherheitsmerkmalen:
    • Schreibgeschütztes Dateisystem
    • Nicht-Root-Benutzer
    • Seccomp-Profile
    • AppArmor oder SELinux
  3. Überprüfen Sie regelmäßig die Container-Fähigkeiten
  4. Halten Sie Docker und Container-Images auf dem neuesten Stand
  5. Verwenden Sie Tools zum Scannen von Container-Schwachstellen

Durch die Befolgung dieser Praktiken können Sie die Sicherheit Ihrer Docker-Container erheblich verbessern.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie Docker-Container-Fähigkeiten effektiv verwalten können, um die Sicherheit und Funktionalität zu verbessern. Hier ist eine Zusammenfassung dessen, was Sie erreicht haben:

  1. Sie haben verstanden, was Docker-Fähigkeiten sind und warum sie für die Containersicherheit wichtig sind.
  2. Sie haben gelernt, wie man Container mit dem Flag --cap-add Fähigkeiten hinzufügt, wodurch Container bestimmte privilegierte Operationen ausführen können.
  3. Sie haben das Entfernen von Fähigkeiten mit dem Flag --cap-drop geübt und das Prinzip der geringsten Privilegien (Principle of Least Privilege) implementiert.
  4. Sie haben Best Practices für die Kombination von Fähigkeitsmanagement mit anderen Sicherheitsmerkmalen zur Erstellung sicherer Containerumgebungen kennengelernt.

Durch die Anwendung dieser Techniken können Sie Container erstellen, die genau die Berechtigungen haben, die sie benötigen, nicht mehr und nicht weniger. Dieser Ansatz reduziert die potenzielle Angriffsfläche Ihrer containerisierten Anwendungen erheblich und stellt gleichzeitig sicher, dass sie die notwendige Funktionalität für den korrekten Betrieb haben.

Erforschen Sie weiterhin die Docker-Sicherheitsmerkmale und denken Sie daran, Ihre Containerkonfigurationen regelmäßig zu überprüfen und zu aktualisieren, um eine starke Sicherheitslage in Ihren containerisierten Umgebungen aufrechtzuerhalten.