Esta pagina se ve mejor con JavaScript habilitado

Generar Jail desde host físico boot environments

 ·  🎃 kr0m

En el artículo anterior ya utilizamos los boot environments para actualizar hosts físicos o VMs sin tener que preocuparnos por si las actualizaciones dejaban el sistema en un estado inconsistente ya que podíamos revertir a un estado anterior, en esta ocasión vamos a profundizar un poco mas y vamos a generar una Jail desde un equipo físico.

Primero creamos un “boot environment” llamado test:

bectl create test
bectl list

BE      Active Mountpoint Space Created  
default NR     /          976M  2021-03-28 16:39  
test    -      -          8K    2021-04-02 19:40

Exportamos el “boot environment” a un fichero:

bectl export test > test.raw

Como podemos ver se trata de un snapshot ZFS:

file test.raw | tr ‘,’ ‘\n’

test.raw: ZFS shapshot (little-endian machine)  
 version 17  
 type: ZFS  
 destination GUID: BA 27 32 93 51 80 2A AC  
 name: 'zroot/ROOT/test@2021-04-02-20:04:52-0'

Yo personalmente utilizo Iocage como sistema de gestión de Jails, así que creo una Jail llamada test y le asigno una dirección ip:

iocage create -r 12.2-RELEASE -n test
iocage set ip4_addr=“nfe0|192.168.69.69/24” test

Hemos creado la Jail tan solo para poder copiar los ficheros de configuración de Iocage:

cp /zroot/iocage/jails/test/config.json  /root/
cp /zroot/iocage/jails/test/fstab  /root/

Destruimos la Jail:

iocage destroy test

This will destroy jail test  
Are you sure? [y/N]: y  
Destroying test

Copiamos el fichero que contiene el snapshot ZFS al servidor Iocage:

scp test.raw IOCAGE_SERVER

Creamos los datasets zroot/iocage/jails/test y zroot/iocage/jails/test/root manualmente, no utilizamos las funcionalidades de Iocage porque el import está bugeado tal como se describe aquí :

zfs create zroot/iocage/jails/test
zfs create zroot/iocage/jails/test/root

Cargamos el snapshot en dicho dataset:

zfs recv -F zroot/iocage/jails/test/root < test.raw

Copiamos los ficheros de configuración anteriormente backupeados:

cp /root/config.json /zroot/iocage/jails/test/config.json
cp /root/fstab /zroot/iocage/jails/test/fstab

Arrancamos la Jail:

iocage start test

Consultamos el estado de las Jails:

iocage list

+-----+----------+-------+--------------+---------------+
| JID |   NAME   | STATE |   RELEASE    |      IP4      |
+=====+==========+=======+==============+===============+
| 17  | test     | up    | 12.2-RELEASE | 192.168.69.69 |
+-----+----------+-------+--------------+---------------+

Ya podemos acceder a la Jail:

FreeBSD freebsd1.alfaexploit.com 12.2-RELEASE-p4 FreeBSD 12.2-RELEASE-p4 GENERIC  amd64

Recordemos que los siguientes directorios son excluidos de los “boot environments”, si necesitamos alguno de ellos tendremos que sincronizarlos manualmente a la Jail.

/tmp  
/usr/home  
/usr/ports  
/usr/src  
/var/audit  
/var/crash  
/var/log  
/var/mail  
/var/tmp

En el servidor físico permitimos las keys de la Jail para el usuario root:

vi /root/.ssh/authorized_keys

Reconfiguramos OpenSSH para que se pueda acceder directamente como root:

vi /etc/ssh/sshd_config

PermitRootLogin yes

Instalamos bash en la Jail:

pkg install bash

NOTA: En realidad podríamos utilizar cualquier shell o simplemente ejecutar de forma consecutiva cada uno de los scps.

Arrancamos bash:

bash

Finalmente sincronizamos cada uno de los directorios:

for DIR in /tmp /usr/home /usr/ports /usr/src /var/audit /var/crash /var/log /var/mail /var/tmp ; do echo “– Syncing: $DIR” && scp -r root@192.168.69.204 :$DIR/* $DIR ; done

Y ya lo tenemos, una Jail exactamente igual que nuestro servidor físico.

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