Los espacios de nombres son una característica del kernel de Linux que particiona los recursos del kernel de tal manera que un conjunto de procesos ve un conjunto de recursos, mientras que otro conjunto de procesos ve un conjunto diferente. Esta característica funciona asignando el mismo tipo de espacio de nombres a un conjunto de recursos y procesos, pero permitiendo que dichos espacios de nombres hagan referencia a entornos claramente aislados. Esto crea la ilusión de que un proceso o un grupo de procesos es el único usuario de los recursos de hardware y software del sistema. Ejemplos de dichos recursos incluyen identificadores de proceso , nombres de host, identificadores de usuario, nombres de archivo, interfaces de red y mecanismos de comunicación entre procesos (IPC). [ 1 ] [ 2 ]
Los espacios de nombres de Linux, junto con los cgroups (grupos de control), son las tecnologías fundamentales que sustentan las plataformas modernas de virtualización a nivel de sistema operativo y de contenedores de Linux, como Docker , Kubernetes , LXC y Podman . Mientras que los cgroups determinan la cantidad de recursos del sistema que un proceso puede usar (como límites de CPU, memoria y E/S de disco), los espacios de nombres determinan qué recursos puede ver e interactuar un proceso.
El término "espacio de nombres" se usa a menudo para referirse a un tipo específico de espacio de nombres (por ejemplo, el espacio de nombres del ID del proceso), así como a un conjunto particular de nombres. Un sistema Linux comienza con un único espacio de nombres inicial de cada tipo, compartido por todos los procesos. Posteriormente, los procesos pueden crear espacios de nombres adicionales o unirse a los existentes, lo que permite crear límites de aislamiento complejos y anidados.
Historia
Los espacios de nombres de Linux se inspiraron en gran medida en la funcionalidad de espacios de nombres más amplia utilizada en todo el sistema operativo Plan 9 de Bell Labs , que trataba todo como un archivo y proporcionaba aislamiento de espacios de nombres por proceso. [ 3 ]
La implementación de espacios de nombres de Linux se originó en 2002 con el lanzamiento del kernel 2.4.19. El primer espacio de nombres introducido fue el espacio de nombres de montaje, creado por el desarrollador del kernel Al Viro, que aislaba los puntos de montaje del sistema de archivos. [ 4 ] Debido a que fue el primero de su tipo, la bandera de llamada al sistema introducida para él se denominó simplemente CLONE_NEWNS(Nuevo espacio de nombres), un nombre que no especifica "montar" y que a menudo se considera un artefacto histórico.
Los espacios de nombres posteriores se introdujeron progresivamente a lo largo de varios años:
- Los espacios de nombres UTS e IPC se añadieron en la versión 2.6.19 del kernel en 2006.
- Los espacios de nombres PID se finalizaron en el kernel 2.6.24 en 2008.
- Los espacios de nombres de red se completaron en gran medida con el kernel 2.6.29 en 2009. [ 5 ]
- Los espacios de nombres de usuario , desarrollados principalmente por Eric W. Biederman, se consideraron completos y funcionales en la versión 3.8 del kernel, publicada en 2013. [ 6 ] La introducción de los espacios de nombres de usuario fue un hito, ya que permitió la creación de "contenedores sin privilegios", contenedores que pueden ejecutarse de forma segura sin requerir privilegios de superusuario (root) subyacentes en el sistema anfitrión. [ 7 ]
- Los espacios de nombres Cgroup se introdujeron en el kernel 4.6 en marzo de 2016, liderados por Tejun Heo. [ 8 ]
- Los espacios de nombres de tiempo se fusionaron en la versión 5.6 del kernel en marzo de 2020, lo que permitió que los contenedores tuvieran sus propios tiempos de arranque y de inicio monótono. [ 9 ]
Tipos de espacios de nombres
A partir de la versión 5.6 del kernel de Linux , existen exactamente ocho tipos de espacios de nombres. La funcionalidad de los espacios de nombres opera de manera uniforme en todos ellos: cada proceso está asociado a un espacio de nombres y solo puede ver o usar los recursos asociados a ese espacio de nombres específico, incluidos sus espacios de nombres descendientes cuando corresponda. Esto proporciona a cada proceso (o grupo de procesos) una vista única y compartimentada del sistema.
Monte (mnt)
Los espacios de nombres de montaje, los primeros que se añadieron a Linux, controlan los puntos de montaje . Proporcionan a un proceso una vista aislada de la jerarquía del sistema de archivos. Al crearse, los puntos de montaje del espacio de nombres de montaje actual se copian inicialmente al nuevo espacio de nombres. Sin embargo, los puntos de montaje creados o desmontados posteriormente no se propagan entre espacios de nombres de forma predeterminada.
Utilizando la función de subárboles compartidos de Linux, es posible configurar puntos de montaje específicos para propagar eventos (como el montaje de una unidad USB) entre el host y el contenedor, o viceversa. [ 10 ] La bandera de clonación utilizada para crear un nuevo espacio de nombres de este tipo es CLONE_NEWNS.
ID de proceso (pid)
El espacio de nombres PID proporciona a los procesos un conjunto independiente de identificadores de proceso (PID). Los espacios de nombres PID están estrictamente anidados. Cuando se crea un nuevo proceso dentro de un nuevo espacio de nombres PID, tendrá un PID distinto para cada espacio de nombres, desde el actual hasta el PID inicial (raíz). Por lo tanto, los procesos en el PID inicial (al igual que el sistema operativo anfitrión) pueden ver todos los procesos en todos los contenedores, aunque con PID diferentes a los que se ven dentro de los contenedores.
Al primer proceso creado en un espacio de nombres PID se le asigna el ID de proceso 1. Recibe un trato especial similar al del proceso init normal del sistema anfitrión . En particular, cualquier proceso huérfano dentro del espacio de nombres se reasigna automáticamente a este proceso PID 1. Si este proceso PID 1 finaliza, el kernel terminará inmediatamente todos los demás procesos dentro de ese espacio de nombres PID y cualquiera de sus descendientes enviándoles una SIGKILLseñal. [ 11 ]
Red (net)
Los espacios de nombres de red virtualizan la pila de red . Al crearse, un nuevo espacio de nombres de red contiene únicamente una interfaz de bucle invertido ( lo), que inicialmente está desactivada. Cada interfaz de red, ya sea física o virtual, solo puede estar presente en un único espacio de nombres de red a la vez, pero un administrador puede mover activamente las interfaces entre espacios de nombres.
Cada espacio de nombres de red mantiene un conjunto privado de direcciones IP , su propia tabla de enrutamiento , listado de sockets , tabla de seguimiento de conexiones, reglas de firewall (como iptables o nftables ) y otros recursos relacionados con la red. [ 5 ] Para otorgar conectividad de red a un contenedor, los administradores suelen crear un par de Ethernet virtual ( veth), colocando un extremo en el espacio de nombres del host y el otro dentro del espacio de nombres de red del contenedor, y luego conectan el extremo del host a una red física. Al destruir un espacio de nombres de red, se destruyen automáticamente todas las interfaces virtuales dentro de él y se mueven todas las interfaces físicas de vuelta al espacio de nombres de red inicial.
Comunicación entre procesos (IPC)
Los espacios de nombres IPC aíslan los procesos de los mecanismos de comunicación entre procesos de estilo SysV , así como de las colas de mensajes POSIX . Esto impide que los procesos en diferentes espacios de nombres IPC interactúen entre sí utilizando identificadores IPC comunes. Por ejemplo, dos procesos en diferentes espacios de nombres pueden usar el mismo identificador de segmento de memoria compartida para asignar memoria mediante la familia de funciones SHM, y el kernel garantizará que se les proporcionen dos regiones de memoria compartida distintas y completamente aisladas.
UTS
Los espacios de nombres UTS aíslan dos identificadores del sistema: el nombre de host y el nombre de dominio NIS . El nombre "UTS" proviene de la estructura de datos que se pasa a la unamellamada al sistema, que históricamente significa Sistema de Tiempo Compartido UNIX . Cuando un proceso crea un nuevo espacio de nombres UTS, el nombre de host y el nombre de dominio se copian del espacio de nombres del proceso que realiza la llamada. Los procesos dentro del nuevo espacio de nombres pueden entonces cambiar su nombre de host sin afectar a la máquina host ni a otros contenedores. [ 12 ]
ID de usuario (usuario)
Los espacios de nombres de usuario son una característica de seguridad fundamental diseñada para proporcionar aislamiento de privilegios y segregación de la identificación de usuarios en múltiples conjuntos de procesos. Introducidos por completo en el kernel 3.8, son la base de los contenedores sin privilegios. Al igual que los espacios de nombres PID, los espacios de nombres de usuario están anidados, y cada nuevo espacio de nombres se considera hijo del que lo creó.
Un espacio de nombres de usuario mantiene una tabla de asignación que convierte los ID de usuario (UID) y los ID de grupo (GID) desde la perspectiva interna del contenedor a la perspectiva global del sistema anfitrión. Esto permite que un proceso posea privilegios de root (UID 0) dentro del contenedor, pero se asigne matemáticamente a un ID de usuario restringido y sin privilegios (por ejemplo, UID 100000) en la máquina anfitriona subyacente. [ 13 ] Si una vulnerabilidad permite que el proceso "root" del contenedor salga del espacio de nombres, el sistema anfitrión lo seguirá tratando como el ID de usuario restringido, lo que limita considerablemente el daño potencial.
Espacio de nombres del grupo de control (cgroup)
El espacio de nombres cgroup oculta la identidad de la jerarquía del grupo de control al que pertenece un proceso. Antes de que existiera este espacio de nombres, un proceso dentro de un contenedor podía inspeccionar /proc/self/cgroupy ver toda la ruta de su cgroup en relación con el sistema anfitrión (por ejemplo, /sys/fs/cgroup/memory/docker/container_id).
Al virtualizar la vista del sistema de archivos cgroup, un proceso dentro de un espacio de nombres cgroup verá su propio directorio cgroup como la raíz ( /). Esto evita fugas de información sobre la infraestructura subyacente del host y permite que las herramientas de orquestación de contenedores migren contenedores sin problemas entre nodos sin rutas cgroup conflictivas. Este tipo de espacio de nombres existe desde marzo de 2016 en Linux 4.6. [ 14 ]
Tiempo
El espacio de nombres de tiempo permite que los procesos observen diferentes horas del sistema. Se introdujo en Linux 5.6 en marzo de 2020. Específicamente, aísla dos relojes del kernel específicos: CLOCK_MONOTONICy CLOCK_BOOTTIME.
Cuando un contenedor se migra de un host físico a otro o se restaura a partir de una instantánea, el tiempo de actividad del sistema y los valores del reloj monotónico del nuevo host diferirán naturalmente de los del anterior. El espacio de nombres de tiempo permite que el entorno de ejecución del contenedor establezca desfases de reloj, lo que garantiza que las aplicaciones dentro del contenedor no experimenten saltos de tiempo repentinos e inoportunos.
Espacios de nombres propuestos
espacio de nombres syslog
El espacio de nombres syslog fue propuesto por Rui Xiang, un ingeniero de Huawei , para aislar los anillos de registro del kernel. Sin embargo, la propuesta no se integró en el kernel principal de Linux. [ 15 ] En cambio, las soluciones de espacio de usuario cumplieron en gran medida con este requisito; por ejemplo, systemd introdujo el concepto de "espacios de nombres de diario" en febrero de 2020 para proporcionar entornos de registro aislados. [ 16 ]
espacio de nombres IMA
La Arquitectura de Medición de Integridad (IMA) es un subsistema de seguridad del kernel que mide los archivos antes de acceder a ellos para garantizar que no hayan sido manipulados. La IMA estándar opera globalmente, lo que provoca conflictos en entornos de contenedores. El desarrollo continuo por parte de la comunidad del kernel, con importantes contribuciones de IBM y Huawei, tiene como objetivo introducir un espacio de nombres IMA. Esto permitiría que cada contenedor mantuviera registros de configuración de plataforma (PCR) aislados, registros de medición (ML) únicos y claves de evaluación independientes, lo que llevaría la atestación criptográfica a nivel de hardware directamente a los contenedores individuales. [ 17 ]
Jerarquía administrativa
Para facilitar el aislamiento de privilegios en las acciones administrativas, cada tipo de espacio de nombres está vinculado a un espacio de nombres de usuario. Cuando se crea un espacio de nombres que no pertenece a un usuario, se considera que pertenece al espacio de nombres de usuario que estaba activo en el momento de su creación.
Un usuario con privilegios administrativos (específicamente, que posee la CAP_SYS_ADMINcapacidad ) en el espacio de nombres de usuario propietario puede realizar acciones administrativas en ese espacio de nombres. Por ejemplo, si un proceso tiene permisos administrativos para cambiar la dirección IP de una interfaz de red, puede hacerlo, pero solo si su espacio de nombres de usuario activo es propietario de ese espacio de nombres de red específico. Dado que el espacio de nombres de usuario inicial (host) es el antecesor de todos los demás espacios de nombres, el usuario raíz del host conserva inherentemente el control administrativo sobre todos los tipos de espacios de nombres en todo el sistema. [ 18 ]
Detalles de implementación
Los espacios de nombres se representan como objetos de archivo virtuales dentro del núcleo, accesibles a través del procfspseudosistema de archivos.
Visibilidad en /proc
El kernel expone las asociaciones de espacio de nombres de cada proceso en ejecución en la ruta . Al igual que muchos recursos que no son archivos en , estas entradas se manifiestan como enlaces simbólicos especiales. La lectura del enlace produce una cadena con el formato ./proc/pid/ns/kind/prockind:[inode_number]
Estos números de inodo se corresponden uno a uno con objetos de espacio de nombres únicos en la memoria del kernel. Si dos procesos muestran el mismo número de inodo para un tipo de espacio de nombres específico (por ejemplo, net:[4026531969]), comparten ese espacio de nombres.
A partir de Linux 6.1.0, la kindcadena puede ser cualquiera de cgroup, ipc, mnt, net, pid, time, user, o uts. Además, para los espacios de nombres donde los procesos hijos pueden heredar rasgos diferentes a los del padre mismo (como PID o espacios de nombres de usuario), el kernel proporciona enlaces./proc/pid/ns/kind_for_children
llamadas al sistema
Cuatro llamadas al sistema principales manipulan directamente los espacios de nombres:
clone: Se utiliza para iniciar un nuevo proceso. Al pasar indicadores específicos (comoCLONE_NEWPIDoCLONE_NEWNET), el kernel creará los nuevos espacios de nombres especificados y colocará el proceso hijo dentro de ellos.unshare: Permite que un proceso se disocie de partes de su contexto de ejecución respecto de su proceso padre, moviendo efectivamente el proceso que realiza la llamada a un espacio de nombres completamente nuevo.setns: Permite que un proceso en ejecución ingrese a un espacio de nombres ya existente. Requiere un descriptor de archivo que apunte a uno de los enlaces simbólicos del espacio de nombres en/proc.ioctl: Se utiliza con solicitudes de espacio de nombres específicas (comoNS_GET_PARENToNS_GET_USERNS) para descubrir las relaciones jerárquicas entre diferentes espacios de nombres.
Destrucción
Si un espacio de nombres deja de ser referenciado por cualquier parte del sistema, el núcleo lo destruirá automáticamente. El proceso de limpieza de los recursos contenidos varía según el tipo de espacio de nombres. Un espacio de nombres se considera referenciado activamente y se mantiene activo mientras se cumpla alguna de las siguientes condiciones:
- Contiene al menos un proceso miembro vivo.
- Tiene al menos un espacio de nombres secundario referenciado (para tipos anidados como PID y User).
- Su archivo virtual ( ) se mantiene abierto actualmente mediante un descriptor de archivo .
/proc/pid/ns/kind - Sirve de base para un montaje de enlace creado en el sistema de archivos (una técnica común utilizada por herramientas de red para
iproute2mantener activos los espacios de nombres de red sin procesos en ejecución).
Adopción
Los espacios de nombres de Linux se adoptan de forma generalizada en el panorama del software moderno. Se combinan universalmente con cgroups para construir tecnologías de contenedores . Algunos ejemplos son Docker , [ 19 ] LXC (contenedores de Linux), Podman y sistemas de orquestación de contenedores como Kubernetes .
Más allá de los contenedores puros, los espacios de nombres se utilizan ampliamente para el aislamiento de procesos y la seguridad. Google Chrome y Chromium dependen en gran medida de los espacios de nombres de usuario, PID y red para aislar los procesos de renderizado web, lo que limita considerablemente el daño que un atacante puede infligir si un renderizador se ve comprometido. [ 20 ] Los formatos de paquetes como Flatpak y Snap emplean espacios de nombres para aislar las aplicaciones de escritorio del sistema de archivos del host y los datos del usuario.
Además, el sistema de inicio systemd utiliza espacios de nombres para proteger los servicios del sistema. Directivas como PrivateNetwork=yeso PrivateTmp=yesen un archivo de servicio de systemd le indican al kernel que inicie el demonio dentro de espacios de nombres de red y montaje aislados, respectivamente.
Las utilidades de línea de comandos también utilizan estas características. El util-linuxpaquete incluye el unsharecomando, que permite a los usuarios iniciar shells o scripts dentro de espacios de nombres recién creados. Un ejemplo de cómo utilizar espacios de nombres para crear un entorno aislado, sin privilegios, similar al de root:
unshare --map-root-user --fork --pid --mount-proc --root = " ${ chrootdir } " " $@ "Este comando inicia un proceso en nuevos espacios de nombres de usuario, PID y montaje, actuando efectivamente como un equivalente moderno y mucho más seguro al tradicional chroot.
Referencias
- ↑ Heddings, Anthony (2 de septiembre de 2020). "¿Qué son los espacios de nombres de Linux y para qué se utilizan?" . How-To Geek . Consultado el 22 de agosto de 2024 .
- ↑ Kerrisk, Michael. "namespaces(7) - descripción general de los espacios de nombres de Linux" . man7.org . Consultado el 29 de mayo de 2026 .
- ↑ "El uso de espacios de nombres en el Plan 9" . 1992. Archivado del original el 6 de septiembre de 2014. Consultado el 24 de marzo de 2016 .
- ↑ Kerrisk, Michael (2013-01-04). "Espacios de nombres en funcionamiento, parte 1: descripción general de los espacios de nombres" . LWN.net . Archivado del original el 21-03-2024 . Recuperado el 29-05-2026 .
- 1 2 "network_namespaces(7) - Página del manual de Linux" . man7.org . Consultado el 29 de mayo de 2026 .
- ↑ "LKML: Linus Torvalds: Linux 3.8" . lkml.org . Consultado el 22 de marzo de 2024 .
- ↑ "Espacios de nombres en funcionamiento, parte 5: Espacios de nombres de usuario [ LWN.net ] " .
- ↑ Heo, Tejun (2016-03-18). " [ GIT PULL ] Soporte de espacio de nombres cgroup para v4.6-rc1" . lkml (Lista de correo).
- ↑ "Por fin ha llegado el momento: se ha añadido la compatibilidad con el espacio de nombres de tiempo al kernel de Linux 5.6" . Phoronix . Consultado el 30 de marzo de 2020 .
- ↑ "Espacios de nombres en funcionamiento, parte 3: espacios de nombres PID" . lwn.net. 16 de enero de 2013.
- ↑ "uts_namespaces(7) - Página del manual de Linux" . man7.org . Consultado el 16 de febrero de 2021 .
- ↑ "user_namespaces(7) - Página del manual de Linux" . man7.org . Consultado el 29 de mayo de 2026 .
- ↑ Torvalds, Linus (26-03-2016). "Linux 4.6-rc1" . lkml (Lista de correo).
- ↑ "Agregar soporte de espacio de nombres para syslog" . lwn.net . Consultado el 11 de julio de 2022 .
- ↑ "journal: agregar concepto de "espacios de nombres de diario" por poettering · Solicitud de extracción n.° 14178 · systemd/systemd" . GitHub . Recuperado el 11 de julio de 2022 .
- ^ "ima: Presentar el espacio de nombres IMA" . lwn.net . Consultado el 18 de marzo de 2024 .
- ↑ "Espacios de nombres en funcionamiento, parte 5: Espacios de nombres de usuario" . lwn.net. 27 de febrero de 2013.
- ↑ "Seguridad de Docker" . docker.com . Consultado el 24 de marzo de 2016 .
- ↑ "Chromium Linux Sandboxing" . Archivado del original el 19/12/2019 . Consultado el 19/12/2019 .
Enlaces externos
- espacios de nombres(7) - página del manual de Linux
- Espacios de nombres — Documentación del kernel de Linux
- Espacios de nombres y cgroups del kernel de Linux por Rami Rosen
- Espacios de nombres y cgroups, la base de los contenedores Linux (incluido cgroups v2) - diapositivas de una charla de Rami Rosen, Netdev 1.1, Sevilla, España (2016)
- Interfaces del núcleo de Linux
- Características del kernel de Linux
- Seguridad del sistema operativo
- Software de virtualización para Linux