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.