dnssec-trigger, un outil pour mettre DN SSEC à la disposition de M. Toutlemonde

Stephane Bortzmeyer <[email protected]>
Newsgroups gmane.network.dns.french
Message-ID <[email protected]>
http://www.bortzmeyer.org/dnssec-trigger.html

----------------------------

Une des faiblesses de la sécurité de l'Internet est que le mécanisme 
d'annuaire principal, le DNS, n'est pas très sécurisé. Il est trop 
facile de tromper un serveur DNS en lui injectant de fausses 
informations (faille dite Kaminsky 
<http://www.bortzmeyer.org/comment-fonctionne-la-faille-kaminsky.html>).
 Mais il y a pire : souvent, c'est le serveur DNS mis à la disposition 
de l'uutilisateur, par le FAI ou par le service informatique local, qui 
le trompe <http://www.bortzmeyer.org/dns-menteur.html>. Une solution 
technique existe, à ces deux problèmes : DNSSEC. Mais pour que DNSSEC 
protège M. Toutlemonde, les vérifications que permet ce protocole 
doivent être faites sur la machine de M. Toutlemonde, la seule en qui 
il peut avoir un peu confiance. C'est ce que permet le nouveau logiciel 
dnssec-trigger <http://www.nlnetlabs.nl/projects/dnssec-trigger/>.

Depuis que DNSSEC existe (sa version actuelle a été normalisée dans le 
RFC 4033), il y a un débat sur l'endroit où doit se faire la 
*validation*, c'est-à-dire la vérification, par des calculs 
cryptographiques, que l'information reçue est bien authentique. Comme 
cette validation nécessite des calculs complexes et, jusqu'à la 
signature de la racine et de nombreux TLD, vers 2010-2011, nécessitait 
une configuration complexe, il semblait logique de faire la validation 
sur les résolveurs DNS que tout FAI, tout réseau local, met à la 
disposition de M. Toutlemonde. Le problème est que ces résolveurs sont 
souvent les premiers à mentir, comme on l'a vu de nombreuses fois, 
l'une des dernières étant l'affaire Earthlink 
<https://secure.dslreports.com/forum/r26348218-General-Earthlink-DNS-ser
ver-pointing-www.google.com-to-unknow>. Bien que ce soit une violation 
claire de la neutralité de l'intermédiaire 
<http://www.bortzmeyer.org/neutralite.html>, d'autres FAI se livrent à 
ce genre de pratiques.

Il reste donc à faire la validation sur la machine de M. Toutlemonde. 
Pour un PC moderne, les calculs cryptographiques nécessaires ne 
représentent qu'une tâche bien légère (cela peut être différent pour un 
"smartphone"). Mais la validation directement sur le PC de 
l'utilisateur pose deux problèmes : elle nécessite l'installation et la 
configuration correcte d'un logiciel supplémentaire (même si cela ne 
prend que quelques minutes, l'expérience prouve que c'est beaucoup trop 
difficile pour M. Toutlemonde) *et*, si tout le monde en faisait 
autant, les serveurs DNS souffriraient sous la charge accrue. En effet, 
comme il n'y aurait plus de cache partagé (rôle que jouent aujourd'hui 
les serveurs résolveurs des FAI, qui gardent en mémoire la réponse aux 
questions déjà posées), les serveurs des différentes zones DNS 
recevraient bien plus de requêtes.

Cette question est connue depuis un certain temps (voir par exemple une 
discussion technique approfondie 
<http://www.bortzmeyer.org/ou-valider-dnsssec.html> en 2011). Mais la 
nouveauté est qu'on a désormais un logiciel qui résoud ces deux 
problèmes. dnssec-trigger 
<http://www.nlnetlabs.nl/projects/dnssec-trigger/> est un outil génial. 
Développé aux NLnetLabs <http://www.nlnetlabs.nl>, partiellement 
financé 
<http://www.afnic.fr/en/about-afnic/news/general-news/2826/show/afnic-ac
tively-supports-nlnet-labs.html> par l'AFNIC, il va permettre de donner 
la puissance de DNSSEC à M. Michu, en lui permettant de valider sur sa 
machine, tout en n'écroulant pas les serveurs de l'AFNIC (ou les autres 
serveurs faisant autorité) sous la charge, comme cela se produirait si 
chacun avait un résolveur normal sur sa machine.

Comment fonctionne dnssec-trigger ? C'est un logiciel qui tourne sur 
plusieurs systèmes d'exploitation, plutôt ceux qui sont michuiens ou 
toutlemondesques (Ubuntu, Fedora, Microsoft Windows, Mac OS). Il 
s'intègre au système de gestion du réseau de ces systèmes (les 
programmeurs apprécieront l'exploit que cela représente, vue la variété 
de ces systèmes), par exemple NetworkManager, et, lorsque celui-ci lui 
signale une nouvelle connexion réseau, il *teste* les résolveurs 
indiqués (le réseau les indique typiquement avec DHCP). Pourquoi les 
tester ? Parce que, dans la nature, on trouve de tout sur les réseaux. 
Idéalement, les résolveurs devraient fonctionner. Mais très fréquemment 
(surtout dans les réseaux pourris fournis par les hôtels, les gares, 
etc), le résolveur est sérieusement cassé : il bloque DNSSEC, ou bien 
il bloque les réponses plus grandes que 512 octets 
<http://www.bortzmeyer.org/dns-size.html> (ce qui revient quasiment à 
bloquer DNSSEC) ou carrément il bloque toutes les requêtes qui 
utilisent EDNS0 (RFC 2671). Ces résolveurs ne peuvent pas aider 
l'utilisateur, ils ne sont qu'un obstacle. dnssec-trigger tente alors 
de joindre directement les serveurs faisant autorité (ce qui marche si 
le réseau ne bloque pas le port 53 
<http://www.bortzmeyer.org/port53-filtre.html>). Si cela échoue, il 
essaie plusieurs techniques (expérimentales et pas forcément présentes 
dans la version actuelle du logiciel) comme de joindre un résolveur 
public qui marche, ou comme de tunneler les requêtes sur le port 443. 
Ces techniques de contournement sont bien connues des "hackers" mais 
l'intérêt de dnssec-trigger est de les automatiser pour M. Michu.

Une fois ces tests terminés, dnssec-trigger reconfigure au vol le 
résolveur Unbound (dnssec-trigger pourrait aussi marcher avec BIND, qui 
a les mêmes capacités mais Unbound est meilleur sur la plupart des 
plans ; notez que la version Windows de dnssec-trigger inclus Unbound) 
de façon à :
* Utiliser les résolveurs officiels du réseau comme "forwarders", 
c'est-à-dire qu'ils recevront les requêtes DNS et pourront garder les 
réponses dans leur cache, limitant ainsi le trafic réseau. C'est donc 
la meilleure approche, la plus « développement durable ». La validation 
sera bien faite sur le poste de travail, sur la machine de M. 
Toutlemonde, mais le trafic sur les serveurs DNS faisant autorité ne 
sera pas différent de ce qu'il est aujourd'hui, puisqu'on utilise les 
mêmes caches. (Le fait que la validation fonctionne, qu'on ait obtenu 
la réponse DNS directement d'un serveur faisant autorité, ou 
indirectement via un résolveur/cache, est le résultat d'une très utile 
propriété de DNSSEC : il protège le message, pas le canal.)
* Si les résolveurs officiels sont vraiment trop nuls, dnssec-trigger 
va dire à Unbound de fonctionner comme résolveur indépendant. La charge 
sur tous les serveurs DNS va alors augmenter mais c'est inévitable (les 
serveurs des gros TLD comme .fr sont déjà surdimensionnés, pour faire 
face au risque de DoS distribuées).
* Si le lien direct vers les serveurs faisant autorité ne passe pas 
(cas où un pare-feu se trouve sur le trajet et bloque le port 53, celui 
du DNS), dnssec-trigger va alors dire à Unbound de tenter différents 
trucs pour passer quand même, comme d'utiliser un résolveur ouvert et 
accessible sur un autre port (ce dernier service est en cours 
d'évaluation).


Avec ce logiciel, on aura donc enfin le beurre et l'argent du beurre. 
On pourra donc valider en local, sur sa machine, sans pour autant 
massacrer les serveurs DNS sous les requêtes. Mais je parle au futur 
car dnssec-trigger est encore en béta-test. Il faut des volontaires 
<http://www.nlnetlabs.nl/projects/dnssec-trigger/> pour le tester sur 
plein de réseaux différents (surtout les pénibles, aéroports, hôtels, 
etc). Ensuite, il reste à l'intégrer dans les systèmes d'exploitation, 
pour que M. Toutlemonde n'ait rien à installer (les discussions ont 
déjà commencé avec Fedora).

Après cet appel au peuple, un peu de technique. dnssec-trigger a quatre 
parties, un démon qui doit tourner en permanence, dnssec-triggerd, un 
composant enregistré auprès du gestionnaire de réseau (NetworkManager 
sur Ubuntu, le script d'installation le détecte en général seul et se 
débrouille) pour être prévenu des changements de connectivité, un 
logiciel de contrôle, dnssec-trigger-control et bien sûr le résolveur 
validant, actuellement Unbound (toute la cuisine de communication 
sécurisée entre dnssec-trigger et Unbound, incluant des certificats 
X.509 pour l'authentification, est faite automatiquement à 
l'installation de dnssec-trigger). On peut regarder l'état du système 
de résolution :

% dnssec-trigger-control status
at 2011-10-15 16:27:42
cache 212.27.40.240: OK 
cache 212.27.40.241: OK 
state: cache secure

Ici, on voit que dnssec-trigger a été informé (par NetworkManager)
que le réseau local a deux résolveurs, qu'ils ont été testés et
trouvés corrects, et que dnssec-trigger est donc heureux
("secure") et utilise un cache. C'était sur un réseau
local connecté à Free. On a eu de la chance ici
car les deux résolveurs de Free sont composés de plusieurs machines
ayant des configurations différentes (!) et il est fréquent qu'une des
adresses ne gère pas DNSSEC.
Ici, ce n'est heureusement pas le cas, dnssec-trigger a donc
indiqué à Unbound d'utiliser ces deux résolveurs, ce qu'on peut
vérifier, en demandant à Unbound :


# unbound-control forward 
212.27.40.241 212.27.40.240

Et tcpdump nous le confirme :


17:06:26.848768 IP 192.168.2.26.37031 > 212.27.40.241.53: 31541+% [1au] A? ubuntu-archive.mirrors.proxad.net. (62)
17:06:26.871841 IP 212.27.40.241.53 > 192.168.2.26.37031: 31541 1/2/3 A 88.191.250.131 (146)

Les requêtes DNS (ici une demande de l'adresse
IPv4 de
ubuntu-archive.mirrors.proxad.net) sont bien
envoyées au "forwarder",
212.27.40.241 (qui pourra répondre à partir de
son cache), et pas directement aux serveurs
faisant autorité.


Si l'un des résolveurs indiqués ne gère pas DNSSEC (ici, 192.134.4.163 
est un BIND avec la configuration dnssec-enable no;), dnssec-trigger 
utilise les autres :

%  dnssec-trigger-control status
at 2011-09-20 10:01:09
cache 192.134.4.163: error no RRSIGs in reply
cache 192.134.4.162: OK
state: cache secure

On est quand même "secure", seul
192.134.4.162 sera utilisé comme
"forwarder".

dnssec-trigger sait gérer les annonces RA ("Router Advertisment") du 
RFC 6106 et peut donc utiliser des résolveurs IPv6. Ici, toujours chez 
Free :

% dnssec-trigger-control status
at 2011-10-15 17:04:32
cache 2a01:e00::1: OK 
cache 2a01:e00::2: error no EDNS
cache 212.27.40.240: OK 
cache 212.27.40.241: OK 
state: cache secure

Un des deux résolveurs IPv6 ne gère pas EDNS0 (je l'ai dit, c'est un
problème courant chez Free) donc dnssec-trigger n'utilise que les
résolveurs qui marchent :


# unbound-control forward 
212.27.40.241 212.27.40.240 2a01:e00::1

tcpdump nous confirme que la résolution se passe bien en IPv6 (ici,
demande de la clé de .org,
nécessaire pour valider le nom www.bortzmeyer.org
qui avait été demandé) :


17:07:13.651758 IP6 2a01:e35:8bd9:8bb0:1a03:73ff:fe66:e568.31040 > 2a01:e00::1.53: 54769+% [1au] DNSKEY? org. (32)
17:07:13.771831 IP6 2a01:e00::1.53 > 2a01:e35:8bd9:8bb0:1a03:73ff:fe66:e568.31040: 54769 6/0/1 DNSKEY, DNSKEY, DNSKEY, DNSKEY, RRSIG, RRSIG (1334)



Jusqu'à présent, nous n'avons vu que des résolveurs assez sympa. Mais, 
lorsqu'on se promène de "hotspot" en "hotspot", on tombe sur bien pire. 
Ici, aucun des résolveurs officiels ne gère DNSSEC :

% dnssec-trigger-control status
at 2011-10-07 09:04:06
authority 128.63.2.53: OK 
cache 10.150.6.1: error no RRSIGs in reply
cache 10.150.2.1: error no RRSIGs in reply
state: auth secure

Mais dnssec-trigger a vu qu'il pouvait parler directement aux serveurs
faisant autorité (il indique avoir testé avec
128.63.2.53, un des serveurs de la
racine, le H). On est donc bien "secure"
mais l'indication "cache" a été remplacée par
"auth". Désormais, le seul cache est celui d'Unbound
sur la machine.

Pire, voici un "hotspot" qui ne laisse même pas parler aux serveurs 
faisant autorité (ici le serveur racine K) :

% dnssec-trigger-control status
at 2011-10-07 09:02:21
authority 193.0.14.129: error no EDNS
cache 192.168.16.1: error no EDNS
state: nodnssec insecure

dnssec-trigger affiche alors un avertissement disant qu'il ne sait pas
faire (dans cette version, qui n'a pas encore les techniques de
contournement) et laisse le choix à l'utilisateur de se connecter de
manière non sûre (ce qui a été choisi ici) ou bien de se déconnecter. Notez qu'on est en sécurité dans ce dernier cas, et dnssec-trigger
affichera "secure"... :


% dnssec-trigger-control status
at 2011-10-07 09:06:49
no cache: no DNS servers have been supplied via DHCP
state: disconnected secure



Un cas beaucoup plus vicieux est celui d'un "hotspot" où les résolveurs 
ne gèrent pas DNSSEC, mais on a accès aux serveurs faisant autorité, 
sauf que le portail captif ne marche pas si on n'utilise pas les 
résolveurs officiels...

at 2011-10-07 09:08:46
authority 193.0.14.129: OK
cache 10.150.6.1: error no RRSIGs in reply
cache 10.150.2.1: error no RRSIGs in reply
state: auth secure

dnssec-trigger utilise alors l'accès direct aux serveurs faisant
autorité, qui marche (vérifié ici avec dig) :



; <<>> DiG 9.7.3 <<>> @193.0.14.129 DNSKEY .
...
;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
...
;; ANSWER SECTION:
.                       172800  IN      DNSKEY  256 3 8
...


Mais dès qu'on essaie d'aller sur le Web, on
est redirigé d'autorité vers un portail captif nommé
bsc-lsh3.essec.fr et on reçoit un message
d'erreur disant qu'il n'existe pas. En effet, ce nom n'est pas présent
dans le vrai DNS :



; <<>> DiG 9.7.3 <<>> A bsc-lsh3.essec.fr
...
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 28170


mais il l'est dans les serveurs officiels du "hotspot" :



...
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2500
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
...
;; ANSWER SECTION:
bsc-lsh3.essec.fr.      28800   IN      A       194.254.137.123


Seule solution, régler le problème à la main. dnssec-trigger fournit
un GUI pour le faire, mais on peut aussi
utiliser la ligne de commande :


... On dit à dnssec-trigger d'utiliser temporairement les résolveurs officiels ...
% dnssec-trigger-control hotspot_signon
... On se connecte au portail captif, acceptant les conditions d'utilisation ...
... On re-teste ...
% dnssec-trigger-control reprobe
... Et cette fois, on a bien du DNSSEC ...



Pour la petite histoire, voici quel était le cahier des charges 
original de dnssec-trigger, ceci était le compte-rendu d'une série de 
réunions informelles et de discussions en ligne.

"My wishlist for Xmas: an easy (easy as in "works for M. Smith or M. 
Jones") way to have an Unbound resolver which:"
* "uses the DHCP-assigned name servers as forwarders after testing them 
(ldns-test-edns may be useful here), to save traffic on authoritative 
name servers"
* "or talks directly to the authoritative name servers (including the 
root) if the DHCP-assigned name servers are broken (no EDNS, mangles 
DNSSEC, etc) and if there is a clean path to the auth. name servers 
(again, something to test, because of the GF in China, because of 
broken "transparent" DNS proxies)"
* "or tunnels DNS requests to a forwarder hardwired somewhere (or 
configured by the user) is there is no other solution."
"All of this automatically. Please ship in three months and for free. "
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.