Dominando Espacios de Nombres Linux: Comandos unshare y nsenter para Aislamiento y Virtualización

Clasificado en Informática

Escrito el en español con un tamaño de 5,49 KB

Introducción a los Espacios de Nombres en Linux

Los espacios de nombres (namespaces) en Linux son una característica fundamental del kernel que permite el aislamiento de recursos del sistema. Cada proceso tiene su propio conjunto de espacios de nombres, lo que proporciona una forma ligera de virtualización y es la base de tecnologías como los contenedores (Docker, LXC).

El comando unshare es una herramienta poderosa que permite crear y manipular estos espacios de nombres, ejecutando un programa en un nuevo entorno aislado. A continuación, exploraremos su funcionamiento y algunas de sus opciones clave, junto con el comando nsenter, que permite entrar en los espacios de nombres de un proceso existente.

Conceptos Fundamentales de unshare

El comando unshare -u crea un nuevo espacio de nombres UTS (Unix Time-sharing System) y ejecuta un bash dentro de ese nuevo espacio de nombres UTS.

La existencia de este nuevo espacio de nombres UTS puede verificarse comparando la salida de los comandos ls -l /proc/$$/ns: todos los espacios de nombres serán idénticos, excepto el de UTS. Esta misma información también es accesible mediante el comando lsns.

Es posible cambiar el nombre de la máquina dentro de este nuevo espacio de nombres, pero los procesos en el espacio de nombres por defecto no percibirán dicho cambio.

Cuando el proceso bash finaliza, el nuevo espacio de nombres UTS se destruye.

Opciones Clave de unshare y nsenter

Experimento 2: Opciones de unshare para Procesos y Montajes

  • -f, --fork: Crea el programa especificado como un proceso secundario de unshare en lugar de ejecutarlo directamente. Esto es útil al crear un nuevo espacio de nombres.
  • --mount-proc: Justo antes de ejecutar el programa, monta el sistema de archivos proc en el punto de montaje (/proc). Esto es particularmente útil al crear un nuevo espacio de nombres PID. Implica también la creación de un nuevo espacio de nombres de montaje, ya que de otro modo el montaje de /proc podría generar conflictos.
  • -p, --pid: Descomparte el espacio de nombres PID. Si se especifica un archivo, se crea un espacio de nombres persistente mediante un montaje de enlace.

Experimento 3: Gestión de Espacios de Nombres de Montaje

El comando mount -t tipo dispositivo dir indica al núcleo que adjunte el sistema de archivos ubicado en el dispositivo al directorio dir. El contenido previo, el propietario y los permisos de dir se vuelven invisibles. Mientras este sistema de archivos permanezca montado, la ruta de acceso dir se referirá a la raíz del sistema de archivos en el dispositivo.

  • -m, --mount [=archivo]: Descomparte el espacio de nombres de montaje. Si se especifica un archivo, se crea un espacio de nombres persistente mediante un montaje de enlace. Es importante tener en cuenta que el archivo debe estar ubicado en un sistema de archivos con propagación. El espacio de nombres montado solo será visible dentro de la sesión bash donde se realizó el montaje; si se accede desde otro terminal, el archivo montado parecerá no existir. Esto se debe a la acción del flag -m del comando unshare.

Experimento 4: Espacios de Nombres UTS y Mapeo de Usuarios

  • -u, --uts [=archivo]: Descomparte el espacio de nombres UTS, lo que significa que crea un nuevo espacio de nombres UTS y ejecuta un bash dentro de él. Si se especifica un archivo, se crea un espacio de nombres persistente mediante un montaje de enlace.
  • -r, --map-root-user: Ejecuta el programa solo después de que los ID de usuario y grupo efectivos actuales se hayan mapeado al UID y GID de superusuario dentro del espacio de nombres de usuario recién creado. Esto permite adquirir las capacidades necesarias para gestionar diversos aspectos de los espacios de nombres recién creados, incluso cuando se ejecuta sin privilegios, sirviendo como una característica de conveniencia. Sin embargo, no soporta casos de uso más complejos, como la asignación de múltiples rangos de UID y GID.

Experimento 6: El Comando nsenter

El comando nsenter permite ejecutar un programa dentro de los espacios de nombres de otros procesos.

  • -a, --all: Entra en todos los espacios de nombres del proceso de destino, utilizando las rutas por defecto /proc/[pid]/ns/*. Las rutas por defecto a los espacios de nombres del proceso de destino pueden ser sobrescritas por el espacio de nombres. El espacio de nombres del usuario se ignorará si es el mismo que el espacio de nombres de usuario actual del proceso que llama.
  • -t, --target pid: Especifica un proceso de destino (pid) para obtener sus contextos de espacio de nombres. Existen diferentes rutas para obtener todos los contextos por pid.

Entradas relacionadas: