User Namespace
Información Básica
Un espacio de usuario es una característica del kernel de Linux que proporciona aislamiento de los mapeos de ID de usuario y grupo, permitiendo que cada espacio 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 usuario tengan diferentes privilegios y propietarios, incluso si comparten los mismos IDs de usuario y grupo numéricamente.
Los espacios de usuario son particularmente útiles en la contenerizació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 usuario, comienza con un conjunto vacío de mapeos de ID de usuario y grupo. Esto significa que cualquier proceso que se ejecute en el nuevo espacio de usuario inicialmente no tendrá privilegios fuera del espacio de usuario.
Se pueden establecer mapeos de ID entre los IDs de usuario y grupo en el nuevo espacio de usuario y los del espacio de usuario padre (o host). Esto permite que los procesos en el nuevo espacio de usuario tengan privilegios y propietarios correspondientes a los IDs de usuario y grupo en el espacio de usuario padre. Sin embargo, los mapeos de ID pueden estar restringidos a rangos específicos y subconjuntos de IDs, lo que permite un control detallado sobre los privilegios otorgados a los procesos en el nuevo espacio de usuario.
Dentro de un espacio de usuario, los procesos pueden tener privilegios de root completos (UID 0) para operaciones dentro del espacio de usuario, mientras siguen teniendo privilegios limitados fuera del espacio de usuario. Esto permite que los contenedores se ejecuten con capacidades similares a root dentro de su propio espacio de usuario sin tener privilegios de root completos en el sistema host.
Los procesos pueden moverse entre espacios de usuario utilizando la llamada al sistema
setns()
o crear nuevos espacios de usuario utilizando las llamadas al sistemaunshare()
oclone()
con la banderaCLONE_NEWUSER
. Cuando un proceso se mueve a un nuevo espacio de usuario o crea uno, comenzará a utilizar los mapeos de ID de usuario y grupo asociados con ese espacio de usuario.
Laboratorio:
Crear diferentes Espacios de Usuario
Línea de Comandos
Al montar una nueva instancia del sistema de archivos /proc
si se utiliza el parámetro --mount-proc
, se asegura de que el nuevo espacio de nombres de montaje tenga una vista precisa y aislada de la información de procesos específica para ese espacio de nombres.
Docker
Para utilizar el espacio de nombres de usuario, el demonio 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
)
Verifique en qué espacio de nombres se encuentra su proceso
Es posible verificar el mapa de usuarios del 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)
Recuperación de Capacidades
En el caso de los espacios de nombres de usuario, cuando se crea un nuevo espacio de nombres de usuario, el proceso que ingresa al espacio de nombres recibe un conjunto completo de capacidades dentro de ese espacio de nombres. Estas capacidades permiten que el proceso realice 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 u otros espacios de nombres.
Por lo tanto, incluso si obtener un nuevo proceso dentro de un nuevo espacio de nombres de usuario te devolverá todas las capacidades (CapEff: 000001ffffffffff), en realidad solo puedes utilizar las relacionadas con el espacio de nombres (como montar), pero no todas. Por lo tanto, esto por sí solo no es suficiente para escapar de un contenedor Docker.
```bash # There are the syscalls that are filtered after changing User namespace with: unshare -UmCpf bash
Probando: 0x067 . . . Error Probando: 0x070 . . . Error Probando: 0x074 . . . Error Probando: 0x09b . . . Error Probando: 0x0a3 . . . Error Probando: 0x0a4 . . . Error Probando: 0x0a7 . . . Error Probando: 0x0a8 . . . Error Probando: 0x0aa . . . Error Probando: 0x0ab . . . Error Probando: 0x0af . . . Error Probando: 0x0b0 . . . Error Probando: 0x0f6 . . . Error Probando: 0x12c . . . Error Probando: 0x130 . . . Error Probando: 0x139 . . . Error Probando: 0x140 . . . Error Probando: 0x141 . . . Error Probando: 0x143 . . . Error
Última actualización