Wie man feingranulierte Berechtigungen an nicht-root-Benutzer in Docker erteilt

DockerDockerBeginner
Jetzt üben

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

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.