, náš technický ředitel, má rád, aktivně používá a propaguje Docker. V novém článku vysvětluje, jak vytvořit uživatele v Dockeru. Správná práce s nimi, proč by uživatelé neměli mít root práva a jak vyřešit problém s nesouladem indikátorů v Dockerfile.
Všechny procesy v kontejneru budou běžet pod uživatelským účtem root, pokud ho speciálně neurčíme. To se zdá jako velmi pohodlné, protože tento uživatel nemá žádná omezení. Právě proto je nesprávné pracovat pod uživatelským účtem root z hlediska bezpečnosti. Pokud nikdo na místním počítači nepracuje s rootovými právy, mnoho lidí spouští procesy jako root v kontejnerech.
Vždy existují chyby, které umožňují škodlivému kódu dostat se ven z kontejneru a dostat se na hostitelský počítač. Předpokládaje to nejhorší, musíme zajistit, aby procesy běžely uvnitř kontejneru pod uživatelským účtem, který nemá žádná práva na hostitelské zařízení.
Vytvoření uživatele
Vytváření uživatele v kontejneru se neliší od jeho vytváření v linuxových distribucích. Nicméně pro různé základní obrazy se příkazy mohou lišit.
Pro distribuce založené na debianu je třeba do Dockerfile přidat:
RUN groupadd --gid 2000 node
&& useradd --uid 2000 --gid node --shell /bin/bash --create-home nodePro alpine:
RUN addgroup -g 2000 node
&& adduser -u 2000 -G node -s /bin/sh -D node
Spouštění procesů pod uživatelským účtem
Pro spuštění všech následujících procesů pod uživatelským účtem s UID 2000 proveďte:
USER 2000Pro spuštění všech následujících procesů pod uživatelským účtem node proveďte:
USER nodeVíce informací v .
Připojování objemů
Při připojování objemů do kontejneru zajistěte uživateli možnost číst a (nebo) zapisovat soubory. K tomu musí odpovídat UID (GID) uživatele v kontejneru a uživatele mimo kontejner, který má odpovídající práva k souboru. Přitom jména uživatelů nemají žádný význam.
Často má na linuxovém počítači uživatel UID a GID rovny 1000. Tyto identifikátory jsou přidělovány prvnímu uživateli počítače.
Zjistit své identifikátory je snadné:
idZískáte vyčerpávající informace o svém uživatelském účtu.
Nahraďte 2000 v příkladech svým identifikátorem a vše bude v pořádku.
Přiřazení UID a GID uživatelskému účtu
Pokud byl uživatel vytvořen dříve, ale je třeba změnit identifikátory, lze to provést takto:
RUN usermod -u 1000 node
&& groupmod -g 1000 node
Pokud používáte základní obraz alpine, je třeba nainstalovat balíček shadow:
RUN apk add --no-cache shadowPředání uživatelského identifikátoru do kontejneru při stavění obrazu
Pokud se váš identifikátor a identifikátory všech lidí, kteří na projektu pracují, shodují, stačí uvést tento identifikátor v Dockerfile. Nicméně často se identifikátory uživatelů neshodují.
Jak to dosáhnout, není hned jasné. Pro mě to bylo nejtěžší při osvojování dockera. Mnoho uživatelů dockera si neuvědomuje, že existují různé fáze života obrazu. Nejprve se obraz sestaví, k tomu se používá Dockerfile. Při spuštění kontejneru z obrazu se Dockerfile už nepoužívá.
Vytváření uživatelů by mělo probíhat při stavění obrazu. To platí i pro určení uživatele, pod kterým se procesy spouští. To znamená, že nějakým způsobem musíme předat dovnitř kontejneru UID (GID).
Pro použití externích proměnných v Dockerfile slouží direktivy a . Podrobné srovnání direktiv .
Dockerfile
ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node
&& groupmod -g $GID node
Předat argumenty přes docker-compose lze takto:
docker-compose
build:
context: ./src/backend
args:
UID: 1000
GID: 1000
P.S. Pro osvojení všech tajů dockera nestačí číst dokumentaci nebo články. Je třeba hodně cvičit, je třeba cítit docker.
Zdroj: habr.com
