Si algunos de nuestros foros, manuales, ALDOS, paquetería o proyectos te han resultado de ayuda, apreciaremos mucho nos apoyes con un donativo.

Configuración de DNSSEC en zonas dinámicas.

Autor: Joel Barrios Dueñas
Correo electrónico: darkshram en gmail punto com
Sitio de Red: http://www.alcancelibre.org/
Jabber ID: darkshram@jabber.org

Creative Commons Reconocimiento-NoComercial-CompartirIgual 2.1

© 1999-2016 Joel Barrios Dueñas. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro). c) Si altera o transforma esta obra o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector, hace mal uso de éstos.

Introducción.

Este documento requiere se dominen perfectamente los conceptos explicados en el documento titulado «Introducción al protocolo DNS», haber realizado la configuración básica de Bind como se describe en el documento titulado «Cómo configurar un servidor de nombres de dominio (DNS)» y haber realizado los procedimientos descritos en el documento titulado «Administración de zonas de DNS con nsupdate.» .

Acerca de DNSSEC.

DNSSEC (Domain Name System Security Extensions o Extensiones de seguridad para el Sistema de Nombres de Dominio) es un conjunto de especificaciones de la creados por la IETF (Internet Engineering Task Force o Grupo de trabajo de ingeniería de Internet) para garantizar cierto tipo de información proporcionada a través del protocolo DNS a través de un conjunto de extensiones que proporcionan a los clientes DNS la autenticación del origen de datos DNS, autenticación de la negación de la existencia e integridad de datos, excluyendo la disponibilidad o confidencialidad.

Funciona firmando digitalmente los registros de DNS y validando éstos a través de tres elementos: un registro DNSKEY, una cadena de confianza y un conjunto de claves públicas en la zona raíz ('.'). El registro DNSKEY se valida a través de la cadena de confianza y ésta a su vez se valida con las claves públicas en la zona raíz del servidor DNS. Al comprobar la firma digital se puede validar si la información de la consulta DNS es idéntica a la del servidor DNS autoritario correspondiente al domino que se consulta.

El protocolo DNS fue diseñado originalmente para ser un sistema distribuido escalable, pero con funciones de seguridad muy básicos. DNSSEC fue diseñado específicamente para proteger a los clientes de la falsificación de datos de DNS, como puede ocurrir durante un ataque para contaminar el de caché de un servidor DNS.

Imagine que utiliza un servicio bancario hospedado en un servidor con un nombre de dominio que apunta hacia una dirección IP particular. Ahora imagine que un atacante consigue vulnerar la seguridad del servidor DNS de su proveedor de acceso a Internet y consigue que el nombre de dominio de ese servicio bancario ahora apunte hacia otra dirección IP que corresponde a un servidor destinado a engañar al usuario para que éste proporcione sus datos personales. DNSSEC protege contra este tipo de casos.

Procedimientos.

Servicio haveged.

Es importante destacar que sin haveged el proceso para generar las firmas digitales demorará muchísimo. Es un servicio que se ejecuta en el espacio de usuario que es independiente a los mecanismos estándar para recolectar aleatoriedad para el almacén de entropía del sistema. Es una fuente de entropía para el algoritmo HEVEGE.

ALDOS y Fedora™ ya incluyen lo necesario para realizar la instalación del paquete necesario. Si utiliza CentOS o Red Hat™ Enterprise Linux, utilice el almacén YUM de Alcance Libre para servidores en producción, descargando el archivo http://www.alcancelibre.org/al/server/AL-Server.repo dentro del directorio /etc/yum.repos.d/:

wget -N http://www.alcancelibre.org/al/server/AL-Server.repo \
    -P /etc/yum.repos.d/

Examine el contenido del archivo /etc/yum.repos.d/AL-Server.repo:

vi /etc/yum.repos.d/AL-Server.repo

El contenido debe ser el siguiente:

[AL-Server]
name=AL Server para Enterprise Linux $releasever
mirrorlist=http://www.alcancelibre.org/al/el$releasever/al-server
gpgcheck=1
gpgkey=http://www.alcancelibre.org/al/AL-RPM-KEY

Salga del editor de texto.

Ejecute lo siguiente para instalar el paquete haveged:

yum -y install haveged

Activación e inicio de servicio en ALDOS, CentOS 5 y 6 y Red Hat™ Enterprise Linux 5 y 6.

Ejecute lo siguiente para active el servicio haveged y que éste inicie junto con el sistema:

chkconfig haveged on

Inicie el servicio haveged:

service haveged start

Activación e inicio de servicio en CentOS 7 y Red Hat™ Enterprise Linux 7.

Ejecute lo siguiente para active el servicio haveged y que éste inicie junto con el sistema:

systemctl enable haveged

Inicie el servicio haveged:

systemctl start haveged

Creación de firmas ZSK y KSK.

El procedimiento es el mismo para todas las distribuciones y versiones de ALDOS, CentOS, Fedora™ y Red Hat™ Enterprise Linux.

Ejecute lo siguiente para crear el directorio /var/named/keys:

mkdir -m 750 /var/named/keys

Ejecute lo siguiente para cambiar la pertenencia de este directorio al grupo named:

chgrp named /var/named/keys

Ejecute lo siguiente para crear la firma ZSK (Zone Signing Key) dentro del directorio /var/named/keys, utilizando el algoritmo NSEC3RSASHA1, un tamaño de 2048 bits y tipo ZONE para dominio.com:

dnssec-keygen -K /var/named/keys \
  -a NSEC3RSASHA1 \
  -b 2048 -n ZONE \
  dominio.com

Ejecute lo siguiente para crear la firma KSK (Key Signing Key) dentro del directorio /var/named/keys, con bandera KSK, utilizando el algoritmo NSEC3RSASHA1, un tamaño de 4096 bits y tipo ZONE para dominio.com:

dnssec-keygen -K /var/named/keys \
  -f KSK \
  -a NSEC3RSASHA1 \
  -b 4096 -n ZONE \
  dominio.com

Ejecute lo siguiente para cambiar los permisos a lectura y escritura para usuario, sólo lectura para grupo y nada para el resto del mundo:

chmod 640 /var/named/keys/{*.key,*.private}

Ejecute lo siguiente para cambiar la pertenencia de los archivos al grupo named:

chgrp named /var/named/keys/{*.key,*.private}

Firma de la zona dinámica.

Primero ejecute lo siguiente para congelar la zona dinámica.

rndc freeze dominio.com

Ejecute lo siguiente para añadir el contenido de los archivos *.key creados al archivo de zona del dominio a configurar:

cat /var/named/keys/Kdominio.com*.key \
  /var/named/dynamic/dominio.com.zone

Ejecute lo siguiente para descongelar la zona dinámica.

rndc thaw dominio.com

Ejecute lo siguiente para generar una firma digital de usuario que será utilizada para administrar la zona dinámica:

dnssec-keygen -r /dev/urandom -a HMAC-MD5 -b 512 -n USER alguien.dominio.com

Ejecute lo siguiente para ver el contenido de la firma pública:

cat Kalguien.dominio.com.+157+60657.private

La salida será similar a la siguiente:

alguien.dominio.com. IN KEY 0 3 157 NSq9NLqJvI73py/P7SYSffShVWXOIaNVLzsCSChVeaoQTn/lIDTimqZE ruXWq0zC0Mb4EUfI+nLrQ8BYy1ZMaw==

Ejecute lo siguiente para generar el archivo /etc/named.dnssec.keys:

vi /etc/named.dnssec.keys

Añada el siguiente contenido especificando la cadena de texto correspondiente a la firma digital de usuario:

key "alguien.dominio.com." {
	algorithm hmac-md5;
	secret "NSq9NLqJvI73py/P7SYSffShVWXOIaNVLzsCSChVeaoQTn/lIDTimqZEruXWq0zC0Mb4EUfI+nLrQ8BYy1ZMaw==";
};

Ejecute lo siguiente para cambiar los permisos del archivo /etc/named.dnssec.keys a lecura y escritura para usuario, sólo lectura para grupo y nada para otros:

chmod 640 /etc/named.dnssec.keys

Ejecute lo siguiente para cambiar la pertenencia del archivo /etc/named.dnssec.keys al grupo named:

chown root:named /etc/named.dnssec.keys

Edite el archivo /etc/named.conf:

vim /etc/named.conf

Verifique que esté presente todo lo resaltado en negrita, añada o modifique lo que esté resaltado en rojo y reemplace las incidencias de dominio.com por las de su propio dominio:

options {
	directory "/var/named";
	dump-file "/var/named/data/cache_dump.db";
	statistics-file "/var/named/data/named_stats.txt";
	memstatistics-file "/var/named/data/named_mem_stats.txt";
	managed-keys-directory "/var/named/dynamic";
	forwarders {
		8.8.8.8;
		8.8.4.4;
	};
	forward first;
	version "BIND";
	dnssec-enable yes;
	dnssec-validation yes;
	dnssec-lookaside auto;
	bindkeys-file "/etc/named.iscdlv.key";
};

include "/etc/rndc.key";
include "/etc/named.root.key";
include "/etc/named.dnssec.keys";

logging {
	channel default_debug {
		file "data/named.run";
		severity dynamic;
	};
	category lame-servers { null; };
};

controls {
	inet 127.0.0.1 allow { 127.0.0.1; } keys { "rndc-key"; };
};

view "local" {
	match-clients {
		127.0.0.0/8;
		10.0.0.0/8
		172.16.0.0/12;
		192.168.0.0/16;
	};
	recursion yes;
	include "/etc/named.rfc1912.zones";
	zone "." IN {
		type hint;
		file "named.ca";
	};
	zone "dominio.com" {
		type master;
		file "dynamic/dominio.com.zone";
		allow-update { key "alguien.dominio.com."; };
		key-directory "/var/named/keys";
		auto-dnssec maintain;
		inline-signing yes;
	};
};

view "public" {
	match-clients { any; };
	recursion no;
	zone "." IN {
		type hint;
		file "named.ca";
	};
};

Reinicie el servicio named para aplicar los cambios.

Ejecute lo siguiente si utiliza ALDOS, CentOS 6 o Red Hat™ Enterprise Linux 6:

service named restart

Ejecute lo siguiente si utiliza CentOS 7 o Red Hat™ Enterprise Linux 7:

systemctl restart named

Ejecute lo siguiente para congelar la zona dinámica:

rndc freeze dominio.com

Ejecute lo siguiente para firmar la zona con NSEC3 generando automáticamente una cadena de texto aleatorio en hexadecimal:

rndc signing -nsec3param 1 0 10 \
  `head -c 1000 /dev/urandom | sha1sum | cut -b 1-16` \
  dominio.com

Ejecute lo siguiente para descongelar la zona dinámica:

rndc thaw dominio.com

Ejecute lo siguiente para utilizar nsupdate con la firma digital de usuario:

nsupdate -k Kalguien.dominio.com.+157+60657.private 

Ejecute lo siguiente en el intérprete de nsupdate para añadir un registro tipo A:

server 127.0.0.1
zone dominio.com
update add m106.dominio.com. 86400 A 192.168.70.106
send

Ejecute lo siguiente para verificar lo ocurrido en segundo plano consultando el archivo de registro del sistema:

tail -80 /var/log/messages |grep named

Registros DS de la zona dinámica.

Si se trata de un dominio para red pública, serán necesarios los registros DS correspondientes a la zona. Ejecute lo siguiente para obtener éstos:

dig @127.0.0.1 dnskey dominio.com | \
  dnssec-dsfromkey -f - dominio.com

La salida será similar a la siguiente.

dominio.com. IN DS 30105 7 1 8C9F1858F5A630C3E2B1B0E064C7B011BC77FF82
dominio.com. IN DS 30105 7 2 678D519A461A53EB78779166F0A0439B4E6E44FCD5E7AD8E57D23D0F6136C767

Esta es la información que se debe proporcionar al NIC. DNSSEC requiere una cadena de confianza que se publica en el nivel raíz ('.') del dominio de nivel superior al que pertenezca el dominio —es decir en los servidores raíz del NIC—. Estas cadenas se utilizan para validar la zona con DNSSEC.

Ejecute lo siguiente para guardar esta información en un archivo:

dig @127.0.0.1 dnskey dominio.com | \
  dnssec-dsfromkey -f - dominio.com > \
  /var/named/keys/dsset-dominio.com.

Renovación de cadena aleatoria hexadecimal para NSEC3.

La enumeración de zona —que también se conoce como zone walking— es una técnica utilizada para encontrar todos registros RR —registros de Recurso— de una zona al realizar una consulta el registro NSEC de la zona. NSEC3 oculta esta información con código utilizando una cadena de texto aleatorio en hexadecimal, lo cual dificulta la enumeración de la zona, pero sin imposibilitar ésta. Un atacante con determinación puede recurrir a tablas arcoíris para romper esta codificación, sin embargo ésto puede demorar considerablemente aún con equipo de cómputo de gran poder. Para impedir que ésto ocurra es que se recomienda volver a computar la cadena de texto aleatorio en hexadecimal en intervalos regulares.

Ejecute lo siguiente para consultar el valor actual del registro NSEC3PARAM:

dig @127.0.0.1 NSEC3PARAM dominio.com +short

La salida debe ser similar a la siguiente:

1 0 10 EC59FF1470068907

Ejecute lo siguiente para generar un nuevo archivo denominado /usr/sbin/dynzonesigner.sh:

vi /usr/sbin/dynzonesigner.sh

Añada el siguiente contenido:

#!/bin/bash

SALT=`head -c 1000 /dev/urandom | sha1sum | cut -b 1-16`

/usr/sbin/rndc freeze $1
/usr/sbin/rndc signing -nsec3param 1 0 10 $SALT $1
/usr/sbin/rndc thaw $1

Ejecute lo siguiente para hacer ejecutable el programa:

chmod +x /usr/sbin/dynzonesigner.sh 

Pruebe que funciona ejecutando lo siguiente:

dynzonesigner.sh dominio.com

Espere unos segundos y ejecute lo siguiente para consultar nuevamente el valor del registro NSEC3PARAM:

dig @127.0.0.1 NSEC3PARAM dominio.com +short

La salida debe ser similar a la siguiente, dónde el valor del registro NSEC3PARAM es diferente al de hace unos instantes:

1 0 10 89473870BEECC103

Ejecute lo siguiente para añadir una tarea programada:

crontab -e

Añada el siguiente contenido:

0 0 */3 * * /usr/sbin/dynzonesigner.sh dominio.com > /dev/null

Lo anterior hará que se cambie el valor del registro NSEC3PARAM y renovará las firmas cada 3 días, haciendo fútil cualquier intento de enumerar la zona —que también se conoce como zone walking— y romper el cifrado utilizando tablas arcoíris pues se carecerá del tiempo suficiente para lograrlo.

Integración con servidor DHCP.

La integración sólo requiere cambiar la firma digital por la generada para administrar la zona con DNSSEC.

Edite el archivo /etc/dhcp/dhcpd.conf:

vim /etc/dhcp/dhcpd.conf

Añada: include "/etc/named.dnssec.keys"; y cambie key rndc-key por key alguien.dominio.com en las zonas gestionadas por el servidor DNS. Ejemplo:

ddns-update-style interim;
ddns-updates on;
ddns-domainname "dominio.com.";
ddns-rev-domainname "in-addr.arpa.";
ignore client-updates;
authoritative;
default-lease-time 900;
max-lease-time 7200;
option ip-forwarding off;
option domain-name "dominio.com";
option ntp-servers 0.pool.ntp.org, 1.pool.ntp.org, 2.pool.ntp.org, 3.pool.ntp.org;

include "/etc/rndc.key";
include "/etc/named.dnssec.keys";

zone localdomain. {
	primary 127.0.0.1;
	key rndc-key;
}
zone 16.172.in-addr.arpa. {
	primary 127.0.0.1;
	key alguien.dominio.com.;
}
zone dominio.com. {
	primary 127.0.0.1;
	key alguien.dominio.com.;
}

shared-network redlocal {
        subnet 172.16.1.0 netmask 255.255.255.0 {
                option routers 172.16.1.1;
                option subnet-mask 255.255.255.0;
                option broadcast-address 172.16.1.255;
                option domain-name-servers 172.16.1.1;
                option netbios-name-servers 172.16.1.1;
                range 172.16.1.2 172.16.1.254;
                }
}

Reinicie el servicio dhcpd para aplicar los cambios:

service dhcpd restart

Comprobaciones.

Ejecute lo siguiente para verificar el registro DNSKEY:

dig @127.0.0.1 DNSKEY dominio.com. +multiline

La salida debe ser similar a la siguiente:


; <<>> DiG 9.9.4-AlcanceLibre-9.9.4-18.fc14.al.6 <<>> @127.0.0.1 DNSKEY dominio.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10563
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;dominio.com. IN DNSKEY

;; ANSWER SECTION:
dominio.com. 86400 IN DNSKEY 257 3 7 AwEAAcO20KOMYCJiWsr4M
ppeUqy+fUTqgDMkcuDvjkJ1fSLigEvAKfjL B3B1Z0tZ61SodksWyB5nGEgyNuUnii//aAJzRq/
QubzL6m+x2UNHlh6m OXMddci7DGdiJzHU+we1droX0DlJJ8LZ3yTi0cMX1bJlPwsGXpqq64V6
5Df+/Lc8RvmWKHqA64sbGb9yzoKbZyyHbFyFfqBBLEVHPR7tms7BJdmq D9sdbi2I5EMsvENSm7
WezOAimwGiRb2jvnn9oKIKHmrTVJUnbz7w8Qy+ FxjHr3cdWvNTkK8UfjWQLOEObBXYocwCX7Uz
SoJ+oJcTnlkyHkASGKBl 05u0qphHOyflOiVrvnQn/oHYUZN9CnQcVnq4TSbiCJ2lriXpLAOKf/
VXm6Nkts6owveTxXjiHhWiMoLGC5VTlL9HX54OFYu5iNNgL2XHjmchZePQ axwASnqrinRYswyH
CINVvLSZ8ZUGLQ9KGAclUqbIUhZUPacECBQ/ii6q Z8tujiSRE5TNVXL3um8twQBZAlxUR68DIM
VSTNXzBNa+Yfg9B56+5dp0 +DzLi4BBa6+cv0IWSfuHyD1UIPqaup8OXkRYqGvNWLEYCg4KOpnT
GFak IO2VGbNjx4euO3FI0X6EbGgyDXz9pSQafs5o9PLysRBt62SqNfCTRU/B 6bYr+/cH
lTbZcYJV
dominio.com. 86400 IN DNSKEY 256 3 7 AwEAAexx1tSbhQV10ZmMz
NE3k641+/GdhPcIyLyiQzrSwEJTzjYVnpov FMGxRTVKmMGV3h+FpbkavjHaNqTgkA4Me/goywi
KPfaenW31MOlFR6Ql rEFz1dh7ittGNItkqfW+QFYKdipNgz3QXIYm1YJDFX8tRWa/CZUgm2eO
VEHDkigJKxvft+X9G9jWHaYXm1KFZI+o9rSMv4gH5yScSK4kA4dWb4b5 MJrJyhpKwYtIErqtAL
SRkYnZpMuihy858xSPiUFsvlpj7kBq7kxAS4Zt fBnw/V1nFa6LW9RCgKRYMXysuq5qxzgQzfLq
d28wrtu3bn5cRjEdRShf FpMAF2HNZHc=

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: jue sep 10 12:05:42 CDT 2015
;; MSG SIZE  rcvd: 856

Ejecute lo siguiente para verificar los registros RRSIG:

dig @127.0.0.1 A dominio.com. +noadditional +dnssec +multiline

La salida debe ser similar a la siguiente:


; <<>> DiG 9.9.4-AlcanceLibre-9.9.4-18.fc14.al.5 <<>> @127.0.0.1 A dominio.com. +noadditional +dnssec +multiline
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3822
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 4, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;dominio.com.    IN A

;; AUTHORITY SECTION:
dominio.com.    86400 IN SOA joel-laptop.dominio.com. root.localhost. (
                2015090716 ; serial
                14400      ; refresh (4 hours)
                3600       ; retry (1 hour)
                608400     ; expire (1 week 1 hour)
                86400      ; minimum (1 day)
                )
dominio.com.    86400 IN RRSIG SOA 7 3 86400 (
                20151008054158 20150908044158 34337 dominio.com.
                5om71jZTSNh7q/fwh/RLhYXLQhcjecJtddu+MU/5hSnw
                gJcWjvCbSPEH9InsuqB+FxD/5oxTyAYIyzwSBc770sCH
                Jb0UDZu1gYksbvK/aud6iNzZNhtdazJF78HyJDvWOr9D
                LogY5i+N+W9DjVVyKkZ6++4293Ww/qwLQ+mDPChhl7gS
                Mzp+IJX/9soM36wuCmlQOFQjlj2zutvK5OflORW/CkEM
                PH+RNHVDWxFE6HIYGLi2UdNLaXznTLMszaLE3tatdYVn
                ylgSqXYStPcoSgyO/I+CA3O9Rg67DnLfBPR2DORAx7cn
                S50IbVsJRxf+raNZ/4wyTQbOgeym+I2QlQ== )
BPTTHPDNQOJ9FLT4VNPUF0MIP53262MH.dominio.com. 86400 IN NSEC3 1 1 10 CBACBF9FD57480BF (
                BQUETAVA861ULUFSARKVQFE5IHSHV2BD
                NS SOA MX TXT RRSIG DNSKEY NSEC3PARAM SPF )
BPTTHPDNQOJ9FLT4VNPUF0MIP53262MH.dominio.com. 86400 IN RRSIG NSEC3 7 4 86400 (
                20151008040542 20150908040542 34337 dominio.com.
                4Gs33QtvBF3melTLlk+jlb30Jld2LFGl+4vnT1iP/gxN
                7EJNmYsYPTmZeNdyC3fSJiyj8GVd63Jow+Vc3YxZ5Pu4
                dKNYDZ84IqHvYDNJ90oIfDouJ7DqUYvFrDouplbzIyxl
                TY6HaVKzS9LtE0jDKN76AjoZFReZ/igC8js0Q426MzXi
                WHZ7fEPX9SXIBrMqadm28fzCuoY+nyjRlAvTnQ0qvd+O
                XFxL/e4JtaLnUD8XiIgGK24JvqHGiyCRZy+kyc3/n1Ac
                xp5Uih1ZXtEkKUpAfNARwtWBncRcX/Rykt31ogDf0Br5
                /Ee9ufpK8V48HLiO/IdT0a1OkZzNTq4LKg== )

;; Query time: 7 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: mar sep 08 17:35:08 CDT 2015
;; MSG SIZE  rcvd: 818

Bibliografia:

Si algunos de nuestros foros, manuales, ALDOS, paquetería o proyectos te han resultado de ayuda, apreciaremos mucho nos apoyes con un donativo.

Última Edición: 09/01/2016, 02:21|Hits: 3,072 Ver la versión para imprimir