1029 votes

Comment puis-je utiliser Docker sans sudo ?

Sur les pages de documentation de Docker, toutes les commandes d'exemple sont présentées sans sudo comme celui-ci :

docker ps

Sur Ubuntu, le binaire s'appelle docker.io . Il ne fonctionne pas non plus sans sudo :

sudo docker.io ps

Comment puis-je configurer Docker de manière à ne pas devoir préfixer chaque commande Docker par sudo ?

1384voto

Rinzwind Points 270388

Bonne nouvelle : le nouveau docker (version 19.03 (actuellement expérimentale)) sera capable de fonctionner sans root, annulant les problèmes qui peuvent survenir en utilisant un utilisateur root. Plus besoin de jouer avec les permissions élevées, l'utilisateur root et tout ce qui peut ouvrir votre machine quand vous ne le souhaitez pas.

Vidéo sur ce site [DockerCon 2019] Durcissement du démon Docker avec le mode Rootless

Quelques mises en garde concernant le mode Docker sans racine

Les ingénieurs de Docker précisent que le mode sans racine ne peut pas être considéré comme un remplacement de l'ensemble des fonctionnalités du moteur Docker. Voici quelques limitations du mode sans racine :

  • Les contrôles de ressources cgroups, les profils de sécurité apparmor, les points de contrôle/restauration, les réseaux superposés, etc. ne fonctionnent pas en mode sans racine.
  • L'exposition des ports à partir de conteneurs nécessite actuellement un processus manuel d'aide socat.
  • Seules les distributions basées sur Ubuntu prennent en charge les systèmes de fichiers superposés en mode sans racine.
  • Le mode sans racine n'est actuellement fourni que pour les nightly builds qui peuvent ne pas être aussi stables que vous en avez l'habitude.

Depuis la version 19.3 de Docker, cette méthode est obsolète (et plus dangereuse que nécessaire) :

Les manuel docker s'exprime à ce sujet :

Donner un accès non root

Le démon docker s'exécute toujours en tant qu'utilisateur root, et depuis la version 0.5.2 de Docker, le démon docker se lie à un socket Unix au lieu d'un port TCP. Par défaut, ce socket Unix appartient à l'utilisateur root, et donc, par défaut, vous pouvez y accéder avec sudo.

À partir de la version 0.5.3, si vous (ou votre installateur Docker) créez un groupe Unix appelé docker et y ajoutez des utilisateurs, le démon docker rendra la propriété du socket Unix accessible en lecture/écriture au groupe docker lorsque le démon démarrera. Le démon docker doit toujours s'exécuter en tant qu'utilisateur root, mais si vous exécutez le client docker en tant qu'utilisateur du groupe docker, vous n'avez pas besoin d'ajouter sudo à toutes les commandes du client. Depuis la version 0.9.0, vous pouvez spécifier qu'un groupe autre que docker doit posséder le socket Unix avec l'option -G.

Avertissement : Le groupe docker (ou le groupe spécifié avec -G) est équivalent à la racine ; voir Détails de la surface d'attaque de Docker Daemon et ce billet de blog sur Pourquoi nous ne laissons pas les utilisateurs non root exécuter Docker sous CentOS, Fedora ou RHEL ? (merci michael-n).

Dans la récente publication de la mode expérimental sans racine sur GitHub Les ingénieurs mentionnent que le mode sans racine permet d'exécuter dockerd en tant qu'utilisateur non privilégié, en utilisant user_namespaces(7), mount_namespaces(7), network_namespaces(7).

Les utilisateurs doivent exécuter dockerd-rootless.sh au lieu de dockerd.

$ dockerd-rootless.sh --experimental

Le mode Rootless étant expérimental, les utilisateurs doivent toujours exécuter dockerd-rootless.sh avec -experimental.


Important à lire : étapes de post-installation pour Linux (il renvoie également à Détails de la surface d'attaque de Docker Daemon ).

Gérer Docker en tant qu'utilisateur non root

Le démon docker se lie à un socket Unix au lieu d'un port TCP. Par défaut, ce socket Unix appartient à l'utilisateur root et les autres utilisateurs ne peuvent y accéder qu'en utilisant sudo. Le démon docker s'exécute toujours en tant qu'utilisateur root.

Si vous ne souhaitez pas utiliser sudo lorsque vous utilisez la commande docker, créez un groupe Unix appelé docker et ajoutez-y des utilisateurs. Lorsque le démon docker démarre, il rend la propriété de la socket Unix accessible en lecture/écriture au groupe docker.


  • Ajouter le groupe docker s'il n'existe pas encore :

     sudo groupadd docker
  • Ajouter l'utilisateur connecté "$USER" au groupe docker. Changez le nom de l'utilisateur pour qu'il corresponde à votre utilisateur préféré si vous ne voulez pas utiliser votre utilisateur actuel :

     sudo gpasswd -a $USER docker
  • Soit faire un newgrp docker ou se déconnecter/se connecter pour activer les changements dans les groupes.

  • Vous pouvez utiliser

     docker run hello-world

    pour vérifier si vous pouvez exécuter docker sans sudo.

361voto

Martijn Points 1531

Pour exécuter la commande Docker sans sudo Pour cela, vous devez ajouter votre utilisateur (qui a les privilèges root) au groupe docker. Pour cela, exécutez la commande suivante :

 sudo usermod -aG docker $USER

Maintenant, demandez à l'utilisateur de se déconnecter puis de se reconnecter. Cette solution est bien expliquée ici avec un processus d'installation approprié.

127voto

Christian Hujer Points 1902

Le mécanisme par lequel l'ajout d'un utilisateur à un groupe docker accorde la permission d'exécuter docker est d'obtenir l'accès au socket de docker à /var/run/docker.sock . Si le système de fichiers qui contient /var/run a été monté avec des ACLs activés, ceci peut également être réalisé via des ACLs.

sudo setfacl -m user:$USER:rw /var/run/docker.sock

Je ne l'inclus que par souci d'exhaustivité.

En général, je recommande d'éviter les ACL lorsqu'il existe une bonne alternative basée sur les groupes : Il est préférable que les privilèges d'un système puissent être compris en examinant uniquement l'appartenance à un groupe. Il est préférable que les privilèges d'un système puissent être compris en examinant uniquement l'appartenance à un groupe. Le fait de devoir examiner le système de fichiers à la recherche d'entrées ACL pour comprendre les privilèges du système constitue une charge supplémentaire pour les audits de sécurité.

Avertissement 1 : Il s'agit de la même root l'équivalence comme l'ajout de $USER à la docker groupe. Vous pouvez toujours démarrer un conteneur d'une manière qui a root l'accès au système de fichiers de l'hôte.

Avertissement 2 : Les listes de contrôle d'accès (ACL) sont beaucoup plus difficiles à contrôler que la sécurité basée sur les groupes. Il est préférable d'éviter les ACL si possible lorsque vous pouvez utiliser des groupes à la place, du moins dans les environnements pertinents pour l'audit.

21voto

Aaron Points 11

Après avoir créé le groupe docker et y avoir ajouté mon utilisateur avec

sudo groupadd docker
sudo usermod -aG docker $USER

... Je devais encore donner au /var/run/docker.sock et /var/run/docker les autorisations nécessaires pour le faire fonctionner :

sudo chown root:docker /var/run/docker.sock
sudo chown -R root:docker /var/run/docker

Déconnectez-vous et reconnectez-vous (avec cet utilisateur), vous pourrez alors exécuter des commandes docker sans avoir besoin de sudo :

docker run hello-world

BTW : Ceci a été corrigé dans Ubuntu 21.10 et n'est nécessaire que pour les versions d'Ubuntu inférieures à celle-ci.

5voto

ostrokach Points 764

Les conteneurs Docker doivent être exécutés par un utilisateur root. Vous pouvez vous ajouter à la liste des utilisateurs docker (par exemple, en exécutant sudo usermod -aG docker $USER ), mais cela facilite la tâche de toute personne ayant accès à la base de données des $USER pour obtenir l'accès root à la machine (par exemple en montant un volume root dans un conteneur privilégié).

Un moyen plus sûr d'exécuter des conteneurs Docker en tant qu'utilisateur non root serait d'utiliser Podman : https://podman.io/ . Extrait de son site web :

Podman est un moteur de conteneur sans démon pour développer, gérer et exécuter des conteneurs OCI sur votre système Linux. Les conteneurs peuvent être exécutés en tant que root ou en tant que mode sans racine . C'est simple : alias docker=podman .

Une autre alternative est Singularity, qui est plus couramment déployée dans les environnements HPC : https://sylabs.io/ .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X