Esta pagina se ve mejor con JavaScript habilitado

Ezjails FreeBSD

 ·  🎃 kr0m

Ezjail es una utilidad que nos ayudará a gestionar de forma mas sencilla los jails sobre FreeBSD, una característica interesante es que utiliza una plantilla base que se comparte entre jails mediante nullfs, de este modo se reutilizará la base sin utilizar espacio adicional en disco.’, ‘Las actualizaciones realizadas en la base se aplicarán de forma automática en el resto de jails, el sistema de ports se comportará de forma análoga.

Para utilizar jails debemos crear una interfaz de loopback secundaria, con ello tendremos una red 127.0.0.0/8 totalmente aislada:

vi /etc/rc.conf

cloned_interfaces="lo1"
service netif cloneup

Con esta interfaz todas los jails podrán verse entre ellos, el primer jail será la 127.0.0.1, el siguiente la .2 y así sucesivamente.

Instalamos ezjail:

pkg install ezjail

Lo habilitamos en el arranque:

sysrc ezjail_enable="yes"

Ahora lo hacemos manualmente:

service ezjail start

Instalamos el template base de todos los jails:

ezjail-admin install -p

Creamos el primer jail:

ezjail-admin create kr0mjail ’lo1|127.0.0.1,em0|192.168.69.24'

Si queremos que ping funcione el jail debe utilizar raw sockets, editamos la config para permitírselo, solo debemos habilitar las opciones estrictamente necesarias para que el jail pueda dar servicio, el ping no lo es, pero en este ejemplo lo habilitaremos para debugear con mayor facilidad ya que se trata de nuestro primera jail:

vi /usr/local/etc/ezjail/kr0mjail

export jail_kr0mjail_parameters="allow.raw_sockets=1"

Arrancamos el jail:

ezjail-admin start kr0mjail

Comprobamos que haya arrancado y que la configuración de red sea correcta:

ezjail-admin list

STA JID  IP              Hostname                       Root Directory
--- ---- --------------- ------------------------------ ------------------------
DR  2    127.0.0.1       kr0mjail                       /usr/jails/kr0mjail
    2    em0|192.168.69.24

Entramos en el jail y le asignamos un password al usuario root:

ezjail-admin console kr0mjail

passwd

Habilitamos ssh en el arranque:

sysrc sshd_enable="yes"

Lo arrancamos manualmente:

service sshd start

Añadimos un usuario secundario:

adduser

Configuramos el timezone:

tzsetup

adjkerntz intentará ajustar la hora del sistema pero el jail no será capaz así que lo comentamos en el crontab:

sed -i .bak -e ‘/adjkerntz/ s/^/#/’ /etc/crontab

Configuramos los servidores dns:

echo “nameserver 8.8.8.8” > /etc/resolv.conf
echo “nameserver 8.8.4.4” » /etc/resolv.conf

Configuramos el /etc/hosts:

vi /etc/hosts

::1 localhost kr0mjail 
127.0.0.1 localhost kr0mjail

Ya debemos tener acceso por ssh:

Las actualizaciones base se realizarán en el host padre mediante:

ezjail-admin update -u

Si no es una actualización rutinaria si no una actualización de versión, primero debemos averiguar de que versión partimos:

file /usr/jails/basejail/bin/sh

/usr/jails/basejail/bin/sh: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), dynamically linked, interpreter /libexec/ld-elf.so.1, for FreeBSD 12.0 (1200086), FreeBSD-style, stripped

Luego ejecutaríamos:

ezjail-admin update -U -s 12.0-RELEASE

Ahora hay que terminar el update desde dentro de cada jail, dependiendo de si los usuarios/servicios del jail son de fiar o no procederemos de distinto modo.

No fiable:
Montamos el directorio /usr/src dentro de el jail:

rm -rf /usr/jails/kr0mjail/usr/src
mkdir /usr/jails/kr0mjail/usr/src
mount -t nullfs -o ro /usr/src /usr/jails/kr0mjail/usr/src

Accedemos a el jail y ejecutamos mergemaster:

ezjail-admin console kr0mjail
cd /usr/src
mergemaster -U
exit

Desmontamos /usr/src:

umount /usr/jails/kr0mjail/usr/src

Fiable:

mergemaster -U -D /usr/jails/kr0mjail

Los ports se comparten entre jails, procedemos a actualizarlos en todos los jails de forma simultánea:

ezjail-admin update -P

NOTA: Algunos ports necesitan ser compilados con la opción JAIL para que funcionen correctamente.
NOTA: El borrado de un jail está bugeado, deja ficheros residuales.

Borramos el jail:

ezjail-admin delete kr0mjail

Si intentamos crearlo de nuevo:

ezjail-admin create kr0mjail ’lo1|127.0.0.1,em0|192.168.69.24'
Error: A file or a non empty directory already exists at the specified jail root /usr/jails/kr0mjail.

Eliminamos el flag inmutable del directorio y lo borramos:

chflags -R noschg /usr/jails/kr0mjail
rm -rf /usr/jails/kr0mjail

Ezjail nos permite archivar un jail y restaurarlo en el propio host o en cualquier otro, de este modo podemos duplicar jails de forma rápida:

ezjail-admin stop kr0mjail
chflags noschg /usr/jails/kr0mjail//var/empty/
ezjail-admin archive kr0mjail
ls -la /usr/jails/ezjail_archives/

total 10
drwxr-xr-x 2 root wheel 3 Apr 25 20:46 .
drwxr-xr-x 7 root wheel 7 Apr 25 15:51 ..
-rw-r--r-- 1 root wheel 1033845 Apr 25 20:46 kr0mjail-201904251646.31.tar.gz

Podemos restaurar el archive con otro nombre:

ezjail-admin create -a /usr/jails/ezjail_archives/kr0mjail-201904252046.31.tar.gz kr0mjail-clone ’lo1|127.0.0.2,em0|192.168.69.25'
ezjail-admin list

ezjail-admin list
STA JID  IP              Hostname                       Root Directory
--- ---- --------------- ------------------------------ ------------------------
DS  N/A  127.0.0.2       kr0mjail-clone                 /usr/jails/kr0mjail-clone
    N/A  em0|192.168.69.25
DS  N/A  127.0.0.1       kr0mjail                       /usr/jails/kr0mjail
    N/A  em0|192.168.69.24

Arrancamos la copia y el jail original:

ezjail-admin start kr0mjail-clone
ezjail-admin start kr0mjail

A modo de resumen dejo las operaciones básicas realizadas en ezjail.

Arrancar jail:

ezjail-admin start kr0mjail

Para jail:

ezjail-admin stop kr0mjail

Deshabilitar el autoarranque:

ezjail-admin config -r norun kr0mjail

Habilitar el autoarranque:

ezjail-admin config -r run kr0mjail

Si te ha gustado el artículo puedes invitarme a un RedBull aquí