Benutzer in Docker

Andrej Kopylow, unser CTO, liebt, nutzt und fördert Docker aktiv. In einem neuen Artikel erklärt er, wie man Benutzer in Docker erstellt. Korrekte Arbeit mit ihnen, warum Benutzer nicht mit Root-Rechten belassen werden sollten und wie das Problem nicht übereinstimmender Indikatoren in der Docker-Datei gelöst werden kann.

Alle Prozesse im Container werden als Root-Benutzer ausgeführt, sofern Sie dies nicht ausdrücklich angeben. Dies erscheint sehr praktisch, da dieser Benutzer keine Einschränkungen hat. Deshalb ist es aus Sicherheitsgründen falsch, als Root zu arbeiten. Wenn niemand bei klarem Verstand mit Root-Rechten auf dem lokalen Rechner arbeitet, dann führen viele Prozesse unter Root in Containern aus.

Es gibt immer Fehler, die es Malware 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 dem Host-Computer hat.

Einen Benutzer erstellen

Das Erstellen eines Benutzers in einem Container unterscheidet sich nicht vom Erstellen in Linux-Distributionen. Die Befehle können jedoch für verschiedene Basisimages variieren.

Für Debian-basierte Distributionen müssen Sie der Docker-Datei Folgendes hinzufügen:

RUN groupadd --gid 2000 node 
  && useradd --uid 2000 --gid node --shell /bin/bash --create-home node

Für Alpin:

RUN addgroup -g 2000 node 
    && adduser -u 2000 -G node -s /bin/sh -D node

Ausführen von Prozessen vom Benutzer

Um alle nachfolgenden Prozesse als Benutzer mit UID 2000 auszuführen, führen Sie Folgendes aus:

USER 2000

Um alle nachfolgenden Prozesse als Knotenbenutzer auszuführen, führen Sie Folgendes aus:

USER node

Mehr in Dokumentation.

Volumes einhängen

Geben Sie dem Benutzer beim Mounten von Volumes in einem Container die Möglichkeit, Dateien zu lesen und/oder zu schreiben. Dazu müssen die UID (GID) des Benutzers im Container und des Benutzers außerhalb des Containers, der über die entsprechenden Berechtigungen zum Zugriff auf die Datei verfügt, übereinstimmen. In diesem Fall spielen Benutzernamen keine Rolle.

Auf einem Linux-Computer sind die UID und GID eines Benutzers häufig gleich 1000. Diese Kennungen werden dem ersten Benutzer des Computers zugewiesen.

Es ist ganz einfach, Ihre Kennungen herauszufinden:

id

Sie erhalten umfassende Informationen über Ihren Benutzer.
Ersetzen Sie 2000 aus den Beispielen durch Ihre Kennung und alles wird gut.

Einem Benutzer eine UID und GID zuweisen

Wenn der Benutzer zuvor erstellt wurde, Sie aber die Kennungen ändern müssen, können Sie dies wie folgt tun:

RUN usermod -u 1000 node 
  && groupmod -g 1000 node

Wenn Sie das Alpine-Basisimage verwenden, müssen Sie das Schattenpaket installieren:

RUN apk add —no-cache shadow

Übergabe der Benutzer-ID innerhalb des Containers beim Erstellen des Images

Wenn Ihre ID und die IDs aller Personen, die am Projekt arbeiten, übereinstimmen, dann geben Sie einfach diese ID im Dockerfile an. Allerdings stimmen die Benutzer-IDs häufig nicht überein.

Wie Sie das erreichen, was Sie wollen, ist nicht sofort klar. Für mich war dies das Schwierigste bei der Beherrschung von Docker. Vielen Docker-Benutzern ist nicht bewusst, dass es im Leben eines Images verschiedene Phasen gibt. Zunächst wird das Image mithilfe einer Docker-Datei zusammengestellt. Beim Ausführen eines Containers aus einem Image wird die Docker-Datei nicht mehr verwendet.

Die Benutzererstellung muss beim Erstellen des Images erfolgen. Gleiches gilt für die Bestimmung des Benutzers, unter dem Prozesse gestartet werden. Das bedeutet, dass wir die UID (GID) irgendwie innerhalb des Containers übergeben müssen.

Direktiven werden verwendet, um externe Variablen in der Docker-Datei zu verwenden ENV и ARG. Detaillierter Richtlinienvergleich hier.

Dockerfile

ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node 
  && groupmod -g $GID node

Sie können Argumente über Docker-Compose wie folgt übergeben:

Docker-komponieren

build:
  context: ./src/backend
  args:
    UID: 1000
    GID: 1000

PS Um alle Feinheiten von Docker zu beherrschen, reicht es nicht aus, die Dokumentation oder Artikel zu lesen. Man muss viel üben, man muss ein Gefühl für Docker bekommen.

Source: habr.com

Kommentar hinzufügen