La jaula en Linux: chroot

chroot es un comando UNIX que permite ejecutar un proceso bajo un directorio raíz simulado, de manera que el proceso no puede acceder a archivos fuera de ese directorio. Se utiliza principalmente para dos cosas:

  1. para probar programas sospechosos o peligrosos en un entorno seguro (por ejemplo, para instalar unstable en una máquina stable sin interferir con el entorno principal).
  2. para enjaular (hacer chroot) un servicio de red (por ejemplo un servidor web), de manera que quede limitado el entorno de ese servicio y acceda sólo a lo que debe, evitando que escale accesos.

Equivalencias en Windows: MS-Virtual Server.

Cómo funciona chroot

Veamos cómo funciona chroot. Cuando ejecutamos chroot, cuya sintaxis es:

# chroot directorio_chroot comando

chroot lanza /directorio_chroot/comando haciéndole creer que directorio_chroot es el directorio raíz "/". Por ejemplo, si ejecutamos:

# chroot /usr/local/chroot ls /tmp

se ejecuta /bin/ls del entorno chroot (/usr/local/chroot/bin/ls) y obtendremos el listado del directorio /tmp del entorno chroot (/usr/local/chroot/tmp).

Al utilizar chroot debemos tener en cuenta varias cosas:

  • chroot sólo lo puede ejecutar root.
  • el directorio directorio_chroot debe incluir la estructura de directorios propia de un sistema UNIX así como todos los archivos y librerías necesarios para que se ejecute comando, incluyendo el propio comando.
  • una vez que entremos en el entorno chroot, sólo estarán disponibles los archivos que cuelgan de ese directorio. En cambio desde el entorno principal son accesibles todos los ficheros del entorno chroot.
  • los puertos son los mismos en el entorno principal y en el entorno chroot, de manera que si en el entorno principal tenemos un servidor web escuchando en el puerto 80 y lanzamos otro en el entorno chroot, obtendremos un error de Puerto ya en uso.
  • si omitimos comando se ejecuta /bin/bash y root obtendrá un shell (realmente se ejecuta /directorio_chroot/bin/bash).

Instalación del entorno chroot

Para instalar el entorno chroot usaremos debootstrap (paquete debootstrap):

  • en primer lugar, crearemos el directorio para el entorno chroot, por ejemplo:
    # mkdir /usr/local/chroot
  • aunque nuestra intención sea instalar unstable, es preferible instalar primero stable y luego actualizar a unstable. Para seleccionar la versión Debian a instalar se utiliza el nombre concreto de la versión (etch), no el nombre genérico (stable), de modo que ejecutaremos:
    # debootstrap etch /usr/local/chroot

    Puede incluirse como parámetro el mirror, por ejemplo:

    # debootstrap etch /usr/local/chroot http://ftp.es.debian.org/debian
  • en el entorno chroot montaremos el directorio virtual proc:
    # mount proc /usr/local/chroot/proc
  • para que el sistema monte el directorio virtual proc dentro del entorno chroot al iniciar, añadiremos al archivo /etc/fstab del entorno principal la línea:
    # File_system  Mount_point             Type  Options  Dump Pass
    proc           /usr/local/chroot/proc  proc  none     0    0
  • copiaremos el archivo /etc/hosts del entorno principal al entorno chroot:
    # cp /etc/hosts /usr/local/chroot/etc/hosts

En este punto, ya tenemos un entorno chroot usable.

Instalar programas en el entorno chroot

Lo que se instala con debootstrap es un sistema básico, con pocos paquetes, por lo que normalmente hará falta instalar más cosas en el entorno chroot. Para ello, haremos lo mismo que en el entorno principal:

# apt-get install <paquete>

Previamente configuraremos las fuentes de software editando el archivo /etc/apt/sources.list del entorno chroot.

Usar chroot

Para obtener un shell chroot haremos:

# chroot /usr/local/chroot

y obtendremos un shell con el usuario root. El programa que se ejecuta realmente es /usr/local/chroot/bin/bash, y cree que /usr/local/chroot es el directorio raíz "/".

Para salir del shell chroot haremos:

# exit

Usar las X con chroot

Podemos instalar las X en el entorno chroot y ejecutarlas en un terminal libre:

  • entraremos en el entorno chroot:
    # chroot /usr/local/chroot
  • instalaremos el entorno gráfico:
    # apt-get install x-window-system-core gdm icewm icewm-themes iceme
  • editaremos el archivo /etc/gdm/gdm.conf del entorno chroot para que se inicie en la terminal tty8 (FirstVT=8) y crearemos un usuario normal para que gdm nos deje iniciar sesión gráfica. Para lanzar las X ejecutaremos:
    # /etc/init.d/gdm start

    Podremos conmutar entre las X del entorno chroot y las X del entorno principal usando <Ctrl+Alt+F7> y <Ctrl+Alt+F8>.

Artículos en la categoría "Virtualización"

  1. Centralitas telefónicas IP PBX
  2. Clusters Beowulf/PVM
  3. Clusters Beowulf/MPI
  4. Clusters OpenMosix
  5. Clusters Kerrighed
  6. Clusters HA con LVS
  7. Clusters UltraMonkey
  8. Clusters LVS + Keepalived
  9. Emulador Qemu
  10. Máquina virtual VirtualBox
  11. Máquina virtual Xen
  12. API de Windows para Linux: WINE
  13. La jaula en Linux: chroot
  14. Cómo ejecutar aplicaciones Android en Linux
  15. RAID (discos redundantes)
  16. LVM (volúmenes lógicos)
  17. AoE (ATA over Ethernet)
  18. Mirror remoto con DRBD

3 Comments:

  1. Que buena info, pero oye cuando le digo
    debootstrap etch /usr/local/chroot http://ftp.es.debian.org/debian
    el me instala todos los paquetes del repo o hasta que punto va esa instalación?

  2. [...] Se pueden ejecutar ejecutar los scripts sin firmar: 1- en una jaula chroot 2- directamente en una máquina virtual, con Virtualbox [...]

  3. wow que buena vengo de windows considerando la caja de arena como lo maximo y resulta que linux tiene una propia desde hace años,tengo que ver como funciona esto.y cuanto se parece.
    es posible ejecutar un navegador mediante chroot con entorno grafico?
    y si me descargo algo como chroot siempre podre copiarlo y pegarlo en cualquier otra parte no?
    existe algo (un script comando chrootcopia”….) que haga copias de mi sistema principal al sistema chroot en funcion de lo que necesite?
    ie: si como chroot llamo a firefox-bin y este necesite algun recurso/archivo que no este en directorio chroot pero si en el principal,vaya ahi lo copie (solo lectura nada de permisos para escribir) y se lo coppie en la misma ruuta correspondeinte en directorio chroot?
    eso seria perfecto para mi.
    siento explayarme tanto pero es que no tengo n.p.i