Utilizator în Docker

Andrei Kopylov, CTO nostru, iubește, folosește și promovează în mod activ Docker. Într-un articol nou, el explică cum să creați utilizatori în Docker. Lucru corect cu ei, de ce utilizatorii nu ar trebui să rămână cu drepturi de root și cum să rezolve problema indicatorilor nepotriviți din Dockerfile.

Toate procesele din container vor rula ca utilizator root, cu excepția cazului în care îl specificați într-un mod special. Acest lucru pare foarte convenabil, deoarece acest utilizator nu are restricții. Acesta este motivul pentru care lucrul ca root este greșit din punct de vedere al securității. Dacă nimeni nu lucrează pe computerul local cu drepturi de root, atunci mulți execută procese sub root în containere.

Există întotdeauna erori care vor permite programelor malware să scape din container și să ajungă pe computerul gazdă. Presupunând ce este mai rău, trebuie să ne asigurăm că procesele din interiorul containerului sunt rulate de un utilizator care nu are drepturi pe mașina gazdă.

Crearea unui utilizator

Crearea unui utilizator într-un container nu este diferită de crearea acestuia în distribuțiile Linux. Cu toate acestea, comenzile pot varia pentru diferite imagini de bază.

Pentru distribuțiile bazate pe Debian, trebuie să adăugați următoarele la Dockerfile:

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

Pentru alpin:

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

Rularea proceselor de la utilizator

Pentru a rula toate procesele ulterioare ca utilizator cu UID 2000, rulați:

USER 2000

Pentru a rula toate procesele ulterioare ca utilizator de nod, rulați:

USER node

Mai multe în documentație.

Volume de montaj

Când montați volume în interiorul unui container, oferiți utilizatorului posibilitatea de a citi și/sau scrie fișiere. Pentru a face acest lucru, UID-ul (GID) al utilizatorului din container și al utilizatorului din afara containerului care are permisiunile corespunzătoare pentru a accesa fișierul trebuie să se potrivească. În acest caz, numele de utilizator nu contează.

Adesea, pe un computer Linux, UID-ul și GID-ul unui utilizator sunt egale cu 1000. Acești identificatori sunt alocați primului utilizator al computerului.

Aflați identificatorii dvs. este ușor:

id

Veți primi informații complete despre utilizatorul dvs.
Înlocuiți 2000 din exemple cu identificatorul dvs. și totul va fi bine.

Atribuirea unui UID și GID unui utilizator

Dacă utilizatorul a fost creat anterior, dar trebuie să schimbați identificatorii, puteți proceda astfel:

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

Dacă utilizați imaginea de bază alpină, trebuie să instalați pachetul shadow:

RUN apk add —no-cache shadow

Trecerea ID-ului utilizatorului în interiorul containerului la construirea imaginii

Dacă ID-ul dvs. și ID-urile tuturor persoanelor care lucrează la proiect se potrivesc, atunci trebuie doar să specificați acest ID în fișierul Docker. Cu toate acestea, adesea ID-urile utilizatorului nu se potrivesc.

Cum să obții ceea ce îți dorești nu este imediat clar. Pentru mine, acesta a fost cel mai dificil lucru în procesul de stăpânire a Docker. Mulți utilizatori de docker nu realizează că există diferite etape în viața unei imagini. Mai întâi, imaginea este asamblată folosind un fișier Docker. Când rulați un container dintr-o imagine, fișierul Dockerfile nu mai este utilizat.

Crearea utilizatorului trebuie să aibă loc atunci când imaginea este construită. Același lucru este valabil și pentru determinarea utilizatorului sub care sunt lansate procesele. Aceasta înseamnă că trebuie să trecem cumva UID-ul (GID) în interiorul containerului.

Directivele sunt folosite pentru a utiliza variabile externe în Dockerfile ENV и ARG. Comparație detaliată a directivelor aici.

Dockerfile

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

Puteți transmite argumente prin docker-compose astfel:

Docker-scriere

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

PS Pentru a stăpâni toate complexitățile Docker, nu este suficient să citiți documentația sau articolele. Trebuie să exersați mult, trebuie să înțelegeți Docker.

Sursa: www.habr.com

Adauga un comentariu