Autor: Koji
Fecha: 03/09/2001

Chroot en BIND 8.X

1. Introducción
2. chroot ?
3. Preparativos antes de empezar
4. Compilando y configurando
5. Parcheando el ndc
6. Ultimos ajustes
7. Despedida

Configuración probada en FreeBSD 4.3 + BIND 8.2.3 

1. Introducción

Este articulo va destinado hacia aquellas personas que usan FreeBSD y que desean obtener algo mas de seguridad en su BIND. 
Durante todo el articulo se asume que el servidor de nombres esta correctamente configurado y funcionando, así que si solo buscas configurar un servidor de nombres este articulo no es para ti.

Hay varias posibilidades a la hora de configurar un entorno chroot para el BIND, este articulo explica una de ellas, concretamente la de como configurar un entorno chroot usando un BIND compilado estaticamente. No tengo ninguna preferencia por usar un BIND estático o dinamico, simplemente he escogido una de ellas para que todo sea mas corto y claro.

Parto de la base del BIND que incorpora FreeBSD en su sistema base y de su configuración por defecto. Si has instalando posteriormente otro BIND mediante los ports o compilandolo a mano, la información que leas a continuación no puede ser del todo válida para ti.

Antes de empezar asumo que:

  1. Tienes el CD de FreeBSD con sus fuentes o al menos las tienes instaladas

  2. El directorio de trabajo de tu BIND es /etc/namedb (es el que viene por defecto)

  3. Tienes conocimientos básicos del significado de estático, dinamico, libreria etc.

Durante todo el documento me referiré a los archivos mediante su ruta absoluta para que no haya confusiones y quede todo mas claro.

2. chroot ?

Podemos definir chroot como una llamada al sistema que permite configurar un directorio como raíz ("/") del sistema de ficheros para un proceso y sus hijos.
Por ejemplo, y en nuestro caso, si configuramos el chroot bajo /etc/namedb/chroot el BIND no podrá acceder a ningún archivo ni directorio que esté por debajo del directorio chroot.

Cuales son las ventajas de todo esto?
La mayor ventaja es la de incrementar la seguridad de nuestro BIND. Si se diera alguna vulnerabilidad y alguna persona maliciosa consiguiera explotarla tan solo se podría apoderar del directorio chroot, quedando a salvo el resto del sistema

Cuales son las desventajas de todo esto?
No muchas. La mas significativa es la de tener que tocar la configuración del BIND para que trabaje en el directorio chroot, copiando así todos los archivos especiales y configuración que necesite para funcionar correctamente.

3. Preparativos antes de empezar

Tan solo necesitaremos dos cosas para configurar el chroot en nuestro FreeBSD: los sources y decidir donde colocaremos los binarios y la configuración correspondiente de nuestro BIND.

Cierto es, que FreeBSD trae ya el BIND en su sistema base compilado y listo para ser configurado, pero el que incorpora esta compilado dinamicamente, es por ello que deberemos de volver a compilarlo añadiendo algunas opciones de mas para que sea estático.

Para instalar las fuentes (aseguraos antes de que no las tenéis instaladas mirando en /usr/src) tan solo tenemos que ejecutar /stand/sysinstall y ir al menú Configure / Distributions donde marcaremos la sección src. Para no complicar la cosa elegiremos la opción All y seleccionaremos el medio (normalmente CDROM). Esto instalará todas las fuentes. 

*NOTA PARA LOS QUE VAN ESCASOS EN MEGAS*:  En principio no hace falta instalar todas las fuentes. Si vas justo de megas selecciona las secciones: contrib, libexec y usbin Esas secciones deberían bastar *

Ahora que ya tenemos las fuentes necesarias elegiremos un directorio que será donde hagamos el chroot. Yo durante todo el articulo voy a usar como ejemplo el directorio /etc/namedb/chroot vosotros cambiadlo a donde mas os guste. En principio tanto da donde lo ubiquéis, así que una vez que lo tengáis decidido creamos los directorios donde estarán los binarios, configuración, etc.

mkdir /etc/namedb/chroot 
mkdir /etc/namedb/chroot/etc 
mkdir /etc/namedb/chroot/etc/namedb 
mkdir /etc/namedb/chroot/usr 
mkdir /etc/namedb/chroot/usr/sbin 
mkdir /etc/namedb/chroot/usr/libexec 
mkdir /etc/namedb/chroot/dev 
mkdir /etc/namedb/chroot/var 
mkdir /etc/namedb/chroot/var/run

mkdir /etc/namedb/chroot/etc/namedb/dominios

Este ultimo directorio hace referencia al directorio o directorios donde tengo la configuración de todos mis dominios, esto está especificado en el /etc/namedb/named.conf para cada dominio:

[...] 
zone "eldemonio.org" { type master; file "dominios/eldemonio.org";
 
[...]

4. Compilando y configurando

Para compilar el BIND estaticamente haremos lo siguiente:

cd /usr/src/usr.sbin/named
make NOMAN=YES NOSHARED=YES NOPROFILE=YES BINDIR=/etc/namedb/chroot/usr/sbin clean all install

cd /usr/src/libexec/named-xfer
make NOMAN=YES NOSHARED=YES NOPROFILE=YES BINDIR=/etc/namedb/chroot/usr/libexec clean all install

Todo esto instalara los binarios named y named-xfer estaticamente en el directorio indicado y sin las paginas man. (ya las tenemos)

Podéis hacer una prueba sencilla para ver si todo marcha correctamente ya que llegados a este punto tenemos el BIND que instala FreeBSD por defecto en /usr/sbin/named (dinámico) y el que nosotros hemos compilado que esta situado en /etc/namedb/chroot/usr/sbin/named (estático). Para confirmar todo esto podemos teclear lo siguiente:

ldd /usr/sbin/named /usr/libexec/named-xfer
/usr/sbin/named: libc.so.4 => /usr/lib/libc.so.4 (0x280dd000)
/usr/libexec/named-xfer: libc.so.4 => /usr/lib/libc.so.4 (0x2809c000)

(Depende de librerías)

ldd /etc/namedb/chroot/usr/sbin/named /etc/namedb/chroot/usr/libexec/named-xfer
ldd: /etc/namedb/chroot/usr/sbin/named: not a dynamic executable
ldd: /etc/namedb/chroot/usr/libexec/named-xfer: not a dynamic executable

(No depende de librerías)

Aun falta copiar todos los archivos de configuración del named y nuestros dominios, en mi caso hago lo siguiente:

cd /etc/namedb
cp -p localhost.rev named.conf named.root /etc/namedb/chroot/etc/namedb
cp -pr dominios /etc/namedb/chroot/etc/namedb

Nuestro BIND correrá con el usuario y el grupo bind (menos privilegios que root, es decir, mayor seguridad). FreeBSD viene por defecto con el usuario y grupo creado, pero nunca esta de mas comprobarlo:

grep bind /etc/passwd /etc/group
/etc/passwd:bind:*:53:53:Bind Sandbox:/:/sbin/nologin
/etc/group:bind:*:53:

Si los poseemos solo queda dar los privilegios necesarios:

chown bind:bind /etc/namedb/chroot/etc/namedb/dominios
chmod 750 /etc/namedb/chroot/etc/namedb/dominios

named también necesita el device null y el archivo localtime para logear con la hora correcta si hiciéramos uso de syslogd:

cd /etc/namedb/chroot/dev
mknod null c 2 2
cp -p /etc/localtime /etc/namedb/chroot/etc

5. Parcheando el ndc

BIND trae unos scripts  para facilitarnos la tarea del reiniciado del named (/usr/sbin/named.reload y /usr/sbin/named.restart). Estos scripts hacen uso del programa ndc el cual sirve para realizar muchas operaciones relacionadas con el named. Sin embargo este programa esta compilado para trabajar en los directorios /var/run /usr/sbin etc. Para ahorrarnos la pesada faena de ir editando archivos y compilar de nuevo el ndc haremos un pequeño parche para que podamos usarlo en nuestro directorio chroot.

Primero renombramos el original ndc a ndc.real

mv /usr/sbin/ndc /usr/sbin/ndc.real

Ahora crearemos el archivo /usr/sbin/ndc con el siguiente contenido:

#!/bin/sh 
exec ndc.real -c /etc/namedb/chroot/var/run/ndc "$@"

Solo queda darle permisos de ejecución:

chmod 555 /usr/sbin/ndc

6. Ultimos ajustes

Tenemos que modificar ligeramente nuestro /etc/rc.conf para que empiece a funcionar nuestro named en chroot, así que TODAS las opciones referentes
al BIND quedaran así:

named_enable="YES"
named_program="/etc/namedb/chroot/usr/sbin/named"
named_flags="-u bind -g bind -t /etc/namedb/chroot"
syslogd_flags="-s -l /etc/namedb/chroot/dev/log"

Como veis estamos indicando que el programa named (el estático) esta en /etc/namedb/chroot/usr/sbin/named
También indicamos que named se ejecute con privilegios de usuario y grupo bind y le pasamos el directorio chroot con el parametro -t.
Por ultimo la línea referente a syslogd creará un archivo especial llamado /etc/namedb/chroot/var/run/log que servirá para logear las acciones del named a través del syslogd. Si queréis guardar estos logs tan solo tenemos que tocar ligeramente el /etc/syslog.conf con la línea:


Website templates are pre-designed websites all you need to do is add your own personal content and you're ready to jump start your own website. Website templates by Vooweb

!named                                                                                                               
*.*                                                     /var/log/named

Aseguraos  de crear el archivo /var/log/named antes de hacer el reboot

Y ahora ya por fin, lo mas fácil, reiniciar nuestra maquina :-)

7. Despedida

Pues como digo siempre, cualquier duda, comentario o rectificación hacedmelo saber ;-)

koji

eldemonio.org El site BSD en Castellano Articles catalogue

Website templates are pre-designed websites all you need to do is add your own personal content and you're ready to jump start your own website. Website templates by Vooweb

eldemonio.org v 4_2