Utilisateur dans Docker

Andreï Kopylov, notre CTO, aime, utilise et promeut activement Docker. Dans un nouvel article, il explique comment créer des utilisateurs dans Docker. Travaillez correctement avec eux, pourquoi les utilisateurs ne devraient pas disposer des droits root et comment résoudre le problème des indicateurs incompatibles dans le Dockerfile.

Tous les processus du conteneur s'exécuteront en tant qu'utilisateur root, sauf si vous le spécifiez d'une manière spéciale. Cela semble très pratique, car cet utilisateur n'a aucune restriction. C'est pourquoi travailler en tant que root est une erreur du point de vue de la sécurité. Si aucune personne sensée ne travaille sur l’ordinateur local avec les droits root, beaucoup exécutent des processus sous root dans des conteneurs.

Il y a toujours des bugs qui permettront aux logiciels malveillants de s'échapper du conteneur et de pénétrer sur l'ordinateur hôte. En supposant le pire, nous devons nous assurer que les processus à l'intérieur du conteneur sont exécutés par un utilisateur qui n'a aucun droit sur la machine hôte.

Création d'un utilisateur

Créer un utilisateur dans un conteneur n'est pas différent de le créer dans les distributions Linux. Cependant, les commandes peuvent varier selon les images de base.

Pour les distributions basées sur Debian, vous devez ajouter les éléments suivants au Dockerfile :

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

Exécution de processus depuis l'utilisateur

Pour exécuter tous les processus suivants en tant qu'utilisateur avec l'UID 2000, exécutez :

USER 2000

Pour exécuter tous les processus suivants en tant qu'utilisateur du nœud, exécutez :

USER node

Plus en documentation.

Volumes de montage

Lors du montage de volumes dans un conteneur, offrez à l'utilisateur la possibilité de lire et/ou d'écrire des fichiers. Pour ce faire, l'UID (GID) de l'utilisateur dans le conteneur et de l'utilisateur en dehors du conteneur qui dispose des autorisations appropriées pour accéder au fichier doivent correspondre. Dans ce cas, les noms d’utilisateur n’ont pas d’importance.

Souvent sur un ordinateur Linux, l'UID et le GID d'un utilisateur sont égaux à 1000. Ces identifiants sont attribués au premier utilisateur de l'ordinateur.

Connaître vos identifiants est simple :

id

Vous recevrez des informations complètes sur votre utilisateur.
Remplacez 2000 des exemples par votre identifiant et tout ira bien.

Attribution d'un UID et d'un GID à un utilisateur

Si l'utilisateur a été créé précédemment, mais que vous devez modifier les identifiants, vous pouvez procéder comme ceci :

RUN usermod -u 1000 node 
  && groupmod -g 1000 node

Si vous utilisez l'image de base alpine, 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 correspondent, spécifiez simplement cet identifiant dans le Dockerfile. Cependant, il arrive souvent que les identifiants des utilisateurs ne correspondent pas.

Comment réaliser ce que vous voulez n’est pas immédiatement clair. Pour moi, c'était la chose la plus difficile dans le processus de maîtrise de Docker. De nombreux utilisateurs de Docker ne réalisent pas qu’il existe différentes étapes dans la vie d’une image. Tout d'abord, l'image est assemblée à l'aide d'un Dockerfile. Lors de l'exécution d'un conteneur à partir d'une image, le Dockerfile n'est plus utilisé.

La création de l'utilisateur doit avoir lieu lors de la création de l'image. Il en va de même pour déterminer 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 sont utilisées pour utiliser des variables externes dans le Dockerfile ENV и ARG. Comparaison détaillée des directives 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 transmettre des arguments via docker-compose comme ceci :

docker-compose

build:
  context: ./src/backend
  args:
    UID: 1000
    GID: 1000

PS Pour maîtriser toutes les subtilités de Docker, il ne suffit pas de lire la documentation ou les articles. Vous devez vous entraîner beaucoup, vous devez avoir une idée de Docker.

Source: habr.com

Ajouter un commentaire