Trik je v použití useradd
místo jeho interaktivního obalu adduser
.Obvykle vytvářím uživatele s:
RUN useradd -ms /bin/bash newuser
který vytvoří domovský adresář pro uživatele a zajistí, že bash je výchozí shell.
Poté můžete přidat:
USER newuser
WORKDIR /home/newuser
do vašeho dockerfile. Každý následující příkaz i interaktivní relace budou provedeny jako uživatel newuser
:
docker run -t -i image
[email protected]:~$
Možná budete muset zadat newuser
oprávnění ke spouštění programů, které hodláte spouštět před vyvoláním uživatelského příkazu.
Použití neprivilegovaných uživatelů uvnitř kontejnerů je z bezpečnostních důvodů dobrý nápad. Má také několik nevýhod. A co je nejdůležitější, lidé odvozující obrázky z vašeho obrázku se budou muset přepnout zpět na root, než budou moci provádět příkazy s oprávněními superuživatele.
Přidání uživatele do dockeru a spuštění aplikace pod tímto uživatelem je z hlediska zabezpečení velmi dobrý postup. K tomu bych doporučil následující kroky:
FROM node:10-alpine
# Copy source to container
RUN mkdir -p /usr/app/src
# Copy source code
COPY src /usr/app/src
COPY package.json /usr/app
COPY package-lock.json /usr/app
WORKDIR /usr/app
# Running npm install for production purpose will not run dev dependencies.
RUN npm install -only=production
# Create a user group 'xyzgroup'
RUN addgroup -S xyzgroup
# Create a user 'appuser' under 'xyzgroup'
RUN adduser -S -D -h /usr/app/src appuser xyzgroup
# Chown all the files to the app user.
RUN chown -R appuser:xyzgroup /usr/app
# Switch to 'appuser'
USER appuser
# Open the mapped port
EXPOSE 3000
# Start the process
CMD ["npm", "start"]
Výše uvedené kroky jsou úplným příkladem kopírování souborů projektu NodeJS, vytvoření skupiny uživatelů a uživatele, přiřazení oprávnění uživateli pro složku projektu, přepnutí na nově vytvořeného uživatele a spuštění aplikace pod tímto uživatelem.
Ubuntu
Zkuste následující řádky v Dockerfile
:
RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G sudo -u 1001 ubuntu
USER ubuntu
WORKDIR /home/ubuntu
useradd
možnosti (viz:man useradd
):
-r
,--system
Vytvořte systémový účet.-m
,--create-home
Vytvořte domovský adresář uživatele.-d
,--home-dir HOME_DIR
Domovský adresář nového účtu.-s
,--shell SHELL
Přihlašovací prostředí nového účtu.-g
,--gid GROUP
Název nebo ID primární skupiny.-G
,--groups GROUPS
Seznam doplňkových skupin.-u
,--uid UID
Zadejte ID uživatele.-p
,--password PASSWORD
Šifrované heslo nového účtu (např.ubuntu
).
Nastavení výchozího hesla uživatele
Chcete-li nastavit heslo uživatele, přidejte -p "$(openssl passwd -1 ubuntu)"
na useradd
příkaz.
Případně přidejte do Dockerfile
následující řádky :
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN echo 'ubuntu:ubuntu' | chpasswd
První instrukce shellu je ujistit se, že -o pipefail
možnost je povolena před RUN
s trubkou v něm. Přečtěte si více:Hadolint:Linting your Dockerfile.
Abyste se vyhnuli interaktivním otázkám uživatele adduser, můžete to volat s těmito parametry:
RUN adduser --disabled-password --gecos '' newuser
--gecos
Parametr se používá k nastavení doplňkových informací. V tomto případě je pouze prázdný.
Na systémech s busyboxem (jako Alpine) použijte
RUN adduser -D -g '' newuser
Viz busybox adduser