15.4. Creación y gestión de jaulas

Algunos administradores dividen las jaulas en dos tipos: jaulas “completas”, que recrean un sistema FreeBSD real, y jaulas “de servicio”, que son aquellas que están dedicadas a una sola aplicación o servicio, en muchos casos ejecutándose sin privilegios. Se trata de una división exclusivamente conceptual, por lo que el proceso de generación de una jaula no se ve afectado por ella. La página de manual jail(8) explica claramente el procedimiento a seguir para generar una jaula:

# setenv D /aquí/está/la/jaula
# mkdir -p $D (1)
# cd /usr/src
# make world DESTDIR=$D (2)
# cd etc/ [1]
# make distribution DESTDIR=$D (3)
# mount_devfs devfs $D/dev (4)
(1)
El mejor punto de partida es la elección del punto del sistema de ficheros del servidor donde estará físicamente ubicada la jaula. /usr/jail/nombredelajaula es un buen sitio. nombredelajaula es el nombre de máquina que identifica a la jaula. El sistema de ficheros /usr/ suele tener espacio suficiente para albergar el sistema de ficheros de la jaula que, cuando se trata de jaulas “completas”, es esencialmente lo necesario para alojar todos y cada uno de los sistemas de ficheros en una instalación del sistema base por omisión de FreeBSD.
(2)
Este comando creará el contenido necesario (binarios, bibliotecas, páginas de manual, etc.) y lo copiará al “subárbol” elegido como ubicación física de la jaula. Todo se hace al típico estilo FreeBSD: se compila todo y luego se instala en la ruta de destino.
(3)
Al pasar el “target” distribution a make se instalan todos los ficheros de configuración necesarios. En pocas palabras, instala cada fichero instalable que haya en /usr/src/etc/ en el directorio /etc de la jaula, es decir, en $D/etc/.
(4)
No es imprescindible montar el sistema de ficheros devfs(8) dentro de la jaula aunque por otra parte (casi) todas las aplicaciones necesitan acceso al menos a un dispositivo, dependiendo esto del propósito de la aplicación. Es muy importante el control del acceso a dispositivos desde la jaula, puesto que una configuración descuidada puede permitir que un atacante haga de las suyas. El control sobre devfs(8) se gestiona mediante reglas que se detallan en las páginas de manual devfs(8) y devfs.conf(5).

Una vez instalada la jaula puede arrancarla mediante jail(8). jail(8) usa los cuatro argumentos que se detallan en la Sección 15.3.1. Puede pasarle otros argumentos además de estos, por ejemplo para ejecutar procesos enjaulados bajo los permisos de un usuario específico. El argumento comando depende del tipo de jaula; si se trata de un virtual system /etc/rc es una buena elección, puesto que ejecutará la secuencia de arranque de un sistema FreeBSD real. Si se trata de una jaula de servicio depende del servicio o aplicación que se quiera ejecutar mediante la jaula.

Con frecuencia las jaulas se arrancan durante el arranque del servidor que las aloja; el sistema rc de FreeBSD permite hacerlo de un modo muy sencillo.

  1. Puede crear una lista de jaulas que quiera arrancar en el inicio del sistema en el fichero rc.conf(5):

    jail_enable="YES"   # Ponga NO si quiere desactivar el arranque de jaulas
    jail_list="www"     # Lista de nombres de jaulas separados por espacios
    
  2. Tendrá que añadir parámetros específicos para cada jaula al fichero rc.conf(5):

    jail_www_rootdir="/usr/jail/www"     # directorio raiz de la jaula
    jail_www_hostname="www.example.org"  # nombre de máquina de la jaula
    jail_www_ip="192.168.0.10"           # dirección IP de la jaula
    jail_www_devfs_enable="YES"          # montar devfs en la jaula
    jail_www_devfs_ruleset="www_ruleset" # reglas a aplicar a devfs dentro de la jaula
    

    El arranque de jaulas por omisión que se configure en rc.conf(5) ejecutará el script /etc/rc de la jaula y asumirá que es un sistema virtual completo. Si se trata de una jaula de servicio el comando de arranque por omisión tendrá que cambiarse configurando la opción jail_nombredejaula_exec_start según convenga.

    Nota: Si quiere consultar la lista completa de opciones consulte la página de manual rc.conf(5).

Puede arrancar o parar a mano una jaula mediante el script /etc/rc.d/jail siempre y cuando la jaula aparezca en rc.conf:

# /etc/rc.d/jail start www
# /etc/rc.d/jail stop www

De momento no hay una forma limpia de apagar una jaula (jail(8)) debido a que los comandos que se usan normalmente para producir un apagado limpio del sistema no pueden usarse dentro de una jaula. La mejor forma de parar una jaula es ejecutar el siguiente comando desde dentro de la propia jaula o bien mediante jexec(8) desde fuera:

# sh /etc/rc.shutdown

Para más información consulte la página de manual jail(8).

Notas

[1]

Este paso no es necesario en FreeBSD 6.0 y versiones posteriores.

Puede descargar éste y muchos otros documentos desde ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Si tiene dudas sobre FreeBSD consulte la documentación antes de escribir a la lista <questions@FreeBSD.org>.
Envíe sus preguntas sobre la documentación a <doc@FreeBSD.org>.