Benutzer in Docker

Andrej Kopylov, unser technischer Direktor, liebt es, Docker aktiv zu nutzen und zu propagieren. In seinem neuen Artikel erklärt er, wie man Benutzer in Docker erstellt. Er behandelt die korrekte Handhabung dieser Benutzer, warum es nicht ratsam ist, ihnen root-Rechte zu geben, und wie man das Problem der nicht übereinstimmenden Indikatoren in Dockerfile löst.

Alle Prozesse innerhalb des Containers werden standardmäßig unter dem Benutzer root ausgeführt, es sei denn, es wird speziell anders angegeben. Das scheint sehr praktisch zu sein, da dieser Benutzer keine Einschränkungen hat. Daher ist es aus sicherheitstechnischer Sicht problematisch, unter root zu arbeiten. Während auf einem lokalen Computer keiner im Vollbesitz seiner geistigen Kräfte mit root-Rechten arbeitet, starten viele Prozesse in Containern dennoch unter root.

Es gibt immer Bugs, die es einem Angreifer ermöglichen können, aus dem Container auszubrechen 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 Berechtigungen auf der Host-Maschine hat.

Benutzer erstellen

Die Erstellung eines Benutzers in einem Container unterscheidet sich nicht von der Erstellung in Linux-Distributionen. Allerdings können die Befehle je nach zugrunde liegendem Image 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 node

Für Alpine:

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

Ausführen von Prozessen als Benutzer

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

USER 2000

Um alle folgenden Prozesse als Benutzer node auszuführen, führen Sie Folgendes aus:

USER node

Weitere Informationen finden Sie in Dokumentation..

Mounten von Volumes

Beim Mounten von Volumes in den Container stellen Sie sicher, dass der Benutzer die Möglichkeit hat, Dateien zu lesen und (oder) zu schreiben. Daher müssen die UID (GID) des Benutzers im Container und des Benutzers außerhalb des Containers, der die entsprechenden Zugriffsrechte für die Datei hat, übereinstimmen. Benutzernamen sind dabei irrelevant.

Oft hat der Benutzer auf einem Linux-Computer die UID und GID von 1000. Diese Identifikatoren werden dem ersten Benutzer des Computers zugewiesen.

Es ist einfach, Ihre Identifikatoren zu erfahren:

id

Sie erhalten umfassende Informationen zu Ihrem Benutzer.
Ersetzen Sie 2000 in den Beispielen durch Ihre eigene ID, und alles sollte in Ordnung sein.

Zuweisung von UID und GID an den Benutzer

Wenn der Benutzer bereits erstellt wurde, aber die Identifikatoren geändert werden müssen, kann dies so geschehen:

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

Wenn Sie ein Basis-Image von 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 am Projekt arbeiten, übereinstimmen, genügt es, diese ID im Dockerfile anzugeben. Oft stimmen die Benutzer-IDs jedoch nicht überein.

Wie man das Gewünschte erreicht, ist nicht sofort klar. Für mich war das der schwierigste Teil beim Lernen von Docker. Viele Docker-Nutzer denken nicht daran, dass es verschiedene Lebensphasen des Images gibt. Zuerst wird das Image erstellt, dafür wird das Dockerfile verwendet. Beim Starten des Containers aus dem Image wird das Dockerfile jedoch nicht mehr verwendet.

Die Benutzererstellung sollte beim Erstellen des Images erfolgen. Das gilt auch für die Definition des Benutzers, unter dem die Prozesse gestartet werden. Das bedeutet, dass wir irgendwie die UID (GID) in den Container übergeben müssen.

Für die Verwendung von externen Variablen im Dockerfile gibt es folgende Direktiven: ENV und ARG. Eine detaillierte Vergleich der Direktiven: hier.

Dockerfile

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

So können Argumente über docker-compose weitergegeben werden:

version: '1' services: simplesample-sonar: image: sonarqube:lts ports: - 9001:9000 - 9092:9092 network_mode: bridge

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

P.S. Um alle Feinheiten von Docker zu meistern, reicht es nicht aus, die Dokumentation oder Artikel zu lesen. Man muss viel praktizieren und das Docker-Gefühl erleben.

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster