Einführung
Docker ist eine leistungsstarke Containerisierungspaltform, die die Art und Weise, wie Anwendungen entwickelt, deployed und verwaltet werden, revolutioniert hat. Allerdings kann das Ausführen von Docker-Containern als Root-Benutzer Sicherheitsrisiken darstellen. In diesem Tutorial werden Sie durch den Prozess geführt, wie Sie nicht-root-Benutzern in Docker feingranulierte Berechtigungen erteilen, damit sie bestimmte Aufgaben ausführen können, ohne die Gesamt-Sicherheit des Systems zu gefährden.
Grundlegendes zu Docker-Benutzerberechtigungen
Docker-Container sind standardmäßig so konzipiert, dass sie als nicht privilegierte Benutzer ausgeführt werden. Dies trägt dazu bei, die Gesamt-Sicherheit des Systems zu verbessern. Es kann jedoch Situationen geben, in denen Sie nicht-root-Benutzern innerhalb eines Docker-Containers feingranulierte Berechtigungen erteilen müssen, um bestimmte Aufgaben auszuführen.
Standard-Benutzerberechtigungen in Docker
Standardmäßig werden Docker-Container als root-Benutzer ausgeführt, der die höchste Berechtigungsstufe innerhalb des Containers hat. Dies kann ein Sicherheitsrisiko darstellen, da alle Schwachstellen oder bösartigen Aktivitäten innerhalb des Containers möglicherweise das Host-System beeinträchtigen könnten.
Um dieses Risiko zu mindern, empfiehlt Docker, Container als nicht-root-Benutzer auszuführen. Sie können dies erreichen, indem Sie einen Benutzer in der Dockerfile angeben oder den --user-Parameter beim Ausführen eines Containers verwenden.
## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
USER myuser
## Run container as non-root user
docker run -it --user myuser ubuntu:22.04 bash
Grundlegendes zu Benutzer-Namespaces
Docker verwendet Benutzer-Namespaces (Benutzer-Namensräume), um eine zusätzliche Isolations- und Sicherheitsstufe für nicht-root-Benutzer innerhalb eines Containers bereitzustellen. Benutzer-Namespaces ermöglichen es Ihnen, Benutzer- und Gruppen-IDs aus dem Container auf verschiedene IDs auf dem Host-System abzubilden, wodurch effektiv ein separater Benutzerraum für den Container geschaffen wird.
graph TD
A[Host System] --> B[Container]
B[Container] --> C[Mapped User ID]
B[Container] --> D[Mapped Group ID]
Diese Abbildung stellt sicher, dass selbst wenn ein nicht-root-Benutzer innerhalb des Containers hohe Berechtigungen hat, er das Host-System oder andere Container auf demselben Host nicht beeinträchtigen kann.
Überprüfen der Benutzerberechtigungen
Sie können den id-Befehl innerhalb des Containers verwenden, um die Benutzer- und Gruppen-IDs zu überprüfen, auf die der aktuelle Benutzer abgebildet wurde:
$ id
uid=1000(myuser) gid=1000(myuser) groups=1000(myuser),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lxd),128(systemd-journal),129(systemd-journal-gateway)
Diese Ausgabe zeigt, dass der Benutzer myuser innerhalb des Containers auf eine Benutzer-ID von 1000 und eine Gruppen-ID von 1000 abgebildet wurde.
Zuweisen feingranulierter Berechtigungen an nicht-root-Benutzer
Während das Ausführen von Containern als nicht-root-Benutzer eine gute Sicherheitsmaßnahme ist, kann es Fälle geben, in denen Sie diesen Benutzern bestimmte Berechtigungen erteilen müssen, um bestimmte Aufgaben auszuführen. Docker bietet mehrere Möglichkeiten, feingranulierte Berechtigungen an nicht-root-Benutzer innerhalb eines Containers zuzuweisen.
Verwenden der Flags --cap-add und --cap-drop
Docker unterstützt die Verwendung von Linux-Capabilities (Linux-Fähigkeiten), die es Ihnen ermöglichen, bestimmten Benutzern oder Prozessen spezifische Berechtigungen zu erteilen oder zu entziehen. Sie können die Flags --cap-add und --cap-drop beim Ausführen eines Containers verwenden, um Capabilities für den nicht-root-Benutzer hinzuzufügen oder zu entfernen.
## Grant the "CAP_SYS_ADMIN" capability to the non-root user
docker run -it --user myuser --cap-add=SYS_ADMIN ubuntu:22.04 bash
## Remove the "CAP_CHOWN" capability from the non-root user
docker run -it --user myuser --cap-drop=CHOWN ubuntu:22.04 bash
Einbinden von Volumes mit spezifischen Berechtigungen
Sie können auch feingranulierte Berechtigungen an nicht-root-Benutzer erteilen, indem Sie Volumes mit spezifischem Besitz und spezifischen Berechtigungen einbinden. Dies ermöglicht es Ihnen, die Zugriffsrechte des nicht-root-Benutzers innerhalb des Containers zu steuern.
## Mount a volume with specific permissions
docker run -it --user myuser -v /path/on/host:/path/in/container:rw,uid=1000,gid=1000 ubuntu:22.04 bash
In diesem Beispiel ist das eingebundene Volume für den nicht-root-Benutzer mit der Benutzer-ID 1000 und der Gruppen-ID 1000 zugänglich.
Verwenden des Flags --group-add
Wenn der nicht-root-Benutzer Aufgaben ausführen muss, die die Mitgliedschaft in bestimmten Gruppen erfordern, können Sie das Flag --group-add verwenden, um den Benutzer zusätzlichen Gruppen innerhalb des Containers hinzuzufügen.
## Add the non-root user to the "docker" group
docker run -it --user myuser --group-add docker ubuntu:22.04 bash
Dadurch kann der nicht-root-Benutzer Aufgaben ausführen, die die Mitgliedschaft in der Gruppe "docker" erfordern, wie beispielsweise die Interaktion mit dem Docker-Daemon.
Anpassen der Dockerfile
Sie können auch die Dockerfile anpassen, um einen nicht-root-Benutzer mit spezifischen Berechtigungen und Gruppenmitgliedschaften zu erstellen. Dies stellt sicher, dass der nicht-root-Benutzer die erforderlichen Berechtigungen hat, um seine Aufgaben innerhalb des Containers auszuführen.
## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN usermod -aG docker myuser
USER myuser
Diese Dockerfile erstellt einen nicht-root-Benutzer namens myuser und fügt ihn der Gruppe "docker" hinzu, sodass er mit dem Docker-Daemon interagieren kann.
Praktische Anwendungsfälle und Beispiele
Das Zuweisen feingranulierter Berechtigungen an nicht-root-Benutzer in Docker kann in einer Vielzahl von Szenarien von Vorteil sein. Hier sind einige praktische Anwendungsfälle und Beispiele:
Szenario 1: Ausführen eines Webservers
Angenommen, Sie haben eine Webanwendung, die in einem Docker-Container läuft, und Sie möchten, dass der nicht-root-Benutzer die erforderlichen Berechtigungen hat, um den Webserver-Prozess zu starten und zu verwalten.
## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN apt-get update && apt-get install -y nginx
RUN chown -R myuser:myuser /var/www/html
USER myuser
CMD ["nginx", "-g", "daemon off;"]
In diesem Beispiel erhält der nicht-root-Benutzer myuser die Eigentümerschaft des Verzeichnisses /var/www/html, das der Standardort für den Nginx-Webserver ist. Dies ermöglicht es dem nicht-root-Benutzer, den Nginx-Prozess innerhalb des Containers zu starten und zu verwalten.
Szenario 2: Zugriff auf sensible Dateien
Wenn Ihr Container auf sensible Dateien oder Verzeichnisse zugreifen muss, können Sie dem nicht-root-Benutzer die erforderlichen Berechtigungen erteilen, um auf diese Speicherorte zu lesen oder zu schreiben.
## Run container with specific volume permissions
docker run -it --user myuser -v /path/to/sensitive/files:/sensitive:rw,uid=1000,gid=1000 ubuntu:22.04 bash
In diesem Beispiel erhält der nicht-root-Benutzer mit der Benutzer-ID 1000 und der Gruppen-ID 1000 Lese- und Schreibzugriff auf das Verzeichnis /path/to/sensitive/files innerhalb des Containers.
Szenario 3: Interaktion mit dem Docker-Daemon
Wenn Ihr nicht-root-Benutzer mit dem Docker-Daemon interagieren muss, können Sie ihn der Gruppe "docker" innerhalb des Containers hinzufügen.
## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN usermod -aG docker myuser
USER myuser
Diese Dockerfile erstellt einen nicht-root-Benutzer namens myuser und fügt ihn der Gruppe "docker" hinzu, sodass er Docker-bezogene Aufgaben wie das Erstellen und Verwalten von Containern ausführen kann.
Szenario 4: Ausführen privilegierter Befehle
In einigen Fällen muss Ihr nicht-root-Benutzer möglicherweise privilegierte Befehle ausführen, die bestimmte Capabilities (Fähigkeiten) erfordern. Sie können das Flag --cap-add verwenden, um dem nicht-root-Benutzer die erforderlichen Capabilities zu erteilen.
## Run container with specific capability
docker run -it --user myuser --cap-add=SYS_ADMIN ubuntu:22.04 bash
In diesem Beispiel erhält der nicht-root-Benutzer die "CAP_SYS_ADMIN"-Capability, die es ihm ermöglicht, Systemadministrationstasks auszuführen, die erhöhte Berechtigungen erfordern.
Durch das Verständnis dieser praktischen Anwendungsfälle und Beispiele können Sie effektiv feingranulierte Berechtigungen an nicht-root-Benutzer in Docker zuweisen und sicherstellen, dass sie den erforderlichen Zugriff haben, um ihre Aufgaben auszuführen, während gleichzeitig eine sichere und isolierte Umgebung aufrechterhalten wird.
Zusammenfassung
In diesem umfassenden Docker-Tutorial erfahren Sie, wie Sie feingranulierte Berechtigungen an nicht-root-Benutzer zuweisen können, damit sie mit Docker-Containern und -Ressourcen interagieren können, ohne ihre Berechtigungen zu erhöhen. Indem Sie die Prinzipien der Benutzerberechtigungen in Docker verstehen und praktische Anwendungsfälle erkunden, können Sie eine sicherere und effizientere Docker-Umgebung implementieren, die auf die Bedürfnisse Ihres Unternehmens zugeschnitten ist.



