Arrêtez (de conseiller) d'utiliser Google Public DNS


(ou Cisco OpenDNS ou que sais-je)

Une nouvelle panne semble avoir touchée les serveurs DNS d'Orange ce mercredi (quelques semaines après l'erreur humaine qui a touché quelques - gros - sites). Encore une fois, les réseaux sociaux (mais pas que) ont répandus l'idée d'arrêter d'utiliser les résolveurs de son FAI pour passer sur ceux de Google, de Cisco (OpenDNS) ou autres OpenNIC fumeux (quelques examples).

Certes Google Public DNS, pour rester sur le plus connu, est fiable (il ne ment pas et ne tombe pas souvent en panne) mais, Google étant Google, c'est leur donner accès à l'intégralité des requêtes DNS partant de vos machines, soit à peu prêt toute votre activité sur le net. Ces derniers nous disent qu'ils ne font pas grand chose des données collectées, notamment qu'ils ne croisent pas les données qu'ils possèdent via votre compte Google. Dans ce domaine, on ne peut que les croire sur parole. De plus, des données sensibles sont tout de même collectées (entre autre : AS - votre FAI grosso modo - et zone géographique). Notons que sur ce point, ça a l'air d'être la fête du slip chez Cisco (si c'est bien le bon document que j'ai trouvé). Bref, regardons ce que donnent de telles métadonnées avec Unbound (en activant l'option log-queries) :

		Nov 16 19:01:50 unbound[11769:2] info: 192.0.2.69 mxr.mozilla.org. A IN
		Nov 16 19:01:51 unbound[11769:3] info: 192.0.2.69 mxr.mozilla.org. A IN
		Nov 16 19:01:51 unbound[11769:2] info: 192.0.2.69 mxr.mozilla.org. AAAA IN
		Nov 16 19:01:51 unbound[11769:2] info: 192.0.2.69 ocsp.digicert.com. A IN
		Nov 16 19:01:52 unbound[11769:3] info: 192.0.2.69 www.eff.org. A IN
		Nov 16 19:01:52 unbound[11769:3] info: 192.0.2.69 cs9.wac.phicdn.net. A IN
		Nov 16 19:01:52 unbound[11769:3] info: 192.0.2.69 cs9.wac.phicdn.net. AAAA IN
		Nov 16 19:01:52 unbound[11769:3] info: 192.0.2.69 eff.map.fastly.net. A IN
		Nov 16 19:01:53 unbound[11769:3] info: 192.0.2.69 eff.map.fastly.net. AAAA IN
		Nov 16 19:01:54 unbound[11769:3] info: 192.0.2.69 publicsuffix.org. A IN
		Nov 16 19:01:54 unbound[11769:3] info: 192.0.2.69 shavar.services.mozilla.com. A IN
		Nov 16 19:01:54 unbound[11769:3] info: 192.0.2.69 snippets.cdn.mozilla.net. A IN
		Nov 16 19:01:54 unbound[11769:3] info: 192.0.2.69 publicsuffix.org. A IN
		Nov 16 19:01:54 unbound[11769:3] info: 192.0.2.69 publicsuffix.org. AAAA IN
		Nov 16 19:01:54 unbound[11769:3] info: 192.0.2.69 drcwo519tnci7.cloudfront.net. A IN
		Nov 16 19:01:54 unbound[11769:0] info: 192.0.2.69 drcwo519tnci7.cloudfront.net. AAAA IN
		Nov 16 19:01:55 unbound[11769:0] info: 192.0.2.69 shavar.prod.mozaws.net. A IN
		Nov 16 19:01:55 unbound[11769:2] info: 192.0.2.69 shavar.prod.mozaws.net. AAAA IN
		Nov 16 19:01:56 unbound[11769:1] info: 192.0.2.69 self-repair.mozilla.org. A IN
		Nov 16 19:01:56 unbound[11769:3] info: 192.0.2.69 shield-normandy-elb-prod-2099053585.us-west-2.elb.amazonaws.com. A IN
		Nov 16 19:01:56 unbound[11769:3] info: 192.0.2.69 shield-normandy-elb-prod-2099053585.us-west-2.elb.amazonaws.com. AAAA IN
		Nov 16 19:01:56 unbound[11769:2] info: 192.0.2.69 www.shaftinc.fr. A IN
		Nov 16 19:02:05 unbound[11769:0] info: 192.0.2.69 www.shaftinc.fr. AAAA IN
		Nov 16 19:02:27 unbound[11769:0] info: 192.0.2.69 router.bittorrent.com. A IN
		Nov 16 19:02:27 unbound[11769:0] info: 192.0.2.69 download.deluge-torrent.org. A IN
		Nov 16 19:02:27 unbound[11769:0] info: 192.0.2.69 router.utorrent.com. A IN
		Nov 16 19:02:27 unbound[11769:0] info: 192.0.2.69 router.bitcomet.com. A IN
		Nov 16 19:02:28 unbound[11769:0] info: 192.0.2.69 open.demonii.com. A IN
		Nov 16 19:02:46 unbound[11769:0] info: 192.0.2.69 tracker.openbittorrent.com. A IN
		Nov 16 19:02:49 unbound[11769:0] info: 192.0.2.69 tracker.publicbt.com. A IN
		Nov 16 19:02:51 unbound[11769:0] info: 192.0.2.69 tracker.publicbt.com. A IN
		Nov 16 19:02:51 unbound[11769:0] info: 192.0.2.69 announce.torrentsmd.com. A IN
		Nov 16 19:02:52 unbound[11769:0] info: 192.0.2.69 tracker.token.ro. A IN
		Nov 16 19:02:52 unbound[11769:0] info: 192.0.2.69 9.rarbg.to. A IN
		Nov 16 19:03:02 unbound[11769:1] info: 192.0.2.69 www.acrimed.org. A IN
		Nov 16 19:03:02 unbound[11769:3] info: 192.0.2.69 www.acrimed.org. A IN
		Nov 16 19:03:02 unbound[11769:3] info: 192.0.2.69 www.acrimed.org. AAAA IN
		Nov 16 19:03:54 unbound[11769:0] info: 192.0.2.69 valeursactuelles.fr. A IN
		Nov 16 19:03:54 unbound[11769:1] info: 192.0.2.69 valeursactuelles.fr. A IN
		Nov 16 19:03:54 unbound[11769:1] info: 192.0.2.69 valeursactuelles.fr. AAAA IN
		Nov 16 19:03:54 unbound[11769:1] info: 192.0.2.69 www.valeursactuelles.com. A IN
		Nov 16 19:03:54 unbound[11769:3] info: 192.0.2.69 code.ionicframework.com. A IN
		Nov 16 19:03:54 unbound[11769:2] info: 192.0.2.69 ionic-code.drifty.netdna-cdn.com. A IN
		Nov 16 19:03:55 unbound[11769:2] info: 192.0.2.69 ionic-code.drifty.netdna-cdn.com. AAAA IN
		Nov 16 19:04:33 unbound[11769:2] info: 192.0.2.69 www.google.fr. A IN
		Nov 16 19:04:33 unbound[11769:2] info: 192.0.2.69 www.google.fr. A IN
		Nov 16 19:04:33 unbound[11769:2] info: 192.0.2.69 www.google.fr. AAAA IN
		Nov 16 19:04:33 unbound[11769:2] info: 192.0.2.69 clients1.google.com. A IN
		Nov 16 19:04:33 unbound[11769:2] info: 192.0.2.69 clients.l.google.com. A IN
		Nov 16 19:04:33 unbound[11769:2] info: 192.0.2.69 clients.l.google.com. AAAA IN
		Nov 16 19:04:34 unbound[11769:2] info: 192.0.2.69 consent.google.com. A IN
		Nov 16 19:04:34 unbound[11769:2] info: 192.0.2.69 consent.google.com. A IN
		Nov 16 19:04:34 unbound[11769:2] info: 192.0.2.69 consent.google.com. AAAA IN
		Nov 16 19:04:42 unbound[11769:2] info: 192.0.2.69 www.parti-socialiste.fr. A IN
		Nov 16 19:04:42 unbound[11769:2] info: 192.0.2.69 www.parti-socialiste.fr. AAAA IN
		Nov 16 19:04:45 unbound[11769:0] info: 192.0.2.69 youporn.com. A IN
		Nov 16 19:04:45 unbound[11769:0] info: 192.0.2.69 youporn.com. AAAA IN

Que voit on : en vrac, des requêtes qui ressemblent fort à un Firefox venant d'être lancé, avec en prime - en profilant un peu - des requêtes permettant de débusquer quelques extensions (Privacy Badger ici), des requêtes pour avoir l'adresse de trackers BitTorrent, le fait que je visite les sites d'Acrimed et de Valeurs Actuelles en même temps, mais aussi le site du Parti Socialiste et un site de vidéos de chatons (ne me jugez pas, merci).

Bien sûr, j'ai fabriqué l'exemple pour l'occasion afin de forcer le trait. Ceci dit, il faut prendre conscience du fait que le DNS est - indirectement - très efficace pour vous traquer et vous profiler. Ce n'est pas aussi élaboré que les mouchards des GAFA, mais c'est tout de même extrêment parlant, surtout si on recoupe avec les informations glanées par les dits mouchards. Si l'IETF a bien lancé des travaux pour tenter d'améliorer la protection de la vie privée au niveau du DNS, rien ne vous protégera si vous vous jetez dans la gueule du loup.

Par ailleurs, autre problème posé par le fait d'utiliser un résolveur que l'on ne contrôle pas, le détournement de l'IP de celui-ci par un tiers, typiquement dans le cadre d'une censure gouvernementale comme cela c'est déjà produit pour Google Public DNS en Turquie. Certes la censure en France n'en est pas encore à ce stade, mais au train où vont les choses la prudence est de mise (et il est utile de le savoir si l'on voyage vers ces contrées). Il est possible de s'en prémunir, mais cela implique de passer par la cryptographie afin d'authentifier que l'on parle bien à la bonne machine et de chiffrer les échanges. OpenDNS le propose via DNSCrypt. Pour les autres résolveurs, l'utilisation de TLS entre un résolveur et un client a été normalisée il y a peu de temps dans le RFC 7858 et la technique est donc peu employée. Sans oublier le fait qu'il faut s'en remettre à la bonne volonté des opérateurs de ces serveurs pour utiliser de telle techniques.

Que faire ?

Eh oui que faire ? car en attendant les résolveurs de votre FAI sont en panne. Je vois 3 options :

Installer Unbound sur sa machine

Sous Windows

Si sous utilisez l'OS de Microsoft, bonne nouvelle Unbound y est disponible. Commencez par téléchargez le fichier contenant adresses de la racine dans le répertoire de votre choix, puis l'installeur et éxécutez ce dernier avec les droits administrateurs. Lisez le texte de la licence (elle est libre) et assurez vous que Root anchor - DNSSEC est bien coché (sans ça pas de validation DNSSEC). Laissez le programme s'installer... Et voilà ! Encore un peu d'effort et c'est terminé

Unbound est géré comme un service. A ce titre, il se lance automatiquement au démarrage de Windows et se gère depuis l'interface des services. Ceci dit, il reste à dire à Windows d'utiliser ce dernier. Il suffit pour cela de changer l'adresse de résolveurs (c'est dans tous les tutoriaux que je fustige dans ce billet, allez chercher là-bas) et de mettre 127.0.0.1 pour IPv4 et ::1 pour IPv6 (a noter qu'IPv6 est rarement mentionné dans les dits tutoriaux). Coupez le Wi-Fi ou votre connexion Ethernet puis réactivez (ou redémarrer votre PC, l'important est de réinitialiser la connexion réseau). Normalement, Unbound est capable d'utiliser les adresses de la racine qu'il posséde codées en dur. Cependant sur ma version de Windows (un 8.1) cela ne semble pas fonctionner. Pour tester cela, ouvrez votre navigateur et essayez de vous rendre sur n'importe quel site. Si vous avez une erreur disant que l'adresse est introuvable, c'est que votre résolveur ne connait pas les adresses de la racine.

Rendez vous dans le répertoire d'Unbound (par défaut C:\Program Files (x86)\Unbound) et ouvrez le fichier service.conf et ajoutez la ligne suivante sous la directive server :

root-hints: "C:\Le Chemin\Vers\le fichier\named.cache"

Que vous deviez rajouter cette ligne ou pas, le passage vers ce fichier était quoiqu'il arrive prévu pour activer une option qui ne l'est malheuresement pas encore par défaut, il s'agit de le réduction de la question posée. Rendez-vous donc dans service.conf et toujours sous server ajoutez :

qname-minimisation: yes

Redémarrez le service, et on vérifie que c'est bon.

Petit bémol de cette version Windows, elle ne dispose pas de mise à jour automatique, cela implique donc de vérifier de temps à autre (typiquement tout les 2-3 mois) si une nouvelle version du logiciel n'est pas disponible et de téléchargez cette dernière au besoin. Il faut ensuite désinstaller l'ancienne version et recommancer le processus d'installation. Si vous devez spécifier vous même le paramètre root-hints, pensez également à vérifier qu'il n'y a pas eut de changements à ce niveaux (2 vérifications par an suffisent).

Sous Linux

Je traiterai du cas Debian et dérivé, mais c'est normalement la même démarche pour les amateurs d'autres saveurs. On commence donc par ouvrir un terminal et mettre à jours ses dépôts logiciel, puis installer Unbound :

		$ sudo apt-get install unbound

On teste avec dig NS @127.0.0.1 . que l'on obtient bien la liste des serveurs de la racine. Reste à dire à Debian d'utiliser ce serveur et non ceux fournis par le routeur, et 1 ou 2 ajustements. Pour le premier point, éditer le fichier /etc/resolv.conf n'est pas très efficace, le fichier étant généré par le client DHCP. Pas de soucis, on dit à ce client d'utiliser nos paramètres. Pour cela, on édite bon fichier :

		$ sudo nano /etc/dhcp/dhclient.conf

et on ajoute la ligne suivante au dessus du bloc request :

supersede domain-name-servers localhost;

On redémarre le gestionnaire de réseau avec :

		$ sudo service network-manager restart

Et c'est tout. On peut éventuellement vérifier que tout fonctionne :

		$ dig afnic.fr

		; <<>> DiG 9.9.5-9+deb8u8-Raspbian <<>> afnic.fr

		...

		;; SERVER: 127.0.0.1#53(127.0.0.1)

C'est bien le serveur installé localement qui est allé cherché la réponse. Ne reste plus qu'à ajouter une petite option dans un fichier de configuration : l'activation de la QNAME minimisation (attention, n'est disponible qu'à partir d'Unbound 1.5.7, donc non présent encore sous Debian Stable qui ne propose que la version 1.4.22 pour l'instant. Strecth, qui intégrera une version suffisament récente arrive au printemps 2017 normalement). On crée donc un fichier de configuration dans un répertoire dans lequel Unbound charge par défaut automatiquement les fichiers présent, ce qui est utile en cas de mise à jour :

		sudo nano /etc/unbound/unbound.conf.d/nom-de-fichier.conf

Et on ajoute :

server:
			qname-minimisation: yes

À noter que la probabilité que les 13 serveurs de la racine ne changent d'adresses IP est infinitésimale avant qu'une mise à jour du logiciel ne viennent faire une actualisation des adresses, l'option root-hints est donc parfaitement optionnelle. Si vous souhaitez l'utiliser, voici la marche à suivre.

On récupère le bon fichier :

		$ sudo wget https://www.internic.net/domain/named.cache -O /var/lib/unbound/root.hints

Et on ajoute le paramètre dans notre fichier de configuration:

root-hints: /var/lib/unbound/root.hints

On rédemarre le serveur et on est bon. En bonus pour les linuxiens, un script permettant de mettre à jour les adresses de la racine, qu'il est possible d'automatiser via la crontab et un fichier de configuration plus conséquent (utilisable sous Windows à condition de bien changer les chemins)

Sous macOS

Pour macOS (et Mac OSX), NLnet Labs ne propose pas de version à installer. 2 solutions : la première consiste à télécharger le code source est le compiler pour sa machine. Pas la solution la plus simple. La deuxième consiste à passer par le gestionnaire de paquets Homebrew. Une fois celui-ci installé, on récupère Unbound via la commande :

		$ brew install unbound

Le reste de la procédure se déroule normalement comme sous Linux.

Conclusion

Et voilà, après ce tutorial qui n'est pas plus compliqué que l'installation de certains mods de jeux vidéo, vous avez votre propre résolveur DNS, qui par défaut :

Et surtout fini : les pannes des résolveurs de votre FAI et les DNS menteurs (censure administrative, hotspot Wi-Fi miteux...). Reste à voir comment utiliser Unbound pour non plus s'en servir sur une seule machine mais sur tout le réseau local. Cette histoire sera également racontée.

PS : Merci à Stéphane Bortzmeyer de m'avoir signalé la problématique de détournement d'IP et à Raf pour la partie sous Mac.