Configuración y Seguridad de BIND DNS
Configuración y Seguridad de BIND DNS
BIND
Servidor DNS
BIND (Berkeley Internet Name Domain, anteriormente: Berkeley Internet Name Daemon) es el
servidor de DNS más comúnmente usado en Internet, especialmente en sistemas Unix, en los
cuales es un estándar de facto. Es patrocinado por la Internet Systems Consortium. BIND fue
creado originalmente por cuatro estudiantes de grado en la University of California, Berkeley y
liberado por primera vez en el 4.3BSD. Paul Vixie comenzó a mantenerlo en 1988 mientras
trabajaba para la DEC.
Una nueva versión de BIND (BIND 9) fue escrita desde cero en parte para superar las dificultades
arquitectónicas presentes anteriormente para auditar el código en las primeras versiones de
BIND, y también para incorporar DNSSEC (DNS Security Extensions). BIND 9 incluye entre otras
características importantes: TSIG, notificación DNS, nsupdate, IPv6, rndc flush, vistas,
procesamiento en paralelo, y una arquitectura mejorada en cuanto a portabilidad. Es
comúnmente usado en sistemas GNU/Linux.
Soporte para base de datos
Las versiones anteriores de BIND no ofrecen ningún mecanismo para almacenar y recuperar
datos del sitio en diferentes condiciones en archivos de texto plano. Desde la versión 9,4 de BIND,
DLZ ha estado disponible como una opción que permite tiempo de compilación para el
almacenamiento del sitio en una gran variedad de formatos de bases de datos como por ejemplo
LDAP, Berkeley DB, PostgreSQL, MySQL u ODBC.
Seguridad
Como otras herramientas que estuvieron presentes desde los primeros días de Internet, BIND 4 y
BIND 8 han tenido un gran número de vulnerabilidades de seguridad a lo largo del tiempo. BIND
9, habiéndose reescrito, tiene un historial mucho mejor en cuanto a este tema, aunque es común
que se sigan encontrando problemas de seguridad tanto en las versiones actuales como las
anteriores.
Instalación y configuración
Instalación
Debian
CentOS
CentOS
Debian
Ficheros de configuración
CentOS
Debian
// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/[Link] for information on the
// structure of BIND configuration files in Debian, *BEFORE* you customize
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/[Link]
include "/etc/bind/[Link]";
include "/etc/bind/[Link]";
include "/etc/bind/[Link]-zones";
Fichero [Link] :
options {
directory "/var/cache/bind";
// forwarders {
// [Link];
// };
//========================================================================
// If BIND logs error messages about the root key being expired,
// you will need to update your keys. See [Link]
//========================================================================
dnssec-validation auto;
listen-on-v6 { any; };
};
Fichero [Link] :
//
// Do any local configuration here
//
// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";
Fichero [Link]-zones :
// be authoritative for the localhost forward and reverse zones, and for
// broadcast zones as per RFC 1912
zone "localhost" {
type master;
file "/etc/bind/[Link]";
};
zone "[Link]" {
type master;
file "/etc/bind/db.127";
};
zone "[Link]" {
type master;
file "/etc/bind/db.0";
};
zone "[Link]" {
type master;
file "/etc/bind/db.255";
};
Implementaciones
Almacenamiento en caché del servidor DNS
La primera configuración será para un servidor DNS de almacenamiento en caché. Este tipo de
servidor también se conoce como solucionador porque maneja consultas recursivas y
generalmente puede manejar el trabajo pesado de rastrear datos DNS de otros servidores.
Casi todos los servidores DNS que pueda tener en su configuración de red almacenarán
servidores DNS en caché. Estos compensan la falta de bibliotecas de resolución de DNS
adecuadas implementadas en la mayoría de las máquinas cliente. Un servidor DNS de
almacenamiento en caché es una buena opción para muchas situaciones. Si no desea depender
del DNS de su ISP u otros servidores DNS disponibles públicamente, crear su propio servidor de
almacenamiento en caché es una buena opción. Si está muy cerca físicamente de las máquinas
cliente, también es muy probable que mejore los tiempos de consulta de DNS.
Primero, cubriremos cómo configurar Bind para que actúe como un servidor DNS de
almacenamiento en caché. Esta configuración obligará al servidor a buscar respuestas de forma
recursiva de otros servidores DNS cuando un cliente emita una consulta. Esto significa que está
haciendo el trabajo de consultar cada servidor DNS relacionado por turnos hasta que encuentre
la respuesta completa.
Para configurar el almacenamiento en caché, el primer paso es configurar una lista de control de
acceso o ACL.
Como servidor DNS que se utilizará para resolver consultas recursivas, no queremos que
usuarios malintencionados abusen del servidor DNS. Un ataque llamado ataque de amplificación
de DNS es especialmente problemático porque puede hacer que su servidor participe en ataques
distribuidos de denegación de servicio.
Un ataque de amplificación de DNS es una forma en que los usuarios malintencionados intentan
derribar servidores o sitios en Internet. Para ello, intentan encontrar servidores DNS públicos que
resuelvan consultas recursivas. Ellos falsifican la dirección IP de la víctima y envían una consulta
que devolverá una gran respuesta al servidor DNS. Al hacerlo, el servidor DNS responde a una
pequeña solicitud con una gran carga útil dirigida al servidor de las víctimas, amplificando
efectivamente el ancho de banda disponible del atacante.
Alojar un servidor DNS público recursivo requiere una gran cantidad de configuración y
administración especiales. Para evitar la posibilidad de que su servidor sea utilizado con fines
maliciosos, configuraremos una lista de direcciones IP o rangos de red en los que confiamos.
Sobre el bloque de opciones, crearemos un nuevo bloque llamado acl. Cree una etiqueta para el
grupo de ACL que está configurando. En esta guía, llamaremos al grupo buenos clientes.
/etc/bind/[Link]:
acl goodclients {
[Link]/24;
localhost;
localnets;
};
options {
directory "/var/cache/bind";
recursion yes;
allow-query { goodclients; };
dnssec-validation auto;
En realidad, esto es todo lo que se necesita para almacenar en caché un servidor DNS. Si decidió
que este es el tipo de servidor que desea usar, no dude en continuar para aprender cómo
verificar sus archivos de configuración, reiniciar el servicio e implementar configuraciones de
cliente.
Reenvío: sólo pasa la consulta DNS a otro servidor DNS (por ejemplo, su ISP). Los routers
domésticos utilizan el reenvío para pasar consultas DNS desde los clientes de su red doméstica a
los servidores DNS de su ISP. Por ejemplo, para [Link], un servidor DNS de reenvío
primero verificará su caché (ya hizo esta pregunta antes), y si la respuesta no está en su caché,
pediría a su reenviador (el servidor DNS de su ISP) Para la respuesta, que respondería con una
respuesta en caché, o realizaría la recursión hasta que descubriera la respuesta.
Recursividad: el servidor DNS que recibe la consulta se encarga de averiguar la respuesta a esa
consulta recursivamente consultando servidores DNS autorizados para ese dominio. Por ejemplo,
para [Link], un recursor primero consultaría a los servidores raíz para qué servidores
DNS son responsables del TLD .com, entonces pediría a esos servidores por [Link],
entonces consultaba a los servidores por [Link] para [Link], obteniendo
finalmente la respuesta a la consulta original.
Un servidor DNS de reenvío ofrece la misma ventaja de mantener una caché para mejorar los
tiempos de resolución de DNS para los clientes. Sin embargo, en realidad no realiza ninguna
consulta recursiva. En su lugar, reenvía todas las solicitudes a un servidor de resolución externo y
luego almacena en caché los resultados para usarlos en consultas posteriores.
Esto permite que el servidor de reenvío responda desde su caché, sin que sea necesario que haga
todo el trabajo de las consultas recursivas. Esto permite que el servidor solo realice solicitudes
individuales (la solicitud del cliente reenviado) en lugar de tener que pasar por toda la rutina de
recursividad. Esto puede ser una ventaja en entornos donde la transferencia de ancho de banda
externa es costosa, donde sus servidores de almacenamiento en caché pueden necesitar ser
cambiados con frecuencia o cuando desea reenviar consultas locales a un servidor y consultas
externas a otro servidor.
acl goodclients {
[Link]/24;
localhost;
localnets;
};
options {
directory "/var/cache/bind";
recursion yes;
allow-query { goodclients; };
dnssec-validation auto;
Usaremos la misma lista de ACL para restringir nuestro servidor DNS a una lista específica de
clientes. Sin embargo, necesitamos cambiar la configuración para que el servidor ya no intente
realizar consultas recursivas por sí mismo.
Para hacer esto, no cambiamos la recursividad a no. El servidor de reenvío sigue proporcionando
servicios recursivos respondiendo consultas de zonas para las que no tiene autoridad. En su
lugar, necesitamos configurar una lista de servidores de almacenamiento en caché a los que
reenviar nuestras solicitudes.
Esto se hará dentro del bloque de opciones {}. Primero, creamos un bloque dentro llamado
reenviadores que contiene las direcciones IP de los servidores de nombres recursivos a los que
queremos reenviar solicitudes. En nuestra guía, usaremos los servidores DNS públicos de Google
([Link] y [Link]):
. . .
options {
directory "/var/cache/bind";
recursion yes;
allow-query { goodclients; };
forwarders {
[Link];
[Link];
};
. . .
. . .
options {
directory "/var/cache/bind";
recursion yes;
allow-query { goodclients; };
forwarders {
[Link];
[Link];
};
forward only;
dnssec-validation auto;
Para que un servidor sea máster primario de una zona debe tener la misma declarada en el
archivo.
Fichero [Link] .
zone "[Link]" {
type master;
file "/etc/bind/[Link]";
};
Fichero [Link] .
;
; BIND data file for local loopback interface
;
$ORIGIN [Link].
$TTL 604800
@ IN SOA [Link]. [Link]. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
; IP del host '[Link]'
@ IN A [Link]
; Servidores de delegación
[Link]. IN NS [Link].
[Link]. IN NS [Link].
; Registros NS
ns1 IN A [Link]
ns2 IN A [Link]
La directiva $ORIGIN sirve para agregar un dominio a los nombres de dominio incompletos.
Un nombre se considera incompleto (o relativo) si no tiene un punto al final.
$TTL define el tiempo de vida predeterminado para cada registro sin dicho parámetro
declarado.
Elcarácter ; convierte el texto que está a la derecha en la misma línea en comentario.
Cada línea situada a continuación contiene un RR, es decir un registro de recurso.
Cada registro tiene de izquierda a derecha, el dominio (o nombre completo del host) en el
cual se encuentra el RR, el TTL (es opcional) la clase de RR (que a menos que que se use
Chaosnet o Hesiod es IN), y los datos del recurso.
La arroba "@" significa en estos casos el nombre de la zona terminado con un punto.
Es el servidor con autoridad donde se mantiene la copia principal de los datos de la zona.
zone "[Link]" {
type master; # se indica que esta esta zona es del tipo "master"
file "/etc/bind/[Link]";
}
allow-transfer { none; };
zone "[Link]" {
type slave;
file "[Link]";
masters { [Link]; }; # desde que servidor va a trasferir la zona.
};
Ejecutar bind con chroot agrega una capa de seguridad adicional al hacer que el servicio se
ejecute en un directorio "jaula". El entorno chroot deberá contar los archivos especiales tales
como /dev/zero , /dev/random , /etc/localtime , y de acuerdo a la distribución, /etc/passwd ,
/dev/null , etc.
Instalación en CentOS
Puntos de montaje
El servicio se ejecuta con la opción -t indicando el directorio en el cual usuario named está
limitado.
Los archivos se editan como si el chroot no existiera, es decir es (casi) transparente. Decimos casi
porque al modificar un archivo, el editor debe hacer una copia y hacer las modificaciones el
archivo original. De otra manera, el cambio no se verá reflejado en la jaula.
Esto se logra en vim de la siguiente manera, por ejemplo para editar el archivo [Link]:
BIND 9 soporta dos métodos alternativos de garantizar a los clientes el derecho a desarrollar
actualizaciones dinámicas a una zona, configurado mediante las opciones allow-update
y update-policy , respectivamente.
Al usar la directiva update policy local se puede usar el comando nsupdate -l el cuál permite
enviar solicitudes de actualización el DNS del propio host, y firmarlas usando la clave de la sesión.
Esta es una clave de sesión TSIG , de manera predeterminada su ruta es
/var/run/named/[Link] .
TSIG usa claves secretas compartidas y un hash unidireccional para proporcionar medios seguros
criptográficamente de identificar cada extremo de una conexión mientras se permite hacer o
responder a una actualización de DNS. De esta manera se pueden autenticar las solicitudes y
viajar por la Internet.
Es importante el uso de NTP ya que TSIG usa las marcas de tiempos para impedir que las
respuestas sean usadas por un atacante.
Primer paso
Generamos un par de claves con el algoritmo criptográfico HMAC-SHA256 de 128 bits con el tipo de
nombre asociado HOST. Le ponemos el nombre descrito a cada clave de máster-slave.
Segundo paso
key master-slave. {
algorithm hmac-sha256;
secret "OadNk8cDlMnRrUT432rKdw==";
};
Se debe hacer que dueño de estos archivos sea el usuario con el que corre bind.
# cat Kmaster-slave.+163+[Link]
Private-key-format: v1.3
Algorithm: 163 (HMAC_SHA256)
Key: OadNk8cDlMnRrUT432rKdw==
Bits: AAA=
Created: 20141003174055
Publish: 20141003174055
Activate: 20141003174055
...
include "/etc/named/[Link]";
...
Tercer paso
...
server [Link] {
keys { master-slave. ;};
};
Cuarto paso
Quinto paso
...
server [Link] {
keys { master-slave. ;};
};
zone "[Link]" IN {
type slave;
masters { [Link] ; };
file "slaves/[Link]";
allow-notify { key master-slave. ; };
};
include "/etc/named/[Link]";
Sexto paso
DNSSEC
En el servicio DNS tradicional no hay nada que garantice que la respuesta que recibe un cliente
sea del servidor legítimo. DNSSEC es un conjunto de extensiones que intenta solucionar ese
problema.
DNSSEC usa RR's adicionales los cuales son explicados en la siguiente tabla:
RR Contiene Sirve para
Ya que todo esto se basa en zonas de confianza la zona padre, es decir la entidad en la cual
registramos el dominio debe soportar DNSSEC para que sirva en un ambiente público y real.
Herramientas
checkconf
# named-checkconf
La segunda sirve para probar las configuraciones de cada una de las zonas:
Herramienta DIG
Dig es una herramienta de linea de comandos que realiza busquedas de registros DNS.
El funcionamiento se basa en realizar la consulta DNS a todos los nombres de los servidores
listados en el fichero /etc/[Link]
Uso de DIG
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;[Link]. IN A
;; ANSWER SECTION:
[Link]. 120 IN A [Link]
Modo short.
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;[Link]. IN ANY
;; ANSWER SECTION:
[Link]. 289 IN A [Link]
[Link]. 289 IN A [Link]
[Link]. 289 IN A [Link]
[Link]. 289 IN A [Link]
[Link]. 289 IN A [Link]
[Link]. 289 IN A [Link]
[Link]. 289 IN AAAA 2800:3f0:4003:c00::8b
[Link]. 289 IN AAAA 2800:3f0:4003:c00::64
[Link]. 289 IN AAAA 2800:3f0:4003:c00::71
[Link]. 289 IN AAAA 2800:3f0:4003:c00::8a
[Link]. 21589 IN NS [Link].
[Link]. 3589 IN TXT "MS=E4A68B9AB2BB9670BCE15412F62916164C0B20BB"
[Link]. 3589 IN TXT "v=spf1 include:_spf.[Link] ~all"
[Link]. 3589 IN TXT "google-site-
verification=wD8N7i1JTNTkezJ49swvWW48f8_9xveREV4oB-0Hf5o"
[Link]. 589 IN MX 30 [Link].
[Link]. 589 IN MX 20 [Link].
[Link]. 21589 IN CAA 0 issue "[Link]"
[Link]. 3589 IN TXT "globalsign-smime-
dv=CDYX+XFHUw2wml6/Gb8+59BsH31KzUr6c1l2BPvqKX8="
[Link]. 49 IN SOA [Link]. [Link]. 379680302 900
900 1800 60
[Link]. 21589 IN NS [Link].
[Link]. 3589 IN TXT "apple-domain-verification=30afIBcvSuDV2PLX"
[Link]. 21589 IN NS [Link].
[Link]. 3589 IN TXT "facebook-domain-
verification=22rm551cu4k0ab0bxsw536tlds4h95"
[Link]. 3589 IN TXT "google-site-verification=TV9-
DBe4R80X4v0M4U_bd_J9cpOJM0nikft0jAgjmsQ"
[Link]. 589 IN MX 10 [Link].
[Link]. 21589 IN NS [Link].
[Link]. 3589 IN TXT "docusign=05958488-4752-4ef2-95eb-aa7ba8a3bd0e"
[Link]. 589 IN MX 50 [Link].
[Link]. 589 IN MX 40 [Link].
[Link]. 3589 IN TXT "docusign=1b0a6754-49b1-4db5-8540-d2c12664b289"
Herramienta RNDC
Uso de RNDC
# rndc reload
Este comando vuelca las estadísticas del servidor de nombres en el archivo determinado por el
parámetro statistics-file , cuando no está determinado se vuelca en el archivo [Link] del
directorio de trabajo del servidor bind.
# rndc stats
Detener el servicio.
# rndc stop