Andrey Kopylov , notre directeur technique, aime, utilise activement et promeut Docker. Dans un nouvel article, il explique comment créer des utilisateurs dans Docker. Travaillez correctement avec eux, pourquoi les utilisateurs ne peuvent pas se retrouver avec des droits root et comment résoudre le problème de non-correspondance des identifiants dans le Dockerfile.
Tous les processus dans le conteneur s'exécuteront en tant que root, sauf indication contraire d'une manière spéciale. Cela semble très pratique, car cet utilisateur n'a aucune restriction. C'est pourquoi travailler sous la racine est faux du point de vue de la sécurité. Si sur l'ordinateur local, personne de bon sens ne travaille avec les droits root, alors beaucoup démarrent des processus sous la racine dans des conteneurs.
Il y a toujours des bogues qui permettent au malware de sortir du conteneur et d'accéder à l'ordinateur hôte. En supposant le pire, nous devons nous assurer que les processus sont démarrés à l'intérieur du conteneur à partir d'un utilisateur qui n'a aucun droit sur la machine hôte.
Création d'utilisateurs
La création d'un utilisateur dans un conteneur n'est pas différente de sa création dans les distributions Linux. Cependant, pour différentes images de base, les équipes peuvent varier.
Pour les distributions basées sur Debian dans le Dockerfile, vous devez ajouter:
RUN groupadd --gid 2000 node \ && useradd --uid 2000 --gid node --shell /bin/bash --create-home node
Pour alpin:
RUN addgroup -g 2000 node \ && adduser -u 2000 -G node -s /bin/sh -D node
Démarrage des processus depuis l'utilisateur
Pour démarrer tous les processus suivants à partir d'un utilisateur avec UID 2000, exécutez:
USER 2000
Pour démarrer tous les processus suivants à partir du nœud utilisateur, exécutez:
USER node
Plus de détails dans la documentation .
Monter les volumes
Lors du montage de volumes à l'intérieur d'un conteneur, donnez à l'utilisateur la possibilité de lire et / ou d'écrire des fichiers. Pour cela, l'UID (GID) de l'utilisateur dans le conteneur et de l'utilisateur en dehors du conteneur qui dispose des droits d'accès appropriés au fichier doit correspondre. Dans le même temps, les noms d'utilisateur n'ont pas d'importance.
Souvent sur un ordinateur Linux, l'UID et le GID de l'utilisateur sont 1000. Ces identifiants sont attribués au premier utilisateur de l'ordinateur.
Obtenir vos identifiants est facile:
id
Vous recevrez des informations complètes sur votre utilisateur.
Remplacez 2000 des exemples par votre identifiant et tout ira bien.
Attribuer l'UID et le GID de l'utilisateur
Si l'utilisateur a été créé plus tôt, mais qu'il est nécessaire de changer les identifiants, vous pouvez le faire comme ceci:
RUN usermod -u 1000 node \ && groupmod -g 1000 node
Si vous utilisez l'image alpine de base, vous devez installer le package shadow:
RUN apk add —no-cache shadow
Passer l'ID utilisateur à l'intérieur du conteneur lors de la construction de l'image
Si votre identifiant et les identifiants de toutes les personnes qui travaillent sur le projet sont les mêmes, spécifiez simplement cet identifiant dans le Dockerfile. Cependant, souvent, les identifiants des utilisateurs ne correspondent pas.
Comment réaliser le désir n'est pas immédiatement clair. Pour moi, ce fut le plus difficile dans le processus de mastering docker. De nombreux utilisateurs de dockers ne pensent pas qu'il existe différentes étapes dans la vie d'une image. Tout d'abord, l'image est collectée pour cela à l'aide du Dockerfile. Lors du démarrage d'un conteneur à partir d'une image Dockerfile, il n'est plus utilisé.
La création d'utilisateurs doit se produire lors de la création de l'image. Il en va de même pour la définition d'utilisateur à partir de laquelle les processus sont lancés. Cela signifie que nous devons en quelque sorte passer l'UID (GID) dans le conteneur.
Les directives ENV et ARG sont utilisées pour utiliser des variables externes dans le Dockerfile. Une comparaison détaillée des directives est ici .
Dockerfile
ARG UID=1000 ARG GID=1000 ENV UID=${UID} ENV GID=${GID} RUN usermod -u $UID node \ && groupmod -g $GID node
Vous pouvez passer des arguments via docker-compose comme ceci:
docker-compose
build: context: ./src/backend args: UID: 1000 GID: 1000
PS Pour maîtriser toutes les astuces de docker, il ne suffit pas de lire la documentation ou les articles. Vous devez beaucoup vous entraîner, vous devez sentir le docker.