¿Cómo puedo usar docker sin sudo?

767

En las páginas de documentación de Docker, todos los comandos de ejemplo se muestran sin este sudo, como este:

docker ps

En Ubuntu, se llama al binario docker.io. Tampoco funciona sin sudo:

sudo docker.io ps

¿Cómo puedo configurar Docker para que no necesite prefijar cada comando Docker con sudo?

Flimm
fuente
1
No olvides habilitar ufw;)
Rinzwind
2
En Ubuntu 14.04 también hay binario 'docker'.
anatoly techtonik
@anatolytechtonik También usé 'docker' en lugar de 'docker.io' en Ubuntu 14.04 LTS
Nabin
2
La instalación recomendada no es la ventana acoplable en los repositorios de ubuntu predeterminados; en cambio, las instrucciones aquí ( docs.docker.com/engine/installation/linux/ubuntulinux ), recomiendan utilizar el repositorio de docker. Elimine todos los elementos existentes de la ventana acoplable y verifique que esté obteniendo el de la fuente correcta: apt-cache policy docker-engine(la url apta debe ser de dockerproject.org)
michael
2
¿Qué tal un alias :? De esa manera, aún usa sudo, con protección de contraseña. alias docker = "sudo docker"
Andrej Panjkov el

Respuestas:

1136

Buenas noticias: el nuevo docker (versión 19.03 (actualmente experimental)) podrá ejecutarse sin root negando los problemas que pueden ocurrir al usar un usuario root. No más juegos con permisos elevados, root y cualquier cosa que pueda abrir su máquina cuando no lo desee.

Video sobre esto del [DockerCon 2019] Hardening Docker daemon con modo Rootless

Algunas advertencias para el modo Docker sin raíz

Los ingenieros de Docker dicen que el modo sin raíz no puede considerarse un reemplazo para el conjunto completo de características del motor Docker. Algunas limitaciones al modo sin raíz incluyen:

  • Los controles de recursos de cgroups, los perfiles de seguridad de apparmor, los puntos de control / restauración, las redes superpuestas, etc., no funcionan en modo sin raíz.
  • La exposición de los puertos de los contenedores actualmente requiere un proceso auxiliar de socat manual.
  • Solo las distribuciones basadas en Ubuntu admiten sistemas de archivos superpuestos en modo sin raíz.
  • Actualmente, el modo sin raíz solo se proporciona para compilaciones nocturnas que pueden no ser tan estables como solía hacerlo.

A partir de Docker 19.3 esto es obsoleto (y más peligroso de lo necesario):

El manual del acoplador tiene esto que decir al respecto:

Dar acceso no root

El Docker Daemon siempre se ejecuta como usuario root, y desde Docker versión 0.5.2, el Docker Daemon se une a un socket Unix en lugar de a un puerto TCP. De forma predeterminada, el socket de Unix es propiedad del usuario root, por lo que, de manera predeterminada, puede acceder a él con sudo.

A partir de la versión 0.5.3, si usted (o su instalador Docker) crea un grupo Unix llamado docker y le agrega usuarios, entonces el demonio docker hará que la propiedad del socket Unix sea leída / editable por el grupo docker cuando se inicie el demonio . El Docker Daemon siempre debe ejecutarse como usuario root, pero si ejecuta el cliente Docker como un usuario en el grupo Docker, entonces no necesita agregar sudo a todos los comandos del cliente. A partir de 0.9.0, puede especificar que un grupo que no sea Docker sea el propietario del socket Unix con la opción -G.

Advertencia: el grupo acoplable (o el grupo especificado con -G) es equivalente a la raíz; vea los detalles de Docker Daemon Attack Surface y esta publicación de blog sobre Por qué no permitimos que los usuarios no root ejecuten Docker en CentOS, Fedora o RHEL (gracias michael-n).

En la versión reciente del modo experimental sin raíz en GitHub , los ingenieros mencionan que el modo sin raíz permite ejecutar dockerd como un usuario sin privilegios, utilizando user_namespaces (7), mount_namespaces (7), network_namespaces (7).

Los usuarios deben ejecutar dockerd-rootless.sh en lugar de dockerd.

$ dockerd-rootless.sh --experimental

Como el modo sin raíz es experimental, los usuarios siempre deben ejecutar dockerd-rootless.sh con –experimental.


Importante leer: pasos posteriores a la instalación para Linux (también se vincula a los detalles de Docker Daemon Attack Surface ).

Administrar Docker como usuario no root

El demonio docker se une a un socket Unix en lugar de a un puerto TCP. Por defecto, el socket Unix es propiedad del usuario root y otros usuarios solo pueden acceder a él usando sudo. El docker daemon siempre se ejecuta como usuario root.

Si no desea usar sudo cuando usa el comando docker, cree un grupo Unix llamado docker y agréguele usuarios. Cuando se inicia el dacker de Docker, el grupo de Docker hace que la propiedad del socket Unix sea leída / editable.


  • Agregue el grupo acoplable si aún no existe:

    sudo groupadd docker
    
  • Agregue el usuario conectado "$ USER" al grupo acoplable. Cambie el nombre de usuario para que coincida con su usuario preferido si no desea utilizar su usuario actual:

    sudo gpasswd -a $USER docker
    
  • Realice una newgrp dockero cierre sesión / inicie sesión para activar los cambios en los grupos.

  • Puedes usar

    docker run hello-world
    

    para verificar si puedes ejecutar docker sin sudo.

Rinzwind
fuente
3
Sí, pero cada proceso privilegiado abre posibilidades de explotación. ¿Docker está enganchando tan profundamente en el sistema operativo para realmente exigir ese nivel de privilegios?
mate
3
newgrp dockerno funcionó para mí, tuve que cerrar sesión.
lolmaus - Andrey Mikhaylov
43
Vale la pena señalar que esto le da a ese usuario acceso raíz sin restricciones y sin contraseña . Ver detalles de la vulnerabilidad aquí
Chris Foster
2
¡NO necesita reiniciar el demonio de Docker para que este cambio tenga lugar! solo haga que el usuario que acaba de agregar cierre la sesión y vuelva a
iniciarla
44
si lo usa docker login, puede encontrar que la .dockercarpeta creada en su carpeta de inicio pertenece root. por lo tanto usted se encontraría con esta advertencia cuando se ejecuta comandos ventana acoplable: WARNING: Error loading config file:/home/myuser/.docker/config.json - stat /home/myuser/.docker/config.json: permission denied. Hice de mi usuario .dockercarpeta accesible sin sudo así: sudo chgrp -hR docker ~/.docker && sudo chown -R myuser ~/.docker. Sin chgrpembargo, no pareció ayudar, por lo que probablemente solo debería recomendar el paso Chown.
Birchlabs
202

Para ejecutar el comando Docker sin sudo, debe agregar su usuario (que tiene privilegios de root) al grupo Docker. Para esta ejecución, siga el comando:

 sudo usermod -aG docker $USER

Ahora, haga que el usuario cierre sesión y luego vuelva a iniciar sesión. Esta solución se explica bien aquí con el proceso de instalación adecuado.

Rohini Choudhary
fuente
14
después de agregar un usuario al grupo, ejecute este comando: sg nombre_grupo -c "bash"
madjardi
44
¡no necesita reiniciar el sistema operativo para que este cambio tenga lugar! ¡Eso bombardeará todos los contenedores en funcionamiento! Solo haga que el usuario que acaba de agregar cierre la sesión.
Tommy
55
¿En qué se diferencia ese comando de "sudo gpasswd -a $ {USER} docker" en otra respuesta? Si es que ...
Ashley Aitken
99
¿Podría agregar la advertencia dada por los documentos: "El grupo de acopladores [...] es equivalente a la raíz", para que la gente tenga la oportunidad de pensarlo
Murmel
2
El mismo efecto que la respuesta aceptada de 2 años, pero sin las advertencias sobre los riesgos de seguridad
Gert van den Berg
57

El mecanismo por el cual agregar un usuario al grupo dockerotorga permiso para ejecutar docker es obtener acceso al socket de docker en /var/run/docker.sock. Si el sistema de archivos que contiene /var/runse ha montado con ACL habilitadas, esto también se puede lograr a través de ACL.

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

Solo incluyo esto para completar.

En general, recomiendo evitar las ACL siempre que haya disponible una buena alternativa basada en grupos: es mejor si los privilegios de un sistema pueden entenderse mirando solo las membresías de grupo. Tener que escanear el sistema de archivos en busca de entradas de ACL para comprender los privilegios del sistema es una carga adicional para las auditorías de seguridad.

Advertencia 1 : Esto tiene la misma rootequivalencia que agregar usernameal dockergrupo. Todavía puede iniciar un contenedor de manera que tenga rootacceso al sistema de archivos del host.

Advertencia 2 : las ACL son significativamente más difíciles para las auditorías de seguridad que la seguridad basada en grupos. Probablemente evite las ACL si es posible cuando pueda usar grupos, al menos en entornos relevantes para la auditoría.

Christian Hujer
fuente
55
Funcionó el 16.04
edib
Esto es lo que necesitaba, otras respuestas requieren que el usuario tenga permiso de root. ¡Muchas gracias!
Mrinal Saurabh
1
Mucho mejor manera imo. El acoplador de grupo es equivalente a la raíz y eso siempre es una señal de peligro. Y no veo ninguna desventaja en tomar posesión de este archivo.
Xerus
55
@Xerus si entiendo correctamente, quien puede escribir en este socket también puede obtener privilegios equivalentes a la raíz . Entonces, dar acceso a alguien a este socket a través de ACL tiene el mismo efecto de seguridad que agregar a esa persona al grupo de acopladores.
Paŭlo Ebermann
1
Trabajé en Linux Mint 19 para mí. Gracias.
Somos Borg el