Użytkownik w Dockerze

Andrzej Kopyłow, nasz dyrektor techniczny, uwielbia, aktywnie wykorzystuje i promuje Dockera. W nowym artykule opowiada, jak tworzyć użytkowników w Dockerze. Poprawne zarządzanie nimi, dlaczego nie powinno się zostawiać użytkowników z prawami root oraz jak rozwiązać problem niezgodności wskaźników w Dockerfile.

Wszystkie procesy w kontenerze będą działać jako użytkownik root, jeśli nie wskaź się go w sposób specjalny. To wydaje się bardzo wygodne, ponieważ ten użytkownik nie ma żadnych ograniczeń. Dlatego praca jako root jest niewłaściwa z punktu widzenia bezpieczeństwa. Jeśli na lokalnym komputerze nikt w zdrowym rozsądku nie pracuje z prawami roota, wielu uruchamia procesy jako root w kontenerach.

Zawsze istnieją błędy, które pozwalają złośliwemu oprogramowaniu wydostać się z kontenera i dostać się na komputer hosta. Zakładając najgorsze, musimy zapewnić uruchamianie procesów wewnątrz kontenera jako użytkownik, który nie ma żadnych praw na komputerze hosta.

Tworzenie użytkownika

Tworzenie użytkownika w kontenerze nie różni się od tworzenia go w dystrybucjach linuksowych. Jednak dla różnych podstawowych obrazów polecenia mogą się różnić.

Dla dystrybucji opartych na debianie w Dockerfile należy dodać:

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

Dla alpine:

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

Uruchamianie procesów jako użytkownik

Aby uruchomić wszystkie kolejne procesy jako użytkownik o UID 2000 wykonaj:

USER 2000

Aby uruchomić wszystkie kolejne procesy jako użytkownik node wykonaj:

USER node

Więcej informacji w dokumentacji.

Montowanie wolumenów

Podczas montowania wolumenów do kontenera zapewnij użytkownikowi możliwość czytania i (lub) zapisywania plików. W tym celu UID (GID) użytkownika w kontenerze oraz użytkownika poza kontenerem, który ma odpowiednie prawa dostępu do pliku, muszą być zgodne. Przy tym nazwy użytkowników nie mają znaczenia.

Często na komputerze linuksowym użytkownik ma UID i GID równe 1000. Te identyfikatory są przypisywane pierwszemu użytkownikowi komputera.

Poznanie swoich identyfikatorów jest proste:

id

Uzyskasz wyczerpujące informacje o swoim użytkowniku.
Zastąp 2000 w przykłady swoim identyfikatorem, a wszystko będzie w porządku.

Przypisanie użytkownikowi UID i GID

Jeśli użytkownik został utworzony wcześniej, ale konieczna jest zmiana identyfikatorów, można to zrobić w ten sposób:

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

Jeśli używasz podstawowego obrazu alpine, musisz zainstalować pakiet shadow:

RUN apk add --no-cache shadow

Przekazanie identyfikatora użytkownika do kontenera podczas budowania obrazu

Jeśli twój identyfikator i identyfikatory wszystkich osób pracujących nad projektem się zgadzają, wystarczy podać ten identyfikator w Dockerfile. Jednak często identyfikatory użytkowników się różnią.

Jak osiągnąć to, co chcemy, nie jest od razu oczywiste. Dla mnie to było najtrudniejsze w procesie nauki docker. Wielu użytkowników dockera nie zastanawia się nad tym, że istnieją różne etapy życia obrazu. Na początku obraz jest budowany w tym celu używa się Dockerfile. Po uruchomieniu kontenera z obrazu Dockerfile nie jest już używany.

Tworzenie użytkowników powinno odbywać się podczas budowania obrazu. To samo dotyczy określenia użytkownika, z którego uruchamiane są procesy. Oznacza to, że w jakiś sposób musimy przekazać do kontenera UID (GID).

Do używania zmiennych zewnętrznych w Dockerfile służą dyrektywy ENVARG. Szczegółowe porównanie dyrektyw tutaj.

Dockerfile

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

Argumenty można przekazać przez docker-compose w ten sposób:

docker-compose

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

P.S. Aby opanować wszystkie tajniki dockera, nie wystarczy czytać dokumentację ani artykuły. Trzeba dużo praktykować, trzeba poczuć dockera.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster