J'ai un conteneur docker avec certains processus (uwsgi et céleri) en cours d'exécution à l'intérieur. Je souhaite créer un utilisateur céleri et un utilisateur uwsgi pour ces processus, ainsi qu'un groupe de travailleurs auquel ils appartiendront tous les deux, afin d'attribuer des autorisations.
J'ai essayé d'ajouter RUN adduser uwsgi
et RUN adduser celery
à mon fichier Docker, mais cela pose problème, car ces commandes demandent une entrée (j'ai posté les réponses de la construction ci-dessous).
Quel est le meilleur moyen d'ajouter des utilisateurs à un conteneur Docker afin de définir des autorisations pour les travailleurs s'exécutant dans le conteneur?
Mon image Docker est construite à partir de la base officielle Ubuntu14.04.
Voici la sortie du fichier Dockerfile lorsque les commandes adduser sont exécutées:
Adding user `uwsgi' ...
Adding new group `uwsgi' (1000) ...
Adding new user `uwsgi' (1000) with group `uwsgi' ...
Creating home directory `/home/uwsgi' ...
Copying files from `/etc/skel' ...
[91mEnter new UNIX password: Retype new UNIX password: [0m
[91mpasswd: Authentication token manipulation error
passwd: password unchanged
[0m
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 563.
[0m
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 564.
[0m
Try again? [y/N]
Changing the user information for uwsgi
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []: Work Phone []: Home Phone []: Other []:
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 589.
[0m
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 590.
[0m
Is the information correct? [Y/n]
---> 258f2f2f13df
Removing intermediate container 59948863162a
Step 5 : RUN adduser celery
---> Running in be06f1e20f64
Adding user `celery' ...
Adding new group `celery' (1001) ...
Adding new user `celery' (1001) with group `celery' ...
Creating home directory `/home/celery' ...
Copying files from `/etc/skel' ...
[91mEnter new UNIX password: Retype new UNIX password: [0m
[91mpasswd: Authentication token manipulation error
passwd: password unchanged
[0m
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 563.
[0m
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 564.
[0m
Try again? [y/N]
Changing the user information for celery
Enter the new value, or press ENTER for the default
Full Name []: Room Number []: Work Phone []:
Home Phone []: Other []:
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 589.
[0m
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 590.
[0m
Is the information correct? [Y/n]
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 fichier docker. Toutes les commandes et les sessions interactives seront ensuite exécutées en tant qu’utilisateur newuser
:
docker run -t -i image
newuser@131b7ad86360:~$
Vous devrez peut-être donner à newuser
les autorisations pour exécuter les programmes que vous avez l'intention d'exécuter avant d'appeler la commande utilisateur.
L'utilisation d'utilisateurs non privilégiés à l'intérieur de conteneurs est une bonne idée pour des raisons de sécurité. Il présente également quelques inconvénients. Plus important encore, les personnes générant des images à partir de votre image devront revenir à la racine avant de pouvoir exécuter des commandes avec les privilèges de superutilisateur.
Pour éviter les questions interactives de adduser, vous pouvez l'appeler avec ces paramètres:
RUN adduser --disabled-password --gecos '' newuser
Le paramètre --gecos
est utilisé pour définir les informations supplémentaires. Dans ce cas, il est juste vide.
Sur les systèmes avec busybox (comme Alpine), utilisez
RUN adduser -D -g '' newuser
Voir busybox adduser
Essayez les lignes suivantes dans Dockerfile
:
RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G Sudo -u 1000 ubuntu
USER ubuntu
WORKDIR /home/ubuntu
useradd
options (voir: man useradd
):
-r
, --system
Créez un compte système. voir: Implications créer comptes système-m
, --create-home
Créez le répertoire de base de l'utilisateur.-d
, --home-dir HOME_DIR
Répertoire de base du nouveau compte.-s
, --Shell SHELL
Login Shell du nouveau compte.-g
, --gid GROUP
Nom ou identifiant du groupe principal.-G
, --groups GROUPS
Liste des groupes supplémentaires.-u
, --uid UID
Spécifiez l'ID utilisateur. voir: Comprendre comment uid et gid fonctionnent dans les conteneurs Docker-p
, --password PASSWORD
Mot de passe crypté du nouveau compte (par exemple, ubuntu
).
Pour définir le mot de passe, ajoutez: -p "$(openssl passwd -1 ubuntu)"
à la commande ci-dessus.
Ajoutez cette ligne à votre fichier Docker (vous pouvez exécuter n'importe quelle commande linux de cette façon)
RUN useradd -ms /bin/bash yourNewUserName
Vous pouvez imiter un fichier Dockerfile open source, par exemple:
Node: node12-github
RUN groupadd --gid 1000 node \
&& useradd --uid 1000 --gid node --Shell /bin/bash --create-home node
sur-ensemble: sur-ensemble-github
RUN useradd --user-group --create-home --no-log-init --Shell /bin/bash
superset
Je pense que c'est un bon moyen de suivre l'open source.
Tout le monde a son préféré, et c'est le mien:
RUN useradd --user-group --system --create-home --no-log-init app
USER app
Référence: man useradd
La ligne RUN
ajoutera l'utilisateur et le groupe app
:
root@ef3e54b60048:/# id app
uid=999(app) gid=999(app) groups=999(app)
Utilisez un nom plus spécifique que app
si l'image doit être réutilisée comme image de base. De plus, incluez --Shell /bin/bash
si vous en avez vraiment besoin.
Crédit partiel: réponse de Ryan M
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 suivantes:
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, création d'un groupe d'utilisateurs et d'un utilisateur, attribution d'autorisations à l'utilisateur pour le dossier de projet, passage au nouvel utilisateur créé et exécution de l'application sous cet utilisateur.