Mostrando entradas con la etiqueta dnssec. Mostrar todas las entradas
Mostrando entradas con la etiqueta dnssec. Mostrar todas las entradas

lunes, 25 de julio de 2022

Despliegue de DNSSEC en la región - Estadística y mediciones

 

Despliegue de DNSSEC en la región - Estadística y mediciones

Por: Hugo Salgado (@huguei) / Dario Gomez (@daro_ua) / Alejandro Acosta (@ITandNetworking)

Introducción

En el presente post queremos conversar sobre unas recientes investigaciones que hemos realizados 

sobre un tema que nos apasiona mucho: DNSSEC. Por favor notar que hablamos en plural: 

“investigaciones”, debido a que son dos estudios sobre DNSSEC que comenzamos a la vez… 

¡favor continua leyendo para que entiendas de que se tratan ambas dos!

Sobre DNSSEC

DNSSEC añade un plus de seguridad al protocolo DNS que permite comprobar la integridad

 y autenticidad de los datos, previniendo ataques de suplantación y falsificación, mediante

 el uso de criptografía asimétrica o mejor conocida como clave pública / privada. 

Mediante el uso de estas claves y las firmas generadas a partir de ellas, se puede saber 

si una consulta fue modificada, permitiendo garantizar la integridad y autenticidad del 

mensaje. Si al comprobar estas firmas no coinciden entre ellas, quiere decir que la cadena 

de confianza se ha roto y la consulta no puede ser validada como legítima.

Contar con DNSSEC depende del ISP o del proveedor de servicios de internet que tenga 

contratado, que es quien debe configurarlo. Para saber si cuenta con DNSSEC existen varias 

herramientas en Internet que lo permiten como:

https://dnssec-analyzer.verisignlabs.com/

https://dnsviz.net/

Como muchos saben DNSSEC es un protocolo que ha venido creciendo mucho en los 

últimos años. Dos aspectos han marcado su aumento del despliegue:

1) DNSSEC viene habilitado por defectos en algunos servidores recursivos (BIND) y

2) Grandes avances en facilitar habilitar DNSSEC en los diferentes dominios por los 

registradores más importantes.

3) Todos los grandes recursivos públicos hacen validación DNSSEC (google public dns, 

cloudflare, quad9, etc)

4) Apple acaba de mencionar que iOS16 y macOS Ventura permitirán hacer validación 

DNSSEC en el stub final.

DNSSEC ha sido un tema muy importante para LACNIC, hemos realizado gran cantidad 

de eventos y actividades en torno a este tema, sin embargo hasta la fecha no teníamos 

ningún estudio propio al respecto.

¿De qué trata el estudio?

Desde el área I+D de LACNIC quisimos realizar un estudio con el fin de conocer el estado 

y el avance respecto al despliegue de DNSSEC en la región.

Origen de la Data

Tenemos dos fuentes de datos muy confiables

  • Utilizamos los probes ATLAS de RIPE https://atlas.ripe.net/

  • Realizamos capturas (tcpdump) que posteriormente fueron anonimizadas en 

  • servidores autoritativos

Fechas:

La obtención de la data comenzó en Noviembre de 2021, actualmente se lleva a cabo de 

una manera automatizada con reportes semanales y mensuales [1]

¿Cómo se identifica que un servidor realice DNSSEC?

Hay que verlo desde dos aspectos:

Sondas Atlas:

Se envían solicitudes de resolución DNS a todas las sondas disponibles en latinoamérica y el caribe, por un nombre de dominio que intencionalmente tiene sus firmas incorrectas y por lo tanto no valida según DNSSEC. Si la respuesta es error (SERVFAIL), quiere decir que el resolver que utiliza esa sonda sí utiliza correctamente DNSSEC. Si por el contrario se obtiene respuesta (NOERROR), quiere decir que dicho resolver no realiza ninguna validación. Nótese que interesantemente la idea es que la respuesta del servidor DNS sea negativa, *esto es la clave* para saber si el recursivo valida DNSSEC o no. 
Te dejamos este ejemplo: si visitas dnssec-failed.org y puedes abrir la página significa que tu DNS recursivo no hace DNSSEC, si no la puedes abrir es bueno! :-). 

Captura (tcpdump):

Antes de indicar que hacemos con la captura vamos a expandir un poco el concepto de DNSSEC. Así como existen los registros tradicionales en DNS (A, AAAA, MX, etc) para la utilización de DNSSEC se agregaron nuevos registros, estos mismos son DS, RRSIG, NSEC, NSEC3 y DNSKEY. Es decir, un servidor DNS recursivo puede consultar el registro AAAA para conocer la dirección IPv6 de un registro y puede consultar el registro DS (Delegation Signer) para verificar la autenticidad de las zonas hijas. La parte clave de este estudio es que los servidores que no hacen validaciones DNSSEC no consultan registros DNSSEC!. 

En base a lo anterior, al momento de realizar la captura se le pide a tcpdump que tome todo el paquete (flag -s 0),  de esa manera tenemos todo el contenido del mismo, desde capa 3 hasta capa 7, durante el procesamiento del paquete buscamos por los registros específicos de DNSSEC (nuevamente: DS, RRSIG, NSEC, NSEC3 y DNSKEY), si conseguimos alguno de ellos entonces el recursivo si hace DNSSEC, en caso contrario no hace. 

¿Donde se realiza la captura mencionada?

La captura se hace especificamente en una de las instancias del servidor DNS 

Reverso D (D.IP6-SERVERS.ARPA). El comando utilizado es: /usr/sbin/tcpdump 

-i $INTERFAZ -c $CANTIDAD -w findingdnssecresolvers-$TODAY.pcap -s 0 dst port 

$PORT and ( dst host $IP1 or dst host $IP2 )

Procesamiento de la información

Primero, el procesamiento de los datos consta de varias partes, todas realizadas 

completamente con software Open Source, específicamente con Bash, Perl y Python3 

sobre Linux.

Segundo, recordemos que existen dos fuentes de información: Captura de tráfico (PCAPs) 

y Probe Atlas. Aquí la metodología seguida en cada caso:
  a) Procesamiento de los PCAPs: Luego de obtener los PCAPs se realizan una serie de 

paso, entre ellos:

    1) El procesamiento de los .pcap se realiza en Python3 utilizando la librería pyshark.
    2) Limpieza de los datos improcesables (paquetes malformados, dañados, no-procesables, etc)
    3) Remoción de direcciones duplicadas
    4) Anonimización de datos
    5) Generación de resultados
    6) Generación de las gráficas y open data

  b) Procesamiento de la información obtenida en RIPE Atlas:
La captura de datos se realiza con mediciones mensuales en la plataforma RIPE Atlas, 

utilizando su API por línea de comandos. Luego se recogen y procesan en una serie de 

scripts utilizando lenguaje Perl, para finalmente graficar utilizando la API de Google Charts 

y adicionalmente dejamos los datos disponibles siempre en Open Data.
Favor recordemos que para detectar si una sonda está utilizando un resolver con validación, 

se utiliza un nombre de dominio que intencionalmente tiene sus firmas incorrectas. De 

esta forma, al intentar resolver ese nombre, una sonda que valide debe responder con error, 

porque el nombre no es válido según DNSSEC. Por el contrario, si se obtiene una respuesta 

positiva frente al nombre, quiere decir que el resolver no está validando, ya que ignoró la 

firma incorrecta.

Resultados obtenidos

Esta gráfica muestra la cantidad de servidores estudiados que utilizan DNSSEC y cuáles no 

lo usan. Las líneas azules determinan los servidores con DNSSEC activo, las rojas los que 

no lo tienen.

Nro de Servidores DNSs estudiados

Grafico 1

Se puede apreciar que para el 2 de Junio 2022 existen más servidores recursivos sin realizar 

DNSSEC que los que lo hacen. Se analizaron entre 33.000 a 55.000 direcciones IP cada semana. 

En líneas generales, se mantiene un promedio aproximado de un 55% de servidores que no utilizan 

el protocolo y un 45% de muestras positivas.

Nro de Servidores IPv6 DNSs estudiados

Grafico #2


En el gráfico #2 podemos apreciar el histórico de consultas DNSSEC en IPv6. Un dato no menor 

que llama mucho la atención es que en varios periodos de muestreo, existen más cantidad de 

consultas DNSSEC sobre v6 que en v4. Indiscutiblemente la intención es que la línea roja 

disminuya y la azul aumente de forma gradual.

Ranking de países con mayor validación DNSSEC

Utilizando la plataforma de mediciones de RIPE Atlas, es posible medir en cada una de ellas su 

capacidad de validar DNSSEC o no. Cada medición se puede agrupar por país, creando un ranking:

Ranking DNSSEC por pais

Grafico #3

Ranking ordenado con el porcentaje de validación DNSSEC promedio desde redes de países 

en Latinoamérica y el Caribe correspondiente a mayo de 2022.

Los números dentro de las barras indican la cantidad de ASs participantes por cada país. Se 

descartan países donde medimos un solo ASs.

Resumen

Desde el estudio basado en captura de tráfico, con los datos obtenidos en un lapso de 8 

meses la gráfica sugiere una disminución lenta de número de servidores NO-DNSSEC; 

adicionalmente parece existir un mayor despliegue de DNSSEC en servidores IPv6 que en IPv4.

En el caso del análisis de sondas Atlas, es esperable un mayor despliegue de validación que 

con otras fuentes de datos más genéricas, considerando que las sondas generalmente son 

hospedadas en redes más avanzadas o por usuarios que podrían activar deliberadamente 

DNSSEC. Pero representa de alguna manera el “límite superior” de penetración, y también 

es un indicador importante de la evolución a través del tiempo.

OpenData

Como es habitual en LACNIC siempre deseamos dejar nuestra información disponible para su 

trabajo por quien así lo desee:

https://stats.labs.lacnic.net/DNSSEC/opendata/

https://mvuy27.labs.lacnic.net/datos/

Estos datos que estamos dejando disponibles también poseen el espíritu de “Time Series 

Data”. Es decir, estamos dejando los datos recolectados durante el tiempo lo que hará muy 

sencillo tener fluctuaciones de nuestras estadísitcas en el tiempo y saber si el despliegue de 

DNSSEC aumenta y/o disminuye por país, región, etc.

Como siempre cuando realizamos este tipo de proyectos, son bienvenidas sugerencias de 

mejora tanto en la implementación como en la visualización de la información obtenida.

Referencias:

[1] https://stats.labs.lacnic.net/DNSSEC/dnssecstats.html

https://mvuy27.labs.lacnic.net/datos/dnssec-ranking-latest.html

martes, 1 de septiembre de 2020

Pequeño script en Python3 para obtener los registros DNS RRSIG

(seguramente hay más maneras más de hacer esto, incluso más elegantes pero así lo hice yo) 


import dns.resolver
domain='lacnic.net'
domain = dns.name.from_text(domain)
request = dns.message.make_query(domain, dns.rdatatype.ANY)
response = dns.query.tcp(request,'8.8.8.8')
for item in str(response).splitlines( ):
  if 'RRSIG' in item: 
      print (item)

sábado, 2 de abril de 2011

Implementar DNSSEC sobre Linux. Solo resolver. Version 2

Este documento es una actualizacion de "Implementar DNSSEC sobre Linux. Solo resolver" fechado 25 de Noviembre de 2009.


Historia:
Luego de la firma de los root servers a mediados del año 2010 (ver http://www.root-dnssec.org/) habilitar DNSSEC en el resolver es mucho más sencillo debido a que solo hay que validar "." dentro de nuestro archivo de configuración. Anteriormente necesitabamos trust anchors para cada dominio (TLD, ccTLD, zonas) que queriamos validar. Este trabajo era insoportable de manejar y no era escalable.
Ahora con la firma de los root-servers todo es más sencillo.

Software:
Bind 9.7.2-P3
Linux Mandriva 2010.2

Procedimiento:
1) Primero es necesario colocar el trust-anchor para el root zone. Para obtenerlo:

#dig . dnssec

La salida anterior te entregará varios resultados:

root@localhost ~]# dig . dnskey
;; Truncated, retrying in TCP mode.

; <<>> DiG 9.7.2-P3 <<>> . dnskey
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60029
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;. IN DNSKEY

;; ANSWER SECTION:
. 136089 IN DNSKEY 257 3 8 AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjF FVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoX bfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaD X6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpz W5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relS Qageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulq QxA+Uk1ihz0=
. 136089 IN DNSKEY 256 3 8 AwEAAb5gVAzK59YHDxf/DnswfO1RmbRZ6W16JfhFecfI+EUHRXPWlXDi 47t2FHaKyMMEROapL5SZ8HiCzl05lORZGGdN37WY7fkv55rs+kwHdVRS rQdl81fUnEspt67IIgaj3SrGyZqgzyixNk/8oT3yEfKDycTeJy4chKPt 0JegWrjL
. 136089 IN DNSKEY 256 3 8 AwEAAcaGQEA+OJmOzfzVfoYN249JId7gx+OZMbxy69HfUyuGBbRN0+Hu TOpBxxBCkNOL+EJB9qJxt+0FEY6ZUVjEg58sRr4ZQ6Iu6b1xTBKgc193 zUARk4mmQ/PPGxn7Cn5VEGJ/1h6dNaiXuRHwR+7oWh7DnzkIJChcTqlF rXDW3tjt

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Apr 2 10:00:49 2011
;; MSG SIZE rcvd: 586

Nos interesa la sección correspondiente a la 257, este valor corresponde a SEP o Secure Entry Point, también conocido como los KSK o Key Signing Key. Como dato adicional el valor 256 corresponde a los Zone Signing Key (ZSK)

2) Del resultado anterior, vamos a copiar la llave (despues del "257 3 8") y vamos a crear la siguiente seccion managed-keys dentro de named.conf. Quedando así:

managed-keys {
"." initial-key 257 3 8 "AwEAAagAIKlVZrp...";
};

3) Dentro de la sección de opciones de named.conf vamos a colocar lo siguiente:

dnssec-enable yes;
dnssec-validation yes;

Reinicia BIND y debe estar funcionando.

Revisar que DNSSEC este operando bien:

La mejor opción es utilizar el famoso comando dig y chequear el flag AD en al respuesta. Por ejemplo:

RESPUESTA SIN DNSSEC

[root@localhost etc]# dig +dnssec registro.br

;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43771
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 5, ADDITIONAL: 5



RESPUESTA CON DNSSEC

[root@localhost etc]# dig +dnssec registro.br

;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1063
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 6, ADDITIONAL: 1



Nótese que que el flag ad no esta encendido en la respuesta sin DNSSEC

Otra forma más sencilla de revisar si esta funcionando DNSSEC es entrar a la página: "DNSSEC test tool" de SIDN y correr la prueba.


Más información:

- El concepto de managed-keys fue introducido en Bind 9.7 en adelante. Ver
- Articulo excelente que indica como hacer que Bind se convierta en un DNSSEC validator

jueves, 6 de enero de 2011

Descripción del log bind

Situación:
Leyendo el log de bind tengo algunas dudas

Solución:
Luego de una ardua busqueda en Google conseguí el siguiente link donde Jeremy Reed responde que significan los flag dentro del log de Bind.

Ejemplo:

05-Jan-2011 09:54:36.620 client 210.19.118.16#32784: view everyone: query: www.whatismyipv6.co IN A -EDC

Del log anterior se entiende:
Fecha
Hora
Direccion IP del cliente
Puerto utilizado por el cliente
Vista utilizado segun configuracion del cliente
Tipo de solicitud
Descripcion del objeto solicitado
- significa que no hubo solicitud de recursividad
S=Query signed
E=EDNS
D=DNSSEC Ok
C=Checking Disabled

miércoles, 25 de noviembre de 2009

Implementar DNSSEC sobre Linux. Solo resolver

*** POST OBSOLETO ****
*** FAVOR LEER LA VERSION 2 ***


Problema:

Montar un servidor DNS solo como resolver, es decir, sin funcionar como servidor autorizado para ciertas zonas


Que se necesita:

- Servidor Linux
- Bind 9.3 o superior (en mi caso utilicé 9.6)


Alcance

- Vamos a validar todo lo que sea .br
- Vamos a validar todo lo que sea udp53.org

Procedimiento:
1) Instalar bind en un servidor Linux. En mi caso utilizo Mandriva y con un sencillo urpmi bind fue suficiente. Es importante destacar que para que DNSSEC ande se necesita tener instalado openssl y sus librerias. Actualmente la inmensa mayoría de las distribuciones ya viene con openssl

2) En /var/named.conf se necesita:
options {
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside "." trust-anchor dlv.isc.org.;
};

La primera opción permite dnssec para las zonas autorizadas y la segunda opción para realizar recursividad utilizando DNSSEC. La tercera opción la veremos con detalle más adelante.


3) Es necesario obtener las llaves públicas de los registros .br y udp53.org (que son los dominios que queremos verificar en este momento). Para ello:

[root@localhost etc]# dig br DNSKEY

{...}

br. 21502 IN DNSKEY 257 3 5 AwEAAdDoVnG9CyHbPUL2rTnE22uN66gQCrUW5W0NTXJBNmpZXP27w7PM Npyw3XCFQWP/XsT0pdzeEGJ400kdbbPqXr2lnmEtWMjj3Z/ejR8mZbJ/ 6OWJQ0k/2YOyo6Tiab1NGbGfs513y6dy1hOFpz+peZzGsCmcaCsTAv+D P/wmm+hNx94QqhVx0bmFUiCVUFKU3TS1GP415eykXvYDjNpy6AM=

{...}


[root@localhost etc]# dig udp53.org DNSKEY

{...}

udp53.org. 5882 IN DNSKEY 257 3 5 BEAAAAMKj6IGc8E/bBW7i6zDGgnKUXwamtR9PlFiuTg0/oa4i1okCg4J vLEq7EVpxdDi4yc1Ym9kGTUngZ59iVleoL8O5Zq+oPAPCYSbtn+ASsL6 0iCp4PJ6LV0A9d2NE/BetXO/Re/NRsSG18yFZCWGfX8mBnb2zG7Mb+0t pUuRsu9dBN31ljsbTUGmkDbqEw2xaDAUXqDGD5+pgN0NGqcPg0/HzFv9

{...}

4) Necesitamos las llaves DLV que pueden ser conseguidas en la pagina de la ISC en:
http://ftp.isc.org/www/dlv/dlv.isc.org.key.
Las llaves DLV ((DNSSEC Look-aside Validation) son un recurso adicional utilizado en aquellos servidores DNSSEC con recursividad. La idea es apoyar al conglomerado de internet en las primeras etapas de DNSSEC en el mundo

5) Vamos a copiar esas llaves obtenidas en el archivo named.conf bajo la sección trusted-keys (si no existe dicha sección en el archivo la crearemos). Por ejemplo

trusted-keys {
"br." 257 3 5
"AwEAAdDoVnG9CyHbPUL2rTnE22uN66gQCrUW5W0NTXJB
NmpZXP27w7PMNpyw3XCFQWP/XsT0pdzeEGJ400kdbbPq
Xr2lnmEtWMjj3Z/ejR8mZbJ/6OWJQ0k/2YOyo6Tiab1N
GbGfs513y6dy1hOFpz+peZzGsCmcaCsTAv+DP/wmm+hN
x94QqhVx0bmFUiCVUFKU3TS1GP415eykXvYDjNpy6AM=";

"dlv.isc.org." 257 3 5 "BEAAAAPHMu/5onzrEE7z1egmhg/WPO0+juoZrW3euWEn4MxDCE1+lLy2 brhQv5rN32RKtMzX6Mj70jdzeND4XknW58dnJNPCxn8+jAGl2FZLK8t+ 1uq4W+nnA3qO2+DL+k6BD4mewMLbIYFwe0PG73Te9fZ2kJb56dhgMde5 ymX4BI/oQ+cAK50/xvJv00Frf8kw6ucMTwFlgPe+jnGxPPEmHAte/URk Y62ZfkLoBAADLHQ9IrS2tryAe7mbBZVcOwIeU/Rw/mRx/vwwMCTgNboM QKtUdvNXDrYJDSHZws3xiRXF1Rf+al9UmZfSav/4NWLKjHzpT59k/VSt TDN0YUuWrBNh";

"udp53.org." 257 3 5 "BEAAAAMKj6IGc8E/bBW7i6zDGgnKUXwamtR9PlFiuTg0/oa4i1okCg4J vLEq7EVpxdDi4yc1Ym9kGTUngZ59iVleoL8O5Zq+oPAPCYSbtn+ASsL6 0iCp4PJ6LV0A9d2NE/BetXO/Re/NRsSG18yFZCWGfX8mBnb2zG7Mb+0t pUuRsu9dBN31ljsbTUGmkDbqEw2xaDAUXqDGD5+pgN0NGqcPg0/HzFv9";

};

6) Listo!!., reiniciar el servidor named. Por ejmplo:
/etc/init.d/named restart (o con rndc, como tu desees)

Revisar que se encuentre funcionando bien

La mejor opción es utilizar el famoso comando dig y chequear el flag AD en al respuesta. Por ejemplo:

RESPUESTA SIN DNSSEC

[root@localhost etc]# dig +dnssec registro.br

; <<>> DiG 9.6.0-P1 <<>> +dnssec registro.br
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43771 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 5, ADDITIONAL: 5




RESPUESTA CON DNSSEC

[root@localhost etc]# dig +dnssec registro.br

; <<>> DiG 9.6.0-P1 <<>> +dnssec registro.br
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1063 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 6, ADDITIONAL: 1



Más información:

* www.isc.org/files/DNSSEC_in_6_minutes.pdf
* http://registro.br/info/dnssec.html

Una mejora práctica en el Transporte DNS sobre UDP en IPv6

Por Hugo Salgado y Alejandro Acosta Introducción y planteamiento del problema En el presente documento queremos discutir sobre un draft (bor...