Utente in Docker

Andrej Kopylov, il nostro CTO, ama, utilizza attivamente e promuove Docker. In un nuovo articolo spiega come creare utenti in Docker. Lavoro corretto con loro, perché agli utenti non dovrebbero essere lasciati i diritti di root e come risolvere il problema degli indicatori non corrispondenti nel Dockerfile.

Tutti i processi nel contenitore verranno eseguiti come utente root, a meno che non lo specifichi in modo speciale. Questo sembra molto conveniente, perché questo utente non ha restrizioni. Ecco perché lavorare come root è sbagliato dal punto di vista della sicurezza. Se nessuno sano di mente lavora sul computer locale con diritti di root, molti eseguono processi sotto root in contenitori.

Ci sono sempre bug che consentono al malware di fuoriuscire dal contenitore e accedere al computer host. Supponendo il peggio, dobbiamo garantire che i processi all'interno del contenitore siano eseguiti da un utente che non dispone di alcun diritto sulla macchina host.

Creazione di un utente

Creare un utente in un contenitore non è diverso dal crearlo nelle distribuzioni Linux. Tuttavia, i comandi possono variare a seconda delle diverse immagini di base.

Per le distribuzioni basate su Debian, è necessario aggiungere quanto segue al Dockerfile:

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

Per alpino:

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

Esecuzione di processi dall'utente

Per eseguire tutti i processi successivi come utente con UID 2000, eseguire:

USER 2000

Per eseguire tutti i processi successivi come utente del nodo, eseguire:

USER node

Più in documentazione.

Volumi di montaggio

Quando si montano volumi all'interno di un contenitore, fornire all'utente la possibilità di leggere e/o scrivere file. A tale scopo, l'UID (GID) dell'utente nel contenitore e dell'utente esterno al contenitore che dispone delle autorizzazioni appropriate per accedere al file deve corrispondere. In questo caso, i nomi utente non contano.

Spesso su un computer Linux, l'UID e il GID di un utente sono uguali a 1000. Questi identificatori vengono assegnati al primo utente del computer.

Scoprire i tuoi identificatori è facile:

id

Riceverai informazioni complete sul tuo utente.
Sostituisci 2000 dagli esempi con il tuo identificatore e tutto andrà bene.

Assegnazione di un UID e GID a un utente

Se l'utente è stato creato in precedenza, ma è necessario modificare gli identificatori, puoi farlo in questo modo:

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

Se stai utilizzando l'immagine base alpine, devi installare il pacchetto shadow:

RUN apk add —no-cache shadow

Passaggio dell'ID utente all'interno del contenitore durante la creazione dell'immagine

Se il tuo ID e gli ID di tutte le persone che lavorano al progetto corrispondono, specifica semplicemente questo ID nel Dockerfile. Tuttavia, spesso gli ID utente non corrispondono.

Come ottenere ciò che desideri non è immediatamente chiaro. Per me, questa è stata la cosa più difficile nel processo di padronanza di Docker. Molti utenti docker non si rendono conto che ci sono diverse fasi nella vita di un'immagine. Innanzitutto, l'immagine viene assemblata utilizzando un Dockerfile. Quando si esegue un contenitore da un'immagine, il Dockerfile non viene più utilizzato.

La creazione dell'utente deve avvenire al momento della creazione dell'immagine. Lo stesso vale per determinare l'utente sotto il quale vengono avviati i processi. Ciò significa che dobbiamo in qualche modo passare l'UID (GID) all'interno del contenitore.

Le direttive vengono utilizzate per utilizzare variabili esterne nel Dockerfile ENV и ARG. Confronto dettagliato delle direttive qui.

Dockerfile

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

Puoi passare argomenti tramite docker-compose in questo modo:

finestra mobile-composizione

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

PS Per padroneggiare tutte le complessità di Docker, non è sufficiente leggere la documentazione o gli articoli. Devi esercitarti molto, devi prendere confidenza con Docker.

Fonte: habr.com

Aggiungi un commento