L'enregistrement
Mais le gros problème de NSEC est qu'il permet
l'
Le registre de
Le nouvel enregistrement NSEC3 résout le problème en ne donnant pas
le nom du domaine suivant mais son
Le principe de NSEC 3 est le suivant. Les résumés de tous les noms
sont classés par ordre alphabétique (c'est arbitraire, l'important est
que cela soit reproductible). La partie gauche (
L'enregistrement contient aussi quelques autres paramètres comme
l'algorithme de calcul du résumé (section 3.1.1, les sections
suivantes décrivant les autres paramètres). Voici un enregistrement NSEC3 au format suggéré section 3.3 :
2t7b4g4vsa5smi47k61mv5bv1a22bojr.example. NSEC3 1 1 12 aabbccdd (
2vptu5timamqttgl4luu9kg21e0aor3s A RRSIG )
Le résolveur qui reçoit un
NXDOMAIN peut calculer le résumé du nom qu'il a demandé et, si
l'enregistrement NSEC3 est correct, ce résumé doit tomber entre les
deux résumés du NSEC3 (celui de gauche et celui de droite). Ainsi, si
la question est le nom D1, et que le résolveur reçoit :
... NXDOMAIN
H0 NSEC3 H2 ...
H0 RRSIG ...
il doit calculer H1, le résumé de D1 et vérifier que H0 < H1 <
H2 (et naturellement vérifier le RRSIG, la signature). Ne connaissant
que H0 et H2, il ne peut pas retrouver D0 et D2. Notez bien que
l'ordre ne concerne que H0, H1 et H2, D0, D1 et D2 sont situés dans un
ordre complètement différent. Comme avec NSEC, tout repose sur
l'existence d'un
La méthode de calcul du résumé est détaillée en section 5. Par
exemple, un
Ce nombre d'itérations a une influence sur les performances du
résolveur et du serveur faisant autorité. Les chiffres exacts peuvent
être trouvés dans l'article de Yuri Schaeffer,
«
Due à
Kim-Minh Kaplan, voici une mise en œuvre en
use MIME::Base32;
use Digest::SHA1 qw(sha1);
my ($salt, $iteration, $name) = @ARGV;
$salt = pack "H*", $salt;
$name =~ y/A-Z/a-z/;
$name =~ s/\.*$//;
my @labels = split('\.', $name . ".", -1);
@labels = map { pack("C", length($_)) . $_ } @labels;
$name = join '', @labels;
foreach (0..$iteration) {
$name = sha1("$name$salt");
}
print MIME::Base32::encode($name), "\n";
On doit appeler ce programme avec trois paramètres, le
Notez que les dernières versions de
[Récupérer les paramètres avec lesquels les noms sont résumés.]
% dig +short NSEC3PARAM pm.
1 0 1 BADFE11A
% nsec3hash BADFE11A 1 1 pm
P3JUUU69O1AP1AI8DLNVO7L7A0SKT56S (salt=BADFE11A, hash=1, iterations=1)
[Et on retrouve bien ce résumé dans les enregistrements NSEC3 :
% dig +dnssec ANY nimportequoi.pm.
...
P3JUUU69O1AP1AI8DLNVO7L7A0SKT56S.pm. 5400 IN NSEC3 1 1 1 BADFE11A \
L6U66FHPKD109EODA9R2SV8RGFSUAUQ3 NS SOA RRSIG DNSKEY NSEC3PARAM
NSEC3 contient plein d'autres fonctions intéressantes, par exemple
la section 6 décrit un mécanisme de retrait
(
Les détails sont très complexes (et couverts dans les sections 7 et
8 du RFC) ce qui explique que certains auteurs de logiciels DNS comme
Mais NSEC3 est aujourd'hui mis en œuvre dans plusieurs logiciels
comme
Avec BIND 9.6 (ou supérieur), voici comment
on génère une clé
% dnssec-keygen -a NSEC3RSASHA1 -b 1024 -n ZONE
et comment on signe :
dnssec-signzone -g -t -H 3 -3 babecafe $MYZONEFILE Kmykey.+007+30869
(
Ici, si on a une zone
@ IN SOA ns3.bortzmeyer.org. hostmaster.bortzmeyer.org. (
...
IN NS ns3.bortzmeyer.org.
...
IN DNSKEY 256 3 7 AwEAAa...=
central IN A 192.0.2.187
preston IN AAAA 2001:db8:8bd9:8bb0:a00:20ff:fe99:faf4
et qu'on la signe avec :
% dnssec-signzone -H 3 -3 babecafe -o example db.example Kmykey.+007+30869
(trois itérations supplémentaires, un sel qui vaut « babecafe »), on obtient un fichier
FIDQ6ATJMOUCGLV3PNHS9694C1LFDSDT.example. 43200 IN NSEC3 1 0 3 BABECAFE JKNM5TRUGDISFPUU0CCLEMG2GTGOD2IP AAAA RRSIG
JKNM5TRUGDISFPUU0CCLEMG2GTGOD2IP.example. 43200 IN NSEC3 1 0 3 BABECAFE O7FU7992IPFEUUUVC1A8NAF4255JF7JI NS SOA MX TXT RRSIG DNSKEY NSEC3PARAM
O7FU7992IPFEUUUVC1A8NAF4255JF7JI.example. 43200 IN NSEC3 1 0 3 BABECAFE FIDQ6ATJMOUCGLV3PNHS9694C1LFDSDT A RRSIG
et le programme Perl ci-dessus permet de retrouver quel nom a été résumé pour donner la partie gauche de chacun de ces NSEC3 :
% perl hash-nsec3.pl babecafe 3 preston.example
FIDQ6ATJMOUCGLV3PNHS9694C1LFDSDT
et on trouve ainsi que le premier NSEC3 de la liste était celui de
Merci à Kim Minh Kaplan pour son aide à m'aider à comprendre ce difficile protocole et pour sa relecture.