Verificación manual de DNSSEC

En mi artículo anterior explico muy por encima qué es DNSSEC y por qué es importante para la seguridad de Internet. El tema tiene mucha miga y planeo escribir unos cuantos artículos más. Hoy hablaremos de cómo podemos realizar una validación DNSSEC manualmente. Con nuestros deditos.

Lo primero que hay que entender es que DNSSEC utiliza dos claves. La KSK: Key Signing Key y la ZSK: Zone Signing Key. La primera clave, KSK, es una clave de larga duración (por ejemplo, uno o dos años) y es la clave que se va a utilizar como anclaje con el resto del árbol DNS.

Los registros DNS en sí están firmados por la ZSK, firmada a su vez por la KSK. La ZSK es una clave más corta y con una duración muy limitada (por ejemplo, dos semanas o tres meses). La utilidad de este esquema es que las firmas en los registros DNS son más pequeñas y que la clave KSK puede mantenerse offline o, por ejemplo, en un dispositivo Hardware Security Module (HSM).

En resumen, los registros DNS están firmados por la ZSK actual de la zona. La ZSK en sí se firma con la KSK de la zona. El hash de la clave pública de la KSK se comunica a la zona DNS padre, que lo incluirá en registros DS para completar el anclaje seguro.

En la práctica, las cosas son bastante complicadas. Una zona puede tener varias KSK y, sobre todo, varias ZSK. Las claves caducan y hay que reemplazarlas por otras nuevas, todo mientras el DNS sigue funcionando. El key rollover es complejo y crítico en el funcionamiento de DNSSEC. Sí, lo habéis adivinado: es tema de un artículo futuro :-).

Para verificar un resultado DNSSEC hay que seguir la cadena y validar todas las firmas digitales y todos los anclajes. Veámoslo.

Verificación con DIG

El texto que sigue está basado en DNSSEC verification with dig.

dig es una herramienta distribuída con BIND. Permite realizar consultas DNS, configurando los detalles que nos interesan (por ejemplo, el tipo de consulta, o a qué servidor DNS la enviamos).

En particular podemos usar dig, si se ha compilado con la opción -DDIG_SIGCHASE [1], para verificar la cadena de confianza DNSSEC. El servidor DNS al que le preguntamos debe tener capacidad DNSSEC para que funcione todo lo que sigue. A las malas, y como forma de experimentación, podríamos enviar las consultas al servidor DNS de Google, cuya dirección es 8.8.8.8.

Como toda cadena de confianza, DNSSEC tiene una raíz. Se trata de un certificado cuya clave privada está almacenada de forma segura offline, porque su compromiso echa por tierra todo el sistema. La clave privada se almacena en un HSM. La clave pública está integrada en todos los sistemas capaces de verificar DNSSEC. Constituye, por así decirlo, la base sobre la que se contruye todo el mecanismo de seguridad DNSSEC.

Evidentemente descargar dicha clave de Internet, sin más, no es seguro. Es necesario obtenerla a través de algún mecanismo de confianza, como nuestro fabricante. También se podría descargar desde muchas direcciones de Internet y verificar su valor contrastando múltiples referencias online.

Pero para las pruebas que vamos a hacer hoy, nos la bajaremos de Internet. Sirva este artículo como una nueva fuente adicional de verificación, por si se te ocurre descargar la clave con fines serios y necesitas asegurarte de que es correcta y nadie te la está jugando.

Escribimos:

$ dig . DNSKEY|grep ^\\.|grep 257 >root.key
$ cat root.key
.                     172677  IN      DNSKEY  257 3 8 AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjF FVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoX bfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaD X6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpz W5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relS Qageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulq QxA+Uk1ihz0=

Esta es la clave pública KSK que certifica la cadena DNSSEC. No es una clave fácil de cambiar. Si la clave privada se filtrase en Internet sería catastrófico.

En el momento de escribir este artículo existen dos claves ZSK para la zona raíz. Esto forma parte del key rollover, y no vamos a verlo en este artículo.

Nos interesa conocer los identificadores de las claves de la zona raíz. Estos identificadores son números cortos que nos ayudarán a seguir el hilo de la verificación. No necesitan ser únicos a nivel global; de hecho no pueden serlo, es imposible. Sólo deben ser únicos por zona DNS:

$ dig +multiline . DNSKEY
;; Truncated, retrying in TCP mode.

; <<>> DiG 9.9.5-P2 <<>> +multiline . DNSKEY
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36625
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;.                    IN DNSKEY

;; ANSWER SECTION:
.                     172196 IN DNSKEY 256 3 8 (
                              AwEAAZvJd8ORk+jmZ41QMYbQ1XCpf60l6YJuHtnxn0VS
                              h5a5vqwEjTST3/PZ4xhUFu2YcTfRNWxs9WTiGZl3MY/U
                              lBIvzpLhKgKnf9Vk8sEU3q0nmOGFgE6jTi/cU95ATU/2
                              dTQovMDv9XyWvrmj8KIG2brj6mF4S8GTae6G2GwbMF5v
                              ) ; key id = 40926
.                     172196 IN DNSKEY 256 3 8 (
                              AwEAAbSuNNFSFZP1bBNxG7R6xcMhgKV2Rkk0wOMbmMd6
                              d2mNydvRxLf3Es0rKPr2UGz2AWGzEUhSUz028KXNZ2Z1
                              jI+BSeaDaVzaBvKVqxYDodjVSFa+0nMsdYI0RiFn9iNZ
                              DWsV1rCeAf9AEg3rOCSbK9Sq+Q9AWq6d/iEsrhjs5HPX
                              ) ; key id = 8230
.                     172196 IN DNSKEY 257 3 8 (
                              AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQ
                              bSEW0O8gcCjFFVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh
                              /RStIoO8g0NfnfL2MTJRkxoXbfDaUeVPQuYEhg37NZWA
                              JQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaDX6RS6CXp
                              oY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3
                              LQpzW5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGO
                              Yl7OyQdXfZ57relSQageu+ipAdTTJ25AsRTAoub8ONGc
                              LmqrAmRLKBP1dfwhYB4N7knNnulqQxA+Uk1ihz0=
                              ) ; key id = 19036

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Jun 22 18:52:31 2014
;; MSG SIZE  rcvd: 586

La clave 19036 es la clave KSK. Deberíais obtener la misma clave si hacéis esto en casa, ya que modificarla es bastante difícil y posiblemente nunca se haga. Las otras dos son las claves ZSK, que se rotan con frecuencia y que posiblemente hayan cambiado cuando las miréis vosotros.

En los ejemplos que siguen vamos a verificar en registro A de www.iis.se., en honor a que Suecia haya sido el primer dominio nacional en desplegar DNSSEC.

[1]

En las distribuciones Linux modernas la norma es que el programa dig instalado en el sistema haya sido compilado con la opción -DDIG_SIGCHASE. No es el caso de Mac OS X, no obstante.

Lo más sencillo -relativamente- en estos casos es descargar el código fuente de BIND y compilarlo por nuestra cuenta. Los detalles caen fuera del ámbito de este artículo.

Verificación abajo-arriba con DIG

En este caso resolvemos el registro A y procedemos a verificar su firma subiendo el árbol DNSSEC:

$ dig +sigchase +trusted-key=root.key www.iis.se. A | cat -n
     1        ;; RRset to chase:
     2        www.iis.se.             12      IN      A       91.226.36.46
     3
     4
     5        ;; RRSIG of the RRset to chase:
     6        www.iis.se.             12      IN      RRSIG   A 5 3 60 20140701161502 20140621161502 23948 iis.se. PJj85jSCa4Jh/fhhWRABflyoB3Ks8JkwAFaRJm7rGboqqO1aVgTFzejS i9gsCDZB0SEcZYFeGoTQIsWH55AgfiBpGazUg3C8/jpBRsctdUAyDPoa Etqx8cgu+FuTJdEd0risqUvW1CSq7Zk2s1sj8AcKw6/GhPFH1W3+3XxQ IME=
     7
     8
     9
    10        Launch a query to find a RRset of type DNSKEY for zone: iis.se.
    11
    12        ;; DNSKEYset that signs the RRset to chase:
    13        iis.se.                 1406    IN      DNSKEY  257 3 5 AwEAAcq5u+qe5VibnyvSnGU20panweAk2QxflGVuVQhzQABQV4SIdAQs +LNVHF61lcxe504jhPmjeQ656X6t+dHpRz1DdPO/ukcIITjIRoJHqS+X XyL6gUluZoDU+K6vpxkGJx5m5n4boRTKCTUAR/9rw2+IQRRTtb6nBwsC 3pmf9IlJQjQMb1cQTb0UO7fYgXDZIYVul2LwGpKRrMJ6Ul1nepkSxTMw Q4H9iKE9FhqPeIpzU9dnXGtJ+ZCx9tWSZ9VsSLWBJtUwoE6ZfIoF1ioq qxfGl9JV1/6GkDxo3pMN2edhkp8aqoo/R+mrJYi0vE8jbXvhZ12151Dy wuSxbGjAlxk=
    14        iis.se.                 1406    IN      DNSKEY  256 3 5 BQEAAAABqIGyOZCd9mS36Z9Wh0uDNuSvKvr0ZhWTdJ89cNXCU+OOsG+4 bm4InmtM0wGxcDlDz+QAr+1bA0Fnq42rYUSqagkjpw6cHg6IJSqCAOA6 ZwXI6pgYpNLqSDJSYwqj5ZlYyS57bohloRnfmOklIYDwlb8eIz7kGLbg OzCSXlzrvj0=
    15
    16
    17        ;; RRSIG of the DNSKEYset that signs the RRset to chase:
    18        iis.se.                 1406    IN      RRSIG   DNSKEY 5 2 3600 20140701161502 20140621161502 18937 iis.se. LzvFO7zLn0s02oYJBjuo+FJ/cJdZJoy+/5QyI3mwVIfT4RgCToGEn8HN tdOQryTXTdltrJhl8q824wrglli/BRPk/qAgTwTco8/EJtWHE0tdIUFN +D23u36MBMkpYALI/GnWDeicC+c4puzSf3xjpMc3lkbzw9tJWtcPatfO 6aqqKPqaP0K0w1SlJW5awUgVudDPB9xtP8mhVkTm8QJbAIU4JRsUjLUO 2yzEkcUXDNG+asTn3awmNbZ5TbksPiyf5vPoiAIexnKsWoMwgVjuT8P3 jfVC7w+g0LImMQq1SRl7YpEohU1lQ3RYMF6c8InLyJ3IJ2BKX7fuSKGj OyWRRw==
    19        iis.se.                 1406    IN      RRSIG   DNSKEY 5 2 3600 20140701161502 20140621161502 23948 iis.se. NaeG5YYr4vXXbsMffNkrWIXtANTA6h4Om6Zd9Ak4dzjA6fpuWlAqflGJ 6lCBK3ooICzdVeS4pe77Vf2v8TkzpntnpKH8I2b++OrxdQXIpX+XQmdo /Y3fp0AClNCenkN/h/6ZiowBRyoCZ9wEpVHohflrNWsBU/IHKGy7FNkv cHo=
    20
    21
    22
    23        Launch a query to find a RRset of type DS for zone: iis.se.
    24
    25        ;; DSset of the DNSKEYset
    26        iis.se.                 1406    IN      DS      18937 5 2 B5C422428DEA4137FBF15E1049A48D27FA5EADE64D2EC9F3B58A994A 6ABDE543
    27        iis.se.                 1406    IN      DS      18937 5 1 10DD1EFDC7841ABFDF630C8BB37153724D70830A
    28
    29
    30        ;; RRSIG of the DSset of the DNSKEYset
    31        iis.se.                 1406    IN      RRSIG   DS 5 2 3600 20140703220139 20140621101201 30280 se. arcSXOiRFFC/ugqtVYJQO2E2QFXnuEfMbxj6JCmQA7QrYZUfvw0x1qc+ wCox87oQwK6zBfUE+6E8xG4ZiOCutK7TMTA0Smjxw24IcD3oibRsXIeS J1xppxiCmdddr87c89zwGVoOBVYIJrnByT2pldzjou/LfayBlwF2dpV5 Nd8=
    32
    33
    34
    35
    36        ;; WE HAVE MATERIAL, WE NOW DO VALIDATION
    37        ;; VERIFYING A RRset for www.iis.se. with DNSKEY:23948: success
    38        ;; OK We found DNSKEY (or more) to validate the RRset
    39        ;; Now, we are going to validate this DNSKEY by the DS
    40        ;; OK a DS valids a DNSKEY in the RRset
    41        ;; Now verify that this DNSKEY validates the DNSKEY RRset
    42        ;; VERIFYING DNSKEY RRset for iis.se. with DNSKEY:18937: success
    43        ;; OK this DNSKEY (validated by the DS) validates the RRset of the DNSKEYs, thus the DNSKEY validates the RRset
    44        ;; Now, we want to validate the DS :  recursive call
    45
    46
    47        Launch a query to find a RRset of type DNSKEY for zone: se.
    48
    49        ;; DNSKEYset that signs the RRset to chase:
    50        se.                     144     IN      DNSKEY  256 3 5 AwEAAcd46xFq6BbjR34UY1xpjJ5Ej9M3I7q8ZOPp4cQXXJUVCw2v+D68 wI09RDiJHDW7PHlv2aVLhYBTLTBb5XwnQM938B7XEpp/BJHqDgUaubQz YuiUc11LYos+Z6qj2WU4AUyHiHmWemcYKe8vz85cyskS0y7FRNPFD7AF eJ10Wy7Z
    51        se.                     144     IN      DNSKEY  256 3 5 AwEAAfBv/pPSg6vrc3RUe/JKzC1ZmuvOWOgAZNAK3vgZn5hKfmvR8iM5 PGTP6PeEiT9V/v69pemFZJhYGcxk0xkFWj/X6nbnj3X4vEr43dHajTiS NVRDStbQLuHH+kA3kSh7IRhLP42d8Qqi240IJFwzoDg2HSLcjfw5wrd1 nsOQjeMN
    52        se.                     144     IN      DNSKEY  257 3 5 AwEAAZYYG1hpk8XKHNHpdO/EEg+r4YmIEC4Fn3x2DEsygxDuoT9d/QCi X1pz0omFGCaVfCWHvaScVvWd4xP4kNDnSDQxBzPwLEXE3l0cLseMJ2YM QeBPf3hGhLs6VSDnGFKAzNG4fhri9EBTLv9ubL8Kx8cWQKuu3A5HRVD3 li7lZB+0kmUKqGiIQdERKt/Ec36BkK93lyGags5RrR2VDdrXCj9Yay90 KCKITk52AbwVoMPm0OYlPbD4ViBPMk5nmh/dPeCoZoVJxgANZ/doVQxR 5vDkMBYxuhrXuQk3CvZBB011NsXxk9yHtHvp/5gjUVJjvhdRvjRB6/xY R03c9owi/aM=
    53
    54
    55        ;; RRSIG of the DNSKEYset that signs the RRset to chase:
    56        se.                     144     IN      RRSIG   DNSKEY 5 1 3600 20140703113400 20140619181201 59747 se. cpoQYRTf5PpVtBVh+TBi0ftCKLuU8QenfvdKxE+3VWTT03waDs/5Tfew pW881WC6b3hRrj16x5FWRnBEMtpPCvX0HIpTHEBPbzoswPBVjZdlhR9A eq5ZzQ32jmztw6ue7bvxCdixUiAyW6PwBhl1Vhse1G4tQH+th1dgZUHi 72qIcKACY//7sAxbmeJfDziC9w+zXPZk060f47B5qgyiJ7YmNpXk7hmN UhLkwsMz5fp/8YhzQXIt8a1vcBVSOmUxjJvMMLdjAmX9tCUtRKAtvPBK yeP0WhPTjCNfuCYKt3F8AAsHLP8NM8pIMXsgqoOg69p06UEsYzs6x9nQ Nlr89Q==
    57
    58
    59
    60        Launch a query to find a RRset of type DS for zone: se.
    61
    62        ;; DSset of the DNSKEYset
    63        se.                     57081   IN      DS      59747 5 2 44388B3DE9A22CAFA8A12883F60A0F984472D0DFEF0F63ED59A29BE0 18658B28
    64
    65
    66        ;; RRSIG of the DSset of the DNSKEYset
    67        se.                     57081   IN      RRSIG   DS 8 1 86400 20140629000000 20140621230000 40926 . kXOVZY6BpnZM26VTwouFPWwujek2khXWCYEtBZxhGuL3C672bHH4lSFi nvR9myxCCcvVESsyKYmWMShEFUuILY3jn5KSur1Mdxf+EOvcsrTxPdf4 93PtGiJLNTylAjjuNAeTIga5+xlg5bJoVPwTiZd6F3gBGXDl8/xnGVbm nUE=
    68
    69
    70
    71
    72        ;; WE HAVE MATERIAL, WE NOW DO VALIDATION
    73        ;; VERIFYING DS RRset for iis.se. with DNSKEY:30280: success
    74        ;; OK We found DNSKEY (or more) to validate the RRset
    75        ;; Now, we are going to validate this DNSKEY by the DS
    76        ;; OK a DS valids a DNSKEY in the RRset
    77        ;; Now verify that this DNSKEY validates the DNSKEY RRset
    78        ;; VERIFYING DNSKEY RRset for se. with DNSKEY:59747: success
    79        ;; OK this DNSKEY (validated by the DS) validates the RRset of the DNSKEYs, thus the DNSKEY validates the RRset
    80        ;; Now, we want to validate the DS :  recursive call
    81
    82
    83        Launch a query to find a RRset of type DNSKEY for zone: .
    84
    85        ;; DNSKEYset that signs the RRset to chase:
    86        .                       170985  IN      DNSKEY  256 3 8 AwEAAbSuNNFSFZP1bBNxG7R6xcMhgKV2Rkk0wOMbmMd6d2mNydvRxLf3 Es0rKPr2UGz2AWGzEUhSUz028KXNZ2Z1jI+BSeaDaVzaBvKVqxYDodjV SFa+0nMsdYI0RiFn9iNZDWsV1rCeAf9AEg3rOCSbK9Sq+Q9AWq6d/iEs rhjs5HPX
    87        .                       170985  IN      DNSKEY  257 3 8 AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjF FVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoX bfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaD X6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpz W5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relS Qageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulq QxA+Uk1ihz0=
    88        .                       170985  IN      DNSKEY  256 3 8 AwEAAZvJd8ORk+jmZ41QMYbQ1XCpf60l6YJuHtnxn0VSh5a5vqwEjTST 3/PZ4xhUFu2YcTfRNWxs9WTiGZl3MY/UlBIvzpLhKgKnf9Vk8sEU3q0n mOGFgE6jTi/cU95ATU/2dTQovMDv9XyWvrmj8KIG2brj6mF4S8GTae6G 2GwbMF5v
    89
    90
    91        ;; RRSIG of the DNSKEYset that signs the RRset to chase:
    92        .                       170985  IN      RRSIG   DNSKEY 8 0 172800 20140705235959 20140620000000 19036 . OWYyUDHJjQxh2KGaNdXqkvnmPj8E5Jafyya42A9oPOBBZ1L16Db7PTa4 /pwbuSgteAI3gGP3hPRUAnGLx87c0JK6DUWnbiElMY/eUmZO6j2sq0mL KZKM7CRdOd8erIlFiPUnOwOPOEDolH0RxdJYkV4N0z6cujA/Bfx8i8NS lnIu/yvDPxSwio5CrdSQ2UgDKY3WUVyoGWePySYd2i6kHyd7DqTVkWfk vMqcU1kQbABlDO0GPL9UQym/WAf13qXA/rN49aQyiVsldzyug8EDWhZI bcviBPf2McJnLz6X1hTMD7nT3kVGSbLnBmgyu2QJc10wVv+M4iuUtSWs mo8Byw==
    93
    94
    95
    96        Launch a query to find a RRset of type DS for zone: .
    97        ;; NO ANSWERS: no more
    98
    99        ;; WARNING There is no DS for the zone: .
   100
   101
   102
   103        ;; WE HAVE MATERIAL, WE NOW DO VALIDATION
   104        ;; VERIFYING DS RRset for se. with DNSKEY:40926: success
   105        ;; OK We found DNSKEY (or more) to validate the RRset
   106        ;; Ok, find a Trusted Key in the DNSKEY RRset: 19036
   107        ;; VERIFYING DNSKEY RRset for . with DNSKEY:19036: success
   108
   109        ;; Ok this DNSKEY is a Trusted Key, DNSSEC validation is ok: SUCCESS
   110

Analicemos este resultado:

Aquí podemos ver el registro que hemos pedido y su firma digital:

2        www.iis.se.             12      IN      A       91.226.36.46
[...]
6        www.iis.se.             12      IN      RRSIG   A 5 3 60 20140701161502 20140621161502 23948 iis.se. PJj85jSCa4Jh/fhhWRABflyoB3Ks8JkwAFaRJm7rGboqqO1aVgTFzejS i9gsCDZB0SEcZYFeGoTQIsWH55AgfiBpGazUg3C8/jpBRsctdUAyDPoa Etqx8cgu+FuTJdEd0risqUvW1CSq7Zk2s1sj8AcKw6/GhPFH1W3+3XxQ IME=

La firma es el registro RRSIG, que se realizó el 21 de junio de 2014 y es válida hasta el 1 de julio. La firma en sí se realizó con la clave cuyo identificador es 23948.

Con esa información podemos obtener la clave pública que se corresponde al identificador 23948 en el dominio iis.se., y verificar la firma digital que nos ha llegado:

10        Launch a query to find a RRset of type DNSKEY for zone: iis.se.
11
12        ;; DNSKEYset that signs the RRset to chase:
13        iis.se.                 1406    IN      DNSKEY  257 3 5 AwEAAcq5u+qe5VibnyvSnGU20panweAk2QxflGVuVQhzQABQV4SIdAQs +LNVHF61lcxe504jhPmjeQ656X6t+dHpRz1DdPO/ukcIITjIRoJHqS+X XyL6gUluZoDU+K6vpxkGJx5m5n4boRTKCTUAR/9rw2+IQRRTtb6nBwsC 3pmf9IlJQjQMb1cQTb0UO7fYgXDZIYVul2LwGpKRrMJ6Ul1nepkSxTMw Q4H9iKE9FhqPeIpzU9dnXGtJ+ZCx9tWSZ9VsSLWBJtUwoE6ZfIoF1ioq qxfGl9JV1/6GkDxo3pMN2edhkp8aqoo/R+mrJYi0vE8jbXvhZ12151Dy wuSxbGjAlxk=
14        iis.se.                 1406    IN      DNSKEY  256 3 5 BQEAAAABqIGyOZCd9mS36Z9Wh0uDNuSvKvr0ZhWTdJ89cNXCU+OOsG+4 bm4InmtM0wGxcDlDz+QAr+1bA0Fnq42rYUSqagkjpw6cHg6IJSqCAOA6 ZwXI6pgYpNLqSDJSYwqj5ZlYyS57bohloRnfmOklIYDwlb8eIz7kGLbg OzCSXlzrvj0=
15
16
17        ;; RRSIG of the DNSKEYset that signs the RRset to chase:
18        iis.se.                 1406    IN      RRSIG   DNSKEY 5 2 3600 20140701161502 20140621161502 18937 iis.se. LzvFO7zLn0s02oYJBjuo+FJ/cJdZJoy+/5QyI3mwVIfT4RgCToGEn8HN tdOQryTXTdltrJhl8q824wrglli/BRPk/qAgTwTco8/EJtWHE0tdIUFN +D23u36MBMkpYALI/GnWDeicC+c4puzSf3xjpMc3lkbzw9tJWtcPatfO 6aqqKPqaP0K0w1SlJW5awUgVudDPB9xtP8mhVkTm8QJbAIU4JRsUjLUO 2yzEkcUXDNG+asTn3awmNbZ5TbksPiyf5vPoiAIexnKsWoMwgVjuT8P3 jfVC7w+g0LImMQq1SRl7YpEohU1lQ3RYMF6c8InLyJ3IJ2BKX7fuSKGj OyWRRw==
19        iis.se.                 1406    IN      RRSIG   DNSKEY 5 2 3600 20140701161502 20140621161502 23948 iis.se. NaeG5YYr4vXXbsMffNkrWIXtANTA6h4Om6Zd9Ak4dzjA6fpuWlAqflGJ 6lCBK3ooICzdVeS4pe77Vf2v8TkzpntnpKH8I2b++OrxdQXIpX+XQmdo /Y3fp0AClNCenkN/h/6ZiowBRyoCZ9wEpVHohflrNWsBU/IHKGy7FNkv cHo=
20
21
22
23        Launch a query to find a RRset of type DS for zone: iis.se.
24
25        ;; DSset of the DNSKEYset
26        iis.se.                 1406    IN      DS      18937 5 2 B5C422428DEA4137FBF15E1049A48D27FA5EADE64D2EC9F3B58A994A 6ABDE543
27        iis.se.                 1406    IN      DS      18937 5 1 10DD1EFDC7841ABFDF630C8BB37153724D70830A
28
29
30        ;; RRSIG of the DSset of the DNSKEYset
31        iis.se.                 1406    IN      RRSIG   DS 5 2 3600 20140703220139 20140621101201 30280 se. arcSXOiRFFC/ugqtVYJQO2E2QFXnuEfMbxj6JCmQA7QrYZUfvw0x1qc+ wCox87oQwK6zBfUE+6E8xG4ZiOCutK7TMTA0Smjxw24IcD3oibRsXIeS J1xppxiCmdddr87c89zwGVoOBVYIJrnByT2pldzjou/LfayBlwF2dpV5 Nd8=
32
33
34
35
36        ;; WE HAVE MATERIAL, WE NOW DO VALIDATION
37        ;; VERIFYING A RRset for www.iis.se. with DNSKEY:23948: success
38        ;; OK We found DNSKEY (or more) to validate the RRset
39        ;; Now, we are going to validate this DNSKEY by the DS
40        ;; OK a DS valids a DNSKEY in the RRset
41        ;; Now verify that this DNSKEY validates the DNSKEY RRset
42        ;; VERIFYING DNSKEY RRset for iis.se. with DNSKEY:18937: success
43        ;; OK this DNSKEY (validated by the DS) validates the RRset of the DNSKEYs, thus the DNSKEY validates the RRset
44        ;; Now, we want to validate the DS :  recursive call

Lo que tenemos aquí es la obtención de las claves de la zona DNS iis.se., junto con sus firmas digitales correspondientes. En este caso, una clave KSK y una clave ZSK. Podemos comprobar que la clave 23948 que estamos buscando está ahí:

$ dig +multiline iis.se. DNSKEY|sed 's/^/  /'

; <<>> DiG 9.9.5-P2 <<>> +multiline iis.se. DNSKEY
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62095
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;iis.se.                      IN DNSKEY

;; ANSWER SECTION:
iis.se.                       3600 IN DNSKEY 257 3 5 (
                              AwEAAcq5u+qe5VibnyvSnGU20panweAk2QxflGVuVQhz
                              QABQV4SIdAQs+LNVHF61lcxe504jhPmjeQ656X6t+dHp
                              Rz1DdPO/ukcIITjIRoJHqS+XXyL6gUluZoDU+K6vpxkG
                              Jx5m5n4boRTKCTUAR/9rw2+IQRRTtb6nBwsC3pmf9IlJ
                              QjQMb1cQTb0UO7fYgXDZIYVul2LwGpKRrMJ6Ul1nepkS
                              xTMwQ4H9iKE9FhqPeIpzU9dnXGtJ+ZCx9tWSZ9VsSLWB
                              JtUwoE6ZfIoF1ioqqxfGl9JV1/6GkDxo3pMN2edhkp8a
                              qoo/R+mrJYi0vE8jbXvhZ12151DywuSxbGjAlxk=
                              ) ; key id = 18937
iis.se.                       3600 IN DNSKEY 256 3 5 (
                              BQEAAAABqIGyOZCd9mS36Z9Wh0uDNuSvKvr0ZhWTdJ89
                              cNXCU+OOsG+4bm4InmtM0wGxcDlDz+QAr+1bA0Fnq42r
                              YUSqagkjpw6cHg6IJSqCAOA6ZwXI6pgYpNLqSDJSYwqj
                              5ZlYyS57bohloRnfmOklIYDwlb8eIz7kGLbgOzCSXlzr
                              vj0=
                              ) ; key id = 23948

;; Query time: 77 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Jun 22 19:36:13 2014
;; MSG SIZE  rcvd: 450

Los registros DNSKEY contienen las claves KSK y ZSK, como ya hemos dicho. Hay dos firmas, una de la clave 18937 (la clave KSK) y otra con la clave 23948 (ZSK). Ahora podemos verificar la firma del registro A del primer paso. Por tanto, comprobamos que el registro A ha sido firmada por la clave 23948 (ZSK) y sabemos que dicha clave es válida para el dominio iis.se. porque está firmada por la clave 18937, que es la KSK.

Hasta aquí bien. Pero ahora tenemos que verificar que la clave 18937, la KSK, es la que corresponde a ese dominio. Eso se hace pidiendo al dominio padre (en este caso, se.) el registro DS para iis.se.. Este registro fue proporcionado por los administradores de iis.se. al registrador se. mediante alguna forma segura que no voy a explicar aquí.

Dicho registro DS tendrá una firma digital RRSIG, firmada a su vez con la clave ZSK del dominio se.. El proceso se repite de nuevo:

47        Launch a query to find a RRset of type DNSKEY for zone: se.
48
49        ;; DNSKEYset that signs the RRset to chase:
50        se.                     144     IN      DNSKEY  256 3 5 AwEAAcd46xFq6BbjR34UY1xpjJ5Ej9M3I7q8ZOPp4cQXXJUVCw2v+D68 wI09RDiJHDW7PHlv2aVLhYBTLTBb5XwnQM938B7XEpp/BJHqDgUaubQz YuiUc11LYos+Z6qj2WU4AUyHiHmWemcYKe8vz85cyskS0y7FRNPFD7AF eJ10Wy7Z
51        se.                     144     IN      DNSKEY  256 3 5 AwEAAfBv/pPSg6vrc3RUe/JKzC1ZmuvOWOgAZNAK3vgZn5hKfmvR8iM5 PGTP6PeEiT9V/v69pemFZJhYGcxk0xkFWj/X6nbnj3X4vEr43dHajTiS NVRDStbQLuHH+kA3kSh7IRhLP42d8Qqi240IJFwzoDg2HSLcjfw5wrd1 nsOQjeMN
52        se.                     144     IN      DNSKEY  257 3 5 AwEAAZYYG1hpk8XKHNHpdO/EEg+r4YmIEC4Fn3x2DEsygxDuoT9d/QCi X1pz0omFGCaVfCWHvaScVvWd4xP4kNDnSDQxBzPwLEXE3l0cLseMJ2YM QeBPf3hGhLs6VSDnGFKAzNG4fhri9EBTLv9ubL8Kx8cWQKuu3A5HRVD3 li7lZB+0kmUKqGiIQdERKt/Ec36BkK93lyGags5RrR2VDdrXCj9Yay90 KCKITk52AbwVoMPm0OYlPbD4ViBPMk5nmh/dPeCoZoVJxgANZ/doVQxR 5vDkMBYxuhrXuQk3CvZBB011NsXxk9yHtHvp/5gjUVJjvhdRvjRB6/xY R03c9owi/aM=
53
54
55        ;; RRSIG of the DNSKEYset that signs the RRset to chase:
56        se.                     144     IN      RRSIG   DNSKEY 5 1 3600 20140703113400 20140619181201 59747 se. cpoQYRTf5PpVtBVh+TBi0ftCKLuU8QenfvdKxE+3VWTT03waDs/5Tfew pW881WC6b3hRrj16x5FWRnBEMtpPCvX0HIpTHEBPbzoswPBVjZdlhR9A eq5ZzQ32jmztw6ue7bvxCdixUiAyW6PwBhl1Vhse1G4tQH+th1dgZUHi 72qIcKACY//7sAxbmeJfDziC9w+zXPZk060f47B5qgyiJ7YmNpXk7hmN UhLkwsMz5fp/8YhzQXIt8a1vcBVSOmUxjJvMMLdjAmX9tCUtRKAtvPBK yeP0WhPTjCNfuCYKt3F8AAsHLP8NM8pIMXsgqoOg69p06UEsYzs6x9nQ Nlr89Q==
57
58
59
60        Launch a query to find a RRset of type DS for zone: se.
61
62        ;; DSset of the DNSKEYset
63        se.                     57081   IN      DS      59747 5 2 44388B3DE9A22CAFA8A12883F60A0F984472D0DFEF0F63ED59A29BE0 18658B28
64
65
66        ;; RRSIG of the DSset of the DNSKEYset
67        se.                     57081   IN      RRSIG   DS 8 1 86400 20140629000000 20140621230000 40926 . kXOVZY6BpnZM26VTwouFPWwujek2khXWCYEtBZxhGuL3C672bHH4lSFi nvR9myxCCcvVESsyKYmWMShEFUuILY3jn5KSur1Mdxf+EOvcsrTxPdf4 93PtGiJLNTylAjjuNAeTIga5+xlg5bJoVPwTiZd6F3gBGXDl8/xnGVbm nUE=
68
69
70
71
72        ;; WE HAVE MATERIAL, WE NOW DO VALIDATION
73        ;; VERIFYING DS RRset for iis.se. with DNSKEY:30280: success
74        ;; OK We found DNSKEY (or more) to validate the RRset
75        ;; Now, we are going to validate this DNSKEY by the DS
76        ;; OK a DS valids a DNSKEY in the RRset
77        ;; Now verify that this DNSKEY validates the DNSKEY RRset
78        ;; VERIFYING DNSKEY RRset for se. with DNSKEY:59747: success
79        ;; OK this DNSKEY (validated by the DS) validates the RRset of the DNSKEYs, thus the DNSKEY validates the RRset
80        ;; Now, we want to validate the DS :  recursive call

Aquí tenemos dos claves ZSK (debido al tema de key rollover, en el que no voy a entrar en este artículo) y una clave KSK, y una única firma RRSIG con la KSK que, en realidad, es la única que hace falta en este caso (la firma ZSK es redundante en este registro en concreto. Que aparezca en el dominio iis.se. es un detalle de implementación). Comprobando las firmas digitales vemos que el registro DS del dominio se. avala el hecho de que la clave KSK del registro iis.se. es la que encontramos durante la resolución.

Muy bien. Pero ahora tenemos que hacer lo mismo para el propio dominio se.. Hay que comprobar que su KSK no ha sido falsificada. Para ello nos vamos al dominio raíz (el dominio "punto" .) y repetimos el proceso una vez más:

 83        Launch a query to find a RRset of type DNSKEY for zone: .
 84
 85        ;; DNSKEYset that signs the RRset to chase:
 86        .                       170985  IN      DNSKEY  256 3 8 AwEAAbSuNNFSFZP1bBNxG7R6xcMhgKV2Rkk0wOMbmMd6d2mNydvRxLf3 Es0rKPr2UGz2AWGzEUhSUz028KXNZ2Z1jI+BSeaDaVzaBvKVqxYDodjV SFa+0nMsdYI0RiFn9iNZDWsV1rCeAf9AEg3rOCSbK9Sq+Q9AWq6d/iEs rhjs5HPX
 87        .                       170985  IN      DNSKEY  257 3 8 AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjF FVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoX bfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaD X6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpz W5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relS Qageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulq QxA+Uk1ihz0=
 88        .                       170985  IN      DNSKEY  256 3 8 AwEAAZvJd8ORk+jmZ41QMYbQ1XCpf60l6YJuHtnxn0VSh5a5vqwEjTST 3/PZ4xhUFu2YcTfRNWxs9WTiGZl3MY/UlBIvzpLhKgKnf9Vk8sEU3q0n mOGFgE6jTi/cU95ATU/2dTQovMDv9XyWvrmj8KIG2brj6mF4S8GTae6G 2GwbMF5v
 89
 90
 91        ;; RRSIG of the DNSKEYset that signs the RRset to chase:
 92        .                       170985  IN      RRSIG   DNSKEY 8 0 172800 20140705235959 20140620000000 19036 . OWYyUDHJjQxh2KGaNdXqkvnmPj8E5Jafyya42A9oPOBBZ1L16Db7PTa4 /pwbuSgteAI3gGP3hPRUAnGLx87c0JK6DUWnbiElMY/eUmZO6j2sq0mL KZKM7CRdOd8erIlFiPUnOwOPOEDolH0RxdJYkV4N0z6cujA/Bfx8i8NS lnIu/yvDPxSwio5CrdSQ2UgDKY3WUVyoGWePySYd2i6kHyd7DqTVkWfk vMqcU1kQbABlDO0GPL9UQym/WAf13qXA/rN49aQyiVsldzyug8EDWhZI bcviBPf2McJnLz6X1hTMD7nT3kVGSbLnBmgyu2QJc10wVv+M4iuUtSWs mo8Byw==
 93
 94
 95
 96        Launch a query to find a RRset of type DS for zone: .
 97        ;; NO ANSWERS: no more
 98
 99        ;; WARNING There is no DS for the zone: .
100
101
102
103        ;; WE HAVE MATERIAL, WE NOW DO VALIDATION
104        ;; VERIFYING DS RRset for se. with DNSKEY:40926: success
105        ;; OK We found DNSKEY (or more) to validate the RRset
106        ;; Ok, find a Trusted Key in the DNSKEY RRset: 19036
107        ;; VERIFYING DNSKEY RRset for . with DNSKEY:19036: success
108
109        ;; Ok this DNSKEY is a Trusted Key, DNSSEC validation is ok: SUCCESS

Esta petición es, en realidad, redundante, ya que la clave que firma la zona raíz ya la declaramos explícitamente en el fichero root.key. Comprobamos que las firmas son correctas y así completamos la verificación del árbol DNSSEC entero.

Resumiendo mucho, en cada nivel del árbol comprobamos la firma digital de los registros que nos interesan y comprobamos la validez de las claves utilizadas para firmar comprobando que su zona padre así las declara, hasta que llegamos a la zona raíz. La clave pública de la zona raíz es conocida por todo el mundo y está integrada con el hardware y el software DNSSEC. Si la consideramos buena, validamos el árbol entero.

Un detalle más al tener en cuenta es que las claves no son los números 19036, 59747, etc. Esos son identificadores de claves únicos en cada zona DNS que sirven para reducir el tamaño de los datagramas DNSSEC y para que los humanos podemos seguir el hilo de lo que ocurre. Pero las claves en sí se definen en los registros DNSKEY y son, típicamente, 1024 bits RSA para las ZSK y 2048 bits RSA para las KSK.

Verificación arriba-abajo con DIG

El árbol DNSSEC se puede verificar también de arriba a abajo, añadiendo el parámetro +topdown al comando dig:

$ dig +sigchase +topdown +trusted-key=root.key www.iis.se. A | cat -n
     1        ns name: 193.0.14.129
     2        ns name: 192.36.148.17
     3        ns name: 199.7.91.13
     4        ns name: 199.7.83.42
     5        ns name: 192.33.4.12
     6        ns name: 192.203.230.10
     7        ns name: 192.228.79.201
     8        ns name: 192.58.128.30
     9        ns name: 202.12.27.33
    10        ns name: 192.5.5.241
    11        ns name: 128.63.2.53
    12        ns name: 192.112.36.4
    13        ns name: 198.41.0.4
    14
    15        Launch a query to find a RRset of type A for zone: www.iis.se. with nameservers:
    16        .                       342293  IN      NS      k.root-servers.net.
    17        .                       342293  IN      NS      i.root-servers.net.
    18        .                       342293  IN      NS      d.root-servers.net.
    19        .                       342293  IN      NS      l.root-servers.net.
    20        .                       342293  IN      NS      c.root-servers.net.
    21        .                       342293  IN      NS      e.root-servers.net.
    22        .                       342293  IN      NS      b.root-servers.net.
    23        .                       342293  IN      NS      j.root-servers.net.
    24        .                       342293  IN      NS      m.root-servers.net.
    25        .                       342293  IN      NS      f.root-servers.net.
    26        .                       342293  IN      NS      h.root-servers.net.
    27        .                       342293  IN      NS      g.root-servers.net.
    28        .                       342293  IN      NS      a.root-servers.net.
    29
    30        no response but there is a delegation in authority section:se.
    31
    32
    33        Launch a query to find a RRset of type DNSKEY for zone: .
    34
    35        ;; DNSKEYset:
    36        .                       172800  IN      DNSKEY  256 3 8 AwEAAZvJd8ORk+jmZ41QMYbQ1XCpf60l6YJuHtnxn0VSh5a5vqwEjTST 3/PZ4xhUFu2YcTfRNWxs9WTiGZl3MY/UlBIvzpLhKgKnf9Vk8sEU3q0n mOGFgE6jTi/cU95ATU/2dTQovMDv9XyWvrmj8KIG2brj6mF4S8GTae6G 2GwbMF5v
    37        .                       172800  IN      DNSKEY  256 3 8 AwEAAbSuNNFSFZP1bBNxG7R6xcMhgKV2Rkk0wOMbmMd6d2mNydvRxLf3 Es0rKPr2UGz2AWGzEUhSUz028KXNZ2Z1jI+BSeaDaVzaBvKVqxYDodjV SFa+0nMsdYI0RiFn9iNZDWsV1rCeAf9AEg3rOCSbK9Sq+Q9AWq6d/iEs rhjs5HPX
    38        .                       172800  IN      DNSKEY  257 3 8 AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjF FVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoX bfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaD X6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpz W5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relS Qageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulq QxA+Uk1ihz0=
    39
    40
    41        ;; RRSIG of the DNSKEYset:
    42        .                       172800  IN      RRSIG   DNSKEY 8 0 172800 20140705235959 20140620000000 19036 . OWYyUDHJjQxh2KGaNdXqkvnmPj8E5Jafyya42A9oPOBBZ1L16Db7PTa4 /pwbuSgteAI3gGP3hPRUAnGLx87c0JK6DUWnbiElMY/eUmZO6j2sq0mL KZKM7CRdOd8erIlFiPUnOwOPOEDolH0RxdJYkV4N0z6cujA/Bfx8i8NS lnIu/yvDPxSwio5CrdSQ2UgDKY3WUVyoGWePySYd2i6kHyd7DqTVkWfk vMqcU1kQbABlDO0GPL9UQym/WAf13qXA/rN49aQyiVsldzyug8EDWhZI bcviBPf2McJnLz6X1hTMD7nT3kVGSbLnBmgyu2QJc10wVv+M4iuUtSWs mo8Byw==
    43
    44        ;; Ok, find a Trusted Key in the DNSKEY RRset: 19036
    45        ;; VERIFYING DNSKEY RRset for . with DNSKEY:19036: success
    46
    47        ;; DSset:
    48        se.                     86400   IN      DS      59747 5 2 44388B3DE9A22CAFA8A12883F60A0F984472D0DFEF0F63ED59A29BE0 18658B28
    49
    50
    51        ;; RRSIGset of DSset
    52        se.                     86400   IN      RRSIG   DS 8 1 86400 20140629000000 20140621230000 40926 . kXOVZY6BpnZM26VTwouFPWwujek2khXWCYEtBZxhGuL3C672bHH4lSFi nvR9myxCCcvVESsyKYmWMShEFUuILY3jn5KSur1Mdxf+EOvcsrTxPdf4 93PtGiJLNTylAjjuNAeTIga5+xlg5bJoVPwTiZd6F3gBGXDl8/xnGVbm nUE=
    53
    54        ;; VERIFYING DS RRset for se. with DNSKEY:40926: success
    55        ns name: 192.36.144.107
    56        ns name: 192.36.133.107
    57        ns name: 192.36.135.107
    58        ns name: 81.228.8.16
    59        ns name: 81.228.10.57
    60        ns name: 192.71.53.53
    61        ns name: 130.239.5.114
    62        ns name: 194.146.106.22
    63        ns name: 199.254.63.1
    64
    65        Launch a query to find a RRset of type A for zone: www.iis.se. with nameservers:
    66        se.                     172800  IN      NS      a.ns.se.
    67        se.                     172800  IN      NS      b.ns.se.
    68        se.                     172800  IN      NS      c.ns.se.
    69        se.                     172800  IN      NS      d.ns.se.
    70        se.                     172800  IN      NS      e.ns.se.
    71        se.                     172800  IN      NS      f.ns.se.
    72        se.                     172800  IN      NS      g.ns.se.
    73        se.                     172800  IN      NS      i.ns.se.
    74        se.                     172800  IN      NS      j.ns.se.
    75
    76        no response but there is a delegation in authority section:iis.se.
    77
    78
    79        Launch a query to find a RRset of type DNSKEY for zone: se.
    80
    81        ;; DNSKEYset:
    82        se.                     3600    IN      DNSKEY  256 3 5 AwEAAcd46xFq6BbjR34UY1xpjJ5Ej9M3I7q8ZOPp4cQXXJUVCw2v+D68 wI09RDiJHDW7PHlv2aVLhYBTLTBb5XwnQM938B7XEpp/BJHqDgUaubQz YuiUc11LYos+Z6qj2WU4AUyHiHmWemcYKe8vz85cyskS0y7FRNPFD7AF eJ10Wy7Z
    83        se.                     3600    IN      DNSKEY  256 3 5 AwEAAfBv/pPSg6vrc3RUe/JKzC1ZmuvOWOgAZNAK3vgZn5hKfmvR8iM5 PGTP6PeEiT9V/v69pemFZJhYGcxk0xkFWj/X6nbnj3X4vEr43dHajTiS NVRDStbQLuHH+kA3kSh7IRhLP42d8Qqi240IJFwzoDg2HSLcjfw5wrd1 nsOQjeMN
    84        se.                     3600    IN      DNSKEY  257 3 5 AwEAAZYYG1hpk8XKHNHpdO/EEg+r4YmIEC4Fn3x2DEsygxDuoT9d/QCi X1pz0omFGCaVfCWHvaScVvWd4xP4kNDnSDQxBzPwLEXE3l0cLseMJ2YM QeBPf3hGhLs6VSDnGFKAzNG4fhri9EBTLv9ubL8Kx8cWQKuu3A5HRVD3 li7lZB+0kmUKqGiIQdERKt/Ec36BkK93lyGags5RrR2VDdrXCj9Yay90 KCKITk52AbwVoMPm0OYlPbD4ViBPMk5nmh/dPeCoZoVJxgANZ/doVQxR 5vDkMBYxuhrXuQk3CvZBB011NsXxk9yHtHvp/5gjUVJjvhdRvjRB6/xY R03c9owi/aM=
    85
    86
    87        ;; RRSIG of the DNSKEYset:
    88        se.                     3600    IN      RRSIG   DNSKEY 5 1 3600 20140703113400 20140619181201 59747 se. cpoQYRTf5PpVtBVh+TBi0ftCKLuU8QenfvdKxE+3VWTT03waDs/5Tfew pW881WC6b3hRrj16x5FWRnBEMtpPCvX0HIpTHEBPbzoswPBVjZdlhR9A eq5ZzQ32jmztw6ue7bvxCdixUiAyW6PwBhl1Vhse1G4tQH+th1dgZUHi 72qIcKACY//7sAxbmeJfDziC9w+zXPZk060f47B5qgyiJ7YmNpXk7hmN UhLkwsMz5fp/8YhzQXIt8a1vcBVSOmUxjJvMMLdjAmX9tCUtRKAtvPBK yeP0WhPTjCNfuCYKt3F8AAsHLP8NM8pIMXsgqoOg69p06UEsYzs6x9nQ Nlr89Q==
    89
    90        ;; OK a DS valids a DNSKEY in the RRset
    91        ;; Now verify that this DNSKEY validates the DNSKEY RRset
    92        ;; VERIFYING DNSKEY RRset for se. with DNSKEY:59747: success
    93
    94        ;; DSset:
    95        iis.se.                 3600    IN      DS      18937 5 1 10DD1EFDC7841ABFDF630C8BB37153724D70830A
    96        iis.se.                 3600    IN      DS      18937 5 2 B5C422428DEA4137FBF15E1049A48D27FA5EADE64D2EC9F3B58A994A 6ABDE543
    97
    98
    99        ;; RRSIGset of DSset
   100        iis.se.                 3600    IN      RRSIG   DS 5 2 3600 20140703220139 20140621101201 30280 se. arcSXOiRFFC/ugqtVYJQO2E2QFXnuEfMbxj6JCmQA7QrYZUfvw0x1qc+ wCox87oQwK6zBfUE+6E8xG4ZiOCutK7TMTA0Smjxw24IcD3oibRsXIeS J1xppxiCmdddr87c89zwGVoOBVYIJrnByT2pldzjou/LfayBlwF2dpV5 Nd8=
   101
   102        ;; VERIFYING DS RRset for iis.se. with DNSKEY:30280: success
   103        ns name: 212.247.7.228
   104        ns name: 194.146.106.22
   105        ns name: 212.247.8.152
   106
   107        Launch a query to find a RRset of type A for zone: www.iis.se. with nameservers:
   108        iis.se.                 86400   IN      NS      ns.nic.se.
   109        iis.se.                 86400   IN      NS      i.ns.se.
   110        iis.se.                 86400   IN      NS      ns3.nic.se.
   111
   112
   113
   114        Launch a query to find a RRset of type DNSKEY for zone: iis.se.
   115
   116        ;; DNSKEYset:
   117        iis.se.                 3600    IN      DNSKEY  257 3 5 AwEAAcq5u+qe5VibnyvSnGU20panweAk2QxflGVuVQhzQABQV4SIdAQs +LNVHF61lcxe504jhPmjeQ656X6t+dHpRz1DdPO/ukcIITjIRoJHqS+X XyL6gUluZoDU+K6vpxkGJx5m5n4boRTKCTUAR/9rw2+IQRRTtb6nBwsC 3pmf9IlJQjQMb1cQTb0UO7fYgXDZIYVul2LwGpKRrMJ6Ul1nepkSxTMw Q4H9iKE9FhqPeIpzU9dnXGtJ+ZCx9tWSZ9VsSLWBJtUwoE6ZfIoF1ioq qxfGl9JV1/6GkDxo3pMN2edhkp8aqoo/R+mrJYi0vE8jbXvhZ12151Dy wuSxbGjAlxk=
   118        iis.se.                 3600    IN      DNSKEY  256 3 5 BQEAAAABqIGyOZCd9mS36Z9Wh0uDNuSvKvr0ZhWTdJ89cNXCU+OOsG+4 bm4InmtM0wGxcDlDz+QAr+1bA0Fnq42rYUSqagkjpw6cHg6IJSqCAOA6 ZwXI6pgYpNLqSDJSYwqj5ZlYyS57bohloRnfmOklIYDwlb8eIz7kGLbg OzCSXlzrvj0=
   119
   120
   121        ;; RRSIG of the DNSKEYset:
   122        iis.se.                 3600    IN      RRSIG   DNSKEY 5 2 3600 20140702161502 20140622161502 18937 iis.se. WZlAQaUjkfIkrzfkc1qYjpwAPtqVH5HzTRAxdxHnZrTuMW8h9r+aY6Ox yFXpGzDsapdh2eIV+xxJ1HE25kFZkuxO1Na0IpNGmcaZ27rubFYIC1G2 I2/q5Inkul49zFPIMzLjLHnEv9arlQ9eG6gpQklDUSFld3lG6xc9UzX0 DJhr+Hj+wuAnt6wKO8oUkl9PpBppb4z31JkDamMmV1uIaVbM8HzfPA0I m+gZVtNrf4fKqO55hF0cwx0+pB5nwIUtSPQZk9snfHb7sDax9IrgAcdC JaVZ31ZyWsw9MdM4rL54QWa8s4w8VDaU7QOmpDXWcDA5RdKSi30aMVbc E+VLIw==
   123        iis.se.                 3600    IN      RRSIG   DNSKEY 5 2 3600 20140702161502 20140622161502 23948 iis.se. PqOjXCoITPKprOwcepZ3cF9CGbsK/Lq1ukWhFH6s2K+tQ80KG1vPsHgL WDF5+jUswMx3UuLhJFQUAa5pKtAeGCNZu1KZJQy24hNz0LoQm0hAMFSn ACdcAmQY0zIXy1zcye6H+7u5Bm15p4Yf6idw2AnjTnnJrLT7UVylHckP X0M=
   124
   125        ;; OK a DS valids a DNSKEY in the RRset
   126        ;; Now verify that this DNSKEY validates the DNSKEY RRset
   127        ;; VERIFYING DNSKEY RRset for iis.se. with DNSKEY:18937: success
   128        ;; VERIFYING A RRset for www.iis.se. with DNSKEY:23948: success
   129
   130        ;; The Answer:
   131        www.iis.se.             60      IN      A       91.226.36.46
   132
   133
   134        ;; FINISH : we have validate the DNSSEC chain of trust: SUCCESS
   135
   136        ;; cleanandgo

Aquí partimos de la clave root.key y vamos verificando y bajando en el árbol DNSSEC. Cada nivel nos da, a través de un registro DS firmado, la clave del siguiente nivel, que se verificará con los registros DNSKEY y RRSIG.

Verificación con DELV

dig es una herramienta de propósito general, perfecta para diagnosticar problemas con el DNS. Pero seguir el hilo a todo lo que ocurre durante una resolución DNSSEC es largo y complicado. Y es fácil cometer errores.

Con la publicación de la versión 9.10.0 de BIND, ISC ha hecho pública también una herramienta nueva: delv. Veamos:

$ delv +multi www.iis.se
; fully validated
www.iis.se.           60 IN A 91.226.36.46
www.iis.se.           60 IN RRSIG A 5 3 60 (
                              20140702161502 20140622161502 23948 iis.se.
                              Iq5XTuaS0KmqW151haQgmjtqt8QP63j3zzTqjpNDv0jL
                              Po/iMMGEFPnpYJX4tz7g1CGl4lL6Fy8ba6jQJ++W838n
                              bY88AUcldvc3PlqMxNVBN9jGkGTyVt6o8kOfxUTlxwIa
                              qvl40xyi9GFb59mcazY9oqW7xuBmJOhAmQJz4bI= )

El fully validated nos indica que la verificación DNSSEC es correcta.

Podemos ver más detalles, como todos los registros que delv solicita para realizar la verificación:

$ delv +multi +rtrace www.iis.se
;; fetch: www.iis.se/A
;; fetch: iis.se/DNSKEY
;; fetch: iis.se/DS
;; fetch: se/DNSKEY
;; fetch: se/DS
;; fetch: ./DNSKEY
; fully validated
www.iis.se.           18 IN A 91.226.36.46
www.iis.se.           18 IN RRSIG A 5 3 60 (
                              20140702161502 20140622161502 23948 iis.se.
                              Iq5XTuaS0KmqW151haQgmjtqt8QP63j3zzTqjpNDv0jL
                              Po/iMMGEFPnpYJX4tz7g1CGl4lL6Fy8ba6jQJ++W838n
                              bY88AUcldvc3PlqMxNVBN9jGkGTyVt6o8kOfxUTlxwIa
                              qvl40xyi9GFb59mcazY9oqW7xuBmJOhAmQJz4bI= )

Y ya si queremos el colmo de información, saber todo lo que está pasando:

$ delv +multi +vtrace www.iis.se
;; fetch: www.iis.se/A
;; validating www.iis.se/A: starting
;; validating www.iis.se/A: attempting positive response validation
;; fetch: iis.se/DNSKEY
;; validating iis.se/DNSKEY: starting
;; validating iis.se/DNSKEY: attempting positive response validation
;; fetch: iis.se/DS
;; validating iis.se/DS: starting
;; validating iis.se/DS: attempting positive response validation
;; fetch: se/DNSKEY
;; validating se/DNSKEY: starting
;; validating se/DNSKEY: attempting positive response validation
;; fetch: se/DS
;; validating se/DS: starting
;; validating se/DS: attempting positive response validation
;; fetch: ./DNSKEY
;; validating ./DNSKEY: starting
;; validating ./DNSKEY: attempting positive response validation
;; validating ./DNSKEY: verify rdataset (keyid=19036): success
;; validating ./DNSKEY: signed by trusted key; marking as secure
;; validating se/DS: in fetch_callback_validator
;; validating se/DS: keyset with trust secure
;; validating se/DS: resuming validate
;; validating se/DS: verify rdataset (keyid=40926): success
;; validating se/DS: marking as secure, noqname proof not needed
;; validating se/DNSKEY: in dsfetched
;; validating se/DNSKEY: dsset with trust secure
;; validating se/DNSKEY: verify rdataset (keyid=59747): success
;; validating se/DNSKEY: marking as secure (DS)
;; validating iis.se/DS: in fetch_callback_validator
;; validating iis.se/DS: keyset with trust secure
;; validating iis.se/DS: resuming validate
;; validating iis.se/DS: verify rdataset (keyid=30280): success
;; validating iis.se/DS: marking as secure, noqname proof not needed
;; validating iis.se/DNSKEY: in dsfetched
;; validating iis.se/DNSKEY: dsset with trust secure
;; validating iis.se/DNSKEY: verify rdataset (keyid=18937): success
;; validating iis.se/DNSKEY: marking as secure (DS)
;; validating www.iis.se/A: in fetch_callback_validator
;; validating www.iis.se/A: keyset with trust secure
;; validating www.iis.se/A: resuming validate
;; validating www.iis.se/A: verify rdataset (keyid=23948): success
;; validating www.iis.se/A: marking as secure, noqname proof not needed
; fully validated
www.iis.se.           60 IN A 91.226.36.46
www.iis.se.           60 IN RRSIG A 5 3 60 (
                              20140702161502 20140622161502 23948 iis.se.
                              Iq5XTuaS0KmqW151haQgmjtqt8QP63j3zzTqjpNDv0jL
                              Po/iMMGEFPnpYJX4tz7g1CGl4lL6Fy8ba6jQJ++W838n
                              bY88AUcldvc3PlqMxNVBN9jGkGTyVt6o8kOfxUTlxwIa
                              qvl40xyi9GFb59mcazY9oqW7xuBmJOhAmQJz4bI= )

Añadimos +multi a delv para que nos formatee el texto de una forma más fácil de leer. No afecta a la operación en sí del programa.

Claro y simple de entender. Un comando muy a tener en cuenta en el futuro y que muy posiblemente haga obsoleto a dig.

DELV y DNSSEC en España

Si usamos delv es España, hoy 23 de junio de 2014, obtenemos un resultado interesante:

$  delv +multi es. SOA
; fully validated
es.                   86400 IN SOA ns1.nic.es. hostmaster.nic.es. (
                              2014062203 ; serial
                              7200       ; refresh (2 hours)
                              7200       ; retry (2 hours)
                              2592000    ; expire (4 weeks 2 days)
                              86400      ; minimum (1 day)
                              )
es.                   86400 IN RRSIG SOA 8 1 86400 (
                              20140707003339 20140622193750 17994 es.
                              Y4d4UR6eU471ufFZ+Bev3AJj/qjs4q0AqDEK8QBkveYB
                              BaftxxseiyGbwmnPJ2pzS4nOkqOTRt5MQF8C97+o5ovj
                              CIsd8eOzhqSZ0IUEbKgBmgWgyR1PnNFkAbZZQnb342bS
                              E7Sl0mKvw024abQmQ7d2jBAxtBkRuZ+RXYGScqU= )

$ delv +multi +rtrace es. SOA
;; fetch: es/SOA
;; fetch: es/DNSKEY
;; fetch: es/DS
;; fetch: ./DNSKEY
;; fetch: es.dlv.isc.org/DLV
;; fetch: dlv.isc.org/DNSKEY
; fully validated
es.                   86293 IN SOA ns1.nic.es. hostmaster.nic.es. (
                              2014062203 ; serial
                              7200       ; refresh (2 hours)
                              7200       ; retry (2 hours)
                              2592000    ; expire (4 weeks 2 days)
                              86400      ; minimum (1 day)
                              )
es.                   86293 IN RRSIG SOA 8 1 86400 (
                              20140707003339 20140622193750 17994 es.
                              Y4d4UR6eU471ufFZ+Bev3AJj/qjs4q0AqDEK8QBkveYB
                              BaftxxseiyGbwmnPJ2pzS4nOkqOTRt5MQF8C97+o5ovj
                              CIsd8eOzhqSZ0IUEbKgBmgWgyR1PnNFkAbZZQnb342bS
                              E7Sl0mKvw024abQmQ7d2jBAxtBkRuZ+RXYGScqU= )

$ delv +multi +vtrace es. SOA 2>&1 | sed "s/^/  /"
;; fetch: es/SOA
;; validating es/SOA: starting
;; validating es/SOA: attempting positive response validation
;; fetch: es/DNSKEY
;; validating es/DNSKEY: starting
;; validating es/DNSKEY: attempting positive response validation
;; fetch: es/DS
;; validating es/DS: starting
;; validating es/DS: attempting negative response validation
;;   validating ./SOA: starting
;;   validating ./SOA: attempting positive response validation
;; fetch: ./DNSKEY
;; validating ./DNSKEY: starting
;; validating ./DNSKEY: attempting positive response validation
;; validating ./DNSKEY: verify rdataset (keyid=19036): success
;; validating ./DNSKEY: signed by trusted key; marking as secure
;;   validating ./SOA: in fetch_callback_validator
;;   validating ./SOA: keyset with trust secure
;;   validating ./SOA: resuming validate
;;   validating ./SOA: verify rdataset (keyid=40926): success
;;   validating ./SOA: marking as secure, noqname proof not needed
;; validating es/DS: in authvalidated
;; validating es/DS: resuming nsecvalidate
;;   validating es/NSEC: starting
;;   validating es/NSEC: attempting positive response validation
;;   validating es/NSEC: keyset with trust secure
;;   validating es/NSEC: verify rdataset (keyid=40926): success
;;   validating es/NSEC: marking as secure, noqname proof not needed
;; validating es/DS: in authvalidated
;; validating es/DS: looking for relevant NSEC
;; validating es/DS: nsec proves name exists (owner) data=0
;; validating es/DS: resuming nsecvalidate
;; validating es/DS: nonexistence proof(s) found
;; validating es/DNSKEY: in dsfetched
;; validating es/DNSKEY: falling back to insecurity proof (ncache nxrrset)
;; validating es/DNSKEY: checking existence of DS at 'es'
;; validating es/DNSKEY: plain DNSSEC returns unsecure (es): looking for DLV
;; validating es/DNSKEY: looking for DLV es.dlv.isc.org
;; validating es/DNSKEY: DNS_R_COVERINGNSEC
;; validating es/DNSKEY: covering nsec: not in range
;; fetch: es.dlv.isc.org/DLV
;; validating es/DNSKEY: DLV lookup: wait
;; validating es.dlv.isc.org/DLV: starting
;; validating es.dlv.isc.org/DLV: attempting positive response validation
;; fetch: dlv.isc.org/DNSKEY
;; validating dlv.isc.org/DNSKEY: starting
;; validating dlv.isc.org/DNSKEY: attempting positive response validation
;; validating dlv.isc.org/DNSKEY: verify rdataset (keyid=19297): success
;; validating dlv.isc.org/DNSKEY: signed by trusted key; marking as secure
;; validating es.dlv.isc.org/DLV: in fetch_callback_validator
;; validating es.dlv.isc.org/DLV: keyset with trust secure
;; validating es.dlv.isc.org/DLV: resuming validate
;; validating es.dlv.isc.org/DLV: verify rdataset (keyid=64263): success
;; validating es.dlv.isc.org/DLV: marking as secure, noqname proof not needed
;; validating es/DNSKEY: in dlvfetched: success
;; validating es/DNSKEY: DLV es found
;; validating es/DNSKEY: dlv_validator_start
;; validating es/DNSKEY: restarting using DLV
;; validating es/DNSKEY: attempting positive response validation
;; validating es/DNSKEY: dlv_validatezonekey
;; validating es/DNSKEY: Found matching DLV record: checking for signature
;; validating es/DNSKEY: verify rdataset (keyid=24026): success
;; validating es/DNSKEY: marking as secure (dlv)
;; validating es/SOA: in fetch_callback_validator
;; validating es/SOA: keyset with trust secure
;; validating es/SOA: resuming validate
;; validating es/SOA: verify rdataset (keyid=17994): success
;; validating es/SOA: marking as secure, noqname proof not needed
; fully validated
es.                   86288 IN SOA ns1.nic.es. hostmaster.nic.es. (
                              2014062203 ; serial
                              7200       ; refresh (2 hours)
                              7200       ; retry (2 hours)
                              2592000    ; expire (4 weeks 2 days)
                              86400      ; minimum (1 day)
                              )
es.                   86288 IN RRSIG SOA 8 1 86400 (
                              20140707003339 20140622193750 17994 es.
                              Y4d4UR6eU471ufFZ+Bev3AJj/qjs4q0AqDEK8QBkveYB
                              BaftxxseiyGbwmnPJ2pzS4nOkqOTRt5MQF8C97+o5ovj
                              CIsd8eOzhqSZ0IUEbKgBmgWgyR1PnNFkAbZZQnb342bS
                              E7Sl0mKvw024abQmQ7d2jBAxtBkRuZ+RXYGScqU= )

Vemos la aparición de estos registros misteriosos:

;; fetch: es.dlv.isc.org/DLV
;; fetch: dlv.isc.org/DNSKEY

Se trata de DNSSEC Look-aside Validation (DLV). Es una tecnología de ISC que permite que un dominio despliegue DNSSEC de forma segura incluso aunque su zona DNS padre no soporte DNSSEC. En este caso, España ha activado ya DNSSEC en su zona (aunque los registradores de la zona es. aún no permiten dar de alta registros DS) pero la zona DNS raíz aún no ha publicado un registro DS para España. Por lo tanto la cadena no puede verificarse. Ahí entra DLV, proporcionando una cadena secundaria de la que tirar.

Como ejemplo, yo podría haber desplegado DNSSEC en mi dominio jcea.es. solicitando a ISC la creación de un registro DS apropiado con el nombre jcea.es.dlv.isc.org.. Tendría DNSSEC funcionando incluso aunque es. no soportase (como no soporta aún) DNSSEC, aunque solo sería verificable para las herramientas que soporten y confíen en DLV [2].

La inclusión del DS para la zona es. en la zona raíz es inminente, así que no me apetece mucho meterme a explicar DLV a fondo. Me resultará innecesario en días. Pero tal vez le dedique un artículo futuro, si hay interés suficiente :-). Hacedme llegar vuestro feedback.

[2] delv incluye en su interior las claves públicas actuales de la raíz del árbol DNSSEC y de dlv.isc.org, así que puede verificar la cadena de confianza sin que tengamos que proporcionarle información manualmente.

Conclusiones

Como puede verse, la verificación DNSSEC es bastante más compleja que una resolución DNS normal y corriente. Los datagramas DNSSEC miden más debido a las firmas digitales contenidas en los registros RRSIG y es necesario consultar registros adicionales (DNSKEY y DS). Naturalmente también hay un consumo de CPU mayor en los servidores DNS intermedios, al verificar las firmas digitales. En los servidores DNS acreditados (authoritative) la criptografía no es un problema porque las firmas RRSIG se precalculan y duran varios días, independientemente del número de consultas que se produzcan.

Hay factores que ayudan. Por ejemplo, el Time To Live (TTL). Sin entrar en detalles aquí, cada vez que se obtiene un registro DNS, este viene acompañado de un TTL que nos indica su período de validez. Esto significa que si hemos accedido a http://www.red.es/, si al cabo de unos minutos entramos en http://www.jcea.es/ solo habrá que obtener el registro DS de jcea.es. y verificar la parte baja del árbol. No hay que verificar es. porque se ha comprobado hace unos minutos (el TTL nos indica durante cuánto tiempo nos sirve esa verificación). Si de http://www.jcea.es/ saltamos a http://blog.jcea.es/, el tener registros DNS en caché nos permite limitarnos a verificar el RRSIG de blog.jcea.es y nada más (cuando exista DNSSEC en España, se entiende).

Otro factor que ayuda es que, normalmente, la mayoría de los usuarios utilizan un servidor DNS externo, que no está en su propio ordenador. Por ejemplo, el servidor DNS de la universidad, o de la empresa. Todas las resoluciones que vaya haciendo todo el mundo que usa ese servidor DNS se van guardando en su caché mientras su TTL lo permita, de forma que las resoluciones ya efectuadas están disponibles de forma instantanea para cualquier otra persona que solicite la misma resolución unos minutos más tarde.

En la práctica la penalización de rendimiento por emplear DNSSEC es baja. La excepción serían las primeras consultas, en las que no hay nada en la caché y es necesario ir a los servidores DNS originales. Es decir, si voy a http://www.google.com/ la resolución será instantanea, con DNSSEC o sin él, porque seguro que alguien ha hecho esa misma petición unos minutos antes. Pero si me voy a http://calendario.es.python.org/, tardaré unos milisegundos más, porque la cadena es más larga y no estará, probablemente, en la caché del servidor DNS que estamos usando.

Agradecimientos

  • Elena Marcela González Gómez.
  • Fernando García Fernández.