
¿Por qué Docker utiliza los mismos espacios de nombres de usuario y grupo c de forma predeterminada al iniciar un nuevo contenedor?
No entiendo por qué Docker no configura un nuevo espacio de nombres de usuario, de modo que root
en el contenedor no es el mismo que root
en el host.
En particular, dado que todo lo demás tiene un espacio de nombres (a excepción de cgroup), realmente no tiene sentido no aislar completamente el contenedor de forma predeterminada.
¿Alguien puede aclarar por qué Docker no habilita los espacios de nombres de usuario de forma predeterminada?
Espacios de nombres de host:
parallels@debian-gnu-linux-vm:~$ ls -la /proc/self/ns
total 0
dr-x--x--x 2 parallels parallels 0 Jan 30 17:29 .
dr-xr-xr-x 9 parallels parallels 0 Jan 30 17:29 ..
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 cgroup -> cgroup:[4026531835]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 net -> net:[4026531957]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 pid -> pid:[4026531836]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 user -> user:[4026531837]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 uts -> uts:[4026531838]
Espacios de nombres de contenedores:
docker run -ti --rm debian:latest
root@210189a7a164:/# ls -la /proc/self/ns
total 0
dr-x--x--x 2 root root 0 Jan 30 16:30 .
dr-xr-xr-x 9 root root 0 Jan 30 16:30 ..
lrwxrwxrwx 1 root root 0 Jan 30 16:30 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 ipc -> 'ipc:[4026532287]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 mnt -> 'mnt:[4026532285]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 net -> 'net:[4026532290]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 pid -> 'pid:[4026532288]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 uts -> 'uts:[4026532286]'
Los espacios de nombres user
y cgroup
son los mismos para el host y el contenedor.
Respuesta1
En cuanto a los detalles de la decisión de Docker de no habilitar usuarios de forma predeterminada, probablemente deba preguntarle a Docker, pero puedo ofrecer una posible explicación.
La filosofía de diseño general de Docker parece haber sido permitir el uso de contenedores minimizando las interrupciones y complicaciones en el flujo de trabajo de desarrollo.
Habilitar espacios de nombres de usuario puede causar problemas con los permisos de archivos/directorios al montar volúmenes desde el host subyacente, ya que el uid/gid en uso en el contenedor puede no tener derechos sobre los directorios montados.
Por supuesto, esto se puede solucionar mediante una gestión cuidadosa de esos permisos, pero es una interrupción.
El espacio de nombres de usuario está disponible como opción, por lo que aún es posible que organizaciones y usuarios individuales lo habiliten, solo es necesario configurarlo.
Vale la pena señalar que Docker también está trabajando para habilitar la compatibilidad con Docker "sin raíz" y esto ahora está disponible como una opción experimental (más detallesaquí) y esto solucionaría el problema general, asegurando que ningún contenedor (o el propio demonio) se ejecute como root.
Respuesta2
Es básicamente el clásico equilibrio entre usabilidad y seguridad. Lo configuré para mi escritorio de desarrollador despuésCVE-2019-5736Se informó que estaba mitigado por los espacios de nombres de usuario y lo desactivó unos meses después. Hace que sea muy difícil trabajar con volúmenes de host. Eso no es un gran problema para una aplicación nativa de la nube implementada, pero es enorme si usa Docker para fines de desarrollo, como compilaciones de CI o herramientas de administrador de sistemas, o para aplicaciones heredadas que dependen de una gran cantidad de archivos host.
Para agravar el problema estaba el hecho de que yo era el único que tenía el problema, lo que por supuesto no sería el caso si los espacios de nombres de usuario fueran los predeterminados como usted sugiere, pero la función no estuvo disponible hasta la ventana acoplable 1.10 y luego cambió el El valor predeterminado habría sido demasiado perjudicial para los usuarios existentes.