DNSSEC con BIND9


En esta entrada muestro la configuración DNSSEC con Bind9 y Debian 10 para una zona. Aunque hay muchos ejemplos en la red para entender como funciona, he querido poner un ejemplo de firma manual de zonas para entender el procedimiento antes de poner todo en modo automático en lo que no se sabe exactamente que hace Bind para gestionarlo.

Este post es un combinado de las siguientes fuentes:

  1. https://blog.apnic.net/2019/05/23/how-to-deploying-dnssec-with-bind-and-ubuntu-server/
  2. https://dnns.no/dynamic-dns-with-bind-and-nsupdate.html
  3. https://blog.inittab.org/administracion-sistemas/dnssec-asegurando-las-respuestas-de-nuestro-dominio-la-practica-i/

Repasando los blogs anteriores encontré algunos errores y partes que no veía muy claras y por eso he escrito este micro-manual.

En el primer blog [1] que he citado, muestran 3 formas de hacer el firmado con Bind: manual, automático y en cadena. El que se debe usar es el automático, y lo he descrito en la siguiente sección, pero primero voy a repasar el manual para poder entender el procedimiento.

Para el ejemplo basta con usar un dominio midominio.com y crear la la definición de la zona en el fichero /etc/bind/db.midominio.com. Esta tarea no la voy a explicar, supongo que ha tenemos una sin errores. DSNSEC funciona con firma digital, por tanto, requeire cifrado asimétrico. Así, DNSSEC requiere 2 claves (mejor dicho 2 parejas de claves pública/privada)

  1. Clave (pareja pública/privada) para firma de zona (ZSK).
  2. Clave (pareja pública/privada) de firma de claves (KSK).

El comando para generar las claves es dnssec-keygen y tiene varias opciones (algoritmo, lognitud de clave, etc.) pero por simplicidad me quedo con las opciones predeterminadas. Así para crear la clave (pareja pública/privada) para una determinada zona uso:

dnssec-keygen -n ZONE midominio.com

y aparecen los siguientes ficheros correspondientes a la clave ZSK, siendo .key la clave pública y .private la clave privada:

Kmidominio.com.+005+49521.key
Kmidominio.com.+005+49521.private

Para comprobarlo sólo hay que ver el contenido del fichero de la clave pública Kmidominio.com.+005+49521.key, en la primera línea verás:

; This is a zone-signing key, keyid 49521, for midominio.com.

Ahora con el siguiente comando se genera la pareja de claves para firmar las claves de zona (KSK):

dnssec-keygen -fKSK -n ZONE midominio.com

Las 2 claves públicas generadas hay que incluirlas en el fichero que contiene la zona db.midominio.com mediante la directiva $INCLUDE. Se añade al final lo siguiente:

$INCLUDE "Kmidominio.com.+005+49521.key"
$INCLUDE "Kmidominio.com.+005+54208.key"

Esto último es sólo para la firma manual, no lo hagas para la firma automática. Para hacer la firma se usa el comando:

dnssec-signzone -o midominio.com -N INCREMENT -t \
   -k  Kmidominio.com.+005+54208 \
   db.midominio.com \
   Kmidominio.com.+005+49521

Cuidado en el orden de los argumentos tras -k, primero la clave KSK, después el fichero de definición de zona y después la clave ZSK. Si no hay erreos, el comando anterior genera el fichero db.midominio.com.signed y para usarlo sólo hay que cambiar la entrada en el fichero named.conf.local:

zone "midominio.com" {
    type master;
    file "/etc/bind/db.midominio.com.signed";
};

Para comprobar si ha ido bien, tras reiniciar Bind9 en el log encontrarás:

zone midominio.com/IN: loaded serial 2 (DNSSEC signed)

y para comprobar si devuelve las entradas firmadas se puede resolver un nombre usando dig

dig @localhost midominio.com +dnssec

Problemas y deficiencias de esta configuración

Resulta que una zona firmada caduca a los 30 días, así que hay que firmar continuamente las zonas, por eso no se suele usar este método.

Usando la firma automática de zonas

Pues para la firma automática puedes consultar estas webs o usar mi resumen:

  • https://thoughts.t37.net/dnssec-inline-signing-howto-with-bind9-the-end-of-expired-zones-as-we-know-them-d961929c56bf
  • https://wiki.debian.org/DNSSEC%20Howto%20for%20BIND%209.9+

El principal problema que he encontrado son los permisos de los directorio ya que se generan automáticamente ficheros firmados. Para que funcione en Debian 10 y considerando los permisos, he preferido usar el directorio /var/cache/bind que parece que está para esto, mientras que /etc/bind no es escribible por el usuario del sistema bind.

Solución: Tener las zonas en /etc/bind y crear un enlace simbólico desde /var/cache/bind:

cd /var/cache/bind
ln -s /etc/bind/db.midominio.com

ahora en la configuración de Bind /etc/bind/named.local.conf cambio la definición de zona:

zone "midominio.com" {
    type master;
    file "/var/cache/bind/db.midominio.com";
    auto-dnssec maintain;
    inline-signing yes;
    key-directory "/etc/bind";
    allow-transfer { none; };
};

Pero hay que hacer un cambio más: En la configuración anterior de este dominio /etc/bind/_db.midominio.com se incluyeron las claves mediante 2 directivas $INCLUDE, bórralas.

Reiniciando el servicio o mediante el comando rndc reload y si todo va bien, en el directorio /var/cache/bind estará el fichero db.midominio.com.signed.

Igual que antes, puedes usar el siguiente comando para comprobar si DNSSEC funciona:

dig @localhost midominio.com +dnssec
#DNS #Debian 10 #Bind9