Date de publication du RFC : Avril 2017
Auteur(s) du RFC : D. Wessels (Verisign), W. Kumari
(Google), P. Hoffman (ICANN)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF dnsop
Première rédaction de cet article le 19 avril 2017
L'utilisation de DNSSEC implique que le résolveur DNS ait une ou plusieurs clés de départ de la validation (trust anchors). Typiquement, le résolveur aura une clé pour la racine, les autres domaines étant validés en suivant l'arborescence du DNS (cela se configure, même si la plupart des résolveurs viennent avec une pré-configuration pour la clé ICANN de la racine). Seulement, parfois, les clés changent et le gérant d'un domaine aimerait bien savoir, avant de supprimer l'ancienne clé, si les résolveurs ont bien tous reçu la nouvelle. D'où cette nouvelle option EDNS où le résolveur signale au serveur faisant autorité la liste des clés qu'il utilise comme point de départ de la validation. (Le RFC décrit également une autre méthode, non fondée sur EDNS.)
En toute rigueur, il faut dire que le résolveur ne transmet pas les
clés mais les identificateurs courts (key tags
ou key IDs), qui sont un
condensat de 16 bits des clés (section 3.1.6 du RFC 4034, et notez dans l'annexe B du même RFC
que ce ne sont pas des condensats cryptographiques). On trouve cet
identificateur de clé si on utilise l'option
+multi
de dig :
% dig +multi DNSKEY tf ... ;; ANSWER SECTION: tf. 172800 IN DNSKEY 257 3 8 ( ... ) ; KSK; alg = RSASHA256; key id = 12520 tf. 172574 IN DNSKEY 256 3 8 ( ... ) ; ZSK; alg = RSASHA256; key id = 51793 ... tf. 172574 IN RRSIG DNSKEY 8 1 172800 ( 20170524190422 20170325180422 12520 tf. ...
Il est utilisé pour la communication entre humains mais on le trouve aussi dans les enregistrements DS chez le parent :
% dig DS tf ... ;; ANSWER SECTION: tf. 86400 IN DS 12520 8 2 ( 2EC74274DD9AA7FFEA33E695EFF98F17F7C78ABD2D76 EDBBDE4EDD4630D68FA2 ) ...
Ainsi que dans les signatures :
% dig +dnssec SOA tf ... ;; ANSWER SECTION: tf. 172800 IN SOA nsmaster.nic.fr. hostmaster.nic.fr. ( 2222242731 ; serial ... tf. 172800 IN RRSIG SOA 8 1 172800 ( 20170531124004 20170401114004 51793 tf. ...
On voit ici que la clé de
.tf
dans la racine est la 12520, qui signe la clé
51793, qui elle-même signe les enregistrements.
Si vous n'êtes pas parfaitement au point sur la terminologie DNSSEC, lisez la section 3 du RFC. Et, à titre d'exemple, voici la configuration d'un résolveur Unbound pour utiliser comme clés de départ de la validation celles de Yeti :
% cat /etc/unbound/unbound.conf ... server: ... auto-trust-anchor-file: "/var/lib/unbound/yeti.key" ... % cat /var/lib/unbound/yeti.key . 86400 IN DNSKEY 257 3 8 AwE...8uk= ;{id = 59302 (ksk), size = 2048b} ;;state=1 [ ADDPEND ] ;;count=67 ;;lastchange=1488474089 ;;Thu Mar 2 18:01:29 2017 . 86400 IN DNSKEY 257 3 8 AwE...y0U= ;{id = 19444 (ksk), size = 2048b} ;;state=2 [ VALID ] ;;count=0 ;;lastchange=1472139347 ;;Thu Aug 25 17:35:47 2016
On voit deux clés, d'identificateurs 59302 et 19444. Tout contenu signé avec une de ces deux clés sera accepté. (Le fait qu'il y ait deux clés alors qu'une suffirait est dû au fait qu'un changement est en cours, suivant le RFC 5011.)
Voyons maintenant la première façon de signaler ses clés dont
dispose un résolveur, la méthode EDNS
(section 4 de notre RFC, et voir le RFC 6891, pour les détails sur ce qu'est EDNS). On utilise
une nouvelle option EDNS, edns-key-tag
(code 14 dans le
registre IANA). Comme toutes les options EDNS, elle
comprend le code (14), la longueur, puis une suite
d'identificateurs de clés. Par exemple, le résolveur Unbound
montré plus haut enverrait une option {14, 4, 59302, 19444}
(longueur quatre
car il y a deux identificateurs, de deux octets chacun). Il est
recommandé d'utiliser cette option pour toutes les requêtes de
type DNSKEY (et jamais pour les autres).
Notez que le serveur qui reçoit une requête avec cette option n'a rien à faire : elle est juste là pour l'informer, la réponse n'est pas modifiée. S'il le souhaite, le serveur peut enregistrer les valeurs, permettant à son administrateur de voir, par exemple, si une nouvelle clé est largement distribuée (avant de supprimer l'ancienne).
La deuxième méthode de signalisation, celle utilisant le
QNAME (Query Name, le nom indiqué dans la
requête DNS) figure en section 5. La requête de signalisation
utilise le type NULL (valeur
numérique 10), et un nom de
domaine qui commence par « _ta- », suivi de la liste
des identificateurs en hexadécimal (dans cet article, ils
étaient toujours montré en décimal) séparés par des
traits. Le nom de la zone pour laquelle
s'applique ces clés est ajouté à la fin (la plupart du temps, ce
sera la racine, donc il n'y aura rien à ajouter). En reprenant
l'exemple du résolveur Unbound plus haut, la requête sera
_ta-4bf4-e7a6.
. Comme ce nom n'existe pas,
la réponse sera certainement NXDOMAIN.
Le serveur utilise cette requête comme il utilise l'option EDNS : ne rien changer à la réponse qui est faite, éventuellement enregistrer les valeurs indiquées, pour pouvoir informer l'administrateur du serveur.
Voilà, comme vous voyez, c'est tout simple. Reste quelques petites questions de sécurité (section 7) et de vie privée (section 8). Pour la sécurité, comme, par défaut, les requêtes DNS passent en clair (RFC 7626), un écoutant indiscret pourra savoir quelles clés utilise un résolveur. Outre que cela peut permettre, par exemple, de trouver un résolveur ayant gardé les vieilles clés, la liste peut révéler d'autres informations, par exemple sur le logiciel utilisé (selon la façon dont il met en œuvre le RFC 5011). C'est donc un problème de vie privée également.
Notez aussi que le client peut mentir, en mettant de fausses valeurs. Par exemple, il pourrait envoyer de faux messages, avec une adresse IP source usurpée, pour faire croire que beaucoup de clients ont encore l'ancienne clé, de façon à retarder un remplacement.
(Au passage, si vous voulez des informations sur le remplacement des clés DNSSEC de la racine, voyez la page de l'ICANN, et la première expérimentation Yeti ainsi que la deuxième.)
Notez que le mécanisme utilisé a beaucoup varié au cours du développement de ce RFC (section 1.1, sur l'histoire). Au début, il n'y avait que l'option EDNS, en copiant sur le mécanisme du RFC 6975. Mais EDNS a quelques limites :
L'approche concurrente, avec le QNAME, a aussi ses inconvénients :
D'où le choix (chaudement discuté) de fournir les deux méthodes.
À l'heure actuelle, je ne connais qu'une seule mise en œuvre de ce RFC, introduite dans BIND 9.10.5 rc1 (« named now provides feedback to the owners of zones which have trust anchors configured by sending a daily query which encodes the keyids of the configured trust anchors for the zone. This is controlled by trust-anchor-telemetry »).
Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)
Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)