‫Todo bien. Sabemos que no se debe ejecutar como root en el contenedor.
‫Pero, fuera del contenedor, la raíz en el contenedor, por
‫cierto, no tiene acceso directo a nada en el host,
‫correcto. Solo porque eres
‫root en un contenedor, todavía estás encarcelado allí.
‫Pero, si desea
‫pasar al siguiente nivel, donde si el usuario incluso tiene raíz en
‫el contenedor, quiere irrumpir en el host,
‫porque hay un núcleo de vulnerabilidad
‫como hemos hablado, como Cow sucio u otra vulnerabilidad en
‫Docker o algo.
‫Luego, el siguiente paso que debe hacer aquí es habilitar los espacios de nombres de
‫usuario, que no están habilitados de manera predeterminada.
‫Tengo un enlace aquí que lleva a un artículo de
‫blog que habla todo al respecto.
‫Básicamente, es una configuración por host que establece en la configuración
‫de Docker. El Docker JSON.
‫Le dice a Docker que cada vez que crea un nuevo
‫contenedor para ejecutar ese
‫contenedor como un usuario no root en el host.
‫Entonces, básicamente hay un par
‫de programas allí, containerd y runC, que son otros programas que
‫Docker usa para iniciar su contenedor.
‫Por defecto, esos se ejecutan como root.
‫Una característica que tiene Docker es habilitar espacios de nombres
‫de usuario, lo que esencialmente
‫significa que cuando Docker crea estos contenedores, no los generará como
‫un subproceso que se ejecuta como root como lo hace Docker.
‫Los generará como un usuario con un número alto.
‫Una especie de, no necesariamente un usuario aleatorio, sino un usuario
‫de alto nivel.
‫Eso significa que si ese contenedor
‫tiene alguna vulnerabilidad de seguridad en la
‫que el usuario pueda escapar del contenedor, todavía habrá un
‫usuario en el host. Debido a que van a
‫actuar como el usuario que utiliza el proceso que ejecuta
‫ese contenedor. La carrera esencialmente.
‫El programa runC es lo que inicia ese contenedor,
‫y se ejecutará como un usuario con un número
‫alto, no como root. Ese usuario realmente no tiene
‫ningún privilegio fuera de ese contenedor. Entonces, esa característica es una
‫configuración por host, no una configuración por contenedor, y no
‫todo funciona en espacios de nombres de usuario.
‫Solo tendrás que probar y practicar.
‫Tendrá que habilitarlo en algunos servidores, pruebe sus aplicaciones
‫en ese servidor, vea si funcionan.
‫Si no lo hacen, tendrá que
‫segmentar su arquitectura. Cada vez que implemento espacios
‫de nombres de usuario en un clúster, normalmente tenemos nodos de trabajo específicos que
‫tienen habilitados los espacios de nombres de usuario.
‫Ahí es donde se ejecutan esos programas que pueden soportarlo,
‫que funcionan con él.
‫Todo lo demás tiene que ejecutarse en servidores Docker normales
‫en otro lugar. Así es como lo segmentamos.
‫Segmentamos en dos clases de servidores.
‫Eso, ya sabes, como si estuvieras ejecutando una DMZ, eso es lo
‫que haría si ejecutara, habilitaría, en la DMZ, todos los espacios
‫de nombres de usuario, en todos los servidores y
‫luego los contenedores que se ejecutan Tendría que haber, tendría que soportar espacios
‫de nombres de usuario.
‫No puede ir a buscar aplicaciones y averiguar si son compatibles con los espacios
‫de nombres de usuario.
‫Es un... los espacios de nombres de usuario no son
‫necesariamente una característica específica de Docker. Esencialmente significa que su contenedor
‫se está ejecutando en un espacio de nombres
‫y ahora la aplicación que ejecuta ese contenedor también está bloqueada
‫un poco.
‫No todo puede soportar eso. Simplemente tendrá
‫que practicar o tal vez investigar un poco
‫para ver si otras personas han podido
‫hacer que funcione allí. Ya sabes, para cosas comunes como
‫MySQL y cosas así. Pero obviamente, para
‫sus propios programas que está desarrollando, solo tendrá que probarlos
‫para ver si funcionan. Diría que la mayoría
‫de los programas y lenguajes comunes que ejecuto funcionan bien
‫en los espacios de nombres de usuario. El problema real con
‫los espacios de nombres de usuario es cuando tienes una aplicación
‫que necesita escribir en volúmenes o enlazar montajes, que
‫tal vez tienes cargas de archivos de usuario y
‫las estás compartiendo en muchos contenedores diferentes. Ahí es donde los espacios de nombres de usuario no son imposibles.
‫Simplemente se vuelve un poco complicado porque los archivos que
‫ahora se escriben en el disco en el host ahora se
‫escriben como un usuario diferente.
‫Porque ese proceso en el host que administra el
‫contenedor es un usuario diferente.
‫Entonces, verá diferentes ID de usuario en esos archivos, y solo tendrá
‫que lidiar con eso.
‫Hay permisos estándar de Linux en ese punto, y solo
‫tiene que automatizar y resolver esos problemas de varias
‫maneras estándar de Linux.
‫Ni siquiera es realmente un problema de Docker en ese momento.
‫Es solo un problema de permisos en el host.