User in Docker

Andrej Kopylov, 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 node

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

Za zagon vseh naslednjih procesov pod uporabnikom node izvedite:

USER node

Več o dokumenti.

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:

id

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

Prenos 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 ENV in ARG. Podrobna primerjava direktiv tukaj.

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

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster