Bind
DNS es un servicio extremadamente importante para redes IP. No dudaría en decir que probablemente sea el servicio MÁS importante (sin él, nadie puede encontrar nada más). También requiere conexiones provenientes del mundo exterior, y debido a la naturaleza y estructura del DNS, la información que los servidores de DNS dicen tener puede no ser cierta. El principal proveedor de software DNS (named, el standard de facto) actualmente está buscando la forma de añadir información de autentificación ( utilizando RSA para firmar criptográficamente los datos, probando que es "cierto"). Si se tiene planeado administrar servidores DNS, yo diría que es de obligada lectura "DNS & BIND", de O’Reilly and Associates.
La mayoría de las distribuciones vienen con bind 8.x, sin embargo ninguna (según mis conocimientos) lo trae configurado para no-root, utilizan chroot por defecto. Sin embargo hacer el cambio es sencillo:
-u
especifica a qué UID cambiará bind una vez que esté vinculado al puerto 53 (me gusta utilizar un usuario llamado ‘named’ sin permisos de login, similar a ‘nobody’).
-g
especifica el directorio al que bind se hará chroot a sí mismo una vez que esté arrancado. /home/named es una buena apuesta, es en este directorio donde se deberían situar todas las librerías y ficheros de configuración que va a necesitar bind.
Una forma incluso más sencilla de ejecutar bind con chroot es descargar el paquete bind-chroot, disponible como paquete de contribución en la mayoría de las distribuciones, e instalarlo. Antes de la instalación, se necesitará un usuario y un grupo llamados named (al cual cambiará el servidor bind su UID/GID), simplemente utilizar groupadd y useradd para crear el usuario/grupo. Algunos paquetes utilizan holelogd para hacer un log de la información de bind en /var/log/messages (de igual forma que haría bind). Si no está disponible, habrá que instalarlo a mano, lo cual es una faena. Además de esto, el fichero de configuración por defecto de bind se suele configurar de forma segura (p. ej., no se puede hacer una petición a bind acerca de su versión).
Otro aspecto de bind es la información que contiene sobre tu(s) red(es). Cuando alguien hace una petición a un servidor DNS, por lo general envían una petición pequeña por cada información. Por ejemplo, ¿cuál es la dirección IP de www.seifried.org? Y existen transferencias de dominios, en las cuales un servidor DNS solicita toda la información disponible sobre, digamos, seifried.org, la recibe y después la pone disponible a otros (en el caso de un servidor DNS secundario). Esto es potencialmente peligroso, ya que puede ser tanto o más peligroso que enviar el número de teléfono de la compañía a cualquiera que llame y lo solicite. La versión 4 de Bind no se preocupaba demasiado sobre la seguridad, se podían limitar las transferencias a ciertos servidores, pero no de la forma lo suficientemente selectiva como para ser realmente útil. Esto ha cambiado en Bind 8, la documentación se encuentra disponible en http://www.isc.org/bind.html. Resumiendo, en Bind 8 existen configuraciones globales, la mayoría de las cuales se pueden aplicar basadas en el dominio. Se pueden restringir con facilidad las transferencias Y las peticiones, hacer log de las peticiones, configurar los tamaños máximos de los datos, etcétera. Recuerda, cuando se está restringiendo las peticiones de zona, se deben asegurar TODOS los servidores de nombres (principal y secundarios), ya que se pueden transferir zonas desde un secundario con igual facilidad que desde el principal.
He aquí un fichero de configuración named.conf relativamente seguro (robado del paquete bind-chroot disponible en ftp.tux.org):
options {
// Para este chroot se necesitan los siguientes paths
directory "/var/named";
dump-file "/var/tmp/named_dump.db"; // _PATH_DUMPFILE
pid-file "/var/run/named.pid"; // _PATH_PIDFILE
statistics-file "/var/tmp/named.stats"; // _PATH_STATS
memstatistics-file "/var/tmp/named.memstats"; // _PATH_MEMSTATS
// Fin de los paths necesarios
check-names master warn; /* default. */
datasize 20M;
};
zone "localhost" {
type master;
file "master/localhost";
check-names fail;
allow-update {
none;
};
allow-transfer {
any;
};
};
zone "0.0.127.in-addr.arpa" {
type master;
file "master/127.0.0";
allow-update {
none;
};
allow-transfer {
any;
};
};
// Denegar y registrar peticiones de versión excepto desde localhost
zone "bind" chaos {
type master;
file "master/bind";
allow-query {
localhost;
};
};
zone "." {
type hint;
file "named.zone";
}
;zone "ejemplo.org" {
type master;
file "zones/ejemplo.org";
allow-transfer {
10.2.1.1;
10.3.1.1;
};
};
Bind se ejecuta en el puerto 53, utilizando udp y tcp, udp se utiliza para las peticiones normales de dominios (es ligero y rápido), tcp se utiliza para las transferencias de zonas y peticiones más grandes (como excavar www.microsoft.com). De modo que filtrar con el cortafuegos el tcp es relativamente seguro y eliminará cualquier transferencia de zonas, pero la petición ocasional al DNS podría no funcionar. Es mejor utilizar named.conf para controlar las transferencias de zonas:
ipfwadm –I –a accept –P tcp –S 10.0.0.0/8 –D 0.0.0.0/0 53
ipfwadm –I –a accept –P tcp –S un.host.fiable –D 0.0.0.0/0 53
ipfwadm –I –a deny –P tcp –S 0.0.0.0/0 –D 0.0.0.0/0 53
o
ipchains –A input –p tcp –j ACCEPT –s 10.0.0.0/8 –d 0.0.0.0/0 53
ipchains –A input –p tcp –j ACCEPT –s un.host.fiable –d 0.0.0.0/0 53
ipchains –A input –p tcp –j DENY –s 0.0.0.0/0 –d 0.0.0.0/0 53
lo cual bloquearía las transferencias de zonas y las peticiones grandes, lo siguiente bloquearía las peticiones normales (pero no las transferencias de zona, de modo que si se está bloqueándolo, recordar utilizar ambos conjuntos de reglas)
ipfwadm –I –a accept –P udp –S 10.0.0.0/8 –D 0.0.0.0/0 53
ipfwadm –I –a accept –P udp –S un.host.fiable –D 0.0.0.0/0 53
ipfwadm –I –a deny –P udp –S 0.0.0.0/0 –D 0.0.0.0/0 53
o
ipchains –A input –p udp –j ACCEPT –s 10.0.0.0/8 –d 0.0.0.0/0 53
ipchains –A input –p udp –j ACCEPT –s un.host.fiable –d 0.0.0.0/0 53
ipchains –A input –p udp –j DENY –s 0.0.0.0/0 –d 0.0.0.0/0 53
Dents
Dents es un servidor DNS con licencia GPL, actualmente en fase de pruebas (versión 0.0.3). Dents se está escribiendo desde cero, con soporte para SQL, integración con SNMP, utilizando CORBA internamente. Todo en conjunto debería compensar a Bind, tengo planeado probarlo y evaluarlo, pero hasta entonces tendrás que intentarlo tú mismo. Dents se encuentra disponible en: http://www.dents.org/.
Copyright © 1999, Kurt Seifried, José Antonio Revilla
Todos los derechos reservados.