, vår tekniske direktør, elsker å aktivt bruke og promotere Docker. I den nye artikkelen forklarer han hvordan man lager brukere i Docker. Riktig håndtering av dem, hvorfor man ikke bør la brukere ha root-rettigheter, og hvordan man løser problemet med uoverensstemmelse i Dockerfile.
Alle prosesser i containeren vil kjøre som bruker root, med mindre det spesifikt angis. Dette virker veldig praktisk, siden denne brukeren ikke har noen begrensninger. Derfor er det upraktisk å jobbe som root med hensyn til sikkerhet. Mens ingen på den lokale datamaskinen normalt bruker root-rettigheter, kjører mange prosesser som root i containere.
Det finnes alltid feil som lar ondsinnede aktører ta seg ut av containeren og inn på vertsmaskinen. Gitt det verste, må vi sørge for at prosessene kjører inne i containeren som en bruker som ikke har noen rettigheter på vertsmaskinen.
Oppretting av bruker
Oprettelse av brukere i containeren er ikke annerledes enn i Linux-distribusjoner. Men for forskjellige basisbilder kan kommandoene variere.
For distribusjoner basert på debian, må du legge til i Dockerfile:
RUN groupadd --gid 2000 node
&& useradd --uid 2000 --gid node --shell /bin/bash --create-home nodeFor alpine:
RUN addgroup -g 2000 node
&& adduser -u 2000 -G node -s /bin/sh -D node
Kjøring av prosesser som bruker
For å kjøre alle påfølgende prosesser som bruker med UID 2000, gjør:
USER 2000For å kjøre alle påfølgende prosesser som bruker node, gjør:
USER nodeMer informasjon finner du i .
Montering av volumer
Når du monterer volumer inn i containeren, sørg for at brukeren har tilgang til å lese og (eller) skrive filer. For dette må UID (GID) for brukeren i containeren og brukeren utenfor containeren, som har de nødvendige tilgangsrettighetene til filen, samsvare. Brukernavnene har ingen betydning.
Ofte har brukeren på en Linux-datamaskin UID og GID lik 1000. Disse identifikatorene tildeles den første brukeren på datamaskinen.
Det er enkelt å finne ut dine identifikatorer:
idDu vil få omfattende informasjon om din bruker.
Erstatt 2000 i eksemplene med din egen identifikator, så vil alt være i orden.
Tildeling av bruker UID og GID
Hvis brukeren ble opprettet tidligere, men det er nødvendig å endre identifikatorene, kan dette gjøres slik:
RUN usermod -u 1000 node
&& groupmod -g 1000 node
Hvis du bruker en grunnleggende Alpine-bilde, må du installere pakken shadow:
RUN apk add --no-cache shadowOverføring av bruker-ID inn i containeren ved bygging av bildet
Hvis din ID og identifikatorene til alle som jobber med prosjektet samsvarer, er det tilstrekkelig å angi denne identifikatoren i Dockerfile. Men ofte stemmer ikke brukernes identifikatorer overens.
Hvordan oppnå ønsket er ikke åpenbart med en gang. For meg var dette det vanskeligste i prosessen med å lære Docker. Mange Docker-brukere tenker ikke over at det finnes forskjellige livsfaser for et bilde. Bildet bygges først, og for dette brukes Dockerfile. Når containeren startes fra bildet, brukes ikke Dockerfile lenger.
Opprettelse av brukere bør skje under bygging av bildet. Det samme gjelder for identifikasjonen av brukeren som prosesser kjøres under. Det betyr at vi på en eller annen måte må overføre UID (GID) inn i containeren.
For å bruke eksterne variabler i Dockerfile tjener direktivene og . Detaljert sammenligning av direktiver .
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 gjennom docker-compose slik:
docker-compose
build:
context: ./src/backend
args:
UID: 1000
GID: 1000
P.S. For å mestre alle detaljene ved Docker er det ikke nok å lese dokumentasjonen eller artikler. Du må praktisere mye, du må kjenne på Docker.
Kilde: habr.com
