, unser technischer Direktor, liebt es, Docker aktiv zu nutzen und zu propagieren. In seinem neuen Artikel beschreibt er, wie man Benutzer in Docker erstellt. Die richtige Handhabung dieser, warum man Benutzer nicht mit Root-Rechten belassen sollte und wie man das Problem mit den Inkonsistenzen von Indikatoren in Dockerfiles löst.
Alle Prozesse im Container laufen unter dem Benutzer root, wenn man ihn nicht auf besondere Weise angibt. Das erscheint sehr praktisch, da dieser Benutzer keine Einschränkungen hat. Gerade deshalb ist es aus Sicherheitssicht falsch, unter Root zu arbeiten. Wenn niemand auf dem lokalen Computer einen klaren Verstand hat, um mit Root-Rechten zu arbeiten, starten viele Prozesse unter Root in Containern.
Es gibt immer Bugs, die es einem Angreifer ermöglichen, aus dem Container zu entkommen und auf den Host-Computer zu gelangen. Im schlimmsten Fall müssen wir sicherstellen, dass Prozesse innerhalb des Containers von einem Benutzer ausgeführt werden, der keine Rechte auf der Host-Maschine hat.
Benutzer erstellen
Die Erstellung eines Benutzers im Container unterscheidet sich nicht von der Erstellung in Linux-Distributionen. Allerdings können die Befehle für verschiedene Basis-Images variieren.
Für Debian-basierte Distributionen muss im Dockerfile Folgendes hinzugefügt werden:
RUN groupadd --gid 2000 node
&& useradd --uid 2000 --gid node --shell /bin/bash --create-home nodeFür Alpine:
RUN addgroup -g 2000 node
&& adduser -u 2000 -G node -s /bin/sh -D node
Prozesse unter einem Benutzer ausführen
Um alle folgenden Prozesse unter dem Benutzer mit UID 2000 auszuführen, führen Sie Folgendes aus:
USER 2000Um alle folgenden Prozesse unter dem Benutzer node auszuführen, führen Sie Folgendes aus:
USER nodeMehr Informationen in .
Volumes einbinden
Beim Einbinden von Volumes in den Container stellen Sie sicher, dass der Benutzer die Möglichkeit hat, Dateien zu lesen und/oder zu schreiben. Dafür müssen UID (GID) des Benutzers im Container und des Benutzers außerhalb des Containers, der entsprechende Zugriffsrechte auf die Datei hat, übereinstimmen. Dabei spielen die Benutzernamen keine Rolle.
Oft haben Benutzer auf einem Linux-Computer UID und GID gleich 1000. Diese Identifikatoren werden dem ersten Benutzer des Computers zugewiesen.
So finden Sie Ihre Identifikatoren heraus:
idSie erhalten umfassende Informationen über Ihren Benutzer.
Ersetzen Sie die 2000 in den Beispielen durch Ihre Identifikator und alles wird in Ordnung sein.
Benutzer UID und GID zuweisen
Wenn der Benutzer bereits erstellt wurde, aber die Identifikatoren geändert werden müssen, kann dies so durchgeführt werden:
RUN usermod -u 1000 node
&& groupmod -g 1000 node
Wenn Sie das Basis-Image alpine verwenden, müssen Sie das Paket shadow installieren:
RUN apk add --no-cache shadowÜbertragung der Benutzer-ID in den Container beim Erstellen des Images
Wenn Ihre ID und die IDs aller Personen, die an dem Projekt arbeiten, übereinstimmen, reicht es aus, diese ID im Dockerfile anzugeben. Allerdings stimmen die Benutzer-IDs häufig nicht überein.
Wie das Gewünschte erreicht werden kann, ist nicht sofort klar. Für mich war das der schwierigste Teil beim Erlernen von Docker. Viele Docker-Benutzer denken nicht daran, dass es verschiedene Phasen im Lebenszyklus eines Images gibt. Zuerst wird das Image erstellt, dazu wird das Dockerfile verwendet. Beim Starten des Containers aus dem Image wird das Dockerfile nicht mehr verwendet.
Die Erstellung von Benutzern sollte beim Erstellen des Images erfolgen. Dasselbe gilt für die Festlegung des Benutzers, unter dem die Prozesse ausgeführt werden. Das bedeutet, dass wir irgendwie die UID (GID) in den Container übertragen müssen.
Für die Verwendung externer Variablen im Dockerfile dienen die Direktiven und . Detaillierter Vergleich der Direktiven .
Dockerfile
ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node
&& groupmod -g $GID node
Argumente können folgendermaßen über docker-compose übergeben werden:
docker-compose
build:
context: ./src/backend
args:
UID: 1000
GID: 1000
P.S. Um alle Feinheiten von Docker zu beherrschen, ist es nicht genug, die Dokumentation oder Artikel zu lesen. Man muss viel üben und ein Gefühl für Docker bekommen.
Quelle: habr.com
