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
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
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