dimanche 10 janvier 2016

Dnssec chez vous

Cela faisait un certain temps que j'avais installé un résolveur DNS sur ma machine, tout d'abord parce que le DNS de mon fournisseur d'accès à Internet avait la fâcheuse tendance à planter, et ensuite parce que ça le fait d'aller interroger directement les serveurs racine.

Il y a quelques jours, ayant lu un article sur Dnssec, je me suis donc demandé si mon installation utilisait ce système qui permet de sécuriser la résolution de nom en s'assurant que personne de bidouille l'info, typiquement pour nous router vers un site de malware plutôt que le site recherché. Une rapide recherche m'amena vers un site de test qui me démontra que non. Retroussons nous donc les manches!

Déjà, il faut vérifier que votre résolveur fonctionne avec dnssec. Un petit "dig +dnssec" pour résoudre un nom qui supporte ce standard nous informe que c'est bon:

$ dig +dnssec http://www.dnssec-deployment.org/

; <<>> DiG 9.9.5-12.1-Debian <<>> +dnssec http://www.dnssec-deployment.org/
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 62323
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 6, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;http://www.dnssec-deployment.org/. IN  A

;; AUTHORITY SECTION:
.                       10797   IN      SOA     a.root-servers.net. nstld.verisign-grs.com. 2016011000 1800 900 604800 86400
.                       10797   IN      RRSIG   SOA 8 0 86400 20160120050000 20160110040000 54549 . MTlQxI92KqWfL5GsAk6eBL3T9KHsQIt3lWkC9jmiyYBl7+qCcOJUZOvG 4oEN1JizSsEhpp76oM0Fg9svRHryV5oZZr7Od2CHbI9jfuiYYPhvO16E o6EkPwoXZcnm6Y6JgLXKd/UOQK+J+WhlyqFP8swSgynv/FwvaRIFgkf/ cNw=
.                       10797   IN      RRSIG   NSEC 8 0 86400 20160120050000 20160110040000 54549 . uhX0FXBilUV7ZCP3sC/tPYVA5Srlu8MknbmGKZLLUf5FzRDH0tCk+HZb wy/2MGTnISsFnRftRgw4mR5tmBW6jgeYsR4PS46360GAqT1h5mvBAmHv gEE+5/g1kVsSi/MDJ075VduVHD+yMwCS5KZ/ynywsq7uj93gescPj+0V TbE=
.                       10797   IN      NSEC    aaa. NS SOA RRSIG NSEC DNSKEY
org.                    10797   IN      RRSIG   NSEC 8 1 86400 20160120050000 20160110040000 54549 . hPeKkCWTQbKtMBSDf/sGOnX1CHBXez4kuG2ulIc94USFgWR6Oz+R7OIs qCzjursXz+79hYd3HFrYFYX0KlWj08zpZHtTB4zz9TRoH1ep3ARoPWkR iyPDEkLgFyGlYnqQD3VuiIHQ478BUlgQ8vmKE/5REMsTXKIJxIG+kO95 YSs=
org.                    10797   IN      NSEC    organic. NS DS RRSIG NSEC

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Jan 10 15:40:46 GMT 2016
;; MSG SIZE  rcvd: 669

La présence de lignes RRSIG indique que la requête est revenue avec la signature demandée.

Maintenant, il suffit de configurer son résolveur pour que la résolution se fasse correctement. Avec bind9 sur Debian, c'est:

  • Ouvrir le fichier /etc/bind/named.conf.options
  • S'assurer que les 2 options dnssec-enable et dnssec-validation sont présentes
  • Mettre dnssec-enable à "yes" et dnssec-validation à "auto"

Mon fichier ressemble à cela:

options {
        directory "/var/cache/bind";
        dnssec-enable yes;
        dnssec-validation auto;
[...]

Notez que dnssec-validation doit être à "auto" et non à "yes", ce qui va lui permettre d'utiliser le fichier de signature présent avec la distribution. Avec l'option "yes", il faut en fournir un à la mimine.

Maintenant, redémarrez bind9. Un "dig www.dnssec-failed.org" devrait vous renvoyer un beau "status: SERVFAIL". Essayez également de visualiser le site depuis un navigateur, il devrait vous dire que le serveur n'a pu être trouvé. Yeah!

Petite astuce: assurez vous que le résolveur de noms de votre fournisseur est complètement ignoré, et pas simplement mis après votre résolveur local. Il m'a fallu enlever "domain-name-server" de mon dhclient.conf que la résolution DHCP ne charge pas le serveur DNS de mon fournisseur. Dans le doute, regardez votre resolv.conf.