, 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 nodeDla 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 2000Aby uruchomić wszystkie kolejne procesy jako użytkownik node wykonaj:
USER nodeWięcej informacji w .
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:
idUzyskasz 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 shadowPrzekazanie 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 i . Szczegółowe porównanie dyrektyw .
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
