, notre directeur technique, aime, utilise activement et promeut Docker. Dans son nouvel article, il explique comment créer des utilisateurs dans Docker. Le bon fonctionnement avec eux, pourquoi les utilisateurs ne doivent pas avoir de droits root et comment résoudre le problème des incohérences dans le Dockerfile.
Tous les processus dans le conteneur fonctionneront sous l'utilisateur root, à moins qu'il ne soit spécifié autrement. Cela semble très pratique, car cet utilisateur n'a aucune restriction. C'est pourquoi travailler sous root est incorrect du point de vue de la sécurité. Si personne ne travaille avec des droits root sur un ordinateur local, beaucoup lancent des processus sous root dans des conteneurs.
Il y a toujours des bogues qui permettront à un logiciel malveillant de sortir du conteneur et d'atteindre l'ordinateur hôte. En présumant le pire, nous devons garantir que les processus à l'intérieur du conteneur s'exécutent avec un utilisateur qui n'a aucun droit sur la machine hôte.
Création d'un utilisateur
La création d'un utilisateur dans un conteneur ne diffère pas de celle dans les distributions Linux. Cependant, pour différents images de base, les commandes peuvent varier.
Pour les distributions basées sur debian, il faut ajouter dans le Dockerfile :
RUN groupadd --gid 2000 node
&& useradd --uid 2000 --gid node --shell /bin/bash --create-home nodePour alpine :
RUN addgroup -g 2000 node
&& adduser -u 2000 -G node -s /bin/sh -D node
Exécution des processus sous utilisateur
Pour exécuter tous les processus suivants sous l'utilisateur avec l'UID 2000, exécutez :
USER 2000Pour exécuter tous les processus suivants sous l'utilisateur node, exécutez :
USER nodePlus de détails dans .
Montage des volumes
Lors du montage des volumes à l'intérieur du conteneur, assurez-vous que l'utilisateur puisse lire et (ou) écrire des fichiers. Pour cela, l'UID (GID) de l'utilisateur dans le conteneur et de l'utilisateur à l'extérieur du conteneur, ayant les droits d'accès correspondants, doivent correspondre. Les noms d'utilisateur n'ont pas d'importance.
Souvent, sur un ordinateur Linux, l'utilisateur a des UID et GID égaux à 1000. Ces identifiants sont attribués au premier utilisateur de l'ordinateur.
Pour connaître vos identifiants, c'est simple :
idVous aurez des informations complètes sur votre utilisateur.
Remplacez 2000 dans les exemples par votre identifiant et tout sera en ordre.
Attribution d'un UID et d'un GID à l'utilisateur
Si l'utilisateur a été créé précédemment, mais que les identifiants doivent être modifiés, cela peut être fait comme suit :
RUN usermod -u 1000 node
&& groupmod -g 1000 node
Si vous utilisez l'image de base alpine, il est nécessaire d'installer le paquet shadow :
RUN apk add —no-cache shadowTransmission de l'identifiant utilisateur à l'intérieur du conteneur lors de la construction de l'image
Si votre identifiant et ceux de toutes les personnes travaillant sur le projet correspondent, il suffit d'indiquer cet identifiant dans le Dockerfile. Cependant, il arrive souvent que les identifiants des utilisateurs ne correspondent pas.
Comment réaliser cela n'est pas immédiatement évident. Pour moi, c'était la partie la plus difficile dans le processus d'apprentissage de Docker. De nombreux utilisateurs de Docker ne réalisent pas qu'il y a différentes étapes dans la vie d'une image. D'abord, l'image est construite, pour cela on utilise le Dockerfile. Lors du lancement d'un conteneur à partir de l'image, le Dockerfile n'est plus utilisé.
La création d'utilisateurs doit se faire lors de la construction de l'image. Cela s'applique également à la définition de l'utilisateur sous lequel les processus sont lancés. Cela signifie que nous devons d'une manière ou d'une autre transmettre l'UID (GID) à l'intérieur du conteneur.
Les directives pour utiliser des variables externes dans le Dockerfile sont et . Comparaison détaillée des directives .
Dockerfile
ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node
&& groupmod -g $GID node
Pour transmettre des arguments via docker-compose, vous pouvez faire ainsi :
docker-compose
build:
context: ./src/backend
args:
UID: 1000
GID: 1000
P.S. Pour maîtriser tous les subtilités de Docker, il ne suffit pas de lire la documentation ou des articles. Il faut beaucoup pratiquer, il faut se familiariser avec Docker.
Source : habr.com
