En pocas palabras, los espacios de nombres proporcionan una forma de construir un sistema Linux virtual dentro de un sistema Linux más grande. Esto es diferente de ejecutar una máquina virtual que se ejecuta como un proceso sin privilegios: la máquina virtual aparece como un solo proceso en el host, mientras que los procesos que se ejecutan dentro de un espacio de nombres todavía se ejecutan en el sistema host.
Un sistema virtual que se ejecuta dentro de un sistema más grande se denomina contenedor . La idea de un contenedor es que los procesos que se ejecutan dentro del contenedor creen que son los únicos procesos en el sistema. En particular, el usuario root dentro del contenedor no tiene privilegios de root fuera del contenedor (tenga en cuenta que esto solo es cierto en versiones recientes del kernel).
Los espacios de nombres virtualizan una característica a la vez. Algunos ejemplos de tipos de espacios de nombres son:
- Espacios de nombres de usuario : esto permite que los procesos se comporten como si se estuvieran ejecutando como usuarios diferentes dentro y fuera del espacio de nombres. En particular, los procesos que se ejecutan como UID 0 dentro del espacio de nombres tienen privilegios de superusuario solo con respecto a los procesos que se ejecutan en el mismo espacio de nombres.
Desde Linux kernel 3.8, los usuarios sin privilegios pueden crear espacios de nombres de usuario. Esto permite a un usuario común hacer uso de funciones que están reservadas a la raíz (como cambiar las tablas de enrutamiento o configurar capacidades).
- Espacios de nombres PID : los procesos dentro de un espacio de nombres PID no pueden eliminar ni rastrear procesos fuera de ese espacio de nombres.
- Montar espacios de nombres : esto permite que los procesos tengan su propia vista del sistema de archivos. Esta vista puede ser una vista parcial, permitiendo que algunas partes del sistema de archivos se oculten y que las partes se recompongan para que los árboles de directorios aparezcan en diferentes lugares. Los espacios de nombres de montaje generalizan la característica tradicional chroot de Unix , que permite que los procesos se restrinjan a un subárbol particular.
- Espacios de nombres de red : permiten la separación de los recursos de red (dispositivos de red) y, por lo tanto, mejoran el aislamiento de los procesos.
Los espacios de nombres dependen del núcleo para proporcionar aislamiento entre espacios de nombres. Es bastante complicado hacerlo bien, por lo que aún puede haber errores de seguridad por ahí. El riesgo de errores de seguridad sería la razón principal para no habilitar la función. Otra razón para no habilitarlo sería cuando está haciendo un kernel pequeño para un dispositivo incrustado. En un kernel de uso general que instalaría en un servidor o estación de trabajo típico, los espacios de nombres deben estar habilitados, como cualquier otra función de kernel maduro.
Todavía hay pocas aplicaciones que hacen uso de espacios de nombres. Aquí hay algunos:
- LXC está bien establecido. Se basa en cgroups para proporcionar contenedores.
- virt-sandbox es un proyecto de sandboxing más reciente.
- Las versiones recientes de cromo también utilizan espacios de nombres para sandboxing donde esté disponible.
- El marco uWSGI para aplicaciones en clúster utiliza espacios de nombres para mejorar el espacio aislado.
Consulte la serie de artículos LWN de Michael Kerrisk para obtener más información.