Alle prosesser i beholderen vil kjøre som root-bruker, med mindre du spesifiserer det på en spesiell måte. Dette virker veldig praktisk, fordi denne brukeren ikke har noen begrensninger. Dette er grunnen til at det er feil å jobbe som root fra et sikkerhetssynspunkt. Hvis ingen ved sitt rette sinn jobber på den lokale datamaskinen med root-rettigheter, kjører mange prosesser under root i containere.
Det er alltid feil som vil tillate skadelig programvare å unnslippe fra beholderen og komme inn på vertsdatamaskinen. Forutsatt det verste, må vi sørge for at prosesser inne i containeren kjøres av en bruker som ikke har noen rettigheter på vertsmaskinen.
Opprette en bruker
Å opprette en bruker i en beholder er ikke forskjellig fra å lage den i Linux-distribusjoner. Kommandoene kan imidlertid variere for forskjellige basisbilder.
For debianbaserte distribusjoner må du legge til følgende i Dockerfilen:
RUN groupadd --gid 2000 node
&& useradd --uid 2000 --gid node --shell /bin/bash --create-home node
For alpint:
RUN addgroup -g 2000 node
&& adduser -u 2000 -G node -s /bin/sh -D node
Kjøre prosesser fra brukeren
For å kjøre alle påfølgende prosesser som en bruker med UID 2000, kjør:
USER 2000
For å kjøre alle påfølgende prosesser som nodebruker, kjør:
USER node
Mer i
Monteringsvolum
Når du monterer volumer inne i en beholder, gi brukeren muligheten til å lese og/eller skrive filer. For å gjøre dette, må UID (GID) til brukeren i beholderen og brukeren utenfor beholderen som har de nødvendige tillatelsene til å få tilgang til filen samsvare. I dette tilfellet spiller ikke brukernavn noen rolle.
Ofte på en Linux-datamaskin er en brukers UID og GID lik 1000. Disse identifikatorene tildeles den første brukeren av datamaskinen.
Det er enkelt å finne ut identifikatorene dine:
id
Du vil motta omfattende informasjon om brukeren din.
Bytt ut 2000 fra eksemplene med identifikatoren din, og alt vil være i orden.
Tilordne en UID og GID til en bruker
Hvis brukeren ble opprettet tidligere, men du må endre identifikatorene, kan du gjøre det slik:
RUN usermod -u 1000 node
&& groupmod -g 1000 node
Hvis du bruker det alpine basisbildet, må du installere skyggepakken:
RUN apk add —no-cache shadow
Sende bruker-ID-en inne i beholderen når bildet bygges
Hvis ID-en din og ID-ene til alle personene som jobber med prosjektet samsvarer, spesifiser bare denne ID-en i Dockerfilen. Imidlertid stemmer ofte ikke bruker-ID-ene.
Hvordan du oppnår det du ønsker er ikke umiddelbart klart. For meg var dette det vanskeligste i prosessen med å mestre Docker. Mange docker-brukere innser ikke at det er forskjellige stadier i livet til et bilde. Først settes bildet sammen ved hjelp av en Dockerfile. Når du kjører en container fra et bilde, brukes ikke lenger Dockerfilen.
Brukeroppretting må skje når bildet bygges. Det samme gjelder for å bestemme brukeren som prosesser startes under. Dette betyr at vi på en eller annen måte må sende UID (GID) inne i containeren.
Direktiver brukes til å bruke eksterne variabler i Dockerfilen
Dockerfile
ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node
&& groupmod -g $GID node
Du kan sende argumenter via docker-compose slik:
Docker-komponere
build:
context: ./src/backend
args:
UID: 1000
GID: 1000
PS For å mestre alle forviklingene til Docker, er det ikke nok å lese dokumentasjonen eller artiklene. Du må øve mye, du må få en følelse av Docker.
Kilde: www.habr.com