Användare i Docker

Andrey Kopylov, vår CTO, älskar, använder och marknadsför Docker. I en ny artikel förklarar han hur man skapar användare i Docker. Korrekt arbete med dem, varför användare inte bör lämnas med root-rättigheter och hur man löser problemet med felaktiga indikatorer i Dockerfilen.

Alla processer i behållaren kommer att köras som rotanvändare, om du inte anger det på ett speciellt sätt. Detta verkar väldigt bekvämt, eftersom denna användare inte har några begränsningar. Det är därför det är fel att arbeta som root ur säkerhetssynpunkt. Om ingen med sitt fulla sinne arbetar på den lokala datorn med roträttigheter, så kör många processer under root i containrar.

Det finns alltid buggar som gör att skadlig programvara kan fly från behållaren och komma in på värddatorn. Om vi ​​antar det värsta måste vi se till att processer inuti behållaren körs av en användare som inte har några rättigheter på värddatorn.

Skapa en användare

Att skapa en användare i en behållare skiljer sig inte från att skapa den i Linux-distributioner. Kommandona kan dock variera för olika basbilder.

För debianbaserade distributioner måste du lägga till följande i Dockerfilen:

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

För alpint:

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

Köra processer från användaren

För att köra alla efterföljande processer som en användare med UID 2000, kör:

USER 2000

För att köra alla efterföljande processer som nodanvändare, kör:

USER node

Läs mer i dokumentation.

Monteringsvolymer

När du monterar volymer inuti en behållare, ge användaren möjlighet att läsa och/eller skriva filer. För att göra detta måste UID (GID) för användaren i behållaren och användaren utanför behållaren som har lämpliga behörigheter för att komma åt filen matcha. I det här fallet spelar användarnamn ingen roll.

Ofta på en Linux-dator är en användares UID och GID lika med 1000. Dessa identifierare tilldelas den första användaren av datorn.

Det är enkelt att ta reda på dina identifierare:

id

Du kommer att få omfattande information om din användare.
Byt ut 2000 från exemplen med din identifierare så blir allt bra.

Tilldela ett UID och GID till en användare

Om användaren skapades tidigare, men du behöver ändra identifierarna, kan du göra det så här:

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

Om du använder den alpina basbilden måste du installera shadow-paketet:

RUN apk add —no-cache shadow

Skickar användar-ID inuti behållaren när bilden byggs

Om ditt ID och ID:n för alla personer som arbetar med projektet stämmer överens, ange bara detta ID i Dockerfilen. Men ofta stämmer inte användar-ID:n.

Hur man uppnår det man vill är inte direkt klart. För mig var detta det svåraste i processen att bemästra Docker. Många docker-användare inser inte att det finns olika stadier i en bilds liv. Först sätts bilden ihop med en Dockerfile. När du kör en behållare från en bild används dockerfilen inte längre.

Användarskapandet måste ske när bilden byggs. Detsamma gäller för att bestämma den användare under vilken processer startas. Det betyder att vi på något sätt måste skicka UID (GID) inuti behållaren.

Direktiv används för att använda externa variabler i Dockerfilen ENV и ARG. Detaljerad jämförelse av direktiv här.

Dockerfile

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

Du kan skicka argument via docker-compose så här:

docker-compose

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

PS För att bemästra alla krångligheterna med Docker räcker det inte att läsa dokumentationen eller artiklarna. Du behöver öva mycket, du måste få en känsla för Docker.

Källa: will.com

Lägg en kommentar