Comment utiliser docker sans sudo?

767

Dans les pages de documentation de Docker, tous les exemples de commandes sont présentés sans sudo, comme celui-ci:

docker ps

Sur Ubuntu, le binaire est appelé docker.io. Cela ne fonctionne pas non plus sans sudo:

sudo docker.io ps

Comment puis-je configurer Docker pour qu'il ne soit pas nécessaire de préfixer chaque commande Docker avec sudo?

Flimm
la source
1
N'oubliez pas d'activer ufw;)
Rinzwind
2
Sur Ubuntu 14.04, il y a aussi le binaire 'docker'.
anatoly techtonik
@anatolytechtonik J'ai aussi utilisé 'docker' au lieu de 'docker.io' dans Ubuntu 14.04 LTS
Nabin le
2
L'installation recommandée n'est pas le menu fixe dans le dépôt par défaut d'ubuntu; Au lieu de cela, les instructions ici ( docs.docker.com/engine/installation/linux/ubuntulinux ), recommandent l’utilisation du référentiel de docker. Retirez tous les trucs de docker existants, et vérifiez que vous obtenez celui de la bonne source: apt-cache policy docker-engine(apt url devrait être de dockerproject.org)
michael
2
Que diriez-vous d'un alias :? De cette façon, vous utilisez toujours sudo, avec protection par mot de passe. alias docker = "sudo docker"
Andrej Panjkov

Réponses:

1136

Bonne nouvelle: le nouveau menu fixe (version 19.03 (actuellement expérimentale)) sera capable d'exécuter sans racine la résolution des problèmes pouvant survenir avec un utilisateur root. Plus besoin de jouer avec les autorisations élevées, les droits root et tout ce qui pourrait ouvrir votre ordinateur lorsque vous ne le souhaitez pas.

Vidéo à ce sujet de [DockerCon 2019] Renforcement du démon Docker avec mode sans racine

Quelques mises en garde au mode Docker sans racine

Les ingénieurs Docker disent que le mode sans racine ne peut pas être considéré comme un remplacement de la suite complète des fonctionnalités du moteur Docker. Certaines limitations au mode sans racine incluent:

  • 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 des 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 racines est actuellement fourni uniquement pour les générations nocturnes qui peuvent ne pas être aussi stables que vous êtes habitué.

À partir du docker 19.3, ceci est obsolète (et plus dangereux que nécessaire):

Le manuel de docker a ceci à dire à 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, il se lie à un socket Unix au lieu d'un port TCP. Par défaut, ce socket Unix appartient à l'utilisateur root et vous pouvez donc y accéder par défaut avec sudo.

A 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é de la socket Unix en lecture / écriture par le groupe docker au démarrage du démon. . Le démon docker doit toujours être exécuté en tant qu'utilisateur root, mais si vous exécutez le client docker en tant qu'utilisateur du groupe de menus, vous n'avez pas besoin d'ajouter sudo à toutes les commandes du client. À partir de la version 0.9.0, vous pouvez spécifier qu'un groupe autre que le menu fixe doit posséder le socket Unix avec l'option -G.

Avertissement: le groupe de menus fixe (ou le groupe spécifié avec -G) est équivalent à la racine; voir Détails de la surface d'attaque du démon Docker et cet article de blog sur Pourquoi ne permettons-nous pas à des utilisateurs non root d'exécuter Docker dans CentOS, Fedora ou RHEL (merci, michael-n).

Dans la récente version du mode sans racine expérimental sur GitHub , les ingénieurs mentionnent que ce mode permet d’exécuter dockerd en tant qu’utilisateur non privilégié, à l’aide des noms d’espaces utilisateur (7), d’espaces de noms de montagnes (7) et (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 contient également des liens vers les détails de Docker Daemon Attack Surface ).

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 est toujours exécuté 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-lui des utilisateurs. Lorsque le démon docker démarre, il rend la propriété du socket Unix accessible en lecture / écriture au groupe de docker.


  • Ajoutez le groupe de dockers s'il n'existe pas déjà:

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

    sudo gpasswd -a $USER docker
    
  • Faites un newgrp dockerou connectez-vous / déconnectez-vous pour activer les modifications apportées aux groupes.

  • Vous pouvez utiliser

    docker run hello-world
    

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

Rinzwind
la source
3
Oui, mais chaque processus privilégié ouvre un potentiel d’exploitation. Est-ce que docker est vraiment connecté au système d'exploitation pour imposer ce niveau de privilèges?
Matt
3
newgrp dockern'a pas fonctionné pour moi, j'ai dû me déconnecter.
lolmaus - Andrey Mikhaylov
43
Il convient de noter que cela donne à cet utilisateur un accès root non restreint, non protégé par mot de passe . Voir le détail de la vulnérabilité ici
Chris Foster le
2
vous n'avez PAS besoin de redémarrer le démon docker pour que cette modification ait lieu !! il suffit que l'utilisateur que vous venez d'ajouter se déconnecte puis se reconnecte
Tommy
4
si vous utilisez docker login, vous pouvez trouver que le .dockerdossier créé dans votre dossier personnel appartient à root. ainsi vous rencontrer cet avertissement lors de l' exécution des commandes de docker: WARNING: Error loading config file:/home/myuser/.docker/config.json - stat /home/myuser/.docker/config.json: permission denied. J'ai fait mon utilisateur .dockerdossier accessible sans sudo comme ceci: sudo chgrp -hR docker ~/.docker && sudo chown -R myuser ~/.docker. le chgrpne semble pas aider, donc probablement que je devrais recommander que l'étape chown.
Birchlabs
202

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

 sudo usermod -aG docker $USER

Maintenant, demandez à l'utilisateur de se déconnecter, puis reconnectez-vous. Cette solution est bien expliquée ici avec le processus d’installation approprié.

Rohini Choudhary
la source
14
après avoir ajouté un utilisateur au groupe, exécutez la commande suivante: sg nom_groupe -c "bash"
madjardi le
4
vous n'avez pas besoin de redémarrer le système d'exploitation pour que cette modification ait lieu! Cela va bombarder tous les conteneurs en cours d'exécution! Demandez à l'utilisateur que vous venez d'ajouter de vous connecter puis de vous déconnecter.
Tommy
5
Quelle est la différence entre cette commande et "sudo gpasswd -a $ {USER} docker" dans une autre réponse? Si du tout ...
Ashley Aitken
9
Pourriez-vous s'il vous plaît ajouter l'avertissement donné par les docs: "Le groupe de dockers [...] est équivalent à la racine", afin que les gens aient la chance d'y penser
Murmel le
2
Même effet que la réponse acceptée âgée de 2 ans, mais sans les avertissements concernant les risques pour la sécurité
Gert van den Berg
57

Le mécanisme par lequel l’ajout d’un utilisateur au groupe dockeraccorde l’autorisation d’exécuter le menu fixe consiste à accéder au socket du menu fixe à /var/run/docker.sock. Si le système de fichiers qui le contient /var/runa été monté avec les ACL activées, ceci peut également être réalisé via les ACL.

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

Je ne fais que l'inclure par souci de complétude.

En général, je recommande d'éviter les listes de contrôle d'accès chaque fois qu'une bonne alternative basée sur des groupes est disponible: il est préférable que les privilèges d'un système puissent être compris en ne regardant que les appartenances à un groupe. Le fait d'analyser le système de fichiers à la recherche d'entrées dans la liste de contrôle d'accès afin de comprendre les privilèges système constitue un fardeau supplémentaire pour les audits de sécurité.

Avertissement 1 : Ceci a la même rootéquivalence que l'ajout usernameau dockergroupe. Vous pouvez toujours démarrer un conteneur de manière à avoir rootaccès au système de fichiers hôte.

Avertissement 2 : Les listes de contrôle d'accès sont beaucoup plus difficiles pour les audits de sécurité que la sécurité basée sur le groupe. Évitez probablement les ACL si possible lorsque vous pouvez utiliser des groupes, au moins dans des environnements pertinents pour l'audit.

Christian Hujer
la source
5
Cela a fonctionné sur 16.04
edib
C’est ce dont j’avais besoin. D’autres réponses exigent que l’utilisateur ait l’autorisation root. Merci beaucoup!
Mrinal Saurabh
1
Bien meilleur moyen imo. Le groupe docker est équivalent à la racine et c'est toujours un signe de danger. Et je ne vois aucun inconvénient à prendre possession de ce seul fichier.
Xerus
5
@Xerus si je comprends bien, quiconque peut écrire dans ce socket peut également obtenir des privilèges équivalents . Donc, donner à quelqu'un l'accès à ce socket via ACL a le même effet de sécurité que l'ajout de cette personne au groupe de menus.
Paŭlo Ebermann
1
Travaillé sur Linux Mint 19 pour moi. Merci.
Nous sommes Borg