Utilisateur dans Docker

Andrei Kopylov, 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 node

Pour 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 2000

Pour exécuter tous les processus suivants sous l'utilisateur node, exécutez :

USER node

Plus de détails dans documentation.

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 :

id

Vous 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 shadow

Transmission 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 ENV et 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

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

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster