Je suis Charlie

Autres trucs

Accueil

Seulement les RFC

Seulement les fiches de lecture

Mon livre « Cyberstructure »

Ève

Unbound, un résolveur DNSSEC libre

Première rédaction de cet article le 2 avril 2007
Dernière mise à jour le 18 février 2008


Tout le monde se met à DNSSEC ce mois-ci, essentiellement grâce aux intentions clairement exprimées par le gouvernement US de maintenir son contrôle sur la racine du DNS y compris via les signatures DNSSEC. Le monde bruit donc de nouvelles et de projets sur DNSSEC, souvent plus virtuels que réels et souvent motivés par le désir de faire un beau communiqué de presse plutôt que par celui de déployer un service largement utilisé. Mais peut-on tirer profit des rares domaines signés, dès aujourd'hui ?

Pour celui qui voudrait limiter le risque d'empoisonnement des données DNS grâce à DNSSEC, il existe deux résolveurs DNS en logiciel libre, BIND et Unbound. Ce dernier est écrit en Java et, comme la plupart des programmes Java, ne pouvait pas être utilisé dans un environnement 100 % logiciel libre, peu de programmes Java réels acceptant de tourner avec les environnements libres comme gcj. Désormais, l'implémentation de référence étant libre, on peut utiliser des programmes Java.

Unbound est encore assez beta et l'installation se fait à la main, en copiant les fichiers (dans mon cas, en /local/share/unbound et j'ai modifié le script de lancement unbound-resolver.sh pour indiquer le CLASSPATH Java).

Unbound se configure ensuite via le fichier iterative-config.properties. Les clés des domaines qu'on veut vérifier sont dans trust_anchors. En effet, la racine du DNS n'est pas signée à l'heure actuelle. En attendant l'aboutissement de projets comme DLV (décrit dans le RFC 4431), il faut donc configurer à la main les zones sécurisées et indiquer leurs clés. Pour récupérer celles-ci, il n'y a pas de moyen propre et standard, il faut aller à la pêche un peu partout. Dans mon fichier, j'ai indiqué en commentaires les URL des sites où récupérer les clés ; question sécurité, cela vaut ce que cela vaut mais il est difficile de faire mieux aujourd'hui. En tout cas, cela vaut mieux que de simplement les récupérer dans le DNS (dig DNSKEY domain.example.), ce qui n'offrirait aucune sécurité.

On peut ensuite tester Unbound avec dig. Si un nom a une signature invalide, Unbound renvoie Server Failure (SERVFAIL). Cette politique n'est pas configurable (le résolveur DNSSEC de Microsoft est apparemment tout aussi peu configurable mais, lui, il renvoie No such domain (NXDOMAIN).

Dans le fichier iterative-config.properties, on peut aussi indiquer, pour chaque domaine, des serveurs de noms à interroger directement si les « vrais » serveurs ne font pas de DNSSEC. Ainsi, .net avait des serveurs DNSSEC (mais qui ne semblent plus accessibles). L'AFNIC en a aussi pour .fr, accessibles de l'extérieur. Si la zone .example est signée sur un tel jeu de serveurs experimentaux, on peut dire à Unbound de l'utiliser ainsi :

dns.stub = example
dns.stub.example = 192.0.2.34 192.0.2.35

On peut trouver plein de noms valides et invalides (à des fins de test) en http://www.dnssec-tools.org/testzone/.

Après quelques jours, j'ai arrêté. Unbound plante très souvent, avec de magnifiques piles d'exceptions Java comme :

java.lang.IllegalArgumentException: Entry was invalid
        at se.rfc.unbound.cache.CacheCore.removeFromLRU(CacheCore.java:139)
        at se.rfc.unbound.cache.CacheCore.get(CacheCore.java:212)
        at se.rfc.unbound.cache.StandardHostCache.lookup(StandardHostCache.java:94)
        at se.rfc.unbound.DelegationPoint.addTarget(DelegationPoint.java:216)
        at se.rfc.unbound.DelegationPoint.addTargets(DelegationPoint.java:245)
        at se.rfc.unbound.DelegationPoint.addTargets(DelegationPoint.java:259)
        at se.rfc.unbound.DelegationPoint.messageToDelegationPoint(DelegationPoint.java:411)
        at se.rfc.unbound.iter.IterativeResolver.processInitRequest(IterativeResolver.java:923)
        at se.rfc.unbound.iter.IterativeResolver.handleEvent(IterativeResolver.java:743)
        at se.rfc.unbound.iter.IterativeResolver.processRequest(IterativeResolver.java:679)
        at se.rfc.unbound.validator.ValidatingResolver.processRequest(ValidatingResolver.java:873)
        at se.rfc.unbound.server.Server.processRequest(Server.java:226)
        at se.rfc.unbound.server.Server.handleReadRequest(Server.java:763)
        at se.rfc.unbound.server.Server.handleRead(Server.java:698)
        at se.rfc.unbound.server.Server.serve(Server.java:383)
        at se.rfc.unbound.server.Server.main(Server.java:1098)

Le problème est parfois lié à un nom particulièr (résoudre www.ripe.net entraine une java.lang.NullPointerException alors que résoudre ns-pri.ripe.net ne crée aucun problème) et parfois pas. Dans tous les cas, Unbound-Java n'est pas prêt pour un fonctionnement en production.

Son développement semble désormais stoppé. Un autre logiciel du même nom a été publié, écrit cette fois en C (ce qui règle les problèmes de licence), Unbound est donc désormais utilisable en production. Il a une API donc on peut développer ses propres applications DNSSECisées. Ici, voici son utilisation depuis la ligne de commande :

% unbound-host -F ~/etc/trusted-keys -v www.ripe.net
www.ripe.net is an alias for kite-www.ripe.net. (secure)
kite-www.ripe.net has address 193.0.0.214 (secure)
kite-www.ripe.net has IPv6 address 2001:610:240:0:a843::8 (secure)
kite-www.ripe.net has no mail handler record (secure)

% unbound-host -F ~/etc/trusted-keys -v www.afnic.fr
www.afnic.fr is an alias for rigolo.nic.fr. (insecure)
rigolo.nic.fr has address 192.134.4.20 (insecure)
rigolo.nic.fr has IPv6 address 2001:660:3003:2::4:20 (insecure)
rigolo.nic.fr has no mail handler record (insecure)

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)