
En las páginas de documentación de Docker, todos los comandos de ejemplo se muestran sin sudo
, como este:
docker ps
En Ubuntu, el binario se llama docker.io
. Tampoco funciona sin sudo
:
sudo docker.io ps
¿Cómo puedo configurar Docker para no tener que anteponer cada comando de Docker sudo
?
Respuesta1
Buenas noticias: la nueva versión 19.03 de Docker (actualmente experimental) podrá ejecutarse sin raíz, eliminando los problemas que pueden ocurrir con un usuario root. No más problemas con permisos elevados, root y cualquier cosa que pueda abrir su máquina cuando no lo desee.
Vídeo sobre esto de[DockerCon 2019] Fortalecimiento del demonio Docker con modo Rootless
Algunas advertencias sobre el modo Docker sin raíz
Los ingenieros de Docker dicen que el modo sin raíz no puede considerarse un reemplazo del conjunto completo de funciones del motor Docker. Algunas limitaciones del 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 el modo sin raíz.
- Actualmente, exponer puertos desde contenedores requiere un proceso manual de ayuda de socat.
- Sólo las distribuciones basadas en Ubuntu admiten sistemas de archivos superpuestos en modo sin raíz.
- Actualmente, el modo Rootless solo se proporciona para compilaciones nocturnas que pueden no ser tan estables como está acostumbrado.
A partir de Docker 19.3, esto es obsoleto (y más peligroso de lo necesario):
Elmanual de acopladortiene esto que decir al respecto:
Dar acceso no root
El demonio acoplable siempre se ejecuta como usuario root y, desde la versión 0.5.2 de Docker, el demonio acoplable se vincula a un socket Unix en lugar de a un puerto TCP. De forma predeterminada, ese socket Unix es propiedad del usuario root y, por lo tanto, puede acceder a él con sudo.
A partir de la versión 0.5.3, si usted (o su instalador de 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/escribible por el grupo Docker cuando se inicie el demonio. . El demonio de Docker siempre debe ejecutarse como usuario root, pero si ejecuta el cliente de Docker como usuario en el grupo de Docker, 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 debe poseer el socket Unix con la opción -G.
Advertencia: el grupo de la ventana acoplable (o el grupo especificado con -G) es equivalente a la raíz; verDetalles de la superficie de ataque de Docker Daemony esta entrada de blog enPor qué no permitimos que usuarios no root ejecuten Docker en CentOS, Fedora o RHEL(gracias michael-n).
En la reciente publicación delmodo experimental sin raíz en GitHub, los ingenieros mencionan que el modo sin raíz permite ejecutar dockerd como un usuario sin privilegios, usando 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 Rootless es experimental, los usuarios siempre deben ejecutar dockerd-rootless.sh con –experimental.
Importante leer:pasos posteriores a la instalación para Linux(también enlaza conDetalles de la superficie de ataque de Docker Daemon).
Administrar Docker como usuario no root
El demonio acoplable se vincula a un socket Unix en lugar de a un puerto TCP. De forma predeterminada, ese socket Unix es propiedad del usuario root y otros usuarios solo pueden acceder a él mediante sudo. El demonio acoplable siempre se ejecuta como usuario root.
Si no desea utilizar sudo cuando utilice el comando docker, cree un grupo Unix llamado docker y agréguele usuarios. Cuando se inicia el demonio de la ventana acoplable, el grupo de la ventana acoplable permite que el grupo de la ventana acoplable pueda leer/escribir la propiedad del socket Unix.
Agregue el
docker
grupo si aún no existe:sudo groupadd docker
Agregue el usuario conectado "$USER" al
docker
grupo. 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
newgrp docker
o cierre sesión/inicie sesión para activar los cambios en los grupos.Puedes usar
docker run hello-world
para comprobar si puede ejecutar Docker sin
sudo
.
Respuesta2
Para ejecutar el comando Docker sin sudo
, debe agregar su usuario (que tiene privilegios de root) al grupo Docker. Para esto ejecute el siguiente comando:
sudo usermod -aG docker $USER
Ahora, haga que el usuario cierre sesión y luego vuelva a iniciar sesión. Esta solución está bien explicada.aquícon el proceso de instalación adecuado.
Respuesta3
El mecanismo mediante el cual agregar un usuario al grupo docker
otorga permiso para ejecutar Docker es obtener acceso al socket de Docker en /var/run/docker.sock
. Si el sistema de archivos que contiene /var/run
se ha montado con las ACL habilitadas, esto también se puede lograr a través de las ACL.
sudo setfacl -m user:$USER:rw /var/run/docker.sock
Sólo incluyo esto para que esté completo.
En general, recomiendo evitar las ACL siempre que esté disponible una buena alternativa basada en grupos: es mejor si los privilegios de un sistema se pueden entender mirando únicamente las membresías de grupos. Tener que escanear el sistema de archivos en busca de entradas ACL para comprender los privilegios del sistema es una carga adicional para las auditorías de seguridad.
Advertencia 1: Esto tiene la misma root
equivalencia que agregar $USER
al docker
grupo. Aún puede iniciar un contenedor de manera que tenga root
acceso 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 en su lugar, al menos en entornos relevantes para auditoría.
Respuesta4
Los contenedores Docker deben ser ejecutados por un superusuario. Puede agregarse al docker
grupo (por ejemplo, ejecutando sudo usermod -aG docker $USER
), pero esto facilita que cualquier persona con acceso a la $USER
cuenta obtenga acceso raíz a la máquina (por ejemplo, montando un volumen raíz en un contenedor privilegiado).
Una forma más consciente de la seguridad de ejecutar contenedores Docker como usuario no root sería usarPodman. Desde su sitio web:
Podman es un motor de contenedor sin demonio para desarrollar, administrar y ejecutar contenedores OCI en su sistema Linux. Los contenedores se pueden ejecutar como root o enmodo desarraigado. Simplemente pon:
alias docker=podman
.
Otra alternativa esSingularidad, que se implementa más comúnmente en entornos HPC.