L'astuce consiste à utiliser useradd
au lieu de son wrapper interactif adduser
.Je crée généralement des utilisateurs avec :
RUN useradd -ms /bin/bash newuser
qui crée un répertoire personnel pour l'utilisateur et garantit que bash est le shell par défaut.
Vous pouvez ensuite ajouter :
USER newuser
WORKDIR /home/newuser
à votre dockerfile. Chaque commande ultérieure ainsi que les sessions interactives seront exécutées en tant qu'utilisateur newuser
:
docker run -t -i image
[email protected]:~$
Vous devrez peut-être donner newuser
les autorisations d'exécuter les programmes que vous avez l'intention d'exécuter avant d'invoquer la commande utilisateur.
L'utilisation d'utilisateurs non privilégiés à l'intérieur des conteneurs est une bonne idée pour des raisons de sécurité. Il a aussi quelques inconvénients. Plus important encore, les personnes dérivant des images de votre image devront revenir à la racine avant de pouvoir exécuter des commandes avec des privilèges de superutilisateur.
Ajouter un utilisateur dans Docker et exécuter votre application sous cet utilisateur est une très bonne pratique du point de vue de la sécurité. Pour ce faire, je recommanderais les étapes ci-dessous :
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"]
Les étapes ci-dessus sont un exemple complet de copie de fichiers de projet NodeJS, de création d'un groupe d'utilisateurs et d'un utilisateur, d'attribution d'autorisations à l'utilisateur pour le dossier de projet, de basculement vers l'utilisateur nouvellement créé et d'exécution de l'application sous cet utilisateur.
Ubuntu
Essayez les lignes suivantes en Dockerfile
:
RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G sudo -u 1001 ubuntu
USER ubuntu
WORKDIR /home/ubuntu
useradd
options (voir :man useradd
):
-r
,--system
Créez un compte système.-m
,--create-home
Créez le répertoire personnel de l'utilisateur.-d
,--home-dir HOME_DIR
Répertoire d'accueil du nouveau compte.-s
,--shell SHELL
Shell de connexion du nouveau compte.-g
,--gid GROUP
Nom ou ID du groupe principal.-G
,--groups GROUPS
Liste des groupes supplémentaires.-u
,--uid UID
Spécifiez l'ID utilisateur.-p
,--password PASSWORD
Mot de passe crypté du nouveau compte (ex.ubuntu
).
Définir le mot de passe de l'utilisateur par défaut
Pour définir le mot de passe de l'utilisateur, ajoutez -p "$(openssl passwd -1 ubuntu)"
à useradd
commande.
Vous pouvez également ajouter les lignes suivantes à votre Dockerfile
:
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN echo 'ubuntu:ubuntu' | chpasswd
La première instruction shell est de s'assurer que -o pipefail
l'option est activée avant RUN
avec un tuyau dedans. En savoir plus :Hadolint :peluchez votre Dockerfile.
Pour éviter les questions interactives par adduser, vous pouvez l'appeler avec ces paramètres :
RUN adduser --disabled-password --gecos '' newuser
Le --gecos
Le paramètre est utilisé pour définir les informations supplémentaires. Dans ce cas, il est simplement vide.
Sur les systèmes avec busybox (comme Alpine), utilisez
RUN adduser -D -g '' newuser
Voir l'utilisateur adduser de la boîte occupée