Comment accorder des privilèges précis aux utilisateurs non-root dans Docker

DockerDockerBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Docker est une puissante plateforme de conteneurisation qui a révolutionné la façon dont les applications sont développées, déployées et gérées. Cependant, exécuter des conteneurs Docker en tant qu'utilisateur root peut présenter des risques pour la sécurité. Ce tutoriel vous guidera tout au long du processus d'octroi de privilèges précis aux utilisateurs non-root dans Docker, leur permettant d'effectuer des tâches spécifiques sans compromettre la sécurité globale du système.

Comprendre les privilèges utilisateur Docker

Les conteneurs Docker sont conçus pour s'exécuter par défaut en tant qu'utilisateurs non privilégiés, ce qui contribue à améliorer la sécurité globale du système. Cependant, il peut y avoir des scénarios où vous devez accorder des autorisations précises aux utilisateurs non-root à l'intérieur d'un conteneur Docker pour effectuer des tâches spécifiques.

Privilèges utilisateur par défaut dans Docker

Par défaut, les conteneurs Docker s'exécutent en tant qu'utilisateur root, qui dispose du niveau de privilèges le plus élevé à l'intérieur du conteneur. Cela peut constituer un risque pour la sécurité, car toute vulnérabilité ou activité malveillante à l'intérieur du conteneur pourrait potentiellement affecter le système hôte.

Pour atténuer ce risque, Docker recommande d'exécuter les conteneurs en tant qu'utilisateurs non-root. Vous pouvez le faire en spécifiant un utilisateur dans le Dockerfile ou en utilisant le flag --user lors de l'exécution d'un conteneur.

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
USER myuser
## Exécuter le conteneur en tant qu'utilisateur non-root
docker run -it --user myuser ubuntu:22.04 bash

Comprendre les espaces de noms utilisateur

Docker utilise les espaces de noms utilisateur (user namespaces) pour fournir une couche supplémentaire d'isolement et de sécurité pour les utilisateurs non-root à l'intérieur d'un conteneur. Les espaces de noms utilisateur vous permettent de mapper les identifiants d'utilisateur et de groupe du conteneur à des identifiants différents sur le système hôte, créant ainsi un espace utilisateur distinct pour le conteneur.

graph TD A[Hôte] --> B[Conteneur] B[Conteneur] --> C[Identifiant utilisateur mappé] B[Conteneur] --> D[Identifiant de groupe mappé]

Ce mappage garantit que même si un utilisateur non-root à l'intérieur du conteneur dispose de privilèges élevés, il ne peut pas affecter le système hôte ou d'autres conteneurs s'exécutant sur le même hôte.

Vérifier les privilèges utilisateur

Vous pouvez utiliser la commande id à l'intérieur du conteneur pour vérifier les identifiants d'utilisateur et de groupe auxquels l'utilisateur actuel a été mappé :

$ id
uid=1000(myuser) gid=1000(myuser) groups=1000(myuser),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lxd),128(systemd-journal),129(systemd-journal-gateway)

Cette sortie montre que l'utilisateur myuser a été mappé à un identifiant d'utilisateur 1000 et à un identifiant de groupe 1000 à l'intérieur du conteneur.

Attribution de permissions précises aux utilisateurs non-root

Bien que l'exécution de conteneurs en tant qu'utilisateurs non-root soit une bonne pratique de sécurité, il peut y avoir des cas où vous devez accorder des permissions spécifiques à ces utilisateurs pour effectuer certaines tâches. Docker propose plusieurs méthodes pour attribuer des permissions précises aux utilisateurs non-root à l'intérieur d'un conteneur.

Utilisation des flags --cap-add et --cap-drop

Docker prend en charge l'utilisation des capacités Linux (Linux capabilities), qui vous permettent d'accorder ou de révoquer des privilèges spécifiques à un utilisateur ou à un processus. Vous pouvez utiliser les flags --cap-add et --cap-drop lors de l'exécution d'un conteneur pour ajouter ou supprimer des capacités pour l'utilisateur non-root.

## Accorder la capacité "CAP_SYS_ADMIN" à l'utilisateur non-root
docker run -it --user myuser --cap-add=SYS_ADMIN ubuntu:22.04 bash

## Supprimer la capacité "CAP_CHOWN" de l'utilisateur non-root
docker run -it --user myuser --cap-drop=CHOWN ubuntu:22.04 bash

Montage de volumes avec des permissions spécifiques

Vous pouvez également accorder des permissions précises aux utilisateurs non-root en montant des volumes avec une propriété et des permissions spécifiques. Cela vous permet de contrôler les droits d'accès de l'utilisateur non-root à l'intérieur du conteneur.

## Monter un volume avec des permissions spécifiques
docker run -it --user myuser -v /path/on/host:/path/in/container:rw,uid=1000,gid=1000 ubuntu:22.04 bash

Dans cet exemple, le volume monté est accessible par l'utilisateur non-root avec un identifiant d'utilisateur 1000 et un identifiant de groupe 1000.

Utilisation du flag --group-add

Si l'utilisateur non-root doit effectuer des tâches qui nécessitent l'appartenance à des groupes spécifiques, vous pouvez utiliser le flag --group-add pour ajouter l'utilisateur à des groupes supplémentaires à l'intérieur du conteneur.

## Ajouter l'utilisateur non-root au groupe "docker"
docker run -it --user myuser --group-add docker ubuntu:22.04 bash

Cela permet à l'utilisateur non-root d'effectuer des tâches qui nécessitent l'appartenance au groupe "docker", comme interagir avec le démon Docker.

Personnalisation du Dockerfile

Vous pouvez également personnaliser le Dockerfile pour créer un utilisateur non-root avec des permissions et des appartenances à des groupes spécifiques. Cela garantit que l'utilisateur non-root dispose des privilèges nécessaires pour effectuer ses tâches à l'intérieur du conteneur.

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN usermod -aG docker myuser
USER myuser

Ce Dockerfile crée un utilisateur non-root nommé myuser et l'ajoute au groupe "docker", lui permettant d'interagir avec le démon Docker.

Cas d'utilisation pratiques et exemples

L'attribution de permissions précises aux utilisateurs non-root dans Docker peut être bénéfique dans diverses situations. Voici quelques cas d'utilisation pratiques et exemples :

Scénario 1 : Exécution d'un serveur web

Supposons que vous ayez une application web s'exécutant dans un conteneur Docker, et que vous souhaitiez que l'utilisateur non-root ait les permissions nécessaires pour démarrer et gérer le processus du serveur web.

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN apt-get update && apt-get install -y nginx
RUN chown -R myuser:myuser /var/www/html
USER myuser
CMD ["nginx", "-g", "daemon off;"]

Dans cet exemple, l'utilisateur non-root myuser est propriétaire du répertoire /var/www/html, qui est l'emplacement par défaut du serveur web Nginx. Cela permet à l'utilisateur non-root de démarrer et de gérer le processus Nginx à l'intérieur du conteneur.

Scénario 2 : Accès à des fichiers sensibles

Si votre conteneur a besoin d'accéder à des fichiers ou des répertoires sensibles, vous pouvez accorder à l'utilisateur non-root les permissions nécessaires pour lire ou écrire dans ces emplacements.

## Exécuter le conteneur avec des permissions de volume spécifiques
docker run -it --user myuser -v /path/to/sensitive/files:/sensitive:rw,uid=1000,gid=1000 ubuntu:22.04 bash

Dans cet exemple, l'utilisateur non-root avec un identifiant d'utilisateur 1000 et un identifiant de groupe 1000 a accès en lecture et en écriture au répertoire /path/to/sensitive/files à l'intérieur du conteneur.

Scénario 3 : Interaction avec le démon Docker

Si votre utilisateur non-root a besoin d'interagir avec le démon Docker, vous pouvez l'ajouter au groupe "docker" à l'intérieur du conteneur.

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN usermod -aG docker myuser
USER myuser

Ce Dockerfile crée un utilisateur non-root nommé myuser et l'ajoute au groupe "docker", lui permettant d'effectuer des tâches liées à Docker, comme construire et gérer des conteneurs.

Scénario 4 : Exécution de commandes privilégiées

Dans certains cas, votre utilisateur non-root peut avoir besoin d'exécuter des commandes privilégiées qui nécessitent des capacités spécifiques. Vous pouvez utiliser le flag --cap-add pour accorder les capacités nécessaires à l'utilisateur non-root.

## Exécuter le conteneur avec une capacité spécifique
docker run -it --user myuser --cap-add=SYS_ADMIN ubuntu:22.04 bash

Dans cet exemple, l'utilisateur non-root est doté de la capacité "CAP_SYS_ADMIN", qui lui permet d'effectuer des tâches d'administration système nécessitant des privilèges élevés.

En comprenant ces cas d'utilisation pratiques et exemples, vous pouvez attribuer efficacement des permissions précises aux utilisateurs non-root dans Docker, en vous assurant qu'ils ont l'accès nécessaire pour effectuer leurs tâches tout en maintenant un environnement sécurisé et isolé.

Résumé

Dans ce tutoriel complet sur Docker, vous apprendrez à attribuer des permissions précises aux utilisateurs non-root, leur permettant d'interagir avec les conteneurs et les ressources Docker sans élever leurs privilèges. En comprenant les principes des privilèges utilisateur dans Docker et en explorant des cas d'utilisation pratiques, vous pourrez mettre en place un environnement Docker plus sûr et plus efficace, adapté aux besoins de votre organisation.