Użytkownik w Dockerze

Andriej Kopyłow, nasz CTO, kocha, aktywnie wykorzystuje i promuje Dockera. W nowym artykule wyjaśnia, jak tworzyć użytkowników w Dockerze. Prawidłowa praca z nimi, dlaczego użytkownikom nie należy pozostawiać praw root i jak rozwiązać problem niedopasowanych wskaźników w pliku Dockerfile.

Wszystkie procesy w kontenerze będą uruchamiane jako użytkownik root, chyba że określisz to w specjalny sposób. Wydaje się to bardzo wygodne, ponieważ ten użytkownik nie ma żadnych ograniczeń. Właśnie dlatego praca jako root jest zła z punktu widzenia bezpieczeństwa. Jeśli nikt przy zdrowych zmysłach nie pracuje na komputerze lokalnym z uprawnieniami roota, wówczas wiele procesów uruchamia się w kontenerach z uprawnieniami roota.

Zawsze znajdą się błędy, które umożliwią złośliwemu oprogramowaniu wydostanie się z kontenera i przedostanie się na komputer hosta. Zakładając najgorsze, musimy zadbać o to, aby procesy wewnątrz kontenera były uruchamiane przez użytkownika, który nie ma żadnych uprawnień na komputerze-hoście.

Tworzenie użytkownika

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

W przypadku dystrybucji opartych na Debianie musisz dodać następujące elementy do pliku Dockerfile:

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

Dla alpejskiego:

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

Uruchamianie procesów od użytkownika

Aby uruchomić wszystkie kolejne procesy jako użytkownik z UID 2000, uruchom:

USER 2000

Aby uruchomić wszystkie kolejne procesy jako użytkownik węzła, uruchom:

USER node

Czytaj więcej w dokumentacja.

Mocowanie objętości

Montując woluminy w kontenerze, zapewnij użytkownikowi możliwość odczytu i/lub zapisu plików. Aby to zrobić, UID (GID) użytkownika w kontenerze i użytkownika poza kontenerem, który ma odpowiednie uprawnienia dostępu do pliku, muszą być zgodne. W tym przypadku nazwy użytkowników nie mają znaczenia.

Często na komputerze z systemem Linux identyfikatory UID i GID użytkownika są równe 1000. Identyfikatory te są przypisane do pierwszego użytkownika komputera.

Znalezienie swoich identyfikatorów jest łatwe:

id

Otrzymasz kompleksowe informacje o swoim użytkowniku.
Zamień 2000 z przykładów na swój identyfikator i wszystko będzie dobrze.

Przypisanie UID i GID użytkownikowi

Jeśli użytkownik został utworzony wcześniej, ale potrzebujesz zmienić identyfikatory, możesz to zrobić w następujący sposób:

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

Jeśli używasz podstawowego obrazu Alpine, musisz zainstalować pakiet cieni:

RUN apk add —no-cache shadow

Przekazywanie identyfikatora użytkownika wewnątrz kontenera podczas budowania obrazu

Jeśli Twój identyfikator i identyfikatory wszystkich osób pracujących nad projektem są zgodne, po prostu określ ten identyfikator w pliku Dockerfile. Często jednak identyfikatory użytkowników nie są zgodne.

Jak osiągnąć to, czego chcesz, nie jest od razu jasne. Dla mnie to była najtrudniejsza rzecz w procesie masteringu Dockera. Wielu użytkowników dokera nie zdaje sobie sprawy, że istnieją różne etapy życia obrazu. Najpierw obraz jest składany przy użyciu pliku Dockerfile. Podczas uruchamiania kontenera z obrazu plik Dockerfile nie jest już używany.

Tworzenie użytkownika musi nastąpić podczas tworzenia obrazu. To samo dotyczy określenia użytkownika, w ramach którego uruchamiane są procesy. Oznacza to, że musimy w jakiś sposób przekazać UID (GID) do wnętrza kontenera.

Dyrektywy służą do używania zmiennych zewnętrznych w pliku Dockerfile ENV и ARG. 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

Możesz przekazywać argumenty za pomocą docker-compose w następujący sposób:

dokować-komponować

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

PS Aby opanować wszystkie zawiłości Dockera, nie wystarczy przeczytać dokumentację czy artykuły. Musisz dużo ćwiczyć, musisz wyczuć Dockera.

Źródło: www.habr.com

Dodaj komentarz