AnvÀndare i Docker

Andrej Kopylov, vÄr tekniska direktör, Àlskar, anvÀnder aktivt och frÀmjar Docker. I den nya artikeln berÀttar han hur man skapar anvÀndare i Docker. RÀtt hantering av dem, varför anvÀndare inte ska lÀmnas med root-rettigheter och hur man löser problemet med avvikande indikatorer i Dockerfile.

Alla processer i containern kommer att köras som anvÀndaren root, om det inte anges pÄ sÀrskilt sÀtt. Detta verkar vÀldigt bekvÀmt, eftersom denna anvÀndare inte har nÄgra begrÀnsningar. DÀrför Àr det fel att arbeta som root ur sÀkerhetssynpunkt. Om ingen pÄ den lokala datorn vid sina sinnens fulla bruk arbetar med root-rettigheter, sÄ kör mÄnga processer som root i containrar.

Det finns alltid buggar som gör att skadlig kod kan lÀmna containern och komma Ät vÀrddatorn. Givet det vÀrsta, bör vi sÀkerstÀlla att processer körs inuti containern av en anvÀndare som inte har nÄgra rÀttigheter pÄ vÀrddatorn.

Skapa anvÀndare

Att skapa en anvÀndare i containern skiljer sig inte frÄn att skapa en i Linux-distributioner. Men kommandona kan variera för olika grundbilder.

För distributioner baserade pÄ debian i Dockerfile mÄste man lÀgga till:

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

Kör processer som anvÀndare

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

USER 2000

För att köra alla efterföljande processer som anvÀndaren node, utför:

USER node

Mer information finns i dokumentationen.

Montering av volymer

NÀr du monterar volymer inuti containern, se till att anvÀndaren kan lÀsa och (eller) skriva filer. För detta mÄste UID (GID) för anvÀndaren i containern och anvÀndaren utanför containern, som har motsvarande tillgÄngsrÀttigheter till filen, matcha. AnvÀndarnamn spelar ingen roll.

Ofta har en anvÀndare pÄ en Linux-dator UID och GID motsvarande 1000. Dessa identifierare tilldelas den första anvÀndaren pÄ datorn.

Det Àr lÀtt att ta reda pÄ sina identifierare:

id

Du kommer att fÄ utförlig information om din anvÀndare.
Byt ut 2000 i exemplen mot din egen identifierare sÄ blir allt bra.

Tilldela anvÀndaren UID och GID

Om anvÀndaren skapades tidigare men identifierarna behöver Àndras kan detta göras sÄ hÀr:

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

Om du anvÀnder en grundlÀggande alpine-image mÄste du installera paketet shadow:

RUN apk add --no-cache shadow

Överföring av anvĂ€ndaridentifierare in i containern vid byggandet av imagen

Om din identifierare och identifierarna för alla som arbetar med projektet överensstÀmmer, rÀcker det med att ange denna identifierare i Dockerfile. Men ofta överensstÀmmer inte anvÀndarnas identifierare.

Hur man Ästadkommer det önskade Àr inte alltid sjÀlvklart. För mig var detta det svÄraste i inlÀrningen av docker. MÄnga docker-anvÀndare tÀnker inte pÄ att det finns olika livscykelsteg för en image. Först byggs imagen, vilket görs med Dockerfile. NÀr container körs frÄn imagen anvÀnds Dockerfile inte lÀngre.

Skapandet av anvÀndare bör ske vid byggandet av imagen. Detta gÀller ocksÄ definitionen av anvÀndaren under vilken processerna körs. Det betyder att vi pÄ nÄgot sÀtt mÄste överföra UID (GID) in i containern.

För att anvÀnda externa variabler i Dockerfile anvÀnds direktiven ENV och ARG. En detaljerad jÀmförelse av direktiv ). Ett typiskt exempel pÄ anvÀndning:.

Dockerfile

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

För att överföra argument via docker-compose kan du göra sÄ hÀr:

docker-compose

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

P.S. För att bemÀstra alla finheter av docker rÀcker det inte att bara lÀsa dokumentationen eller artiklar. Du mÄste praktisera mycket, du behöver kÀnna pÄ docker.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster