Entrada

Jails en FreeBSD con Bastille

01/07/2024

En el mundo de la administración de sistemas. Se ha hecho muy popular el aislar servicios. Esto ayuda a tener una mejor seguridad y un mejor manejo de servicios, poder darle mantenimiento por separado sin necesidad de afectar algún otro servicio.

Conocemos herramientas como Docker de las mas populares actualmente. Sin embargo, FreeBSD ha incorporado desde hace mas de 20 años en su versión 4.0 (actualmente 14.1) el concepto de "Jails". Que es un espacio aislado al sistema principal con el que podemos montar servicios de manera segura.


Al día de hoy las Jails de FreeBSD son comparables y hasta superiores en algunos aspectos a los contenedores de Docker.

Aquí veremos como empezar a utilizar Jails en FreeBSD gracias a Bastille, que es una herramienta para manejar nuestras Jails de una forma muy rápida y muy parecida también a Docker. Por lo que si ya lo dominas no te costara entender los comandos de Bastille.

Preparación - Actualizar el sistema (opcional)

Aunque es opcional. Bastille recomienda actualizar nuestro sistema para garantizar la seguridad en nuestras Jails.

Para ello ejecutaremos lo siguientes comandos:

freebsd-update fetch
freebsd-update install

Terminada la actualización reiniciaremos el sistema:

# reboot

Instalación

La instalación es muy fácil. Basta con ejecutar los siguientes comandos.

# pkg update
# pkg install bastille

También necesitaremos el paquete bootstrap:

# pkg install bootstrap

Si queremos que Bastille inicie junto a nuestro sistema, ejecutaremos las siguientes lineas:

# sysrc bastille_enable=YES
# sysrc bastille_rcorder=YES

Configuración de red

Como en Docker. Las Jails de FreeBSD son como pequeñas maquinas, por lo que requieren tener una IP virtual y una conexión de tipo puente (bridge) o NAT. En este caso configuraremos una red NAT para Bastille.

Primero crearemos la interfaz que se utilizara con los siguientes comandos:

# sysrc cloned_interfaces+=lo1
# sysrc ifconfig_lo1_name="bastille0"
# service netif cloneup

Ahora crearemos nuestras reglas de redirección de red. Crearemos o modificaremos el archivo /etc/pg.conf con el siguiente contenido:

ext_if="vtnet0"

set block-policy return
scrub in on $ext_if all fragment reassemble
set skip on lo

table <jails> persist
nat on $ext_if from <jails> to any -> ($ext_if:0)
rdr-anchor "rdr/*"

block in all
pass out quick keep state
antispoof for $ext_if inet
pass in inet proto tcp from any to any port ssh flags S/SA keep state

Importante: Actualizar la linea ext_if="vtnet0" y reemplazar vtnet0 por la interfaz de tu red externa.

Por ultimo iniciaremos el servicio PF:

# sysrc pf_enable=YES
# service pf start

Creando Jails con Bastille

Ahora ya podemos crear Jails. Lo primero que haremos sera desempaquetar la versión mas reciente de FreeBSD. Al día de hoy la versión es la 14.1:

# bastille bootstrap 14.1-RELEASE

Ahora ya podemos crear nuestra primera Jail:

# bastille create NAME 14.1-RELEASE IP

Donde el "NAME" sera el nombre que quieras ponerle a tu Jail. Y la "IP" puede ser entre 10.0.0.0/8, 172.16.0.0/12 y 192.168.0.0/16.

Por ejemplo:

# bastille create myJail 14.1-RELEASE 10.0.0.1

Podemos ver nuestras Jails que están activas con el comando:

# bastille list

Para detener un Jail:

# bastille stop NAME

Para iniciar un Jail:

# bastille start NAME

Para ver todos los comandos solo ejecuta:

# bastille

Manipulando nuestro Jail

Para instalar paquetes, iniciar servicios o manipular la maquina de nuestro Jail podemos ejecutar los siguientes comandos:

;; Instalar un paquete al contenedor
# bastille pkg NAME install PACKAGE
;; Ejemplo
# bastille pkg myJail install htop

;; Ver los procesos de un Jail
# bastille htop NAME

;; Iniciar un servicio dentro del Jail
# bastille service NAME SERVICE start
;; Ejemplo
# bastille service myJail sshd start

;; Ejecutar un comando arbitrario:
# bastille cmd NAME COMMAND

Y si quieres manipular todo desde la terminal interna puedes entrar con el comando:

# bastille console NAME

Redireccionando conexiones

Con tus Jail activas puedes comunicarte directamente a través de su IP. Pero si quieres que algún puerto o servicio sea expuesto (a la interfaz configurada en pasos anteriores). Hará falta redireccionar los puertos.

Para ello Bastille incorpora el comando "rdr":

# bastille rdr NAME [tcp/udp] HOST_PORT JAIL_PORT

Si por ejemplo queremos que nuestra maquina muestre un sitio web en el puerto 80 y nuestro Jail ejecuta la web en el puerto 8000. Entonces ejecutaremos:

# bastille rdr myJail tcp 80 8000

Podemos ver las redirección que tiene activa un Jail con el comando:

# bastille rdr NAME list

Y limpiar las redirecciones con:

# bastille rdr NAME clear

¡Y eso es todo! Ahora ya podemos orquestar y montar los servicios que queramos en Jails gracias a Bastille.

Pronto subiré algunos tutoriales montando servicios populares como Nextcloud, servidor Jabber, Gotosocial, etc. ¿Cual te gustaría aprender a montar?

Tags: #tutorial # freebsd # bastille # jails