Bienvenido(a) a Alcance Libre 05/09/2025, 22:33
Creative Commons Reconocimiento-NoComercial-CompartirIgual 2.1
© 1999-2015 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.
Este documento requiere se dominen perfectamente los conceptos explicados en el documento titulado «Introducción al protocolo DNS» y 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)».
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.
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 https://www.alcancelibre.org/al/server/AL-Server.repo dentro del directorio /etc/yum.repos.d/:
wget -N https://www.alcancelibre.org/al/server/AL-Server.repo \ |
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=https://www.alcancelibre.org/al/el$releasever/al-server gpgcheck=1 gpgkey=https://www.alcancelibre.org/al/AL-RPM-KEY |
Salga del editor de texto.
Ejecute lo siguiente para instalar el paquete haveged:
yum -y install haveged |
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 |
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 |
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} |
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/dominio.com.zone |
Ejecute lo siguiente para firmar la zona con NSEC3 generando automáticamente una cadena de texto aleatorio en hexadecimal —utilizado para mejorar el algoritmo con el que se firmará la zona—, generando el archivo con los registros DS y buscando las firmas digitales dentro del directorio /var/named/keys, incrementando el número de serie existente en el archivo de zona correspondiente e las imprimiendo las estadísticas correspondientes:
dnssec-signzone -A \ -3 `head -c 1000 /dev/urandom | sha1sum | cut -b 1-16` \ -d /var/named/keys \ -K /var/named/keys \ -N INCREMENT \ -o dominio.com -t \ /var/named/dominio.com.zone |
Lo anterior guardará los registros DS dentro de un archivo dsset-* dentro del directorio /var/named/keys. Estos registros se proporcionan al NIC después de terminar el procedimiento. Ejecute lo siguiente para ver el contenido del archivo correspondiente:
cat dsset-dominio.com.
|
La salida debe ser similar a la siguiente:
dominio.com. IN DS 30105 7 1 98CF074D65541468A823761940F856B6F7B7A22E dominio.com. IN DS 30105 7 2 3EB36939F662D8F57D2CCA7155F8D0BCCCA7DD5F9FA24BD6E56372CA 46C8E785 |
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.
Edite el archivo /etc/named.conf:
vi /etc/named.conf |
Verifique que esté presente o añada 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"; 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 "dominio.com.zone.signed"; allow-update { none; }; key-directory "/var/named/keys"; auto-dnssec maintain; }; }; view "public" { match-clients { any; }; recursion no; zone "." IN { type hint; file "named.ca"; }; zone "dominio.com" { type master; file "dominio.com.zone.signed"; allow-update { none; }; key-directory "/var/named/keys"; auto-dnssec maintain; }; }; |
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:
service named restart |
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/zonesigner.sh |
Añada el siguiente contenido:
#!/bin/sh
ZONE=$1
ZONEFILE=$2
SERIAL=`/usr/sbin/named-checkzone $ZONE /var/named/$ZONEFILE | egrep -ho '[0-9]{10}'`
sed -i 's/'$SERIAL'/'$(($SERIAL+1))'/' /var/named/$ZONEFILE
/usr/sbin/dnssec-signzone -A \
-3 `head -c 1000 /dev/urandom | sha1sum | cut -b 1-16` \
-d /var/named/keys \
-K /var/named/keys \
-N INCREMENT \
-o $1 -t \
/var/named/$2 && \
if [ -x /usr/bin/systemctl ]; then
/usr/bin/systemctl reload named
else
/sbin/service named reload
fi
|
Ejecute lo siguiente para hacer ejecutable el programa:
chmod +x /usr/sbin/zonesigner.sh |
Pruebe que funciona ejecutando lo siguiente:
zonesigner.sh dominio.com dominio.com.zone |
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/zonesigner.sh dominio.com dominio.com.zone |
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.
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:
|
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:
|
Última Edición: 14/10/2015, 13:04| Hits: 10,768