BSDes

ezine 1

Programando para inetd

Juan J. Martínez (reidrac)enlace_articulo01


PostgreSQL: Instalación y primeros pasos

Borja López Río (Wu)enlace_articulo02


ProFTPD con MySQL

Oscar M. Lage (r0sk)enlace_articulo03


Confinando procesos con jail

Víctor Balada Díazenlace_articulo04


Confinando procesos con jail


Víctor Balada Díaz

Este artículo repasa el confinamiento de procesos en jail, el sistema similar a chroot de FreeBSD.

Víctor Balada Díaz con 16 años es administrador de varios sistemas FreeBSD. Ha colaborado con proyectos como www.userbsd.net y J-Lan Communicator.

Contacto: victor@alf.dyndns.ws


(versión para imprimir: PDF - PS)

Tabla de contenidos

1. Introducción.

1.1 Un vistazo por encima.

Jail es un sistema para confinar los procesos en un entorno restringido parecido a chroot, pero bastante más avanzado. Su utilidad es diversa (se puede ver un ejemplo práctico de un servidor shell en la parte final del documento), desde montar servidores virtuales para sus clientes con un falso sentido de ser administradores, a aumentar la seguridad del sistema haciendo que los demonios corran en entornos aislados de tal forma que si uno fuese vulnerable no quedase el sistema entero a merced del atacante.

Entre sus ventajas frente a chroot se encuentran:

Por supuesto no todo son ventajas, también tiene sus incovenientes:

Todas las partes han sido probadas en un equipo con FreeBSD 5.1-CURRENT, para cualquier pregunta, sugerencia o comentario puede mandarme un mail a: victor@alf.dyndns.ws

1.2 Requisitos previos.

Para crear una jaula vamos a necesitar las siguientes cosas:

Ademas de esto, usaremos tambien las siguientes variables (es recomendable que las añada a su perfil de shell por ejemplo .cshrc para no olvidar ponerlas tras un reboot o algo similar):

Para referenciar a la maquina que contiene las jaulas nos referiremos a ella como "equipo principal".

Una vez comentado esto vamos a ver como conseguir todas estas cosas.

1.2.1 Consiguiendo una dirección IP.

Bueno, este es el mas complejo de todos, para IPs públicas tiene que pedirlas a su ISP (con el correspondiente cargo extra) o pedirlas directamente a IANA ( http://www.iana.org/ ).

1.2.2 Conseguir el código fuente.

El código fuente del sistema se puede obtener en tres simples pasos:

1.2.3 Poner las variables de entorno.

La sintaxis es 'setenv VARIABLE valor':

# setenv JAIL_PATH /home/jail1/
# setenv JAIL_IP 10.0.0.1
# setenv JAIL_HOSTNAME jaula

2. Creación de una jaula.

La creación de un entorno con jail es bastante simple, aunque algunos demonios pueden traernos dolores de cabeza, como por ejemplo sendmail o rpcbind, para los cuales es mejor poner una jaula dedicada para cada uno o común para todos ellos, pero fuera del equipo principal.

Hay dos formas de hacerlo, una por código, y otra con los paquetes del cdrom.

2.1 Creación de una jaula por código.

# cd /usr/src
# mkdir -p $JAIL_PATH
# make world DESTDIR=$JAIL_PATH
# cd etc
# make distribution DESTDIR=$JAIL_PATH

2.2 Creación de una jaula desde el cdrom.

# setenv DESTDIR $JAIL_PATH
# cd /cdrom
# cd bin
# sh install.sh
# cd ../manpages
# sh install.sh

Y seguiríamos así sucesivamente hasta instalar los paquetes deseados.

2.3 Creación de una jaula (parte común)

Hay una parte común que corresponde con:

# mount_devfs devfs $JAIL_PATH/dev
# cd $JAIL_PATH
# ln -sf dev/null kernel

Instalándolo así, el usuario root de la jaula tendrá acceso a los dispositivos y a la memoria, pudiendo modificar partes externas e incluso salir la jaula si no se está en un secure level apropiado y las reglas de devfs(8) no están ajustadas de forma correcta.

NOTA: Dentro de la jaula esta restringido el acceso a la syscall mknod(2) (entre otras) por tanto ningún proceso de la jaula puede crear nuevos dispositivos.

2.4 Configuración inicial de la jaula

Seguidamente vamos a configurar las cosas básicas para que una jaula "completa" pueda funcionar, por ejemplo el fichero de contraseñas, y la timezone:

2.5 Sysctls especificas.

La configuración de las sysctls es imprescindible hacerlas antes de arrancar la jaula, se pueden cambiar con sysctl(8) como root del equipo principal.

security.jail.set_hostname_allowed

Indica si el usuario root de la jaula puede cambiar el hostname de dicha jaula o no.

security.jail.socket_unixiproute_only

Como todas las familias de protocolos no tienen implementada la funcionalidad de jail, esta sysctl se encargara de restringir que dentro de la jaula se puedan crear sockets de esas familias, actualmente las familias soportadas son: PF_LOCAL, PF_INET y PF_ROUTE.

security.jail.sysvipc_allowed

Esta sysctl se encarga de evitar que un proceso dentro de la jaula tenga acceso a comunicar con otras jaulas o el equipo principal medienta los mecanismos de comunicación entre procesos de System V.

3. Jail en la práctica

Ya estamos listos para arrancar una jaula completa, ahora debemos levantar la interfaz de red, e iniciar la jaula:

# echo sshd_enable='"'YES'"' >> $JAIL_PATH/etc/rc.conf
# ifconfig fxp0 alias $JAIL_IP
# jail $JAIL_PATH $JAIL_HOSTNAME $JAIL_IP /bin/sh /etc/rc

Es tan simple como esto el tener un servidor sshd funcionando dentro de jail.

Espero que siguiendo los pasos descritos no tengais ningún problema para poner en marcha vuestras propias jaulas con jail :-)