Una jaula (chroot o rootjail) no es más que ejecutar un proceso (o procesos) de forma tal que a los efectos de este, lo que ellos ven del filesystem es un directorio que nosotros le preparamos para que contenga todas las librerías y binarios necesarios para correr.
¿Qué se logra con un rootjail?: Muy simple, en caso de ocurrir una intrusión en nuestro sistema a través de un proceso enjaulado, el atacante quedará encerrado en ese directorio-jaula que para él será todo el filesystem de esa máquina. De esta forma se minimiza el impacto del ataque al no afectarse otros servicios que pueden estar corriendo en la misma máquina.
Varios servicios pueden ser enjaulados, el imap, el named, el snort son ejemplos, pero el más usado es el enjaulamiento del named, ya que éste es muy propenso a ser usado por los atacantes para penetrar en sistemas (a través de buffer overflows, stack overflows y otros exploits). Aunque tengamos instalado utilerías para evitar desbordamientos, nunca está de más tomar más de una medida de precaución para evitar penetraciones.
Por defecto en RHEL y sus clones ya el named viene enjaulado, pero dejamos este artículo presente para referencia en caso de que no se use ninguno de estas distribuciones.
Para correr named como un servicio enjaulado, es necesario copiar algunos directorios y archivos: /etc, /dev, /usr, y /var, al final, el árbol de directorio quedaría así:
/chroot
+-- named
+-- dev
+-- etc
| +-- namedb
| +-- slave
+-- var
+-- run
Llenando la jaula
Crear el directorio de enjaulamientos: mkdir -p /chroot/named
cd /chroot/named
editar /etc/passwd y cambiarle el home directory al usuario named, de: /var/named a: /chroot/named (vi /etc/passwd)
mkdir -p dev etc/namedb/slave var/run
Como ya tenemos una instalación normal del named, podemos copiar ciertos archivos necesarios para que el named corra, desde la ubicación "normal" hacia la jaula:
cp -p /etc/named.conf /chroot/named/etc/
cp -a /var/named/* /chroot/named/etc/namedb/
chown -R named:named /chroot/named/etc/namedb/slave
chown named:named /chroot/named/var/run
Hasta aquí hemos creado los directorios necesarios así como puesto los permisos para que el named pueda operar.
Ahora crearemos los dispositivos que el named requiere, dentro de dev/
mknod /chroot/named/dev/null c 1 3
mknod /chroot/named/dev/random c 1 8
chmod 666 /chroot/named/dev/{null,random}
localtime se requiere por named:
cp /etc/localtime /chroot/named/etc/
Ajustando el syslog
Para llevar logs de lo que el bind realiza, hay que realizar un pequeño cambio en /etc/rc.d/init.d/syslog para permitir que syslog pueda aceptar peticiones desde otros sockets aparte de /dev/log
vi /etc/rc.d/init.d/syslog Buscar: OPTIONS_SYSLOGD="-m 0" y cambiarlo por: OPTIONS_SYSLOGD="-m 0 -a /chroot/named/dev/log"
También, por seguridad (pues ciertos redhat no leen esta variable) agregar lo mismo en: /etc/sysconfig/syslog
reiniciar /etc/rc.d/init.d/syslog restart
ps ax y comprobar que el proceso syslogd tiene las opciones que le agregamos.
ls -l /chroot/named/dev (comprobar que se ha creado 'log')
Endureciendo los permisos
Ahora, procedamos a endurecer los permisos del directorio chroot, para que ningún usuario tenga derechos a entrar a este: chown root /chroot chmod 700 /chroot
Y solo permitimos acceso a named al usuario named:
chown named:named /chroot/named
chmod 700 /chroot/named
Para más seguridad, pongamos algunos directorios y archivos del named como inmutables, para que no puedan ser cambiados, sobreescritos ni borrados:
cd /chroot/named chattr +i etc etc/localtime var Ajustando el script de inicio y arrancando el named editar: /etc/sysconfig/named
y agregar la variable que le indicará al named dónde es su directorio: ROOTDIR="/chroot/named"
editar: /chroot/named/etc/named.conf y cambiar o agregar las siguientes líneas dentro de la sección: "options": directory "/etc/namedb"; pid-file "/var/run/named.pid"; statistics-file "/var/run/named.stats";
Iniciar el named: /etc/rc.d/init.d/named start
comprobar que el proceso haya levantado: ps ax
revisar los logs: tail /var/log/messages
Posibles problemas
Si al iniciar el named, éste se queja de que no puede encontrar rndc.key, editar /chroot/named/etc/named.conf y eliminar la línea que incluye rndc.key, proceder a levantar nuevamente.
Si nos equivocamos en algo y deseamos corregirlo, pero nos dice: permiso denegado, es porque debemos primero quitarle el atributo inmutable al archivo o directorio en cuestión: chattr -i nombredearchivo
Bibliografía adicional
http://www.linuxsecurity.com/docs/LDP/Chroot-BIND-HOWTO.html