Objetivo
El objetivo de este esquema es mantener un entorno web controlado, restringido e independiente del "sistema base", con el fin de reducir el nivel de daño que pueda causar un atacante al comprometer el servidor web.
Motivación
Durante el tiempo que llevo administrando servidores y utilizando software libre, he utilizado una gran cantidad de aplicaciones web, las cuales, por falta de tiempo, de ganas, o por que simplemente las olvide; dejé de actualizarlas a las últimas versiones y fueron comprometidas.
El que sean comprometidas nunca ha sido tan grave para mi, solo borro la aplicación o reinstalo con una nueva versión; sin embargo, que pasa cuando la aplicación permite la inclusión de código remoto y el servidor la ejecución de comandos ?
La respuesta es sencilla, uno debe ir buscando un nuevo servidor o pensar en reinstalar el actual.
Si además a lo anterior se le suma una gran cantidad de vhosts de los cuales otras personas son quienes instalan aplicaciones web y no tienen el conocimiento, tiempo o ganas de mantenerlas actualizadas, el problema se vuelve enorme y muy difícil de detectar.
Las soluciones son obvias para los 2 problemas, la primera es mantener actualizado el software.
Para solucionar el problema de ejecución de comandos en el servidor, por poner un ejemplo, en PHP se pueden desactivar todas las funciones de ejecución de comandos; lo cual prácticamente evitaría que ejecuten comando alguno en el servidor, sin embargo, esto aplica para todos los vhost y no hay forma de restringirlo a unos cuantos. La misma situación puede aplicar otras aplicaciones web y cgi.
La mejor solución es el aislamiento de todo el servicio web, lo cual FreeBSD permite de forma sencilla (pero laboriosa), por medio del uso de "Jail".
Implementación
Para esta nota no voy a entrar en la descripción del proceso de creación y configuración de la jaula, dicha información la pueden consultar en el handbook [http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/jails.html].
Después de realizar la instalación de la jaula, lo que hay que hacer es instalar todo el entorno web y configurarlo, en mi caso, instalo apache, php, perl, python, cronolog, etc; todo a partir de ports, y configuro cada aplicación a medida.
Una recomendación adicional al montar una jaula con privilegios restringidos es, montar /tmp usando tmpfs y agregandole opciones de noexec y nosuid, por ejemplo, esta es la linea que tengo en el fstab de un servidor (en el "sistema base").
tmpfs /home/vps/DIRECCION_IP/tmp tmpfs noexec,nosuid,rw,size=536870912 0 0
Beneficio
El beneficio principal del aislamiento del servicio web consiste en que se pueden tener diferentes servidores web con diferentes niveles de restricciones y/o aplicaciones, por ejemplo, podemos tener una jaula que tenga un entorno restringido para nuestros usuarios (que no sabemos que van a instalar y cada cuando van a actualizar), otro mas relajado para nuestros sitios, y así, según requiramos.
Notas finales
Ya solo me resta mencionar que esta nota esta enfocada únicamente en aislar un entorno web, no en asegurarlo haciendo uso de mod_security, portaudit, etc; sin embargo, es una muy buena práctica asegurar mas el entorno usando dichas aplicaciones.
Así mismo les recuerdo que el procedimiento de aislamiento usando "jail" es genérico, y aplica para cualquier servicio, no solo para el web.
Autor
Angel Gabriel León Rodríguez