User Namespace
Información Básica
Un espacio de nombres de usuario es una característica del núcleo de Linux que proporciona aislamiento de las asignaciones de ID de usuario y grupo, permitiendo que cada espacio de nombres de usuario tenga su propio conjunto de IDs de usuario y grupo. Este aislamiento permite que los procesos que se ejecutan en diferentes espacios de nombres de usuario tengan diferentes privilegios y propiedad, incluso si comparten los mismos IDs de usuario y grupo numéricamente.
Los espacios de nombres de usuario son particularmente útiles en la contenedorización, donde cada contenedor debe tener su propio conjunto independiente de IDs de usuario y grupo, lo que permite una mejor seguridad y aislamiento entre los contenedores y el sistema host.
Cómo funciona:
Cuando se crea un nuevo espacio de nombres de usuario, comienza con un conjunto vacío de asignaciones de ID de usuario y grupo. Esto significa que cualquier proceso que se ejecute en el nuevo espacio de nombres de usuario no tendrá inicialmente privilegios fuera del espacio de nombres.
Se pueden establecer asignaciones de ID entre los IDs de usuario y grupo en el nuevo espacio de nombres y aquellos en el espacio de nombres padre (o host). Esto permite que los procesos en el nuevo espacio de nombres tengan privilegios y propiedad correspondientes a los IDs de usuario y grupo en el espacio de nombres padre. Sin embargo, las asignaciones de ID pueden restringirse a rangos y subconjuntos específicos de IDs, lo que permite un control detallado sobre los privilegios otorgados a los procesos en el nuevo espacio de nombres.
Dentro de un espacio de nombres de usuario, los procesos pueden tener privilegios de root completos (UID 0) para operaciones dentro del espacio de nombres, mientras que aún tienen privilegios limitados fuera del espacio de nombres. Esto permite que los contenedores se ejecuten con capacidades similares a root dentro de su propio espacio de nombres sin tener privilegios de root completos en el sistema host.
Los procesos pueden moverse entre espacios de nombres utilizando la llamada al sistema
setns()
o crear nuevos espacios de nombres utilizando las llamadas al sistemaunshare()
oclone()
con la banderaCLONE_NEWUSER
. Cuando un proceso se mueve a un nuevo espacio de nombres o crea uno, comenzará a usar las asignaciones de ID de usuario y grupo asociadas con ese espacio de nombres.
Laboratorio:
Crear diferentes Espacios de Nombres
CLI
Al montar una nueva instancia del sistema de archivos /proc
si usas el parámetro --mount-proc
, aseguras que el nuevo espacio de montaje tenga una vista precisa y aislada de la información del proceso específica de ese espacio de nombres.
Docker
Para usar el espacio de nombres de usuario, el daemon de Docker debe iniciarse con --userns-remap=default
(En ubuntu 14.04, esto se puede hacer modificando /etc/default/docker
y luego ejecutando sudo service docker restart
)
Verifica en qué espacio de nombres está tu proceso
Es posible verificar el mapa de usuarios desde el contenedor de docker con:
O desde el host con:
Encontrar todos los espacios de nombres de usuario
Entrar dentro de un espacio de nombres de usuario
También, solo puedes entrar en otro espacio de nombres de proceso si eres root. Y no puedes entrar en otro espacio de nombres sin un descriptor que apunte a él (como /proc/self/ns/user
).
Crear un nuevo espacio de nombres de usuario (con mapeos)
Recuperando Capacidades
En el caso de los espacios de nombres de usuario, cuando se crea un nuevo espacio de nombres de usuario, el proceso que entra en el espacio de nombres recibe un conjunto completo de capacidades dentro de ese espacio de nombres. Estas capacidades permiten al proceso realizar operaciones privilegiadas como montar sistemas de archivos, crear dispositivos o cambiar la propiedad de archivos, pero solo dentro del contexto de su espacio de nombres de usuario.
Por ejemplo, cuando tienes la capacidad CAP_SYS_ADMIN
dentro de un espacio de nombres de usuario, puedes realizar operaciones que normalmente requieren esta capacidad, como montar sistemas de archivos, pero solo dentro del contexto de tu espacio de nombres de usuario. Cualquier operación que realices con esta capacidad no afectará al sistema host ni a otros espacios de nombres.
Por lo tanto, incluso si obtener un nuevo proceso dentro de un nuevo espacio de nombres de usuario te dará todas las capacidades de vuelta (CapEff: 000001ffffffffff), en realidad solo puedes usar las relacionadas con el espacio de nombres (montar, por ejemplo) pero no todas. Así que, esto por sí solo no es suficiente para escapar de un contenedor Docker.
Last updated