, directorul nostru tehnic, iubește, folosește activ și promovează Docker. În noul său articol, el explică cum să creați utilizatori în Docker. Lucrul corect cu aceștia, de ce utilizatorii nu ar trebui să aibă drepturi root și cum se poate rezolva problema necorespunderii indicatorilor în Dockerfile.
Toate procesele din container vor rula sub utilizatorul root, dacă nu este specificat altfel. Acest lucru pare foarte convenabil, deoarece acest utilizator nu are restricții. De aceea, a lucra sub root nu este corect din punct de vedere al securității. Dacă nimeni nu lucrează cu drepturi root pe computerul local, mulți lansează procese sub root în containere.
Întotdeauna există bug-uri care permit malware-ului să iasă din container și să ajungă pe computerul gazdă. Presupunând ce este mai rău, trebuie să ne asigurăm că procesele din container sunt rulează de utilizatorul care nu are drepturi pe mașina gazdă.
Crearea utilizatorului
Crearea utilizatorilor în container nu diferă de crearea acestora în distribuțiile Linux. Totuși, pentru diferite imagini de bază, comenzile pot varia.
Pentru distribuțiile bazate pe debian, în Dockerfile trebuie să adăugați:
RUN groupadd --gid 2000 node
&& useradd --uid 2000 --gid node --shell /bin/bash --create-home nodePentru alpine:
RUN addgroup -g 2000 node
&& adduser -u 2000 -G node -s /bin/sh -D node
Rularea proceselor de utilizator
Pentru a rula toate procesele ulterioare de utilizator cu UID 2000, executați:
USER 2000Pentru a rula toate procesele ulterioare de utilizator node, executați:
USER nodeMai multe informații în .
Montarea volumelor
Atunci când montați volume în container, asigurați-vă că utilizatorul are permisiunea de a citi și/sau scrie fișiere. Pentru aceasta, UID (GID) utilizatorului din container și utilizatorului din afara containerului, care are drepturile corespunzătoare de acces la fișier, trebuie să corespundă. Numele utilizatorilor nu au relevanță în acest caz.
Adesea, pe un computer Linux, utilizatorul are UID și GID egale cu 1000. Aceste identificatoare sunt atribuite primului utilizator al computerului.
Este simplu să îți afli identificatoarele:
idVeți primi informații detaliate despre utilizatorul dvs.
Înlocuiți 2000 din exemple cu identificatorul dvs. și totul va fi în ordine.
Atribuirea utilizatorului UID și GID
Dacă utilizatorul a fost creat mai devreme, dar este necesară schimbarea identificatorilor, aceasta se poate face astfel:
RUN usermod -u 1000 node
&& groupmod -g 1000 node
Dacă folosiți imaginea de bază alpine, trebuie să instalați pachetul shadow:
RUN apk add --no-cache shadowTransmiterea identificatorului utilizatorului în container în timpul construirii imaginii
Dacă identificatorul dumneavoastră și identificatorii tuturor persoanelor care lucrează la proiect coincid, este suficient să specificați acest identificator în Dockerfile. Totuși, adesea identificatorii utilizatorilor nu coincid.
Cum să realizați ceea ce doriți nu este întotdeauna evident. Pentru mine, acesta a fost cel mai greu aspect în procesul de învățare a docker-ului. Mulți utilizatori de docker nu se gândesc la faptul că există diferite etape în viața unei imagini. Mai întâi, imaginea este construită; pentru aceasta se folosește Dockerfile. La lansarea containerului din imagine, Dockerfile nu mai este utilizat.
Crearea utilizatorilor trebuie să aibă loc în timpul construirii imaginii. Aceasta se referă și la definirea utilizatorului sub care rulează procesele. Asta înseamnă că trebuie să transmitem cumva în interiorul containerului UID (GID).
Pentru a utiliza variabile externe în Dockerfile, se folosesc directivele și . Compararea detaliată a directivelor .
Dockerfile
ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node
&& groupmod -g $GID node
Transmiteți argumentele prin docker-compose astfel:
docker-compose
build:
context: ./src/backend
args:
UID: 1000
GID: 1000
P.S. Pentru a învăța toate subtilitățile docker-ului, nu este suficient să citiți documentația sau articolele. Este nevoie de multă practică, trebuie să simțiți docker.
Sursa: habr.com
