Una introducción a los jails en FreeBSD

FreeBSD Jails implementa la virtualización a nivel del sistema operativo, en forma de un entorno separado que se puede crear como un proceso en un sistema host. Las jails con VNET se pueden crear como entornos mínimos, o se les puede dar acceso a más información del host.

InicioBlogIntroducción a Jails en FreeBSD
mar., 1 nov. 2022
Aleksander
Introducción a Jails en FreeBSD Los jails se desarrollaron como una herramienta para que los administradores de sistemas mejoraran la seguridad de un sistema FreeBSD. Introducidas originalmente en FreeBSD 4.0, los jails continúan siendo una parte integral del desarrollo y la progresión del sistema operativo FreeBSD.

¿Qué son las jails?

Las jails (jaulas) se desarrollaron como una herramienta para que los administradores de sistemas mejoraran la seguridad de un sistema basado en FreeBSD. Introducidas originalmente en FreeBSD 4.0, las jails continúan siendo una parte integral del desarrollo y la progresión del sistema operativo FreeBSD.

Las jails se crearon para ampliar el concepto chroot(2), que se utiliza para cambiar el directorio raíz de un conjunto de procesos. Las jails crean un entorno seguro independiente del resto del sistema. Los procesos creados en este entorno no pueden acceder a archivos o recursos fuera de él. Por esta razón, comprometer un servicio que se ejecuta en una cárcel no comprometerá todo el sistema. Las Jails mejoraron el concepto para chroot(2) al virtualizar el acceso al sistema de archivos, los usuarios y el subsistema de red.

Una jail se caracteriza por cuatro elementos:
  • Un subárbol de directorio: el punto de partida desde el cual se ingresa a una jail. Una vez dentro de la jail, no se permite que un proceso escape fuera de este subárbol.
  • Un nombre de host: que será utilizado por la jail.
  • Una dirección IP: la que se le asigna a la jail. La dirección IP de una jail suele ser una dirección de alias para una interfaz de red existente.
  • Un comando: el nombre de la ruta de un ejecutable para ejecutar dentro de la jail.

Si bien la teoría es muy simple y directa, es importante tener en cuenta que la creación de una jail puede volverse extremadamente compleja rápidamente mientras se aprovechan los sistemas y las herramientas dentro del entorno.

Nota: Las jails tienen su propio conjunto de usuarios y su propia cuenta raíz que se limitan al entorno de la jail. La cuenta raíz de una jail no puede realizar operaciones en el sistema fuera del entorno de jail asociado.

Ejemplos de jails

Las jails se utilizan a menudo como entornos de prueba. La ejecución de un servicio o software en una jail permite a los desarrolladores aislar y probar actualizaciones o cambios sin poner en peligro la integridad del resto del sistema.

Esto mitiga el riesgo de mala configuración o errores. Los desarrolladores también tienen la capacidad de ejecutar varias instancias o configuraciones al mismo tiempo sin influir en cada proceso encarcelado por separado.

En sistemas más grandes y complejos, las jails se pueden usar para dividir el sistema en procesos separados enjaulados. Cada jail podría contener sus propias utilidades y configuraciones, lo que permite un sistema mucho más optimizado para tareas específicas. Los procesos extremadamente complejos también se pueden aislar en una jail, separados del sistema principal.

Una jail se puede utilizar como contenedor para un sistema antiguo, preservando la infraestructura crítica como respaldo o como una forma de referirse al código antiguo, todo contenido dentro de un nuevo sistema. De esta manera, el antiguo sistema puede confiar en la seguridad y las herramientas modernas mientras se mantiene separado. Esto puede ser útil para los desarrolladores que necesitan preservar un sistema posiblemente inseguro sin que sea necesario realizar grandes cambios.

Las jails se utilizan a menudo en lugar de una máquina virtual, ya sea para FreeBSD o para la virtualización de otro sistema operativo como Linux. Algunos desarrolladores que buscan portar herramientas y controladores a FreeBSD pueden encontrar esto útil.

¿Como Crear una Jail?

Nota: si bien el proceso de creación de una jail es bastante simple, la aplicación y la configuración reales requieren una comprensión adecuada del sistema operativo FreeBSD. Esta guía está dirigida a personas que ya están familiarizadas con los conceptos básicos del sistema operativo FreeBSD.

Identifique y cree un directorio para la jail.

Aquí es donde la jail residirá físicamente dentro del sistema de archivos del host para la jail. Una buena opción puede ser /usr/jail/mijail, donde mijail es el nombre de host que identifica la jail. Por lo general, /usr/ tiene suficiente espacio para el sistema de archivos de la jail, que para las jail "completas" es, esencialmente, una réplica de cada archivo presente en una instalación predeterminada del sistema base de FreeBSD. En los siguientes ejemplos, el directorio será /usr/jail/mijail.

La herramienta bsdinstall(8) se puede usar para obtener e instalar los archivos binarios necesarios para una jail. Las distribuciones se instalarán en el directorio de destino junto con alguna configuración básica de la jail:


# cd /usr/jail
# mkdir mijail
# bsdinstall jail /usr/jail/mijail

Configuración básica de un firewall en FreeBSD bsdinstall luego iniciará el proceso de instalación de FreeBSD utilizando el instalador.

Una vez que se instala una jail, se puede iniciar utilizando la utilidad jail(8). Los 4 elementos enumerados anteriormente en la guía (subárbol de directorio, nombre de host, dirección IP y comando) servirán como argumentos obligatorios para la utilidad, pero también se pueden especificar otros argumentos.

El argumento del comando depende del tipo de jail empleada. Por ejemplo, si un sistema requiere la secuencia de inicio, como en el caso de una máquina virtual, será ideal especificar /etc/rc.conf bajo el parámetro de comando.


# jail_enable="YES"       # Establézcalo en NO para deshabilitar el inicio de cualquier jail
# jail_list="mijail"      # Arranque automatico en el boot del servidor

El mecanismo rc de FreeBSD proporciona una manera fácil de iniciar cárceles en el arranque.

Configure parámetros de jail específicos en /etc/jail.conf:


mijail {
    host.hostname = mijail.airzox.com;         # Nombre de host
    ip4.addr = 10.6.6.1;                       # Dirección IP de la jail
    path = "/usr/jail/mijail";                 # Ruta a la jail
    mount.devfs;                               # Montar devfs dentro de la jail
    exec.start = "/bin/sh /etc/rc";            # Comando de inicio
    exec.stop = "/bin/sh /etc/rc.shutdown";    # Comando de parada
}

Nota: La dirección IP 10.6.6.1 es una dirección IP privada. Las direcciones IP privadas se utilizan dentro de una red de área local (LAN) y no son visibles en Internet. Las direcciones IP privadas se definen en RFC 1918 (IPv4) y RFC 4193 (IPv6).

El comando service(8) se puede usar para iniciar o detener una jail a mano si existe una entrada para ella en /etc/jail.conf:


# service jail start mijail
# service jail stop mijail

Se puede encontrar más información sobre esto en la página del manual jail(8), incluidos otros argumentos que se pueden establecer para la jail.

Configuración adicional

El ajuste fino de la configuración de una jail se realiza principalmente configurando las variables sysctl(8). Aquí hay una lista de los principales sysctls relacionados con jail, completa con su valor predeterminado. Consulte las páginas del manual jail(8) y sysctl(8) para obtener más información sobre cada variable.


security.jail.set_hostname_allowed: 1
security.jail.socket_unixiproute_only: 1
security.jail.sysvipc_allowed: 0
security.jail.enforce_statfs: 2
security.jail.allow_raw_sockets: 0
security.jail.chflags_allowed: 0
security.jail.jailed: 0

Hay muchísimas guías en la red para crear jails, y algunas son unas páginas excelentes en cuanto a manuales, pero muy pocas instrucciones para eliminarlas completamente. Suponiendo que usó jails o ezjail con la configuración predeterminada, puede eliminarlos a todos con esto:


# chflags -R noschg /usr/jails/mijail
# rm -rf /usr/jails/mijail

Una vez eliminado la jail, puedes empezar de nuevo, esto no elimina las entradas realizadas en /etc/jail.conf.

SUBSCRIBE

Join my mailing list to receive updates on the latest blog posts and other things.