, naš tehnični direktor, rad uporablja in propagira Docker. V novem članku opisuje, kako ustvariti uporabnike v Dockerju. Pravilno delo z njimi, zakaj uporabniki ne smejo imeti pravic root in kako rešiti težavo neskladnosti indikatorjev v Dockerfile.
Vse procese v kontejnerju bo izvajal uporabnik root, razen če ga posebaj ne določite. To se zdi zelo priročno, saj ta uporabnik nima nobenih omejitev. Zato je delo pod rootom napačno z vidika varnosti. Medtem ko na lokalnem računalniku nihče pri zdravem razumu ne dela s pravicami root, mnogi procesi v kontejnerjih tečejo kot root.
Vedno obstajajo napake, ki omogočajo zlonamernemu programu pobegniti iz kontejnerja in priti na gostiteljski računalnik. Predvidevajoč najslabše, moramo zagotoviti, da se procesi znotraj kontejnerja izvajajo z uporabnikom, ki nima pravic na gostiteljskem računalniku.
Создание пользователя
Ustvarjanje uporabnika v kontejnerju se ne razlikuje od ustvarjanja v linux distribucijah. Vendar se lahko ukazi za različne osnovne slike razlikujejo.
Za distribucije, ki temeljijo na debian, je v Dockerfile potrebno dodati:
RUN groupadd --gid 2000 node
&& useradd --uid 2000 --gid node --shell /bin/bash --create-home nodeZa alpine:
RUN addgroup -g 2000 node
&& adduser -u 2000 -G node -s /bin/sh -D node
Zagon procesov pod uporabnikom
Za zagon vseh naslednjih procesov pod uporabnikom z UID 2000 izvedite:
USER 2000Za zagon vseh naslednjih procesov pod uporabnikom node izvedite:
USER nodeVeč o .
Priključitev volumov
Pri priključitvi volumov v kontejner zagotovite uporabniku, da lahko bere in (ali) piše datoteke. Za to morata biti UID (GID) uporabnika v kontejnerju in uporabnika zunaj kontejnerja, ki ima ustrezne pravice za dostop do datoteke, enaka. Imena uporabnikov pri tem nimajo pomena.
Pogosto ima na linux računalniku uporabnik UID in GID enaka 1000. Ta identifikatorja sta dodeljena prvemu uporabniku računalnika.
Preverite svoje identifikatorje zlahka:
idPrejeli boste izčrpne informacije o svojem uporabniku.
Zamenjajte 2000 iz primerov s svojim identifikatorjem in vse bo v redu.
Dodeljevanje uporabniku UID in GID
Če je uporabnik ustvarjen prej, a potrebujete spremeniti identifikatorje, to lahko storite tako:
RUN usermod -u 1000 node
&& groupmod -g 1000 node
Če uporabljate osnovno sliko alpine, morate namestiti paket shadow:
RUN apk add --no-cache shadowPrenos identifikatorja uporabnika znotraj kontejnerja pri gradnji slike
Če se vaš identifikator in identifikatorji vseh, ki delajo na projektu, ujemajo, je dovolj, da ta identifikator navedete v Dockerfilu. Vendar se pogosto identifikatorji uporabnikov ne ujemajo.
Kako doseči željeno ni takoj jasno. Zame je bilo to najtežje v procesu spoznavanja dockers. Mnogi uporabniki dockers ne razmišljajo o tem, da so različne faze življenja slike. Najprej se slika sestavi, za to se uporablja Dockerfile. Pri zagonu kontejnerja iz slike Dockerfile ni več uporabljen.
Ustvarjanje uporabnikov mora potekati pri gradnji slike. To velja tudi za določanje uporabnika, pod katerim se izvajajo procesi. To pomeni, da moramo nekako prenesti UID (GID) znotraj kontejnerja.
Za uporabo zunanjih spremenljivk v Dockerfilu služijo direktive in . Podrobna primerjava direktiv .
Dockerfile
ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node
&& groupmod -g $GID node
Prenos argumentov preko docker-compose lahko poteka tako:
docker-compose
build:
context: ./src/backend
args:
UID: 1000
GID: 1000
P.S. Za obvladovanje vseh skrivnosti dockers ni dovolj, da preberete dokumentacijo ali članke. Potrebno je veliko vaditi, treba je začutiti dockers.
Izvor: habr.com
