Los espacios de nombres son una característica del kernel de Linux que divide los recursos del kernel de modo que un conjunto de procesos ve un conjunto de recursos mientras que otro conjunto de procesos ve un conjunto diferente de recursos. La característica funciona al tener el mismo espacio de nombres para un conjunto de recursos y procesos, pero esos espacios de nombres se refieren a recursos distintos. Los recursos pueden existir en múltiples espacios. Ejemplos de tales recursos son ID de proceso, nombres de host, ID de usuario, nombres de archivo y algunos nombres asociados con el acceso a la red y la comunicación entre procesos .
Autor (es) original (es) | Al Viro |
---|---|
Desarrollador (es) | Eric W. Biederman, Pavel Emelyanov, Al Viro, Cyrill Gorcunov y col. |
Versión inicial | 2002 |
Escrito en | C |
Sistema operativo | Linux |
Tipo | Software del sistema |
Licencia | GPL y LGPL |
Los espacios de nombres son un aspecto fundamental de los contenedores en Linux.
El término "espacio de nombres" se utiliza a menudo para un tipo de espacio de nombres (por ejemplo, ID de proceso), así como para un espacio de nombres en particular.
Un sistema Linux comienza con un solo espacio de nombres de cada tipo, utilizado por todos los procesos. Los procesos pueden crear espacios de nombres adicionales y unir diferentes espacios de nombres.
Historia
Los espacios de nombres de Linux se inspiraron en la funcionalidad de espacios de nombres más amplia que se usa mucho en Plan 9 de Bell Labs . [1]
Los espacios de nombres de Linux se originaron en 2002 en el kernel 2.4.19 con trabajo en el tipo de espacio de nombres de montaje. Se agregaron espacios de nombres adicionales a partir de 2006 [2] y continuarán en el futuro.
La funcionalidad de soporte de contenedores adecuada se completó en la versión 3.8 del kernel con la introducción de los espacios de nombres de usuario. [3]
Tipos de espacios de nombres
Desde la versión 5.6 del kernel, existen 8 tipos de espacios de nombres. La funcionalidad del espacio de nombres es la misma en todos los tipos: cada proceso está asociado con un espacio de nombres y solo puede ver o usar los recursos asociados con ese espacio de nombres y los espacios de nombres descendientes cuando corresponda. De esta manera, cada proceso (o grupo de procesos del mismo) puede tener una vista única de los recursos. El recurso que se aísle depende del tipo de espacio de nombres que se haya creado para un grupo de procesos determinado.
Montaje (mnt)
Los espacios de nombres de montaje controlan los puntos de montaje. Tras la creación, los montajes del espacio de nombres de montaje actual se copian en el nuevo espacio de nombres, pero los puntos de montaje creados posteriormente no se propagan entre espacios de nombres (utilizando subárboles compartidos, es posible propagar puntos de montaje entre espacios de nombres [4] ).
La bandera de clonación utilizada para crear un nuevo espacio de nombres de este tipo es CLONE_NEWNS, abreviatura de "NEW NameSpace". Este término no es descriptivo (ya que no dice qué tipo de espacio de nombres se creará) porque los espacios de nombres de montaje fueron el primer tipo de espacio de nombres y los diseñadores no anticiparon que hubiera otros.
ID de proceso (pid)
El espacio de nombres PID proporciona a los procesos un conjunto independiente de ID de procesos (PID) de otros espacios de nombres. Los espacios de nombres PID están anidados, lo que significa que cuando se crea un nuevo proceso, tendrá un PID para cada espacio de nombres desde su espacio de nombres actual hasta el espacio de nombres PID inicial. Por lo tanto, el espacio de nombres PID inicial puede ver todos los procesos, aunque con diferentes PID que otros espacios de nombres verán los procesos.
Al primer proceso creado en un espacio de nombres PID se le asigna el número de identificación de proceso 1 y recibe la mayor parte del mismo tratamiento especial que el proceso de inicio normal , más notablemente que los procesos huérfanos dentro del espacio de nombres se le adjuntan. Esto también significa que la terminación de este proceso PID 1 terminará inmediatamente todos los procesos en su espacio de nombres PID y cualquier descendiente. [5]
Red (neto)
Los espacios de nombres de red virtualizan la pila de la red . Al crearse, un espacio de nombres de red contiene solo una interfaz de bucle invertido .
Cada interfaz de red (física o virtual) está presente en exactamente 1 espacio de nombres y se puede mover entre espacios de nombres.
Cada espacio de nombres tendrá un conjunto privado de direcciones IP , su propia tabla de enrutamiento , lista de sockets , tabla de seguimiento de conexiones, firewall y otros recursos relacionados con la red.
La destrucción de un espacio de nombres de red destruye cualquier interfaz virtual dentro de él y mueve cualquier interfaz física dentro de él al espacio de nombres de red inicial.
Comunicación entre procesos (ipc)
Los espacios de nombres de IPC aíslan los procesos de la comunicación entre procesos de estilo SysV . Esto evita que los procesos en diferentes espacios de nombres de IPC utilicen, por ejemplo, la familia de funciones SHM para establecer un rango de memoria compartida entre los dos procesos. En su lugar, cada proceso podrá utilizar los mismos identificadores para una región de memoria compartida y producir dos regiones distintas.
UTS
Los espacios de nombres UTS ( tiempo compartido de UNIX ) permiten que un solo sistema parezca tener diferentes nombres de dominio y host para diferentes procesos. "Cuando un proceso crea un nuevo espacio de nombres UTS ... el nombre de host y el dominio del nuevo espacio de nombres UTS se copian de los valores correspondientes en el espacio de nombres UTS de la persona que llama". [6]
ID de usuario (usuario)
Los espacios de nombre de usuario son una característica que proporciona aislamiento de privilegios y segregación de identificación de usuario en varios conjuntos de procesos disponibles desde el kernel 3.8. [7] Con asistencia administrativa es posible construir un contenedor con aparentes derechos administrativos sin otorgar privilegios elevados a los procesos de usuario. Al igual que el espacio de nombres PID, los espacios de nombres de usuario están anidados y cada nuevo espacio de nombres de usuario se considera un elemento secundario del espacio de nombres de usuario que lo creó.
Un espacio de nombre de usuario contiene una tabla de mapeo que convierte las ID de usuario desde el punto de vista del contenedor al punto de vista del sistema. Esto permite, por ejemplo, que el usuario root tenga la identificación de usuario 0 en el contenedor, pero en realidad el sistema lo trata como una identificación de usuario 1.400.000 para las comprobaciones de propiedad. Se utiliza una tabla similar para las asignaciones de ID de grupo y las comprobaciones de propiedad.
Para facilitar el aislamiento de privilegios de las acciones administrativas, cada tipo de espacio de nombres se considera propiedad de un espacio de nombres de usuario según el espacio de nombres de usuario activo en el momento de la creación. Un usuario con privilegios administrativos en el espacio de nombres de usuario apropiado podrá realizar acciones administrativas dentro de ese otro tipo de espacio de nombres. Por ejemplo, si un proceso tiene permiso administrativo para cambiar la dirección IP de una interfaz de red, puede hacerlo siempre que su propio espacio de nombres de usuario sea el mismo (o antepasado) del espacio de nombres de usuario que posee el espacio de nombres de red. Por lo tanto, el espacio de nombres de usuario inicial tiene control administrativo sobre todos los tipos de espacios de nombres en el sistema. [8]
Espacio de nombres del grupo de control (cgroup)
El tipo de espacio de nombres cgroup oculta la identidad del grupo de control del cual el proceso es miembro. Un proceso en tal espacio de nombres, verificando de qué grupo de control forma parte cualquier proceso, vería una ruta que es realmente relativa al grupo de control establecido en el momento de la creación, ocultando su verdadera posición e identidad del grupo de control. Este tipo de espacio de nombres existe desde marzo de 2016 en Linux 4.6. [9] [10]
Espacio de nombres de tiempo
El espacio de nombres de tiempo permite que los procesos vean diferentes tiempos del sistema de una manera similar al espacio de nombres de UTS. Se propuso en 2018 y aterrizó en Linux 5.6, que se lanzó en marzo de 2020. [11]
Espacios de nombres propuestos
espacio de nombres syslog
Detalles de implementacion
El kernel asigna a cada proceso un enlace simbólico por tipo de espacio de nombres /proc/
. El número de inodo al que apunta este enlace simbólico es el mismo para cada proceso en este espacio de nombres. Esto identifica de forma única cada espacio de nombres por el número de inodo al que apunta uno de sus enlaces simbólicos.
La lectura del enlace simbólico a través de readlink devuelve una cadena que contiene el nombre del tipo de espacio de nombres y el número de inodo del espacio de nombres.
Syscalls
Tres llamadas al sistema pueden manipular directamente los espacios de nombres:
- clon, marcas para especificar a qué nuevo espacio de nombres se debe migrar el nuevo proceso.
- no compartir, permite que un proceso (o subproceso) disocie partes de su contexto de ejecución que se están compartiendo actualmente con otros procesos (o subprocesos)
- setns, ingresa al espacio de nombres especificado por un descriptor de archivo.
Destrucción
Si ya no se hace referencia a un espacio de nombres, se eliminará, el manejo del recurso contenido depende del tipo de espacio de nombres. Se puede hacer referencia a los espacios de nombres de tres formas:
- por un proceso que pertenece al espacio de nombres
- por un descriptor de archivo abierto al archivo del espacio de nombres (
/proc/
)/ns/ - un montaje de enlace del archivo del espacio de nombres (
/proc/
)/ns/
Adopción
Varios software de contenedor utilizan espacios de nombres de Linux en combinación con cgroups para aislar sus procesos, incluidos Docker [12] y LXC .
Otras aplicaciones, como Google Chrome, utilizan espacios de nombres para aislar sus propios procesos que están en riesgo de sufrir ataques en Internet. [13]
También hay un contenedor para no compartir en util-linux . Un ejemplo de su uso es
SHELL = / bin / sh unshare --fork --pid chroot " $ { chrootdir } " " $ @ "
Referencias
- ^ "El uso de espacios de nombres en el plan 9" . 1992. Archivado desde el original el 6 de septiembre de 2014 . Consultado el 24 de marzo de 2016 .
- ^ "Árbol de fuentes del kernel de Linux" . kernel.org. 2016-10-02.
- ^ https://lwn.net/Articles/532593/
- ^ "Espacios de nombres en funcionamiento, parte 3: espacios de nombres PID" . lwn.net. 2013-01-16.
- ^ "uts_namespaces (7) - Página de manual de Linux" . www.man7.org . Consultado el 16 de febrero de 2021 .
- ^ https://lwn.net/Articles/532593/
- ^ "Espacios de nombres en funcionamiento, parte 5: Espacios de nombres de usuarios" . lwn.net. 2013-02-27.
- ^ Heo, Tejun (18 de marzo de 2016). "[GIT PULL] cgroup soporte de espacio de nombres para v4.6-rc1" . lkml (lista de correo).
- ^ Torvalds, Linus (26 de marzo de 2016). "Linux 4.6-rc1" . lkml (lista de correo). CS1 maint: parámetro desalentado ( enlace )
- ^ "Por fin es el momento: el soporte de espacio de nombres de tiempo se ha agregado al kernel de Linux 5.6 - Phoronix" . www.phoronix.com . Consultado el 30 de marzo de 2020 .
- ^ "Seguridad de Docker" . docker.com . Consultado el 24 de marzo de 2016 . CS1 maint: parámetro desalentado ( enlace )
- ^ "Sandboxing de Chromium Linux" . google.com . Consultado el 19 de diciembre de 2019 . CS1 maint: parámetro desalentado ( enlace )
enlaces externos
- página de manual de espacios de nombres
- Espacios de nombres: la 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 de Linux (incluidos los cgroups v2) - diapositivas de una charla de Rami Rosen, Netdev 1.1, Sevilla, España (2016)
- Contenedores y espacios de nombres en el kernel de Linux por Kir Kolyshkin
- https://medium.com/@teddyking/linux-namespaces-850489d3ccf
- https://medium.com/@teddyking/namespaces-in-go-basics-e3f0fc1ff69a
- https://medium.com/@teddyking/namespaces-in-go-user-a54ef9476f2a
- https://medium.com/@teddyking/namespaces-in-go-reexec-3d1295b91af8
- https://medium.com/@teddyking/namespaces-in-go-mount-e4c04fe9fb29
- https://medium.com/@teddyking/namespaces-in-go-network-fdcf63e76100
- https://medium.com/@teddyking/namespaces-in-go-uts-d47aebcdf00e