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.
Date de publication du RFC : Décembre 2016
Auteur(s) du RFC : H. Schulzrinne (Columbia University), A. Rao (Cisco), R. Lanphier, M. Westerlund (Ericsson AB), M. Stiemerling (NEC)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF mmusic
Première rédaction de cet article le 28 décembre 2016
Voici la version 2 du protocole bien connu RTSP, protocole servant à accéder à des flux vidéo. Comme c'est ce que j'utilise pour regarder la télévision sur l'écran de mon PC, je suis ravi que l'IETF se préoccupe de l'améliorer.
Comme beaucoup de protocoles dans le monde du multimédia (SIP, par exemple), RTSP est en fait uniquement un protocole de contrôle, permettant de déclencher ou d'arrêter des flux audio ou vidéo. Ces flux peuvent être temps-réel ou bien avoir simplement été stockés sur le disque d'un serveur. Donc, RTSP est une zapette logicielle. RTSP fait le contrôle et plusieurs protocoles peuvent être utilisés pour le transport des données, UDP, TCP, RTP, etc. À noter la taille impressionnante de ce RFC, avec plus de 300 pages. Ce n'est pas que le protocole soit si compliqué que cela, mais il y a beaucoup d'options et de choix.
La section 2 du RFC résume le protocole : RTSP est client/serveur,
le client RTSP se connecte au serveur, un certain nombre de choix
techniques sont faits et ensuite l'envoi des données
commence. Physiquement, les messages sont du texte (la syntaxe de RTSP
ressemble beaucoup à celle d'HTTP) bien que du
binaire soit parfois possible. La ressource convoitée est identifiée
par un URI de plan rtsp
(ou rtsps
pour TLS) et cet URI contient le nom de la
machine qui sera utilisée comme serveur. Par exemple, si je dis à mon logiciel
RTSP d'utiliser
rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=658&flavour=ld
,
la connexion RTSP sur TCP (ou TCP avec TLS) se fera avec
mafreebox.freebox.fr
. La requête RTSP inclus un
certain nombre d'en-têtes comme dans HTTP, et parfois un corps
(toujours comme en HTTP). Voici un exemple avec le client
VLC. Je le lance avec vlc
'rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=897'
et on voit (tcpdump ne sait pas
apparemment décoder le RTSP mais Wireshark y
arrive très bien) :
Internet Protocol Version 4, Src: 192.168.2.1 (192.168.2.1), Dst: 212.27.38.253 (212.27.38.253) Transmission Control Protocol, Src Port: 45854 (45854), Dst Port: rtsp (554), Seq: 563, Ack: 873, Len: 204 Real Time Streaming Protocol Request: PLAY rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=897 RTSP/1.0\r\n CSeq: 5\r\n User-Agent: LibVLC/2.0.3 (LIVE555 Streaming Media v2012.05.17)\r\n Session: pokf6CQWbA8CUyC Range: npt=0.000-\r\n \r\n
Dans l'exemple ci-dessus, le protocole était RTSP version 1.0
(rappelez-vous que ce RFC décrit la version 2), la requête était
PLAY
(dont le nom dit bien ce qu'elle fait et
vous ne serez pas surpris d'apprendre qu'il existe une commande PAUSE
) et
l'un des en-têtes, User-Agent:
montre que
j'utilise bien vlc.
Quand au trafic lui-même, on voit (ici avec tcpdump) d'abord du RTSP sur TCP puis un gros flux UDP :
21:34:36.179830 IP (tos 0x10, ttl 64, id 20888, offset 0, flags [DF], proto UDP (17), length 1356) 212.27.38.253.46099 > 192.168.2.1.34324: [udp sum ok] UDP, length 1328 21:34:36.180040 IP (tos 0x10, ttl 64, id 20889, offset 0, flags [DF], proto UDP (17), length 1356) 212.27.38.253.46099 > 192.168.2.1.34324: [udp sum ok] UDP, length 1328 21:34:36.180738 IP (tos 0x10, ttl 64, id 20890, offset 0, flags [DF], proto UDP (17), length 1356) 212.27.38.253.46099 > 192.168.2.1.34324: [udp sum ok] UDP, length 1328
Les contenus auxquels on accède avec RTSP peuvent être de type très variés. Il faut donc une description formalisée des caractéristiques de ce contenu. RTSP peut utiliser plusieurs formats pour cela, le plus répandu étant sans doute SDP (RFC 4566). C'est en tout cas celui utilisé entre mon VLC et ma Freebox. La description peut inclure le nombre de flux (souvent un flux vidéo et plusieurs audios), le protocole de délivrance (RTP - RFC 3550 - dans l'exemple ci-dessous), le format (MPEG-2 ici), etc :
Session Description Protocol Session Description Protocol Version (v): 0 Owner/Creator, Session Id (o): leCDN 1395332443 1395332443 IN IP4 kapoueh.proxad.net ... Media Description, name and address (m): video 0 RTP/AVP 33 Media Type: video Media Port: 0 Media Protocol: RTP/AVP Media Format: MPEG-II transport streams Media Attribute (a): control:rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=658&flavour=ld Media Attribute Fieldname: control Media Attribute Value: rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=658&flavour=ld
Quels sont les changements par rapport à RTSP version 1, la version
du RFC 2326 ? Les deux
versions, quoique identiques dans leurs principes, ne sont pas
compatibles (par exemple, la commande PLAY
n'a
plus le même comportement, des en-têtes ont changé de syntaxe sans
changer de nom, etc). C'est toujours un choix difficile que de casser la
compatibilité d'un protocole mais, là, c'était nécessaire vu le nombre
de modifications. En outre, RTSP 1 ne
permettait pas de déployer facilement des extensions (en-têtes à la
syntaxe trop rigide) et le modèle d'extension a changé. L'annexe I de
notre RFC résume ce qu'il faut savoir sur ces différences :
suppression des requêtes RECORD
et
ANNOUNCE
, suppression de l'option qui permettait
de faire passer RTSP (le contrôle, pas les données) sur UDP, gestion
complète d'IPv6 (qui manquait en version 1),
refactorisation du RFC (les en-têtes qui sont proches de ceux de HTTP
sont désormais décrits par un texte spécifique, sans renvoyer au RFC
HTTP), etc.
Il y a apparemment au moins une mise en œuvre de RTSP qui a la version 2, et plusieurs des nouveautés de la version 2 ont été mises en œuvre de manière séparée.
Date de publication du RFC : Décembre 2016
Auteur(s) du RFC : P. Hoffman (ICANN)
Pour information
Première rédaction de cet article le 16 décembre 2016
Contrairement à beaucoup de SDO, l'IETF n'avait pas de format standard pour l'écriture de ses documents. Désormais, avec le nouveau cadre décrit dans le RFC 7990, c'est fait. XML, avec le vocabulaire décrit dans ce nouveau RFC, est le format canonique des RFC.
Vous voulez écrire un RFC ? Il est fortement recommandé d'utiliser dès le début le format standard XML, fondé sur un vocabulaire spécifique aux RFC, et mis en œuvre dans la future version de l'outil xml2rfc. Voici donc le vocabulaire « XML2RFC version 3 », succédant à deux versions qui n'étaient pas officiellement standard (les changements depuis la v2, spécifiée dans le RFC 7749, ne sont pas énormes). Notez que le vocabulaire XML et les outils continuent à évoluer, donc ce RFC n'est pas éternel. Et que la version 2 restera sans doute en service pendant encore des années : cela prend du temps de changer les habitudes !
Voici le squelette d'un Internet-Draft écrit avec ce XML :
<?xml version="1.0" encoding="utf-8"?> <rfc docName="draft-ietf-dnsop-qname-minimisation-09" submissionType="IETF" ipr="trust200902"> <front> <title abbrev="Qname minimisation">DNS query name minimisation to improve privacy</title> ... <middle> <section anchor="intro" title="Introduction and background"> <t>The problem statement is described in <xref target="RFC7626"/>. [...] ... </back> </rfc>
Sur ce squelette simple, on voit l'élément racine
(<rfc>
), l'utilisation des attributs
(comme submissionType
qui indique la voie
prise par le document, ici, l'IETF,
cf. RFC 7841), la séparation en trois parties,
<front>
, qui regroupe les
métadonnées,
<middle>
, qui est le texte principal,
et <back>
, où se trouvent la
bibliographie, les annexes, etc.
Parmi les attributs de cet élément racine
<rfc>
, notez ipr
,
qui indique les conditions légales d'utilisation de ce RFC. Dans
cet example, la valeur est la plus couramment utilisée :
trust200902
(cf. l'annexe A.1) indique les règles de
l'IETF Trust datant de 2009 (qui disent en
gros que le texte du RFC peut être librement copié, reproduit,
distribué et mis en œuvre dans des programmes). L'annexe A de
notre RFC détaille ce qu'on appelle le
boilerplate, ces textes juridiques obligatoires
qui sont ajoutés automatiquement par le logiciel xml2rfc. Ainsi,
si on met ipr="trust200902"
dans l'élément
<rfc>
, xml2rfc va automatiquement
ajouter « Copyright (c) 2015 IETF Trust and the persons identified as the
document authors. All rights reserved. \ This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents [...] »...
Le gros morceau du RFC est la section 2, qui donne la liste des éléments XML acceptés. Je ne vais pas reproduire ici cette liste, juste parler de quelques éléments qui me semblent rigolos.
<section>
contient une partie du
RFC. Cet élément est hiérarchique : on crée des sous-sections en
les mettant sous les sections existantes, et ainsi de suite,
récursivement. (Contrairement à ce qui se passe avec
HTML, où on indique explicitement le niveau
de la section, <h1>
,
<h2>
, etc.) On a aussi
<abstract>
, qui indique le résumé au
début du RFC.
<t>
contient un paragraphe et est
donc l'équivalent du <p>
de HTML.
<artwork>
permet de spécifier du texte qui sera représenté comme tel,
sans aucune justification, mise à la ligne, etc. (Les
tabulations sont interdites, ce qui règle
le vieux débat « tabs
vs. spaces ».) <artwork>
permet
de mettre de l'art ASCII dans un RFC, mais la
méthode préférée pour les images est désormais
SVG, voir le RFC 7996. Le SVG peut être mis directement dans le source
XML ou bien inclus par différentes méthodes, dont l'attribut
src
. Cet attribut
src
permet de spécifier un fichier externe,
l'art ASCII ne servant alors que de solution de secours, pour le
format en texte seul. Un attribut type
permet
d'indiquer le type du dessin (par exemple
svg
pour les images en SVG). La liste des types
possibles sera en ligne.
Voici un exemple d'art ASCII :
<artwork type="ascii-art"> +--------------+ +----------------+ | Alice |------------------------------------| Bob | | 2001:db8::1 | | 2001:db8::2 | +--------------+ +----------------+ </artwork>
Le code source, lui, se fait avec
l'élément <sourcecode>
, un attribut
type
permettant d'indiquer le langage utilisé
(une liste des valeurs possibles sera en ligne). Voici un exemple :
<sourcecode type="python"> print("Hello, world") </sourcecode>
Comme le langage utilisé peut utiliser des caractères qui sont spéciaux pour XML (comme < ou &), il est souvent préférable de mettre le code source dans une section CDATA.
<eref>
permet de faire un lien
hypertexte vers l'extérieur :
<t>More text and a <eref target="http://www.rfc-editor.org/">lien vers le site du RFC Editor</eref>.</t>
<ul>
permet de représenter les
traditionnelles listes à puces :
<t>There are three sorts of DNS requests being issued:</t> <ul> <li>Primary request: [...]</li> <li>Secondary requests: [...]</li> <li>Tertiary requests: [...]</li> </ul>
<references>
permet d'indiquer une
bibliographie. Il y en a typiquement deux
dans un RFC (cf. la section 4.8.6 du RFC 7322), la bibliographie normative (ce qu'il faut absolument
avoir lu et compris car le RFC en dépend) et l'informative (ce
qu'on peut sauter si on est pressé). Pour aider, le RFC
Editor distribue des fichiers XML contenant les
références aux RFC publiés, comme http://www.rfc-editor.org/refs/bibxml/reference.RFC.7626.xml
.
Le nom d'un auteur de RFC se met avec l'attribut
<author>
. Comme il peut être en
caractères non-ASCII, des attributs permettent d'indiquer une
variante en ASCII seul. Par exemple :
<author fullname="Patrik Fältström" asciiFullname="Patrik Faltstrom"> <organization>Netnod</organization> </author>
Ce format de RFC s'appuie sur XML et il faut donc suivre les règles de XML, notamment sur les caractères spéciaux. Ainsi, le chevron ouvrant doit être remplacé par une séquence d'échappement (< au lieu de <). Si cette contrainte est trop forte, on peut aussi enclore les parties à « échapper » dans une section CDATA.
Le format des RFC permet d'autres caractères que ceux du jeu ASCII, mais avec certaines restrictions (voir RFC 7997).
Le format actuel permet l'inclusion d'autres documents, via des
attributs comme l'attribut src
pour le code
source :
<sourcecode type="python" src="hello.py"/>
On peut aussi utiliser les mécanismes génériques d'inclusion de XML, comme XInclude (cf. annexe B.1) ou les entités, et c'est souvent utilisé pour la bibliographie :
<!DOCTYPE rfc [ <!ENTITY rfc7830 PUBLIC "http://xml.resource.org/public/rfc/bibxml/reference.RFC.7830.xml"> ]> [...] <references> &rfc7830; </references>
À noter qu'il existe un type
MIME pour les sources XML de RFC,
application/rfc+xml
(section 8 de notre RFC).
Si vous voulez voir le schéma XML complet, il est en annexe
C (j'en ai exporté une version utilisable telle quelle, sans les
sauts de page des RFC, en rfc-v3.rnc
). Comme il est
écrit en Relax NG, il
permet l'utilisation de tous les outils Relax NG, comme le mode
emacs nxml-mode et comme
rnv. Ainsi, une fois le fichier
rfc-v3.rnc
chargé dans emacs (menus XML puis
Set schema puis File), on
dispose de fonctions d'édition bien pratiques (par exemple, on
tape un < puis une tabulation et emacs propose de compléter
uniquement avec les éléments autorisés à cet endroit). Cela évite
bien des erreurs.
À noter que ce RFC ne décrit que les éléments et attributs XML, pas de processing instructions (PI), qui ne sont plus acceptées.
Avec un logiciel comme rnv, on peut tester la syntaxe (uniquement la syntaxe : certaines contraintes dans le RFC ne sont pas exprimables dans le schéma, il a fallu les formuler en langue naturelle dans le texte du RFC) :
% rnv rfc-v3.rnc rfc-v3-sample.xml rfc-v3-sample.xml
Parfait, ici, tout est bon. S'il y avait eu une erreur :
% rnv rfc-v3.rnc rfc-v3-sample-wrong.xml rfc-v3-sample-wrong.xml rfc-v3-sample-wrong.xml:9:6: error: element ^t not allowed required: element ^section rfc-v3-sample-wrong.xml:11:2: error: unfinished content of element ^middle required: element ^section error: some documents are invalid
Si le RFC contient des références externes (que rnv ne sait pas traiter), on peut utiliser xmllint pour les remplacer :
% xmllint --dropdtd --noent draft-dupont-my-protocol.xml | rnv rfc-v3.rnc
On peut aussi utiliser Jing (annexe C.1). Mode d'emploi très court, on télécharge :
% wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/jing-trang/jing-20091111.zip % unzip jing-20091111.zip % java -jar ./jing-20091111/bin/jing.jar -c rfc-v3.rnc draft-dupont-my-protocol.xml %
Les changements depuis le texte précédent, le RFC 7749, qui décrivait la version 2 (notre RFC est la version 3), sont décrits dans l'annexe D et résumés en section 1.3. L'idée était notamment d'avoir un vocabulaire plus facile à utiliser, sans pour autant trop changer par rapport au format v2, qui était bien connu des auteurs.
Le changement le plus spectaculaire concerne les listes, qui
sont désormais faites, comme en HTML, avec
des <dl>
,
<ul>
et
<ol>
. Dans une liste, le contenu est
marqué par <li>
et plus
<t>
. Autre inspiration HTML,
l'apparition des tables, avec <table>
(et éléments associés comme <tr>
et
<td>
). D'autre part, de nouveaux éléments
apparaissent pour marquer du texte, par exemple s'il est
important (<em>
,
qui n'avait pas d'équivalent en v2, dont le seul format de sortie
était le texte brut). Il y a aussi un
<blockquote>
pour les citations. Bien que l'IETF se
vante souvent de pratiquer le culte du « running
code », il n'y avait pas d'élément XML particulier pour
indiquer du code source dans un RFC (on se contentait
d'<artwork>
). C'est désormais fait avec
<sourcecode>
. Quelques autres éléments
XML nouveaux (je ne les cite pas tous, le RFC fait 159 pages !) :
<displayreference>
pour associer un
chouette texte aux références, <link>
pour les liens externes (contrairement à
<eref>
, qui existait déjà,
<link>
est spécifique à certains types
de documents, par exemple les Internet-Drafts) ou encore
<br>
pour forcer des sauts de ligne
(mauvaise idée que de mettre des éléments de présentation, si vous
voulez mon avis).
Il y a aussi de nouveaux attributs XML aux éléments
existants. Pour remplacer les PI (processing
instructions comme <?rfc
toc="yes"?>
), on a tocInclude
et tocDepth
dans l'élément
<rfc>
, afin de contrôler la
table des matières. De même, pour gérer
l'internationalisation, il y a désormais un attribut
ascii
pour les éléments qui acceptent du
contenu non-ASCII, afin de fournir une
alternative pour les anglophones. Il y a aussi des attributs plus
orientés présentation comme keepWithNext
ou
keepWithPrevious
, attributs de
<t>
, qui expriment un souhait de garder
ce paragraphe avec le suivant ou le précédent, pour mieux
contrôler la pagination.
En revanche, certains éléments et attributs sont retirés de la
circulation. Ils seront encore acceptés par les outils, mais
temporairement. <list>
subit ce trist sort
(remplacé par les éléments HTMLisant comme
<ul>
et
<ol>
). <facsimile>
disparait également, victime des évolutions technologiques. Parmi
les attributs, title
disparait (il était
utilisé dans des éléments comme
<section>
) au profit de
name
(changement assez gratuit, je
trouve).
Les autres changements sont bien sûr l'acceptation de caractères non-ASCII, et plein de modifications de détail.
Question mise en œuvre, il faudra patienter. S'il y a déjà eu des mises en œuvre expérimentales et partielles, les vrais logiciels officiels ne sont pas encore, en octobre 2016, développés.
Date de publication du RFC : Décembre 2016
Auteur(s) du RFC : H. Flanagan (RFC Editor)
Pour information
Première rédaction de cet article le 16 décembre 2016
Voici enfin la série de RFC décrivant le nouveau format des RFC. Ce projet a commencé il y a plusieurs années, mais les discussions ont été longues. Ce nouveau RFC et les huit autres qui l'accompagnent, marquent un changement important dans ces « textes sacrés » de l'Internet : l'ancien format « texte brut » n'est plus le format de référence. Désormais, tout RFC sera fait en XML, format d'où seront produits automatiquement des versions texte brut, HTML, PDF, etc.
Les RFC sont des documents cruciaux pour l'Internet. C'est sous forme de RFC que sont publiées les normes techniques de la famille de protocoles TCP/IP. Et il y a bien d'autres RFC qui ne sont pas forcément des normes (cf. RFC 1796). Librement disponibles en ligne (contrairement aux normes techniques des organisations traditionnelles du mésozoïque), dans un format ouvert, la disponibilité des RFC est l'une des raisons du succès de l'Internet.
Parlons de format, justement. Les RFC, jusqu'à maintenant, étaient sous forme de texte brut, et en ASCII seul. (Certes, des versions PDF et HTML non-officielles étaient diffusées mais on voyait bien qu'elles avaient été produites à partir du texte brut... Certes, il était possible depuis dix ans d'écrire les RFC en XML, cf. RFC 2629, mais ce n'était pas le format de référence.) Pourquoi donc se limiter à ce format ? Il y avait plusieurs bonnes (et d'autres moins bonnes) raisons mais il ne faut pas de cacher qu'une des raisons les plus importantes était qu'il est difficile de faire changer un processus de production bien établi, même s'il comprend des archaïsmes, comme l'utilisation de troff pour traiter des documents. L'actuelle éditrice des RFC, Heather Flanagan, a donc eu bien du mérite à faire aboutir ce projet de changement. Il a fallu beaucoup de discussions, dans une communauté souvent divisée. (Que les informaticiens pensent aux grands débats du genre « vi ou emacs ? »)
Le projet de réforme des RFC avait sérieusement commencé en 2013 avec le RFC 6949, le véritable cahier des charges du nouveau format. La décision formelle de migrer vers le nouveau format, et donc de décider que le format de référence serait désormais le XML et non plus le texte brut a été prise en mai 2013. Avant et pendant cette décision, d'innombrables messages ont été échangés sur la liste de diffusion rfc-interest.
Il est important de noter que cette discussion portait sur le processus de publication des RFC terminés. L'élaboration des Internet-Drafts, la décision de les publier ou pas (qui dépend de chaque voie, cf. RFC 8729) ne sont pas concernées.
La section 2 de notre RFC résume le problème que veut résoudre le nouveau format. Le monde a bien changé depuis que seuls une poignée de Californiens anglophones venait aux réunions IETF. Les participants viennent aujourd'hui de 45 pays, situés dans le monde entier, les lecteurs des RFC sont plus divers que jamais, utilisent des engins très variés, et il est toujours aussi crucial que les RFC soient largement disponibles et accessibles, et sur une très longue période (mon favori est le RFC 768, publié en 1980 et toujours d'actualité). Le format de référence en texte ASCII brut ne permettait clairement pas cela.
Mais choisir un successeur n'était pas facile : notre RFC insiste sur le fait qu'il y a aujourd'hui plusieurs groupes qui utilisent les RFC (pas seulement des techniciens, juristes et chefs accèdent aujourd'hui à des RFC), et sur le fait qu'il fallait un compromis entre les besoins actuels et l'importance d'une disponibilité à long terme (par exemple, adopter le format à la mode du moment pourrait se payer cher plus tard lorsque ce format n'intéressera plus personne).
Un peu de terminologie (section 3) est nécessaire pour bien comprendre le choix effectué :
Et aussi un terme important : texte réagencable (ou réajustable, reflowable text). C'est du texte qui s'ajuste automatiquement à la largeur du dispositif de lecture. C'est banal dans le monde HTML, où c'est fait automatiquement depuis toujours. Mais c'était un des principaux inconvénients de l'ancien format des RFC : le texte avait une largeur fixe.
Quel sera donc exactement le format canonique ? La section 6 répond à cette question :
<sourcecode
src="[un URI externe]"...
(RFC 7991, section 2.48), le code en question sera inclus
dans la version canonique. Idem si l'auteur a utilisé XInclude.Notez donc que les images (en SVG) seront désormais possibles (voir le RFC 7996).
Le guide du style des RFC (RFC 7322) avait été révisé pour tenir compte de ce nouveau format. Notamment, il se concentre désormais sur le contenu du texte, ne demandant plus aux auteurs des efforts de présentation. (La section 5 résume les changements importants pour les auteurs.)
Enfin, la section 7 décrit les formats de publication. À partir du source XML, seront automatiquement produits HTML, PDF, texte brut et peut-être plus tard d'autres. Le HTML est évidemment la cible évidente. Son utilisation pour les RFC est décrite dans le RFC 7992. Le résultat sera certainement bien meilleur que les versions HTML non-officielles actuelles, qui sont produites à partir du texte brut, qui ne contient pas assez de structure pour faire du bon HTML. La mise en page sera évidemment assurée par CSS (RFC 7993), il y aura une feuille de style standard, que chacun sera bien sûr libre de remplacer. Le SVG sera inclus dans l'HTML (il faudra donc un navigateur qui gère bien SVG). Il y aura même du JavaScript mais avec de sévères restrictions. Notamment, le code JavaScript ne devra pas changer le texte, ou supprimer du texte.
PDF, quant à lui, est spécifié dans le RFC 7995. Il devra suivre le profil PDF/A-3, spécialement prévu pour de l'archivage à long terme, et pour pouvoir être relu par des logiciels PDF n'ayant pas tous les derniers gadgets.
Naturellement, le texte brut n'est pas abandonné. Comme indiqué dans le RFC 7994, il y aura une version en texte brut produite automatiquement à partir du XML, même si elle ne sera plus la version canonique. Parmi les nouveautés par rapport à l'ancien format, UTF-8 sera désormais autorisé, même si c'est de façon limitée (voir les limitations dans le RFC 7997). Il pourra y avoir une variante non découpée en pages.
Dans le futur, il est possible que le format EPUB soit ajouté à cette liste.
Au passage, comment a été décidé cet important changement dans le format des RFC ? La section 4 résume cette histoire. Comme indiqué plus haut, cela a pris très longtemps et nécessité beaucoup de discussions, qui ont notamment eu lieu sur la liste de diffusion rfc-interest, et au cours des réunions physiques de l'IETF. Le cahier des charges a été formalisé en 2013 dans le RFC 6949. Une fois le cahier des charges décidé, une équipe spécialisée a été désignée par le RFC Editor pour mettre au point les détails, notamment en adaptant le langage XML utilisé, partant de la dernière version (RFC 7749), pour arriver au futur langage, RFC 7991. Des éditeurs professionnels ont également été consultés, ainsi d'autres SDO et même des juristes (oui, car aux États-Unis, rien n'est désormais à l'abri d'actions en justice, même pas les RFC, le choix du format de sortie PDF/A-3 venait en partie de la nécessité de répondre aux subpoenas). Le tout était bien sûr fait sous la supervision du RFC Series Oversight Committee. Certaines décisions furent consensuelles, les autres tranchées par le RFC Editor (cf. RFC 8728). Le tout a été approuvé par l'IAB en août 2016.
Après ce tour du passé, le futur. Comment se fera la transition vers le nouveau système (section 10) ? C'est qu'il va falloir créer de nouveaux outils (cf. RFC 7998). L'appel d'offres pour leur développement a été fait en septembre 2016. La description des outils est une très intéressante lecture (l'appel d'offres formel est sur la page des Request For Proposal). L'appel d'offres a été gagné par les sociétés SeanTek et Elf Tools.
Pendant une période intermédiaire, le texte seul sera toujours utilisé comme format canonique, mais les nouveaux RFC passeront également par le nouveau workflow, pour vérifier que tout se passe bien et que le résultat est correct. Double travail, donc, mais nécessaire pour s'assurer que tout est en place.
Notez que, même une fois la transition finie, les auteurs ne seront pas forcés de soumettre leur document sous forme d'un fichier XML (ils seront simplement très fortement encouragés à le faire). S'ils envoient le texte seul comme avant, le RFC Editor devra produire le XML lui-même, et c'est ce XML qui sera la version canonique. Rappelez-vous que beaucoup de RFC sont des documents normatifs et que chaque mot, voire chaque virgule peut compter ! Voici pourquoi il faudra s'assurer que tout est parfait, même si, au début, cela entrainera certainement des retards dans la publication.
Dans le cas où l'auteur envoie du XML suivant le RFC 7991, il y aura moins de travail pour le RFC Editor, juste convertir ce XML au XML canonique (résoudre les références extérieures, par exemple) et passer ce XML canonique dans les nouveaux outils.
Notez que le RFC Editor maintient une FAQ très utile sur toutes les questions que pose le nouveau format. Et la RFC Editor avait fait un très drôle Pecha Kucha à Séoul en novembre 2016, sur le cahier des charges du nouveau format.
Le premier RFC au nouveau format a été le RFC 8651, sorti en octobre 2019.
Date de publication du RFC : Décembre 2016
Auteur(s) du RFC : J. Hildebrand (Cisco
Systems), P. Hoffman (ICANN)
Pour information
Première rédaction de cet article le 16 décembre 2016
Depuis la sortie du RFC 7990 et ses copains, le format canonique (le format de référence) des RFC n'est plus le texte seul mais un langage XML, normalisé dans le RFC 7991. Les formats « de publication » seront produits automatiquement à partir de ce XML. C'est ainsi que notre RFC 7992 décrit la sortie HTML, qui permettra de publier des beaux RFC sur le Web.
HTML, trop riche et trop mouvant, est en effet mal adapté à l'écriture et à la maintenance de documents. Il n'était donc pas envisageable de le choisir comme format canonique. En revanche, il est incontournable comme format de publication. C'est en effet le langage du Web, et il y a donc logiquement une forte demande pour pouvoir lire les RFC en HTML. Avant, lorsque le format canonique était le texte brut, des versions non officielles étaient publiées en HTML (voir un exemple) mais, le texte brut n'ayant pas de formatage précis, ces versions n'avaient pas vraiment l'air de vraies pages Web...
(Notez que ce blog que vous êtes en train de lire est produit par un mécanisme analogue à celui que les RFC suivront désormais : tapé en XML, avec le HTML produit automatiquement.)
La section 1 de notre RFC résume les principes de l'HTML utilisé. D'abord, ce sera un sous-ensemble de HTML (HTML a bien trop de fonctions). Ensuite, la présentation sera largement délégué à une feuille de style CSS, dont les caractéristiques sont mentionnées dans le RFC 7993.
La section 2, elle, est le « cahier des charges » du HTML des RFC. Elle précise les exigences du RFC 6949. Elle concerne les auteurs du ou des logiciels de production des RFC (pour ces logiciels, voir le RFC 7998). Les auteurs de RFC, eux, n'ont pas à s'en soucier, ils écrivent du XML, et le HTML sera produit par les outils.
Le but principal est que l'HTML produit soit parfaitement lisible sur la grande majorité des navigateurs utilisés. Pas question bien sûr d'ajouter une de des ridicules mentions « optimisé pour Internet Explorer » qui étaient si communes sur les sites Web d'amateurs, dans les années 2000. Notre RFC mentionne explicitement l'exigence que les textes soient lisibles avec au moins un navigateur « texte », comme Lynx, certaines personnes accédant au Web ainsi (par obligation ou par goût). C'est l'une des raisons de la décision de ne pas accepter la totalité de HTML.
Le fichier HTML devra être autonome (ne pas dépendre de fichiers extérieurs), de manière à pouvoir être transmis facilement par des mécanismes tels que rsync ou le courrier électronique.
Le JavaScript est accepté mais à condition qu'il ne modifie en aucun cas le texte du RFC. (Il peut, par exemple, ajouter des éléments de navigation, ou afficher des métadonnées.)
On l'a dit, CSS sera utilisé pour la présentation, mais le cahier des charges exige qu'on puisse facilement remplacer la feuille de style par une de son choix, pour s'adapter aux goûts locaux.
Le Web étant fondé sur la notion de lien hypertexte, il y aura évidemment des liens, aussi bien ceux mis explicitement par l'auteur (« ce point est développé en section N »), que ceux ajoutés automatiquement (de la table des matières vers les différentes sections, par exemple).
Un point crucial est évidemment l'accessibilité. Comme le savent tous ceux et toutes celles qui vont régulièrement à Paris Web, c'est un point essentiel mais souvent oublié. Notre RFC note donc que les publications en HTML des futurs RFC devront être accessibles aux malvoyants, aux daltoniens, et aux utilisateurs de petits écrans, par exemple les smartphones. (Note personnelle : ce dernier point ne devrait pas être dans une section sur l'accessibilité. Le Web est prévu - contrairement aux formats du monde du papier, comme PDF - pour être visible sur tous les périphériques.)
Au fait, quelle version de HTML sera utilisée (section 3 de notre RFC) ? Ce sera HTML5 (et pas, et je le déplore, XHTML ; l'inconvénient, souvent cité contre XHTML, de la difficulté à l'écrire n'a pas de sens ici, puisque le HTML sera produit automatiquement).
La section 4 précise la syntaxe utilisée (rappelez-vous qu'on n'accepte pas la totalité de HTML5) : encodage en UTF-8, sauts de ligne en style Unix (un U+000A et rien d'autre), pas de caractères de contrôle comme la tabulation (U+0009). Les éventuels commentaires du source XML ne seront pas mis dans le HTML (l'idée est qu'ils sont pour les auteurs, pas pour les lecteurs).
Il y a des objets divers qu'on retrouve souvent dans le source
XML. Ils sont rassemblés dans la section 5. Par exemple, on
trouve les identificateurs qui seront mis comme valeur des
attributs id
dans le HTML produit. Ce sont
parfois des identificateurs mis explicitement par l'auteur, et
parfois des identificateurs produits par le logiciel, par exemple
pour que les entrées de la table des matières pointent vers la
section correspondante.
Autre objet récurrent, la marque de paragraphe (pilcrow pied-de-mouche, caractère Unicode U+00B6, celui-ci : ¶), qui sera mise automatiquement derrière chaque paragraphe, mais pas affiché par défaut (il faudra promener le pointeur dessus pour le voir).
Maintenant, attaquons les différentes parties du RFC rendu en
HTML. D'abord (section 6), les premiers objets HTML qu'on
rencontrera, notamment les métadonnées du
RFC. Il y aura évidemment un
DOCTYPE
identifiant le document comme du HTML5. L'élément racine sera <html>
,
avec une étiquette de langue qui sera bien
sûr en
,
l'anglais. L'élément
<head>
qui suivra contiendra une
déclaration de jeu de caractère, un titre,
et diverses métadonnées :
<meta charset="utf-8"> <title>The Mother of all RFCs</title> <meta name="author" content="Joe Hildebrand"> <meta name="author" content="Heather Flanagan"> <meta name="description" content="This document defines..."> <meta name="generator" content="xmljade v0.2.4"> <meta name="keywords" content="html,css,rfc">
(Rappelez-vous que le HTML produit n'est hélas pas du
XHTML donc il est normal que les
<meta>
ne soient pas explicitement
fermés.)
Il y aura aussi un lien vers la licence des RFC, en utilisant le
cadre général des liens (RFC 8288) :
<link rel="license" href="https://www.rfc-editor.org/copyright/">
Cette première partie du RFC produit contiendra aussi une feuille de style, ainsi qu'un lien vers une éventuelle feuille locale, au cas où un lecteur souhaiterait lire le RFC selon un style différent :
<style> body {} ... </style> <link rel="stylesheet" type="text/css" href="rfc-local.css">
Le début de la partie visible du RFC sera composée d'une
<dl>
pour les métadonnées affichées, et
d'une table des matières. Les métadonnées seront donc du genre :
<dl id="identifiers"> <dt>Workgroup:</dt> <dd class="workgroup">rfc-interest</dd> <dt>Series:</dt> <dd class="series">Internet-Draft</dd> <dt>Status:</dt> <dd class="status">Informational</dd> <dt>Published:</dt> <dd><time datetime="2014-10-25" class="published">2014-10-25</time></dd> ...
La partie principale du RFC sera, elle, rendue selon les principes décrits en section 9 pour chacun des éléments XML qui composent le source.
La dernière partie du RFC incluera un index (si le source XML
avait un attribut indexInclude
dans l'élément
<rfc>
), les adresses des auteurs
(formatées en hCard), et les métadonnées
considérées comme les moins importantes (les autres ayant été
mises au début).
La section 9 de notre RFC est particulièrement longue car elle
décrit le rendu en HTML de tous les éléments du vocabulaire XML du
RFC 7991. Je ne vais pas tout décrire ici,
juste donner quelques exemples. Ainsi,
<artwork>
sera rendu dans un élément
HTML <pre>
, si le schéma était en
art ASCII, sera inclus tel quel dans le
HTML si le schéma était en SVG (RFC 7996), et sera mis sous forme d'un
<img>
(avec contenu de plan
data:
) dans les autres
cas. <sourcecode>
, lui, est toujours
restitué sous forme d'un <pre>
HTML.
La traduction de certains éléments en HTML est plus
directe. Par exemple,
<em>
est simplement rendu par le même
élément HTML.
Et, pour finir, un petit mot sur la sécurité (section 11) : comme les RFC en HTML ne sont pas forcément téléchargés depuis le Web mais peuvent être lus depuis un fichier local (après, par exemple, synchronisation via rsync), on ne bénéficie pas forcément des protections du navigateur. Donc, prudence.
Date de publication du RFC : Décembre 2016
Auteur(s) du RFC : H. Flanagan (RFC Editor)
Pour information
Première rédaction de cet article le 16 décembre 2016
Les RFC sont forcément écrits en anglais, qui restera la langue officielle (cf. RFC 7322). L'anglais peut s'écrire avec uniquement les caractères ASCII (avec quelques exceptions : resume et résumé ne sont pas le même mot). Mais on pourra désormais inclure des caractères non-ASCII, par exemple pour le nom des auteurs (chic, je pourrais écrire correctement mon prénom dans les RFC). Cette possibilité permettra aussi aux exemples de protocoles Internet utilisant Unicode (la grande majorité) d'être plus lisibles.
Cette nouvelle possibilité fait partie de celles qu'offre le nouveau format des RFC, décrit dans le RFC 7990. Il n'y a quand même pas d'autorisation générale d'inclure n'importe quel caractère Unicode dans les RFC, à n'importe quel endroit. Le RFC Editor pourra toujours refuser tel ou tel caractère, par exemple parce qu'il n'existe pas de police permettant de l'afficher. Et le « non-ASCII » n'est autorisé que dans certains cas, décrits plus loin. La grande majorité du texte sera donc du pur ASCII (RFC 20).
Il ne suffit pas de proclamer « on a droit à Unicode ». Il faut aussi adapter les outils. Par exemple, notre RFC impose (section 2) que les outils de recherche dans les RFC gèrent correctement la recherche Unicode. (C'est pour traiter le cas des outils imparfaits que le RFC demande aussi que les noms d'auteurs en Unicode soient accompagnés d'une version en ASCII.) Et que le RFC soit affichable correctement sur un bon nombre de plate-formes (d'où la possibilité de rejeter les caractères les plus rares).
Ce problème du repli (vers une version en ACSII pur) est souvent cité dans le RFC. Ainsi, lorsqu'on veut mentionner un caractère Unicode (mettons le thorn islandais), le RFC permet désormais de l'afficher proprement, mais il demande qu'on l'accompagne du numéro du point de code, et, si possible, de son nom Unicode. Cela donnerait, par exemple « For instance, U+00FE, "LATIN SMALL LETTER THORN", þ, is interesting because... ». Notez que cette façon de désigner des caractères Unicode que tout le monde n'arrivera pas forcément à afficher n'est pas vraiment standardisée. Dans les RFC actuels, on trouve des variantes (voir cette discussion). Le RFC contient plusieurs exemples sur la façon d'écrire la phrase « Temperature changes in the Temperature Control Protocol are indicated by the U+2206 character (∆, "INCREMENT") », tous acceptés (le nom Unicode n'est pas obligatoire, il peut être placé avant ou après le caractère lui-même, etc.) Autre cas, ce texte du RFC 8264, « For example, the characters U+13DA U+13A2 U+13B5 U+13AC U+13A2 U+13AC U+13D2 from the Cherokee block look similar to the ASCII characters "STPETER" » deviendrait « For example, the characters U+13DA U+13A2 U+13B5 U+13AC U+13A2 U+13AC U+13D2 (ᏚᎢᎵᎬᎢᎬᏒ) from the Cherokee block look similar to the ASCII characters "STPETER" ». Des tables comme celles des identificateurs et mots de passe Unicode légaux (RFC 8265) seraient ainsi bien plus lisibles.
Pour les noms, par exemple ceux des auteurs. On aurait du « non-ASCII » et un texte de repli, comme (en utilisant le vocabulaire XML du RFC 7991) :
<author fullname="רוני אבן" asciiFullname="R. Even"/> <author fullname="吴钦" asciiFullname="Q. Wu"/> <author fullname="J. Smith" asciiFullname="J. Smith"/> <!-- Oui, dans ce cas, il faut le dire deux fois -->
Cela permettra enfin d'écrire correctement les noms des auteurs de RFC.
La bibliographie d'un RFC est également un bon endroit où mettre des caractères Unicode, par exemple lorsqu'on cite des textes non-anglo-saxons. Ainsi, la bibliographie du RFC 5933 pourrait inclure :
[GOST3410] "Information technology. Cryptographic data security. Signature and verification processes of [electronic] digital signature.", GOST R 34.10-2001, Gosudarstvennyi Standard of Russian Federation, Government Committee of Russia for Standards, 2001. (In Russian) "Информационная технология. Криптографическая защита информации. Процессы формирования и проверки электронной цифровой подписи", GOST R 34.10-2001, Государственный стандарт Российской Федерации, 2001.
Le second texte étant l'original russe.
Les règles exactes figurent dans la section 3. D'abord, on peut mettre du « non-ASCII » comme on veut quand il fait partie d'un exemple. Ainsi, la communication XMPP pourrait être décrite de manière plus naturelle. Au lieu de cet exemple de communication en tchèque (RFC 6121) :
<message from='juliet@example.com/balcony' id='z94nb37h' to='romeo@example.net' type='chat' xml:lang='en'> <body>Wherefore art thou, Romeo?</body> <body xml:lang='cs'> PročeŽ jsi ty, Romeo? </body> </message>
On pourra écrire la forme lisible :
<message from='juliet@example.com/balcony' id='z94nb37h' to='romeo@example.net' type='chat' xml:lang='en'> <body>Wherefore art thou, Romeo?</body> <body xml:lang='cs'> PročeŽ jsi ty, Romeo? </body> </message>
Ensuite, on peut utiliser le « non-ASCII » pour les cas cités plus haut (noms d'auteurs, textes non-anglophones dans la bibliographie, etc). Pour les exemples utilisant un langage de programmation, notre RFC spécifie qu'il faut suivre les règles du langage en question. Ainsi, Python 3 autorisant l'Unicode même dans les noms de variables, on peut écrire :
a = "chocolat" b = "café" # Accentué ç = "lait" print(a+b+ç)
Enfin, un petit mot sur la normalisation Unicode, pour rappeler que le format des RFC ne garantit rien à ce sujet (on aurait pu décider que NFC serait systématiquement utilisée...) et que les auteurs de RFC ne doivent donc pas compter dessus.
Le premier RFC publié avec des caractères Unicode a été le RFC 8187, en septembre 2017.
Date de publication du RFC : Décembre 2016
Auteur(s) du RFC : T. Hansen (AT&T
Laboratories), L. Masinter, M. Hardy
(Adobe)
Pour information
Première rédaction de cet article le 16 décembre 2016
Parmi les nombreux formats de publication des RFC prévus suite à l'adoption du nouveau format (RFC 7990), ce RFC décrit l'utilisation de PDF. On pourra donc, en suivant ces règles, avoir une jolie version papier des RFC.
Actuellement, les RFC peuvent bien sûr être imprimés mais c'est un peu tristoune (cf. annexe A). Avec le nouveau cadre de gestion des RFC, le format canonique du RFC sera du XML (RFC 7991), à partir duquel seront produits automatiquement (par des outils qui ne sont pas encore développés) divers formats. HTML sera sans doute le principal pour une publication en ligne (RFC 7992), mais il y a des partisans de PDF, surtout pour l'impression sur le bon vieux papier. Ce RFC 7995 décrit donc l'utilisation de PDF comme format de sortie pour les RFC. À noter que ce format, créé et piloté par une entreprise privée n'est pas à proprement parler un « format Internet » et est sans doute moins connu des participants à l'IETF que ne l'est HTML.
La norme PDF est déposée à l'ISO (ISO 32000-1) mais l'archaïque ISO ne distribue toujours pas librement ces documents. Si on veut apprendre PDF, il faut donc le télécharger sur le site d'Adobe.
Première question (section 2 de notre RFC), quelle version de PDF choisir ? PDF a évolué dans le temps, chaque version ajoutant de nouvelles fonctions. C'est aujourd'hui un format très complexe, difficile à mettre en œuvre complètement. C'est pour cela qu'il existe des profils de PDF, restreignant ce format pour des usages spécifiques. Ainsi, PDF/X est conçu pour l'échange de fichiers avec l'imprimeur. Pour les RFC, documents souvent normatifs, et à longue durée de vie, les exigences principales sont l'accessibilité et la stabilité. C'est ce que fournissent les profils PDF/UA (accessibilité) et PDF/A-3 (archivage à long terme).
Pour les RFC, les profils choisis sont la version 1.7 de PDF, suffisamment ancienne pour être gérée par la plupart des logiciels, le profil PDF/A-3 pour limiter le nombre de fonctions à gérer, et PDF/UA pour l'accessibilité.
La section 3 de notre RFC détaille ensuite toutes les exigences particulières des RFC, pour le format de sortie PDF. Je ne les commente pas toutes ici, seulement celles qui me semblent importantes. Par exemple, la délicate question des polices. PDF permet d'inclure une police dans le document, ou bien de se référer simplement à une police par son nom. Dans ce dernier cas, si le logiciel qui lit le PDF ne trouve pas exactement cette police, il se rabat sur une police « proche », avec un résultat qui n'est pas forcément satisfaisant. De toute façon, PDF/A, le profil « archivage » impose d'inclure la police utilisée, pour éviter de dépendre de logiciels futurs. À noter que cela peut impliquer de payer : peu de polices sont gratuites pour l'auteur. L'annexe C.4 discute des polices acceptables. Il y a les gratuites, mais sans support Unicode complet, comme Source Sans Pro, Source Serif Pro ou Source Code Pro. Bien meilleure du point de vue de la couverture Unicode, mais payante, est Skolar. L'idéal sera peut-être la nouvelle police Noto. Les RFC ayant maintenant le droit d'utiliser des caractères non-ASCII, mais avec des restrictions (cf. RFC 7997), il est possible que des caractères soient refusés par le RFC Editor uniquement parce qu'ils ne sont pas présents dans les polices utilisées.
Le choix des caractéristiques des polices (chasse fixe ou variable, empattement ou pas) devra suivre les mêmes règles que pour HTML et CSS, règles qui figurent dans le RFC 7993. À propos de HTML, notons d'ailleurs que notre RFC sur PDF demande que le PDF ressemble visuellement autant que possible au document HTML. Si vous écrivez un logiciel qui produit le PDF pour un RFC et que vous hésitez sur tel ou tel aspect graphique, consultez le RFC 7992 sur la sortie HTML.
Parmi les autres exigences pour la production de PDF, notre RFC demande qu'on évite les césures.
PDF permet de mettre des liens hypertextes. L'intérêt est faible puisque PDF est surtout utilisé pour le papier (si on regarde sur un écran PDF n'a aucun avantage par rapport au format bien plus ouvert qu'est HTML), mais le RFC prévoit quand même cette possibilité. Il y aura donc des liens, à la fois externes (vers des URL, y compris vers d'autres RFC et, dans ce cas, le RFC 7322 requiert que cela soit vers la page d'information officielle du RFC Editor) et internes (une section du RFC référençant une autre). Les liens internes sont parfois produits automatiquement (par exemple depuis la table des matières vers les sections du texte).
Un problème délicat est celui de la façon dont le texte est stocké dans le document PDF. PDF permet en effet plusieurs façons de réaliser ce stockage. Elles donnent le même résultat visuel mais se comportent différemment pour des fonctions comme la recherche de texte. Ainsi, le mot « IETF » peut être stocké comme une image, comme quatre lettres positionnées indépendamment, ou comme un mot unique. Le stockage en image posera évidemment des problèmes aux outils comme pdftotext (mais ce n'est pas forcément grave pour les RFC, on a toujours le source XML) ou aux outils de synthèse vocale, nécessaires aux malvoyants. Pour la recherche de texte, la solution du mot unique est certainement meilleure, même si elle ne permet pas une typographie aussi subtile. Mais il y a aussi le placement des phrases. La phrase « The IETF supports the Internet » peut être stockée comme cinq mots différents stockés indépendamment (y compris dans un ordre différent de celui de la phrase) et positionnés ensuite, ou bien comme un objet unique.
Notre RFC recommande d'au moins garder les mots dans l'ordre du texte (PDF/UA l'impose).
Pour les images, si le source XML contenait à la fois de
l'art ASCII et du
SVG, notre RFC impose bien sûr qu'on
utilise le SVG pour produire le PDF. Le texte alternatif aux
images, indispensable
pour l'accessibilité, doit être mis dans le PDF (dans la
propriété /Alt
).
Les métadonnées (noms des auteurs, date, etc) sont très utiles pour l'indexation et la recherche et doivent donc être mises dans le PDF. PDF a plusieurs façons d'embarquer des métadonnées, et la recommandation est d'utiliser XMP.
Parmi les zillions de fonctions de PDF, il peut agir en
container d'autres fichiers (oui, comme tar
ou AVI). Tous les logiciels PDF ne savent
pas extraire ces fichiers embarqués dans le PDF mais c'est une
fonction utile, au cas où. Le RFC recommande donc que des fichiers
utiles soient ainsi embarqués : le source XML du RFC, les codes
sources (dans les éléments <sourcecode>
du RFC), les images (dont les sources
SVG)...
Dernier point, les éventuelles signatures. Pour l'instant, il n'y a pas de mécanisme standard pour signer les RFC et en garantir l'authenticité mais, lorsque ce sera le cas, PDF permettra d'inclure une signature dans le fichier produit. (Cette fonction existe dans PDF depuis longtemps.)
Le RFC contient aussi trois annexes intéressantes. L'annexe A
est un historique de la relation compliquée entre les RFC et
PDF. Depuis longtemps, une version
PostScript du RFC était acceptée par le
RFC Editor et publiée, même si très peu
d'auteurs en ont profité. Cela concernait surtout les RFC ayant
des images ou des formules mathématiques comme les RFC 1119 ou RFC 1142. Le PDF produit
par le RFC Editor pour tous les RFC (ou par
) n'était,
lui, qu'une simple « impression » du RFC en texte brut.https://tools.ietf.org/
L'annexe B rappelle ce que doit faire un bon logiciel de production de contenu imprimé, avec découpage en pages. C'est plus dur que cela n'en a l'air, car il faut gérer les veuves et les orphelines, ne pas couper juste après le titre d'une section, ne pas couper les dessins en art ASCII, placer les tableaux intelligemment, etc.
Enfin, l'annexe C décrit une partie des outils disponibles pour le producteur de documents PDF. Si les logiciels de visualisation sont nombreux, il faut noter que tous n'ont pas la totalité des fonctions qu'utilise le format de sortie des RFC (par exemple les liens hypertexte). Du côté des imprimantes (le papier étant le but final de la plupart des documents PDF), certaines savent même gérer le PDF directement (dans les autres cas, ce sera au logiciel de visualisation de produire le format attendu par l'imprimante, souvent PostScript).
Et pour produire le PDF à partir du XML des RFC ? Une solution possible, puisqu'il existe une feuille de style XSLT (disponible en ligne) est de produire du FO qui sera ensuite transformé en PDF, par exemple avec FOP (je n'ai personnellement eu que des expériences décevantes avec FO). Mais il existe plein de bibliothèques qui produisent du PDF, et qui pourraient être utilisées.
Comme notre RFC impose l'utilisation de profils de PDF comme PDF/A, un outil important est le logiciel de vérification qui s'assure que le résultat est bien conforme aux exigences de ce profil. Pour l'instant, il semble qu'il n'existe pas grand'chose dans ce domaine. Il faudra donc compter sur l'outil de production de PDF pour qu'il fasse un travail correct.
Date de publication du RFC : Décembre 2016
Auteur(s) du RFC : P. Hoffman (ICANN), J. Hildebrand (Cisco)
Pour information
Première rédaction de cet article le 16 décembre 2016
Depuis la sortie du RFC 7990, le format canonique des RFC est le format XML. C'est un texte écrit en XML, selon le vocabulaire du RFC 7991 qui sera la version de référence, archivée et faisant autorité, pour tous les RFC. Comme les auteurs enverront souvent un XML imparfait, un outil de préparation sera nécessaire, pour compléter ce XML imparfait et permettre au RFC Editor de travailler sur une base sérieuse. Ce nouveau RFC décrit ce futur outil de préparation.
Ainsi, les outils qui travailleront sur le format canonique des RFC (par exemple les outils qui produiront le PDF, le HTML, etc) pourront compter sur un document complet et n'auront pas à gérer les écarts des auteurs : seul l'outil de préparation devra s'en soucier.
Cet outil de préparation servira aux RFC une fois qu'ils seront soumis au RFC production center (cf. RFC 8728) mais aussi aux Internet-Drafts pendant leur élaboration.
Dans le second cas (section 3 de notre RFC), le futur outil de préparation prendra un Internet-Draft en entrée et produira un document complet (par exemple avec addition des boilerplates).
Et ce sera à peu près la même chose lorsque le RFC sera presque fini. On passera la version finale dans l'outil de préparation, qui résoudra les références externes et ajoutera les éléments obligatoires manquants.
Bon, et en quoi vont consister exactement ces modifications ? Elle sont décrites dans la section 5, qui forme le gros de ce RFC. Contrairement à l'outil actuel idnits qui se contente de vérifier les Internet-Drafts, le nouvel outil va également corriger le texte, ajoutant des éléments, et changeant les valeurs erronées.
C'est ainsi que l'outil de préparation va traiter les éléments
XInclude, les remplaçant par la valeur
incluse. Il va traiter les DTD pour les
supprimer ensuite (donc, remplacer les entités par leur valeur, et
inclure les fichiers inclus par ce mécanisme). Ces deux actions
peuvent aujourd'hui être faites par l'outil
xmllint, avec xmllint --xinclude
--noent --dropdtd NOMDUFICHIER.xml
.
Outre ces mécanismes d'inclusion de XML, l'outil de préparation
va aussi traiter les inclusions spécifiques au vocabulaire du RFC 7991. Ainsi,
<artwork>
a un attribut
src
indiquant la source du graphique, et
l'outil de préparation va donc inclure ce graphique. (Idem avec
<sourcecode>
pour inclure le code source.)
Les instructions XML (PI, Processing Instructions) seront supprimées (ça, je ne sais pas le faire avec xmllint).
L'outil va valider le résultat produit, en utilisant la grammaire Relax NG du RFC 7991. Ça peut aujourd'hui se faire avec xmllint mais aussi avec rnv :
% rnv rfc-v3.rnc rfc-v3-sample.xml rfc-v3-sample.xml
ou bien avec jing :
% java -jar ./jing-20091111/bin/jing.jar -c rfc-v3.rnc rfc-v3-sample.xml
Parmi les nombreuses transformations possibles, citons l'ajout
(s'il n'était pas déjà présent) de l'élément
<seriesInfo>
qui indique s'il s'agit
d'un Internet-Draft ou d'un RFC, l'ajout d'un
élément <date>
s'il manque (sa valeur
étant la date du traitement), changement de l'ancien attribut
title
en name
, le
retrait des
commentaires XML...
Il est fréquent dans les Internet-Drafts de
voir des paragraphes qui ne devront pas être inclus dans le futur
RFC. C'est le cas s'ils contiennent des exemples réels qui
risquent de ne pas être éternels (les RFC peuvent durer longtemps
et ne sont jamais modifiés). C'est également le cas s'il s'agit de
l'état actuel des mises en œuvre d'un RFC, comme décrit dans le
RFC 7942. Dans le système actuel, ces
paragraphes sont marqués par un texte en langue naturelle. Dans le
nouveau vocabulaire du RFC 7991, ce sera
fait avec un attribut removeInRFC
. L'outil de
préparation pourra enlever automatiquement ce paragraphe quand il
préparera un RFC.
L'outil de prépartion devra également arranger le XML. Cela peut se
faire aujourd'hui avec xmllint (ses options
--format
ou bien
--pretty
). Par contre, il n'est pas prévu de
mettre le XML sous sa forme canonique.
Il y aura d'autres opérations faites par l'outil de préparation, voir le RFC pour les détails.
L'outil n'est pas encore développé, un appel d'offres a été lancé et les gagnants ont été les sociétés SeanTek et Elf Tools.
Date de publication du RFC : Décembre 2016
Auteur(s) du RFC : N. Brownlee (University of Auckland)
Pour information
Première rédaction de cet article le 16 décembre 2016
Dans la longue liste de RFC décrivant le nouveau format des RFC (commencez par le RFC 7990), ce document décrit l'utilisation de SVG pour faire (enfin) des graphiques dans les RFC.
Traditionnellement, en effet, seul le texte était possible dans
les RFC. (On pouvait toutefois faire des
graphiques en art ASCII, dont on imagine
bien que ce n'était ni très pratique à écrire - malgré l'excellent
mode Emacs picture-mode
,
ni très facile à lire.) Il y avait de bonnes raisons à cet état de
fait, notamment le manque d'un format d'images ouvert et largement
répandu. Je parle bien sûr d'images
vectorielles car, a priori, dans un RFC, il
y aura beaucoup plus de schémas que de photos.
Le processus de décision a été long et compliqué. En 2013, le RFC 6949 notait déjà la décision de permettre des images, en indiquant « Graphics may include ASCII art and a more complex form to be defined, such as SVG line art ». C'est désormais possible. Au fait, c'est quoi, SVG ? Il s'agit d'une norme d'un format d'images vectoriel, gérée par le W3C, et fondée sur XML. Voici un exemple d'un simple dessin en SVG :
<svg xmlns="http://www.w3.org/2000/svg" version="1.2"> <rect x="25" y="25" width="200" height="200" fill="white" stroke-width="4" stroke="black" /> <circle cx="125" cy="125" r="75" fill="black" /> <polyline points="50,150 50,200 200,200 200,100" stroke="black" stroke-width="4" fill="none" /> <line x1="50" y1="50" x2="200" y2="200" stroke="white" stroke-width="4" /> </svg>
Et voici son rendu :
Les RFC n'utiliseront qu'un sous-ensemble de SVG, spécifié ici. Il existe d'autres sous-ensembles de SVG comme SVG Tiny, prévu pour des équipements contraints, genre smartphones. Ce SVG Tiny a servi de base au SVG des RFC, sous-ensemble limité car on n'attend pas de dessins artistiques et compliqués dans les RFC.
SVG RFC est donc SVG Tiny moins les éléments permettant le multimédia et l'animation (pas de vidéos dans les RFC), l'interaction (pas d'interface utilisateur active dans un RFC), l'utilisation de langages de programmation (pas de JavaScript actif dans un RFC). Plusieurs autres restrictions ont été apportées : pas de couleur (RFC 6949, section 3.2), pas d'IRI, seulement des URI, et pas de choix arbitraire de police.
Comment on écrit du SVG ? S'il est évidemment possible de le faire entièrement à la main avec un éditeur ordinaire, gageons que peu de gens le tenteront. Notre RFC cite des éditeurs graphiques, produisant du SVG, comme les logiciels libres Inkscape et Dia. (Et, si on aime programmer en Python, il y a svgwrite, que je présente plus en détail à la fin.) Attention, Inkscape et Dia produisent du SVG généraliste, pas du SVG RFC, qui est plus restreint. (Je ne connais personnellement pas d'outil pour produire du SVG RFC, ou pour « réduire » un fichier SVG généraliste en enlevant tout ce qui n'appartient pas à SVG RFC. Un tel outil était prévu mais je ne sais pas où il en est. C'était une des fonctions attendues du futur svgcheck.)
Et l'accessibilité (section 4) ? Il est crucial que les RFC soient accessibles à tou·te·s, non seulement que que soit le matériel utilisé, mais également quels que soient les handicaps dont souffre leur propriétaire. C'est bien joli de vouloir ajouter des tas de choses dans les RFC mais encore faut-il ne pas creuser ainsi davantage le fossé entre les utilisateurs. Ainsi, accepter de la couleur (le RFC 6949 limite les futurs RFC au noir et blanc) fait courir le risque que les daltoniens ne puissent pas comprendre un RFC. De même, les graphiques, qui ont l'air comme ça d'être une bonne idée, peuvent aggraver la situation des malvoyants. Le texte seul peut toujours être lu à voix haute par un synthétiseur de parole mais pas le graphique. Comme le note le RFC avec humour, « lire le source SVG à voix haute ne va pas le faire ».
Le texte « Tips for Creating Accessible SVG » donne des bons conseils pour faire du SVG accessible. Et il y a bien sûr la norme ARIA, dont il existe une introduction et de bons exemples. (Désolé, je n'ai pas suivi ces excellents principes dans les exemples ci-dessous, mais j'accepte les patches.)
Si vous voulez voir des exemples concrets, regardez https://www.cs.auckland.ac.nz/~nevil/SVG_RFC_1.2/
. Ainsi,
l'exemple de schéma d'un en-tête TCP
donnera :
Et le schéma de la communication SIP du
RFC 4321 fera
L'annexe A de notre RFC donne un schéma complet (formulé en
Relax
NG) du SVG des RFC. Il est extrait ici dans le fichier
svg-rfc.rnc
, que vous pouvez utiliser pour tester
la conformité de vos SVG. Par exemple, avec
rnv :
% rnv files/svg-rfc.rnc files/tcp-header.svg files/tcp-header.svg
En revanche, avec du SVG trop « riche » (ici, utilisant les couleurs), on aurait :
% rnv files/svg-rfc.rnc /tmp/test1.svg ... /tmp/test1.svg:2:267: error: attribute ^fill with invalid value "red" required: value ^token "none" value ^token "black" value ^token "white" value ^token "#000000" value ^token "#FFFFFF" value ^token "#ffffff" value ^token "inherit"
Une alternative, pour tester la validité des SVG conformes à ce profil, sera svgcheck quand il sera développé.
Avec Inkscape, il faut veiller à sauver le
fichier en Plain SVG (autrement, on a des
ennuis avec les éléments spécifiques d'Inkscape,
ex-Sodipodi). Mais il reste malgré cela deux ou trois trucs à
corriger manuellement, avant que le document produit par Inkscape
soit accepté. Pour Dia, il faut utiliser
l'action Export (par défaut, Dia n'enregistre
pas en SVG), mais Dia produit alors un document avec une
DTD. Si on la retire (manuellement, ou bien
avec xmllint --dropdtd
), tout se passe bien,
le document SVG est alors conforme au profil demandé pour les
RFC.
Autre solution que j'aime bien pour faire du SVG, dès qu'on a des éléménts répétitifs et qu'on veut donc automatiser (en Python), svgwrite. Ce schéma en art ASCII :
+--------------+ +----------------+ | Alice |------------------------------------| Bob | | 2001:db8::1 | | 2001:db8::2 | +--------------+ +----------------+
aurait pu être créé avec svgwrite avec network-schema-svgwrite.py
, qui donne
Bien sûr, pour un schéma aussi simple, le gain n'est pas évident, mais il le devient pour les schémas comportant beaucoup d'éléments récurrents. Mais notez que svgwrite ne connait pas le profil « SVG pour RFC » et, par défaut, peut donc produire des SVG invalides (par exemple avec de la couleur). Le programmeur doit donc faire attention.
Date de publication du RFC : Décembre 2016
Auteur(s) du RFC : H. Flanagan (RFC Editor)
Pour information
Première rédaction de cet article le 16 décembre 2016
Le nouveau format des RFC, décrit dans le RFC 7990, prévoit un format canonique, XML, à partir duquel seront automatiquement produits des versions texte brut, PDF, etc. Il y aura évidemment la possibilité de produire une version HTML (RFC 7992) et celle-ci sera bien sûr « stylée » avec CSS. Ce RFC décrit donc le cahier des charges de la feuille de style CSS à développer, avec tous les mots-clés du moment (comme responsive design).
Cette future feuille de style sera le style par défaut (le lecteur pourra toujours la redéfinir). Son but (section 2 du RFC) est de respecter le contenu du RFC (ceux-ci sont parfois des normes : pas question de toucher au texte !) tout en permettant une accessibilité maximale, pour tous les lecteurs, quelle que soit la machine qu'ils utilisent pour accéder au Web.
Plus précisément, la section 3 exige de :
La section 4 donne ensuite les principes de présentation à suivre. Je ne vais pas les reprendre ici dans leur intégralité mais on y trouve :
Il y aura également une feuille de style pour l'impression (comme pour le blog que vous êtes en train de lire, d'ailleurs.) La police par défaut sera cette fois avec empattement.
Enfin, la section 7 et l'annexe A de notre RFC font la liste des classes CSS
employées. Par exemple, .pilcrow
sera utilisé
pour les marques de paragraphe, qui ne seront affichées que
lorsque le pointeur passera dessus. .url
servira à marquer les URL de manière
visuellement distinctive. La classe .cref
ne
servira que dans les
Internet-Drafts, pour
afficher les commentaires, mais pas dans les RFC (où les
commentaires des auteurs sont supprimés).
La merveilleuse feuille de style qui met en œuvre ces exigences n'est pas encore finie. Un appel d'offres a eu lieu (après relecture). Et on peut voir la feuille temporaire en ligne (pour le développement et les commentaires, c'est sur Github).
Date de publication du RFC : Décembre 2016
Auteur(s) du RFC :
H. Flanagan (RFC Editor)
Pour information
Première rédaction de cet article le 16 décembre 2016
Dans la grande série des nombreux RFC spécifiant le nouveau format de ces documents (avec XML étant désormais la référence), ce court RFC décrit le format de publication « texte brut » des RFC.
En effet, si le format « texte brut » n'est plus la référence des RFC, ce format reste toujours utile. Dans le nouveau mécanisme (RFC 7990), il y a désormais plusieurs formats de publication, obtenus à partir du format canonique (celui qui est en XML). Le texte brut est l'un d'eux. Ce format, historiquement le seul utilisé par les RFC, ne disparait pas, mais perd de son importance. Il n'est plus qu'un des formats de publication parmi d'autres (comme HTML, voir le RFC 7992). Le RFC 6949 expliquait ce choix.
À noter que les RFC produits avant ce changement ne sont pas affectés : leur format de référence reste le texte brut (et en ASCII seul).
Bon, désormais, on aura un format de sortie (parmi d'autres) en « texte seul » ou « texte brut ». Mais c'est quoi, le texte brut ? Notre RFC reprend la définition du consortium Unicode : « du texte encodé pour les ordinateurs composé uniquement de points de code d'une norme donnée, sans instructions de format ou de structure ». Bref, les caractères indiqués ne valent que pour eux-mêmes, ils n'indiquent jamais de formatage ou de style. Selon cette définition, HTML, LaTeX et Markdown (RFC 7763) ne sont donc pas du texte brut. (La définition n'est pas 100 % parfaite. La norme Unicode, par exemple, inclut des caractères qui influencent le format.) Le texte brut est donc ce qui est le plus portable : tous les acteurs qui connaissent la norme de jeu de caractères sous-jacente (aujourd'hui, quasiment toujours Unicode) peuvent lire et écrire du texte brut. C'est d'ailleurs une des raisons pour lesquelles les RFC ont si longtemps gardé ce format comme format canonique.
Mais si le texte brut n'est pas idéal comme format de référence, il reste un format de sortie très utile, notamment pour son interopérabilité, ou en raison de l'existence de nombreux outils qui peuvent le traiter (à commencer par grep...) Désormais, donc, le format canonique est le XML décrit dans le RFC 7991 et le texte brut sera produit automatiquement par les nouveaux outils. Mais ce texte brut a des règles qui sont légèrement différentes du texte brut original (« RFC canal historique ») et notre RFC 7994 les décrit. Il est très court, car le format « texte brut » est un format simple.
D'abord, le jeu de caractères (section 2). Ce sera
bien sûr Unicode, mais avec les
restrictions indiquées dans le RFC 7997. En pratique, là où les caractères non-ASCII ne
sont pas autorisés, il faudra utiliser l'ASCII équivalent, donné
dans les attributs XML prévus à cet effet
(ascii
, RFC 7991 en section 2.23.1,
asciiFullname
en 2.7.1, etc). L'encodage sera obligatoirement
UTF-8 (RFC 3629). Curieusement, il est prévu de mettre
une BOM au début du document.
Que faire avec les graphiques, désormais autorisés par le RFC 7990, et écrits en
SVG (RFC 7996) ? Ces graphiques sont, dans le source XML, à
l'intérieur d'un élément
<artwork>
. Comment les rendre dans du
texte brut (section 3 de notre RFC) ? D'abord, si le graphique
n'est pas en SVG mais dans le traditionnel art
ASCII (indiqué par
type=ascii-art
), on utilise cet art ASCII.
Autrement, notre RFC ne propose pas de solution générale. Il est
recommandé aux auteurs de diagrammes et schémas de prévoir une
alternative en art ASCII, même quand ils font du SVG.
Enfin, la section 4 du RFC couvre le problème de la « mise en page ». Un caractère de fin de page (U+000C) sera inclus automatiquement toutes les 58 lignes (les outils auront probablement une option pour ne pas inclure de telles marques). L'outil devra gérer le délicat problème des veuves et des orphelines. Les lignes feront 72 caractères, suivies de deux caractères marquant la fin (U+000D U+000A).
Les textes de début du RFC (RFC 5741) seront automatiquement mis comme avant, mais les en-têtes et pieds de page disparaissent. Autre disparition, il n'y aura plus, dans le format de sortie en texte brut, de numéros de pages dans la table des matières (dommage, je trouve, mais c'est au nom de la cohérence avec les autres formats de sortie).
Première rédaction de cet article le 7 décembre 2016
Qu'est-ce que ça peut bien être, « BCP 38 » ? Ce terme désigne un ensemble de documents de bonnes pratiques pour les acteurs de l'Internet, plus spécialement les opérateurs réseaux : il ne faut pas laisser sortir de son réseau des paquets ayant une adresse source usurpée. Le respect de ce principe permettrait de lutter contre certaines attaques par déni de service sur l'Internet. Ce principe est formalisé dans deux RFC, les RFC 2827 et RFC 3704.
« BCP » veut dire « Best Current Practice ». Le but de cet étiquetage est de pointer vers le ou les RFC qui décrivent la pratique en question. En effet, un RFC, une fois publié, n'est jamais modifié, alors que le monde, lui, change. C'est ainsi que le RFC 7525, parlant de TLS est décrit par l'étiquette BCP 195 : les bonnes pratiques, en matière de cryptographie, changent vite. Une étiquette BCP peut pointer plusieurs RFC. Un bon exemple est le BCP 47, sur les étiquettes de langue, qui pointe vers les RFC 5646 et RFC 4647.
Le problème que vise à résoudre ce BCP est celui de l'usurpation d'adresse IP par un
attaquant qui voudrait faire du déni de
service sans révéler son adresse, ou bien en faisant une
attaque par réflexion. Par défaut, dans
l'Internet, il est trivial d'émettre des datagrammes avec une
adresse source mensongère. BCP 38 dit que les opérateurs réseaux
devraient interdire cette pratique, en configurant leurs routeurs à
cette fin. Par exemple, si un FAI a deux
préfixes IP, 192.0.2.0/24
et
2001:db8::/32
, il n'y a aucune raison valable
de laisser sortir du réseau du FAI des paquets ayant comme adresse IP
source, mettons, 203.0.113.65
.
Notons qu'un déploiement systématique de BCP 38 résoudrait un certain nombre de problèmes de sécurité sur l'Internet, mais pas tous. Ainsi, si l'attaquant dispose d'un botnet, et fait une attaque directe (pas par réflexion), il n'a pas vraiment besoin de mentir sur ses adresses IP source, ce ne sont pas les siennes, de toute façon (usurper l'adresse source aurait quand même quelques avantages, ça dépend des cas).
Aujourd'hui, le déploiement de BCP 38 dans l'Internet n'est pas inexistant mais il est très inégal. Par exemple, la situation est bien meilleure en Europe qu'en Asie. Un attaquant qui veut faire de l'usurpation d'adresses IP a donc encore pas mal de réseaux à sa disposition.
Pourquoi est-ce que tout le monde n'a pas déployé BCP 38, malgré le très large consensus qui existe parmi les professionnels ? La principale raison est économique. Un opérateur qui déploie BCP 38 (tous les routeurs permettent de le faire, soit en n'autorisant que ses propres préfixes, soit par des astuces comme RPF) aide les autres. Imaginez l'ingénieur allant voir le directeur financier et lui disant « on va dépenser de l'argent, et le ROI ira entièrement à nos concurrents »... Comme en écologie, c'est donc un cas typique où le sacro-saint marché ne peut pas aboutir à une bonne solution.
Notez que tester si un FAI donné met en œuvre ou pas BCP 38 est
un peu plus compliqué que cela peut sembler au premier abord. Je
connais par exemple une
box très utilisée en
France qui bloque les paquets IPv4 ayant
une adresse IP source usurpée (par effet de bord du
NAT) mais qui ne le fait que pour des
flots existants ou pour des paquets de
début d'un flot. Si on envoie un paquet TCP
sans bit SYN
, il passe malgré son adresse usurpée...
Quelques lectures pour approfondir :
Auteur(s) du livre : Andreas Antonopoulos
Éditeur : Merkle Bloom
9781537000459
Publié en 2016
Première rédaction de cet article le 5 décembre 2016
Ce petit livre rassemble le texte de plusieurs conférences d'Andreas Antonopoulos au sujet de Bitcoin. Les textes ont été édités, les erreurs corrigées, mais le ton reste celui des conférences de l'auteur, passionnantes et brillantes. Sa thèse principale est que le Bitcoin n'est pas juste une monnaie, c'est un mécanisme sur lequel on va pouvoir bâtir plein de nouvelles relations économiques, c'est l'Internet of money. Et les vieux dinosaures du monde actuel peuvent toujours critiquer, et prétendre que le Bitcoin n'a pas d'avenir, Antonopoulos démonte tous leurs arguments. (Les conférences elles-mêmes sont visibles en ligne.)
C'est donc vraiment le bouquin à faire lire aux gens qui expliquent doctement que le Bitcoin n'est pas une monnaie réelle, ou bien que ce n'est qu'une expérience d'une poignée de gusses dans leur garage. Antonopoulos est très pédagogue... et très militant.
Il n'a pas de mal à rappeler que les arguments contre le Bitcoin sont à peu près les mêmes que ceux employés par les messieurs sérieux et les experts médiatiques contre l'Internet (ou, puis-je ajouter, contre Unix et contre le logiciel libre) : c'est juste une expérience, ce n'est pas sérieux, c'est un truc de hippies libertariens, cela ne durera pas. Pourquoi croirait-on aujourd'hui ces mêmes experts ? D'où le titre du livre, qui fait allusion au fait que l'auteur prédit au Bitcoin le même succès que l'Internet : déranger les systèmes en place, permettre de nouvelles possibilités, reposer les questions. « Dire que le Bitcoin est une monnaie numérique, c'est aussi réducteur que dire que l'Internet est un téléphone amélioré. »
Un concept intéressant dans une des conférences est celui d'inversion de l'infrastructure. Au début, la nouvelle technologie utilise une infrastructure conçue pour la technologie précédente, et a donc bien du mal. Les premières voitures roulaient sur des routes prévues pour les chevaux. Ceux-ci ont quatre pattes et un bon équilibre, les trous ne les dérangeaient donc pas trop, alors qu'ils étaient redoutables pour les voitures. Petit à petit, les choses ont changé, l'infrastructure s'est inversée, et ce sont aujourd'hui les chevaux qui marchent sur une route goudronnée conçue pour les voitures. De même, l'Internet à ses débuts devait emprunter une infrastructure conçue pour le téléphone (et on avait besoin de modems, pour faire passer IP pour de la voix) alors qu'aujourd'hui, l'infrastructure s'est inversée, c'est la voix qui n'est plus qu'une des nombreuses applications qui utilisent l'infrastructure de l'Internet.
De la même façon, estime Antonopoulos, les services bancaires traditionnels continueront à exister, mais seront simplement des applications au-dessus de Bitcoin.
L'auteur est bien conscient que les adversaires du Bitcoin ne vont pas se contenter de le ridiculiser ou de le critiquer. Ils vont activement tenter de l'interdire. Il est très optimiste sur les chances du Bitcoin de résister à cette censure (dans le pire des cas, les transactions seront encodées en smileys dans les discussions des articles Wikipédia et ne pourront donc pas être stoppées...) Après tout, Bitcoin a déjà été testé au feu, d'innombrables attaques ont déjà visé cette monnaie, et le Bitcoin a toujours survécu. (Voir à ce sujet l'hilarant site « Bitcoin Obituaries » et l'amusante vidéo « Not this time ».)
Antonopoulos insiste sur le caractère « sans permission » du Bitcoin. Il n'y a pas de Président du Bitcoin, chacun avec une idée peut la mettre en œuvre sur la chaîne de blocs tout de suite, sans demander de permission. En tant que « programmable money », Bitcoin n'a pas seulement un usage (payer) mais tous les usages qu'on peut imaginer. (Le Bitcoin est neutre, au sens de « neutralité du réseau ».)
Antonopoulos fait remarquer que toutes les innovations ont été la cible d'innombrables critiques à leur début. (Il oublie de dire que certaines critiques étaient justifiées. Par exemple, il cite des déclarations anti-voiture des débuts de l'automobile, pointant les dangers mortels de cette technologie, dangers qui existent toujours.) Ces critiques semblent bien ridicules avec le recul, comme celles contre le Bitcoin sonneront moyenâgeuses dans le futur. Antonopoulos remarque avec justesse que ces critiques portaient souvent sur des points de détail, qui allaient évoluer avec le temps. Ainsi, les premières critiques des automobiles portaient sur la difficulté à les faire démarrer, problème réel mais qui a été vite résolu avec l'invention du démarreur. (Personnellement, je me souviens bien des premières démonstrations de l'Internet que je faisais au début des années 1990, où la plupart des remarques des gens portaient sur le caractère « peu convivial » des logiciels utilisés. Peu de gens étaient capables de voir l'intérêt de cette technologie, au-delà de problèmes ergonomiques temporaires.)
Dans une autre conférence, Antonopoulos revient sur la monnaie : de quand date t-elle ? Et, d'ailleurs, qu'est-ce qu'on appelle « monnaie » ? (Beaucoup de messieurs experts refusent de considérer le Bitcoin comme une monnaie car ils donnent de la monnaie une définition arbitraire et anti-historique du genre « la monnaie est le moyen de paiement décidé par un État, et régulé ».)
L'auteur insiste aussi sur l'importance pour les acteurs du monde Bitcoin de ne pas copier bêtement le vocabulaire du passé. Ainsi, il s'énerve (à juste titre) contre les articles mentionnant le Bitcoin et qui sont illustrés par... des pièces de monnaie. Il reconnait que c'est d'ailleurs en partie la faute du terme « bitcoin » qui est trompeur. De même, le terme de « portefeuille », souvent utilisé pour les logiciels de gestion de ses bitcoins, est erroné : on ne peut pas copier un portefeuille traditionnel, alors qu'il n'y a aucun problème à le faire avec un portefeuille Bitcoin (il ne stocke pas d'argent, mais des clés).
Autre exemple de l'erreur qu'il y a à copier aveuglément les anciennes techniques, les places de marché Bitcoin. Ces places n'ont rien de Bitcoin, ce sont des établissements financiers traditionnels et, notamment, leur modèle de sécurité n'est pas du tout celui de Bitcoin.
Compte-tenu de la marée médiatique anti-Bitcoin (et anti-cryptomonnaies en général), on a bien besoin d'un livre comme celui-ci, qui redresse la barre. Par contre, il ne faut pas y chercher une analyse balancée. On ne voit aucune critique sur les aspects problématiques du Bitcoin. Il faudra un autre livre pour cela. Un volontaire pour écrire une critique sérieuse du Bitcoin ? (Qui ne se limite pas à des points de détail spectaculaires comme l'identité de Nakamoto, ou à du simple conservatisme du genre « les banques n'en veulent pas » ?) En attendant, lisez le livre, et écoutez les conférences d'Andreas Antonopoulos, vous ne le regretterez pas.
Date de publication du RFC : Novembre 2016
Auteur(s) du RFC : W. Hardaker
(USC/ISI), O. Gudmundsson
(CloudFlare), S. Krishnaswamy
(Parsons)
Réalisé dans le cadre du groupe de travail IETF dnsop
Première rédaction de cet article le 4 décembre 2016
Normalement, en 2016, tous les résolveurs DNS sérieux devraient valider avec DNSSEC. Mais ce n'est pas le cas. Il y a plusieurs raisons à cela, mais ce nouveau RFC se focalise sur un problème précis : le cas d'un résolveur connecté via un réseau pourri, non-neutre, et qui se permet d'interférer avec le transport des paquets IP, menant le résolveur à de sérieuses difficultés. Comment détecter ces réseaux pourris ? Et que faire pour valider quand même ?
Si le résolveur est une grosse machine dans un centre de données, connectée directement à des opérateurs neutres, il n'y a pas trop de problème. C'est le cas des résolveurs des FAI, par exemple. Mais la situation est bien moins favorable à M. Michu. Si celui-ci veut, à juste titre, avoir son propre résolveur DNS sur sa machine, il dépend des réseaux où on laisse M. Michu se connecter, et ceux-ci sont rarement neutres. (Le RFC couvre le cas où ce résolveur local fait suivre - forwarde - les requêtes à un autre résolveur, et celui où il parle directement aux serveurs faisant autorité.)
La section 1.2 du RFC décrit les cas où la validation DNSSEC va être difficile ou impossible :
Bien des outils ont été développés pour contourner ces problèmes, comme dnssec-trigger.
Pour faire des tests des résolveurs et de tous les équipements
intermédiaires qui peuvent poser des problèmes de validation
DNSSEC dans certains cas, le RFC parle d'une zone de test nommée
test.example.com
. Elle n'existe pas en vrai
mais, aujourd'hui, la zone
test.dnssec-tools.org
fait la même chose
(elle est par exemple utilisée pour les travaux pratiques lors de
la formation DNSSEC chez HSC). Cette zone
est délibérement peuplée avec des noms mal signés. Ainsi, le nom
badsign-aaaa.test.dnssec-tools.org
a un
enregistrement AAAA dont la signature a été modifiée, la rendant
invalide. Testons (pour tous les tests, comme le but était de voir
le comportement DNSSEC, j'ai utilisé un fichier de configuration
~/.digrc
contenant +dnssec
+multiline
, merci à Landry Minoza de l'avoir remarqué) :
% dig AAAA badsign-aaaa.test.dnssec-tools.org ; <<>> DiG 9.9.5-9+deb8u8-Debian <<>> AAAA badsign-aaaa.test.dnssec-tools.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 60910 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags: do; udp: 4096 ;; QUESTION SECTION: ;badsign-aaaa.test.dnssec-tools.org. IN AAAA ;; Query time: 3759 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Sun Dec 04 17:12:28 CET 2016 ;; MSG SIZE rcvd: 63 % dig +cd AAAA badsign-aaaa.test.dnssec-tools.org ; <<>> DiG 9.9.5-9+deb8u8-Debian <<>> +cd AAAA badsign-aaaa.test.dnssec-tools.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29404 ;; flags: qr rd ra cd; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 5 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags: do; udp: 4096 ;; QUESTION SECTION: ;badsign-aaaa.test.dnssec-tools.org. IN AAAA ;; ANSWER SECTION: badsign-aaaa.test.dnssec-tools.org. 86400 IN AAAA 2001:470:1f00:ffff::1 badsign-aaaa.test.dnssec-tools.org. 86400 IN RRSIG AAAA 5 4 86400 ( 20170101064820 20161202054820 19442 test.dnssec-tools.org. nZ8bPLBleW/sW6x135+Iz4IhO6Lr04V8C9fC1bMVfCVY 3rKqbOoBk1i+wnnGDCTWQ5iCicWTKLIpbDmCSW9C33pj P2j7C/ensspbdwpD/7Ia8zN+XUSN+ThLU6lgYGKFuoVL QmIG/vr1lOn6xdjXY2E4mStAjaGuertvKKDYy/I= ) ;; AUTHORITY SECTION: test.dnssec-tools.org. 280 IN NS dns1.test.dnssec-tools.org. test.dnssec-tools.org. 280 IN NS dns2.test.dnssec-tools.org. test.dnssec-tools.org. 280 IN RRSIG NS 5 3 86400 ( 20170101064820 20161202054820 19442 test.dnssec-tools.org. AK95JOAuvfZ1ZwEsrKiR8DP1zluoBvBkXHRXa78rrK5U UuZdLnZwnYlnNplrZZOrQNuUaPyb4zI0TGfw/+aa/ZTU qyx8uQODSHuBTPQTlcmCFAfTIyd1Q+tSTEs2TuGUhjKe H9Hk+w6yOjI/o52c2OcTMTJ4Jmt2GlIssrrDlxY= ) ;; ADDITIONAL SECTION: dns1.test.dnssec-tools.org. 280 IN A 168.150.236.43 dns2.test.dnssec-tools.org. 280 IN A 75.101.48.145 dns1.test.dnssec-tools.org. 86400 IN RRSIG A 5 4 86400 ( 20170101064820 20161202054820 19442 test.dnssec-tools.org. zoa0V/Hwa4QM0spG6RlhGM6hK3rQVALpDve1rtF6NvUS Sb6/HBzQOP6YXTFQMzPEFUza8/tchYp5eQaPBf2AqsBl i4TqSjkIEklHohUmdhK7xcfFjHILUMcT/5AXkEStJg7I 6AqZE1ibcOh7Mfmt/2f0vj2opIkz6uK740W7qjg= ) dns2.test.dnssec-tools.org. 86400 IN RRSIG A 5 4 86400 ( 20170101064820 20161202054820 19442 test.dnssec-tools.org. hGq7iAtbHrtjCYJGMPQ3fxijhu4Izk8Ly+xZOa0Ag24R lqpFgdd2amDstFVLTRs3x15UqQIO+hmFdlbSOterDkbg /o2/FhtZOJr7c75Pu3EWi/DDbT9pULk4Uwjlie1QBopv LLZ94SlqKO7eQ02NRyy5EL4gD2G5rSffsUqEkj8= ) ;; Query time: 206 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Sun Dec 04 17:12:44 CET 2016 ;; MSG SIZE rcvd: 885
Le second test, celui fait avec le bit CD (Checking Disabled), montre que le problème vient bien de DNSSEC. Autre test, avec une signature expirée :
% dig A pastdate-a.test.dnssec-tools.org ... ;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 46319 ... % dig +cd A pastdate-a.test.dnssec-tools.org ... ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49547 ;; flags: qr rd ra cd; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 5 ... ;; ANSWER SECTION: pastdate-a.test.dnssec-tools.org. 86400 IN A 64.90.35.104 pastdate-a.test.dnssec-tools.org. 86400 IN RRSIG A 5 4 86400 ( 20161201224321 20161101234821 19442 test.dnssec-tools.org. lIL0zcEZpG/4uG5hImvpivH1C/D3PFI3RNYHlPbZ [...]
La liste de tous les noms à tester est en ligne.
Le but de ce RFC est de lister tous les tests que peut et devrait faire un validateur local, pour arriver à valider malgré des résolveurs amont, ou bien un réseau, hostile. Ces stratégies sont mises en œuvre, par exemple, dans dnssec-trigger.
En détectant la non-conformité (compliance, un terme à la mode dans les organisations), le validateur situé sur la machine terminale, ou bien dans le réseau local, peut alors adopter la meilleure stratégie de contournement (ou, dans le pire des cas, prévenir loyalement l'utilisateur qu'on ne pourra pas faire de validation DNSSEC). Les tests doivent être faits au début d'une nouvelle connexion réseau, ou bien lorsque celle-ci change.
La section 3 du RFC est consacrée à ces tests de
non-conformité. Je ne vais pas décrire la totalité de ces tests,
un sous-ensemble suffira. Ainsi, le premier test, le plus trivial,
est que la machine puisse parler en UDP à son résolveur attitré (celui
typiquement reçu en DHCP). On lui demande
good-a.test.dnssec-tools.org
et on doit avoir
une réponse sous forme d'une adresse IP (comme son nom l'indique, ce nom est correctement
signé). Si un test aussi trivial ne marche pas, ce n'est sans
doute pas la peine d'aller plus loin. Un peu plus subtil, on teste
le même résolveur en TCP.
Après, on passe à EDNS (RFC 6891), qui est indispensable pour DNSSEC. Une requête pour ce même nom, mais avec une option EDNS, doit passer. Si EDNS ne marche pas, on peut arrêter, DNSSEC ne marchera pas non plus. Mais s'il marche ? On teste alors avec le bit DO (DNSSEC OK) qui indique au serveur qu'il doit envoyer les données DNSSEC, notamment les signatures. La réponse doit inclure ce même bit DO. (C'est plus tard qu'on teste qu'on a bien reçu des signatures. Rappelez-vous que la plupart des middleboxes sont horriblement boguées. Certaines acceptent le bit DO et le renvoient, sans pour autant transmettre les signatures.)
On teste alors des zones qu'on sait signées et on regarde si le
résolveur met le bit AD (Authentic Data), au
moins pour les algoritmes RSA
+ SHA-1 et RSA +
SHA-256. Si cela ne marche pas, ce n'est
pas forcément une erreur fatale, puisque, de toute façon, on
voulait faire la validation nous-même. Il faut aussi penser à
faire le test inverse : un résolveur validant doit mettre le bit
AD pour une réponse signée correctement, et doit répondre avec le
code de retour SERVFAIL (Server Failure) si la
réponse devrait être signée mais ne l'est pas, ou bien l'est
mal. Cela se fait en testant badsign-a.test.dnssec-tools.org
.
Dans les enregistrements DNSSEC, il n'y a pas que les
signatures (RRSIG), il y a aussi les enregistrements servant à
prouver la non-existence, NSEC et NSEC3. Il faut donc également
tester qu'ils sont reçus car, en pratique, on voit en effet des
middleboxes qui laissent passer les RRSIG mais
bloquent stupidement les NSEC et les NSEC3. On demande donc
non-existent.test.dnsssec-tools.org
, et on
doit récupérer non seulement une réponse avec le code NXDOMAIN
(No Such Domain) mais également les NSEC ou
NSEC3 permettant de valider cette réponse :
% dig AAAA non-existent.test.dnsssec-tools.org [...] ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 40218 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 8, ADDITIONAL: 1 [...] ;; AUTHORITY SECTION: h9p7u7tr2u91d0v0ljs9l1gidnp90u3h.org. 900 IN NSEC3 1 1 1 D399EAAB ( H9PARR669T6U8O1GSG9E1LMITK4DEM0T NS SOA RRSIG DNSKEY NSEC3PARAM ) iruevfos0vs8jssfj22me5p458p0qj1e.org. 900 IN RRSIG NSEC3 7 2 86400 ( 20161222153046 20161201143046 3947 org. kgCZC/gE4ySP7eZUb1+2ORYRhTrvL5YBIHLCBK5F8pqK MXGJXJ/hX+8LLrg4jHJaER2AelUgUGywRn4uY80ajYpg eTuSGzRX1aVCKAR8UB80bX/YLUPUPKWOdfgxTekD4nZk eoi/9JNmIMZRc0cmMGp8LSVMqX98F2bVJnZro8U= ) iruevfos0vs8jssfj22me5p458p0qj1e.org. 900 IN NSEC3 1 1 1 D399EAAB ( IRVVBMC65HCBCFQNQS8NQFTAB943LCFU NS DS RRSIG ) vaittv1g2ies9s3920soaumh73klnhs5.org. 900 IN RRSIG NSEC3 7 2 86400 ( 20161222153046 20161201143046 3947 org. Nj/zvU0GB8vQ7bFfpSSWW+inE7RiOFjOpNc1K/TMnQqG QsKTLD9gBM8vgh3K1WdPXOCzthf/isDJAy2xLA/oRFFq KZ+Coo+33FManVmuyndGJ5bdgQqnpa0xGP7yOgjTfUsh Ff9HkX0mkzqYtWYzw0J7WnMPcOjmrlg26WsfwlU= ) vaittv1g2ies9s3920soaumh73klnhs5.org. 900 IN NSEC3 1 1 1 D399EAAB ( VAJB898DELVT5UJ4I9D1BRD2FRTBSCM1 NS DS RRSIG )
Certains serveurs DNS (ou, plus exactement, certains ensembles serveur+réseau+middlebox) n'acceptent que certains types d'enregistrement DNS (les plus connus, comme A, AAAA, MX, parfois SRV, etc). Il faut donc tester que le serveur accepte bien tous les types d'enregistrement,
Jusqu'à présent, on n'a testé que le résolveur « normal ». Même s'il ne valide pas, tant qu'il transmet fidèlement toutes les données DNS, on pourra au moins l'utiliser comme relais et cache. Par contre, dans certains cas, si on veut valider avec DNSSEC, il faudra complètement le court-circuiter. Ainsi, s'il ne transmet pas les signatures, on n'a pas d'autre choix que d'aller les demander à un autre résolveur, ou bien directement aux serveurs faisant autorité. Il faut donc tester qu'on puisse interroger ces serveurs, avec UDP et avec TCP. (Ce n'est pas toujours possible, certains réseaux violent tellement la neutralité de l'Internet qu'ils bloquent le port 53, celui du DNS.)
Avec DNSSEC, les réponses sont souvent de grande taille, et parfois fragmentées. Il faut donc tester que les fragments passent (ils sont souvent bloqués par des administrateurs réseau incompétents).
Une fois ces tests faits, il reste à synthétiser les résultats (section 4). L'idée est de pouvoir dire si le résolveur « normal » est :
En pratique, tous les résolveurs (ou plutôt l'ensemble du résolveur et du réseau situé devant, avec ses middleboxes qui cassent tout) ne rentrent pas parfaitement dans une de ces trois catégories. Ainsi, certains vont bloquer les fragments mais accepter TCP (ce qui permettra de quand même faire passer les données de grande taille), tandis que d'autres n'auront pas TCP mais qu'UDP fonctionnera bien, même en cas de fragmentation.
Une fois ces données collectées, et le résolveur correctement classé, on pourra alors déterminer comment contourner les éventuels problèmes (section 5 du RFC). Par exemple :
tcp80:
185.49.140.67
ou ssl443: 185.49.140.67
...
).La section 6 du RFC sert de voiture-balai, en mentionnant les
cas spéciaux qui peuvent être embêtants. Par exemple, DNSSEC
dépend de l'horloge, puisqu'il faut vérifier que les signatures
n'ont pas expiré. Mais la synchronisation de l'horloge dépend de
NTP donc parfois du
DNS si on a mis des noms de domaine dans son
ntp.conf
. Si la machine a une horloge assez
stable pour garder l'heure entre un arrêt et un démarrage, ce
n'est pas trop grave. Mais si la machine est un engin bon marché
avec une horloge qui dévie beaucoup (genre le Raspberry
Pi), que faire ?
Autre problème, les affreux portails captifs. Tant qu'on n'a pas cliqué sur « j'accepte cinquante pages de conditions d'utilisation que je n'ai pas lues, je veux recevoir du spam, et je promets de ne pas partager de la culture », on n'a pas un vrai accès Internet et le port 53 est sans doute bloqué. Il faudrait donc refaire les tests après le passage par le portail captif.
Face à ce genre de problèmes, une première solution est de ne pas tenter de faire du DNSSEC tant qu'on n'a pas synchronisé l'horloge, passé le portail captif (c'est ce que fait dnssec-trigger), au détriment de la sécurité. Au moins, on peut prévenir l'utilisateur et lui proposer de réessayer plus tard.
Date de publication du RFC : Novembre 2016
Auteur(s) du RFC : R. Danyliw (CERT)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF mile
Première rédaction de cet article le 1 décembre 2016
Pour rendre plus facilement analysables les innombrables rapports d'incidents de sécurité qui circulent sur Internet tous les jours, ce RFC spécifie un format standard XML, nommé IODEF, pour décrire ces incidents. Ici, il s'agit de la version 2 de ce format IODEF, la version 1 était dans le RFC 5070.
Tous les jours, des organisations comme les CERT et CSIRT, mais aussi les OIV, envoient et reçoivent des rapports détaillés concernant une attaque sur un réseau informatique ou un serveur. Ces rapports sont longs et détaillés mais, la plupart du temps, ce n'est pas une attaque isolée qui est intéressante, c'est l'image qui apparait lorsqu'on synthétise tous les rapports, et qu'on voit alors les tendances, par exemple l'arrivée d'un nouveau ver ou bien une attaque concertée contre un pays donné. D'où l'importance de pouvoir analyser automatiquement ces rapports, ce qui impose un modèle de données et un format standard, ce que fournit ce RFC.
Le modèle de données est proche des modèles
objet, par
exemple dans la descriptions des classes d'objets
manipulés (comme la classe Incident en section 3.2, avec la
cardinalité des attributs). Ces classes sont
composés avec des données élémentaires (booléens, entiers, dates)
décrites dans la section 2. Par exemple, parmi les attributs de la
classe Incident
, on trouve l'heure de début et de
fin de l'incident, l'heure de détection, etc. Le schéma XML complet, écrit en W3C Schema,
figure dans la section 8.
On trouve énormément de choses dans ce schéma (le RFC fait plus de
160 pages), pour traiter tous les cas prévus. Par exemple, on peut
exprimer une liste de ports comprenant à la fois des ports
individuels et des intervalles :
22,53,80,1024-2047
. De nombreuses classes
existent pour utiliser ces informations élémentaires. Ainsi, la classe
Discovery
, une nouveauté de la version 2, permet
d'indiquer comment l'incident a été découvert (avec un attribut
source
qui a vingt valeurs possibles, comme
av
- antivirus,
os-log
- journal,
passive-dns
- un système comme DNSdb, etc). Et
BusinessImpact
permet de décrire les conséquences
de l'incident sur l'activité (breach-privacy
,
loss-of-service
,
theft-financial
, etc). Ça peut même se quantifier
financièrement avec la classe MonetaryImpact
. Si
on met les incidents de sécurité dans une base de données (ça
s'appelle un SIEM, comme Prelude), on peut donc imaginer de regarder
d'abord les incidents qui ont coûté le plus cher...
Voici un exemple d'un rapport d'incident, tiré du RFC (section 7), et qui
décrit et qui décrit les systèmes de C&C
(quatre serveurs)
d'une campagne donnée (dans le RFC 5070,
l'exemple était une simple reconnaissance avec
nmap...). Cet exemple a l'avantage d'illustrer
la classe IndicatorData
, une nouveauté de la
version 2 :
<?xml version="1.0" encoding="UTF-8"?> <!-- A list of C2 domains associated with a campaign --> <IODEF-Document version="2.00" xml:lang="en" xmlns="urn:ietf:params:xml:ns:iodef-2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "https://www.iana.org/assignments/xml-registry/schema/ iodef-2.0.xsd"> <Incident purpose="watch" restriction="green"> <IncidentID name="csirt.example.com">897923</IncidentID> <RelatedActivity> <ThreatActor> <ThreatActorID> TA-12-AGGRESSIVE-BUTTERFLY </ThreatActorID> <Description>Aggressive Butterfly</Description> </ThreatActor> <Campaign> <CampaignID>C-2015-59405</CampaignID> <Description>Orange Giraffe</Description> </Campaign> </RelatedActivity> <GenerationTime>2015-10-02T11:18:00-05:00</GenerationTime> <Description>Summarizes the Indicators of Compromise for the Orange Giraffe campaign of the Aggressive Butterfly crime gang. </Description> <Assessment> <BusinessImpact type="breach-proprietary"/> </Assessment> <Contact type="organization" role="creator"> <ContactName>CSIRT for example.com</ContactName> <Email> <EmailTo>contact@csirt.example.com</EmailTo> </Email> </Contact> <IndicatorData> <Indicator> <IndicatorID name="csirt.example.com" version="1"> G90823490 </IndicatorID> <Description>C2 domains</Description> <StartTime>2014-12-02T11:18:00-05:00</StartTime> <Observable> <BulkObservable type="fqdn"> <BulkObservableList> kj290023j09r34.example.com 09ijk23jfj0k8.example.net klknjwfjiowjefr923.example.org oimireik79msd.example.org </BulkObservableList> </BulkObservable> </Observable> </Indicator> </IndicatorData> </Incident> </IODEF-Document>
Le RFC note sagement que le partage d'informations n'est pas uniquement une question technique, mais qu'elle dépend aussi des procédures bureaucratiques de chaque organisation, des contraintes légales, de la confiance (ou de l'absence de confiance, souvent justifiée) et enfin de la simple bonne ou mauvaise volonté. (Mon opinion personnelle est que, en France, le partage d'informations précises sur les incidents de sécurité est très insuffisant.)
Les changements depuis la version 1 (celle du RFC 5070) sont listés dans la section 1.4. Beaucoup de détails, beaucoup d'ajouts, parmi lesquels je note :
Contact
permette désormais d'indiquer une
adresse postale en un jeu de caractères quelconque,IndicatorData
ou
Discovery
cités
plus haut, ou comme DomainData
, pour des
informations sur un nom de domaine), et nouveaux attributs dans les classes
existantes (par exemple, Incident
y gagne
observable-id
, un identificateur qui peut être
utilisé dans des références croisées).
Si l'ajout de nouvelles classes ne rendent pas les anciennes
descriptions IODEF incorrectes, en revanche, certains changements cassent la compatibilité et un fichier
IODEF version 1 parfait ne sera pas forcément légal pour la version
2 (cf. section 4.4). Par exemple, la sous-classe
NodeRole
(qui permet de décrire si on est attaqué
par
une caméra de vidéosurveillance
ou bien par un routeur) a changé
de classe parente.
Et les mises en œuvre d'IODEF ? Un résumé de l'état de ces mises
en œuvre figure dans
l'Internet-Draft
draft-ietf-mile-implementreport
,
et qui référence une liste des programmes
IODEF (j'ai aussi trouvé celle-ci). Parmi d'autres, on peut noter la bibliothèque de
Prelude (et qui a une version pour l'IODEF v2 de
notre RFC), un
module Perl, un autre en
PHP, et un troisième
en Python. On trouve aussi des
moyens de connecter IODEF à des logiciels existants par exemple au
logiciel de suivi de tâche
Mantis, avec ce connecteur.
Pour des articles ou présentations sur IODEF, vous pouvez voir la Rump (session rapide) de Thomas Andrejak au SSTIC 2016 (vidéo en ligne).
Notez en France l'existence du projet SECEF (SECurity Exchange Format) qui a pour objectif de promouvoir et de faciliter l’usage des deux formats de fichier IDMEF (RFC 4765) et IODEF. Vous pouvez consulter leur Wiki, et leur tutoriel IODEF. Il y a aussi un article de synthèse sur SECEF, et un compte-rendu d'une de leurs réunions (mais vite fait et avec des erreurs). Enfin, le RFC 8274 donne quelques conseils sur la mise en œuvre d'IODEF.
Date de publication du RFC : Novembre 2016
Auteur(s) du RFC : Matthew Thomas, Allison Mankin, Lixia Zhang (UCLA)
Pour information
Première rédaction de cet article le 27 novembre 2016
Ce nouveau RFC est le compte-rendu d'un atelier qui s'était tenu du 8 au 10 mars 2014 à Londres sur le thème des « collisions ». Ce terme exagéré et sensationnaliste désigne le phénomène qui peut se produire quand un acteur de l'Internet a bêtement choisi de se créer un TLD à lui dans le DNS, et que ce TLD est ensuite créé par l'ICANN.
Supposons que l'entreprise Bidon décide de nommer ses
ressources internes (site Web réservé aux employés, etc) sous le
TLD inexistant
.bidon
. C'est une
mauvaise idée mais elle est fréquente. L'entreprise Bidon
compte sur le fait que ses employés utiliseront les résolveurs DNS
internes, qui ont été configurés pour reconnaître
.bidon
. Par exemple, avec
Unbound, et un serveur faisant autorité en 2001:db8:666::1:541f
, les résolveurs ont été configurés
ainsi :
stub-zone: name: "bidon" stub-addr: 2001:db8:666::1:541f
Si un employé
tente accidentellement d'accéder à une ressource en
.bidon
, alors qu'il n'utilise pas les
résolveurs de la boîte, la requête filera vers la racine du
DNS, qui répondra
NXDOMAIN
(No Such
Domain). C'est ainsi que la racine voit souvent des
requêtes pour des noms se terminant en
.local
, .home
ou
.belkin
. Si, quelques années après,
l'ICANN délègue effectivement ce TLD à une
autre organisation, ces requêtes à la racine donneront désormais
un vrai résultat. Au lieu d'un message d'erreur, le malheureux
employé sera peut-être redirigé vers un autre site Web que celui
attendu. C'est ce phénomène que Verisign
avait baptisé « collision » (name collision),
terme conçu pour faire peur.
C'est dans ce contexte qu'il y a plus de deux ans s'était tenu le « Workshop on Root Causes and Mitigation of Name Collisions », dont ce RFC est le compte-rendu tardif. Le premier rapport de l'ICANN qui mentionnait ce phénomène était le SAC 045 en 2010. Il pointait le risque que la délégation effective d'un nouveau TLD change la réponse obtenue, pour les clients mal configurés (qui interrogeaient à tort un résolveur extérieur, et donc la racine, au lieu de leurs résolveurs internes).
L'ICANN a même créé une page Web
dédiée à cette question, dont la source réelle est le
recouvrement de deux espaces de noms, l'interne et
l'externe. La bonne pratique idéale serait de ne pas utiliser de
noms qui n'existent pas ou, pire, qui existent avec une autre
signification dans l'arbre public des noms de domaine (et, là, relire le RFC 2826 peut aider). Pour reprendre l'exemple de
l'entreprise Bidon, si elle est titulaire de
bidon.fr
, elle devrait nommer ses ressources
internes avec des noms se terminant en
privé.bidon.fr
ou
interne.bidon.fr
. Si on ne veut pas faire les
choses proprement, et qu'on utilise quand même le TLD inexistant
.bidon
, alors il faut veiller très
soigneusement à séparer les deux espaces de nommage et à éviter
qu'ils ne se rencontrent un jour (ce qui est difficile à l'ère des
mobiles, avec des appareils qui rentrent et qui sortent du réseau
de l'entreprise). Sinon, on verra ces fameuses collisions.
En pratique, pas mal d'administrateurs système surestiment leurs compétences et croient qu'ils vont réussir à empêcher toute fuite vers le DNS public. C'est ce qui explique une partie des requêtes pour des noms inexistants que reçoit la racine (ces noms inexistants forment la majorité du trafic des serveurs racine du DNS). Un des problèmes de fond de l'Internet est en effet que l'administrateur de base ne se tient pas au courant et n'est pas informé des problèmes du monde extérieur. « Après moi, le déluge »
Autrefois, le problème était surtout théorique. Le nombre de
TLD n'avait pas bougé depuis de très
nombreuses années, et personne ne pensait que des TLD comme
.pizza
ou .green
verraient le jour. Mais, en 2012, l'ICANN a
lancé officiellement son programme d'ajout d'un grand nombre de
TLD, et le risque est soudain devenu une question pratique. D'où
l'atelier de 2014.
La section 2 du RFC revient en détail sur l'arrière-plan de ce
problème de collision. Outre le rapport SAC 045 cité plus haut, il
y avait eu une
déclaration de l'IAB, puis un autre rapport du
SSAC (Security and Stability Advisory
Committee, un comité de l'ICANN), le SAC 046,
une déclaration
du RSSAC et plein d'autres textes sur les conséquences d'un
agrandissement important de la zone racine. Par exemple, le rapport SAC 057 faisait remarquer que les
AC attribuaient souvent des certificats
pour des noms de domaine dans des TLD
purement locaux. Cela montrait le déploiement de ces TLD privés et
cela inquiétait. Si la société Bidon exploite
.bidon
et obtient d'une AC un certificat pour
www.compta.bidon
, après la délégation de ce
même TLD dans la racine publique, ce certificat pourrait être
utilisé pour usurper l'identité d'un autre serveur.
J'ai parlé plus haut des fuites vers le DNS public. Quelle est
leur ampleur exacte ? Ce n'est pas si évident que cela de le
savoir. Contrairement à un raccourci journalistique fréquent,
l'ICANN ne gère pas la racine. Chaque opérateur d'un
serveur DNS racine se débrouille
indépendamment, supervise son serveur mais ne rend pas forcément
compte à d'autres acteurs ou au public. En pratique, les
opérateurs des serveurs racine ont un niveau d'ouverture très
variable. (Cf. l'analyse
de l'ICANN à ce sujet.) Un des moments où plusieurs
opérateurs de serveurs racine collectent en même temps de
l'information est le Day in the Life of the
Internet et c'est sur la base de ces données qu'a
été fait le rapport d'Interisle « Name
Collision in the DNS ». Entre autres, ce rapport
classait les futurs TLD selon qu'ils présentaient un risque de
collision élevé ou faible (.home
,
.corp
et .site
se
retrouvaient en tête du classement). L'ICANN a alors publié un plan pour gérer ce risque de
collisions, notant que .home
et
.corp
étaient de loin les plus « risqués »,
car ils sont fréquemment utilisés comme TLD locaux. Bien d'autres
documents ont été publiés par l'ICANN, qui a une productivité
extraordinaire lorsqu'il s'agit de faire de la paperasse. Le
dernier
mettait en place le système dit de « controlled
interruption » qui, en gros, impose à tous les nouveaux
TLD de résoudre, pendant les premiers temps de leur délégation,
tous les noms de domaine vers l'adresse IP
127.0.53.53
. Voici l'exemple de
.box
en novembre 2016 (ce cas avait fait
l'objet d'un
article de Heise en allemand, car le routeur
Fritz!Box, très populaire en Allemagne,
utilisait ce TLD) :
% dig ANY box. ; <<>> DiG 9.10.3-P4-Debian <<>> ANY box. ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14573 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 24, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags: do; udp: 4096 ;; QUESTION SECTION: ;box. IN ANY ;; ANSWER SECTION: box. 3600 IN A 127.0.53.53 box. 3600 IN SRV 10 10 0 your-dns-needs-immediate-attention.box. box. 3600 IN TXT "Your DNS configuration needs immediate attention see https://icann.org/namecollision" box. 3600 IN MX 10 your-dns-needs-immediate-attention.box. box. 900 IN SOA a.nic.box. support.ariservices.com. ( 1478481375 ; serial 1800 ; refresh (30 minutes) 300 ; retry (5 minutes) 1814400 ; expire (3 weeks) 1800 ; minimum (30 minutes) ) box. 172800 IN NS b.nic.box. box. 172800 IN NS d.nic.box. box. 172800 IN NS c.nic.box. box. 172800 IN NS a.nic.box. [...] ;; Query time: 89 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Mon Nov 21 17:23:17 CET 2016 ;; MSG SIZE rcvd: 2938
Ces enregistrements ont pour but d'attirer l'attention des
utilisateurs sur le risque de collision. Le TLD étant récent et
pas encore peuplé, il ne devrait pas y avoir de requêtes DNS. S'il
y en a quand même, c'est peut-être le résultat d'une
collision avec un usage local. L'adresse IP
127.0.53.53
est une adresse locale à la
machine. Si M. Michu tente de se connecter à
http://quelquechose.box/
aujourd'hui, il sera
redirigé vers la machine locale. Il verra une erreur (pas de
serveur HTTP qui écoute) ou bien la page
Web par défaut de sa machine (avec un message peu informatif comme
« It works ») s'il y a un serveur HTTP. Si
l'utilisateur regarde les enregistrements SRV, MX ou TXT, ou bien
si un administrateur système regarde les
requêtes DNS qui passent, ou bien les
journaux du serveur de messagerie,
peut-être comprendra-t-il qu'il doit agir. (Je trouve
personnellement que la probabilité que cela arrive est assez faible.)
L'atelier lui-même, financé par Verisign (l'entreprise qui avait le plus crié « au loup » sur les name collisions), s'est donc tenu du 8 au 10 mars à Londres. Un site Web avait été mis en place pour cet atelier, et il contient les supports et les vidéos.
Je ne vais pas décrire tous les exposés de l'atelier, la liste complète figure dans l'annexe C du RFC, et les supports sont en ligne. Le RFC note qu'il y a eu plusieurs interventions sur la qualité des données du DITL (Day in the Life of the Internet) : il est trivial de les polluer (le DITL est annoncé publiquement, et à l'avance) par des requêtes artificielles. Aucune preuve n'a été trouvée d'une manipulation délibérée. De toute façon, les données montrent surtout qu'il y a beaucoup de n'importe quoi dans le trafic que reçoivent les serveurs racine (par exemple des requêtes avec le bit RD - Recursion Desired - alors que les serveurs de la racine ne sont pas récursifs). Cela peut être le résultat de bogues dans les résolveurs, de tests ou bien d'attaques délibérées.
La question de l'éducation des utilisateurs est revenue plusieurs fois. Faut-il s'inspirer du téléphone ou du système postal, qui ont tous les deux connu des changements qui nécessitaient une adaptation de l'utilisateur, qui s'est faite par le biais d'importantes campagnes de sensibilisation et d'éducation ?
Le comité de programme avait conclu que le sujet était loin d'être épuisé. Manque de données, manque de théories explicatives, manque d'intérêt pour la question, en tout cas, celle-ci restait largement ouverte après l'atelier (et je ne suis personnellement pas sûr que cela soit mieux aujourd'hui, plus de deux ans après l'atelier de Londres).
Date de publication du RFC : Octobre 2016
Auteur(s) du RFC : J. Laganier (Luminate Wireless), L. Eggert (NetApp)
Chemin des normes
Première rédaction de cet article le 26 novembre 2016
Le protocole HIP, décrit dans le RFC 7401 est très bien adapté au cas où l'adresse IP (le localisateur) change après l'établissement d'une association. Mais cela laisse ouvert le grand problème de la connexion initiale. Comment trouver une machine HIP ? Par le mécanisme de rendez-vous du RFC 8004 ? C'est certainement une bonne solution mais, alors, comment les machines HIP sont-elles connues du serveur de rendez-vous ? C'est là que notre RFC rentre en jeu pour normaliser un mécanisme d'enregistrement auprès d'un service. C'est un mécanisme générique, qui peut servir à d'autres choses que le rendez-vous, d'ailleurs. (Il était à l'origine spécifié dans le RFC 5203, que notre RFC remplace.)
Le mécanisme est très simple et le RFC court. On réutilise
simplement les établissements d'associations de HIP, avec de nouveaux
types de paramètres, notamment REG_INFO
(pour
l'hôte qui accepte d'être registrar, c'est-à-dire
d'enregistrer) et REG_REQUEST
(pour celui qui
demande un enregistrement). Le mécanisme exact est détaillé dans la
section 3 et les nouveaux
paramètres dans la section 4.
HIP authentifiant les deux parties bien plus solidement que IP seul, le registrar (terme d'ailleurs mal choisi, on risque de confondre avec les bureaux d'enregistrement de noms de domaine) peut alors décider s'il accepte l'enregistrement ou pas (sections 3.3 et 6).
Le rendez-vous, normalisé dans le RFC 8004 est donc une simple application de notre RFC mais d'autres pourront apparaître à l'avenir (comme celle du RFC 5770).
Quels sont les changements depuis le premier RFC, le RFC 5203 ? La principale est qu'HIP, qui avait le statut « Expérimental » est désormais sur le chemin des Normes et que les références de notre RFC ont donc changé (nouveau protocole HIP en RFC 7401). Mais ce nouveau RFC ajoute aussi la possibilité d'authentifier le registrar par certificat (RFC 8002), ainsi qu'un nouveau type d'erreur, le numéro 2, « ressources insuffisantes chez le registrar ».
Question mise en œuvre, je n'ai pas vérifié mais, normalement, HIP for Linux et OpenHIP devraient s'adapter aux nouveaux RFC HIP.
Date de publication du RFC : Octobre 2016
Auteur(s) du RFC : J. Laganier (Luminate Wireless,), L. Eggert (NetApp)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF hip
Première rédaction de cet article le 26 novembre 2016
HIP, par défaut, nécessite que l'initiateur d'une association connaisse le localisateur, l'adresse IP du répondeur. Si celui-ci bouge souvent, et qu'il n'est donc pas pratique de mettre cette adresse dans le DNS, une solution est d'utiliser le mécanisme de rendez-vous, décrit par ce RFC, où l'initiateur contacte un serveur de rendez-vous qui relaie vers le répondeur.
Le schéma est clairement expliqué dans la section 3 du RFC. En fonctionnement habituel de HIP, l'initiateur trouve l'identificateur et le localisateur du répondeur (typiquement, dans le DNS, cf. RFC 8005), puis le contacte directement. Si le localisateur n'est pas connu (ce qui est fréquent si le répondeur est un engin mobile, changeant souvent d'adresse IP), l'initiateur envoie le premier paquet (I1) au serveur de rendez-vous, qui le relaie au répondeur. Les autres paquets (R1, I2 et R2) seront transmis directement entre les deux machines HIP. Le mécanisme est détaillé dans la section 3.3 (il faut notamment procéder avec soin à la réécriture des adresses IP, en raison entre autre du RFC 2827).
Et comment l'initiateur trouve-t-il le serveur de rendez-vous ? En général dans le DNS, via les enregistrements de type HIP. Et comment le répondeur avait-il fait connaitre au serveur de rendez-vous son adresse IP ? Via le protocole d'enregistrement du RFC 8003, comme l'explique la section 4.
Comme toute indirection, le système de rendez-vous ouvre des problèmes de sécurité amusants. Si l'initiateur connaissait déjà l'identificateur du répondeur (donc sa clé publiqué), pas de problème, le passage par le serveur de rendez-vous ne diminue pas la sécurité. Si ce n'est pas le cas, alors, il n'y a rien à faire, l'initiateur n'a aucun moyen de vérifier l'identité du répondeur (section 5 du RFC).
Aucun changement depuis la première spécification, le RFC 5204, juste l'alignement avec la nouvelle version de HIP, celle du RFC 7401, désormais norme complète (et pas juste « expérimentale »).
Date de publication du RFC : Octobre 2016
Auteur(s) du RFC : J. Laganier (Luminate Wireless)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF hip
Première rédaction de cet article le 26 novembre 2016
Le protocole HIP n'avait pas à l'origine de mécanisme pour trouver l'identificateur d'une machine distante. Cela avait été fait dans le RFC 5205, qui permettait de trouver l'identificateur dans le DNS. Ce nouveau RFC remplace le RFC 5205.
HIP fait partie de la famille des protocoles qui visent à séparer l'identificateur du localisateur. Les identificateurs HIP se nomment les HI (Host Identifier) et, autrefois, le seul moyen de trouver l'HI d'une autre machine était d'attendre qu'elle vous contacte, ou bien de le configurer manuellement. Avec ce RFC, on peut trouver l'HI, comme une adresse IP, dans le DNS.
Notre RFC crée donc un nouveau type d'enregistrement DNS, nommé logiquement HIP (numéro 55), qui stocke, en échange d'un nom de domaine, le HI, son condensat (résumé) cryptographique - le HIT (Host Identifier Tag) - et les éventuels serveurs de rendez-vous, serveurs qui, dans le protocole HIP, servent d'intermédiaires facultatifs lorsqu'on veut contacter une machine distante (cf. RFC 8004).
Notre RFC permet de trouver l'identificateur à partir du nom mais pas le localisateur ; les serveurs de rendez-vous sont une solution possible pour cela ; une autre est d'utiliser les traditionnels enregistrements A et AAAA du DNS, le localisateur HIP étant une adresse IP.
Les localisateurs peuvent changer fréquemment alors que le DNS n'est pas temps-réel et ne change pas instantanément. Si un hôte HIP veut pouvoir être contacté malgré des changements d'adresse IP rapides, il vaut peut-être mieux qu'il utilise le système de rendez-vous du RFC 8004.
Curieusement (pour moi), le HIT est donc stocké dans les données DNS, alors que celles-ci n'offrent aucune sécurité au point que le RFC exige en section 4.1 de recalculer le HIT qui vient d'être obtenu dans le DNS.
Le tout ressemble donc aux enregistrements IPSECKEY du RFC 4025, ce qui est normal, le HI étant une clé cryptographique publique.
Voici un exemple d'enregistrement HIP tel qu'il apparaitrait dans un fichier de zone (sections 5 et 6 de notre RFC). On y trouve l'algorithme cryptographique utilisé (2 = RSA), le HIT (en hexadécimal), le HI (encodé en Base64) et les éventuels serveurs de rendez-vous (ici, deux, indiqués à la fin) :
www.example.com. IN HIP ( 2 200100107B1A74DF365639CC39F1D578 AwEAAbdxyhNuSutc5EMzxTs9LBPCIkOFH8cIvM4p 9+LrV4e19WzK00+CI6zBCQTdtWsuxKbWIy87UOoJTwkUs7lBu+Upr1gsNrut79ryra+bSRGQ b1slImA8YVJyuIDsj7kwzG7jnERNqnWxZ48AWkskmdHaVDP4BcelrTI3rMXdXF5D rvs1.example.com. rvs2.example.com. )
Par contre, je n'ai pas réussi à trouver encore ce genre d'enregistrement dans la nature.
L'ensemble du RFC est assez court, ce mécanisme d'annuaire qu'est le DNS étant simple et bien connu.
Quels sont les changements depuis le premier RFC, le RFC 5205 ? Évidement le passage sur le chemin des normes, faisant de HIP une norme complète. Mais aussi l'ajout de l'algorithme de cryptographie asymétrique ECDSA, et plusieurs clarifications du RFC original sur le format des enregistrements DNS, aussi bien leur format sur le réseau que dans le fichier de zone.
Date de publication du RFC : Octobre 2016
Auteur(s) du RFC : M. Stiemerling (Hochschule
Darmstadt, S. Kiesel (University of
Stuttgart), M. Scharf
(Nokia), H. Seidel
(BENOCS), S. Previdi (Cisco)
Pour information
Réalisé dans le cadre du groupe de travail IETF alto
Première rédaction de cet article le 22 novembre 2016
Il est fréquent aujourd'hui sur l'Internet qu'une application cherche à accéder à un contenu (mettons un film, ou bien la mise à jour d'un gros logiciel) qui est disponible à plusieurs endroits. Dans ce cas (qui est notamment fréquent pour le téléchargement en pair-à-pair), quelle source utiliser ? La « meilleure », bien sûr, mais comment la connaître ? Le but du protocole ALTO est de permettre de distribuer de l'information sur la topologie du réseau, afin que les applications puissent choisir la source la plus proche d'elles. ALTO est déjà normalisé (RFC 7285), ce nouveau RFC sert juste à décrire les scénarios d'usage et à donner des conseils pratiques de déploiement (déploiement qui semble très limité pour l'instant).
Outre le RFC décrivant le protocole (RFC 7285), il peut être utile de lire la description du problème qu'ALTO veut résoudre, le RFC 5693, et le cahier des charges, dans le RFC 6708.
La section 2 de notre RFC résume le fonctionnement d'ALTO. C'est un protocole client-serveur, le serveur ALTO connait l'information (la topologie du réseau, qui est connecté à qui, par quel genre de liens), le client est l'application qui veut accéder au contenu, il connait un ensemble potentiel de sources, et il veut savoir quelle est la « meilleure ». Par exemple, dans le cas de BitTorrent, le client a les adresses IP de l'essaim, il veut savoir à laquelle ou lesquelles demander les bouts de fichier (chunks) qui forment le contenu. Le client ALTO peut être un processus séparé, tournant en permanence, ou bien une bibliothèque liée à l'application. Il doit évidemment parler le protocole ALTO, donc connaitre HTTP et JSON.
Pour déployer ALTO, il y a donc quatre entités logiques à considérer :
Ces entités sont typiquement gérées par des organisations différentes. Un exemple typique (mais ce n'est pas la seule possibilité) est que le FAI soit à l'origine de l'information (il connait son réseau), et la mette dans un serveur ALTO qu'il gère, ses abonnés ayant installé une application de partage de fichiers qui inclut un client ALTO. Dans ce cas, il y aurait deux organisations, le FAI gérant les deux premières entités et l'abonné les deux dernières. Mais d'autres répartitions peuvent exister.
Les organisations qui peuvent être impliquées sont en effet multiples : FAI et opérateurs réseau, bien sûr, utilisateurs, évidemment (agissant, soit seuls, soit en groupes se répartissant le travail), mais aussi des tiers, spécialisés dans la collecte et la distribution de cette information (par exemple des CDN). On pourrait même voir apparaitre des sociétés qui ne font que de l'ALTO.
Tout ceci a des conséquences sur le déploiement. Par exemple, un utilisateur peut faire confiance à un FAI mais pas à des tiers. Un FAI peut souhaiter distribuer de l'information à ses abonnés mais pas à tout l'Internet. ALTO définit un protocole, pas une politique : ce protocole permet différents modèles, y compris celui de serveurs ALTO spécialisés et payants. Autre conséquence de l'utilisation de telle ou telle répartition du travail, on pourrait avoir des serveurs ALTO partiels, qui ne contiennent de l'information que sur certains réseaux.
Dans tous les cas, le RFC rappelle qu'ALTO est juste une optimisation : une application doit fonctionner même si elle ne trouve aucun serveur ALTO, ou bien s'ils sont en panne.
Un petit rappel utile sur ALTO : il existe deux modes de
fonctionnement différents, qui ont tous les deux des conséquences
importantes, notamment sur la confidentialité. Dans le premier
mode, le serveur ALTO fournit l'information qu'il a (sous forme de
maps, des ensembles de données sur le réseaux,
les liens, leur coût, etc) et le client
cherche dedans ce qui l'intéresse. Ce mode préserve la vie privée
du client (qui ne dit pas au serveur ce qui l'intéresse) mais pas
celle du serveur (qui doit tout envoyer). Il n'est pas évident que
beaucoup de FAI acceptent cela. Dans le second mode, le
serveur permet des interrogations sur un point particulier (« qui
est le plus proche de moi ? 192.0.2.87
,
203.0.113.122
ou bien
198.51.100.20
? »). Ce mode évite au serveur
de tout divulguer mais oblige en revanche le client à révéler ses
intentions (ici, les adresses IP des pairs potentiels, ce qui peut
intéresser des organisations répressives comme la
HADOPI). Notez que la fuite d'informations
du serveur
existe aussi dans le second mode : plusieurs clients ALTO peuvent
coopérer pour poser beaucoup de questions et extraire ainsi une
partie substantive de la base.
La partie 3 de notre RFC en vient aux conseils concrets pour les FAI. On considère que l'objectif du FAI est de minimiser ses coûts, donc a priori de garder le maximum de trafic en local (il y a des exceptions, que liste le RFC). Le serveur ALTO que gère le FAI va donc annoncer des coûts plus faibles pour les liens locaux.
Mais, d'abord, le FAI doit « remplir » le serveur ALTO avec de l'information. Cette étape d'avitaillement commence par la récolte d'informations sur le réseau. A priori, le FAI connait son propre réseau, et n'a donc pas de mal à récolter ces informations. Outre sa propre documentation interne, le FAI peut aussi utiliser de l'information issue d'autres sources, par exemple les protocoles de routage comme BGP (cf., entre autres, le RFC 7752) ou bien des mesures actives ou passives (cf. entre autres, le RFC 7491). Rappelez-vous qu'ALTO est uniquement un protocole permettant d'accéder à de l'information sur la topologie. Comment cette information a été récoltée et agrégée n'est pas de la responsabilité d'ALTO, de même que le protocole HTTP ne se soucie pas de comment est fabriquée la page HTML qu'il sert.
Le FAI doit ensuite appliquer ses critères (coût, performance, etc) à la topologie. Ces critères sont forcément imparfaits. Le client ALTO ne doit pas s'attendre à ce que l'information qui lui est donnée soit idéale dans tous les cas. Par exemple, le serveur ALTO peut indiquer un lien rapide et pas cher mais qui, au moment où le téléchargement commencera, sera saturé par un trafic intense (ALTO ne prétend pas être temps-réel). Et il y a bien d'autres choses qui ne seront pas connues de ceux qui ont compilé l'information, ou bien qui n'auront pas été incluses dans la base de données du serveur ALTO (« la carte n'est pas le territoire »). Les données distribuées par ALTO, les maps, sont supposées être relativement statiques. Mais, dans le monde réel, les choses changent et le client recevra donc peut-être une information légèrement dépassée.
Si vous trouvez le concept de map un peu abstrait, la section 3.5 du RFC donne plusieurs exemples. Par exemple, dans le cas le plus simple, celui d'un petit FAI ayant un seul opérateur de transit, les adresses dudit FAI seront dans le PID (Provider-defined IDentifier, cf. RFC 7285, section 5.1) 1, tout le reste de l'Internet étant le PID 2. Cela donnera une map (syntaxe décrite dans le RFC 7285, section 9.2) :
{ ... "network-map" : { "PID1" : { "ipv4" : [ "192.0.2.0/24", "198.51.100.0/25" ], "ipv6" : [ "2001:db8:100::/48" ] }, "PID2" : { "ipv4" : [ "0.0.0.0/0" ], "ipv6" : [ "::/0" ] } } }
Un FAI plus gros, et à la topologie plus complexe, a plein de possibilités. Par exemple, ses propres réseaux peuvent être dans des PID différents, s'il veut pouvoir garder le trafic local à un de ses réseaux. Un exemple est celui où le même FAI a des abonnés fixes et mobiles, et où on souhaite limiter les transferts des abonnés fixes vers les mobiles, pour réduire l'utilisation des liens hertziens.
Reste ensuite à effectuer le déploiement des serveurs ALTO. Il
existe plusieurs mises en œuvre logicielles d'ALTO et des compte-rendus d'expérience figurent dans
les Internet-Drafts
draft-seidel-alto-map-calculation
et draft-lee-alto-chinatelecom-trial
et dans le RFC 6875
(ainsi que, pour un protocole antérieur à ALTO, dans le RFC 5632). Cette
expérience montre que certaines façons de collecter l'information
peuvent être coûteuses : si un FAI a plusieurs liens avec
l'Internet, et reçoit un flux BGP complet,
et veut mettre chaque préfixe de la DFZ
dans ses maps, il doit prévoir des machines
assez costaud pour traiter cette information importante et assez
changeante. Et le résultat serait une map qu'il
serait difficile d'envoyer à tous les clients, vu sa taille. Il
faut donc prévoir, dans ce cas extrême, de l'agrégation vigoureuse
des préfixes IP.
La section 4 de notre RFC couvre ensuite l'utilisation d'ALTO, une fois qu'il est déployé. Normalement, tout le monde a intérêt à ce que ALTO soit utilisé : le FAI veut que les utilisateurs épargnent les liens réseaux les plus lents et les plus coûteux et les utilisateurs veulent les meilleures perfomances. En théorie, tout le monde trouvera son intérêt à utiliser ALTO.
Un exemple est celui de BitTorrent. Si les pairs BitTorrent incluent un client ALTO, chaque pair, quand il reçoit une liste d'adresses IP de l'essaim, peut alors interroger le serveur ALTO et trouver les « meilleurs » pairs. Ils peuvent même échanger cette information entre eux (PEX, Peer EXchange, dans le monde BitTorrent). Mais une autre possibilité est que ce ne soient pas les pairs qui interrogent le serveur ALTO mais le tracker (pour les essaims fonctionnant avec une machine qui sert de tracker, ce qui n'est pas toujours le cas). Ainsi, il n'est pas nécessaire de mettre un client BitTorrent dans chaque pair, c'est le tracker qui, grâce à l'information ALTO, choisit les meilleurs pairs pour chacun, et ne leur envoie que cela.
Le RFC se conclut pas une section 7 sur la sécurité. Parmi les problèmes à considérer, il y a le fait qu'un serveur ALTO malveillant, ou bien un serveur se faisant passer pour un serveur ALTO légitime, peut empoisonner le client avec de fausses données.
Auteur(s) du livre : Andreas Antonopoulos
Éditeur : O'Reilly
978-1-449-37404-4
Publié en 2015
Première rédaction de cet article le 20 novembre 2016
Vous voulez connaitre tous les détails techniques sur Bitcoin ? Voici un livre recommandé. À la fin, vous en saurez davantage que vous ne vouliez.
Le livre a été écrit par Andreas Antonopoulos, personnage connu dans le monde Bitcoin, et qui écrit de nombreux articles et donne plein de conférences (celle qu'il a donné à Paris le 11 octobre est en ligne, vous pouvez aussi voir les nombreux tweets que cela a entrainé et une excellente « storifycation de ces tweets). Son livre commence de manière très pédagogique, à travers des scénarios d'utilisation. Alice utilise Multibit pour acheter un café à Bob à Palo Alto, Bob fait refaire le site Web de son café à Gonesh, à Bangalore, et Jing mine du bitcoin à Shanghai. Au début, l'auteur fait peu de technique, se focalisant sur les applications.
Ensuite, cela devient plus technique, en commençant par l'installation d'un nœud Bitcoin (le livre n'est pas destiné à M. Michu). Andreas Antonopoulos explique le fonctionnement du client en ligne de commande qui permet de parler à son nœud Bitcoin. De la commande la plus triviale, permettant de savoir à quel bloc en est la chaîne locale :
% bitcoin-cli getblockcount 439785
à des commandes plus complexes, ici pour voir l'achat du café d'Alice :
% bitcoin-cli gettransaction 0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2
(Si vous obtenez le message d'erreur Invalid or non-wallet transaction id, c'est que vous n'avez pas bien lu le livre et les instructions qu'il donne pour accéder à toutes les transactions.)
À noter que les exemples ont été réellement faits sur la chaîne
publique Bitcoin, et peuvent donc être vérifiés. L'adresse d'Alice est
1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK
et on peut
donc voir toutes
ses transactions en ligne, de sa première obtention de 0,1
bitcoin auprès de son ami Joe (transaction 7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18
),
à l'achat du café à Bob (transaction 0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2
). Le
code QR de la demande de bitcoins de Bob,
dans le livre, est également un vrai, et on peut le lire (bitcoin:1GdK9UzpHBzqzX2A9JFP3Di4weBwqgmoQA?amount=0.015&label=Bob%27s%20Cafe&message=Purchase%20at%20Bob%27s%20Cafe
).
L'auteur pense aussi aux programmeurs et leur explique comment accéder aux données Bitcoin et les manipuler depuis un programme. Par exemple, en Python, avec la bibliothèque pycoin.
Je l'ai dit, ce livre, malgré ses premières pages très pédagogiques sur Bitcoin, est prévu pour les techniciens. Vous y trouverez même une explication de la cryptographie sur courbes elliptiques, permettant de décrire ensuite les différents formats de clés.
Les utilisateurs de l'autre chaîne de blocs Ethereum savent qu'une adresse Ethereum ne désigne pas forcément un compte mais peut référencer un programme qui sera exécuté lorsqu'on enverra quelque chose à cette adresse. Mais peu savent que cette possibilité existe dans Bitcoin depuis longtemps. Antonopoulos décrit donc en détail les différents types d'adresses Bitcoin, notamment les P2SH (Pay To Script Hash) où le paiement va déclencher l'exécution d'un programme qui pourra, par exemple, demander plusieurs signatures pour valider un paiement (la grande différence entre Ethereum et Bitcoin n'est pas la présence ou l'absence de programmes stockés dans la chaîne, elle est dans le fait que seul Ethereum a un langage de Turing ; au passage, le livre contient un court chapitre présentant rapidement quelques chaînes de blocs concurrentes). Il y a même un peu d'assembleur Bitcoin dans le livre (mais pas un cours complet sur ce langage).
Les gens du réseau aimeront également le chapitre sur le
fonctionnement pair à pair de Bitcoin et
sur la façon dont les nœuds Bitcoin échangent. Un petit coup de
bitcoin-cli getpeerinfo
et je vois que ma
machine Bitcoin a 124 pairs, dont 11 se connectent en
IPv6. 86 font tourner le logiciel de
référence Bitcoin Core et 30
sont basés sur BitcoinJ (ce sont surtout des
clients utilisant Multibit).
Je l'ai dit plus haut, ce livre n'est pas du tout nécessaire pour utiliser Bitcoin, ni même pour comprendre comment il fonctionne. En revanche, il est indispensable si vous voulez comprendre les points les plus délicats du fonctionnement de Bitcoin, comme les UTXO, la structure de la chaîne avec les arbres de Merkle, le fonctionnement de SPV... Difficile de trouver une question technique sur Bitcoin qui n'aurait pas de réponse dans ce livre.
Avertissement : j'ai acheté ce livre en payant en euros, pas en bitcoins. J'en profite pour rappeler que, si vous aimez ce blog, je veux bien des bitcoins.
Première rédaction de cet article le 17 novembre 2016
Le 16 novembre, deux pannes successives ont affecté les résolveurs DNS d'Orange. Que s'est-il passé exactement, et quelles conséquences peut-on en tirer ?
Commençons par les observations. Au moins, il s'agira de faits. Les deux pannes sont survenues approximativement entre 0840 UTC (soit quasiment en même temps que la plénière de l'IETF dont le thème était... « Attacks Against the Architecture » !) et 1030 pour la première, et entre 1315 et 1410 (toujours UTC) pour la seconde. N'ayant pas de compte chez Orange, j'ai utilisé deux sources d'informations, les rézosocios, où d'innombrables messages ont signalé la panne, et les sondes RIPE Atlas. Pour ces dernières, j'ai demandé des sondes se trouvant dans l'AS 3215, celui d'Orange (notez qu'il abrite des services très différents, ne dépendant pas forcément des mêmes résolveurs DNS). À ma connaissance, Orange n'a rigoureusement rien communiqué, ni pendant la panne (malgré les innombrables cris lancés par ses clients sur les rézosocios), ni après, donc je ne peux me fier qu'à ces observations. Les messages des utilisateurs d'Orange étaient pour la plupart trop vagues (« rien ne marche »), ne citant même pas un nom de domaine qu'on puisse ensuite tester. Personne hélas pour procéder à une récolte sérieuse de données, par exemple avec dig. Ces messages des utilisateurs ne peuvent donc servir qu'à signaler et confirmer qu'il y avait un gros problème. Mais les sondes Atlas nous en disent davantage.
Que nous montrent-elles ? Je prends par exemple le domaine de l'Université Stanford. Si je veux vérifier qu'il est bien visible, je demande à cent sondes RIPE Atlas de résoudre ce nom en adresse IP :
% atlas-resolve --requested 100 online.stanford.edu [] : 1 occurrences [171.67.216.22] : 33 occurrences [171.67.216.23] : 28 occurrences [171.67.216.21] : 37 occurrences Test #6935163 done at 2016-11-17T04:56:58Z
C'était le lendemain de la panne, et tout marche bien (une seule sonde n'a pas eu de réponse, et cela peut être de la faute de son réseau d'accès). Mais pendant la panne ? On voyait, en se limitant à l'AS 3215, des choses comme :
% atlas-resolve --requested 100 --as 3215 online.stanford.edu [TIMEOUT(S)] : 13 occurrences [ERROR: SERVFAIL] : 65 occurrences [171.67.216.22] : 8 occurrences [171.67.216.23] : 7 occurrences [171.67.216.21] : 7 occurrences Test #6934676 done at 2016-11-16T08:53:51Z
Regardons de plus près. La majorité des sondes RIPE Atlas situées dans
l'AS d'Orange n'a pu résoudre le nom, et a au contraire obtenu un code
SERVFAIL
(SERVer FAILure),
indiquant que le résolveur (je reviens sur ce terme plus loin) utilisé
n'a pu joindre aucun des serveurs faisant autorité pour le domaine
stanford.edu
. Pas mal de sondes n'ont simplement
pas eu de réponses de leur résolveur à temps.
Mais cette unique observation ne nous permet pas de dire que le problème venait d'Orange. Il est parfaitement possible que ce soit Stanford qui ait des ennuis, panne ou dDoS. Il faut donc, comme toujours lorsqu'on fait des observations scientifiques, comparer avec des mesures faites dans d'autres circonstances. Ici, on va simplement demander aux sondes situées dans un pays voisin, l'Allemagne :
% atlas-resolve --requested 100 --country DE online.stanford.edu [] : 1 occurrences [171.67.216.22] : 33 occurrences [171.67.216.23] : 31 occurrences [171.67.216.21] : 35 occurrences Test #6934677 done at 2016-11-16T08:54:06Z
Au pays de Konrad Zuse, toutes les sondes ou presque ont une réponse. Cela laisse entendre que tout va bien à Stanford et que le problème ne vient pas de l'université californienne. (J'aurais aussi pu tester avec un autre AS français, celui de SFR ou de Free.)
Autre façon de voir que le problème était bien chez Orange et pas du côté des domaines testés, essayer avec d'autres domaines :
% atlas-resolve --requested 100 --as 3215 kotaku.com [ERROR: SERVFAIL] : 47 occurrences [151.101.1.34 151.101.129.34 151.101.193.34 151.101.65.34] : 50 occurrences Test #6934730 done at 2016-11-16T10:10:01Z % atlas-resolve --requested 100 --as 3215 spotify.com [194.132.197.147 194.132.198.165 194.132.198.228] : 76 occurrences [ERROR: SERVFAIL] : 19 occurrences [TIMEOUT(S)] : 4 occurrences Test #6934675 done at 2016-11-16T08:52:10Z
Tous ces domaines marchaient parfaitement depuis d'autres AS ou d'autres pays.
Donc, problème de résolution DNS chez Orange. Comme l'ont vite
découvert bien des utilisateurs, changer de résolveur DNS
suffisait à résoudre le problème (ce qu'on pouvait également
tester avec ce programme atlas-resolve
et
l'option --nameserver
).
Notons bien, qu'il s'agissait des résolveurs DNS, pas des serveurs faisant autorité, comme cela avait été le cas récemment lors de l'attaque contre Dyn. La distinction est cruciale car ces deux types de serveurs DNS n'ont pas grand'chose en commun. Si vous lisez un article qui parle de « serveur DNS » tout court, sans préciser s'il s'agit d'un résolveur ou bien d'un serveur faissant autorité, méfiez-vous, c'est souvent un signe d'ignorance, ou de négligence, de la part de l'auteur de l'article.
Maintenant, les remarques. D'abord, beaucoup de gens (par exemple dans cet article de Numerama, mais aussi dans d'innombrables tweets) ont suggéré de passer des résolveurs DNS d'Orange (ceux utilisés par défaut par les abonnés à ce FAI) à ceux de Google Public DNS ou bien à ceux de Cisco OpenDNS. La plupart des sociétés à but lucratif doivent payer des commerciaux et des chargés de relation publique pour faire leur publicité, mais Google n'en a pas besoin, ayant des millions de vendeurs bénévoles et enthousiastes parmi ses utilisateurs. Mais ceux qui écoutent ces conseils et passent à Google Public DNS lui donneront les données personelles qui permettent leur propre surveillance (cf. le RFC 7626 sur le caractère sensible des requêtes DNS). Je ne développe pas davantage ce point ici, Shaft l'a fait mieux que moi. J'observe que, si ce genre de pannes continue, les utilisateurs français dépendront presque tous, pour une activité critique, d'un résolveur états-unien d'une entreprise privée. Cela devrait logiquement agiter ceux qui nous parlent tout le temps de souveraineté numérique, mais, en général, ces gens ne sont pas intéressés par les problèmes concrets et opérationnels.
Mais alors quelle serait la bonne solution ? Le mieux évidemment est d'utiliser des résolveurs proches, donc a priori dans le cas idéal, ceux de son FAI. Ceux-ci ne devraient pas tomber en panne, le DNS étant absolument indispensable à tout usage de l'Internet. Mais lorsque des pannes aussi longues surviennent, il est normal d'envisager d'autres solutions, et la bonne est certainement d'avoir un résolveur sur son réseau local (pas forcément sur chaque machine), ce qui est facile avec des équipements comme le Turris Omnia.
Notez qu'une minorité des sondes RIPE Atlas sont déjà sur
un réseau local qui utilise un tel résolveur. Cela explique en
partie pourquoi, dans les tests ci-dessus, un certain nombre de
sondes arrivaient à résoudre les noms de domaine, même au plus
fort de la panne. (Cela n'explique qu'une partie du phénomène. Il
semble que certains noms avaient un taux de réussites plus fort
que d'autres, ce qui ne peut pas s'expliquer par le choix du
résolveur.) Notez qu'on peut avoir l'adresse IP du résolveur
utilisé par la sonde (avec l'option --displayresolvers
) mais que
cela ne renseigne pas tellement. D'abord, c'est souvent une
adresse IP privée (RFC 1918), ensuite, le premier
résolveur vu par la sonde fait fréquemment suivre à un résolveur
plus gros, qu'on ne voit pas, et qui peut être ou ne pas être un
résolveur « officiel » du FAI. Je vous montre quand même le
résultat pour l'une des mesures faites ci-dessus (notez la bogue
pour le cas du timeout, où le résolveur n'est
pas connu) :
% atlas-resolve -r 100 --as 3215 --displayresolvers --measurement 6934670 kotaku.com [ERROR: SERVFAIL] : 27 occurrences (resolvers ['172.31.255.254', '192.168.1.1', '80.10.246.2', '192.168.2.1', '192.168.254.254', '192.168.3.1']) [151.101.1.34 151.101.129.34 151.101.193.34 151.101.65.34] : 69 occurrences (resolvers ['2a01:cb08:898c:fc00::1', '172.16.3.1', '192.168.1.1', '10.10.11.4', '10.63.0.252', '10.112.0.1', '8.8.8.8', '192.168.119.1', '192.168.1.9', '192.168.0.1', '10.0.0.34', '80.10.246.136', '192.168.248.153', '192.168.4.10', '192.168.1.40', '192.168.221.254', '149.202.242.66', '192.168.255.254', '192.168.28.1', '192.168.2.1', '10.0.0.1', '192.168.0.31', '194.2.0.20', '192.168.10.10']) [TIMEOUT(S)] : 4 occurrences (resolvers <__main__.Set instance at 0x7fedc8194f80>) Test #6934670 done at 2016-11-16T08:44:41Z
Deuxième sujet de réflexions sur cette panne, que s'est-il
passé ? En l'absence de toute communication de la part d'Orange,
on ne peut guère que spéculer. Notons tout de suite qu'il ne
s'agissait pas cette fois d'un détournement (comme lorsque Orange
avait redirigé Google et Wikipédia vers le Ministère de
l'Intérieur) mais d'une absence de réponse. Cette absence
dépendait des domaines. Je n'ai pas eu immédiatement de signalement d'un
problème pour un domaine hébergé en France, seulement pour des
domaines états-uniens (c'est après, donc trop tard pour les
mesures, que j'ai appris que des domaines hébergés en France
étaient également touchés). Comme le code de retour
SERVFAIL
indique que le résolveur n'a pas
réussi à parler aux serveurs faisant autorité, on peut donc
supposer que les liens menant à ces réseaux outre-Atlantique
étaient inutilisables. Suite à une erreur de configuration, par
exemple dans des ACL ? À un problème de
routage vers certaines destinations ? À une
attaque par déni de service ? Je ne le
sais pas. Mais je me demande bien quelle était la panne ou
l'attaque qui pouvait bloquer les résolveurs, tout en laissant
passer toutes les autres machines (puisque, une fois qu'on avait
un résolveur normal, le trafic n'était pas affecté).
Date de publication du RFC : Novembre 2016
Auteur(s) du RFC : S. Bortzmeyer (AFNIC), S. Huque (Verisign Labs)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF dnsop
Première rédaction de cet article le 9 novembre 2016
Tout le monde apprend à l'école que les noms de domaine sont organisés en un
arbre. (Et j'invite tout le monde à lire la
section 3.1 du RFC 1034, pour dire moins de
bêtises sur les noms de domaine.) Il en découle logiquement que, si un
nœud de l'arbre n'existe pas, les nœuds situés en dessous
n'existent pas non plus. C'est évident ? Hélas, non. En pratique,
bien des résolveurs DNS sont prudents et, lorsqu'ils reçoivent une
réponse négative pour un nom, mettons
foo.example
, ils n'enregistrent pas pour
autant le fait que les sous-domaines comme
bar.foo.example
n'existent pas non plus, et,
si un client leur demande des informations sur ce sous-domaine,
ils vont relayer la question aux serveurs faisant autorité, alors
qu'ils auraient parfaitement pu répondre à partir de leur
cache. Ce nouveau RFC remet les choses en
place : les noms de domaine sont organisés en arbre, ce
comportement traditionnel est donc bel et bien erroné, et un
résolveur devrait, lorsqu'il reçoit une réponse négative,
mémoriser le fait qu'il n'y a pas non plus de sous-domaines de ce
nom. Cela améliorera les performances du DNS et, dans certains
cas, sa résistance à des attaques par déni de
service.
Voyons d'abord ce que fait un résolveur actuel. J'ai choisi
Unbound. Il vient de démarrer, on lui
demande foobar56711.se
, qui n'existe pas :
% dig MX foobar56711.se. ... ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 56324
On a logiquement un NXDOMAIN
(No
Such Domain, ce nom n'existe pas ; cette erreur se
nommait autrefois Name Error, et a le code 3). Où le résolveur
a-t-il trouvé cette information ? Il a demandé aux serveurs
faisant autorité, comme nous le montre
tcpdump :
14:57:14.488196 IP (tos 0x0, ttl 57, id 52537, offset 0, flags [none], proto UDP (17), length 1063) 130.239.5.114.53 > 10.10.86.133.44861: [udp sum ok] 64329 NXDomain*- q: MX? foobar56711.se. 0/6/1 ...
Le serveur d'IIS (le registre de .se
), 130.239.5.114
lui a bien dit NXDOMAIN
.
Maintenant, demandons au même résolveur
xyz.foobar56711.se
, sous-domaine du
précédent :
% dig MX xyz.foobar56711.se. ... ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 64776
Et, si on regarde le trafic avec tcpdump, on voit que le résolveur a demandé encore au serveur faisant autorité, alors que c'était inutile !
15:00:32.929219 IP (tos 0x0, ttl 64, id 42641, offset 0, flags [none], proto UDP (17), length 75) 10.10.86.133.40616 > 130.239.5.114.53: [bad udp cksum 0x8d98 -> 0xd7df!] 10643% [1au] MX? xyz.foobar56711.se. ar: . OPT UDPsize=4096 OK (47) 15:00:32.939437 IP (tos 0x0, ttl 57, id 14256, offset 0, flags [none], proto UDP (17), length 1067) 130.239.5.114.53 > 10.10.86.133.40616: [udp sum ok] 10643 NXDomain*- q: MX? xyz.foobar56711.se. 0/6/1 ...
Pourquoi le résolveur est-il si prudent, et pose-t-il au
serveur faisant autorité une question dont il aurait déjà dû
connaitre la réponse ? Il y a plusieurs raisons mais la principale
est que le RFC originel sur le
DNS, le RFC 1034, est
ambigu. Il ne décrivait pas de manière parfaitement claire ce
qu'il faut faire lorsqu'un nom de domaine est un ENT, un
Empty Non-Terminal, c'est-à-dire un nom de domaine qui n'a
pas d'enregistrements mais qui a des sous-domaines. Certains ont
pensé que cela autorisait à répondre NXDOMAIN
lorsque le nom demandé est un ENT. Ce comportement a été
clairement noté comme incorrect dans les RFC ultérieurs (section
7.16 du RFC 2136 et sections 2.2.2
et 2.2.3 du RFC 4592) mais tout le monde
n'en avait pas forcément tiré les conséquences. Autre RFC qui
contribuait au comportement erroné, le RFC 2308 (dans sa section 5) faisait l'erreur de dire qu'un résolveur ne pouvait
renvoyer un NXDOMAIN
que si la question
portait sur exactement le même nom que celui qui avait été mis en
cache. Notre nouveau RFC 8020 corrige cette erreur : un
résolveur doit également renvoyer NXDOMAIN
si
la question est un sous-domaine d'un domaine inexistant.
La règle qui forme le cœur de ce nouveau RFC tient en une phrase
(section 2) : « si un résolveur reçoit un
NXDOMAIN
, il peut et il devrait mémoriser le
fait que ce nom et tous ceux en dessous
n'existent pas ». Logiquement, les questions ultérieures portant
sur un sous-domaine de ce nom devraient recevoir immédiatement un
NXDOMAIN
, sans déranger les serveurs faisant
autorité. C'est d'ailleurs ce que fait
Unbound, si on active l'option
harden-below-nxdomain
ainsi :
server: harden-below-nxdomain: yes
On voit alors qu'Unbound, face aux deux requêtes successives pour
foobar56711.se
et
xyz.foobar56711.se
, n'écrit qu'une seule fois
aux serveurs de .se
.
(Si cela ne marche pas pour vous, c'est peut-être que votre Unbound
ne valide pas, vérifiez sa configuration DNSSEC, ou que le domaine
est signé avec l'option opt-out.) Unbound suit
donc le bon comportement mais, malheureusement, pas par
défaut. (C'est déjà mieux que BIND, qui a
toujours le mauvais comportement de demander systématiquement aux
serveurs faisant autorité, ce qui annule partiellement l'intérêt
d'avoir un cache.)
Voilà, vous savez maintenant l'essentiel sur le principe du
NXDOMAIN cut. Voyons quelques détails, toujours
en section 2 du RFC. D'abord, il faut noter que la règle n'est pas
absolue : un résolveur, s'il y tient, peut continuer à renvoyer des
réponses positives à une question sur un sous-domaine, même si le
domaine parent n'existe pas, si le cache (la mémoire) du résolveur
contenait des réponses pour ces sous-domaines. En terme
d'implémentation, cela veut dire que le mode préféré est de
supprimer tout le sous-arbre du cache lorsqu'on reçoit un
NXDOMAIN
, mais que ce n'est pas
obligatoire.
D'autre part, rien n'est éternel dans le monde du DNS. Les informations reçues par le résolveur ne sont valables que pendant une période donnée, le TTL. Ainsi, une information positive (ce domaine existe) n'est vraie que jusqu'à expiration du TTL (après, il faut revalider auprès des serveurs faisant autorité). Même chose pour une information négative : la non-existence d'un domaine (et de tout le sous-arbre qui part de ce domaine) est établie pour un TTL donné (qui est celui du champ Minimum du SOA, cf. RFC 2308).
Dernier petit piège, s'il y a une chaîne d'alias menant au nom
de domaine canonique, le NXDOMAIN
s'applique
au dernier nom de la chaîne (RFC 6604), et pas au nom explicitement demandé.
La section 4 de notre RFC détaille les bénéfices attendus du NXDOMAIN cut. Le principal est la diminution de la latence des réponses, et celle de la charge des serveurs faisant autorité. On aura moins de requêtes, donc un bénéfice pour tout l'écosystème. Cela sera encore plus efficace avec la QNAME minimisation du RFC 9156, puisque le résolveur pourra arrêter son traitement dès qu'il y aura un domaine absent.
Cela sera aussi utile dans le cas de certaines attaques par déni de service, notamment les attaques random QNAMEs avec un suffixe un peu long (comme dans le cas de l'attaque dafa888).
Mais tout n'est pas idéal dans cette vallée de larmes. Le
NXDOMAIN cut peut aussi poser des problèmes, ce
qu'examine la section 5. Le principal risque est celui que pose des
serveurs faisant autorité bogués, comme ceux
d'Akamai. Regardons le domaine de
l'Université de Pennsylvanie,
www.upenn.edu
:
% dig A www.upenn.edu www.upenn.edu. 300 IN CNAME www.upenn.edu-dscg.edgesuite.net.
C'est un alias pour un nom Edgesuite
(une marque d'Akamai). Mais les serveurs de
edgesuite.net
sont bogués, ils répondent
NXDOMAIN
pour un ENT (Empty
Non-Terminal, comme
edu-dscg.edgesuite.net
:
% dig @ns1-2.akam.net A edu-dscg.edgesuite.net ... ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 659 ...
La réponse correcte aurait dû être
NODATA
(c'est-à-dire le code
NOERROR
et une section
Answer de taille nulle). Tant qu'Akamai n'aura
pas réparé ses serveurs, des problèmes subsisteront.
Au fait, pourquoi ne pas se servir de
l'enregistrement SOA, qui est renvoyé en cas
de réponse négative, pour trouver un NXDOMAIN
cut situé encore plus haut, et qui sera donc plus
efficace pour limiter les requêtes ultérieures ? L'annexe A du RFC
explique pourquoi c'est une fausse bonne idée. Prenons l'exemple
d'un nom non existant,
anything.which.does.not.exist.gouv.fr
:
% dig AAAA anything.which.does.not.exist.gouv.fr ... ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 35377 ... ;; AUTHORITY SECTION: fr. 5400 IN SOA nsmaster.nic.fr. hostmaster.nic.fr. ( 2224131472 ; serial ...
Le SOA renvoyé indique fr
. Il ne faut pas en
déduire que les noms plus spécifiques n'existent pas
(gouv.fr
existe, mais ce n'est pas une zone
séparée, voilà pourquoi le SOA indiquait son parent fr
).
La section 6 du RFC contient quelques conseils pour les
implémenteurs. Rappelez-vous que les exigences de ce RFC concernent
le comportement extérieur du résolveur, pas la façon dont il est
mis en œuvre. Cette réalisation concrète va donc dépendre de
comment sont représentés les domaines dans la mémoire du
résolveur. La représentation la plus évidente est d'utiliser un
arbre puisque c'est le modèle des noms de
domaine. Mais ce n'est pas obligatoire. Un autre choix pourrait
être celui d'un dictionnaire, plus rapide
(pour un nom de domaine très profond, il y aura moins de lectures
dans la structure de données) mais qui rend certaines opérations
plus difficiles (toutes celles définies par rapport au modèle
d'arbre, et elles sont nombreuses dans le DNS). Et il existe des
implémentations intermédiaires, par exemple avec un arbre augmenté
d'un index. Bref, le programmeur a le
choix. S'il a opté pour un arbre, la façon la plus simple de
respecter les exigences du RFC et, en recevant un
NXDOMAIN
, de supprimer tout sous-arbre qui
partirait du nom ainsi nié.
Un petit mot de sécurité, maintenant qu'on approche de la
fin. Si un résolveur accepte un NXDOMAIN
mensonger (attaque par empoisonnement), les
conséquences risquent d'être sérieuses puisque c'est un sous-arbre
entier qui serait « détruit ». C'est pour cela que le RFC autorise
un résolveur prudent à ne pratiquer le NXDOMAIN
cut que si le NXDOMAIN
a été validé
avec DNSSEC. C'est ce que fait
Unbound, cité plus haut.
Notez que, si on a DNSSEC, une technique encore plus puissante
consiste à synthétiser des réponses NXDOMAIN
en utilisant les enregistrements NSEC. Elle
est décrite dans un
Internet-Draft
actuellement en cours de discussion.
Quels sont les résolveurs qui gèrent aujourd'hui le NXDOMAIN cut ? Outre Unbound, déjà cité, il y a PowerDNS Recursor, mais qui est, curieusement, limité au cas particulier de la racine.
Un peu d'histoire pour finir : la prise de conscience du
problème que pose le manque d'agressivité des caches des résolveurs
est ancienne. Voici par exemple une partie d'un rapport de
Paul Mockapetris à
la réunion IETF n° 4 en 1986 :
Mais le projet concret qui a mené à ce RFC est bien plus récent. Il a été lancé (cf. les supports) à la réunion IETF de Yokohama, à peine plus d'un an avant la publication du RFC (on peut voir ici l'histoire des différents brouillons). On voit que l'IETF peut agir vite.
Auteur(s) du livre : Olivier Iteanu
Éditeur : Eyrolles
978-2-212-11859-9
Publié en 2016
Première rédaction de cet article le 2 novembre 2016
On ne peut plus se plaindre que l'irruption du numérique dans toutes les activités humaines se fasse sans réflexion politique ou juridique. Voici encore un nouvel ouvrage sur la question, écrit par un juriste qui connait bien ce domaine depuis des années. Il tourne autour d'une question « est-ce que cette irruption du numérique va se faire au détriment du droit ? ».
Olivier Iteanu se penche sur quatre grandes questions politico-juridiques : la liberté d'expression, la vie privée, le droit d'auteur et la gouvernance de l'Internet. Sa thèse principale est que, oui, le numérique menace l'État de droit (au passage, il y a une différence entre « État de droit » et « état de droit » et Iteanu met bien la majuscule). En gros, les GAFA tentent d'imposer leurs lois (les fameuses CGU que personne ne lit, et qui sont souvent illégales, par exemple en obligeant d'aller traiter les litiges en Californie). Et cela se fait au détriment des lois nationales des pays vassaux.
La thèse est étayée par de nombreux exemples, les argumentaires des GAFA (« mais vous pouvez toujours changer les paramètres de vie privée, si vous ne voulez pas que vos données soient diffusées ») bien réfutés. Je ne vais pas en discuter ici, je ne cherche pas à défendre Google :-) Mais le problème est qu'Iteanu semble considérer qu'il n'y a menace pour les citoyens que lorsqu'elle vient d'un GAFA états-unien. Ainsi, la section sur la liberté d'expression oppose « liberté d'expression » et « freedom of speech » (en anglais dans le texte, pour bien montrer que c'est un concept étranger). L'idée est que le « freedom of speech » est absolu (et permet donc des discours racistes, par exemple), alors que la liberté d'expression est bornée par la loi. D'abord, cette opposition États-Unis-premier-amendement-freedom-of-speech-totale vs. France-pays-de-raison-et-de-mesure est largement fausse. Le premier amendement ne crée pas une liberté d'expression totale. Il dit juste que l'État ne doit pas la limiter. Cela laisse les entreprises privées ou des groupes de citoyens libres de limiter la liberté tant qu'ils veulent (cf. les censures de Facebook, par exemple). Mais, surtout, tout le chapitre sur la liberté d'expression fait comme si le seul problème lié à la liberté d'expression était l'abus que certains en font, pour de la propagande nazie, par exemple. Les menaces contre la liberté d'expression ne sont pas mentionnées. Et l'état d'urgence en France n'est jamais cité.
La tonalité « souverainiste » du livre est d'ailleurs assez agaçante. Les seuls reproches faits aux institutions françaises ou européennes sont de trop céder aux pressions états-uniennes. À lire ce livre, on a un peu l'impression que les États en Europe et notamment en France ne font jamais rien de dangereux ou de négatif, et que la seule question politique est de résister aux empiètements des GAFA et du gouvernement de Washington. L'auteur fait remarquer à juste titre que le passage du règne de la loi à celui de CGU dictées par une entreprise capilatiste n'est pas un progrès, mais cette dénonciation serait plus convaincante si elle était accompagnée d'une critique de la loi (qui est présentée comme l'expression indiscutable de la volonté du peuple).
Sur la vie privée (opposée à la « privacy » anglo-saxonne), Iteanu pointe à juste titre le danger de la surveillance massive que fait le gouvernement états-unien, notamment via la NSA, et le fait que le défunt Safe Harbor soit « un chiffon de papier ». Mais il ne mentionne qu'en passant, et sans critiques, les contributions françaises à la surveillance, comme la loi Renseignement.
Sur le droit d'auteur, Iteanu reprend la théorie comme quoi il y aurait une différence de philosophie entre « droit d'auteur » et « copyright » anglo-saxon, et que cette différence aurait des conséquences pratiques (ce qui n'est pas vraiment le cas). Par contre, il est cette fois bien plus critique pour le système français, pointant l'inefficacité et l'injustice du système répressif que symbolise en France la HADOPI.
Enfin, la partie sur la gouvernance de l'Internet critique logiquement l'ICANN (le livre a été écrit avant le léger changement des relations entre l'ICANN et le gouvernement états-unien le 1er octobre 2016, mais cela a peu d'importance). L'ICANN est une cible facile (et justifiée) mais il est dommage que l'ONU soit citée comme alternative crédible, sans l'once d'une critique. Iteanu cite entre autres des gens dont la crédibilité est très faible, comme Bellanger qui, dans un article fumeux, accusait Google de détournements imaginaires.
(Les techniciens pinailleurs comme moi seront surpris du
tableau présentant les serveurs racine, et
plus précisément de sa dernière colonne, « suffixe du nom de
domaine », qui place la NASA dans un
curieux .usg
, ne met pas l'armée
états-unienne sous
.mil
, et voit le
RIPE-NCC en
.int
. De toute façon,
aujourd'hui, tous les serveurs racine sont nommés sous
.net
.)
En résumé, l'analyse des GAFA, de leur attitude, des menaces qu'ils représentent pour la vie privée ou pour la souveraineté nationale, est très bonne et résume bien le problème. Mais l'« oubli » complet des menaces venant d'autres acteurs, comme l'État français ou comme les entreprises françaises, diminue sérieusement l'intérêt du livre. Olivier Iteanu connait bien son sujet (et évite donc de parler des pires énormités souverainistes comme le cloud souverain ou l'OS souverain) mais, hélas, il se laisse trop emporter par un point de vue national.
Tiens, ça me donne envie de parler en anglais. Full disclosure : j'ai reçu un exemplaire gratuit de ce livre.
Date de publication du RFC : Octobre 2016
Auteur(s) du RFC : T. King, C. Dietzel (DE-CIX
Management), J. Snijders
(NTT), G. Doering (SpaceNet
AG), G. Hankins (Nokia)
Pour information
Réalisé dans le cadre du groupe de travail IETF grow
Première rédaction de cet article le 20 octobre 2016
Lorsqu'on est soumis à une sérieuse attaque par déni
de service volumétrique, il faut parfois sacrifier la
machine qui en est la cible, afin de préserver le reste des
ressources réseau. On demande alors à son opérateur de jeter le
trafic à destination de cette machine, avant qu'il n'emprunte la
liaison qu'on veut préserver. Cela peut se faire manuellement mais
c'est évidemment plus rapide et moins risqué si on le fait
automatiquement, via une annonce BGP vers
le préfixe visé. Pour
cela, on marque l'annonce BGP avec une
communauté (RFC 1997)
qui veut dire « poubelle donc tout ce trafic ». Ce nouveau
RFC normalise une communauté standard,
« bien connue », pour cela, BLACKHOLE
(0xFFFF029A). Ainsi, il n'y aura plus besoin d'utiliser une
communauté différente pour chaque opérateur.
Cette méthode consistant à envoyer le trafic destiné à la victime vers un « trou noir » (blackholing) est décrite dans les RFC 3882 et RFC 5635. Comme elle agit au niveau IP, elle ne nécessite pas d'équipements spéciaux, et elle est très rapide, ne prenant que peu de ressources chez les routeurs. Par contre, elle est peu subtile : tout le trafic à destination d'un préfixe donné (préfixe en général réduit à une seule adresse IP, celle de la machine attaquée) est jeté, qu'il fasse partie de l'attaque ou pas. Quel est l'intérêt de couper tout le trafic ? Cela réalise l'objectif de l'attaquant, non ? C'est en effet une mesure désespérée mais rationnelle : son but est de préserver les ressources réseau pour que les autres machines fonctionnent. Si vous êtes connecté à l'Internet par une liaison à 10 Gb/s, et qu'une attaque de 20 Gb/s frappe votre opérateur, votre ligne va être complètement inutilisable. Aucune action de votre côté n'y changerait rien, dès que les paquets sont arrivés chez vous, c'est trop tard. Ce RFC traite le cas où on demande à l'opérateur de jeter le trafic avant qu'il ne soit envoyé sur la ligne entre l'opérateur et vous.
Le problème (section 1 du RFC) est qu'il existait plusieurs méthodes pour déclencher cet envoi dans un trou noir, ce qui compliquait la tâche des équipes réseau, une annonce BGP marquée avec une certaine communauté, une annonce BGP avec un certain next hop, et des méthodes non-BGP (dont le coup de téléphone au NOC). D'où la solution de notre RFC, définir une communauté standard. Plus besoin de se poser de question (à part celle de savoir si votre opérateur accepte cette commande, voir les sections 3.3 et 4). Au passage, les communautés BGP sont décrites dans le RFC 1997.
Une communauté BLACKHOLE
est donc définie
(section 2)
et mise dans le registre IANA des
communautés bien connues. Sa valeur est 0xFFFF029A. Le 666 à la
fin vient de la Bible et
était déjà couramment employé par les opérateurs. Notez donc que
ce RFC n'invente pas une nouvelle technique (demander à son pair
de jeter certains paquets est une technique très ancienne), il lui
donne juste une communauté standard.
Voilà, c'est tout, juste une réservation d'un nom et d'une
valeur. Si vous êtes intéressés par les détails pratiques, la
section 3 est consacrée aux problèmes opérationnels. D'abord, un
point essentiel : accepter des annonces BGP étiquetées
BLACKHOLE
est un choix local. Aucun opérateur
n'est obligé de respecter cette demande et, dans ce cas, ladite
communauté est ignorée. Lorsqu'on se connecte à
un nouveau pair BGP, il peut donc être prudent de lire leur
documentation ou de leur poser la question. N'utilisez
BLACKHOLE
qu'entre des adultes
consentants. (Notez que cet avertissement du RFC est un peu
contradictoire avec l'avantage proclamé de la normalisation de
BLACKHOLE
: en pratique, on est toujours
obligé de savoir ce que fait son pair, on ne peut pas compter sur
une méthode standard qui marcherait partout.) Une liste des
opérateurs et points d'échange qui acceptent
BLACKHOLE
est disponible
en ligne.
Si tout le monde accepte BLACKHOLE
, on
s'en sert comment ? Lorsqu'une attaque DoS
est en cours, on annonce un préfixe qui couvre l'adresse IP visée,
et on y ajoute cette communauté. On peut aussi utiliser
BLACKHOLE
pour les annonces du RFC 5635 (mais pas avec celles du RFC 5575).
Attention à ne pas propager ces annonces ! En effet, étant en
général très spécifiques (souvent une seule adresse IP), elles
seraient préférées, si elles étaient insérées dans une table de
routage. Leur effet est prévu
pour être strictement local et, donc, les annonces doivent être marquées avec la
communauté NO_EXPORT
(ou
NO_ADVERTISE
).
En parlant de spécificité, quelle doit être la longueur des
préfixes annoncés avec un BLACKHOLE
attaché ?
Souvent, l'attaque ne vise qu'une seule adresse et, donc, les
annonces BLACKHOLE
seront souvent des /32 (en
IPv4) et /128 (en IPv6), afin de ne sacrifier que le strict
minimum de son réseau. Si vous avez une politique BGP de n'accepter
que des préfixes plus généraux, c'est un point à
modifier. Aujourd'hui (RFC 7454, section
6.1.3), les préfixes plus spécifiques que /24 (IPv4) et /48 (IPv6)
sont rarement acceptés. Il faut donc faire des exceptions pour les
trous noirs.
Lorsqu'un opérateur reçoit une de ces annonces « envoie-moi
tout ça dans un trou noir », que doit-il vérifier ? Comme le
résultat de cette annonce est de jeter tout le trafic, une attaque
avec une annonce mensongère, ou bien une erreur d'un opérateur
maladroit, pourrait avoir de sérieuses conséquences. Notre RFC
recommande donc un certain nombre de tests de vraisemblance :
vérifier que le pair est autorisé à annoncer un préfixe couvrant
celui qu'il annonce avec BLACKHOLE
, et
vérifier que BLACKHOLE
avec ce pair a été
spécifiquement permis (le RFC recommande plus loin que ce ne soit
pas permis par défaut). Même chose s'il y a des
serveurs de route (RFC 7947) sur le trajet.
Par contre, il faut, pour le cas spécifique des annonces
BLACKHOLE
, débrayer les techniques de
validation comme celle du RFC 6811. Par
exemple, si un ROA (Route Origin Authorisation, RFC 6482) autorise une longueur maximale de préfixe de /48,
l'annonce BLACKHOLE
de longueur /128 doit
quand même être acceptée.
À des fins de traçabilité, pour faciliter l'analyse a
posteriori d'une attaque, et du traitement qu'elle a reçu, le RFC
recommande de journaliser toutes les
annonces BLACKHOLE
. (Cela permettra, par
exemple, de repérer les pairs qui abusent du mécanisme,
cf. section 6.)
Si vous travaillez chez un éditeur de logiciels pour routeurs,
n'oubliez pas les conseils de la section 4, destinés aux
programmeurs. D'abord, l'acceptation des annonces « trou noir » ne
devrait pas être faite par défaut. Le RFC demande qu'une action
explicite de l'administrateur réseau soit nécessaire. D'autre
part, pour ne pas
avoir à taper la valeur numérique de cette communauté, le RFC
suggère de permettre une valeur texte à indiquer, par exemple
blackhole
.
Quelques petits points sur la sécurité pour finir (section
6). D'abord, bien se rappeler que BGP n'a par défaut aucun
mécanisme pour empêcher ou détecter les modifications des
annonces. Si un attaquant actif retire ou ajoute la communauté
BLACKHOLE
, ça ne se voit pas. Même le futur
BGPSec ne l'empêchera pas, puisqu'il ne protège pas les
communautés. Il y a donc des possibilités d'attaques par déni de
service de ce côté.
C'est entre autre pour cela que le RFC demande qu'on vérifie
qu'un pair qui annonce un préfixe avec
BLACKHOLE
est autorisé à le faire (RFC 7454, section 6.2.1.1.2).
Première rédaction de cet article le 19 octobre 2016
Je viens d'installer chez moi un routeur Turris Omnia. Ça fait quoi et ça sert à quoi ?
Voici ce routeur avec ses copains et copines (sonde RIPE Atlas et Raspberry Pi de supervision) : (Version
non réduite) Rassurez-vous, on peut contrôler par un bouton
la luminosité des diodes (très intense par défaut).
Le Turris Omnia est avant tout un routeur pour la maison ou la petite entreprise. En tant que routeur, il... route, c'est-à-dire qu'il fait passer les paquets d'un réseau à l'autre, en l'occurrence entre le réseau de la maison et celui du FAI et, via ce dernier, à tout l'Internet. C'est donc l'équivalent de la box qui, en France (mais pas ailleurs) est souvent fournie par le FAI.
La différence principale est que l'Omnia ne comprend que du
logiciel libre et est ouvert, au sens où on
est super-utilisateur sur cette
machine et où on peut la configurer comme on veut, contrairement
aux boxes fermées dont
on ne sait pas exactement ce qu'elles font (elles peuvent par
exemple surveiller
le trafic, même local). L'Omnia n'est pas conçu par une
boîte commerciale mais par le registre du
.cz
, une organisation
sans but lucratif (qui développe des tas de choses
intéressantes).
D'autre part, des tas de services qui devraient être de base en 2016 (IPv6, validation DNSSEC) sont disponibles en série sur l'Omnia.
Si vous n'êtes pas technicien, je vous préviens que l'Omnia est installable et configurable sans trop de difficultés mais que toute adaptation un peu sérieuse nécessite, pour l'instant, de bonnes compétences d'administrateur système et réseau.
Suivons maintenant l'ordre chronologique de la mise en route. Commençons par le matériel. Voici l'Omnia vue de devant, posée
sur le T-shirt (optionnel...). Le port USB
peut servir de console série (je n'ai pas encore essayé) :
(Version non réduite).
Et l'arrière de la boîte. Les antennes Wi-Fi ne sont pas encore montées (les
connecteurs dorés en haut). Le port SFP est
rare sur ce genre de routeurs à la maison, mais je ne l'ai pas
encore utilisé (il peut permettre des connexions directes à une
fibre optique, par exemple) : (Version non réduite).
Et voici l'Omnia ouverte, pour les amateurs d'électronique (la
documentation du matériel est en ligne) : (Version non
réduite). Curieusement, une vis avait été oubliée à
l'intérieur... J'ai découvert par la suite que c'était une des vis
censées tenir les cartes Wifi. Le Turris Omnia a 1 ou 2 Go de
RAM (j'ai le modèle à 1 Go), un processeur
ARM à 1,6 Ghz, une
Flash de 8 Go, et quelques trucs que les
électroniciens adoreront comme des ports GPIO.
Attention à vérifier les connecteurs des antennes radio. Dans mon cas, ils étaient mal vissés, ce qui faisait que les antennes tombaient et, ce faisant, tournaient la petite carte située derrière les connecteurs, ce qui arrachait le fil menant à la carte WiFi. Bien serrer ces connecteurs avant de commencer.
Branchons-la, maintenant. Je suis abonné chez
Free et, par défaut, c'est leur boitier qui
fait l'interface physique avec la ligne
ADSL (de toute façon, l'Omnia n'a pas de
prise adaptée, à moins de passer par le SFP ?). J'ai donc décidé de garder la
Freebox, mais elle s'occupe uniquement de
la télévision, du téléphone fixe, et du branchement à l'ADSL. Tout
le routage, le réseau local et le Wi-Fi
sont faits par l'Omnia. Je laisse donc le Freebox
Player (la boîte qui sert à la télé) branchée au
Freebox Server (la Freebox proprement dit),
comme avant. Et je passe la Freebox en mode
« bridge ». Avec cette configuration, la télévision classique
continue à fonctionner (regarder la télévision, gérer ses
enregistrements via
http://mafreebox.freebox.fr/
, etc). Le
téléphone marche aussi. Pour le reste, je branche la prise WAN de
la Turris Omnia en Ethernet, sur le
commutateur du Freebox
Server. Les autres machines sont branchées sur le
commutateur de l'Omnia (ou utilisent son Wi-Fi). Il y a cinq ports
Ethernet utilisables.
Une fois l'Omnia et au moins un PC branché, on configure le
routeur via le Web, en se connectant à
http://192.168.1.1/
(rassurez-vous, tout cela
est bien expliqué dans le joli manuel papier de quatre pages livré
avec l'Omnia, ou bien en
ligne. Il y a deux interfaces Web de
configuration du Turris Omnia, Foris,
orientée débutant, et spécifique à l'Omnia, et LuCI, bien plus
riche, dont je
parlerai plus longuement après. Voici ce que voit le célèbre
M. Michu, lorsqu'il utilise Foris :
Free ne fournit apparemment pas
de mécanisme pour la configuration automatique
d'IPv6, il a donc fallu la faire à la main,
statiquement.
Contrairement au Turris précédent, cette fois, on n'est plus obligé de parler la langue de Karel Čapek avec l'Omnia. Presque tout est traduit. (Mais pas encore les divers HOWTO en ligne.) C'est un progrès appréciable pour le non-polyglotte qui, en 2014, avec l'ancien Turris, recevait des notifications du genre « Upozorneni od Vaseho routeru Turris ##### Oznameni o aktualizacich ##### • Nainstalovaná verze 82 balíku updater... ». La documentation de Foris est très détaillée, et il est recommandé de la lire (par exemple pour configurer le Wi-Fi, lorsque Foris demande à M. Michu s'il veut du 2,4 GHz ou du 5 GHz... Au passage, l'Omnia peut faire les deux, en configurant deux interfaces avec des fréquences différentes, ce qui ne semble possible qu'avec LuCI ou le fichier texte de configuration.)
Si on découvre des bogues à signaler, il faut écrire à
info@turris.cz
qui répond bien. Il y a aussi
un canal IRC #turris
à
Freenode (peu d'activité). Questions forums collectifs, il y avait
un système de forums (avec les menus uniquement en
tchèque) qui a été abandonné au profit de
Discourse,
que je recommande d'utiliser (on a des réponses). Il est
apparemment nécessaire, pour se loguer, d'avoir mojeID (ce que j'utilise) ou bien un compte
sur un GAFA.
Ensuite, tout fonctionne, le routeur route, on peut regarder des vidéos de chats, envoyer du courrier, parler avec les copains en XMPP, télécharger de la culture, etc.
Notez que le routeur est sécurisé par défaut. Le pare-feu interne, dans sa configuration d'origine, bloque les connexions entrantes. (IPv4 et IPv6, bien sûr, une fonction qui manque terriblement à la Freebox, cf. RFC 6092.) De même, le routeur a SSH et un résolveur DNS mais n'accepte pas les connexions SSH ou DNS de l'extérieur. (Parfois, c'est même trop sécurisé.)
Une autre particularité du Turris Omnia est que le routeur se
met à jour tout seul, récupérant automatiquement les nouvelles
versions des logiciels, afin de corriger notamment les failles de
sécurité (c'est évidemment configurable, via l'onglet
Updater de Foris). C'est en effet une défaillance courante chez ces petits
engins installés à la maison : le code n'est pas mis à jour et de
vieilles failles durent longtemps. Tous les matins, on peut voir
sur Foris ce qui a été changé :
On peut aussi le recevoir via le système de notification par courrier. Le Turris peut envoyer des messages via les MTA de NIC.CZ ou bien via le vôtre si vous la configurez ainsi (dans Maintenance).
Le Turris permet également d'envoyer ses données de trafic dans le
nuage. Ce n'est évidemment pas activé par défaut mais, si on veut
aider la science, cela se fait par l'onglet Data
collection de Foris (« we'd like to inform you that you agreed with our EULA regarding data collection of your router »). Une fois cet envoi activé, et un
compte sur le portail créé via le Turris, on
pourra se connecter sur le portail (mojeID était nécessaire mais ce n'est plus
le cas) et voir
des jolis graphes de son trafic :
Naturellement, l'administrateur système consciencieux, même s'il se nomme Michu, va faire des sauvegardes. L'interface Foris a une option Configuration backup dans son onglet Maintenance.
Passons maintenant à l'interface Web avancée, LuCI. Elle n'est
pas spécifique à l'Omnia et est au contraire bien connue des
utilisateurs d'OpenWrt, système sur lequel
est bâti l'Omnia. Ce n'est pas génial d'avoir deux interfaces Web
pour la configuration, je trouve. Mais LuCI est indispensable pour
les fonctions avancées, comme la configuration du
pare-feu. Voici l'écran principal de LuCI :
LuCI peut servir à regarder l'état de certaines fonctions, ici
le pare-feu :
Mais aussi à configurer des fonctions comme, ici, le
commutateur interne avec ses
VLAN (je n'ai pas encore testé mais cela
semble nécessaire si on veut connecter le Freebox
Player au réseau local) :
On peut aussi installer des programmes supplémentaires depuis
LuCI. Le premier que j'ai mis était Majordomo
(rien à voir avec le gestionnaire de listes de diffusion du même nom). Il permet
d'intéressantes statistiques par machine (là aussi, quelque chose
qui me manque sur la Freebox) :
Le vrai geek va sans doute vouloir se connecter à son beau routeur libre en SSH (chose qu'on ne peut certainement pas faire avec la Freebox...). Une fois le serveur activé (Advanced administration dans Foris mais attention avec SSH, une bogue sérieuse est décrite plus loin) :
% ssh root@turris Password: BusyBox v1.23.2 (2016-09-05 13:26:40 CEST) built-in shell (ash) _______ _ _ _____ _____ _____ _____ |__ __|| | | || __ \ | __ \ |_ _| / ____| | | | | | || |__) || |__) | | | | (___ | | | | | || _ / | _ / | | \___ \ | | | |__| || | \ \ | | \ \ _| |_ ____) | |_| \____/ |_| \_\|_| \_\|_____||_____/ root@turris:~# sensors armada_thermal-virtual-0 Adapter: Virtual device temp1: +86.1°C
Notez que je ne connais pas de moyen de connaitre le condensat de la clé publique SSH créée, depuis l'interface Web. On ne peut donc pas vérifier, la première fois, qu'on se connecte bien à son Turris Omnia.
Le Turris Omnia utilise OpenWrt, un Unix (avec noyau Linux). La plupart des commandes seront donc familières aux unixiens :
root@turris:~# uptime 11:32:39 up 1 day, 3:35, load average: 0.02, 0.05, 0.01 root@turris:~# df -h Filesystem Size Used Available Use% Mounted on /dev/mmcblk0p1 7.3G 180.5M 7.1G 2% / tmpfs 503.7M 6.9M 496.9M 1% /tmp tmpfs 512.0K 4.0K 508.0K 1% /dev root@turris:~# dig fr.wikipedia.org ; <<>> DiG 9.9.8-P4 <<>> fr.wikipedia.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38235 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;fr.wikipedia.org. IN A ;; ANSWER SECTION: fr.wikipedia.org. 3 IN A 91.198.174.192 ;; Query time: 7 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Wed Oct 19 11:36:54 UTC 2016 ;; MSG SIZE rcvd: 61 root@turris:~# uname -a Linux turris 4.4.13-05df79f63527051ea0071350f86faf76-7 #1 SMP Mon Sep 5 13:01:10 CEST 2016 armv7l GNU/Linux
Pour mémoire, l'ancien Turris, avant l'Omnia, affichait :
root@turris:~# uname -a Linux turris 3.10.18-b09ae823eeafb345725b393bc5efbba7 #1 SMP Tue May 6 16:24:28 CEST 2014 ppc GNU/Linux
Et n'avait que 250 Mo de stockage.
Le résolveur par défaut du Turris Omnia, l'excellent Knot Resolver (produit par la même organisation que Turris), valide avec DNSSEC (comme tout le monde devrait faire, en 2016). Dommage, il reste encore des sérieuses bogues (comme une mauvaise indication du résultat ou comme l'impossibilité de couper la validation).
Un des avantages du shell est qu'on peut
faire tout ce qu'on veut. Ainsi, le système de sauvegarde par
l'interface Foris dont je parlais plus haut ne sauvegarde que
/etc/config
. Si on veut tout garder, on peut
le faire avec un script et cron.
Pour faire quoi que ce soit sur l'Omnia, il vaut mieux connaitre OpenWrt (son Wiki, ses forums...) Par exemple, si vous préférez joe à vi (et, non, je n'ai pas trouvé d'emacs sur OpenWrt, système conçu pour des engins contraints en ressources matérielles) :
root@turris:~# opkg list | grep -i editor joe - 4.2-1 - Joe is world-famous Wordstar like text editor, that also features Emacs and Pico emulation nano - 2.6.0-1 - Nano (Nano's ANOther editor, or Not ANOther editor) is an enhanced clone of the Pico text editor. vim - 7.4-3 - Vim is an almost compatible version of the UNIX editor Vi. (Tiny build) zile - 2.3.24-4 - Zile is a small Emacs clone. Zile is a customizable, self-documenting real-time display editor. Zile was written to be as similar as possible to Emacs; every Emacs user should feel at home with Zile. ... root@turris:~# opkg install joe Installing joe (4.2-1) to root... Downloading https://api.turris.cz/openwrt-repo/omnia/packages//packages/joe_4.2-1_mvebu.ipk. % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 238k 100 238k 0 0 589k 0 --:--:-- --:--:-- --:--:-- 602k Configuring joe.
La configuration IPv6 ne s'est pas faite
toute seule (ce n'est pas entièrement la faute du Turris mais un peu
quand même). Par défaut, le Turris distribue sur le réseau local des
ULA (RFC 4193) comme
fde8:9fa9:1aba:0:X:W:Y:Z
. Pour réaliser la
configuration en étant connecté à Free, j'ai suivi un bon HOWTO de
OpenWrt mais il y manque un point important, la route par
défaut statique (à ce sujet, cela vaut aussi la peine de consulter la
documentation
OpenWrt sur le réseau). Donc, ce que j'ai du faire :
ifconfig eth1
),http://mafreebox.freebox.fr/
, « Paramètres de
la Freebox » puis « Configuration IPv6 »), mettre cette adresse en
Next hop pour le préfixe que nous a alloué
Free,/etc/config/network
) comme indiqué dans le
HOWTO ci-dessus,
Cela donc un /etc/config/network
qui ressemble
à (si 2001:db8:cafe:1234::1:fe/64
est le préfixe IPv6
alloué par Free, celui qu'on trouve dans l'interface Web de la Freebox) :
config interface 'lan' option ifname 'eth0 eth2' option force_link '1' option type 'bridge' option proto 'static' option netmask '255.255.255.0' option ipaddr '192.168.1.1' option ip6addr '2001:db8:cafe:1234::1:fe/64' option ip6prefix '2001:db8:cafe:1234::/64' option ip6gw '2001:db8:cafe:1234::1' option ip6assign '64' option mtu '1452' config interface 'wan' option ifname 'eth1' option proto 'dhcp' option mtu '1452' config interface 'wan6' option ifname '@wan' option _orig_bridge 'false' option proto 'static' option ip6addr '2001:db8:cafe:1234::2/126' option ip6gw '2001:db8:cafe:1234::1' option ip6prefix '2001:db8:cafe:1234::/64' # Route par défaut statique config route6 option interface 'wan6' option target '::/0' option gateway 'fe80::f6ca:e5ff:fe4d:1f41'
Si vous êtes attentifs, vous aurez remarqué qu'on force une MTU à 1 452 octets. L'IPv6 de Free en ADSL n'étant pas natif (mais un tunnel 6rd, cf. RFC 5969), ce réglage était nécessaire pour éviter les symptômes habituels d'un problème de PMTUD (ping qui marche mais pas curl, etc).
Si votre FAI ne fournit pas IPv6, le Turris Omnia permet d'établir un tunnel, en théorie, mais je n'ai jamais testé.
Autre jouet amusant, le Turris a un pot de
miel configurable, pour SSH et telnet. Les sessions
capturées sont également transmises aux responsables du
projet et visibles via le portail des utilisateurs (mon premier
« pirate » venait de Turquie et a tapé
uname -a
).
Passons maintenant aux problèmes, car le logiciel a des bogues embêtantes. J'ai eu beaucoup d'ennuis avec
le serveur NTP. Rien ne marchait. J'ai du finalement désactiver le
serveur par défaut (/etc/config/system
,
option enabled '0'
) et
ntpclient
, puis installer ntpd qui, lui,
fonctionne. (Normalement, sur OpenWrt, cela aurait
du marcher tout seul, la doc le
dit). Attention, supprimer avec opkg le paquetage ntpclient ne suffit
pas, la mise à jour automatique de l'Omnia le réinstalle. Maintenant,
la synchronisation temporelle marche :
root@turris:~# ntpq ntpq> peers remote refid st t when poll reach delay offset jitter ============================================================================== +mx4.nic.fr 138.96.64.10 2 u 585 1024 377 8.661 -1.611 1.186 webcgi1-g20.fre .INIT. 16 u - 1024 0 0.000 0.000 0.000 webcgi2-g20.fre .INIT. 16 u - 1024 0 0.000 0.000 0.000 +pob01.aplu.fr 40.179.132.91 2 u 555 1024 377 10.465 -4.789 4.553 -host3.nuagelibr 138.96.64.10 2 u 193 1024 377 10.405 3.660 2.096 vel.itat.io 131.188.3.223 2 u 98 1024 1 25.894 0.007 0.230 *cluster004.lino 82.95.215.61 2 u 557 1024 377 7.166 -0.876 0.973
Et les machines du réseau local peuvent se synchroniser sur le
Turris. (Au passage, la commande ntpq
est dans le
paquetage ntp-utils
.)
Second problème sérieux, avec le serveur SSH. Pour un
certain nombre d'utilisateurs de l'Omnia, la création des clés
SSH de la machine se passe mal et des fichiers de taille zéro sont
créés (et cela ne se produit pas uniquement, contrairement à ce que
racontent certains, lors d'une coupure de courant). Cela empêche
évidemment le serveur SSH de démarrer. On ne peut donc pas se
connecter au shell pour arranger les choses. Il faut alors utiliser le
port USB comme port série (je n'ai pas essayé)
ou bien réparer le problème entièrement depuis LuCI
(System puis Custom commands) en
exécutant de quoi rétablir le système. Et l'interface de LuCI est
pénible pour cela (par exemple, ssh-keygen -N ""
ne marchera pas car LuCI supprime la chaîne vide...). J'ai donc du
définir des commandes rm -f /etc/ssh/ssh_host_ecdsa_key
/etc/ssh/ssh_host_ecdsa_key.pub /etc/ssh/ssh_host_ecdsa_key
/etc/ssh/ssh_host_ecdsa_key.pub /etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_rsa_key.pub /etc/ssh/ssh_host_dsa_key
/etc/ssh/ssh_host_dsa_key.pub /etc/ssh/ssh_host_ed25519_key
/etc/ssh/ssh_host_ed25519_key.pub
(eh non, pas droit aux
jokers) puis ssh-keygen -A
puis
/etc/init.d/sshd start
.
Autre méthode pour s'amuser, jouer avec les VLAN. En faisant une erreur dans la configuration du commutateur de l'Omnia, j'avais déclenché une tempête de trafic interne qui rendait le routeur totalement inutilisable. Même pas moyen de se connecter en SSH pour réparer. L'erreur étant dans la configuration, redémarrer ne servait à rien (l'Omnia n'a apparemment pas de mémorisation temporaire des configurations réseau potentiellement dangereuses, comme ça existe sur JunOS). Le port série aurait peut-être été une solution mais il y avait plus simple : remettre l'Omnia à sa configuration d'usine, se reconnecter, et restaurer la configuration sauvegardée.
Voilà, prochaine étape, installer un serveur SNMP...
Quelques autres lectures sur le Turris Omnia :
PS : si vous voulez acheter un Turris Omnia (j'ai eu le mien via le crowdfunding), voyez cette annonce.
Première rédaction de cet article le 17 octobre 2016
Aujourd'hui, bien des clients d'Orange ont eu la mauvaise surprise de ne pas pouvoir visiter Google. La plupart n'avaient pas de messages d'erreur précis, juste une longue attente et un message d'erreur vague du genre « timeout ». Certains avaient la désagréable surprise de voir apparaitre une page menaçante, les accusant d'avoir voulu se connecter à un site Web terroriste. À l'origine de ce problème, une erreur de configuration dans les résolveurs DNS d'Orange, en raison de la fonction de censure administrative du Web.
D'abord, voyons l'étendue du problème. Il n'affectait que les
clients d'Orange, et seulement ceux qui
utilisaient les résolveurs DNS de
l'opérateur (voir plus loin pour une définition des termes
techniques). Les sites inaccessibles incluaient
, mais aussi
http://www.google.fr/
,
http://fr.wikipedia.org/
et quelques
autres. Beaucoup d'utilisateurs ont imputé le problème à Google à
tort (mot-croisillon http://www.ovh.com/
#GoogleDown
sur
Twitter, ce qui était complètement erroné).
Il est rapidement apparu que le problème venait du
DNS. Ce système permet d'associer à un nom de domaine (comme www.afnic.fr
ou youtube.com
) des données techniques, comme l'adresse IP de
la machine serveuse. Cette adresse IP est indispensable au bon fonctionnement de l'Internet. Résoudre (traduire)
un nom de domaine en adresse IP est le travail
de deux sortes de serveurs DNS : les serveurs faisant autorité, qui
connaissent le contenu d'une partie du DNS (par exemple, les serveurs faisant autorité gérés par l'AFNIC
connaissent le contenu de .fr
, les serveurs faisant autorité pour cfeditions.com
connaissent le contenu de
cfeditions.com
, etc), et les résolveurs. Ces derniers ne connaissent rien mais, demandant aux serveurs faisant
autorité, et mémorisant leur réponse (ce que les informaticiens appellent, bizarrement, « cacher »), ils
obtiennent l'information qu'ils distribuent aux utilisateurs. Les
résolveurs sont typiquement gérés par les FAI (comme Orange) mais il existe aussi des serveurs publics comme ceux de FDN.
L'utilisateur de l'Internet n'a en général pas à s'en soucier, son FAI lui indique automatiquement ses résolveurs
et tout roule.
Normalement, donc, un résolveur n'a pas de données propres et se contente de relayer entre l'utilisateur et le serveur faisant autorité. Mais, comme quasiment toute communication Internet commence par une requête DNS, il est tentant, lorsqu'on souhaite contrôler l'usage de l'Internet, de demander aux résolveurs de mentir, c'est-à-dire de donner une information qui n'est pas celle venue du serveur faisant autorité. C'est ce qui est prévu en France en application du décret n° 2015-125 du 5 février 2015. Le Ministère de l'Intérieur envoie aux principaux FAI une liste des domaines à bloquer (un article de Numérama détaille ce processus) et ceux-ci déploient la configuration nécessaire dans leurs résolveurs.
Mais, ce lundi matin, lorsqu'on interrogeait les résolveurs d'Orange au sujet de l'adresse IP de www.google.fr
, au
lieu de répondre avec l'adresse contenue dans les serveurs faisant autorité pour google.fr (serveurs gérés par
Google), par exemple 216.58.211.99
, ils répondaient 90.85.16.52
, une adresse appartenant à un sous-traitant du Ministère de l'Intérieur.
Lorsqu'un navigateur Web se connecte à cette adresse, il obtient normalement une page l'avertissant que le nom de
domaine fait partie de ceux qui sont bloqués, et un motif est indiqué
(promotion du terrorisme, par exemple, comme dans l'image ci-dessus).
Mais ce serveur était bien trop faible pour encaisser l'énorme trafic de Google et de Wikipédia, et a vite cessé de fonctionner correctement. C'est ce qui explique l'absence de réponse fréquemment rencontrée, faisant croire aux utilisateurs que Google était en panne. (Une autre raison est que la plupart des accès à Google se font désormais en HTTPS et que le serveur du Ministère ne gère pas HTTPS, ne répondant pas, même pas par un refus de connexion.)
Comment une telle bavure a pu se produire ? L'erreur était-elle dans la liste envoyée par le Ministère de l'Intérieur ou bien uniquement chez Orange ? On n'a évidemment pas d'information à ce sujet (les pannes Internet ne font jamais l'objet d'analyses indépendantes et publiques, ce qui explique que la sécurité ne progresse guère). Tout est possible, y compris des erreurs humaines qui sembleraient invraisemblables (mais on voit vraiment de tout dans le monde réel). Une des hypothèses les plus intéressantes (elle explique notamment pourquoi il y a eu plusieurs noms touchés) est celle d'un fichier de test installé par erreur à la place du « bon ».
Au fait, comment sait-on que les clients d'Orange (et uniquement eux) recevaient cette fausse information ? En effet, dans l'Internet d'aujourd'hui, complexe et international, une observation faite en un point n'est pas suffisante. Les clients d'Orange peuvent s'exclamer en chœur « Google est planté » et ceux de Free répondre « non, tout va bien ici ». Et les deux groupes ont raison... de leur point de vue. J'ai utilisé, outre les mesures faites par des experts chez différents FAI (merci, merci, merci), le réseau des sondes RIPE Atlas. Ces petits boitiers très utiles permettent de mesurer un certain nombre d'indicateurs techniques depuis de nombreux points du réseau. (Des détails pour les techniciens figurent à la fin de cet article.)
La panne elle-même, c'est-à-dire l'envoi de fausses informations par les résolveurs DNS d'Orange, a duré environ une heure. Mais son effet avait été prolongé par la mémorisation (les fameux « caches ») des informations dans certains composants du réseau (par exemple la « box » chez l'utilisateur). Cela fait que, plusieurs heures après, Google ou Wikipédia étaient toujours inaccessibles pour certains utilisateurs.
Les leçons à en tirer ? Le DNS est un composant critique de l'Internet et sa résilience, sa capacité à résister aux pannes et à repartir ensuite, est donc cruciale. D'où l'importance de l'Observatoire de la résilience Internet. Toute interférence avec le fonctionnement du DNS, que ce soit pour des raisons politiques ou autres, le met potentiellement en péril. C'est ce qu'avait analysé le rapport du Conseil Scientifique de l'AFNIC « Conséquences du filtrage Internet par le DNS », qui mettait bien en évidence le risque de tels filtrages ou blocages. Une bavure analogue à celle de Google était déjà arrivée au Danemark mais il semble que personne ne tire de leçons de l'expérience.
Que peuvent faire les utilisateurs face à de tels risques ? Le problème de fond est bien évidemment politique (la censure administrative, effectuée au mépris des contraintes opérationnelles) et doit donc être traité politiquement. Mais existe-t-il des solutions techniques ? Pour l'instant, la meilleure est d'avoir son propre résolveur DNS. Notez bien que je ne parle pas forcément d'un résolveur par machine à la maison. Cela peut être fait dans un équipement partagé, comme ce que permet le routeur Turris Omnia. Beaucoup de gens proposaient d'utiliser un résolveur DNS public. Ce n'est pas forcément une bonne solution. Google Public DNS a tous les inconvénients des services Google (bien expliqués dans le récent livre de Tristan Nitot). Cisco OpenDNS y ajoute le fait qu'il s'agit d'un résolveur menteur, comme ceux des principaux FAI français. Ceux d'OpenNIC marchent rarement et, de toute façon, sont une racine alternative, avec les inconvénients que cela présente. Et les résolveurs de FDN ? Ils sont honnêtes mais ils partagent un inconvénient commun avec presque tous les résolveurs DNS publics : ils n'offrent aucune authentification et rien ne garantit donc qu'on parle bien au résolveur qu'on veut. (C'est ainsi que Google Public DNS a déjà été détourné.)
Quelques lectures sur cet incident :
Le reste de cet article est uniquement pour les techniciens,
attention. Le script utilisé pour interroger les sondes Atlas est
décrit
ici. La commande exacte était atlas-resolve --as
3215 --requested 100 www.google.fr
,
l'AS 3215 étant
celui d'Orange.
La panne semble avoir duré d'environ 07:40 UTC à 08:35. Un utilisateur d'Orange qui testait avec dig voyait :
% dig A +short @192.168.10.1 www.google.fr 90.85.16.52 % dig A +short @8.8.8.8 www.google.fr 172.217.20.35
Les sondes Atlas, elles, voyaient :
% atlas-resolve --as 3215 -r 100 www.google.fr [74.125.24.94] : 1 occurrences [216.58.208.195] : 2 occurrences [74.125.206.94] : 2 occurrences [216.58.210.35] : 2 occurrences [216.58.210.227] : 3 occurrences [216.58.211.67] : 3 occurrences [172.217.16.67] : 2 occurrences [216.58.213.35] : 1 occurrences [216.58.211.99] : 2 occurrences [172.217.18.227] : 2 occurrences [216.58.204.3] : 1 occurrences [90.85.16.52] : 75 occurrences [216.58.208.227] : 2 occurrences Test #6886264 done at 2016-10-17T08:06:14Z
Remarquez que certaines sondes, minoritaires, voient la vraie
valeur, sans doute parce que le réseau où elles sont situées
n'utilise pas les résolveurs DNS d'Orange. Mais la grande majorité
voit le 90.85.16.52
mensonger. Un autre exemple
avec les sondes Atlas, mais en leur demandant d'utiliser un autre
résolveur (Google Public DNS) :
% atlas-resolve --as 3215 -r 100 -e 8.8.4.4 www.google.fr Nameserver 8.8.4.4 [172.217.18.227] : 3 occurrences [216.58.219.67] : 1 occurrences [172.217.23.67] : 1 occurrences [216.58.210.3] : 1 occurrences [216.58.211.67] : 8 occurrences [172.217.16.67] : 3 occurrences [216.58.210.163] : 1 occurrences [172.217.16.163] : 2 occurrences [172.217.19.131] : 8 occurrences [216.58.201.35] : 4 occurrences [74.125.206.94] : 4 occurrences [216.58.213.99] : 1 occurrences [172.217.23.99] : 1 occurrences [172.217.20.35] : 5 occurrences [216.58.208.227] : 10 occurrences [216.58.210.131] : 1 occurrences [216.58.204.67] : 2 occurrences [216.58.211.99] : 11 occurrences [216.58.210.227] : 8 occurrences [216.58.212.99] : 2 occurrences [172.217.23.3] : 1 occurrences [216.58.204.3] : 1 occurrences [216.58.208.163] : 1 occurrences [216.58.210.195] : 6 occurrences [216.58.192.99] : 1 occurrences [216.58.208.195] : 10 occurrences Test #6886273 done at 2016-10-17T08:13:06Z
Cette fois, personne ne voit le mensonge (notez que les serveurs DNS de Google servent des réponses très différentes, mais qui sont toutes dans un réseau Google). Notez aussi que d'autres services Google comme Gmail ou comme le spyware Analytics n'avaient aucun problème.
Wikipédia faisait partie des victimes, comme Google :
% atlas-resolve --as 3215 -r 100 fr.wikipedia.org [91.198.174.192] : 21 occurrences [90.85.16.52] : 73 occurrences [208.80.154.224] : 1 occurrences Test #6886283 done at 2016-10-17T08:22:22Z
Merci à tou·te·s c·eux·elles qui m'ont envoyé des informations et des résultats de mesure. Ça, c'est l'Internet, la coopération, l'échange d'informations et la décentralisation.
Date de publication du RFC : Septembre 2016
Auteur(s) du RFC : F. Martin (LinkedIn), E. Lear (Cisco Systems), T. Draegen (dmarcian), E. Zwicky (Yahoo), K. Andersen (LinkedIn)
Pour information
Réalisé dans le cadre du groupe de travail IETF dmarc
Première rédaction de cet article le 11 octobre 2016
Le mécanisme DMARC permet d'indiquer
dans le DNS la politique d'un domaine
concernant l'authentification du courrier. Si je reçois un message
prétendant venir de ma-banque.example
, et
qu'il n'est pas authentifié (ni SPF, ni
DKIM, ni autre chose), comment savoir si
c'est parce que ma banque est nulle en sécurité du courrier, ou bien parce
que le message est un faux ? DMARC (normalisé dans le RFC 7489) permet de répondre à cette
question en publiant un enregistrement qui indique si le courrier
est censé être authentifié ou pas. Comme toutes les techniques de
sécurité, ce mécanisme est imparfait et il pose notamment des
problèmes avec les messages indirects. Par
exemple, si vous avez une adresse à votre ancienne université,
alice@univ.example
et que le courrier qui lui
est adressé est automatiquement transmis à votre adresse
professionnelle, alice@evilcorp.example
,
comment DMARC va-t-il réagir avec cette indirection ? C'est ce
qu'explore ce RFC.
Voici la politique DMARC de Gmail. Elle
est tolérante (p=none
, accepter les messages
non authentifiés) :
% dig TXT _dmarc.gmail.com ... ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59294 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ... ;; ANSWER SECTION: _dmarc.gmail.com. 600 IN TXT "v=DMARC1; p=none; rua=mailto:mailauth-reports@google.com" ...
_dmarc.paypal.com. 300 IN TXT "v=DMARC1; p=reject; rua=mailto:d@rua.agari.com; ruf=mailto:dk@bounce.paypal.com,mailto:d@ruf.agari.com"
La question de départ de l'administrateur système est « si je
mets une politique DMARC restrictive (genre
p=reject
), vais-je perdre des courriers
légitimes, à cause d'indirections comme les listes de diffusion ? » (section 1 du
RFC). Il est d'autant plus difficile de répondre à cette question
que l'architecture du courrier électronique
est complexe et mal spécifiée (RFC 5598). Bien des logiciels ne suivent pas les règles,
d'autant plus que beaucoup de ces règles n'ont pas été explicites
dès le début. (Un bon exemple : avec un
.forward
, le serveur de courrier doit-il
garder l'expéditeur indiqué dans l'enveloppe
du message ? Essayez de trouver un RFC qui spécifie cela !)
La section 2 de notre RFC décrit les causes des problèmes
DMARC. Si un message est légitime (le destinataire veut le
recevoir), et qu'il est en outre techniquement correct, un
problème, au sens de ce RFC, est quand la politique de DMARC (qui
peut être de rejet) est appliquée à ce message, parce qu'il a été
transmis indirectement. C'est injuste. Évidemment, si la politique
DMARC est p=none
(ne rien faire), ce n'est
pas un vrai problème. Mais un p=reject
peut
être très ennuyeux.
Première cause de problèmes, des différences entre les
identificateurs utilisés. DMARC n'authentifie pas directement, il
dépend de SPF (RFC 7208) et DKIM (RFC 6376) pour cela. Ce qui intéresse l'utilisateur,
évidemment, c'est le nom dans le champ From:
(RFC 5322)
du message. Pour lui, c'est ça l'expéditeur. Mais DKIM, et surtout
SPF, n'ont pas la même conception : ils peuvent utiliser d'autres
identificateurs. DMARC considère que l'accord
(alignment, cf. RFC 7489, section 3.1) entre les identificateurs
authentifiés par SPF et DKIM, et le champ
From:
du message peut être strict ou
laxiste. « Strict » indique une correspondance parfaite, laxiste
se limite à vérifier que le nom de domaine
est le même.
Le principal identificateur utilisé par SPF est celui donné par
la commande
MAIL FROM
dans la session SMTP (RFC 5321). C'est la principale cause de
désaccord : si SPF authentifie cet identificateur et qu'il est
différent de l'adresse utilisée dans le champ
From:
de l'en-tête du message, que
faire ?
Deuxième cause de problème, le relayage d'un message. Si Bob
bob@isp.example
écrit à
alice@univ.example
, et qu'elle (ou son
administrateur système) a demandé un relayage automatique vers
alice@evilcorp.example
, les serveurs
de courrier de evilcorp.example
verront un
message prétendant être de isp.example
, mais
transmis par les serveurs de
univ.example
... SPF sera content ou pas,
selon la façon exacte dont a été fait le relayage (en préservant
le MAIL FROM
ou pas). DMARC ne sera jamais
content car, si le MAIL FROM
a été changé
(reflétant le relais), SPF authentifiera mais il n'y aura plus
d'accord entre les identificateurs.
Évidemment, si le message est modifié en cours de route, c'est encore pire. SPF ne protège pas l'intégrité du message, mais DKIM le fait. Mais qui diantre se permet de modifier les messages ? Hélas, pas mal de gestionnaires de listes de diffusion le font. DKIM a une option (déconseillée... voir la section 8.2 du RFC 6376) pour ne signer que le début du message, évitant ainsi que la signature soit invalidée par l'ajout, par exemple, d'un paragraphe final. Cela ne couvre que le cas des messages simples, sans MIME, où la modification est un simple ajout à la fin. Autre possibilité de DKIM pour éviter d'invalider les signatures en cas de modification du message, le mode relaxed de canonicalisation du contenu, qui permet de supporter des modifications triviales comme la transformation de N espaces consécutifs en un seul.
Reprenant le vocabulaire du RFC 5598
(relisez-le d'abord !), la section 3 de notre RFC liste les
différents composants de la messagerie qui peuvent jouer un rôle
dans les transmissions indirectes, et les problèmes qu'elles
posent. D'abord, le MSA (Message Submission
Agent.) C'est la première ligne de vérification : il fait
respecter les règles d'une organisation (ADMD,
ADministrative Management Domain). S'il accepte
un message où le champ From:
du RFC 5322 n'est pas dans un domaine contrôlé par
l'ADMD, il y a des chances que DMARC râle par la suite. Le RFC
cite plusieurs cas d'usage où cela se produit : la fonction
« envoyer cet article à un ami » de certains sites Web, par
exemple, puisque le message va partir avec le domaine du lecteur
de l'article, pas avec celui du site Web. On peut trouver de
nombreux autres exemples, comme un service de gestion d'agenda qui
envoie des courriers de rappel, en utilisant comme expéditeur
l'adresse de l'utilisateur, ce qui est plutôt une bonne chose
(pour des messages du genre « l'heure de la réunion a changé »)
mais peut gêner DMARC. (Mon exemple
préféré est le cas où
on a une adresse de courrier mais pas de moyen de soumettre du
courrier via cette organisation, ce qui est fréquent avec les
adresses de fonction. Par exemple, on est membre d'une
organisation qui fournit des adresses à ses membres et/ou
responsables, ce qui permet de recevoir du courrier, mais on n'a
pas de MSA pour en envoyer, on doit donc utiliser celui d'une
autre organisation.)
Et les MTA, eux, quel est leur rôle dans les problèmes DKIM ? S'il change l'encodage (par exemple en passant du « 8 bits » à l'abominable Quoted-Printable), il va invalider les signatures DKIM (la canonicalisation de DKIM ne prévoit pas des transformations aussi radicales, même si elles ne modifient pas le message final). Idem si le MTA corrige les en-têtes du message pour les rendre conformes (une tâche qui relève plutôt du MSA, le MTA devant lui, transmettre fidèlement les messages qu'il a choisi d'accepter) : cela sort également du champ de la canonicalisation DKIM et cela invalide donc les éventuelles signatures. Enfin, le changement ou la suppression de certaines parties MIME (par exemple l'élision d'un document ZIP attaché, pour des raisons de protection contre les logiciels malveillants transmis par courrier) va évidemment également rendre les signatures invalides.
Et le MDA ? Peut-il casser des choses, également ? Oui, s'il passe les messages par Sieve (RFC 5228), qui a la possibilité d'ajouter ou de retirer des en-têtes, voire de modifier le corps (extension Sieve du RFC 5703). Si les tests DMARC sont faits après le passage de Sieve, ou bien si le message est ensuite réinjecté dans le système de courrier, des problèmes peuvent se produire.
Reste le cas des intermédiaires
(mediators). Ce sont les entités qui prennent
un message, puis le ré-expédient (parfois après modification). Un
exemple est l'alias. Via une entrée dans
/etc/aliases
ou bien via un
.forward
, ou bien via le
redirect
de Sieve, ou encore via encore une autre
méthode, un message initialement destiné à une adresse est
finalement transmis à une autre. C'est par exemple courant pour
les adresses « ancien élève », que fournissent certaines
universités, et qui permettent de garder à vie une adresse dans le
domaine de l'établissement où on a fait ses études. Un certain
nombre d'associations professionnelles fournissent un service
équivalent. En général, ces intermédiaires ne cassent pas DKIM
(ils ne modifient pas le message) mais, selon la façon dont ils
redirigent, peuvent invalider l'autorisation SPF.
Un autre exemple d'intermédiaire classique est le gestionnaire
de listes de
diffusion. En plus de rediriger un message (ce qui
fait que le message écrit par
alice@univ.example
n'est
pas émis par les serveurs de courrier de
l'université), ces logiciels changent souvent le message, par
exemple en ajoutant une inutile étiquette [Ma jolie
liste]
aux sujets des messages, en ajoutant un texte à
la fin (instructions de désabonnement, pourtant déjà possibles
avec l'en-tête List-Unsubscribe:
), en retirant des pièces jointes, ou bien
(surtout dans les théocraties comme les États-Unis) en remplaçant
des gros mots par des termes plus acceptables.
Toutes ces modifications vont probablement invalider les
signatures DKIM (cf. RFC 6377) et faire que les
messages envoyés par certains participants à la liste (ceux qui
ont une politique DMARC p=reject
) ne seront
pas reçus par les destinataires qui testent cette politique. (Si
un avis de non-remise est transmis, le logiciel de gestion de la
liste peut en déduire que l'adresse n'existe pas, et désabonner
d'autorité le destinataire.)
Et les filtres ? Certaines organisations insèrent dans le
réseau des dispositifs qui vont analyser le courrier, par exemple
à la recherche de logiciel
malveillant. Souvent, ils vont modifier les messages,
afin de supprimer ces contenus indésirables. Ces modifications
vont évidemment invalider les signatures. Idem si on change ou
supprime des URL contenus dans le message
et considérés « dangereux ». Même chose avec un
système anti-spam qui ajouterait un [SPAM]
dans le sujet.
En revanche, le courrier reçu d'un serveur secondaire (MX de secours), qui a pris le relais pendant une panne du primaire, puis expédié le courrier quand le primaire remarche, ne pose pas de problèmes. Bien sûr, les tests SPF échoueront mais, normalement, on ne fait pas ces tests sur le courrier qui vient de son propre serveur secondaire.
Bon, voici le tour d'horizon complet de tout ce qui peut marcher mal. Mais que faire ? La section 4 du RFC s'attaque aux solutions. Elles sont nombreuses et très différentes. Mais attention : DMARC est là pour rejeter des messages considérés comme invalides. On peut arranger les choses pour que certains de ces messages « passent » mais cela va contre le but de DMARC. Si les messages sont de grande valeur (transactions financières, par exemple), il vaut mieux ne pas chercher de solutions, et simplement se contenter de messages transmis directement, ne subissant pas de traitements qui vont invalider SPF ou DKIM.
C'est d'autant plus vrai que l'écosystème du courrier électronique est très complexe. On trouve un zillion de logiciels différents, plus ou moins bien écrits. Par exemple, des gens utilisent encore Qmail, qui n'a plus eu une seule mise à jour depuis 1998. Certaines des mesures ou contre-mesures utilisées pour la sécurité du courrier sont parfaitement légales, mais vont casser tel ou tel logiciel qui est utilisé à certains endroits.
Assez d'avertissements, les solutions. D'abord, du côté de
l'expéditeur. Celui-ci (ou son premier MTA)
peut faire des efforts pour améliorer l'accord entre les
identificateurs. Un logiciel sur info.example
qui envoie du courrier pour le compte de
bob@univ.example
peut ainsi décider
d'utiliser un en-tête From:
qui ne posera pas
de problème, celui du vrai envoyeur, et de mettre l'adresse de
Bob dans un Reply-To:
. Comme la plupart des
solutions présentées dans cette section 4, elle est imparfaite (le
destinataire peut se demander qui est cet envoyeur qu'il ne
connait pas). Le RFC fournit de nombreux autres exemples de
désaccord entre identités, qui peuvent être réparés en changeant
un peu le processus d'envoi du message. Comme le disait ma
grand-mère, « il y a toujours une solution, pour peu que chacun y
mette du sien ».
Les envoyeurs peuvent aussi limiter le risque de modifications invalidantes, en ne signant pas trop d'en-têtes avec DKIM, ou en envoyant des messages parfaitement formés (pour éviter aux serveurs ultérieurs la tentation de les « réparer »).
Les receveurs peuvent aussi agir mais leurs possibilités sont plus limitées, note le RFC.
Entre les expéditeurs et les receveurs, il y a tous les
intermédiaires qui prennent un message et le ré-expédient. Ce sont
souvent eux qui causent le problème, et ils sont donc souvent en
position de le réparer. Par exemple, ils peuvent changer le
From:
du message pour mettre le leur, ce qui
permettrait à peu près n'importe quelle modification, et serait
plus « franc » (puisque le message n'est plus tout à fait
l'original, autant changer l'auteur...) Évidemment, dans ce cas,
assez violent,
il faut au minimum garder l'information sur l'émetteur originel,
avec l'en-tête Original-From:
(RFC 5703). Le problème est que le récepteur humain sera sans
doute déconcerté par cet expéditeur (d'autant plus
qu'Original-From:
est peu ou pas
affiché).
Comme les modifications invalident les signatures, les ré-expéditeurs pourraient les éviter, par exemple en ajoutant des en-têtes au lieu de modifier les existants, lorsqu'ils veulent ajouter un contenu (du genre « ceci est un spam »). Il serait peut-être préférable, dans certains cas, de rejeter les messages plutôt que de les modifier, ce qui cassera la vérification de signatures plus loin.
Et, en parlant des ré-expéditeurs, les listes de diffusion, pas vraiment prévues par DKIM, que
faire pour elles ? Le RFC 6377 a déjà traité
leur cas. Une technique courante est de modifier le champ
From:
pour mettre l'adresse de la liste,
réduisant l'auteur original à un commentaire dans cet en-tête
(avis personnel : je déteste ça). Comme cela rend difficile de
répondre en privé au vrai auteur d'un message, l'ajout d'un
Reply-To:
peut aider. Une autre solution est
d'emballer le message original dans une partie
MIME
message/rfc822
. Cette partie resterait intact
et le message emballant aurait comme expéditeur la liste. Mais peu
de MUA savent afficher proprement ce genre
de messages (spécialement dans le monde des mobiles).
Encore plus fasciste, le gestionnaire de liste pourrait
interdire l'abonnement des gens utilisant une adresse où il y a
une politique DMARC autre que p=none
. (Le RFC
oublie de parler du cas où une politique
p=reject
n'existait pas au moment de
l'abonnement mais a été rajoutée après.)
Enfin, il existe aussi des solutions qui sont encore en cours de discussion à l'IETF, et dont le RFC décourage l'usage dans un environnement de production. Ce sont entre autres des extensions au modèle du RFC 8601 pour créer une chaîne d'authentification où chaque acteur important signerait le message en route. Ou, plus radical, des mécanismes stockant l'état initial d'un message avant transformation, pour pouvoir retrouver cet état original et vérifier la signature.
Bref, le problème n'est pas résolu...
Date de publication du RFC : Août 2016
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 10 octobre 2016
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. La première version de YANG était normalisée dans RFC 6020, ce nouveau RFC normalise la nouvelle version, la 1.1, qui a peu de changements, mais certains cassent la compatibilité ascendante.
Ce RFC 7950 est très détaillé, plus 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 (configuration et état) qui seront utilisées par Netconf. Ces données sont représentées sous forme arborescente. YANG est modulaire (section 5.1 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.
Notez que YANG peut être utilisé avec d'autres protocoles que Netconf, comme RESTCONF (décrit dans le RFC 8040).
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 13 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 mais d'autres
encodages sont possibles, cf. RFC 7951) :
<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.20.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 (y compris de la nouvelle version 1.1 décrite dans ce
RFC) et à les convertir dans d'autres formats. Il ne
semble pas trop maintenu 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>
Le site officiel du projet, http://www.yang-central.org/
, contient beaucoup d'autre
information sur YANG.
Notez que l'ancien YANG, 1.0, décrit dans le RFC 6020, n'est pas abandonné. L'ancien RFC reste
d'actualité pour décrire la version 1.0, qui restera en usage un
certain temps. Les principaux changements apportés par la version
1.1 de YANG sont décrits dans la
section 1.1 du RFC. La liste est très longue, mais la plupart ne
sont que des points de détail. Parmi les changements qui peuvent
rendre illégaux des modèles YANG qui étaient légaux avant, il y a
par exemple le changement d'interprétation des échappements dans
les chaînes de caractères, ou bien le fait qu'une chaîne de
caractères qui n'est pas encadrée par des apostrophes ou des
guillemets n'a plus le droit de contenir des apostrophes ou
guillemets (section 6.1.3). De même, les clés (identificateurs
uniques) ne peuvent plus être conditionnelles (instructions
when
ou if-feature
) ce
qui est logique, mais rend également invalide certains anciens
modèles YANG.
Auteur(s) du livre : Tristan Nitot
Éditeur : C&F éditions
978-2-915825-65-7
Publié en 2016
Première rédaction de cet article le 9 octobre 2016
Si vous avez lu tous les articles d'Amaelle Guiton, de bluetouff et d'Andréa Fradin, si vous allez à tous les Quadr'Apéro de la Quadrature du Net (en lisant un livre de Schneier dans le métro) ou, bien sûr, si vous travaillez pour Facebook ou pour la DGSI, ce livre ne vous apprendra rien. Vous savez déjà que l'internaute ordinaire (pas le suspect de djihadisme ou de grand banditisme, non, le fameux M. Michu) est surveillé en permanence par les outils et services numériques qu'il utilise. Mais, contrairement au djihadiste ou au bandit, M. Michu ne le sait pas, ou bien il ne mesure pas exactement l'ampleur de la surveillance généralisée, ou alors il est complètement résigné, convaincu de ne rien pouvoir y faire. Le livre de Tristan Nitot vise à informer cet internaute innocent (dans tous les sens du terme) de la surveillance dont il fait l'objet, mais aussi à proposer des pistes pour améliorer les choses et faire reculer un peu la surveillance. (La préface d'Adrienne Charmet insiste sur l'importance de marcher sur ces deux jambes, l'exposition des problèmes, et celle des solutions.)
Ce livre est très court, ce qui reflète soit la paresse de l'auteur, soit son désir d'être utile à un maximum de gens qui pourraient être découragés en voyant un énorme pavé universitaire (qui, au passage, manque, sur ce sujet). L'auteur présente d'abord la variété des techniques de surveillance existantes. Contrairement à ce que prétendent les menteurs qui affirment qu'avec le chiffrement des smartphones, les policiers ne pourraient plus travailler, notre vie privée a énormément perdu avec l'arrivée de ce phono sapiens. Doté de capteurs perfectionnés, il enregistre tout et transmet tout à ses maîtres (qui ne sont pas son propriétaire...). Ensuite, les GAFA comme Google récoltent une quantité faramineuse de données, que leurs techniques perfectionnées permettent d'analyser. L'auteur donne plusieurs exemples concrets et précis (avec à chaque fois l'URL permettant d'aller se renseigner davantage, souci de sérieux rare). Toute cette partie est très pédagogique. Si vous êtes le geek instruit et politisé cité au début, c'est l'ouvrage à recommander à vos proches (et aux lointains aussi) moins informés, pour qu'ils comprennent ce qui arrive aujourd'hui à tout citoyen. Et ne leur racontez pas tout, laissez-leur le plaisir de découvrir l'erreur gravissime du cochon, citée à chaque conférence de l'auteur :-)
Tristan Nitot tord aussi le cou à quelques mythes comme le « je n'ai rien à cacher ». On a tous des choses (tout à fait légales) à cacher. Personnellement, je demande aux gens qui affirment n'avoir rien à cacher « votre dernier relevé bancaire, et la liste de vos dix derniers partenaires sexuels, avec les pratiques utilisées ».
Un point important de son livre est la question du modèle économique des acteurs de l'Internet. Si Google et Facebook nous surveillent autant, ce n'est pas parce qu'ils sont des filiales de la NSA, ni parce qu'ils sont vendus au diable ou aux reptiliens. C'est parce qu'ils sont gratuits, et qu'il faut bien se financer d'une manière ou d'une autre. Exploiter les données personnelles est une méthode rentable, et largement invisible pour l'utilisateur. Elle nécessite la récolte du plus grand nombre de données personnelles possible, et il n'est donc pas exagéré de noter que « le modèle d'affaires du Web, c'est la surveillance ».
Le désir de l'auteur (et de la préfacière) de ne pas uniquement décrire l'affreuse surveillance dont nous sommes l'objet, mais également de faire preuve d'un certain optimisme en indiquant des choix qui amélioreraient les choses, va parfois un peu loin. Si je peux comprendre l'analyse mesurée que Nitot fait d'Apple (société dont il ne cache pas les défauts mais qui, en matière de surveillance, semble en effet « moins pire » que les autres), j'ai plus de mal avec l'éloge qu'il fait de la société Sen.se dont le fondateur répète partout que la vie privée n'est pas son problème car « Facebook fait pire ». C'est ainsi que le produit Mother de cette société envoie tout dans « un ordinateur de quelqu'un d'autre » et que c'est présenté comme inévitable.
L'auteur continue en expliquant qu'un autre Internet est possible. Car dénoncer la surveillance, c'est très bien, mais cela peut mener à la sidération : convaincu d'être surveillé de partout, et de ne pas pouvoir l'empêcher, sauf à vivre dans une grotte sans électricité, le citoyen pourrait se décourager et renoncer à son droit à la vie privée. Il est donc nécessaire de proposer des pistes d'amélioration. Plusieurs sont avancées : le logiciel libre, bien sûr, condition nécessaire (mais pas du tout suffisante), le paiement des services (« si c'est gratuit, c'est que vous n'êtes pas le client, vous êtes la marchandise »), l'auto-hébergement (sans cacher, comme pour les autres solutions, les extrêmes difficultés que cela pose), le chiffrement (encore une condition nécessaire mais pas suffisante)... Nitot demande aussi que les partisans d'un autre Internet s'attaquent aussi au problème difficile de faire aussi bien, voire mieux, que les GAFA en matière de vécu utilisateur.
L'auteur détaille aussi, avec beaucoup de précision, quelques mesures d'hygiène numérique qui peuvent permettre de limiter un peu les dégâts de la surveillance. Par exemple, bloquer le spyware Google Analytics, ou bien avoir son propre nom de domaine permet de ne pas dépendre d'un seul fournisseur, et d'être donc libre de le quitter si ses pratiques ne sont pas acceptables.
Notons que ces manipulations sont parfois longues, ce qui reflète le désir des maîtres de la surveillance de nous empêcher de diminuer celle-ci. Il faut ainsi neuf étapes pour configurer Twitter de manière plus respectueuse de la vie privée.
Pour une genèse du livre, par son auteur, et pour une liste exhaustive des articles qui en parlent, voir sur le Standblog.
Déclaration de conflit d'intérêts : j'ai reçu un exemplaire gratuit de ce livre, mais il n'était pas accompagné d'une bouteille de vin, donc j'écris cet article à jeun et en toute objectivité.
Date de publication du RFC : Septembre 2016
Auteur(s) du RFC : L. Iannone (Telecom ParisTech), D. Lewis (Cisco), D. Meyer (Brocade), V. Fuller
Expérimental
Réalisé dans le cadre du groupe de travail IETF lisp
Première rédaction de cet article le 23 septembre 2016
Le protocole expérimental LISP a besoin
d'identificateurs pour les machines qui participent à
l'expérimentation. Comme les identificateurs LISP sont pris dans
le même espace de nommage que les adresses IP, il était préférable d'avoir un
préfixe IP spécifique. C'est désormais chose faite, avec ce
RFC, qui demande et obtient le préfixe
2001:5::/32
. Si vous voyez quelque chose qui
ressemble à une adresse IP et qui emploie ce préfixe, c'est qu'il
s'agit d'un identificateur LISP.
En effet, LISP (RFC 6830) repose sur le principe de
la séparation
de l'identificateur et du localisateur. Les identificateurs
sont stables et servent à... identifier une machine, les
localisateurs sont liés aux connexions qu'on a au réseau et
servent au routage. Les deux ont la forme physique d'une adresse
IP, et on ne peut donc pas les distinguer par leur syntaxe. Les
identificateurs sont formellement nommés EID (Endpoint
IDentifier) et c'est pour eux que
2001:5::/32
a été réservé (section 1 du RFC).
La section 3 explique les raisons de cette réservation :
2001:5::/32
au
lieu de devoir découper une partie de son espace
d'adressage.D'où cette réservation d'un préfixe dédié, en suivant les règles du RFC 3692.
Les réseaux qui utiliseront ce préfixe ne doivent évidemment pas annoncer de routes dans la DFZ (section 4 du RFC), ce préfixe ne servant qu'à des identificateurs et pas aux localisateurs. Pour la communication entre un réseau LISP numéroté avec le nouveau préfixe, et un réseau IP traditionnel, il faut utiliser les techniques d'interconnexion des RFC 6832 et RFC 7215. Le préfixe complet pourra être annoncé (comme un tout, ou comme des sous-préfixes très généraux, pour ne pas surcharger la table de routage) par des routeurs d'interconnexion (section 8 du RFC). Pour les routeurs non-LISP, ce sera un préfixe comme un autre, et il n'y a aucune raison de lui appliquer un traitement particulier.
Notre RFC exige également que ce nouveau préfixe
2001:5::/32
ne soit utilisé que par
configuration explicite et ne soit donc pas mis en dur dans le
logiciel des routeurs, d'abord parce que LISP pourra en utiliser
d'autres dans le futur, ensuite parce que des réseaux feront quand
même du LISP avec leurs propres adresses.
Pourquoi un préfixe de 32 bits ? Pourquoi pas plus spécifique ou moins spécifique (cela a été une grosse discussion dans le groupe de travail) ? La section 5 donne les raisons de ce choix :
Le préfixe 2001:5::/32
est alloué pour
trois ans, ce qui est suffisant pour l'expérimentation (sections
6 et 7). À la fin de celle-ci, le préfixe sera rendu ou bien transformé
en allocation permanente (qu'il faudra justifier et
documenter, cf. RFC 2860, section 4.3). L'allocation, faite en octobre 2015, est notée dans le registre IANA.
L'allocation des préfixes à l'intérieur de
2001:5::/32
est décrite dans le RFC 7955.
Date de publication du RFC : Septembre 2016
Auteur(s) du RFC : L. Iannone (Telecom
ParisTech), R. Jorgensen (Bredbandsfylket
Troms), D. Conrad (Virtualized,
LLC), G. Huston (APNIC)
Pour information
Réalisé dans le cadre du groupe de travail IETF lisp
Première rédaction de cet article le 23 septembre 2016
Le RFC 7954 réservait un préfixe
IP, 2001:5::/32
, pour
les identificateurs du protocole expérimental
LISP. Ce RFC 7955 décrit les
mécanismes d'allocation à l'intérieur de ce préfixe. Ils sont
simples et légers : un peu de documentation et on a son sous-préfixe.
Le RIPE-NCC assure la gestion de ce préfixe. La politique d'enregistrement est simple (sections 4 et 9 de notre RFC) :
2001:5::/32
. Si l'expérience
se termine et que le 2001:5::/32
cesse
d'être utilisé, tous ses sous-préfixes disparaitront aussi.Quelles sont les règles que suivra le registre de
2001:5::/32
(section 5) ?
ip6.arpa
correspondants au préfixe géré.La section 6, en effet, contient les informations demandées aux titulaires (ce sont à peu près les mêmes que pour obtenir un numéro d'organisation privé). On y trouve les grands classiques, nom de l'organisation qui demande, adresse, informations de contact, taille du préfixe demandé, raisons de la demande...
Comme indiqué plus haut, c'est le RIPE-NCC qui gérera le préfixe. Normalement, tout est déjà en place mais pas encore annoncé (cela sera mis en ligne après la publication du RFC).
Auteur(s) du livre : Cyril Hlakkache
Éditeur : Kawa
978-2-36778-097-9
Publié en 2016
Première rédaction de cet article le 21 septembre 2016
Je suis perplexe devant ce livre. D'un côté, j'apprécie (comme Jean-Michel Planche, qui fait la postface) qu'on prenne de la hauteur par rapport aux transformations induites par le numérique, et qu'on essaie d'en parler à un large public. De l'autre, je me méfie des livres qui tentent de traiter tout en 250 pages, sautant d'un sujet à l'autre, et abusant de termes grandiloquents (mutation, digital, agilité...).
Mais le résultat n'est pas mauvais : l'auteur connaît ses sujets et, s'il se livre à quelques approximations et raccourcis, je n'ai pas trouvé de grosse erreur ridicule pour faire rire les lecteurs de mon blog. Pour donner une idée du style du livre, l'auteur parle de NTP en disant « C'est [NTP] qui permet au réseau des réseaux de battre la mesure pour que le tout fonctionne dans un même espace-temps ».
Cyril Hlakkache couvre à peu près tout ce qui a un rapport avec le numérique : Internet, la sécurité, le logiciel libre, les mégadonnées, la sous-traitance (pardon, cloud, c'est plus joli), la vie privée, la réalité virtuelle (avec Second Life ressorti des poubelles de l'histoire), l'IA, Bitcoin et le transhumanisme... Régulièrement, il dérape en se lançant dans des discours quasi-commerciaux et a-critiques, puis il corrige en reprenant un point de vue humaniste, soucieux des droits et des libertés des humains.
Globalement, c'est donc un livre que vous pouvez suggérer aux gens qui ne sont pas eux-mêmes complètement immergés dans cet univers numérique, et qui cherchent à s'informer et comprendre.
Déclaration de conflit d'intérêt : j'ai reçu un exemplaire de ce livre gratuitement.
Pour le suivi, il existe un blog du livre.
Date de publication du RFC : Août 2016
Auteur(s) du RFC : J. Saldana (University of
Zaragoza), A. Arcia-Moret (University of
Cambridge), B. Braem
(iMinds), E. Pietrosemoli (The Abdus Salam
ICTP), A. Sathiaseelan (University of
Cambridge), M. Zennaro (The Abdus Salam ICTP)
Pour information
Réalisé dans le cadre du groupe de recherche IRTF gaia
Première rédaction de cet article le 17 septembre 2016
On pourrait croire que la seule façon d'accéder à l'Internet est via un FAI commercial, géré hiérarchiquement (avec directeur, plein de sous-directeurs, etc), dont les utilisateurs paient pour bénéficier de l'accès (mais sans avoir leur mot à dire sur le fonctionnement du FAI), et disposant de grands moyens financiers et techniques. C'est certainement la vision dominante et elle arrange bien les gens des médias et des gouvernements, qui se retrouvent dans une situation connue, avec un petit nombre d'acteurs « professionnels ». Heureusement, l'Internet n'est pas comme cela : c'est une confédération de réseaux très variés, certains effectivement gérés comme indiqué plus haut, mais d'autres fonctionnant sur des modèles très différents, ayant fait des choix techniques, de gouvernance et de financement très différents et très variés. Cet excellent RFC décrit et classe les réseaux « alternatifs ».
Il a été écrit dans le cadre du groupe de recherche GAIA (Global Access to the Internet for All) de l'IRTF. GAIA vise à documenter ces déploiements « alternatifs » et à faciliter le partage d'expérience. Outre le simple rappel de l'existence de ces réseaux « alternatifs », son mérite est de proposer une taxonomie de ces réseaux (forcément imparfaite, vu leur variété) et de donner une idée de la variété des technologies qu'ils utilisent.
Ces techniques sont en effet souvent différentes de celles utilisées dans les réseaux « officiels » (mainstream). Ces réseaux « alternatifs » visent en général des situations difficiles, comme la connexion de lieux lointains, où l'argent ne coule pas à flots. À part cela, ces réseaux n'ont rien en commun, ni leur organisation, ni leurs buts. Qu'est-ce qui motive leur création ? (Au passage, le RFC fait comme si ces réseaux « alternatifs » étaient une création récente ; certains sont au contraire aussi vieux que l'Internet.) Les raisons de ces projets sont elles aussi très diverses : absence pure et simple de FAI commercial, insatisfaction vis-à-vis des FAI officiels existants, désir d'essayer quelque chose d'autre...
Passons au difficile jeu des définitions. Le RFC (section 1.1) définit le réseau « officiel » (mainstream) ainsi :
Et les réseaux « alternatifs », comment se définissent-ils (section 1.2) ? C'est plus difficile car il en existe de nombreuses variantes :
Ce problème des définitions est évidemment très présent dans tout le RFC. Par exemple, comment parler des pays qui ne sont pas les membres de l'OCDE (et encore, l'OCDE compte deux ou trois membres « intermédiaires ») ? Le Tiers-Monde ? Le Sud ? Les pays pauvres ? Les sous-développés ? Les « en voie de développement » ? La section 2 du RFC propose des définitions :
Maintenant, les cas où on déploie ces réseaux « alternatifs » (section 3 du RFC). Il y aurait actuellement 60 % de gens sur Terre sans connectivité Internet. Et la répartition est très inégale (20 % sans connexion au « Nord », 69 % au « Sud »). Parmi les facteurs qui vont intervenir :
Dans les zones rurales, on a vu que c'était souvent pire. Johnson, D., Pejovic, V., Belding, E., et G. van Stam, dans leur article « Traffic Characterization and Internet Usage in Rural Africa » (In Proceedings of the 20th International Conference Companion on World Wide Web) rapportent des latences mesurées à plusieurs secondes. Les problèmes des zones rurales sont souvent cruciaux : faible revenu monétaire, manque d'infrastructures de base comme l'électricité et les routes, densité de population réduite, manque de compétences (les techniciens compétents quittent rapidement ces zones pour aller en ville), etc.
La section 4 de notre RFC s'attaque ensuite au difficile problème de la classification de ces réseaux « alternatifs ». Sur quels critères faire cette classification ? Les auteurs du RFC en trouvent cinq. D'abord, quelle organisation gère le réseau ? Un groupe plus ou moins formel d'utilisateurs ? Une collectivité publique ? Une société privée ? Un organisme de recherche ou d'enseignement ? (En France, on aurait ajouté « Une association loi 1901 ? »)
Second critère de classification, le but de la création de ce réseau : fournir un accès qui n'existerait pas du tout autrement ? Fournir une alternative bon marché ? Expérimenter et tester ? S'attaquer à d'autres problèmes de fracture numérique (comme la littératie numérique) ? Fournir un accès d'urgence suite à une catastrophe ? Ou bien un but plus politique, par exemple des mécanismes de gouvernance différents, une approche davantage « bien commun » ? Ou fournir un accès libre et neutre, contrairement à ce que font la quasi-totalité des FAI ? (Ce dernier point est présenté de manière très modérée dans le RFC qui, globalement, évite de parler des choses qui fâchent, comme la politique.)
Bien sûr, un réseau alternatif peut avoir plusieurs de ces mobiles. Et ceux-ci peuvent être plus ou moins explicites, et ils évoluent dans le temps. Le réseau Redhook avait commencé plutôt comme outil local, avant de devenir le seul réseau à fonctionner après Sandy.
Un autre critère, proche du premier, est celui du modèle de gouvernance : très ouvert, avec une participation active des utilisateurs, ou bien plus traditionnelle, avec une organisation centrale qui s'occupe de tout ? (On peut avoir un réseau qui est la propriété d'un groupe d'utilisateurs mais qui, en pratique, est géré par une petite organisation structurée.)
Autre critère, qui va plaire aux techniciens, quelles sont les techniques employées dans ce réseau ? Wi-Fi traditionnel ? Wi-Fi modifié pour les longues distances (WiLD) ? WiMAX ? Espaces blancs de la télévision (cf. RFC 7545) ? Satellite comme dans le projet RIFE ? Voire des fibres optiques terrestres ?
Enfin, dernier critère de classification, le contexte : zone rurale ou urbaine, Nord ou Sud.
Avec ces critères, on peut maintenant procéder à la classification (section 5 du RFC). Notre RFC distingue (un peu arbitrairement) six catégories, caractérisées par les réponses à ces cinq critères. Première catégorie, les réseaux d'un groupe local (community networks). Géré par un groupe de citoyens proches, ils ont typiquement un fonctionnement très ouvert et participatif. Leur croissance est en général non planifiée et non organisée : les premiers membres se connectent puis d'autres volontaires les rejoignent. Le mécanisme de décision est la plupart du temps très décentralisé. En général, ils utilisent le Wi-Fi et chaque membre contribue donc à la croissance du réseau « physique » sous-jacent. Plusieurs exemples de tels réseaux sont décrits dans l'article de Braem, B., Baig Vinas, R., Kaplan, A., Neumann, A., Vilata i Balaguer, I., Tatum, B., Matson, M., Blondia, C., Barz, C., Rogge, H., Freitag, F., Navarro, L., Bonicioli, J., Papathanasiou, S., et P. Escrich, « A case for research with and on community networks », et une analyse technique détaillée d'un réseau d'un groupe local figure dans Vega, D., Baig, R., Cerda-Alabern, L., Medina, E., Meseguer, R., et L. Navarro, « A technological overview of the guifi.net community network ».
Seconde catégorie, les WISP (Wireless Internet Service Providers). Cette fois, le réseau est géré par une société traditionnelle, mais il est « alternatif » par le public visé (typiquement des régions rurales mal desservies, où l'infrastructure est minimale, et où les FAI traditionnels ne vont pas). C'est par exemple le cas de la société Airjaldi en Inde, ou d'EveryLayer.
Troisième catégorie de réseaux alternatifs, l'infrastructure partagée (Shared Infrastructure model). L'infrastructure du réseau est partagée entre un opérateur traditionnel et les utilisateurs. C'est le cas lorsque les utilisateurs détiennent le matériel (par exemple femtocell) mais que la gestion est assurée par un FAI. Les utilisateurs sont payés, soit directement par le FAI qui leur loue l'infrastructure, soit indirectement par l'accès à l'Internet qu'ils obtiennent via ce FAI. Dans pas mal de régions rurales dans le monde, la 3G a été déployée ainsi, via les femtocells. Prévue à l'origine pour fournir une meilleure couverture dans les bâtiments, cette technologie peut aussi être utilisée pour fournir des accès aux téléphones mobiles sans que l'opérateur ait eu à supporter de gros investissements.
Un exemple d'infrastructure partagée est le projet TUCAN3G, en utilisant WiLD Ce projet est décrit par Simo-Reigadas, J., Morgado, E., Municio, E., Prieto-Egido, I., et A. Martinez-Fernandez dans « Assessing IEEE 802.11 and IEEE 802.16 as backhaul technologies for rural 3G femtocells in rural areas of developing countries » et par Simo-Reigadas, J., Municio, E., Morgado, E., Castro, E., Martinez-Fernandez, A., Solorzano, L., et I. Prieto- Egido dans « Sharing low-cost wireless infrastructures with telecommunications operators to bring 3G services to rural communities ».
Autre catégorie possible, les approches « foule de volontaires » (Crowdshared approaches) où des utilisateurs qui ne se connaissent pas forcément mettent la main au portefeuille pour participer à un projet commun, qui sera géré par une une société ou par eux-mêmes. Typiquement, les utilisateurs mettent à la disposition de tous une partie de leur capacité réseau, et l'entité qui gère le réseau est une simple coordination, elle ne possède rien. C'est ce que promeut le mouvement OpenWireless. Parmi les exemples, on peut citer des sociétés comme FON, les projets municipaux comme décrit dans l'article de Heer, T., Hummen, R., Viol, N., Wirtz, H., Gotz, S., et K. Wehrle, « Collaborative municipal Wi-Fi networks- challenges and opportunities », ou les réseaux Wi-Fi de Sathiaseelan, A., Crowcroft, J., Goulden, M., Greiffenhagen, C., Mortier, R., Fairhurst, G., et D. McAuley, « Public Access WiFi Service (PAWS) ».
Il y a aussi des réseaux montés par des coopératives en milieu rural, ce qui forme la cinquième catégorie identifiée. Ce genre de coopératives fournissant un service local est courant et ancien. Le RFC cite l'exemple des États-Unis où l'électricité en milieu rural est souvent fournie ainsi, et ce depuis les années 1930. Ces coopératives peuvent même passer leurs propres fibres optiques (« CO-MO'S D.I.Y. model for building broadband »). Des partenariats sont possibles avec ceux qui fournissent d'autres services que l'Internet, comme l'électricité dans l'exemple ci-dessus. Deux exemples sont donnés dans l'article de Mitchell « Broadband at the Speed of Light: How Three Communities Built Next-Generation Networks » ou dans le guide « Broadband Guide for Electric Utilities ».
Enfin, dernière catégorie de réseau alternatif, ceux créés à des fins de recherche. Par exemple, le réseau est créé par une université pour explorer une technique et/ou des usages (comme Bernardi, B., Buneman, P., et M. Marina, « Tegola tiered mesh network testbed in rural Scotland »).
Après cette catégorisation des réseaux alternatifs, penchons-nous sur les technologies utilisées (section 6 du RFC). Le cas de réseaux filaires est rare mais existe (comme à Lowenstedt ou dans certains endroits de Guifi.net). La plupart du temps, les réseaux alternatifs utilisent l'hertzien. Les normes techniques en œuvre sont en général celles du groupe IEEE 802.
La plus connue est évidemment Wi-Fi (802.11). Mais on trouve aussi du GSM (une norme ETSI) par exemple dans un village mexicain ou dans le projet Village Base Station. Il y a même du GSM en logiciel libre, dans les projets OpenBTS ou OpenBSC. Ces projets sont en train de migrer vers des technologies plus rapides (mais, ce que le RFC oublie de dire, bien moins libres, notamment car pourries de brevets) comme la 4G.
On a signalé plus haut que certains réseaux peuvent utiliser les espaces blancs laissés par la télévision, découvrant les fréquences utilisables via une base de données (RFC 7545) ou bien en regardant le trafic existant pour voir si l'espace est vraiment blanc.
Le Wi-Fi est limité en portée, et certains réseaux utilisent des techniques plus adaptées aux longues distances comme WiMAX (IEEE 802.16) ou bien 802.22, qui utilise justement ces espaces blancs.
Et dans les couches au-dessus de ces couches 1 et 2, quelles techniques utilisent les réseaux alternatifs ? La section 7 du RFC décrit rapidement les divers choix. D'abord, la couche 3. La plupart des réseaux n'utilisent qu'IPv4 et, ne pouvant pas obtenir suffisamment d'adresses IP des RIR sans gros efforts, se limitent aux adresses IP privées du RFC 1918. (Avant l'épuisement des adresses IPv4, obtenir des adresses des RIR était plus simple que beaucoup de gens ne le croyaient, mais il fallait quand même se taper une bureaucratie complexe et des règles difficiles.)
Pour la plupart des réseaux alternatifs, IPv6 était déjà normalisé depuis longtemps lorsqu'ils ont démarré leur projet. Mais peu l'utilisent (ninux.org est une exception), probablement essentiellement par ignorance. (Le questionnaire « Questionnaire based Examination of Community Networks » incluait des questions sur IPv6).
Pour le routage, les choix dépendent souvent de la structure du réseau alternatif. Certains sont de type mesh, avec peu ou pas d'autorité centrale, d'autres sont plus structurés. Il y a donc des protocoles de routage traditionnels comme OSPF (le RFC cite aussi BGP, ce qui me surprend pour un réseau alternatif).
Mais il y a aussi des protocoles prévus pour des réseaux moins
structurés, comme ceux utilisés dans les
MANET. On peut trouver de
l'OLSR (RFC 3626),
parfois dans des versions modifiées (ce qui est le cas de http://olsr.org/
), ou parfois sa récente version 2 (RFC 7181). D'autres réseaux utilisent du
BATMAN. Le RFC cite l'excellent
Babel (RFC 8966) mais
n'indique pas s'il est très employé sur le terrain (il semble
moins connu, dans un milieu où l'information circule mal).
Et la couche au-dessus, la couche transport ? L'un des problèmes que doit traiter cette couche est celui de la congestion : il faut assurer le partage de la capacité réseau entre plusieurs acteurs. Dans les réseaux alternatifs, pas forcément gérés centralement, et aux frontières pas toujours nettement délimitées, le défi est encore plus important. Il peut donc être intéressant d'enourager des protocoles « raisonnables » (RFC 6297), qui cèdent le pas systématiquement aux autres protocoles, afin que les activités non-critiques ne rentrent pas en compétition avec le trafic « important ».
Enfin, les utilisateurs ne s'intéressent typiquement qu'à une seule chose, les services, et il est donc utile de se demander ce que ces réseaux alternatifs proposent. Il y a bien sûr tous les services de base, notamment le Web. Certains services très répandus (vidéo haute définition, par exemple), peuvent être très coûteux pour les ressources souvent limités du réseau alternatif. Leur utilisation peut donc être restreinte. Et il y a aussi des services spécifiques des réseaux alternatifs : des VPN comme IC-VPN, des portails d'intérêt local comme Tidepools, des télévisions ou radios locales, des systèmes de relais de VoIP pour permettre des appels bon marché, des réseaux de capteurs permettant de la citizen science, etc.
Voilà, c'est terminé, cet article était long mais le RFC est plus long encore, et il se termine par une impressionnante bibliographie dont je n'ai cité que quelques extraits : plein de choses passionnantes à lire.
Date de publication du RFC : Août 2016
Auteur(s) du RFC : F. Le
Faucheur, G. Bertrand, I. Oprescu, R. Peterkofsky
(Google)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF cdni
Première rédaction de cet article le 16 septembre 2016
Ce RFC fait partie de la série qui normalise les interactions entre un CDN amont (celui choisi par le client) et un CDN aval (celui auquel, pour une raison ou pour une autre, une partie du trafic est délégué). Il traite la question de la journalisation : comment est-ce que le CDN aval remonte au CDN amont le journal d'activité ?
Cette idée d'interconnexion standard des CDN est expliquée dans le RFC 6707, le cadre général est dans le RFC 7336, dont la section 4.4 identifie le besoin d'un mécanisme de journalisation, et le cahier des charges est dans le RFC 7337, la journalisation étant couverte dans sa section 8.
Notre nouveau RFC décrit d'abord (section 2) le modèle de la journalisation. Certains des aspects de celle-ci (comme la possibilité pour le CDN amont de configurer ce que le CDN aval va journaliser ou pas) sont considérés comme hors-sujet. Dans le modèle, la seule activité normalisée est la remontée des journaux depuis le CDN aval. Cela permettra au CDN amont de faire de jolies statistiques, de payer son CDN aval selon son activité, etc.
Après, on descend dans le concret : la section 3 décrit le
format des journaux. Il est très inspiré du format
ELF. Un fichier journal est composé d'enregistrements,
chacun composé de champs. Voici un exemple d'une requête
HTTP (où
<HTAB>
désigne une
tabulation horizontale) :
2013-05-17<HTAB>00:39:09.145<HTAB>15.32<HTAB>FR/PACA/NCE/06100<HTAB>GET<HTAB>http://cdni-ucdn.dcdn-1.example.com/video/movie118.mp4<HTAB>HTTP/1.1<HTAB>200<HTAB>15799210<HTAB>"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.127 Safari/533.4"<HTAB>"host1.example.com"<HTAB>1
Mais attention en lisant cet exemple, le format effectif peut être modifié par des directives placées au début du fichier. (La liste des directives figure dans un registre IANA.)
Le fichier journal peut être transmis par divers protocoles (sections 4 et 5 du RFC) mais celui décrit dans ce RFC est fondé sur Atom (RFC 4287). Le CDN aval publie un flux Atom où le CDN amont trouvera les noms des fichiers à télécharger, a priori en HTTP (et même plutôt HTTPS puisque ces journaux sont confidentiels, cf. section 7.3).
Date de publication du RFC : Septembre 2016
Auteur(s) du RFC : E. Jasinska (BigWave
IT), N. Hilliard (INEX), R. Raszuk
(Bloomberg LP), N. Bakker (Akamai)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF idr
Première rédaction de cet article le 9 septembre 2016
Ce nouveau RFC spécifie le comportement des serveurs de routes des points d'échange Internet. Un serveur de route collecte avec BGP les routes envoyées par ses pairs et les redistribue. Cela nécessite quelques ajustements du protocole BGP, expliqués ici. Un autre RFC, le RFC 7948, décrit le côté opérationnel.
Un point d'échange Internet connecte un certain nombre d'acteurs (opérateurs, hébergeurs, FAI, etc) à un réseau commun, en général au niveau de la couche 2, et avec Ethernet. Chacun de ces acteurs gère son ou ses routeurs, connecté au·x commutateur·s commun·s. Pour savoir à quel pair envoyer des paquets IP, ces routeurs ont besoin de s'informer mutuellement des préfixes IP qu'ils gèrent. Cela se fait avec le protocole BGP (RFC 4271).
Si le point d'échange rassemble N acteurs, connecter tout le monde nécessiterait N*(N-1)/2 sessions BGP. À chaque fois qu'un participant arriverait, il faudrait qu'il négocie N-1 accords de peering. Et, en fonctionnement quotidien, il devrait superviser N-1 sessions BGP. L'idée de base du serveur de routes est d'introduire un intermédiaire (le serveur de routes, route server), qui reçoit les routes de chacun et les redistribue à tous. Ainsi, il n'y a qu'une seule session BGP à établir, avec le serveur de routes. Il est en général géré par l'opérateur du point d'échange. (Sur la plupart des points d'échange, l'usage de ce serveur de routes n'est pas obligatoire, et il y a donc également des sessions BGP directes entre les participants, pour des raisons variées.)
Le serveur de routes parle BGP avec ses pairs (les routeurs des participants au point d'échange) mais lui-même n'est pas un routeur : il ne transmet pas les paquets IP. Il travaille sur le plan de contrôle, pas sur celui des données.
Un serveur de routes est donc très proche d'un réflecteur (RFC 4456). La différence est que le réflecteur de routes travaille à l'intérieur d'un AS (protocole iBGP), alors que le serveur de routes travaille entre AS différents (protocole eBGP).
Un serveur de routes ressemble aussi à un collecteur de routes, comme ceux du RIS. La différence est que le collecteur ne redistribue pas d'information à ses pairs BGP, il collecte des données, pour analyse, affichage, etc.
La section 2 du RFC forme le cœur de ce document. Elle
rassemble les modifications du protocole BGP qui sont nécessaires
pour le bon fonctionnement du serveur de routes. D'abord, le
serveur ne doit pas modifier sans bonne raison les annonces qu'il
reçoit : son but est de distribuer de l'information, pas de la
bricoler. Le RFC demande ainsi que les attributs BGP bien connus
(comme AS_PATH
)
ne soient pas modifiés, sauf très bonne raison. Ainsi, l'attribut
NEXT_HOP
qui indique l'adresse IP du routeur
à qui faire suivre les paquets, ne doit pas être changé (ce que
demandait la section 5.1.3 du RFC 4271) : le
serveur de routes n'est pas un routeur, c'est à l'annonceur
original qu'il faut transmettre les paquets. Idem pour
AS_PATH
cité plus haut : le serveur de routes
ne doit pas mettre son propre numéro d'AS
dans le chemin. De même, MULTI_EXIT_DISC
(qui
sert à choisir entre plusieurs routeurs d'un même AS voisin) doit
être propagé aux clients du serveur de routes (normalement, il
n'est pas propagé aux autres AS). Et, enfin, les communautés BGP
(RFC 1997)
indiquées dans une annonce ne doivent pas être changées, sauf
évidemment si elles sont destinées au serveur de routes
lui-même. On trouve des exemples de communautés destinées au
serveur de routes dans la
documentation du serveur de routes d'AMS-IX ou bien dans celle de celui de
Netnod, alors que celle
de France-IX se trouve dans un objet RIPE. Il y a aussi des
serveurs de routes (comme ceux du France-IX
qui étiquettent les annonces apprises avec une communauté
indiquant où la route a été apprise (dans quel POP.)
Par défaut, toutes les routes de tous les clients sont
distribuées à tous les autres clients. C'est le but d'un serveur
de routes. Mais on peut souhaiter parfois une certaine restriction
à cette redistribution. Cela peut être mis en œuvre par le serveur
de routes (puisque le routeur original de l'annonce parle au
serveur de routes, pas au client final). Idéalement, le serveur de
routes devrait donc maintenir une base de routes, et un processus
de décision BGP, pour chacun de ses clients. Cela permet de coller
au mode de fonctionnement normal de BGP. Et cela ne nécessite
aucun changement chez les clients. Mais c'est plus coûteux en
ressources pour le serveur de routes. (Pour
BIRD, voir l'option
secondary
, qui réduit l’usage mémoire et CPU
de manière importante, expliquée dans
cet exposé.)
Les autres solutions à ce problème d'un filtrage par client
nécessitent des extensions à BGP, comme le Diverse
path du RFC 6774 ou comme la future option
ADD-PATH
.
L'annexe de ce RFC consacrée aux remerciements résume un peu d'histoire des serveurs de routes. La première description de ce système date de 1995, dans le RFC 1863 (depuis reclassé comme « d'intérêt historique seulement », cf. RFC 4223).
Plusieurs mises en œuvre de serveurs de route existent évidemment, conformes à ce RFC. C'est par exemple le cas chez Cisco, BIRD et Quagga (voir le rapport technique sur ces programmes).
Merci à Arnaud Fenioux pour sa relecture et ses ajouts et corrections.
Date de publication du RFC : Septembre 2016
Auteur(s) du RFC : N. Hilliard (INEX), E. Jasinska (Netflix), R. Raszuk (Mirantis), N. Bakker (Akamai Technologies)
Pour information
Réalisé dans le cadre du groupe de travail IETF grow
Première rédaction de cet article le 9 septembre 2016
Les points d'échange Internet sont un des maillons essentiels du bon fonctionnement de l'Internet, permettant des connexions faciles et relativement bon marché entre opérateurs. Une fois physiquement connecté au point d'échange, l'opérateur Internet doit encore établir une connexion BGP (RFC 4271) avec ses pairs. Si ceux-ci sont nombreux, établir N connexions bilatérales représente un coût administratif important. Il est souvent préférable d'établir une seule connexion multilatérale, par l'intermédiaire d'un serveur de routes (route server). Celui-ci récolte les annonces BGP de tous ses pairs et les redistribue. Ainsi, il suffit à l'opérateur d'une seule connexion, avec le serveur de routes. Ce nouveau RFC documente les questions opérationnelles liées aux serveurs de routes.
Le principe et le fonctionnement d'un serveur de routes sont expliqués dans le RFC 7947, produit par un autre groupe de travail IETF. Ce RFC 7948 se consacre aux détails opérationnels. Un serveur de routes est l'équivalent, pour le BGP externe (eBGP) de ce qu'est un « réflecteur de routes » (route reflector, RFC 4456) pour le BGP interne (iBGP). Le serveur de routes, lorsqu'il existe, est un composant crucial du point d'échange. Par exemple, s'il tombe en panne, les sessions BGP sont coupées, les annonces retirées et, même si les commutateurs et le réseau du point d'échange continuent à fonctionner, plus aucun trafic ne passe (à part si des sessions BGP bilatérales existent également). D'où l'importance d'une bonne gestion de ce composant.
Les sections 2 et 3 de notre RFC rappelent la différence entre sessions BGP bilatérales et multilatérales à un point d'échange. Si on ne fait que des sessions bilatérales (pas de serveur de routes), avec seulement quatre routeurs BGP sur le point d'échange, il faudra six sessions BGP pour une connectivité complète. Avec dix routeurs, il en faudrait quarante-cinq ! Établir, superviser et maintenir toutes ces sessions représente du travail. Les sessions multilatérales, via un serveur de routes, sont une bien meilleure solution. Avec dix routeurs au point d'échange, il n'y a plus besoin que de dix sessions BGP, chacun des dix routeurs ne faisant que BGP qu'avec le serveur de routes.
Le serveur de routes doit
juste veiller à ne pas toucher à l'attribut BGP
NEXT_HOP
(RFC 4271, section
5.1.3), qui ne doit pas indiquer le serveur de
routes, mais le routeur qui a annoncé la route (le serveur de routes
n'est pas un routeur, et ne fait pas de
transmission du trafic IP). Pour le point d'échange typique, il n'y a
pas besoin de faire de la résolution récursive (utiliser un protocole
de routage pour trouver comment joindre le routeur suivant) du
NEXT_HOP
: tous les routeurs sont sur le même
réseau L2 et sont donc
joignables directement. Par exemple, si je regarde le looking glass du France-IX et que
lui demande les routes vers 194.0.9.0/24
, il me
montre :
194.0.9.0/24 via 37.49.236.20 on eth1 [RS1_PAR 2016-08-11 from 37.49.236.250] * (100) [AS2484i] via 37.49.236.21 on eth1 [RS1_PAR 2016-08-11 from 37.49.236.250] (100) [AS2486i] ...
(L'AFNIC est connectée sur deux points de
présence de ce point d'échange, d'où les deux routeurs.) Les
NEXT_HOP
sont les adresses des routeurs dans le
point d'échange, 37.49.236.0/23
.
La section 4, le gros morceau de notre RFC, décrit ensuite divers points que le serveur de routes doit garder en tête, pour faire un bon travail.
D'abord, le cas où on n'envoie pas exactement les mêmes informations à tous les clients. Sauf si le client BGP coopère, cela implique que le serveur garde une base des routes par groupe de clients, un groupe étant composé de tous les clients pour qui on applique la même politique de filtrage. Attention, cela consomme pas mal de mémoire (autant de base que de groupes) et de processeur (il faut faire tourner les algorithmes de sélection BGP pour tous les groupes) mais heureusement, en pratique, on utilise rarement ces politiques différentes. Traiter tous les clients de la même façon permet de garder une consommation de ressources raisonnable.
Qu'en est-il du risque de fuite de préfixes ? Si un routeur connecté au serveur de routes fuit et envoie, par exemple, la totalité de la DFZ au serveur de routes, celui-ci va-t-il transmettre tous ces préfixes à ses infortunés clients ? Cela serait très ennuyeux car tout le trafic partirait alors vers le routeur fautif, qui ne serait peut-être pas capable de le gérer. Il est donc très recommandé que le serveur de routes prenne des précautions contre les fuites. Au minimum, imposer un nombre maximal de préfixes à chaque client, et, idéalement, filtrer les préfixes autorisés pour chaque client. C'est moins grossier que la simple limite quantitative, mais c'est aussi plus dur à maintenir (on ne peut pas espérer que tous les clients tiennent à jour leurs préfixes dans les IRR...). Il est certainement préférable que les administrateurs des clients et du serveur de routes regardent le journal de leur routeur pour repérer les différences entre ce qui est théoriquement annoncé et ce qu'il l'est réellement.
Question fiabilité, notre RFC recommande que le serveur de routes soit redondant : s'il n'est composé que d'une seule machine, et qu'elle plante, le point d'échange ne servira plus. Il faut donc au moins deux machines, et prendre soin qu'elles soient configurées de manière à annoncer les mêmes routes. (C'est trivial si les machines sont identiques, il suffit qu'elles aient la même configuration, cela l'est moins si, pour augmenter la redondance, on choisit des machines ayant des logiciels différents.)
Autre précaution à prendre, côté client, ne pas vérifier que le chemin d'AS est cohérent. Par exemple, le serveur de routes ne va pas mettre son propre AS tout à gauche du chemin d'AS (RFC 7947, section 2.2.2) et le client ne doit donc pas vérifier que son pair, le serveur de routes, a un chemin d'AS incluant l'AS du pair BGP.
Comment contrôler l'exportation des routes vers certains clients ? La section 4.6 liste plusieurs méthodes :
On a vu que la grande majorité des points d'échange travaillaient au niveau 2. Normalement, toute machine connectée au réseau du point d'échange peut donc joindre n'importe quelle autre. Mais, en pratique, on a déjà vu des bogues dans un commutateur qui menaient à des communications non transitives. Par exemple, les routeurs A et B peuvent tous les deux joindre le serveur de routes mais ne peuvent pas se joindre mutuellement. Dans ce cas, A reçoit bien les routes de B (et réciproquement) mais, lorsqu'il essaie de transmettre des paquets à B, ceux-ci finissent dans un trou noir. Ce problème est spécifique aux serveurs de route : lorsqu'on a une connexion bilatérale, les paquets de contrôle (ceux envoyés en BGP) suivent en général le même chemin que ceux de données (les paquets IP transmis) et partagent donc le même sort, bon ou mauvais.
La solution à ce problème passe peut-être par des solutions comme BFD (RFC 5881), pour tester la connectivité entre les deux routeurs. Mais BFD nécessite une configuration bilatérale entre les deux routeurs et il n'existe actuellement aucun protocole pour faire cette configuration automatiquement. On retombe donc dans les problèmes de configuration manuelle d'un grand nombre de connexions bilatérales. Même si un protocole de configuration automatique existait, il resterait le problème d'informer le serveur de routes. En effet, un échec BFD indiquerait à A qu'il ne peut pas joindre B, et lui ferait marquer les routes vers B comme invalides mais le serveur de routes, n'étant pas au courant, continuerait à n'envoyer à A que la route invalide (un pair BGP ne transmet que la meilleure route vers une destination donnée).
Dernier piège, le détournement de NEXT_HOP
. On
a vu que le fonctionnement normal d'un serveur de routes est de ne pas
se mettre comme « routeur suivant » mais au contraire de relayer
aveuglément les
NEXT_HOP
indiqués en BGP par ses clients.
Un
client malveillant pourrait annoncer des routes au serveur de routes en
indiquant comme « routeur suivant » le routeur d'un concurrent, pour
lui faire acheminer son trafic, par exemple ou, pire, pour faire une
attaque par déni de service en annonçant des
préfixes très populaires avec le concurrent comme routeur
suivant. Contrairement au problème précédent, celui-ci n'est pas
spécifique aux serveurs de route, il existe aussi avec des sessions
BGP bilatérales. Mais il peut faire davantage de dégâts lorsqu'on
utilise un serveur de routes, tous les clients croyant l'annonce
mensongère. Pour empêcher cela, il faudrait que les serveurs de route
vérifient que l'attribut BGP NEXT_HOP
corresponde
à l'adresse IP du client. (Les clients ne peuvent pas faire ce test,
ils doivent croire le serveur de routes, qui annonce des
NEXT_HOP
qui ne sont pas son adresse IP.)
Et pour finir, une sortie complète du looking
glass du route server du France-IX
concernant un serveur racine du DNS, M.root-servers.net
(et, au
passage, attention en anglais à ne pas confondre route
server et root server) :
RS1 show route for 202.12.27.33/32 all - View the BGP map 202.12.27.0/24 via 37.49.237.106 on eth1 [RS1 2015-08-21 from 37.49.236.250] * (100) [AS7500i] Type: BGP unicast univ BGP.origin: IGP BGP.as_path: 7500 BGP.next_hop: 37.49.237.106 BGP.med: 500 BGP.local_pref: 100 BGP.atomic_aggr: BGP.aggregator: 192.50.45.1 AS7500 BGP.community: (51706,51706) (51706,64601) (51706,64650)
Les pages de présentation de quelques serveurs de route :
Merci à Arnaud Fenioux pour sa relecture et ses ajouts et corrections.
Date de publication du RFC : Août 2016
Auteur(s) du RFC : J. Abley (Dyn), J. Schlyter (Kirei), G. Bailey (Microsoft)
Pour information
Première rédaction de cet article le 1 septembre 2016
Le mécanisme d'authentification des informations DNS nommé DNSSEC repose sur la même structure arborescente que le DNS : une zone publie un lien sécurisé vers les clés de ses sous-zones. Un résolveur DNS validant n'a donc besoin, dans la plupart des cas, que d'une seule clé publique, celle de la racine. Elle lui servira à vérifier les clés des TLD, qui serviront à valider les clés des domaines de deuxième niveau et ainsi de suite. Reste donc à configurer la clé de la racine dans le résolveur : c'est évidemment crucial, puisque toute la sécurité du système en dépend. Si un résolveur est configuré avec une clé fausse pour la racine, toute la validation DNSSEC est menacée. Comment est-ce que l'ICANN, qui gère la clé principale de la racine, publie cette clé cruciale ? Six ans après la signature de la racine du DNS, c'est enfin documenté, dans ce RFC.
Cela donne une idée de la vitesse des processus ICANN, organisation qui produit beaucoup de papier. Notez que ce nouveau RFC documente l'existant, déjà mis en œuvre, et ne prétend pas décrire la meilleure méthode. Notez aussi que ce format et cette méthode de distribution pourraient changer à l'avenir.
Si vous voulez réviser DNSSEC d'abord, outre les RFC de base sur ce système (RFC 4033, RFC 4034, RFC 4035...), notez surtout le RFC 6781, qui décrit les questions opérationnelles liées au bon fonctionnement de DNSSEC.
Les clés publiques configurées dans les résolveurs qui valident avec DNSSEC, sont appelées « points de départ de la confiance » trust anchors. Un point de départ de la confiance est une clé dont l'authenticité est admise, et non pas dérivée d'une autre clé, via une chaîne de signatures. Il en faut au moins un, celui de la racine, bien que certains résolveurs en ajoutent parfois deux ou trois pour des zones qu'ils veulent vérifier indépendamment. Lorsque le résolveur recevra une réponse de la racine, signée, il l'authentifiera avec la clé publique de la racine (le point de départ de la confiance). S'il veut vérifier une réponse d'un TLD, il l'authentifiera avec la clé publique du TLD, elle-même signée (et donc authentifiée) par la clé de la racine. Et ainsi de suite même pour les zones les plus profondes.
(Notez qu'il existe deux clés pour la plupart des zones, la KSK - Key Signing Key, et la ZSK - Zone Signing Key, mais on ne s'intéresse ici qu'aux KSK, c'est elles qui sont signées par la zone parente, et configurées comme points de départ de la confiance.)
La gestion de la clé de la racine par l'ICANN est décrite dans leur DNSSEC Practice Statement.
Le RFC rappelle aussi qu'il y a d'autres possibilités d'installation d'un point de départ de la confiance. Par exemple, si un tel point a été configuré une fois, ses remplacements éventuels peuvent être faits via le RFC 5011.
La section 2 du RFC décrit le format des clés publiées par l'IANA. Les trois formats, en fait :
Voici un exemple du fichier XML (à ne pas prendre comme s'il faisait autorité, évidemment) :
<TrustAnchor id="AD42165F-3B1A-4778-8F42-D34A1D41FD93" source="http://data.iana.org/root-anchors/root-anchors.xml"> <Zone>.</Zone> <KeyDigest id="Kjqmt7v" validFrom="2010-07-15T00:00:00+00:00"> <KeyTag>19036</KeyTag> <Algorithm>8</Algorithm> <DigestType>2</DigestType> <Digest> 49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5 </Digest> </KeyDigest> </TrustAnchor>
L'élément <KeyTag>
indique
l'identifiant de la clé, actuellement 19036, comme on peut le
voir avec dig :
% dig +multi +nodnssec DNSKEY . ... ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ... ;; ANSWER SECTION: . 147724 IN DNSKEY 257 3 8 ( AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQ bSEW0O8gcCjFFVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh ... ) ; KSK; alg = RSASHA256; key id = 19036 ...
L'attribut id
de l'élément
<KeyDigest>
sert à
identifier un condensat particulier, et est utilisé pour nommer
les autres fichiers. Par exemple, le certificat PKIX va se trouver
dans le fichier Kjqmt7v.crt
.
Pour produire un enregistrement DS à
partir de ce fichier XML, il suffit de mettre
<KeyTag>
,
<Algorithm>
, <DigestType>
et <Digest>
bout à bout. Par exemple,
avec le fichier XML ci-dessus, cela donnerait :
. IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5
(Des résolveurs comme Unbound acceptent ce format, pour le point de confiance de départ.)
Quant aux certificats, ils sont encodés en
DER et signés par
l'ICANN et leur champ
SubjectPublicKeyInfo
est la clé publique
DNSSEC. Voici ce qu'en voit OpenSSL :
% openssl x509 -text -inform DER -in Kjqmt7v.crt Certificate: Data: Version: 3 (0x2) Serial Number: 7 (0x7) Signature Algorithm: sha256WithRSAEncryption Issuer: O=ICANN, CN=ICANN DNSSEC CA/emailAddress=dnssec@icann.org Validity Not Before: Jun 11 18:43:20 2014 GMT Not After : Jun 10 18:43:20 2017 GMT Subject: O=ICANN, OU=IANA, CN=Root Zone KSK 2010-06-16T21:19:24+00:00/1.3.6.1.4.1.1000.53=. IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5 Subject Public Key Info: Public Key Algorithm: rsaEncryption ... X509v3 extensions: X509v3 Basic Constraints: critical CA:FALSE X509v3 Authority Key Identifier: keyid:8F:B2:42:69:C3:9D:E4:3C:FA:13:B9:FF:F2:C0:A4:EF:D8:0F:E8:22 X509v3 Subject Key Identifier: 41:1A:92:FA:1B:56:76:1E:62:2B:71:CD:1A:FD:BB:43:99:5F:09:C9 Signature Algorithm: sha256WithRSAEncryption ...
Comment récupérer le fichier XML
de manière à être sûr de son authenticité ? C'est ce que spécifie
la section 3 du RFC : on utilise HTTPS. L'URL est https://data.iana.org/root-anchors/root-anchors.xml
.
Une autre solution (section 4) est de le récupérer en
HTTP et de le vérifier avec une des
signatures fournies : l'une est en CMS
(RFC 5652) - son URL est https://data.iana.org/root-anchors/root-anchors.p7s
,
l'autre est en PGP (RFC 4880) - son URL est https://data.iana.org/root-anchors/root-anchors.asc
. Cette
signature PGP devrait être abandonnée à l'avenir.
Pour les amateurs d'histoire, l'annexe A rappelle que la clé actuelle, la 19036, a été générée au cours d'une cérémonie à Culpeper, le 16 juin 2010. Elle a été publiée dans le DNS pour la première fois le 15 juillet 2010.
Sinon, l'ISOC a écrit un bon article sur ce RFC, moins technique.
Date de publication du RFC : Août 2016
Auteur(s) du RFC : E. Lear, R. Housley
Pour information
Réalisé dans le cadre du groupe de travail IETF ianaplan
Première rédaction de cet article le 30 août 2016
Un certain nombre de fonctions administrativo-politico-techniques dans l'Internet sont assurées par un service nommé l'IANA (Internet Assigned Numbers Authority). Cela va du spectaculaire (l'instruction des demandes d'ajout ou de suppression des TLD) jusqu'au routinier (la gestion des innombrables registres techniques que l'IANA maintient pour le compte de l'IETF). L'IANA est un service de l'ICANN et l'ICANN est sous tutelle du gouvernement états-unien pour effectuer ce travail, dit « fonction IANA ». Le gouvernement états-unien a annoncé en 2014 qu'il envisageait peut-être dans le futur de diminuer la dépendance de l'ICANN et a demandé, en attendant, aux parties intéressées, de soumettre des propositions. L'ICANN, toujours ravie qu'on propose des discussions et des réunions, a créé le ICG (IANA stewardship transition Coordination Group) qui a à son tour sollicité des commentaires. Ce nouveau RFC est la réponse de l'IETF à cet appel, ne concernant que la gestion des registres techniques. La gestion des noms de domaine et des adresses IP, bien plus politicienne et bien plus brûlante (surtout pour les noms de domaine) n'y figure pas. Voici donc « la position de l'IETF concernant l'avenir de la gestion des registres IANA, dans l'hypothèse où le gouvernement états-unien relâcherait son emprise ». Pour résumer cette position : la gestion des registres des paramètres des protocoles fonctionne actuellement bien et, quelles que soient les manœuvres autour de l'évolution du rôle du gouvernement US, il ne faut pas la changer. Ce RFC a été terminé en janvier 2015 mais n'est publié que maintenant, après l'approbation du plan de transition par l'ICANN en mars 2016 à sa réunion de Marrakech, et après l'accord du gouvernement états-unien en août.
L'agence du gouvernement états-unien chargée de superviser l'ICANN se nomme NTIA, dépendant du ministère du commerce (notez la vision de l'Internet que cela implique). Notez que cette supervision n'est pas le seul levier direct de ce gouvernement sur la gestion de ressources critiques de l'Internet. Il y a aussi la gestion de la racine du DNS, effectuée via Verisign. En mars 2014, génée par les révélations de Snowden, la NTIA a annoncé un projet d'évolution du statut de l'ICANN, passant du gouvernement états-unien à quelque chose de nouveau, encore à discuter. La NTIA a posé ses conditions (par exemple que le quelque chose de nouveau ne devait pas être multi-gouvernemental), et annoncé que, s'il n'y avait pas de plan satisfaisant (satisfaisant pour la NTIA) proposé, le projet serait abandonné ou redéfini.
C'est là qu'a été créé l'ICG (IANA Stewardship Coordination Group) dont la charte figure en annexe B de ce RFC. C'est cet ICG qui a émis l'appel aux commentaires (qui figure en annexe C du RFC). Cet appel demande entre autre de préciser si les réponses concernent la partie « noms de domaine », la partie « adresses IP » ou bien la partie « paramètres des protocoles » du travail de l'IANA (ce RFC concerne la troisième partie). Les réponses sont disponibles en ligne.
La section 2 de ce RFC est la réponse formelle de l'IETF, suivant le plan de l'appel à commentaires de l'ICG. D'abord, l'IETF répond à la question « l'IANA sert à quoi, pour vous ? » Bien des protocoles conçus ou gérés par l'IETF ont besoin de registres pour des paramètres du protocole. Par exemple, le protocole HTTP (RFC 7231) a des codes de retour des opérations (comme le célèbre 404) qui sont stockés à l'IANA. Ajouter un tel code (par exemple 451 pour « contenu censuré ») ne nécessite donc pas de modifier la norme HTTP. Ou bien, pour prendre un exemple nettement moins connu, le protocole PCP (RFC 6887) dispose d'un certain nombre d'options, qui ne sont pas fixées une fois pour toutes dans la norme mais sont notées dans un registre IANA, ce qui permet d'en ajouter facilement de nouvelles.
Pour que l'Internet fonctionne, il faut que ces paramètres des protocoles soient utilisés de la même manière par tous. Par exemple, cela signifie que les développeurs de logiciels Internet doivent utiliser les mêmes registres, en l'occurrence, ceux de l'IANA. Ainsi, un serveur HTTP peut renvoyer le code 403 en sachant bien que cela sera interprété par tous les clients comme signifiant « Accès interdit », car le code 403 figure dans le registre IANA avec cette définition. Ce rôle de l'IANA pour l'IETF est documenté dans le RFC 5226.
L'IANA gère également le TLD
.arpa
, qui est
considéré comme un des registres de paramètres (RFC 3172).
Ce travail de l'IANA pour le compte de l'IETF est effectué en application du RFC 2860 (voir aussi ses déclinaisons concrètes), qui est le « contrat » entre les deux activités.
La question suivante est « qui êtes-vous ? » L'IETF se présente donc, SDO internationale, ouverte et dont la mission est décrite dans le RFC 3935. L'IETF fait les normes techniques de l'Internet « de la couche 3 jusqu'au bas de la couche 7 ». C'est elle qui est responsable d'IP de BGP, du DNS, de HTTP, etc. (Oui, tous les lecteurs de ce blog savent cela mais la réponse de l'IETF est conçue pour être lue par un public plus large.) Le côté ouvert de l'IETF est précisé dans le RFC 6852, le processus de création des normes dans le RFC 2026.
Une question difficile dans l'appel à commentaires était « quels recouvrements y a-t-il entre votre activité et celles d'autres organisations ou groupes ? » D'abord, la réponse met en avant le fait que les participants à l'IETF sont souvent membres d'autres organisations. (On parle de « participants » car l'IETF n'a pas de mécanisme d'adhésion formel.)
Ensuite, l'IETF a évidemment des activités qui s'approchent de très près de celles d'autres groupes, avec parfois des discussions sur la frontière. Ainsi, le RFC 6761, qui fait l'objet de beaucoup de débats en ce moment, prévoit un mécanisme d'enregistrement de noms de domaine par l'IETF, alors que certains voudraient que cela soit un monopole de l'ICANN. C'est aussi le cas des adresses IP (mais cela suscite bien moins d'intérêt car c'est plus important mais moins spectaculaire). Ainsi, si l'IANA gère l'espace d'adressage IP, l'IETF alloue également des portions de cet espace (RFC 7020, RFC 7249, et un exemple concret, les ULA du RFC 4193). Il y a aussi bien sûr des recouvrements envers ce que fait l'IETF, et le travail des opérationnels qui décident (ou pas) de déployer les protocoles normalisés. Par exemple, la gestion des serveurs racine du DNS est à la fois un secteur de l'IETF (RFC 7720) et des opérateurs de ces serveurs.
Les activités de l'IETF concernant IP et le routage l'amènent par contre du côté des RIR (par exemple lorsque l'IETF a ses propres allocations d'adresse, comme dans le RFC 6890). Un changement de norme technique peut impacter les opérationnels (nouvelles choses à gérer) et les RIR. Ainsi, l'extension de la taille des numéros d'AS de deux à quatre octets (RFC 6793) imposait évidemment aux RIR de changer leur logiciel et leur politique, pour allouer ces nouveaux numéros.
Pour tous ces points, le RFC insiste sur l'importance de la coordination entre ces acteurs, et sur les nombreux contacts que l'IETF maintient avec toutes ces communautés.
L'appel à commentaires de l'ICG demande ensuite comment les politiques sont décidées et comment les conflits sont gérés. Pour l'IETF, les principes figurent dans les RFC 6220 et RFC 5226. En gros, quelqu'un qui veut changer la politique de l'IETF, par exemple modifier le RFC 5226 (c'est justement en cours de discussion) va écrire un premier document, un Internet Draft, essayer de susciter de l'intérêt, en général le faire adopter par un des groupes de travail (à moins qu'un groupe soit créé spécialement), la proposition doit réunir un consensus (RFC 7282) et c'est souvent l'IESG qui prend la décision finale. Le tout est scandé par des last calls où les organisateurs demandent aux participants un dernier avis avant que le document n'avance. (Pour le fonctionnement des groupes de travail, on peut lire le RFC 2418, mais il n'est plus complètement à jour.)
Et les conflits ? Ils sont normalement réglés dans les groupes de travail mais, si c'est grave, la section 6.5 du RFC 2026 décrit un mécanisme d'appels successifs.
Un concept souvent cité en ce moment dans les discussions autour de l'ICANN et celui de redevabilité (accountability). L'organisation est-elle redevable à quelqu'un, ou bien est-ce un clan mafieux fermé qui décide de tout en interne et ne rend de comptes à personne (comme le CIO ou la FIFA) ? L'appel à commentaires demande donc de la documentation sur les mécanismes de redevabilité du répondeur. Pour l'IETF, c'est l'IAB qui joue ce rôle, en confirmant (ou pas) les nominations et en traitant les appels mentionnés un peu plus haut. C'est aussi l'IAB qui gère les canaux de communication (liaisons) avec les autres organisations. Et c'est l'IAB qui décide quel opérateur gère les registres de paramètres de protocole, actuellement l'ICANN via sa fonction IANA. L'IAB est officiellement décrite dans le RFC 2850. Elle est elle-même redevable devant les participants à l'IETF, par son mécanisme de désignation (RFC 3777).
Quel est le degré de formalisation de votre relation avec l'IANA, demande ensuite l'appel à commentaires ? Un MoU existe (RFC 2860). Son suivi quotidien est assuré par l'IAD (IETF Administrative Director), lui-même sous contrôle de l'IAOC (IETF Administrative Oversight Committee, cf. RFC 4071). Une de leurs tâches est de suivre les rapports de l'IANA sur ses résultats.
En théorie, si un conflit grave surgissait entre l'IETF et l'IANA, l'IETF pourrait mettre fin au travail en commun et choisir un nouvel opérateur pour ses registres (et ce RFC serait alors sans objet). Mais cela ne s'est jamais produit et une telle perspective semble peu probable.
L'appel à commentaires demande aussi à ceux qui répondent d'indiquer de quelle juridiction ils dépendent et quelles sont les lois qui leur sont applicables. L'IETF répond que son activité est mondiale (ce qui est vrai) et que les textes entre l'IANA et l'IETF ne spécifient pas de juridiction (ce qui est exact mais incomplet : l'IETF étant une activité de l'ISOC, l'IETF dépend de la juridiction états-unienne, comme le montrent, par exemple, les injonctions reçues).
Commencent ensuite les questions sensibles, par exemple les demandes de suggestions concernant les mécanismes futurs qui remplaceraient la NTIA. La réponse du RFC est qu'aucun changement n'est demandé par l'IETF : le système actuel avec l'IETF, l'ICANN, l'IAB, etc, a bien fonctionné, sans implication du NTIA, et n'a donc aucun besoin d'être remplacé ou « amélioré ». Les RFC 2860 et RFC 6220 fournissent un cadre satisfaisant et le résultat l'est également.
Cette partie de la réponse contient quand même quelques souhaits, pas forcément de changement mais de points importants à garder en tête :
Et le RFC réaffirme les principes que l'IAB avait posé en mars 2014 :
J'avais signalé plus haut que la NTIA avait posé un certain nombre d'exigences pour accepter un éventuel plan de transition. La suite de l'appel à commentaires rappelle ces exigences et demande dans quelle mesure les propositions faites sont conformes à ces oukases. D'abord, la NTIA demande de « continuer avec le modèle multi-partiesprenantes » (ne me demandez pas de définir ce modèle...) L'IETF répond qu'en tant qu'organisation ouverte à tous, elle suit déjà ce modèle (même réponse à la demande de la NTIA que le futur éventuel système « conserve l'ouverture de l'Internet »). Ensuite, la NTIA exige de préserver « la sécurité et la stabilité du DNS » (une des phrases les plus citées dans les milieux de la gouvernance Internet...) L'IETF ne proposant pas de changement, la stabilité est certainement préservée. Puis le gouvernement états-unien veut que les propositions « satisfassent les utilisateurs et répondent à leurs besoins ». Le RFC estime que l'utilisation massive dans le monde des protocoles TCP/IP et donc des registres de l'IANA montre clairement que les utilisateurs sont contents. Dernier ordre de la NTIA : que la solution future ne soit pas multi-gouvernementale (rappelons que le mécanisme actuel de supervision de l'ICANN est mono-gouvernemental). L'IETF réplique que l'IAB n'est pas une organisation gouvernementale et que l'ordre est donc suivi.
L'appel à commentaires de l'ICG demande également par quel processus la réponse a été élaborée, une bonne façon de vérifier que le répondant a appliqué ses beaux principes, y compris lors de la conception de sa réponse. L'IETF explique que la réponse a été développée par le groupe de travail IANAPLAN, qui, comme tous les groupes de travail de l'IETF, était ouvert à tous et faisait tout son travail publiquement (cf. les archives de la liste de diffusion du groupe). Pour le montrer, comme le demande l'appel à commentaire, l'IETF cite de nombreux documents publiquement accessibles :
Le RFC estime que tout ce processus montre un net consensus de
l'IETF en faveur de cette réponse. Quelques points sont restés
contentieux jusqu'au bout (comme la demande que le nom de domaine
iana.org
soit transféré à l'IETF Trust).
Quelques lectures supplémentaires sur cette opération de transition :
.gov
et .mil
),Date de publication du RFC : Août 2016
Auteur(s) du RFC : C. Percival (Tarsnap), S. Josefsson
(SJD AB)
Pour information
Première rédaction de cet article le 29 août 2016
Ce RFC normalise la fonction de dérivation de clé scrypt.
À quoi ça sert, une fonction de dérivation de clé ? Comme leur nom l'indique, elles permettent d'obtenir des clés cryptographiques (ou autre matériel cryptographique) à partir des données qu'on leur fournit. Une utilisation courante est de fabriquer une clé pour un algorithme de chiffrement, à partir d'une phrase de passe. Cela permet d'obtenir une clé (longueur fixe, format donné) pour les opérations cryptographiques tout en laissant l'utilisateur manipuler uniquement des textes mémorisables. Par exemple, pour chiffrer un disque dur, l'utilisateur va indiquer une phrase de passe, mais le disque sera chiffré à partir de la clé obtenue en appliquant la fonction de dérivation de clé (KDF, pour Key Derivation Function) à cette phrase. Une autre utilisation est pour transformer un mot de passe qu'on doit stocker dans un fichier en une information inutilisable pour un attaquant qui mettrait la main dessus. Pour se connecter, on tape le mot de passe, on refait tourner la KDF et on vérifie qu'on obtient bien le résultat stocké.
Problème de cette méthode, l'ennemi peut tenter de faire lui-même la dérivation : il essaie des tas de mots de passe et regarde s'il obtient le résultat stocké. C'est pour cela qu'une des qualités d'une bonne fonction de dérivation est, paradoxalement, d'être lente : les gens qui connaissent le mot de passe ne seront pas gênés (ils ne font qu'un seul essai) alors que l'attaquant par force brute qui essaie des milliards de mots sera ralenti. Idéalement, on voudrait une fonction qui ne puisse pas facilement être mise en œuvre dans des ASIC, pour qu'un attaquant riche ne puisse pas investir dans une « machine à deviner les mots de passe ». C'est l'un des avantages de scrypt. (Les fanas de chaîne de blocs noteront que des chaînes comme Litecoin utilisent scrypt justement pour cette raison : rendre le minage plus accessible à tous en contrariant les ASIC.)
Pourquoi encore ajouter des fonctions de dérivation de clés (section 1 du RFC) ? Il y en a eu plein dans l'histoire, de la vénérable crypt à PBKDF2 (RFC 2898) puis aux récents bcrypt et Argon2. On en imagine souvent de nouvelles, par exemple celle-ci qui n'utilise pas du tout de chiffrement, juste de la condensation. Pour résister aux attaques par force brute (que la loi de Moore rend plus efficace chaque année), certaines ont un nombre d'itérations variables. On applique plusieurs fois l'opération de dérivation, si les machines deviennent plus rapides, on augmente ce nombre d'itérations. Cela ne marche bien que si l'attaquant utilise les mêmes logiciels que les utilisateurs normaux. Mais si la fonction de dérivation est facilement programmable dans des circuits matériels spécialisés, l'attaquant pas trop pauvre pourra s'acheter une ferme de cassage de mots de passe, remplie de circuits conçus spécifiquement, et travaillant en parallèle (les circuits deviennent plus rapides mais aussi plus petits : on peut en entasser davantage). Il ne joue alors plus dans la même catégorie que les utilisateurs légitimes.
C'est là que scrypt intervient : l'algorithme a été délibérement conçu pour être difficile à mettre dans un ASIC. scrypt a été publié en 2009 (voir l'article original qui fut présenté à USENIX). Ce RFC a commencé en 2013 et a eu une longue gestation. Il ne décrit pas scrypt, renvoyant au papier original, mais se contente de préciser les points qui sont nécessaires pour des mises en œuvre interopérables.
La section 2 du RFC décrit les paramètres de la fonction. Le plus évident est la phrase de passe, souvent choisie par un humain. Il y a aussi un sel, en général choisi aléatoirement (RFC 4086), et divers paramètres techniques, permettant notamment d'ajuster l'algorithme aux caractéristiques des machines dont on dispose. Une taille de bloc de 8 et un facteur de parallélisation de 1 conviennent bien à l'heure actuelle, mais vont sans doute augmenter dans le futur.
scrypt dépend de la fonction de condensation Salsa20 Core, plus exactement de sa version simplifiée Salsa20/8 Core (section 3 du RFC). Une mise en œuvre en C est incluse dans le RFC. (Voir la description originelle et la spécification de Salsa20.)
scrypt est un « chef d'orchestre », qui dépend de plusieurs autres algorithmes comme BlockMix (section 4), ROMix (section 5), le PBKDF2 du RFC 2898 et le HMAC-SHA-256 du RFC 6234. L'algorithme de scrypt, qui fait fonctionner ensemble tout cela, figure en section 6.
Si vous êtes programmeur et que vous mettez en œuvre scrypt,
les sections 8 à 13 du RFC contiennent des vecteurs
de test pour les différents algorithmes
utilisés. Par exemple, avec la phrase de passe
pleaseletmein, le sel
SodiumChloride
(exemple contestable, ce sel
n'a pas été généré aléatoirement), le facteur CPU/mémoire à
16384, la taille de bloc 8 et le facteur de parallélisation 1,
la clé dérivée par scrypt sera 70 23 bd cb 3a fd 73 48
46 1c 06 cd 81 fd 38 eb fd a8 fb ba 90 4f 8e 3e a9 b5 43 f6 54
5d a1 f2 d5 43 29 55 61 3f 0f cf 62 d4 97 05 24 2a 9a f9 e6 1e
85 dc 0d 65 1e 40 df cf 01 7b 45 57 58 87
. Si vous
trouvez une autre valeur, vérifiez votre programme.
Lisez aussi la section 14, consacrée aux questions de sécurité. Par exemple, scrypt peut consommer beaucoup de mémoire (c'est fait exprès, cela fait partie des techniques qui rendent difficile sa mise en œuvre en ASIC) et il y a donc un risque de déni de service si on accepte d'exécuter scrypt avec des paramètres quelconques, fournis depuis l'extérieur.
scrypt est, entre autres, présents dans OpenSSL depuis le 1.1.0, officiellement publiée juste après le RFC.
Date de publication du RFC : Août 2016
Auteur(s) du RFC : K. Davies (ICANN), A. Freytag
(ASMUS)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF lager
Première rédaction de cet article le 29 août 2016
Lorsqu'on a des identificateurs en Unicode (par exemple pour les noms de domaine internationalisés), on souhaite souvent limiter le nombre de caractères autorisés, et avoir des possibilités de variante (par exemple, dire que deux chaînes de caractères Unicode sont en fait équivalentes sémantiquement). Il faut donc rédiger ces règles, et un langage formel est certainement utile pour cela. C'est ce que propose ce nouveau RFC, qui normalise un langage XML pour décrire les règles d'enregistrement de ces identificateurs Unicode.
Le terme utilisé par le RFC est LGR, pour Label Generation Ruleset. Label est le composant de base d'un nom de domaine, et Ruleset fait référence à l'ensemble des règles décrites en XML et qui permettront de savoir si un composant est valide, et quelles transformations éventuellement effectuer avant de l'enregistrer. C'est un concept qui vient de l'ICANN, qui a toujours présenté les IDN comme une chose dangereuse (bien à tort), nécessitant des variant tables ou autres algorithmes compliqués. Donc, si vous ne travaillez pas avec l'ICANN, il n'est pas nécessaire de connaitre ce RFC.
Le langage présenté dans ce RFC est assez complexe, mais le problème est complexe. Ceci dit, dans les cas « simples » (alphabet latin), les règles LGR seront également simples. Si on veut juste dire que é, è et ë sont autorisés dans les noms, et avec e comme variante, c'est trivial à faire, à peine plus compliqué que les tables du RFC 4290.
Notez que l'algorithme décrit par un LGR ne suffit pas comme règle d'enregistrements des noms de domaine : il existe d'autres règles (comme la priorité aux entreprises titulaires de propriété intellectuelle) qui ne sont pas exprimables par ces algorithmes.
Avant ce RFC, les règles concernant les
IDN étaient publiées en langue naturelle,
ou parfois dans le langage formel des RFC 3743 et/ou RFC 4290. Le langage
décrit ici a vocation à les remplacer. Il est structuré, donc
lisible par un programme, et permet de dériver automatiquement les
programmes de vérification d'un nom (par exemple ceux qui sont
lancés par un serveur EPP recevant un ordre
<domain:create>
, RFC 5731, section 3.2.1).
Le format est relativement simple si on a une politique simple mais permet le cas échéant de mettre en œuvre des politiques très complexes (qui sont utiles pour certaines écritures asiatiques, par exemple). Il est conçu pour les IDN mais peut être utilisé si on a à enregistrer des identificateurs Unicode dans un autre contexte.
Le cahier des charges du format des LGR figure en section 2 du RFC :
Un point important de ce RFC est qu'il décrit un format, pas une politique : le RFC ne dit pas si le caractère Unicode U+00E8 (è) doit être considéré comme une variante du U+0065 (e) : il fournit juste le moyen d'exprimer cette équivalence, si on le décide.
La section 4 du RFC spécifie le format exact. (Le schéma formel
- en
Relax NG - est dans l'annexe D.) Un
ensemble de règles LGR est mise dans un élément XML
<lgr>
. Il contient quelques
métadonnées, dont la date et la langue ou
l'écriture pour lesquels ce LGR est prévu. Comme l'ICANN, dans ses
politiques IDN, mélange très souvent langue et écriture (par
exemple en parlant de « domaines multilingues », ce qui est
absurde), il faut préciser que la plupart des politiques portent
sur des écritures (un nom de domaine n'a pas de langue :
coca-cola.com
est-il de l'anglais ?) La
valeur de l'élément XML <language>
est
une étiquette du RFC 5646, avec la langue
marquée comme « non définie » (und
pour
undeterminate). Un exemple pour une politique
consacrée à l'alphabet cyrillique :
<language>und-Cyrl</language>
.
Les règles elle-mêmes sont en section 5. La plus simple est
celle qui autorise un caractère donné, ici le
tiret (cp
=
Code Point Unicode, ici U+002D) :
<char cp="002D"/>
On peut aussi autoriser un intervalle, ici tous les chiffres arabes :
<range first-cp="0030" last-cp="0039"/>
Comme on le voit, les caractères sont identifiés par leur point de code Unicode, écrit sans le « U+ » initial. Bien que XML permettre de représenter nativement tous les caractères Unicode, cette possibilité n'est pas exploitée par ce RFC (cf. Unicode Standard Annex #42).
Voici maintenant un exemple de règle qui précise que le point médian U+00B7 n'est autorisé qu'entre deux l (c'est le cas en catalan mais notez qu'en français, il est aussi utilisé dans une perspective féministe). Cela se fait en indiquant une séquence :
<char cp="006C 00B7 006C" comment="Catalan middle dot"/>
Et voici une règle contextuelle plus complexe. On veut n'autoriser
le gluon de largeur nulle U+200D qu'après un virāma. Si une règle
follows-virama
(non montrée ici) a été
définie, on peut écrire :
<char cp="200D" when="follows-virama" />
Et les variantes ? Voici d'abord comment exprimer que le é est une simple variante du e (non pas que je recommande cette politique : c'est juste un exemple) :
<char cp="00E8"> <var cp="0065"/> </char>
Et une variante où un caractère (œ) est mis en correspondance avec deux caractères (oe) :
<char cp="00F6"> <var cp="006F 0065"/> </char>
Ces règles portaient sur des caractères qui formaient une partie d'un composant d'un nom. Mais il y a aussi des règles qui portent sur la totalité du composant (section 6 du RFC). Pour cela, d'abord un petit mot sur la notion de classe. On définit une classe de caractères à partir de propriétés Unicode. Ici, on a la classe des virāma, définie à partir de la propriété Unicode CCC (Canonical Combining Class) :
<class name="virama" property="ccc:9" />
On peut ensuite combiner les classes par intersection, union, etc.
Les règles permettent aussi d'utiliser des opérateurs
booléens. Voici par exemple la règle
traditionnelle des noms de machines (et pas des noms de domaine,
contrairement aux bêtises qu'on lit souvent), autorisant lettres
ASCII, chiffres et tiret. Elle utilise
<choice>
, qui fait un OU logique entre
les termes :
<rule name="ldh"> <choice count="1+"> <class by-ref="letter"/> <class by-ref="digit"/> <char cp="002D" comment="literal HYPHEN"/> </choice> </rule>
Des exemples plus réalistes et plus détaillés figurent dans l'annexe A.
Le document XML complet a le type MIME
application/lgr+xml
.
Quelques petits mots sur la sécurité (section 12 du RFC). Le RFC part du préjugé (qui est faux) comme quoi les noms en Unicode poseraient des problèmes de sécurité. La section 12 note ensuite (si on accepte cette prémisse) que les règles de ce RFC ne résolvent pas complètement le problème (qui est largement imaginaire). Il reste possible de faire des noms « trompeurs » même avec les règles les plus strictes. Outre question de sécurité à garder en tête : les règles de ce RFC peuvent permettre de concevoir des politiques LGR très complexes, qui peuvent épuiser les ressources de la machine qui tenterait de les évaluer.
Si vous voulez pratiquer avec vos propres LGR, l'ICANN a fait développer un outil qui est accessible en ligne (lisez la documentation pour connaitre le mot de passe) ou bien en source sur GitHub : lgr-core et lgr-django pour l'interface Web en Django.
Première rédaction de cet article le 28 août 2016
Tous les jours, plusieurs articles apparaissent dans les médias pour expliquer que la chaîne de blocs (blockchain dans la langue de Satoshi Nakamoto) va résoudre encore un nouveau problème. Pour le non-spécialiste, il n'est pas évident de faire la part du réel et du fantasme dans toutes ces applications de la chaîne de blocs. C'est en pensant à ce non-spécialiste que j'ai écrit cet article : peu ou pas de technique, juste une exploration des choses où la chaîne de blocs est vraiment utile, par rapport à celles où elle n'a pas d'intérêt.
D'abord, je vais me permettre un court paragraphe rappelant ce qu'est la chaîne de blocs : il s'agit d'une base de données ordonnée (les blocs contiennent des transactions, opérations d'écriture dans la chaîne, qui sont dans un ordre précis), répartie sur un réseau (typiquement Internet), et qui n'a pas de gérant unique. Chaque machine, chaque nœud, porte toute la chaîne et détruire celle-ci nécessiterait donc de détruire des dizaines de milliers de machines, gérées par des gens différents. La chaîne de blocs est publique : tout le monde peut créer un nœud du jour au lendemain, qui va automatiquement télécharger et vérifier la chaîne, avec toutes les données qu'elle contient. Tout le monde peut y écrire (souvent moyennant finances) et ces écritures sont signées, et sont gardées éternellement dans la chaîne, qui est donc un livre des opérations, contenant tout l'historique. L'intégrité de la chaîne est garantie par la cryptographie. Toute modification est détectable par tous. Notez bien que j'ai dit toute modification. La chaîne ne distingue pas entre modification « légitime » ou « illégitime ». Une fois qu'une transaction est dans la chaîne, elle y est pour toujours, même si on croit avoir de bonnes raisons de l'annuler. (Oui, les techniciens vont noter que c'est plus compliqué que cela ; mais c'est toujours plus compliqué que cela, j'essaie d'en rester aux grandes lignes.)
Il n'y a donc pas besoin de faire confiance au Président de la Chaîne de Blocs (il n'existe d'ailleurs pas). La chaîne permet donc à des acteurs ne se connaissant pas, et ne se faisant a priori pas confiance, de travailler sur une base de données commune, consensuelle. C'est tout mais c'est énorme. La chaîne est « vérifiable par tous et contrôlée par personne ».
Les applications de la chaîne de blocs sont donc a priori nombreuses : toutes les fois où des acteurs différents faisaient appel à une autorité centrale, on pourrait mettre à la place une chaîne de blocs. L'exemple évident est la monnaie. Depuis le Moyen Âge, elle est typiquement garantie par un État (autorité centrale). Avec la chaîne de blocs, on peut concevoir une monnaie sans autorité centrale, et c'est bien le cas de Bitcoin, la technologie qui a lancé et popularisé cette idée de chaîne de blocs. Outre le plaisir de se débarrasser d'une autorité centrale qui ne mérite pas forcément la confiance qu'on lui porte, cela présente des avantages comme de faciliter les micropaiements.
Donc, est-ce que tout ce qui a besoin de vérification publique, sans autorité centrale, est « chaînedeblocsisable » ? Prenons quelques exemples.
Après la monnaie, un autre cas de service qui est souvent géré de manière centralisé est celui de la gestion de noms (création, suppression, etc) dans un espace de nommage. Par exemple, les noms d'utilisateur de Twitter sont gérés de manière centralisée par Twitter, ce qui permet d'assurer l'unicité de ces noms (il n'y a qu'une AdrienneCharmet sur Twitter). Mais cette centralisation donne aussi un contrôle excessif à Twitter : cette entreprise a pu ainsi à de nombreuses reprises fermer des comptes sur la base d'un simple signalement, souvent mensonger. La chaîne de blocs fournit une alternative : l'enregistrement des noms « premier arrivé, premier servi » peut se faire sur une chaîne de blocs, comme le fait le système Twister. Ainsi, plus personne ne peut supprimer des comptes, la censure devient bien plus difficile.
Un exemple très proche de celui-ci est celui des registres de noms de domaine. Ceux-ci enregistrent des noms de domaine, indispensables pour l'utilisation de l'Internet. Mais ils ont aussi le pouvoir de les supprimer (comme dans l'affaire Sci-Hub). On peut donc envisager de remplacer ces registres par une chaîne de blocs, où les transactions sont la création d'un nom de domaine. Le premier exemple avait été le système Namecoin, un autre exemple a été présenté par moi à la Journée du Conseil Scientifique de l'AFNIC de 2016. Attention, j'ai dit que le remplacement des registres de noms de domaine était possible techniquement, pas forcément qu'il était souhaitable, ni qu'il serait adopté (des tas de très bonnes idées n'ont connu aucun succès). En effet, la chaîne de blocs a aussi ses limites (voir plus loin).
Autre exemple d'application sans doute bien adaptée à la chaîne de blocs, le cadastre. Là aussi, on veut une information publique, et modifiable, et publiquement vérifiable. Au lieu de faire confiance à des autorités centrales, on pourrait tout mettre sur une chaîne de blocs. (Un exemple est souvent cité dans les médias mais sans jamais citer de source originelle donc je ne suis pas sûr qu'il soit réel.)
Dernier exemple d'une application qui est bien adaptée à la chaîne de blocs, l'enregistrement d'œuvres à des fins de prouver l'antériorité. Imaginons un artiste qui produise une vidéo, ne peut pas ou ne veut pas la publier tout de suite, mais souhaite pouvoir prouver plus tard qu'on était bien l'auteur. Même chose pour un chercheur scientifique qui est en train de rédiger un article, il ne sait pas encore quand il pourra le publier (il faut terminer certains détails, et puis le processus de publication scientifique peut être très long) mais, en cas de fuite, il veut pouvoir faire valoir son antériorité. Il existe des solutions centralisées traditionnelles, nécessitant une confiance aveugle dans un organisme comme l'INPI avec les enveloppes Soleau ou comme Ma Preuve. À la place, on pourrait utiliser la chaîne. Mais mettre directement leur œuvre dans la chaîne de blocs aurait deux inconvénients : cela pourrait leur coûter cher (voir plus loin les coûts de stockage dans la chaîne) et cela révèlerait leur œuvre (puisque la chaîne est publique, et lisible par tous). Une solution possible est le condensat. C'est une opération mathématique simple qui réduit (condense) un document de taille quelconque en un nombre relativement court. La condensation n'est pas inversible (à partir du condensat, on ne peut pas retrouver le contenu original). Les fonctions mathématiques utilisées ont pour propriété qu'on ne peut pas fabriquer un document ayant un condensat donné (sauf chance extraordinaire). Ainsi, si le condensat est stocké dans la chaîne de blocs, seul l'auteur original pourra, le jour venu, produire un document qui correspondra, prouvant ainsi qu'il était bien celui qui avait enregistré le condensat. J'ai développé cette idée dans mon exposé à Pas Sage en Seine 2016 mais ce n'est pas une idée originale. Elle est également mise en œuvre dans le système Blockai. Il a même été proposé d'utiliser une technique analogue pour faciliter le travail des historiens.
Dans le monde de la haute technologie, un bon moyen de trier entre les techniques sérieuses et celles qui relèvent du pipeau, c'est de regarder non pas ce qu'une technique sait faire mais ce qu'elle ne sait pas faire. Si la description d'une technique ne liste pas ses limites, n'indique pas ce qu'elle ne peut pas faire, c'est probablement que cette technique est du pipeau. Voyons donc les cas où la chaîne de blocs n'est pas adaptée. D'abord, un mot sur les coûts. Comme tous les nœuds (toutes les machines du réseau) doivent exécuter les transactions (pour pouvoir les vérifier), il n'est pas exagéré de dire que « la chaîne de blocs est le plus lent et le plus cher calculateur du monde ». Pour éviter les abus, toutes les transactions doivent être payées, et le coût dépend, par exemple, de la taille des données stockées. Pas question, donc, de stocker des vidéos dans la chaîne. (Tout au plus peut-on stocker de courtes données, comme les condensats cités plus haut.) Pour la même raison, les applications qui nécessitent de longs calculs ne sont pas adaptées à la chaîne de blocs.
Celle-ci a d'autres limites : comme la chaîne est publique, il ne faut surtout pas stocker de données confidentielles. On peut parfois stocker uniquement un condensat, comme dans l'exemple plus haut, mais il faut rappeler que les métadonnées (qui stocke des données et quand, par exemple) restent visibles et qu'elles peuvent déjà beaucoup révéler. Contrairement à une légende souvent reprise par des médias sensationnalistes, la chaîne n'est pas adaptée aux transactions vraiment confidentielles. Vouloir, comme je l'ai lu dans certains articles, stocker données de santé ou fichiers scolaires est donc absurde.
La chaîne de blocs est une construction virtuelle, ne vivant que sur un réseau d'ordinateurs. Elle ne permet donc pas de contrôler des objets physiques. Ainsi, on a vu parfois des articles promettant de remplacer Airbnb par la chaîne de blocs. On peut à la rigueur gérer une serrure connectée via une application qui lit la chaîne. Mais ce n'est pas l'application qui va regarder l'état de l'appartement après le passage du locataire et faire un rapport qui influencera la réputation du locataire (une information essentielle sur Airbnb, que connaissent tous les gens qui l'ont réellement utilisé).
Cette présentation était forcément assez générale. Le monde des chaînes de blocs est en pleine effervescence et les projets sont innombrables. Parmi les propositions nouvelles, on entend souvent parler de « chaînes de blocs privées ». Souvent, ce n'est pas décrit de manière assez précise pour qu'on puisse se faire une opinion sur ces « chaînes privées ». Disons qu'une chaîne vraiment privée n'a aucun intérêt : ce serait une base de données plus lente et plus chère que les bases existantes. À la rigueur, il peut y avoir un intérêt pour des chaînes « semi-privées », par exemple au sein d'un consortium dont les membres ne se font pas confiance.
Et pour finir, un petit rappel sur des inconvénients des chaînes. Je ne veux pas dire que cette technologie est sans intérêt, bien au contraire (je ne prendrais pas la peine d'écrire sur quelque chose absolument sans intérêt). Mais elle a des limites. On a dit que toutes les transactions étaient signées, ce qui est crucial pour la sécurité de la chaîne. Mais cette sécurité repose sur la bonne gestion des clefs cryptographiques utilisées. Il faut à la fois empêcher des tiers de lire les clefs privées (pas facile sur une machine Windows infestée de logiciels malveillants) et s'assurer que ces clefs privées sont bien sauvegardées, pour faire face, par exemple, à une panne du disque dur. Cela complique sérieusement l'utilisation de la chaîne de blocs pour M. Michu ! Il existe bien sûr des solutions techniques (signatures multiples) et organisationelles (des « notaires » à qui on sous-traiterait ce travail) à ce problème mais elles sont encore rares.
D'autre part, le caractère immuable des transactions dans la chaîne a des avantages (la censure est difficile) et des inconvénients (pas de droit à l'oubli, les transactions sont visibles éternellement...)
Merci à Michel Guillou pour ses articles et pour l'idée de celui-ci.
Date de publication du RFC : Août 2016
Auteur(s) du RFC : P. Wouters (Red Hat)
Expérimental
Réalisé dans le cadre du groupe de travail IETF dane
Première rédaction de cet article le 25 août 2016
Dernière mise à jour le 12 décembre 2017
Un problème classique du système de
cryptographie
OpenPGP, normalisé dans le RFC 4880 est de vérifier les clés publiques des
correspondants. Les trouver, c'est relativement facile : le
correspondant pense à vous les envoyer ou bien on se sert tout
simplement d'un serveur de clés. Mais
ceux-ci ne garantissent rien sur la clé. N'importe qui peut créer
une clé marquée flotus@whitehouse.gov
et la
mettre sur les serveurs de clé, même si cette clé n'a rien à voir
avec la Maison-Blanche. Avant la solution
de ce nouveau RFC, il n'existait pas de
mécanisme sécurisé pour récupérer une clé publique PGP. Que
propose ce RFC ? De mettre les clés dans le
DNS (nouveau type d'enregistrement OPENPGPKEY
), dans le domaine de la partie droite de
l'adresse de courrier, sécurisée par
DNSSEC. En gros, il s'agit de faire pour le
courrier et PGP ce que fait déjà DANE (RFC 6698) pour
le Web/TLS.
Les serveurs de clés utilisent le protocole HKP (jamais décrit dans un RFC). Ils fournissent un service très utile en permettant de chercher une clé, par son identificateur, ou par l'adresse de courrier associé. Voici un exemple par identificateur :
% gpg --recv-key 0xF3396311465F8E5D gpg: requesting key 465F8E5D from hkps server hkps.pool.sks-keyservers.net gpg: key 465F8E5D: public key "Amaelle G <amaelle.guiton@techn0polis.net>" imported ... gpg: Total number processed: 1 gpg: imported: 1 (RSA: 1)
et un par adresse (notez que les adresses sont probablement toutes fausses) :
% gpg --search-key elysee.fr gpg: searching for "elysee.fr" from hkps server hkps.pool.sks-keyservers.net (1) hollande (flamby) <hollande@elysee.fr> 2048 bit RSA key CF22758A, created: 2014-01-06 (2) jacques chirac (ancienne adresse) <jacques-chirac@elysee.fr> 2048 bit RSA key 2A97F759, created: 2007-11-15, expires: 2007-11-16 (expired) (3) kaziwan <kaziwan@elysee.gouv.fr> 1024 bit DSA key AA7FD67C, created: 2005-11-28 (4) Gerard Calestroupat <gerard.calestroupat@elysee.fr> 1024 bit DSA key 82F02C73, created: 2003-08-05, expires: 2003-08-08 (expired) (5) Toto Berlingo <T.Berlingo@Elysee.fr> 1024 bit DSA key E9E920B7, created: 1999-06-10
Ces serveurs n'offrent aucune garantie : n'importe qui peut y publier une clé, avec n'importe quelle adresse et certaines clés sont clairement mensongères. L'usage normal est de récupérer la clé et ses signatures, puis de vérifier les signatures. Si elles sont faites par des gens qu'on a validés (directement, ou bien transitivement, jusqu'à une certaine profondeur), on estime la clé correcte (c'est ce qu'on nomme le web of trust). Autrement, la clé ne vaut rien. En outre, le seul système de révocation est de signer une révocation avec sa clé privée : si on l'a perdue, on ne pourra jamais retirer la clé des serveurs de clé. Pour ces deux raisons (fausses clés, et clés devenues inutilisables), il est donc difficile d'utiliser automatiquement, depuis un MUA ou un MTA, ces serveurs.
La solution proposée dans ce RFC est, comme souvent aujourd'hui, d'utiliser le DNS, qui a montré sa fiabilité et son ubiquité. Tout le monde peut faire des requêtes DNS, même coincé derrière un pare-feu, et tout le monde peut les valider, grâce à DNSSEC (RFC 4035).
On va donc publier dans sa zone DNS des enregistrements de type
OPENPGPKEY
, indexés par la partie gauche de
l'adresse de courrier (c'est un peu plus compliqué, car elle peut
contenir des caractères qui sont spéciaux pour le DNS ; voir plus
loin). Le correspondant qui veut envoyer du courrier à quelqu'un
cherchera cet enregistrement dans le DNS, et, s'il en trouve un,
le validera avec DNSSEC et récupérera ainsi une clé PGP
relativement sûre. La révocation d'une clé se fait simplement en
retirant l'enregistrement du DNS.
La solution de ce RFC rend envisageable de récupérer et de vérifier automatiquement une clé avant l'envoi d'un message. Mais le RFC note bien qu'elle ne remplace pas complètement le web of trust, qui reste nécessaire si on veut une vérification sérieuse.
Ce RFC a le statut « Expérimental ». Il s'agit de tester l'idée
et de voir si elle marche bien, et n'a pas trop
d'inconvénients (par exemple de taille des zones DNS pour les
domaines gérant beaucoup de comptes de courrier, surtout vu la
taille des enregistrements OPENPGPKEY
). Si le nombre de messages chiffrés avec OpenPGP
augmente significativement suite à ce RFC, ce sera bon
signe.
Notez qu'une expérience ressemblant à celle-ci avait déjà
été faite avec le type d'enregistrement DNS
CERT
du RFC 4398. Ce fut un échec
(peu de déploiement, peut-être en raison de la complexité du type
CERT
).
La section 2 de notre RFC décrit le format du nouveau type d'enregistrement DNS. Chaque enregistrement contient une et une seule clé. Si un utilisateur a plusieurs clés, il doit créer plusieurs enregistrements. Le type est 61 (et enregistré à l'IANA depuis août 2014). La partie droite de l'enregistrement (les données) contient la clé et au moins un ID et une auto-signature. Les clés PGP complètes, avec des tas de signatures, peuvent être grosses, trop pour le DNS ; le RFC recommande de ne publier que des clés minimales (pas trop de signatures, par exemple, et évidemment pas les photos qu'on peut inclure dans un attribut de la clé, cf. RFC 4880, section 5.12.1). Avec GnuPG, regardez l'exportation de ma clé avec toutes ses méta-données, et en exportation minimale (l'annexe A du RFC décrit les commandes GnuPG à utiliser) :
% gpg --export CCC66677 > key.pgp % ls -lh key.pgp -rw-r--r-- 1 bortzmeyer bortzmeyer 86K Aug 25 17:17 key.pgp % gpg --export --export-options export-minimal,no-export-attributes CCC66677 > key.pgp % ls -lh key.pgp -rw-r--r-- 1 bortzmeyer bortzmeyer 5.8K Aug 25 17:18 key.pgp
Le format utilisé est celui du RFC 4880,
section 11.1. C'est donc du binaire qui circule sur le réseau
(rappelez-vous bien que, dans le DNS, le format de présentation,
celui des fichiers de zone, et de la sortie de
dig, n'a rien à voir avec le format binaire
utilisé sur le réseau.) Les formats « texte » d'OpenPGP
(« ASCII armor ») ne sont pas utilisés sur le
réseau. (Donc, avec GnuPG, pas d'option --armor
.)
Le format de présentation (celui des fichiers de zone et de la sortie de dig) encode la clé en Base64.
Et la partie gauche de l'enregistrement DNS ? Quel est le nom de domaine utilisé ? La section 3 du RFC fixe les règles :
OPENPGPKEY
. La clé pour l'adresse
stephane+chose@trucmachin.example
sera donc dans
la zone trucmachin.example
.stephane+chose
, dans l'exemple ci-dessus),
et du composant _openpgpkey
,
avec le domaine de l'adresse de courrier
(trucmachin.example
dans l'exemple
ci-dessus). Le condensat est tronqué à 28 octets. (Le nom de domaine n'est pas utilisé dans le
condensat, pour faciliter la vie des opérateurs qui proposent la
même adresse dans différents domaines.)"jipoune le meilleur"@example.com
est une
adresse de courrier légale) sont retirés.
Ainsi, si l'adresse de l'utilisateur est
hugh@example.com
, la requête
OPENPGPKEY
devra chercher
c93f1e400f26708f98cb19d936620da35eec8f72e57f9eec01c1afd6._openpgpkey.example.com
.
Voici comment calculer cela avec les outils du
shell Unix (28
octets = 56 caractères dans la représentation en hexadécimal) :
% echo -n hugh | sha256sum | cut -c -56 c93f1e400f26708f98cb19d936620da35eec8f72e57f9eec01c1afd6
Une des difficultés pour trouver le bon nom de domaine est que
les applications doivent traiter la partie gauche des adresses de
courrier comme opaque (pas le droit d'analyser sa structure) et
qu'elles ne connaissent pas les règles de canonicalisation
qu'appliquera le domaine de destination, comme
d'ignorer la casse de la partie locale (ce
qui est souvent fait, mais pas toujours). Par exemple,
Gmail ignore les points dans les adresses
(donc foobar@gmail.com
et
foo.bar@gmail.com
arrivent dans la même boîte
aux lettres). L'émetteur qui ne connait pas cette règle va
chercher la clé dans un domaine qui ne sera pas le bon. Idem avec
les sous-adresses utilisées par certains domaines (en général
avec le séparateur plus, comme
stephane+blog
,
stephane+ietf
, etc). Le RFC rappelle que
l'émetteur ne peut pas se permettre de deviner ces règles locales,
et qu'elles peuvent changer à tout moment. C'est au destinataire
de se débrouiller, en publiant la clé à plusieurs noms, et en
faisant attention aux variantes qu'il publie.
L'internationalisation des adresses de courrier complique évidemment encore un peu les choses (voir par exemple la section 10.1 du RFC 6530).
La section 6 du RFC se penche sur un problème pratique qu'on rencontre parfois avec le DNS : la difficulté à recevoir des réponses au-delà d'une certaine taille (il y a trois limites fréquemment rencontrées, la très ancienne limite de 512 octets du DNS, largement dépassée de nos jours, la limite de la MTU à 1 500 octets, au-delà de laquelle peut commencer la fragmentation, et la limite par défaut de la plupart des clients DNS à 4 096 octets). Les clés PGP peuvent être grosses, et le RFC recommende donc si possible de les récupérer sur TCP, pas UDP.
La section 7 de notre RFC analyse les questions de sécurité
liées à cette technique. Elle rappelle que
DNSSEC doit être
utilisé : les enregistrements OPENPGPKEY
récupérés ne doivent être utilisés que s'ils sont signés, et que
la signature est valide. (Autrement, il serait trop facile à un
attaquant de répondre avec une fausse clé.) Mais si DNSSEC est
nécessaire, il n'est pas suffisant et la validation habituelle des
clés PGP reste nécessaire si on veut un haut niveau de
confidentialité. Ceci dit, comme souvent en sécurité, le mieux est
l'ennemi du bien, et il vaut mieux une clé pas très vérifiée
plutôt que d'envoyer le message en clair, comme le fait presque
tout le monde aujourd'hui.
Et, évidemment, la sécurité DNSSEC doit être équivalente à la sécurité PGP puisqu'un attaquant qui aurait cassé la clé DNSSEC pourrait remplacer toutes les clés PGP du domaine. Il faut donc une cohérence dans les politiques de sécurité entre PGP et DNSSEC (section 7.6).
Autre problème de sécurité, cette fois lié à la vie
privée : les requêtes DNS révèlent avec qui on veut
communiquer de manière sécurisée par courrier (RFC 7626). Le fait que le nom de domaine utilisé soit un
condensat de la partie locale de l'adresse de courrier limite un
peu les risques, mais pas suffisamment (si on soupçonne qu'Alice
écrit à bob@example.com
mais qu'on n'en est
pas sûr, il suffit de construire le nom où se trouve
l'enregistrement OPENPGPKEY
et de vérifier
que ce nom est demandé, cf. section 7.4). C'est d'autant plus grave que les clients
DNS actuels envoient en général le nom de domaine complet à
tous les serveurs, même ceux qui n'en ont pas
besoin. La minimisation de la requête (RFC 9156) limite ce problème. Le chiffrement des requêtes
DNS (RFC 7858) peut faire le reste. Le cache
du DNS limite un peu les risques et il est donc essentiel de ne
pas faire une requête DNS externe à chaque fois qu'on envoie un
message PGP à quelqu'un, cela ferait fuiter bien trop
d'informations (section 7.5).
Pour limiter les risques qu'un attaquant récolte toutes les adresses de courrier du domaine, le RFC recommande de signer la zone en utilisant NSEC3 (RFC 5155).
À l'inverse de ce souci de protection de la vie privée, si une organisation veut lire le courrier de ses employés, la solution est qu'elle publie une clé d'organisation dans le DNS, pour pouvoir déchiffrer les messages entrants.
Un autre problème de sécurité est le risque d'utilisation dans
des attaques par
amplification. La taille importante des enregistrements
OPENPGPKEY
(surtout avec les clés
RSA) aggrave ce risque. Le RFC suggère de
n'envoyer ces enregistrements via UDP que si l'adresse IP source de la
requête a été vérifiée, par exemple avec les petits gâteaux du
RFC 7873.
Où en sont les mises en œuvre de ce RFC ? GnuPG contient le code pour gérer ces clés dans le DNS depuis la version 2.1.9. Même chose pour openpgp-milter.
L'outil hash-slinger
permet quant à lui de générer et de vérifier des enregistrements
OPENPGPKEY
:
% openpgpkey --fetch --uid paul@nohats.ca paul@nohats.ca -----BEGIN PGP PUBLIC KEY BLOCK----- Comment: paul@nohats.ca key obtained from DNS Comment: key transfer was protected by DNSSEC Version: GnuPG v1 mQENBFaJkKsBCADDSwQawRsKYqY/DuxWZjNNn39f14tDaswbpuF+PorNnt0MrepI 0yVY28NQ+5P09j75Os1jlqksK06aAVBtkJvr+T1ip85AxPUdTjD3U3zhM5/YATMi ...
On peut alors enregistrer la clé dans le trousseau PGP :
% openpgpkey --fetch --uid paul@nohats.ca paul@nohats.ca | gpg --import gpg: key BBAE5D31: public key "Paul Wouters (online key) <paul@nohats.ca>" imported gpg: Total number processed: 1 gpg: imported: 1 (RSA: 1)
Voici un exemple de récupération de ma clé :
% openpgpkey --fetch --uid 'stephane@bortzmeyer.org' stephane@bortzmeyer.org |gpg pub 4096R/CCC66677 2014-02-08 Stéphane Bortzmeyer (Main key) <stephane@bortzmeyer.org> uid Stéphane Bortzmeyer <stephane@sources.org> uid Stéphane Bortzmeyer (Work address) <bortzmeyer@nic.fr> uid TextSecure fingerprint (05 d6 3b dc b7 e4 d7 69 2f f6 24 d5 51 31 88 2f a5 59 ae 96 e0 fb a5 75 ab e6 6c 64 ca e9 bb 6a 77) <BdY73Lfk12kv9iTVUTGIL6VZrpbg+6V1q+ZsZMrpu2p3@base64> sub 4096R/96A4A254 2014-02-09 [expires: 2018-01-10] sub 4096R/57F02AA1 2014-02-09 [expires: 2017-01-10]
Mais comment ai-je fait pour que ça marche ? hash-slinger permet de créer la clé directement au bon format :
% openpgpkey --create stephane@bortzmeyer.org ; keyid: 555F5B15CCC66677 28182f0a278161989f90f090dabd6cab331663d8509ddbae617bb1e7._openpgpkey.bortzmeyer.org. IN OPENPGPKEY mQINBFL2VNABE...
Il n'y a plus qu'à la mettre dans le fichier de zone, et à re-signer.
Mais, car il y a un mais, cela ne marche que si on a des logiciels
récents, qui connaissent le type 61
(OPENPGPKEY
). Si ce n'est pas le cas, le signeur
refusera de signer, ou le serveur de recharger la zone. C'était mon
cas, en raison d'une trop vieille version
d'OpenDNSSEC. Trois solutions, commençons par la
plus simple, demander à hash-slinger de générer un enregistrement DNS
à la syntaxe générique (« types inconnus », du RFC 3597) :
% openpgpkey --create stephane@bortzmeyer.org --output generic ; keyid: 555F5B15CCC66677 28182f0a278161989f90f090dabd6cab331663d8509ddbae617bb1e7._openpgpkey.bortzmeyer.org. IN TYPE61 \# 5874 99020d0452f654d001100096b30513d96c42e697fd06674b1...
Et c'est cet enregistrement à la syntaxe générique qu'on met dans le fichier de zone. Sinon, si on aime bien faire l'encodage soi-même, utilisons xxd :
% openpgpkey --create stephane@bortzmeyer.org > key.zone [Edit to keep the zone data] % base64 -d key.zone > key.bin [wc -c key.bin to know what number to put in the zone file] % xxd -p key.bin > key.hex
Et on met le contenu de key.hex
dans le fichier
de zone.
Sinon, l'annexe A du RFC fournit une variante de cette solution,
utilisant hexdump.
Voici la récupération de cette clé dans le DNS, avec un
dig récent, qui connait ce type
OPENPGPKEY
et sait formater le résultat :
% dig OPENPGPKEY 28182f0a278161989f90f090dabd6cab331663d8509ddbae617bb1e7._openpgpkey.bortzmeyer.org ;; Truncated, retrying in TCP mode. ... ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36368 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 9, ADDITIONAL: 13 ... ;; ANSWER SECTION: 28182f0a278161989f90f090dabd6cab331663d8509ddbae617bb1e7._openpgpkey.bortzmeyer.org. 85841 IN OPENPGPKEY ( mQINBFL2VNABEACWswUT2WxC5pf9BmdLHzPeXzHZfvik ExJHaQ7LHPRVjAQtBiBN0vI3Uh0VgFzjA+0H2sqTduJY tqd8mrTh9clDnCbrMU8svc7MeWxkW21ogjqBYL8puA3d ...
Notez le « Truncated, retrying in TCP mode ». L'enregistrement est trop gros pour les paquets UDP qu'accepte dig par défaut (il fait huit kilo-octets, dig accepte quatre par défaut). Notez aussi le bit AD (Authentic Data) dans la réponse : celle-ci a bien été validée par DNSSEC.
Avec un dig ancien, qui ne connait pas ce nouveau type (et, cette fois, on demande directement en TCP, comme le recommande le RFC) :
% dig +tcp -t TYPE61 28182f0a278161989f90f090dabd6cab331663d8509ddbae617bb1e7._openpgpkey.bortzmeyer.org ... ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19989 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 9, ADDITIONAL: 29 ... ;; ANSWER SECTION: 28182f0a278161989f90f090dabd6cab331663d8509ddbae617bb1e7._openpgpkey.bortzmeyer.org. 86206 IN TYPE61 \# 5874 ( 99020D0452F654D001100096B30513D96C42E697FD06 674B1F33DE5F31D97EF8A4131247690ECB1CF4558C04 2D06204DD2F237521D15805CE303ED07DACA9376E258 B6A77C9AB4E1F5C9439C26EB314F2CBDCECC796C645B ...
Sur ce sujet, vous pouvez aussi lire l'article de Johannes Weber, qui détaille une utilisation de l'outil de Shumon Huque.
Date de publication du RFC : Juillet 2016
Auteur(s) du RFC : D. Kutscher (NEC), S. Eum (NICT), K. Pentikousis (EICT), I. Psaras (UCL), D. Corujo (Universidade de Aveiro), D. Saucez (INRIA), T. Schmidt (HAW HAmburg), M. Waehlisch (FU Berlin)
Pour information
Réalisé dans le cadre du groupe de recherche IRTF icnrg
Première rédaction de cet article le 25 août 2016
Quels sont les défis qui attendent l'ICN (Information-Centric Networking), ce paradigme où le composant de base du réseau n'est pas la machine ou l'interface réseau mais l'unité d'information ? Le concept est à la mode depuis pas mal d'années mais ne progresse guère sur plusieurs points importants. Ce RFC de synthèse fait le point sur ce qui ne marche pas ou pas parfaitement dans l'ICN, et les axes de recherche souhaitables.
L'idée de base de l'ICN (également nommé
CCN pour Content-Centric Networking) est de
considérer que le réseau sert surtout à accéder à du contenu (un
point de vue Minitel 2.0 très contestable)
et qu'il faut donc architecturer le réseau autour de cet accès au
contenu. Une unité d'information a un nom et
le réseau permet avant tout d'accéder à cette unité d'information,
en échange de ce nom (get(NOM)
...) L'unité
d'information est parfois nommée NDO pour Named Data
Object. On voit
que la localisation de l'information (que ce soit dans l'espace
physique, ou dans celui défini par la topologie du réseau
Internet) n'est pas prise en compte. Cette
approche permettrait, en théorie, une meilleure efficacité (la
mise en cache par les composants du réseau améliorerait les
performances), un meilleur passage à l'échelle (la réplication de
données populaires serait simple), et une meilleure résilience (le
contenu serait à plusieurs endroits). Cette idée
est décrite plus longuement dans le RFC 7476
(lecture recommandée, avant ce RFC 7927), et j'en ai
déjà écrit une critique.
Pour la mettre en œuvre, on peut envisager une couche supplémentaire « accès au contenu » au-dessus de l'Internet actuel, ou bien une approche « table rase » où on remplace IP par un protocole orienté ICN. Notez qu'il existe déjà des mécanismes pour accéder à du contenu par son nom, en ne se souciant pas de la localisation, mécanismes qui fournissent la rapidité, le passage à l'échelle et la robustesse dont on parlait plus haut. Le plus évident est bien sûr BitTorrent mais on notera que les promoteurs de l'ICN n'en parlent quasiment jamais...
D'abord, une synthèse des problèmes avec l'approche actuelle, vus du point de vue des partisans de l'ICN (section 2 du RFC). Cette approche, qualifiée de host-centric, met au centre du réseau la machine. Identifiée par des noms de domaine et/ou des adresses IP, c'est l'unité de base du réseau. On peut bien sûr bâtir une couche ICN (ou para-ICN) au-dessus de cette approche (un CDN est un exemple partiel) mais, comme le réseau n'est pas au courant, cela entraine des limitations :
Pour ce dernier point, celui de la validation, je suis personnellement toujours stupéfait que le Web n'ait toujours pas un mécanisme standard pour authentifier une page qu'on a récupéré. À l'heure actuelle, il faut toujours se contenter de mécanismes ad hoc, comme une signature PGP détachée du fichier qu'on veut valider. (Non, HTTPS n'est pas une solution, d'abord parce qu'il ne fonctionne qu'en transfert, pas après, donc on ne peut pas valider quelque chose qui stationne dans un cache, et ensuite parce qu'il est incompatible avec des miroirs, sauf à distribuer une clé privée à plein d'autres acteurs.)
Avant d'aller plus loin, la section 3 du RFC nous apporte une petite révision des termes et concepts essentiels en ICN. Pour les termes, il faut se souvenir de :
Une fois armé de cette terminologie, on peut expliquer le concept central de l'ICN : un réseau dont l'objet de base est le NDO (pas le paquet, pas la machine), et dont le service de base est d'envoyer des NDO aux demandeurs.
Ceux qui ont assisté à mon exposé à Pas
Sage En Seine 2016 ont pu voir un exemple d'ICN mis en
œuvre sur la chaîne de blocs (exemple FindByHash
).
Sur le papier, c'est très joli, mais voyons maintenant les défis que cela pose (section 4 du RFC, le gros morceau de ce texte). D'abord, le nommage et l'authentification (les deux sont en général liés dans l'ICN). Nommer un NDO est aussi crucial dans l'ICN que de donner une adresse IP à une machine dans l'Internet classique. Et comme l'objet nommé peut être récupéré à partir de divers endroits dans le réseau ICN, vérifier l'authenticité par le biais de l'origine marche encore moins que dans le Web actuel. Il y a des tas de solutions possibles, résumées dans des études comme « Naming in Content-Oriented Architectures » de Ghodsi, A., Koponen, T., Rajahalme, J., Sarolahti, P., et S. Shenker ou bien « A Survey of Information-Centric Networking » de Ahlgren, B., Dannewitz, C., Imbrenda, C., Kutscher, D., et B. Ohlman.
Il y a deux grandes façons d'organiser le nommage dans l'ICN :
espace de nommage hiérarchique, ou bien espace de nommage
plat. Par exemple, un nommage hiérarchique pourrait produire des
noms comme pays/éditeur/date/NDO
. Cette façon
de nommer simplifie nettement le routage et le passage à
l'échelle. La structure des noms permet de faire une structure
identique pour la PKI qui servira à
authentifier le contenu (ainsi, une AC pour
un éditeur donné ne pourra pas signer des certificats d'un autre
éditeur, contrairement à ce qu'on voit sur le Web aujourd'hui, où
la structure arborescente des noms de domaine n'est pas utilisée pour
limiter les dégâts que peut faire une AC.) Cette structure hiérarchique peut aussi permettre de faire des noms lisibles par des
humains. (Par contre, le RFC oublie de noter que de tels
noms suscitent d'innombrables disputes de
gouvernance : tout le monde veut être à la racine,
veut tel nom, etc.)
Autre solution, l'espace de nommage plat. Typiquement, le NDO est désigné par un condensat cryptographique de son contenu. Cela permet l'authentification de manière évidente : on récupère le contenu, on calcule le condensat, et on doit retrouver le nom. Et un tel système peut être complètement réparti, sans autorité jouant un rôle particulier. Par contre, l'absence de structure dans le nom nécessitera un système de résolution adapté (comme une DHT). Une telle solution est même déjà décrite dans un RFC, le RFC 6920.
Aucune des deux façons de gérer l'espace de nommage n'est parfaite (cf. le triangle de Zooko). Par exemple, les condensats cryptographique ne sont pas maniables par un humain, mais les noms hiérarchiques ne peuvent pas être alloués de manière complètement pair-à-pair.
Les sujets de recherche existants sur le nommage sont :
En parlant de restriction d'accès, la sécurité, dans son ensemble est un difficile problème pour l'ICN (section 4.2). C'est le cas de la plupart des solutions miracles qui sont proposées pour l'Internet : une idée simple qui semble bien marcher, puis, dès qu'on creuse les détails pratiques, les ennuis surgissent puis, dès qu'on arrive à la sécurité, l'idée simple s'effondre. Dans le cas de l'ICN, le RFC suggère plusieurs pistes de travail. D'abord, l'authentification des données, sans doute la partie la plus facile à réaliser (et celles, on l'a vu, où le Web actuel est défaillant). Comme on peut récupérer un NDO depuis n'importe où, pas forcément depuis le serveur d'origine, il est crucial de l'authentifier. Évidemment, si le nom de l'objet est un condensat de son contenu, comme c'est le cas avec le RFC 6920, la vérification de l'intégrité est facile : on récupère l'objet, on condense et on regarde si on tombe bien sur la même valeur. Pour des objets générés dynamiquement, cette solution ne fonctionne pas et il faut donc signer l'objet avec de la cryptographie asymétrique. D'ailleurs, cette cryptographie est nécessaire dans tous les cas : vérifier le nom-qui-est-un-condensat prouve l'intégrité de l'objet, pas que l'objet vient bien de l'auteur attendu. Ici, une signature cryptographique est donc également nécessaire. Comme toujours avec la cryptographie à clés publiques, cela laisse ouvert l'énorme problème de la distribution des clés... (cf. RFC 5280 pour une approche possible).
Pour l'utilisateur normal, vérifier que l'objet
148aec5042e7c05df755d9ce8adec80a1e9c10b1557194fd94e45146416a0de8
a bien un contenu qui correspond à ce condensat n'a qu'un intérêt
limité. M. Michu voudrait une authentification plus forte,
vérifier qu'il s'agit bien du guide
de sécurité Java de l'ANSSI ou que c'est bien la série télé qu'il
cherchait. Et, là, le problème est difficile. Les
défenseurs du pair-à-pair prétendent par exemple souvent que
BitTorrent est pair-à-pair, qu'il
fonctionne sans centre mais, pour la très grande majorité des
usages, c'est faux. M. Michu utilise un moteur de recherche
centralisé, comme The Pirate Bay ou comme
isoHunt. Il récupère alors un
magnet (qui contient un
condensat du fichier convoité), et, ensuite, on est vraiment en
pair-à-pair : on télécharge, on vérifie le condensat et on
s'installe dans son fauteuil pour regarder. Mais l'étape du moteur
de recherche, avec ses pubs mensongères, était tout, sauf
pair-à-pair.
En ICN, comment lier un NDO à une identité du monde extérieur, par exemple un acteur connu et de confiance ? C'est un problème essentiel mais non encore résolu.
Le contrôle d'accès, on l'a vu, est également un problème difficile. Comment faire si je veux vendre du contenu sans permettre aux destinataires de le redistribuer ? Il n'y a pas de solution évidente. Les approches intégrées sont celles où l'entité qui publie utilise des mesures pour limiter la redistribution (typiquement des menottes numériques), les approches séparées comptent sur une tierce-partie qui gère les accès (je vous laisse imaginer les conséquences en terme de liberté de choix de son logiciel par M. Michu...) On peut bien sûr chiffrer le contenu qu'on va distribuer (ah, Canal+...) mais il reste à distribuer les clés ensuite.
La cryptographie n'est pas éternelle, les algorithmes de cryptographie finissant par être affaiblis, puis cassés. Ce n'est pas un problème si on publie du contenu à courte durée de vie mais, si le contenu est encore utile et payant dans dix ans, l'efficacité de la cryptographie devient incertaine : comment garantir que l'algorithme utilisé sera toujours incassé ? L'idéal serait un mécanisme de re-signature et de re-chiffrement mais cela pose encore le problème de la gestion des clés privées.
Autre conséquence de la mise en cache et de la distribution à partir de plusieurs endroits, l'auteur d'un contenu n'aura plus de statistiques d'accès fiables. De la même façon, retirer un contenu publié sera encore plus difficile que sur le Web actuel (un contenu populaire est davantage répliqué et donc plus dur à supprimer).
Autre problème de sécurité avec l'ICN, le risque d'attaque par déni de service via le cache. Un des buts de l'ICN est de permettre, et même d'encourager, la mise en cache automatique du contenu par les éléments du réseau, comme les routeurs. Cela ouvre une possibilité d'attaque où le méchant téléchargerait plein de choses sans intérêt juste pour remplir les caches. Pire : comme l'ICN renonce explicitement au principe de bout en bout, ces éléments intermédiaires mantiennent un état et peuvent également être attaqués par ce biais. Par exemple, en annonçant plein de contenus divers, on pourrait remplir la table de routage.
Après la sécurité, le routage dans l'ICN pose également des défis intéressants. Le terme n'a pas tout à fait le même sens dans l'ICN que dans l'Internet actuel. L'ICN permet d'obtenir un contenu (le NDO, Named Data Object) en échange d'un nom. Cela nécessite trois étapes : la première est de résoudre le nom en un localisateur, plus concret. La deuxième est d'envoyer la demande de contenu à cet endroit. La troisième est d'obtenir la réponse (le NDO). Ces trois étapes peuvent être faites de différentes manières, catégorisées comme routage par nom (route-by-name), recherche par nom (lookup-by-name) et hybride.
Le routage par nom consiste à ne pas avoir la première étape, celle de résolution, ce qui simplifie le modèle : le réseau comprend directement les noms. Il faut donc une « table de routage » dont la taille permette de stocker tous les NDO. Comme on envisage entre 10^15 et 10^22 NDO, le défi technique est colossal. Sans compter qu'il faut aussi identifier la source de la requête, puisqu'il faudra bien lui envoyer le contenu demandé (c'est ce que fait l'algorithme des miettes de pain, cf. Rosensweig, E. et J. Kurose, « Breadcrumbs: Efficient, Best-Effort Content Location in Cache Networks »). Les sujets de recherche sur le routage par nom comportent donc, entre autres :
/IETF/IRTF/ICN/Research challenges
pour ce
RFC) afin de permettre l'agrégation, comment permettre aux
utilisateurs d'utiliser des noms plus simples ? (Se servir d'un
moteur de recherche serait de la triche,
puisqu'on voulait se dispenser de l'étape de résolution.)La catégorie « recherche par nom » regroupe les mécanismes de routage qui, eux, ont une étape de résolution explicite. On résout le nom (qui est pratique pour un humain, et stable) en un localisateur (qui est pratique pour le réseau et qui pourrait être une simple adresse IP). C'est par exemple ainsi que fonctionne le système « MDHT: A hierarchical name resolution service for information-centric networks ». Les défis techniques à relever sont l'accès rapide au localisateur (en se rappelant que le contenu peut être à plusieurs endroits) et la mise à jour efficace (car le contenu peut changer de localisation, c'est même un des buts de l'ICN). Notez que les gens de l'ICN aiment bien réinventer la roue et que le DNS n'est même pas mentionné.
Enfin, il y a les solutions de la catégorie hybride. Par exemple, on fait du routage par le nom en local mais on résout le nom en un localisateur dès qu'on sort de ce domaine local.
Vous aimez les défis techniques et la liste n'est pas encore assez longue pour vous ? Il reste plusieurs problèmes à affronter. Par exemple, le contrôle de congestion. Il n'a pas à être de bout en bout puisque, dans l'ICN, la communication peut se faire via des éléments intermédiaires (voir par exemple « ConTug: A Receiver-Driven Transport Protocol for Content-Centric Networks »).
On a vu qu'un des intérêts principaux de l'ICN était de permettre la mise en cache automatique par des éléments du réseau, et l'accès au contenu à partir de ces caches. La bonne utilisation de ceux-ci soulève plusieurs questions :
ni:
du RFC 6920) ne résout pas le problème : il faut maintenant un
mécanisme pour informer les clients du nouveau nom.Les administrateurs réseau sont habitués à des outils comme ping et traceroute pour tester et déboguer leur réseau. Comment feront-ils avec l'ICN ? C'est un autre défi. Étant donné que ping et traceroute ne sont apparus que de nombreuses années après IP, on peut prévoir que, pendant un certain temps, les administrateurs des réseaux ICN souffriront du manque d'outils adaptés.
Quelles applications utiliseront l'ICN, si tous ces défis sont relevés, et avec succès ? Le RFC se termine par une liste d'applications potentielles (cf. RFC 7476) :
GET
). Les noms des NDO
remmplaceront-ils les URI ? Il n'est pas
évident que tous les usages du Web (POST
,
PUT
, et autres méthodes utilisées par les
applications REST) s'adaptent aussi bien
à l'ICN.Une conclusion personnelle ? Il y a plein d'idées intéressantes dans l'ICN, et c'est donc un sujet de recherche utile, malgré la prémisse de départ (« tout est accès au contenu ») qui est fausse.
Date de publication du RFC : Juillet 2016
Auteur(s) du RFC : L. Colitti (Google), V. Cerf
(Google), S. Cheshire
(Apple), D. Schinazi (Apple)
Réalisé dans le cadre du groupe de travail IETF v6ops
Première rédaction de cet article le 24 juillet 2016
Combien d'adresses IPv6 faut-il permettre à une machine qui se connecte ? « Une » est évidemment le minimum mais est-ce suffisant ? Non, explique ce RFC qui recommande aux opérateurs et FAI de permettre aux machines de s'allouer autant d'adresses IPv6 qu'elles en ont besoin.
IPv6 est juste une nouvelle version d'IP. Ce n'est pas un nouveau protocole. Néanmoins, la taille bien plus importante de son espace d'adressage a des conséquences qui sont souvent oubliées par les administrateurs de réseaux. Ainsi, il est fréquent que la gestion des réseaux soit faite en limitant chaque machine à une seule adresse IPv6. En IPv4, il n'y a évidemment pas d'autre choix possible, en raison de la pénurie d'adresses publiques. Mais en IPv6, il n'y a aucune raison de se limiter, et beaucoup de raisons de permettre davantage d'adresses. Bref, bien qu'IPv6 ne soit pas complètement nouveau, cela ne veut pas dire que les bonnes pratiques IPv4 s'appliquent directement à IPv6.
Il est banal de faire remarquer que les adresses IPv6 sont, en pratique, illimitées. Un simple lien réseau (numéroté avec un préfixe de 64 bits) offre quatre milliards de fois plus d'adresses que tout l'Internet IPv4 ! Il n'est donc pas du tout obligatoire de rationner. IPv6 est conçu depuis le début (section 2 de notre RFC) avec l'idée que chaque machine (et même chaque interface réseau de chaque machine) aura plusieurs adresses IP (par exemple, une adresse locale au lien, une adresse publique stable, et au moins une adresse temporaire du RFC 8981). Et toutes les mises en œuvre d'IPv6 existantes gèrent cela correctement.
Mais quel est l'intérêt de permettre plusieurs adresses ? La section 3 de ce RFC répond à la question :
draft-herbert-nvo3-ila
).Et quels sont les problèmes si on ne fait pas ce que recommande ce RFC ? La section 4 les liste. Évidemment, si ajouter des adresses IP est complètement impossible, on est fichus. Et si la connexion au réseau permet d'ajouter des adresses IPv6 mais que cela nécessite une action explicite (par exemple via l'interface Web de l'hébergeur) ? Cela entraine :
Pourquoi les opérateurs restreindraient-ils ainsi l'obtention d'adresses IPv6 supplémentaires ? Par pur sadisme ? Non, il peut y avoir des raisons objectives :
Avec le temps, il faut espérer que les limites matérielles reculent et que la raison business (faire payer) soit rejetée par les utilisateurs (ils peuvent la contourner, par exemple en faisant du NAT, ce qui serait un comble pour IPv6).
À propos de NAT, est-ce que c'est une bonne stratégie pour résoudre le problème d'un opérateur qui ne laisserait pas assez d'adresses IPv6 à ses clients (section 5 du RFC) ? Les problèmes et limites du NAT sont bien connus (RFC 2993). Les applications sont plus complexes (car leurs programmeurs doivent déployer des trésors d'ingéniosité pour contourner le NAT), la gestion de la durée de vie des correspondances entre adresses dans le routeur NAT est pénible (quel intervalle entre les paquets d'entretien de la connexion ?), etc. C'est pour cela que le NAT sur IPv6 est très déconseillé (RFC 5902).
Ce n'est pas faute de mises en œuvre (le NAT66 est dans Linux depuis 2012...), un vendeur de virtualisation l'a aussi développé, précisement pour contourner ce manque d'adresses IPv6 allouées, mais il n'est pas souhaitable que cela continue. Le but d'IPv6 est d'avoir une vraie connectivité de bout en bout, qui ne soit limitée que par des choix délibérés (Alice ne veut plus parler à Bob), pas par des limites techniques inutiles.
Et si l'opérateur du réseau où se connecte la machine a été convaincu par ce RFC, et veut permettre à ses clients d'allouer les multiples adresses IPv6 dont ils ont besoin, quels sont les mécanismes techniques dont il dispose pour cela ? La section 6 les couvre :
Un tableau à la fin de la section 6 résume les forces et faiblesses de chaque solution.
Au fait, combien d'adresses exactement peut-on s'attendre à voir sur une seule machine ? La section 7 se lance dans la spéculation. Les adresses « vie privée » du RFC 8981 peuvent consommer jusqu'à huit adresses en même temps. Avec une demi-douzaine de services réseau, et une demi-douzaine de machines virtuelles (ou de containers) hébergés, avoir vingt adresses sur une seule machine peut donc être raisonnable. Mais, bien sûr, il est difficile de prévoir les usages futurs et, en pratique, ce sera peut-être bien plus.
Allez, c'est presque fini, la section 8 du RFC synthétise les recommendations officielles :
Ces recommandations, si elles sont suivies, auront quelques conséquences pratiques (section 9). Par exemple, elles ne permettent pas de garder trace de quelles adresses sont utilisées par quelle machine. (Alors qu'avec une demande d'allocation explicite, par exemple par le biais d'une nouvelle interface virtuelle, comme c'est le cas actuellement chez Gandi, ce suivi est possible.) C'est ennuyeux si on veut remonter d'une adresse IP qui pose un problème (par exemple parce qu'il a téléchargé Les tortues Ninja) à son propriétaire. Une solution de remplacement est de superviser le réseau et de relever les réponses NDP, permettant ainsi de se constituer une base de la relation entre les adresses IP et les adresses MAC. Le logiciel NDPMon permet de faire cela. (On peut aussi interroger les commutateurs en SNMP, pour avoir un résultat analogue.) Les auteurs du RFC notent que tous leurs employeurs ont déjà un tel système en place, et ils citent plusieurs gros campus universitaires qui font de même, ce qui montre le caractère réaliste de la proposition.
Puisqu'on parle de sécurité, il faut noter que de ne pas permettre officiellement aux machines de s'attribuer des adresses IP supplémentaires ne signifiera pas qu'elles ne le feront pas. Si on n'a pas de sécurité dans la couche 2 (cf. RFC 7039), les machines peuvent toujours se configurer ce qu'elles veulent. En outre, si le mode d'allocation est DHCP, les efforts actuels pour améliorer la vie privée des utilisateurs de DHCP (RFC 7844) vont de toute façon diminuer l'intérêt de DHCP pour la sécurité.
Autre problème pratique pour les administrateurs réseau, les limites du matériel. Si un commutateur connecte mille machines, sa table de correspondance adresses IP <-> adresses MAC aura mille entrées. Si chaque machine s'alloue dix adresses, cette table devra stocker dix mille entrées. Le commutateur a-t-il cette capacité ? S'il ne l'a pas, on risque des pertes de connectivité. Certes, le matériel va évoluer. Mais il existe une autre solution, suggérée par notre RFC : utiliser un préfixe IP par machine. Ainsi, le commutateur n'aura à gérer qu'une seule entrée par machine, quel que soit son nombre d'adresses. Évidemment, cela consommera davantage d'adresses IPv6, et cela compliquera un peu la gestion des adresses. Cette proposition est donc légèrement plus sujette à controverse que la principale (permettre plusieurs adresses par machine) qui, elle, est largement reconnue comme justifiée.
Date de publication du RFC : Juillet 2016
Auteur(s) du RFC : Y. Sheffer (Intuit), A. Farrel
(Juniper)
Première rédaction de cet article le 23 juillet 2016
L'IETF se vante souvent de ne pas croire au blabla des marketeux, mais uniquement au code qui tourne. Comme le dit fièrement sa devise, « We believe in rough consensus and running code ». Mais, en pratique, les normes produites et publiées en RFC ne contiennent pas toujours la mention d'une mise en œuvre effective de cette norme. Parfois, c'est parce qu'il n'y en a pas (contrairement à une légende tenace, ce n'est nullement une obligation pour la publication d'un RFC). Parfois, c'est parce qu'elle n'est pas mentionnée. Avant la publication d'un RFC, lorsque le document est encore un simple Internet-Draft, la mention de l'existence de programmes mettant en œuvre le protocole ou le format décrit est facultative. Ce RFC propose de formaliser et d'encourager cette mention. Son prédecesseur, le RFC 6982 avait lancé l'idée, comme une expérimentation. Elle a été un grand succès et ce nouveau RFC passe donc au stade supérieur : publier l'état des implémentations d'un draft est désormais une Bonne Pratique (BCP, « Best Common Practice »).
Cela ne concerne que les Internet-Drafts, pas les RFC. En effet, les RFC sont stables (jamais modifiés) alors que les URL pointant vers un programme ne le sont pas : un programme peut être abandonné, plus maintenu, on peut se retrouver avec des 404, etc. Donc, un RFC n'est pas le bon endroit pour stocker un catalogue de mises en œuvre d'un protocole. Ce RFC 7942 ne vise que les Internet-Drafts, afin d'aider à l'évaluation d'une proposition. La section décrivant les mises en œuvre est donc typiquement supprimée lors de la publication du RFC. Comparez par exemple le draft-ietf-dnsop-qname-minimisation (dont la section 8 décrit les mises en œuvre existantes) avec le RFC 7816 (qui n'a plus cette section).
Le concept de running code est décrit dans le Tao (cf. RFC 4677 et RFC 6722). Il synthétise l'approche pragmatique de l'IETF : une norme qui n'est pas mise en œuvre ne sert à rien. Malgré cela, bien des RFC n'ont jamais connu la moindre mise en œuvre. En effet, ce principe général du running code n'a jamais été traduit dans une exigence formalisée et globale pour les auteurs de RFC. Il existe par contre des règles locales. Ainsi, la Routing Area de l'IETF (les groupes de travail qui normalisent les protocoles de routage) a longtemps demandé (RFC 1264) au moins une mise en œuvre avant la publication d'un RFC sur le chemin des normes. Le RFC 4794 a supprimé cette règle, qui reste appliquée par certains groupes de la Routing Area comme IDR. À noter qu'avant le RFC 6982, il y avait déjà des compte-rendus de mise en œuvre (implementation reports) qui étaient des documents séparés, racontant des expériences concrètes de développement.
Notre RFC 7942 n'impose pas une règle (la section Implementation Status reste facultative), mais il encourage fortement à formaliser une section dans les Internet-Drafts, qui permettra de documenter les mises en œuvre connues. L'idée est que les Internet-Drafts ayant cette section seront examinés avec plus de bienveillance, sans toutefois qu'elle soit obligatoire.
La section 4 du RFC fait la liste de tous les avantages qu'il y a à indiquer ces mises en œuvre dans l'Internet-Draft : meilleure information pour la prise de décision (aussi bien sur la publication de l'Internet-Draft que sur le statut du futur RFC), encouragement aux tests d'interopérabilité, possibilité (lorsque le code est publié) de mieux comprendre le protocole (beaucoup de programmeurs préfèrent lire le source plutôt que le RFC mais attention, la référence doit rester le RFC, le code n'est pas une spécification), et enfin assurance que telle fonction du RFC peut effectivement être mise en œuvre. C'est en effet souvent le cas (par exemple lors de la discussion qui a mené au RFC 5155) que certaines personnes affirment que la technologie envisagée est tout simplement trop complexe pour être programmée. L'existence d'un programme qu'on peut tester permet de d'assurer que, si, la technologie est réaliste (bien d'autres SDO produisent sans hésiter des technologies impossible à programmer dans des conditions raisonnables).
Cette section, « Implementation status » est décrite en section 2 de ce RFC. Elle est située vers la fin (comme l'actuelle - et obligatoire, elle - « Security considerations ») et peut comporter les points suivants :
Cette section peut aussi indiquer l'expérience tirée de cette mise en œuvre, ainsi que des informations sur l'interopérabilité, au cas où plusieurs mises en œuvre existent. Les présidents des groupes de travail sont explicitement chargés de vérifier que cette section ne dégénère pas en simple marketing pour le produit d'un vendeur. Notre RFC propose aussi un texte standard d'avertissement (« boilerplate ») à inclure au début de cette section « Implementation status ».
D'autres endroits que l'Internet-Draft lui-même auraient pu être utilisés pour informer sur les mises en œuvre existantes. Le RFC suggère (section 3) de passer au wiki de l'IETF lorsque la liste des programmes devient trop longue, lorsqu'il semble préférable que cette liste soit maintenue par les implémenteurs plutôt que par les auteurs de l'Internet-Draft, lorsque le groupe de travail maintient activement un wiki, ou enfin lorsque la liste en question semble utile, même après la publication en RFC (pour indiquer le niveau d'adoption par les programmeurs). Dans tous ces cas, il est bon d'indiquer l'URL du wiki en question dans l'Internet-Draft.
De très nombreux
Internet-Drafts incluent
désormais une telle section Implementation
Status, « bien trop pour qu'on puisse les compter », note
l'IESG dans son approbation de ce
document. Quelques exemples d'Internet-Drafts qui
incluent actuellement cette section : draft-ietf-dnsop-nxdomain-cut
ou
draft-ietf-dane-openpgpkey
.
Le principal changement par rapport au RFC précédent, le RFC 6982 est un changement de statut. On passe de « expérimental » à « Bonne Pratique », reflétant le succès de cette expérience. Autrement, il n'y a que des changements de rédaction, rien de crucial.
Date de publication du RFC : Juin 2016
Auteur(s) du RFC : C. Bao, X. Li (CERNET
Center/Tsinghua University), F. Baker (Cisco
Systems), T. Anderson (Redpill
Linpro), F. Gont (Huawei
Technologies)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF v6ops
Première rédaction de cet article le 22 juillet 2016
Parmi les nombreuses techniques de coexistence d'IPv4 et IPv6, l'ex-groupe de travail Behave développait un mécanisme de traduction permettant à une machine IPv6 de communiquer avec une machine v4 et réciproquement. Une des pièces de ce mécanisme (désormé transféré au groupe de travail v6ops) est l'algorithme de traduction, présenté dans ce RFC 7915. (Il remplace l'ancien RFC 6145, avec assez peu de changements.)
Ce nouveau mécanisme de traduction entre IPv4 et IPv6 s'inscrit dans le cadre décrit dans le RFC 6144. Il vise à remplacer « NAT-PT » (RFC 2765 et RFC 2766), officiellement retiré, après n'avoir eu aucun succès.
Plus spécifiquement, notre RFC 7915 est la version sans état du traducteur, c'est-à-dire que le traducteur peut traiter chaque paquet indépendamment des autres. Le traducteur n'a pas de table des flots en cours. S'il redémarre et perd toute mémoire, pas de problème, il peut immédiatement reprendre son travail. Cette technique permet notamment le passage à l'échelle : un traducteur d'adresses peut gérer un très grand nombre de clients sans épuiser sa mémoire. Et on peut mettre plusieurs traducteurs en parallèle, sans coordination entre eux : les paquets d'un même flot peuvent passer par des traducteurs différents. Mais cette technique a aussi quelques inconvénients comme le fait que les fragments ICMP ne seront pas traduits. Il existe donc également une version avec état du nouveau mécanisme, normalisée dans le RFC 6146. La section 1.3 discute plus en détail ces deux possibilités, avec ou sans état.
Donc, le NAT64 (son nom non officiel) vise à traduire des adresses IP entre deux réseaux, l'un v4 et l'autre v6. Comme notre RFC 7915 ne traite que le cas sans état, les adresses doivent être converties de manière purement algorithmique, sans référence à leur histoire (cf. RFC 6052, et la section 6 de ce RFC, pour ces algorithmes).
Dit comme ça, cela a l'air simple mais la traduction entre deux protocoles différents porte pas mal de pièges. Ainsi, les en-têtes de paquet n'ont pas la même taille en v4 (20 octets ou plus) et en v6 (40 octets, fixe), ce qui fait que des problèmes de MTU peuvent se poser (section 1.4). Le traducteur doit se comporter comme un routeur, donc fragmenter les paquets trop gros (en IPv4) ou retourner un message ICMP « Packet too big ».
La section 4 du RFC décrit en détail les opérations que doit faire le traducteur depuis IPv4 vers IPv6 (rappelez-vous que la traduction des adresses v4 en v6 est essentiellement dans le RFC 6052, section 2). Il y a des détails que ne connaissent pas les routeurs NAT44, qui se contentent de changer adresses et ports. En effet, ici, il faut traduire tout l'en-tête. Je ne vais pas résumer complètement cette section, juste pointer quelques pièges possibles. Ainsi, les en-têtes n'étant pas les mêmes en v4 et en v6, notre RFC doit spécifier quoi en faire. Certains cas sont évidents (comme le champ Longueur), d'autres moins. Ainsi, le champ TOS de IPv4 doit être copié verbatim dans le champ Traffic Class de IPv6. Mais le traducteur doit aussi offrir une option pour ignorer le TOS et mettre systématiquement zéro comme Traffic Class. Le champ TTL de IPv4 doit être copié dans Hop limit mais après avoir été décrémenté (rappelez-vous que le traducteur est un routeur).
La vraie difficulté n'est pas tellement dans la traduction d'IP que dans celle d'ICMP. En effet, le paquet ICMP contient le début du paquet IP qui a motivé son envoi, et ce début de paquet doit être traduit, également, sans quoi le destinataire du paquet ICMP n'y comprendra rien (par exemple, sans traduction ICMP, il recevrait en IPv6 un paquet ICMP dont le contenu est un paquet IPv4...). Notre RFC détaille donc les traductions à faire pour tous les modèles de paquets ICMP.
Le traducteur doit aussi veiller au champ Type d'ICMP, dont les valeurs sont différentes entre IPv4 et IPv6 (par exemple, Echo Reply est 0 en v4 et 129 en v6). Certains types n'ont pas d'équivalent (comme les types Timestamp ou Address Mask d'ICMPv4, absents d'ICMPv6) et le paquet ICMP doit donc être abandonné.
Enfin, le traducteur doit aussi prendre en charge les en-têtes de la couche 4 car la traduction des adresses peut ne pas être neutre pour la somme de contrôle (section 4.5) et il peut donc être nécessaire de recalculer cette dernière.
Et en sens inverse ? La section 5 décrit la traduction d'IPv6 vers IPv4. On retrouve TOS et Traffic Class, les problèmes de MTU et de fragmentation, et la traduction des messages ICMP.
La section 6 de notre RFC, une nouveauté depuis le RFC 6145, revient sur les algorithmes de correspondance entre les adresses IPv4 et IPv6. Les algorithmes obligatoires sont décrits dans le RFC 6052, mais un traducteur peut en ajouter d'autres.
Les problèmes de MTU et de fragmentation sont des cauchemars habituels sur l'Internet, notamment en raison d'équipements intermédiaires (typiquement des pare-feux) programmés avec les pieds par des anonymes, ou bien configurés n'importe comment, et qui bloquent les paquets ICMP, voire les modifient, en ignorant complètement le RFC 4890. Les traducteurs v4<->v6 auront donc ce problème, comme tant d'autres techniques utiles. La section 7 doit donc se pencher sur le traitement des paquets ICMP Packet too big qui signalent normalement que la MTU est plus réduite que ne le croit l'émetteur et qu'il faut fragmenter. Comme ces paquets sont parfois interceptés, voire modifiés, par des machines gérées par des incompétents, le traducteur doit donc parfois faire des efforts spécifiques. Si les paquets sont interceptés, la détection de la MTU du chemin n'est plus possible (RFC 2923) et il ne restera plus que la solution du RFC 4821 (faire faire le travail par les couches supérieures).
Rien n'étant parfait en ce bas monde, les traducteurs NAT64 vont aussi introduire de nouvelles questions de sécurité. La section 8 tente de prévoir lesquelles mais reste optimiste en considérant que la plupart des problèmes existent déjà dans IPv4 ou dans IPv6. Ainsi, comme avec le NAT traditionnel, l'authentification des paquets par IPsec (RFC 4302) ne marchera pas.
Pour les gens qui aiment bien les exposés concrets, avec des 0 et
des 1, l'annexe A explique en grand détail le
processus de traduction avec un réseau simple d'exemple, connectant le
réseau traditionnel 198.51.100.0/24
et le réseau
nouveau 2001:db8::/32
, via un
traducteur. Deux machines, H4 et H6, Alice et Bob du NAT64, vont tenter de communiquer. Le traducteur
utilise le préfixe 2001:db8:100::/40
pour
représenter les adresses IPv4 et 192.0.2.0/24
pour représenter les adresses IPv6. Ainsi,
H6, qui a l'adresse 2001:db8:1c0:2:21::
est
représenté en v4 par 192.0.2.33
. H4 a l'adresse
198.51.100.2
. Une fois le routage
correctement configuré pour passer par le traducteur, suivez le RFC
pour voir le trajet des paquets et les opérations qu'ils subissent,
dans le cas où c'est H6 qui initie la connexion, et dans le cas inverse.
Au moins deux mises en œuvre existent déjà, faite par Ecdysis/Viagénie (avec état) et Tayga (sans état, mais nettement plus simple, d'après ses utilisateurs). Pour compenser l'absence de traduction avec état chez Tayga, on peut, sur Linux, le coupler avec SNAT/MASQUERADE (merci à Guillaume Leclanché pour sa suggestion).
Quels sont les changements entre ce mécanisme et celui du RFC 6145 ? Rien de dramatique. Ils sont résumés en section 2. Certains traitent les bogues détectées dans l'ancien RFC. D'autres changements tiennent compte du conseil actuel qui est de ne plus compter sur les « fragments atomiques » du RFC 6946 (ils ont même été franchement abandonnés avec le RFC 8021.)
Pour réfléchir à la grande question « avec état ou sans état », un article « pro-état » : « Stateless NAT64 is useless ».
Date de publication du RFC : Juin 2016
Auteur(s) du RFC : A. Atlas (Juniper), T. Nadeau
(Brocade), D. Ward (Cisco)
Pour information
Réalisé dans le cadre du groupe de travail IETF i2rs
Première rédaction de cet article le 21 juillet 2016
Autrefois, la configuration des routeurs était relativement statique. On indiquait la politique de routage (le coût de tel ou tel lien, par exemple), les préfixes IP, les pairs BGP, parfois des routes statiques, et le routeur parlait avec ses copains routeurs, construisant ses tables qu'il allait ensuite utiliser pour la transmission des paquets. La configuration n'était pas modifiée tous les jours et quand c'était nécessaire, on se connectait à tous les routeurs qu'il fallait changer et on modifiait la config. Dans les organisations plus modernes, on édite la config, on la commite dans un VCS et on la pushe vers les routeurs avec Ansible ou un truc équivalent. Aujourd'hui, même cela ne suffit pas, on voudrait être plus agile. On voudrait modifier la configuration des routeurs à peu près en temps réel, pour répondre à des considérations de business (créer un nouveau service pour un client, profiter de variations de prix chez les transitaires...) ou à des problèmes de sécurité (déployer des filtres subtils). Cette exigence nécessite une interface vers le routeur, utilisable par des programmes. C'est le projet I2RS, Interface To the Routing System. Ce premier RFC du groupe de travail décrit précisement le problème qu'on essaie de résoudre. (Notez que le buzzword SDN n'apparait pas une seule fois dans ce RFC...)
C'est que les réseaux modernes sont grands et complexes : il n'est plus possible de faire les choses à la main en se connectant sur chaque routeur isolément. Il faut donc automatiser, et il faut donc qu'un programme puisse se connecter aux routeurs et changer leurs configurations. Cela se fait bien sûr depuis longtemps (cf. Rancid et l'exposé de Joe Abley à NANOG et l'annexe A de notre RFC qui liste les solutions existantes), mais, en l'absence d'interface normalisée, c'était assez pénible à programmer et maintenir. Il s'agit donc de standardiser ce qui existe déjà, ce qui ne devrait pas être une tâche insurmontable.
La terminologie utilisée par I2RS est décrite dans un autre RFC, le RFC 7921. Pour le résumer (section 2 du RFC) : le routeur contient un agent I2RS, qui sait parler aux différents composants du routeur (sa base de données indiquant les différents liens connectés, son système de gestion de la configuration, sa base de routes - RIB, etc). Le logiciel qui pilote les changements est le client I2RS. Il y aura sans doute un seul client pour beaucoup d'agents, installé dans le système de gestion du réseau. Entre le client et l'agent, le protocole I2RS, qui sera normalisé dans les futurs RFC du groupe de travail I2RS. A priori, le client sera juste un intermédiaire pour des applications qui piloteront le routage (le but du découplage client/application étant d'éviter que chaque application doive parler I2RS : elles pourront interagir avec le client au-dessus d'un protocole plus classique comme REST).
Pour que le client puisse parler intelligemment à l'agent, il devra avoir en tête un modèle de données décrivant le routeur, ce qu'il sait faire, ce qu'on peut lui demander.
La section 3 de notre RFC présente la nécessité de ce modèle de données. Un tel modèle avait déjà été développé pour le projet ForCES (RFC 3746), en se focalisant sur la transmission, alors que I2RS est surtout intéressé par le routage (le plan de contrôle, accès à la RIB, etc).
Comme le note la section 4, un logiciel qui voudrait vraiment donner des instructions au routeur devrait apprendre la topologie du réseau, quels sont les liens physiques ou virtuels auxquels le routeur est connecté, leur état, etc. C'est évidemment le routeur qui connait le mieux cette information et il est donc nécessaire de lui demander.
L'application aura souvent besoin de connaitre en outre le trafic réellement échangé. IPFIX (RFC 5470) est certainement utilisable pour cela, si l'application peut le configurer dynamiquement.
Enfin, la section 5 rassemble les « points divers ». Elle rappelle qu'I2RS n'impose pas forcément le développement d'un nouveau protocole ; si un protocole, ou un ensemble de protocoles existant(s) suffit, c'est parfait (l'annexe A du RFC propose des pistes en ce sens). Mais la solution doit penser à :
Voici pour le cahier des charges. L'annexe A propose quelques pistes qui vont en ce sens. À l'heure actuelle, l'interface la plus générale des routeurs est la CLI. Elle permet d'apprendre l'état du routeur et de changer sa configuration. Voici un exemple sur un Juniper :
bortzmeyer@MX-1> show interfaces ... Physical interface: ge-1/1/9, Enabled, Physical link is Up Interface index: 177, SNMP ifIndex: 531 Description: To infinity and beyond Link-level type: Ethernet, MTU: 1514, MRU: 1522, Speed: 1000mbps, BPDU Error: None, MAC-REWRITE Error: None, Loopback: Disabled, Source filtering: Disabled, Flow control: Enabled, Auto-negotiation: Enabled, Remote fault: Online Pad to minimum frame size: Disabled Device flags : Present Running Interface flags: SNMP-Traps Internal: 0x0 Link flags : None CoS queues : 8 supported, 8 maximum usable queues Current address: 5c:5e:ab:0e:4b:f1, Hardware address: 5c:5e:ab:0e:4b:f1 Last flapped : 2016-02-12 11:31:56 CET (22w5d 23:10 ago) Input rate : 672 bps (1 pps) Output rate : 672 bps (1 pps) Active alarms : None Active defects : None Interface transmit statistics: Disabled Physical interface: xe-0/0/2, Enabled, Physical link is Up Interface index: 156, SNMP ifIndex: 510 Link-level type: Ethernet, MTU: 1514, MRU: 1522, LAN-PHY mode, Speed: 10Gbps, BPDU Error: None, MAC-REWRITE Error: None, Loopback: None, Source filtering: Disabled, Flow control: Enabled Pad to minimum frame size: Disabled Device flags : Present Running Interface flags: SNMP-Traps Internal: 0x0 Link flags : None CoS queues : 8 supported, 8 maximum usable queues Current address: 5c:5e:ab:0e:4b:72, Hardware address: 5c:5e:ab:0e:4b:72 Last flapped : 2016-07-07 14:28:31 CEST (1w6d 21:11 ago) Input rate : 0 bps (0 pps) Output rate : 0 bps (0 pps) Active alarms : None Active defects : None PCS statistics Seconds Bit errors 0 Errored blocks 1 Interface transmit statistics: Disabled ...
Ce shell n'est pas normalisé : chaque marque de routeur a le sien. Comme l'information retournée n'est pas structurée, si on veut la traiter depuis un programme, il faut faire du scraping, ce qui est pénible et peu gratifiant (d'autant plus que le « format » peut changer sans prévenir lors de la sortie d'une nouvelle version du système d'exploitation du routeur).
Les routeurs ont aussi des interfaces reposant sur un protocole et des données structurées. La plus connue est SNMP. SNMP est très utilisé pour récupérer de l'information (état des interfaces, quantité de trafic qui passe) mais, bien qu'il permette en théorie la configuration des équipements réseau, en pratique, cette possibilité a été très peu utilisée. Les raisons de cette non-utilisation sont nombreuses (complexité, absence de sémantiques avancées comme le regroupement de plusieurs changements dans une « transaction » unique, sur laquelle on peut revenir globalement, etc). SNMP ne semble donc pas envisageable pour I2RS.
Enfin, cette annexe A cite Netconf comme étant sans doute la solution disponible la plus proche, même si elle n'est pas parfaite et aurait besoin d'être complétée (voir les travaux en cours dans le RFC 7921).
Date de publication du RFC : Juillet 2016
Auteur(s) du RFC : H. Tschofenig (ARM), T. Fossati
(Nokia)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF dice
Première rédaction de cet article le 20 juillet 2016
Dans le futur, nous répètent les consultants, il y aura partout dans nos maisons, bureaux et usines, des petits objets électroniques connectés à l'Internet. C'est le fameux Internet des Objets. Ces choses serviront à mesurer le monde et à le modifier et poseront donc des problèmes de sécurité. Par exemple, sans précautions particulières, un capteur dans une usine qui envoie en Wi-Fi les informations qu'il récolte permettrait à un écoutant indiscret, même situé en dehors de l'usine, de surveiller l'activité de celle-ci. Il va donc de soi qu'il faut utiliser de la cryptographie dans ces objets. Mais celle-ci est parfois coûteuse en ressources machine, et ce nouveau RFC propose donc des profils du protocole TLS, limitant les options possibles de façon à économiser les ressources des objets.
Ces objets sont en effet contraints au sens du RFC 7228. Un TLS complet serait trop pour eux. Bien sûr, on pourrait concevoir des protocoles cryptographiques spécialement conçus à leur intention mais il faudrait développer, valider et déboguer ces protocoles et l'expérience de la cryptographie sur l'Internet montre que c'est beaucoup plus difficile que ça n'en a l'air. D'où le choix d'utiliser TLS (RFC 5246), protocole connu et éprouvé.
Notons au passage que, contrairement à ce que dit le RFC, le principal danger que pose l'Internet des Objets ne vient pas forcément d'un tiers inconnu : presque toute la domotique actuelle fonctionne avec le cloud, toutes les données récoltées étant envoyées sur les serveurs du vendeur, qui peut en faire ce qu'il veut. Chiffrer le trafic entre l'objet et ces serveurs ne comble pas cette énorme faille de sécurité.
Les profils de TLS (et de DTLS, son équivalent pour UDP, cf. RFC 6347) spécifiés dans ce RFC peuvent s'appliquer aux communications utilisant CoAP (RFC 7252) comme à celles utilisant d'autres protocoles applicatifs. Ce sont des profils, des restrictions de TLS, et ils n'introduisent donc pas un nouveau protocole, ni même de nouvelles extensions à ces protocoles.
Par exemple (section 4.4), ce RFC impose que, si on authentifie avec un certificat, les certificats X.509 utilisent ECDSA uniquement. (Gérer tous les algorithmes possibles dans un objet contraint serait trop coûteux, par exemple en occupation de la flash.) Au revoir, RSA, donc.
Toujours sur les certificats, le profil abandonne OCSP (RFC 6960) et les CRL (qui ne marchent guère, en pratique) : la révocation des certificats devra se faire uniquement par le biais d'une mise à jour du logiciel de l'objet.
Toujours concernant la cryptographie, ce RFC impose (section
13) de n'utiliser que des suites de chiffrement intègres
(AEAD) comme
TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
(AES
avec CCM,
cf. RFC 7251).
Comme l'utilisation de TLS dans ces objets contraints est récente, il n'y a pas trop à se préoccuper de la base installée. On peut donc décider de ne jamais gérer des trucs trop anciens. C'est ainsi que la version minimale de TLS acceptée dans les profils de ce RFC est la 1.2 (section 18).
Il y a quelques points où ce RFC rend obligatoire des fonctions qui étaient optionnelles dans TLS, parce qu'elles sont cruciales pour des objets contraints. C'est le cas de la reprise de session TLS précédente, qui permet d'éviter de refaire des opérations cryptographiques coûteuses à chaque démarrage. Par contre, certaines fonctions sont déconseillées, comme la compression, coûteuse et sans doute inutile dans l'Internet des Objets où les protocoles sont déjà optimisés pour réduire la taille des données échangées. (En outre, il existe de bonnes raisons de sécurité de couper la compression TLS, RFC 7525, section 3.3.) Idem pour la renégotiation du RFC 5746, qui est exclue.
Un problème courant en cryptographie est celui de la génération de nombres aléatoires (TLS en utilise plusieurs). Il est encore plus aigu dans l'Internet des Objets car ces objets n'ont souvent pas beaucoup de sources d'entropie (section 12 du RFC). Pas de disque dur mobile, pas de clavier, pas de souris dont les mouvements sont partiellement aléatoires. Il y a donc un risque élevé que tous les objets identiques génèrent les mêmes nombres « aléatoires ». Bref, il faut que les développeurs fassent très attention aux conseils du RFC 4086.
Autre manque des objets contraints, celui d'une horloge fiable. Pour des opérations comme la validation de la non-expiration d'un certificat, cela peut être très gênant.
Les objets contraints sont... contraints de bien d'autre façon, comme en puissance du processeur. Cela peut rendre certaines opérations cryptographiques irréalistes en logiciel. La section 19 du RFC donne des conseils sur la mise en œuvre matérielle de ces opérations :
Toujours en cryptographie, la section 20 donne des recommendations sur la longueur des clés. Un point important, et spécifique aux objets, est que les engins déployés restent souvent sur le terrain très longtemps, par exemple dix ans. On ne remplace pas les capteurs, ou l'ordinateur embarqué dans une machine, comme on change d'iPhone ! La longueur des clés doit donc être prévue pour les attaques du futur, pas pour celles d'aujourd'hui.
Les objets dont on parle dans ce RFC sont souvent déployés dans des environnements où les contraintes de vie privée sont fortes. Cela peut être une usine qui ne veut pas que ses processus soient espionnés, ou bien une maison dont les habitants ne veulent pas être surveillés (section 22 du RFC). TLS ne protège pas contre tout et certaines fuites d'information persistent même quand il est utilisé. Elles peuvent venir du protocole TLS lui-même (la reprise de session utilise des informations qui permettent de suivre une machine à la trace) ou bien provenir de métadonnées diverses. Par exemple, s'il existe un capteur de présence qui envoie un message lorsque quelqu'un rentre dans l'appartement, chiffrer ce message ne fait pas gagner grand'chose : une fois qu'un observateur a identifié le capteur de présence, le seul envoi du message suffit à l'informer d'une arrivée. Une vraie protection de la vie privée peut donc nécessiter des méthodes additionnelles comme l'envoi de trafic bidon.
Le RFC se termine en rappelant qu'il est crucial de fournir un mécanisme de mise à jour simple des engins. Les objets de l'Internet des Objets sont souvent de type « je pose et puis j'oublie », sans aucun moyen de mettre à jour leur logiciel. Or, la sécurité peut nécessiter une telle mise à jour, soit pour corriger une bogue dans la bibliothèque TLS, soit pour révoquer des clés et en mettre d'autres. Un exemple d'un mécanisme de mise à jour adapté est LWM2M.
Si vous voulez rire un peu, l'annexe A du RFC précise comment faire tourner DTLS sur... SMS.
Date de publication du RFC : Juin 2016
Auteur(s) du RFC : D. Bryan (Cogent Force), P. Matthews (Alcatel-Lucent), E. Shim (Samsung Electronics), D. Willis (Softarmor Systems), S. Dawkins (Huawei)
Pour information
Réalisé dans le cadre du groupe de travail IETF p2psip
Première rédaction de cet article le 19 juillet 2016
Le mécanisme de signalisation d'appels SIP, largement utilisé pour la téléphonie sur IP, dépend de serveurs stables et connectés en permanence (proxies, registrars, etc), pour la mise en relation des participants. Une solution entièrement pair-à-pair est en cours de développement, P2PSIP (peer to peer SIP). Ce nouveau RFC décrit ses concepts et le vocabulaire qu'elle emploie.
C'est en effet le cœur du problème de toute solution
pair-à-pair sur l'Internet : le
rendez-vous. Comment deux machines pas
toujours allumées, pas toujours connectées, coincées derrière des
équipements qui leur interdisent les connexions entrantes,
peuvent-elles rentrer en relation ? Si Alice appelle Bob via des
téléphones SIP, comment faire sonner la
machine de Bob, bloquée derrière son routeur
NAT ? La solution classique de SIP (RFC 3261) est de d'abord faire correspondre une adresse SIP
(appelée AoR pour Address of Record) avec un ou
plusieurs URI, qui indiquent les machines à
contacter. Ces machines sont des intermédiaires, reliés à
l'Internet en permanence, et qui peuvent donc tout le temps
recevoir le message INVITE
d'établissement de
connexion (cf. RFC 3263). L'idée de base du
SIP pair-à-pair, P2PSIP, est de remplacer ces intermédiaires, ces
relais, par un réseau P2P.
Le mécanisme exact, nommé RELOAD, est spécifié dans le RFC 6940 (notez que le protocole RELOAD peut servir à d'autres applications que SIP). Les machines des utilisateurs s'enregistrent dans une DHT, où les appelants vont trouver le moyen de les contacter. (Par défaut, la DHT utilisée est Chord.)
La section 2 de notre RFC donne une présentation générale de la solution complète. Un réseau pair-à-pair overlay sert à établir la correspondance entre adresses (AoR) et les URI indiquant les moyens de connexion. Ce même réseau sert également à acheminer les messages SIP, si les machines d'Alice et Bob n'arrivent pas à se parler directement (un problème fréquent dans l'Internet ossifié et fermé d'aujourd'hui). Ce réseau overlay de pairs stocke les correspondances, et les duplique sur plusieurs nœuds (comme dans tout réseau pair-à-pair, chaque machine peut faire défection à tout moment). Ce sont les services de base de l'overlay, ceux qui sont absolument indispensables au bon fonctionnement de P2PSIP. Mais certains pairs peuvent accepter de participer à d'autres services, comme un service de répondeur audio, pour les cas où Bob a éteint sa machine (cf. RFC 7374). De même, certains pairs peuvent assurer des services de proxy ou de registrar SIP traditionnel, pour permettre aux clients SIP anciens de se connecter via P2PSIP.
On n'est pas obligé d'être un pair dans ce réseau P2PSIP. Un softphone SIP peut être un simple client, utilisant les services de l'overlay sans y contribuer.
Notez qu'il existe d'autres moyens de faire du SIP sans l'appareil traditionnel des serveurs relais centraux. Ces moyens sont en général limités au réseau local (par exemple les RFC 6762 et RFC 6763).
Le cœur du RFC est sa section 4, qui regroupe les définitions. Je ne vais pas les reprendre ici. La plupart sont classiques dans le monde du pair-à-pair (overlay, peer...). À noter les termes de Node ID (l'identificateur unique d'un pair - RFC 6940, section 4.1) et de peer admission (le mécanisme par lequel on admet un nouveau pair : RELOAD permet un réseau fermé, où il faut montrer patte blanche à un serveur d'inscription avant de rentrer - RFC 6940, section 11.3.)
Première rédaction de cet article le 17 juillet 2016
On répète souvent aux utilisateurs que l'Internet est un lieu dangereux (ce n'est pas faux) et qu'il faut utiliser des logiciels qui les protègent magiquement : anti-virus, logiciels de contrôle parental, etc. Mais ce sont des logiciels, ils ont donc des bogues et ils ne sont pas mieux écrits que la moyenne des logiciels. Leurs bogues peuvent sérieusement affecter la sécurité de la machine. Morale : ajouter du logiciel de sécurité n'améliore pas forcément la sécurité.
Pour ceux qui ne seraient pas convaincus de ces évidences, je recommande très fortement la lecture de l'excellent article « Killed by Proxy: Analyzing Client-end TLS Interception Software ». Les auteurs, Mohammad Mannan et Xavier de Carné-Carnavalet, ont testé en labo un certain nombre de logiciels qui font de l'« interception TLS » et découvert que la plupart ouvraient des boulevards à des attaquants. Qu'est-ce qu'un logiciel d'interception TLS ? C'est un logiciel qui est un relais TLS, entre le logiciel de l'utilisateur (typiquement un navigateur Web) et le vrai serveur. L'intercepteur se fait passer pour le vrai serveur auprès du navigateur Web et pour le client auprès du vrai serveur. Pour ne pas lever d'alerte de sécurité dans le navigateur, il présente un certificat valable. Ce genre de logiciel est donc un détournement délibéré du modèle de sécurité de TLS : il casse la sécurité exprès. Il n'est donc pas étonnant qu'ils ouvrent des failles graves.
Pour comprendre ces failles, un petit mot sur le fonctionnement des ces logiciels : ils tournent sur la machine de l'utilisateur (contrairement aux relais TLS que les grandes entreprises et les administrations installent souvent près de l'accès Internet, pour surveiller les malwares et espionner les employés), ils détournent le trafic TLS (typiquement HTTPS) et ils présentent un certificat valable pour le nom de domaine demandé. Ce certificat a pu être généré en usine ou bien à l'installation du logiciel. Ce certificat est parfois protégé par une phrase de passe. Pour que le certificat soit accepté, ils mettent leur propre AC dans le magasin du système, avec une période de validité allant jusqu'à 20 ans. (En général, ils n'expliquent pas clairement à l'utilisateur ce qu'ils font, ce qui augmente encore le danger.) Le logiciel d'interception reçoit les connexions locales, venant du navigateur Web, et se connecte lui-même aux vrais serveurs distants. Ces logiciels sont presque toujours privateurs, aucun accès au code source (bien que tous utilisent, sans honte, un logiciel libre, OpenSSL), aucun moyen de les vérifier.
La totalité des logiciels testés par les auteurs a au moins une faille TLS. Inutile donc de chercher le « bon antivirus » ou le « bon logiciel de contrôle parental ». Voici une liste non limitative de ces failles :
Pourquoi les sociétés qui écrivent ces logiciels feraient des efforts pour la sécurité ? Leurs utilisateurs ne sont pas des connaisseurs, des tas de gens auto-proclamés experts en sécurité servent de vendeurs pour ces logiciels en répétant aux utilisateurs « pensez à installer un anti-virus » et la non-disponibilité du code source rend difficile toute analyse de ces logiciels.
Date de publication du RFC : Juin 2016
Auteur(s) du RFC : A. Langley (Google), W. Chang
(Google), N. Mavrogiannopoulos (Red
Hat), J. Strombergson (Secworks
Sweden), S. Josefsson (SJD)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF tls
Première rédaction de cet article le 8 juillet 2016
Ce court RFC ajoute les algorithmes de cryptographie ChaCha20 et Poly1305 à la liste de ceux utilisables dans le protocole TLS.
ChaCha20 (dérivé de l'ancien Salsa20) est un algorithme de chiffrement symétrique et Poly1305 un authentificateur. Tous les deux ont été conçus par Dan Bernstein et sont décrits dans le RFC 8439. (Ce nouveau RFC ne fait que de les adapter à leur usage dans le cas spécifique de TLS.) ChaCha a été utilisé dans BLAKE, la version de ce RFC, ChaCha20 doit son nom au fait qu'il exécute 20 tours (rounds). Quant à Poly1305, c'est un authentificateur de Wegman-Carter. Que fait un authentificateur ? Il prend une clé, un message et fabrique une étiquette. Un attaquant n'a qu'une probabilité infime de produire une étiquette valide.
Les deux algorithmes ont été conçus en pensant surtout à une mise en œuvre en logiciel (AES restant sans doute plus rapide quand on peut utiliser du matériel spécialisé. On trouve des mesures de performance dans cet article de Google ou cet article de Cloudflare.)
Les algorithmes potentiellement concurrents ont des faiblesses : risques de sécurité pour AES-CBC ou RC4 (cf. RFC 7465), problèmes de performance pour les autres algorithmes AEAD comme AES-GCM. Comme RC4, ChaCha20 est un algorithme à flot continu, mais il n'a pas ses failles de sécurité.
Pour le cas de TLS (section 2 du RFC), ChaCha20 et Poly1305
sont utilisés ensemble, pour former un algorithme
AEAD (RFC 5116). Son identifiant TLS
est AEAD_CHACHA20_POLY1305
et il peut
s'utiliser avec les différents algorithmes d'authentification
utilisés dans TLS. Par exemple, on peut avoir une session TLS dont
la cipher suite est
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
ce qui veut dire :
Ces identifiants ont été ajoutés dans le registre IANA pour TLS.
Quel est le niveau de sécurité du nouvel algorithme ? Son prédécesseur Salsa20 a bénéficié d'analyses de sécurité sérieuses (Salsa20 security et The eSTREAM Portfolio). ChaCha20 traite les failles connues de Salsa. Et il était utilisé dans un des finalistes du concours SHA-3, ce qui lui a valu d'autres examens de près.
Si, en plus de ChaCha20 et Poly1305, on utilise Curve25519 pour la cryptographie asymétrique, on aura une cryptographie tout-Bernstein, ce qui peut aussi amener à se poser des questions.
Et les mises en œuvre ? ChaCha20 est dans OpenSSL depuis la version 1.1.0 (pas encore officiellement publiée, et qui semble encore peu répandue) et dans GnuTLS depuis la 3.4.0. Il existe une liste apparemment à jour des mises en œuvre.
Date de publication du RFC : Juin 2016
Auteur(s) du RFC : K. Sriram, D. Montgomery (US NIST), D. McPherson, E. Osterweil (Verisign), B. Dickson
Pour information
Réalisé dans le cadre du groupe de travail IETF grow
Première rédaction de cet article le 8 juillet 2016
Il est bien connu que le protocole de routage BGP connait fréquemment des « fuites de route » (route leaks). Les forums où les opérateurs discutent sont plein de discussions et d'alertes sur la dernière fuite en cours, il existe un compte Twitter dédié pour les alertes automatiques de fuites, le rapport sur la résilience de l'Internet en France en parle longuement. Bref, le sujet est bien connu. Curieusement, il n'y a pas de définition simple et consensuelle de ce qu'est une fuite. Il en existe en fait plusieurs sortes, et ce nouveau RFC tente de faire le point et de définir rigoureusement les différents types de fuite.
La fuite est en effet un sérieux problème : des routeurs vont recevoir des routes incorrectes et, s'ils les acceptent, le routage normal peut être perturbé, menant à des pannes, ou à du tromboning (paquets IP routés par un chemin bien plus long que l'optimum).
La liste des incidents de routage médiatiquement connus est longue : le détournement de YouTube par Pakistan Telecom, la fuite venue de Malaisie, et bien d'autres décrites dans l'abondante bibliographie de notre RFC (cf. section 1 du RFC). L'IETF travaille depuis longtemps à des solutions techniques à ce problème (notamment via son groupe de travail SIDR) mais, pour résoudre un problème, il vaut mieux bien le comprendre. C'est le travail de ce nouveau RFC, qui tente une taxonomie des fuites.
Donc, d'abord, une (tentative de) définition (section 2 du RFC). Une fuite est la propagation de l'annonce d'une route au-delà de la portée prévue. Ce n'est donc pas la seule annonce qui est le problème, c'est sa propagation. Si le Pakistan veut annoncer les routes de YouTube dans le pays, à des fins de censure, ce n'est pas une fuite de route, mais un détournement délibéré (comme celui de Google Public DNS en Turquie). La fuite a commencé quand Pakistan Telecom a bêtement laissé se propager cette annonce au monde entier.
La définition s'appuie donc sur une politique de routage qui définit « ce qui est prévu ». La politique de routage est décidée par chaque acteur (l'Internet n'a pas de Chef, chacun est maître de sa politique) et mise en œuvre dans la configuration des routeurs, sous forme de règles disant ce qui est accepté et ce qui est refusé. Si les opérateurs ne commettaient jamais d'erreurs, on pourrait dire que ces règles suffiraient à décrire la politique de routage. Mais ils en commettent (par exemple, le transitaire de Pakistan Telecom aurait dû n'accepter de son client qu'un ensemble fini de routes, celles correspondant aux préfixes alloués à Pakistan Telecom et à ses clients). Une fuite de route est donc l'équivalent pour les opérateurs réseau de ce qu'est une bogue pour les programmeurs : « ce n'est pas ce que je voulais, mais c'est ce que j'ai dit ».
La définition de la politique de routage dépend des relations entre acteurs (on n'accepte pas la même chose d'un client, d'un transitaire, d'un pair...) Le RFC cite (section 2) plusieurs études expliquant ces relations compliquées.
Au fait, on a supposé que les « fuites de routes » étaient mauvaises et qu'il fallait les combattre. Mais pourquoi ? Parce qu'elles peuvent mener à des pannes (la route annoncée à tort ne fonctionne pas) ou à des chemins sous-optimaux (un long détour). Cela concerne les fuites accidentelles, de loin les plus nombreuses (il y a davantage de maladroits que de malveillants). Mais il y a aussi des fuites délibérées, provoquées pour faire une attaque par déni de service, ou bien pour forcer le trafic à passer en un point où il pourra être plus facilement surveillé.
C'est pour cela que les gens qui ne chiffrent pas leurs communications avec des arguments du genre « non, mais ça ne sort pas du pays, de toute façon », ont gravement tort. La vulnérabilité du routage fait que leur trafic peut soudainement partir bien plus loin.
Voyons maintenant la classification des fuites (section 3). Le RFC les classe en différents types, identifiés par un numéro. Le type 1 est « virage en épingle à cheveux avec un préfixe complet ». C'est ce qui se produit quand un AS de bordure apprend un préfixe d'un de ses transitaires et le ré-annonce à un autre transitaire (d'où l'épingle à cheveux). Le second transitaire, s'il ne filtre pas les préfixes que peut annoncer son client, risque fort d'accepter la route (préférence donnée aux routes des clients sur celles des fournisseurs) et le trafic sera donc envoyé à l'AS de bordure (qui pourra ou pas le gérer). Ce fut le cas de l'incident Dodo, ainsi que de la fuite en Malaisie citée plus haut.
Le type 2, lui, est « fuite latérale ». Un acteur reçoit une route d'un pair et la transmet à un autre pair. (Voir la conférence de Jared Mauch à NANOG, où il observe qu'il n'est pas facile de détecter automatiquement ces fuites, car les relations entre acteurs peuvent être compliquées.)
L'incident de type 3, lui, se produit lorsque un AS apprend d'un transitaire des routes qu'il annonce à son pair (normalement, on n'annonce à un pair que ses routes à soi). L'exposé de Mauch en cite également des exemples.
Le type 4 est l'inverse : un pair laisse fuir les préfixes d'un pair vers un transitaire. Ce fut le cas de l'incident Moratel contre Google, ou d'un problème frappant Amazon.
Le type 5 se nomme « ré-origination ». L'AS maladroit annonce les routes comme si elles venaient de lui, et c'est son numéro d'AS qui apparait comme origine (le début du chemin d'AS). Ce fut le cas lors de grande fuite chinoise de 2010, ou pendant le curieux détournement islando-biélorusse (un des rares cas où le shunt semblait volontaire).
Le type 6 est la « fuite de préfixes plus spécifiques ». Un AS typique annonce dans son IGP des préfixes bien plus spécifiques que ce qu'il annonce publiquement, afin de contrôler plus finement le routage interne. Une erreur (redistribution de l'IGP dans l'EGP...) et paf, les préfixes spécifiques fuient. Étant plus spécifiques que le préfixe « normal », ils seront préférés lors de la transmission des paquets. Le cas le plus spectaculaire fut celui de l'AS 701.
Le RFC ne discute pas des solutions possibles, ce n'est pas son but. Les curieux pourront regarder du côté des systèmes d'alerte ou de RPKI/ROA.
Première rédaction de cet article le 7 juillet 2016
Le 21 juin, dans les locaux de Radio France, j'ai eu le plaisir de parler aux employés de la direction du numérique sur le thème « Libertés dans le numérique, un Internet favorable ou défavorable aux droits de l'homme ? » Cette conférence était largement inspirée des travaux du groupe de recherche HRPC (Human Rights [and] Protocol Considerations).
La présentation était :
Lawrence Lessig est fameux pour sa phrase « code is law » qui rappelait l'importance des infrastructures dans les possibilités offertes aux citoyens. Si on a le droit de se déplacer librement mais qu'il n'y a pas de transports en commun et que les voitures sont hors de prix, que vaut ce droit ?
De même, dans le monde numérique, les techniques effectivement disponibles encouragent les droits de l'homme ou au contraire les limitent. Par exemple, certains composants de l'Internet rendent trop facile la censure.
On explorera ces caractéristiques de l'Internet, et on discutera de comment elles pourraient être modifiées.
Voici les supports de l'exposé :
Et la vidéo est maintenant disponible.
Merci à Maziar Dowlatabadi et Nadia Nwafo pour l'idée, et l'organisation.
Date de publication du RFC : Juin 2016
Auteur(s) du RFC : F. Gont (SI6 Networks /
UTN-FRH), J. Linkova
(Google), T. Chown (University of
Southampton), W. Liu (Huawei)
Pour information
Réalisé dans le cadre du groupe de travail IETF v6ops
Première rédaction de cet article le 5 juillet 2016
Normalement, l'Internet est un monde idéal où la machine d'Alice peut envoyer à celle de Bob les paquets qu'elle veut, Bob les recevra intacts (s'il le veut). Dans la réalité, pas mal de machines intermédiaires ne respectent pas ce principe de bout en bout. Il est fréquent que les paquets « inhabituels » soient jetés en route. Cela peut être le résultat d'une politique délibérée (pare-feu appliquant le principe « dans le doute, on jette ») ou bien, souvent, de l'incompétence des programmeurs qui n'ont pas lu les RFC et ne connaissent pas telle ou telle option. Par exemple, IPv6 permet d'ajouter au paquet, entre l'en-tête proprement dit et la charge utile du paquet, un ou plusieurs en-têtes d'extension. C'est rare en pratique. Est-ce que les programmeurs des middleboxes ont fait attention à cette possibilité ? Les paquets ayant ces en-têtes d'extension ont-ils de bonne chances d'arriver au but ? Ce nouveau RFC est un compte-rendu de mesures effectuées dans l'Internet pour essayer de quantifier l'ampleur exacte du problème.
Un point important du travail effectué par les auteurs du RFC
est qu'ils ne sont pas contentés de chercher
si les paquets étaient jetés mais également
où ils étaient jetés. La différence est
politiquement cruciale. Si le paquet IPv6
portant un en-tête d'extension est jeté par la machine de Bob, car
Bob n'aime pas ces en-têtes et il a configuré son
Netfilter pour les envoyer vers
DROP
, pas de problème : Bob est libre
d'accepter ou de refuser ce qu'il veut. Si, par contre, le paquet
a été jeté par le FAI d'Alice ou de Bob,
ou, encore pire, par un opérateur de transit entre les deux FAI,
c'est grave, c'est une violation de la neutralité du réseau,
violation qui empêche deux adultes consentants de s'envoyer les
paquets qu'ils veulent. Le mécanisme de mesure cherche donc à
trouver dans quel AS le paquet a
disparu.
Les mesures ont été faites en août 2014 et juin 2015. Le RFC détaille suffisamment la façon dont elles ont été faites (annexe A) pour qu'une autre équipe puisse recommencer les mesures à une date ultérieure, pour voir si la situation s'améliore.
Les en-têtes d'extension IPv6 sont décrits dans le RFC 2460, section 4. Ils sont de deux plusieurs sortes, entre autre :
Outre la fragmentation, un exemple d'utilisation de ces en-têtes est le protocole CONEX (RFC 7837). Si vous voulez ajouter des options pour la destination dans un paquet IPv6, vous pouvez regarder mon tutoriel.
Quelles sont les chances de survie des paquets portant ces en-têtes d'extension dans le sauvage Internet ? Des études comme « Discovering Path MTU black holes on the Internet using RIPE Atlas », « Fragmentation and Extension header Support in the IPv6 Internet » ou bien « IPv6 Extension Headers in the Real World v2.0 » s'étaient déjà penchées sur la question. Les mesures de ce RFC détaillent et complètent ces résultats préliminaires, notamment sur la différenciation entre perte de paquet près de la destination, et perte du paquet en transit. La conclusion est, qu'hélas, les paquets IPv6 portant des en-têtes d'extension font effectivement l'objet d'une discrimination négative (« entêtophobie » ?).
Donc, qu'est-ce que ça donne dans l'Internet réel (section 2) ?
Deux listes de serveurs IPv6 ont été utilisées, celle du
World IPv6
Launch Day et le premier million d'Alexa. De ces listes de
domaines ont été extraits les adresses IP des sites Web
(dig AAAA LE-DOMAINE
et, oui, je sais que
c'est un sérieux raccourci de supposer que tout domaine a un
serveur Web à l'apex), des relais de
messagerie (dig MX LE-DOMAINE
puis obtenir
l'adresse IPv6 des serveurs), et des serveurs de noms
(dig NS LE-DOMAINE
). Les adresses absurdes (::1
...)
ont été retirées. Ensuite, pour chaque adresse ainsi obtenue,
trois types de paquets ont été envoyés :
Les paquets étaient tous du TCP à destination d'un port correspondant au service (25 pour les serveurs de messagerie, par exemple).
Un point très important et original de cette expérience était la recherche d'information sur où se produisait l'éventuelle perte de paquets (dans quel AS). L'hypothèse de base est qu'une élimination du paquet dans l'AS de destination peut être acceptable, parce qu'elle résulte d'une décision consciente du destinataire. En tout cas, il sera plus facile de changer la politique de l'AS de destination. En revanche, une élimination dans un AS intermédiaire est inacceptable : elle indique filtrage ou erreur de configuration dans un réseau qui devrait être neutre. Notez que l'hypothèse n'est pas parfaite : si un particulier héberge un serveur chez lui et que son FAI filtre les paquets IPv6 avec en-tête d'extension, c'est quand même inacceptable, et c'est difficile pour le particulier de le faire corriger.
Comment identifier l'AS qui jette le paquet ? L'idée est de faire l'équivalent d'un traceroute (en fait, deux, un avec l'en-tête de destination et un sans, pour comparer : cf. annexe B.1) et de voir quel est le dernier routeur qui a répondu. C'est loin d'être idéal. Des routeurs ne répondent pas, pour d'autres, il est difficile d'évaluer à quel AS ils appartiennent (dans un lien de peering entre deux acteurs A et B, les adresses IP utilisées ont pu être fournies par A ou bien par B ; cf. annexe B.2). Et l'absence d'un routeur dans le résultat de traceroute ne prouve pas que le routeur n'a pas transmis le paquet juste avant. La mesure indique donc deux cas, l'optimiste, où on suppose, en l'absence de preuve opposée, que les paquets manquant ont été jetés par l'AS de destination et le pessimiste où on fait la supposition inverse.
Les résultats complets des mesures figurent dans le RFC. Je résume ici une partie. Pour les serveurs Web de la liste du World IPv6 Launch Day :
Les résultats ne sont guère différents pour les autres services (comme SMTP), indiquant que le problème, quand il est présent, est bien dans la couche 3. Idem avec le jeu de données Alexa : peu de différences.
On voit que les paquets utilisant l'en-tête d'extension « Options pour chaque intermédiaire » sont ceux qui s'en tirent le plus mal (c'est un peu logique, cet en-tête étant censé être examiné par tous les routeurs intermédiaires). Les fragments passent assez mal également. Enfin, on note qu'un pourcentage significatif des paquets sont jetés par un AS de transit, qui viole ainsi massivement le principe de bout en bout. Triste état de l'Internet actuel, pourri de middleboxes qui se permettent tout.
Si vous voulez refaire l'expérience vous-même, pour contrôler
les résultats, ou bien pour mesurer l'évolution dans quelque
temps, l'annexe A vous donne les éléments nécessaires. Vous aurez
besoin du toolkit de
SI6. Les données d'Alexa sont disponibles
en ligne. L'outil
script6
dans le toolkit
SI6 permet d'obtenir les adresses IP nécessaires. Par exemple :
% cat top-1m.txt | script6 get-mx | script6 get-aaaa
Et on obtient ainsi les adresses IP des relais de messagerie. Pour
supprimer les adresses incorrectes (par exemple
::1
), on utilise l'outil
addr6
du toolkit :
% cat top-1m-mail-aaaa.txt | addr6 -i -q -B multicast -B unspec -k global
Il n'y a plus maintenant qu'à envoyer les paquets portant les en-têtes d'extension, ou fragmentés. Ici, les serveurs de messagerie avec l'en-tête Destination Options (« do8 ») :
% cat top-1m-mail-aaaa-unique.txt | script6 trace6 do8 tcp 25
L'annexe B de notre RFC contient quelques avertissements méthodologiques.
Un
traceroute ordinaire ne suffit pas à faire
les mesures décrites plus haut pour identifier le routeur
responsable d'une perte de paquet (le traceroute ordinaire ne
permet pas d'ajouter l'en-tête d'extension aux paquets utilisés). Il faut utiliser un outil
spécial comme le path6
du
toolkit SI6. Encore plus simple, dans le même
paquetage, l'outil blackhole6
. Voyons d'abord
path6
pour comprendre les détails :
% sudo path6 -d yeti.ipv6.ernet.in Tracing path to yeti.ipv6.ernet.in (2001:e30:1c1e:1::333)... 1 (2001:4b98:dc0:41::250) 1.1 ms 0.5 ms 0.4 ms 2 (2001:4b98:1f::c3d3:249) 1.2 ms 3.5 ms 3.4 ms 3 (2001:7f8:54::173) 1.1 ms 0.8 ms 0.6 ms 4 (2001:1a00:1:cafe::e) 141.3 ms 140.7 ms 140.6 ms 5 (2001:1a00:1:cafe::145) 118.8 ms 118.8 ms 119.5 ms 6 (2001:1a00:1:cafe::141) 140.7 ms 137.2 ms 137.3 ms 7 (2001:1a00:1:cafe::10b) 144.0 ms 144.3 ms 144.1 ms 8 (2001:1a00:1:cafe::212) 140.5 ms 140.5 ms 140.5 ms 9 (2001:1a00:1:cafe::207) 137.0 ms 137.0 ms 136.9 ms 10 (2001:1a00:acca:101f::2) 136.5 ms 136.4 ms 136.5 ms 11 (2001:4528:ffff:ff04::1) 152.2 ms 152.1 ms 152.2 ms 12 (2001:4528:fff:c48::1) 163.6 ms 163.7 ms 163.6 ms 13 (2001:e30:1c1e::1) 162.6 ms 162.3 ms 162.2 ms 14 (2001:e30:1c1e:1::333) 174.5 ms 175.1 ms 175.2 ms
OK, on arrive à joindre la machine en Inde. Maintenant, ajoutons l'en-tête Hop-by-Hop Options :
% sudo path6 --hbh-opt-hdr 8 -d yeti.ipv6.ernet.in Tracing path to yeti.ipv6.ernet.in (2001:e30:1c1e:1::333)... 1 (2001:4b98:dc0:41::250) 20.9 ms 20.0 ms 19.0 ms 2 (2001:4b98:1f::c3d3:249) 20.8 ms 20.2 ms 18.5 ms 3 (2001:4b98:1f::c3c4:3) 20.7 ms 20.4 ms 18.5 ms 4 (2001:1a00:1:cafe::e) 154.3 ms 14.4 ms 152.1 ms 5 (2001:1a00:1:cafe::e) 151.0 ms 129.6 ms 148.9 ms 6 (2001:1a00:1:cafe::141) 151.2 ms 126.2 ms 148.8 ms 7 (2001:1a00:1:cafe::141) 156.5 ms 156.8 ms 158.6 ms 8 (2001:1a00:1:cafe::212) 153.6 ms 191.2 ms 151.4 ms 9 (2001:1a00:1:cafe::212) 155.3 ms 151.1 ms 157.7 ms 10 (2001:1a00:1:cafe::207) * 155.619995 ms * 11 () * * * 12 () * * * 13 () * * * ...
Aïe, ça n'arrive plus. Le routeur situé après
2001:1a00:1:cafe::207
a jeté le paquet. En
comparant les deux path6
, on peut voir que le
coupable est 2001:1a00:acca:101f::2
(Flag, désormais une marque de Reliance). L'outil
blackhole6
fait tout ce travail
automatiquement (EH = Extension Header, HBH 8 =
Hop-by-Hop, size 8) :
% sudo blackhole6 yeti.ipv6.ernet.in hbh8 SI6 Networks IPv6 Toolkit v2.0 (Guille) blackhole6: A tool to find IPv6 blackholes Tracing yeti.ipv6.ernet.in (2001:e30:1c1e:1::333)... Dst. IPv6 address: 2001:e30:1c1e:1::333 (AS2697 - ERX-ERNET-AS Education and Research Network, IN) Last node (no EHs): 2001:e30:1c1e:1::333 (AS2697 - ERX-ERNET-AS Education and Research Network, IN) (14 hop(s)) Last node (HBH 8): 2001:1a00:1:cafe::207 (AS15412 - FLAG-AS Flag Telecom Global Internet AS, GB) (10 hop(s)) Dropping node: 2001:1a00:acca:101f::2 (AS15412 - FLAG-AS Flag Telecom Global Internet AS, GB || AS Unknown - Unknown)
Sur ce sujet et ces tests, on peut aussi regarder l'exposé de Mehdi Kouhen au symposium Polytechnique/Cisco, ou bien celui d'Eric Vyncke à Protosec à Buenos Aires.
Première rédaction de cet article le 4 juillet 2016
Dernière mise à jour le 6 juillet 2016
Le 2 juillet, au festival Pas Sage en Seine / Hacker Space Festival, j'ai eu le plaisir de faire un exposé sur la chaîne de blocs Ethereum, plus précisement sur l'écriture de programmes (on dit parfois contrats) Ethereum. Cet exposé s'adresse donc surtout aux programmeurs.
Voici les supports de l'exposé :
Il y aussi la vidéo en ligne.
Les deux contrats présentés à Pas Sage En Seine, Soleau et FindByHash, ont été installés
sur la chaîne de blocs. Sur la chaîne de
tests « Morden », Soleau est installé en 0x165180498e843c5119d7d57b866da1392b8e8185
et FindByHash en 0x78db9a1dfe1b46c4361ac91cda111f5366ddc0e5
.
Sur la « vraie » chaîne,
Soleau est en 0x39aa4006ee5941c0c0e41b924fdafcb2c4c918e8
et FindByHash en 0x9b6e416ea0d89a09b4ae036a774b1d31825252f8
. Si
vous voulez interagir avec ces contrats, voici
l'ABI de Soleau :
[{"constant":true,"inputs":[{"name":"hash","type":"string"}],"name":"get","outputs":[{"name":"success","type":"bool"},{"name":"theBlock","type":"uint256"},{"name":"theTime","type":"uint256"},{"name":"holder","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"hash","type":"string"}],"name":"record","outputs":[{"name":"success","type":"bool"},{"name":"already","type":"bool"},{"name":"theBlock","type":"uint256"}],"type":"function"}]
Et celle de FindByHash :
[{"constant":true,"inputs":[{"name":"key","type":"string"},{"name":"index","type":"uint256"}],"name":"get","outputs":[{"name":"","type":"bool"},{"name":"","type":"string"}],"type":"function"},{"constant":true,"inputs":[{"name":"key","type":"string"}],"name":"num_of","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"key","type":"string"},{"name":"value","type":"string"}],"name":"set","outputs":[{"name":"","type":"bool"}],"type":"function"},{"inputs":[],"type":"constructor"}]
Ça s'utilise comment ? Prenons l'exemple de Soleau sur la chaîne de test. Si on utilise le logiciel geth, avec sa console JavaScript, on déclare le contrat et on indique l'adresse :
soleauC = eth.contract([{"constant":true,"inputs":[{"name":"hash","type":"string"}],"name":"get","outputs":[{"name":"success","type":"bool"},{"name":"theBlock","type":"uint256"},{"name":"theTime","type":"uint256"},{"name":"holder","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"hash","type":"string"}],"name":"record","outputs":[{"name":"success","type":"bool"},{"name":"already","type":"bool"},{"name":"theBlock","type":"uint256"}],"type":"function"}]) soleau = soleauC.at("0x165180498e843c5119d7d57b866da1392b8e8185")
Une fois que c'est fait, on peut appeler l'ABI du contrat. Ici, on demande si un condensat est bien stocké dans la chaîne :
> soleau.get("98461ec184a39f0b8d89401a2756ffc84c2473a772655b425d794db6e7b68a8a") [true, 1211232, 1467041583, "0xaf8e19438e05c68cbdafe33ff15a439ce6742972"] > soleau.get("666") [false, 0, 0, "0x0000000000000000000000000000000000000000"]
Sur la chaîne principale, le même contrat a une valeur
5e1e7a61931acb3f0e2bb80fc1d88e242d8556e6
stockée :
> soleau.get("5e1e7a61931acb3f0e2bb80fc1d88e242d8556e6") [true, 1830809, 1467745954, "0xc90cd1fa9940a4d4a07a37c53bb4f423fd286945"]
On peut aussi ajouter des valeurs (ici, sur la chaîne de test). Comme cela change l'état de la chaîne, il faut faire une transaction, et payer, à la fois l'essence (ici, 400000 unités mais moins de 100000 seront effectivement utilisées) et le prix prévu dans le contrat :
> soleau.record.sendTransaction("d479b91d7a2cdd21f605c5632344228dd5f75d66", {from: eth.accounts[0], gas: 400000, value: web3.toWei(0.001)}) "0xfb6bc725e303c79c2c5426c3a0d4fce90b635521826e5bd3e94ddfa3d80c48da"
Le résultat est l'identificateur de la transaction, que vous pouvez
regarder
en ligne (avec le bouton Convert to ASCII,
vous verrez le condensat enregistré, dans les données de la transaction). Sur la chaîne principale, un exemple de transaction
de ce contrat est disponible
ici.
Pour le contrat FindByHash, si vous voulez regarder des valeurs
enregistrées, il y a
cf4163b8f4c13b915e246ea7d2792156
sur la chaîne de
tests et
3d10dcb5e503d3b8abc2fa5a72adb0a503930e0b6b8a893f17dda63b9b717dba
sur la chaîne principale :
> findhash.num_of("cf4163b8f4c13b915e246ea7d2792156") 2 > findhash.get("cf4163b8f4c13b915e246ea7d2792156", 0) [true, "https://localhost/"] > findhash.get("cf4163b8f4c13b915e246ea7d2792156", 1) [true, "https://www.bortzmeyer.org/toto"]
Pour enregistrer des URL dans ce contrat, le plus simple est ce petit script shell, qui s'utilise ainsi :
% findbyhash-register-url.sh http://www.bortzmeyer.org/pas-sage-en-seine-ethereum.html ... "0x82a808828a115547b242f335783bf75a0c96d2d746ab9dff160898a8f28a5411" 3d10dcb5e503d3b8abc2fa5a72adb0a503930e0b6b8a893f17dda63b9b717dba registered for http://www.bortzmeyer.org/pas-sage-en-seine-ethereum.html
(Et vous pouvez voir la transaction en ligne.)
Si le sujet vous intéresse, j'en parlais plus longuement à la Journée du Conseil Scientifique de l'AFNIC le 11 juillet (avec d'autres exemples de code, rassurez-vous).
Il y avait plein d'autres trucs géniaux à PSESHSF, n'hésitez pas à regarder le programme. Mes préférés (c'est complètement subjectif), faire son pain soi-même (et avec du levain), les explications (avec démo de diffuseur d'odeurs et bonbons qui sentent bon) sur le marketing sensoriel, le projet pour un camp de hackers en été en France, la conférence sur l'éducation au numérique (qui ne sortira sans doute pas en vidéo, l'auteur étant mineur), même si sa seconde partie, sur l'éducation au business a suscité (à juste titre), des réactions houleuses, la reprise de contrôle de l'alimentation, le système d'exploitation Qubes (j'avais parlé de ce système sur ce blog mais sans le tester), la bière libre (j'ai goûté ; un peu forte), l'appel aux citoyens à participer à la science, la synthèse du récent virage de la Quadrature du Net, le bilan de la loi Renseignement, etc.
Date de publication du RFC : Juin 2016
Auteur(s) du RFC : G. Lozano (ICANN)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF eppext
Première rédaction de cet article le 28 juin 2016
Les registres de noms de domaine ont parfois des règles d'enregistrement spéciales, pendant une période limitée, lorsqu'on ouvre un nouveau TLD, ou si on change radicalement ses règles d'enregistrement. Ces règles spéciales pour les périodes de « lever de soleil » (sunrise, lorsque le nouveau TLD est créé) servent en général à favoriser les détenteurs de marques ou autres titres de propriété intellectuelle. L'idée est que, pendant le lever de soleil, seuls ces détenteurs aient le privilège d'enregistrer un nom, les autres attendront. Pour que le registre puisse facilement vérifier la possession d'une marque déposée, il faut un format standard pour les décrire, et c'est ce que contient ce RFC. Il a été écrit par un employé de l'ICANN car il vise surtout un service de l'ICANN, la TMCH (Trade Mark Clearing House).
La TMCH est un registre de marques créé par l'ICANN (voir sa
description
officielle). Il a
suscité d'innombrables débats (par exemple, de quel droit l'ICANN crée un
registre mondial faisant autorité, excluant les marques qui n'ont
pas voulu passer par ce processus ?) mais ce RFC ne concerne que la
partie technique, le format de description de ces marques. Il
s'applique a priori aux TLD ICANN comme
.pizza
ou .maif
mais les
autres sont libres de s'en servir également. Comme les objets
décrits dans ce RFC peuvent être signés, il faut avoir une
PKI. Dans le cas des TLD ICANN, elle est
décrite dans le document officiel cité plus haut. Les objets
eux-mêmes sont décrits en XML, pour pouvoir
être utilisés dans le protocole EPP (RFC 5730).
Les objets sont dans les espaces de noms
urn:ietf:params:xml:ns:mark-1.0
(abrégé en
mark:
dans ce RFC) et
urn:ietf:params:xml:ns:signedMark-1.0
(abrégé
en smd:
dans ce RFC).
Les objets XML décrivant les marques incluent des informations
sur les personnes ou entités qui gèrent les marques. Il y a ainsi
des <mark:holder>
et des
<mark:contact>
, qui comprennent des
éléments classiques : nom, adresse postale (qui comprend elle-même
ville, pays...), adresse de courrier
électronique, etc.
Les marques sont décrites par un élément
<mark:mark>
. Celui-ci contient le nom
de la marque, des
références au registre initial (par exemple, en France,
l'INPI), le contact et le titulaire
(décrits au paragraphe précédent) et d'autres informations utiles
aux juristes (comme les biens et services couverts par cette
marque, puisque les marques, contrairement aux noms de domaine,
sont normalement spécifiques).
Les objets décrivant une marque peuvent être signés, grâce à XML Signature. Voici un exemple (très simplifié, voir la section 2.3 du RFC pour le XML complet) d'une marque avec sa signature :
<?xml version="1.0" encoding="UTF-8"?> <smd:signedMark xmlns:smd="urn:ietf:params:xml:ns:signedMark-1.0" id="smd1"> <smd:issuerInfo issuerID="65535"> <smd:org>ICANN TMCH TESTING TMV</smd:org> <smd:email>notavailable@example.com</smd:email> ... </smd:issuerInfo> <mark:mark xmlns:mark="urn:ietf:params:xml:ns:mark-1.0"> <mark:trademark> <mark:id>00052013734689731373468973-65535</mark:id> <mark:markName>Test & Validate</mark:markName> <mark:holder entitlement="owner"> <mark:org>Ag corporation</mark:org> ... <mark:jurisdiction>US</mark:jurisdiction> <mark:class>15</mark:class> <mark:label>testandvalidate</mark:label> ... <mark:regNum>1234</mark:regNum> <mark:regDate>2012-12-31T23:00:00.000Z</mark:regDate> </mark:trademark> </mark:mark> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> ... <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> ... <SignatureValue> jMu4PfyQGiJBF0GWSEPFCJjmywCEqR2h4LD+ge6XQ+JnmKFFCuCZS/3SLKAx0L1w ... </Signature> </smd:signedMark>
L'élement XML peut aussi être intégralement encodé en
Base64 (RFC 4648), et
ça sera alors un <smd:encodedSignedMark>
.
La syntaxe exacte est spécifiée dans la section 3 du RFC, avec le langage W3C Schema.
Quelles sont les mises en œuvre de ce format ? Le kit de
développement logiciel de Verisign
l'intègre (il est disponible
en ligne), et c'est aussi le cas de Net::DRI (dans
Net::DRI::Protocol::EPP::Extensions::ICANN::MarkSignedMark
,
ouf). Côté serveur, le serveur
EPP de Verisign pour des TLD comme
.com
. D'autres
serveurs EPP peuvent utiliser ce format comme REngin, ou celui d'Uniregistry.
Date de publication du RFC : Juin 2016
Auteur(s) du RFC : J. Scudder (Juniper
Networks), R. Fernando
(Cisco), S. Stuart (Google)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF grow
Première rédaction de cet article le 28 juin 2016
Ce nouveau protocole BMP
(BGP Monitoring
Protocol) va faciliter le travail des administrateurs
réseaux qui font du BGP. Il permet d'obtenir sous une forme
structurée les tables BGP. Avant, la solution la plus répandue
était d'utiliser l'interface en ligne de
commande du routeur (show ip bgp
routes
sur un Cisco), et d'analyser le résultat depuis
son programme, une méthode qui est très fragile, le format de
sortie ayant été conçu pour des humains et pas pour des
programmes.
Les tables convoitées sont bien sûr la RIB mais aussi des informations comme les mises à jour de routes reçues. BMP donne accès à une table BGP nommée Adj-RIB-In, « Adjacent [peers] Routing Information Base - Incoming », définie dans le RFC 4271, section 1.1. Elle stocke les informations brutes (avant les décisions par le routeur) transmises par les pairs BGP.
BMP fonctionne (section 3) en établissant une connexion TCP avec le routeur convoité. Celui-ci envoie ensuite l'information qu'il veut. Il n'y a pas de négociation ou de discussion au début. Dès que la connexion est établie, le routeur transmet. Il envoie d'abord des messages Peer Up pour chacun de ses pairs, puis des messages Route Monitoring pour toute sa base de routes (la section 5 les décrit plus en détails). Une fois que c'est fait, le routeur transmet des messages indiquant les changements : Route Monitoring en cas d'annonce ou de retrait d'une route, Peer Up ou Peer Down s'il y a des changements chez les pairs. Autres messages possibles : Stats Report pour envoyer des statistiques globales (voir les sections 4.8 et 7), Initiation et Termination pour les débuts et fins de sessions, Route Mirroring pour envoyer verbatim les annonces BGP reçues (c'est une vision de plus bas niveau que Route Monitoring et cela permet, par exemple, d'analyser des annonces BGP syntaxiquement incorrectes, cf. section 6).
Le client BMP ne transmet jamais de message au serveur (au routeur), à tel point que le routeur peut parfaitement fermer la moitié de la connexion TCP, ou mettre sa fenêtre d'envoi à zéro (ou encore, jeter tous les messages qui seraient envoyés). Toute la configuration est dans le routeur.
Le format des messages est décrit en section 4. C'est du classique. On trouve dans le message un numéro de version (actuellement 1), la longueur du message, le type du message (la liste des types est indiquée plus haut) représentée par un entier (0 pour Route Monitoring, 1 pour Stats Report (ou Statistics Report), etc), puis les données. À noter que le type arrive après la longueur, alors que c'est en général le contraire (encodage TLV).
Pour la plupart des messages BMP, il y aura un second en-tête, rassemblant les informations sur le pair (son adresse IP, son AS, etc).
Les différents paramètres numériques sont désormais stockés dans un registre IANA.
Quelques petits mots sur la sécurité pour finir. Pour économiser ses ressources, le routeur peut évidemment (section 3.2) restreindre l'ensemble des adresses IP autorisées à se connecter en BMP à lui, tout comme il peut limiter le nombre de sessions BMP (par exemple, une au maximum par adresse IP, cinq au total). Il peut aussi y avoir des questions de confidentialité (section 11). Bien sûr, la liste des routes dans la DFZ est publique, mais ce n'est pas forcément le cas des peerings privés ou de VPN utilisant BGP comme ceux du RFC 4364. Donc, attention à bien restreindre l'accès.
BMP est en cours d'élaboration depuis pas mal de temps déjà. Résultat, des mises en œuvre ont eu le temps d'apparaitre. Wireshark sait analyser le BMP. Et il existe deux récepteurs (clients) libres, BMPreceiver et OpenBMP. Côté serveur (routeur), Cisco et Juniper savent envoyer du BMP.
Date de publication du RFC : Juin 2016
Auteur(s) du RFC : P. Wouters (Red Hat)
Expérimental
Réalisé dans le cadre du groupe de travail IETF dnsop
Première rédaction de cet article le 24 juin 2016
Lorsqu'un client DNS parle à un résolveur, il pose une question et obtient une réponse. Avant DNSSEC, ce mode de fonctionnement simple était souvent satisfaisant. Mais, avec DNSSEC, il est beaucoup plus fréquent de devoir faire plusieurs requêtes pour obtenir toute l'information nécessaire pour valider les réponses. (Il faut les clés de toutes les zones situées entre la racine et la zone visée.) Cela coûtait cher en latence. Cette extension EDNS expérimentale permet au client DNS de demander au résolveur de chercher et de renvoyer toutes les réponses d'un coup.
Cette extension est particulièrement utile pour le cas de
machines terminales hébergeant leur propre résolveur validant (ce
qui est la meilleure configuration, question confiance et
sécurité). Ce n'est donc pas un hasard si l'auteur du
RFC travaille chez
Red Hat, système qui est livré par défaut avec
une telle configuration. Mais, lorsqu'un tel résolveur validant veut
vérifier les informations obtenues sur
foo.bar.example
, il devra (en supposant qu'il y
a une zone par composant du nom de domaine)
obtenir la délégation sécurisée de example
(dig @la-racine DS example
), la clé de
example
(dig @ns-example DNSKEY
example
), la délégation sécurisée de
bar.example
, etc (la clé de la racine,
elle, est en dur dans le résolveur, il faut bien partir de quelque part). À faire séquentiellement,
cela serait beaucoup de requêtes, donc du temps passé à attendre les
réponses. Sur des liens à latence élevée (ce qui arrive souvent aux
machines terminales), cela peut être pénible, même si le
cache DNS aidera, pour les requêtes suivantes.
L'idée de cette extension (sections 1 et 3 du RFC) est donc que le résolveur validant
local ait un forwarder (attention, le RFC utilise
un vocabulaire erroné, en donnant à forwarder un
sens différent de celui qu'il a dans les RFC 2308 et RFC 8499 ; j'utilise, moi, la terminologie standard). Le résolveur
validant local va demander à ce forwarder, grâce
à la nouvelle extension EDNS CHAIN
, d'envoyer tout
d'un coup (tous les DS et
DNSKEY nécessaires). Bien sûr, le
forwarder, lui, devra faire toutes les requêtes
mais, a priori, il a un plus gros cache et sera mieux connecté.
Cette nouvelle extension est donc conçue pour des résolveurs, et est ignorée par les serveurs faisant autorité. Notez que le résolveur validant local peut être un démon autonome (Unbound tournant sur mon portable Unix) ou bien une partie d'une application qui embarquerait ses propres fonctions de résolution de noms.
Le format de l'extension est décrit en section 4 du RFC. C'est
une option EDNS (RFC 6891), encodée, comme les autres options EDNS, en
TLV. Le type (le code) est 13. La valeur est composée d'un seul champ,
l'ancêtre le plus proche (Closest Trust Point)
dont on connaisse les informations nécessaires à la validation. Le
résolveur validant local a en effet certaines informations (dans sa
configuration ou dans son cache) qu'il n'est pas nécessaire de lui
envoyer. Dans l'exemple plus haut, si le résolveur validant local
connait déjà la clé DNSSEC de example
, il
mettra dans le champ Closest Trust Point ce nom
de domaine, indiquant au forwarder qu'il peut se
contenter des informations situées plus bas, dans l'arbre du
DNS. Ce nom est encodé dans le format habituel du DNS (qui n'est
pas le format texte avec les
points).
La section 5 du RFC décrit comment utiliser cette extension au
DNS. Si on veut tester les capacités du résolveur qu'on interroge,
on peut utiliser une option CHAIN
vide
(longueur nulle). Si le serveur à qui on a envoyé cette option
répond avec la même option nulle, c'est bon. Attention, les serveurs
récursifs qui mettent en œuvre CHAIN
n'accepteront des requêtes « réelles » (longueur non nulle) qu'au-dessus d'un transport où l'adresse IP source est vérifiée. Le but
est d'éviter les attaques par
réflexion avec amplification (voir aussi la section 7.2). Pour vérifier l'adresse IP
source (ce qui ne se fait normalement pas en
UDP), il y a plusieurs solutions, notamment
TCP (RFC 7766) et les
gâteaux (RFC 7873).
Une fois qu'on a un tel transport, et que le client DNS a testé
que le serveur qu'il interroge gère bien CHAIN
,
on peut y aller. Le client met l'ancêtre le plus proche (dont il a
les clés) du nom
demandé dans le champ Closest Trust Point. Dans
le cas le plus courant (résolveur validant configuré avec une seule
clé, celle de la racine), le résolveur « froid », qui vient de
démarrer et dont le cache est vide, il commencera par mettre la
racine en Closest Trust Point puis, au fur et à
mesure qu'il se « réchauffera » (que son cache se peuplera), il
pourra mettre des noms plus proches du nom demandé (et donc plus
éloignés de la racine). Par exemple, si le résolveur validant local
est configuré avec la clé de la racine, et qu'il a appris par les
réponses précédentes la clé de example
, mais
pas celle de bar.example
, et qu'il veut des
informations sur le nom foo.bar.example
, son
option CHAIN
vaudra {type = 13, longueur = 9,
valeur = 0x07 0x65 0x78 0x61 0x6d 0x70 0x6c 0x65 0x00} (la longueur
est celle de la partie « valeur » uniquement, le nom
example
est encodé selon la norme DNS). S'il
connaissait également la clé de bar.example
, son option
CHAIN
vaudrait {type = 13, longueur = 13,
valeur = 0x03 0x62 0x61 0x72 0x07 0x65 0x78 0x61 0x6d 0x70 0x6c 0x65
0x00}. D'autres exemples figurent en section 9 du RFC.
Faut-il envoyer l'option CHAIN
à chaque
requête ? On peut mais il est recommandé de se souvenir de quels
serveurs la gèrent et de n'envoyer qu'à ceux-ci (autrement, non
seulement on fait du travail inutile mais on renseigne des serveurs
extérieurs sur l'état de son cache). Comme il existe des
middleboxes boguées sur
certains trajets, la stratégie de repli du RFC 6891, section 6.2.2 peut être utile.
Et le serveur interrogé, que fait-il ? S'il accepte de répondre à
une requête contenant l'extension CHAIN
, il
doit :
CHAIN
dans la réponse, avec
la valeur Closest Trust Point mise au nom le
plus bas (le plus éloigné de la racine) pour lequel ces
informations sont nécessaires. (C'est surtout utile lorsque le
serveur n'envoie pas une chaîne complète, par exemple pour
économiser le réseau.)
Évidemment, si la question avait une erreur de syntaxe (taille de la
partie Valeur inférieure à la Longueur, par exemple), le serveur
répond FORMERR
(FORmat
ERRor).
La section 7 sur la sécurité étudie quelques
programmes que peut poser cette extension au DNS. D'abord, mettre en
œuvre cette option fatigue davantage le serveur interrogé, en terme
de travail et de capacité du réseau. Un serveur est donc toujours
libre d'ignorer les options CHAIN
et de s'en
tenir au service minimum.
Ensuite, comme vu plus haut, les réponses suivant une question
qui utilise CHAIN
vont être évidemment plus
grosses que les réponses DNS habituelles. Il y a donc un risque d'attaques par
réflexion avec amplification, si un attaquant usurpe
l'adresse IP de sa victime. C'est pour cela que notre RFC impose de
ne répondre avec une chaîne complète que si l'adresse IP du client a
été vérifiée (par exemple parce qu'il utilise
TCP, ou bien les cookies
du RFC 7873).
CHAIN
a aussi quelques effets sur la
vie privée. Le résolveur validant local va
indiquer à son forwarder (et à tout espion qui
surveille le trafic) comment il est
configuré et ce qu'il y a dans son cache.
Il ne semble pas qu'il existe de mise en œuvre de cette option
CHAIN
pour l'instant, même si c'est en projet pour Go.
Si vous vous intéressez à la conception des protocoles réseaux, notez que cette extension a fait l'objet d'une discussion pour savoir s'il ne valait pas mieux, pour réduire la latence, envoyer toutes les requêtes possibles en parallèle (cette idée a finalement été rejetée).
Première rédaction de cet article le 22 juin 2016
Le 21 juin, la nouvelle version d'Unicode est sortie, la 9.0. Une description officielle des principaux changements est disponible mais voici ceux qui m'ont intéressé particulièrement. (Il n'y a pas de changement radical.)
Pour explorer plus facilement la grande base Unicode, j'utilise un programme qui la convertit en SQL et permet ensuite de faire des analyses variées. Faisons quelques requêtes SQL :
ucd=> SELECT count(*) AS Total FROM Characters; total -------- 128237
Combien caractères sont arrivés avec la version 9 ?
ucd=> SELECT version,count(version) FROM Characters GROUP BY version ORDER BY version; ... 8.0 | 7716 9.0 | 7500
7 500 nouveaux pile. Lesquels ?
ucd=> SELECT To_U(codepoint) AS Codepoint, name FROM Characters WHERE version='9.0'; codepoint | name -----------+---------------------------------------------------------------------------- ... U+8BA | ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE ... U+8E2 | ARABIC DISPUTED END OF AYAH ... U+23FB | POWER SYMBOL U+23FC | POWER ON-OFF SYMBOL U+23FD | POWER ON SYMBOL U+23FE | POWER SLEEP SYMBOL ... U+104D8 | OSAGE SMALL LETTER A U+104D9 | OSAGE SMALL LETTER AI U+104DA | OSAGE SMALL LETTER AIN ... U+17000 | TANGUT IDEOGRAPH-17000 U+17001 | TANGUT IDEOGRAPH-17001 U+17002 | TANGUT IDEOGRAPH-17002 ... U+1F921 | CLOWN FACE U+1F922 | NAUSEATED FACE U+1F923 | ROLLING ON THE FLOOR LAUGHING ... U+1F933 | SELFIE ... U+1F953 | BACON U+1F954 | POTATO U+1F955 | CARROT
On trouve également des écritures entièrement nouvelles comme l'osage ou le tangoute, qui fait 91 % des nouveaux caractères de cette version. Et il y a bien sûr l'habituel lot d'emojis pour faire rire les réseaux sociaux (signe des temps, il y a maintenant un emoji pour selfie). Je ne sais pas pourquoi on ajoute des caractères arabes pré-composés comme le « ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE » au lieu de permettre sa composition à partir de caractères existants. On note aussi un caractère dont le nom indique qu'il est contesté... (Il existe déjà U+6DD, « ARABIC END OF AYAH » mais on me souffle que le nouveau serait nécessaire au Pakistan.) On note qu'après un long lobbying, les symboles d'allumage et d'extinction de votre machine sont désormais dans Unicode.
Si vous avez les bonnes polices de caractères, voici les caractères pris en exemple plus haut : ࢺ ⏻ ⏼ ⏽ ⏾ 𐓘 𐓙 𐓚 𗀀 𗀁 𗀂 🤡 🤢 🤣 🤳 🥓 🥔 🥕
Il n'y a pas que l'ajout de nouveaux caractères, mais aussi quelques légers changements techniques. Par exemple, les règles de passage à la ligne (UAX #14) prennent désormais en compte les gens qui ont un signe $ dans leur nom (comme Travi$ Scott) et les règles IDN (UTS #46) ont corrigé une bogue.
Date de publication du RFC : Mai 2016
Auteur(s) du RFC : S. Previdi, C. Filsfils (Cisco
Systems), B. Decraene, S. Litkowski
(Orange), M. Horneffer (Deutsche
Telekom), R. Shakir (Jive
Communications)
Pour information
Réalisé dans le cadre du groupe de travail IETF spring
Première rédaction de cet article le 22 juin 2016
Traditionnellement, la transmission d'un paquet IP au routeur suivant était faite uniquement sur la base de l'adresse de destination, sans tenir compte du reste du paquet. Et la décision est prise par chaque routeur, sur le trajet, en complète indépendance. Or, l'émetteur d'un paquet voudrait souvent décider de la route suivie ou, au minimum, l'influencer. C'est pour cela qu'il existe des mécanismes de routage par la source (source routing). Leurs défauts et leurs limites ont mené à la recherche d'une meilleure solution, dite SPRING (Source Packet Routing In NetworkinG). Ce RFC est la description du problème.
Notez que le terme « source » a, pour SPRING, un sens plus large que lorsqu'on parle habituellement de source routing. Dans ce dernier cas, la source était uniquement l'émetteur original. Pour SPRING, la source est l'endroit où on définit la politique de routage ultérieur, elle peut se situer au milieu du trajet.
Avant SPRING, il y avait plusieurs solutions permettant à la source de décider du routage mais aucune n'a été largement déployée (à part MPLS). C'est dû en partie à leur manque de souplesse, en partie à des problèmes de sécurité.
La future solution SPRING doit être un meilleur système (section 1 du RFC), et déployable de manière incréméntale (il ne serait évidemment pas réaliste de devoir changer tout l'Internet). En outre, l'état doit être maintenu dans le paquet lui-même, pas dans les routeurs intermédiaires. L'expérience de l'Internet a en effet largement montré que pour faire marcher un grand réseau complexe, il ne faut pas maintenir d'état dans les nœuds intermédiaires.
SPRING devra être assez général marcher avec plusieurs mécanismes de transmission des paquets (dataplanes, cf. section 2). Les principaux visés sont MPLS et IPv6 avec un nouvel en-tête de routage (cf. RFC 2460, section 4.4).
La section 3 présente plusieurs scénarios d'usage, pour montrer pourquoi un système tel que SPRING est utile. Il y a par exemple la création de tunnels pour faire des VPN (RFC 4364).
Il y a aussi le reroutage rapide de paquets (FRR, Fast ReRoute), et bien sûr l'ingéniérie de trafic. Pour ce dernier scénario, notre RFC demande que la future solution SPRING permette des options strictes (le paquet suit exactement le chemin spécifié) ou laxistes (le paquet suit à peu près le chemin spécifié), puisse fonctionner en centralisé (SDN) ou en décentralisé, etc.
Une des raisons du peu de déploiement des solutions de routage par la source est évidemment la sécurité (section 4 du RFC). SPRING met le chemin désiré dans le paquet (pour éviter de garder un état dans le réseau). Or, si on suit aveuglément les desiderata de chaque paquet, on ouvre la voie à des tas d'attaques. Par exemple, un paquet spécifie un détour considérable par un autre pays, et cela occupe pour rien les liaisons internationales. Un paquet spécifie un trajet qui boucle et les routeurs qui lui obéiraient feraient une attaque par déni de service contre eux-mêmes.
Le RFC impose donc que SPRING fournisse un mécanisme de « domaines de confiance » avec des frontières bien claires. Si un paquet vient d'un domaine de confiance, on lui obéit. S'il vient de n'importe où sur l'Internet, on ignore ses demandes (ou bien on vire ces options de routage par la source lorsque le paquet change de domaine).
La réalisation concrète de SPRING sur un système de transmission donné (comme MPLS ou IPv6) doit également documenter les risques spécifiques à ce dataplane. Par exemple, MPLS est en général utilisé uniquement à l'intérieur d'un domaine contrôlé et connu (le réseau d'un opérateur) alors qu'IPv6 est de bout en bout donc pose davantage de risques (mais il dispose de possibilités supplémentaires, comme la signature cryptographique des en-têtes).
Il faut maintenant attendre les RFC décrivant les solutions, ils sont en cours de développement dans le groupe SPRING.
Date de publication du RFC : Mai 2016
Auteur(s) du RFC : JM. Valin (Mozilla), C. Bran
(Plantronics)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF rtcweb
Première rédaction de cet article le 21 juin 2016
Ce très court RFC expose les exigences en matière de codec audio pour WebRTC. Opus et G.711 sont ainsi obligatoires.
WebRTC permet de communiquer (texte, audio et vidéo) entre deux machines, typiquement via les navigateurs Web (ainsi, Firefox et Chrome sont tous les deux capables de faire du WebRTC.) On sait qu'il existe un grand nombre de moyens de représenter les sons sous forme d'un flux de données numériques et, pour que la communication puisse se faire, il faut que les participants aient au moins un de ces moyens en commun. C'est le but de ce RFC. D'autres codecs peuvent évidemment être gérés par le logiciel mais ceux-ci sont obligatoires (section 3 du RFC) :
audio/telephone-event
du
RFC 4733 (DTMF), qui permet d'envoyer les indispensables
signaux « si vous voulez de la musique d'attente pendant une
heure, tapez 1, si vous voulez parler à un incompétent sous-payé
qui ne
comprendra pas votre problème, tapez 2 ».Les autres codecs facultatifs sont décrits dans le RFC 7875, ce qui a permis à chacun de faire citer son codec favori.
Notre RFC spécifie également le niveau sonore (section 4). Contrairement aux recommandations UIT G.169 et G.115, il n'est pas constant car il dépend de la bande passante.
Il y a aussi une mention de la suppression d'écho (section 5 du RFC), mais sans solution unique imposée.
Première rédaction de cet article le 20 juin 2016
Vendredi 17 juin 2016, une attaque spectaculaire contre l'organisation The DAO a eu lieu, menant à la soustraction d'environ un tiers de ses fonds. Quelles leçons à en tirer ?
Si vous connaissez au moins un peu The DAO et Ethereum, vous pouvez lire tout de suite mes réflexions sur cette crise. Si vous ne connaissez pas, vous pouvez lire en anglais la bonne explication de Robert Graham ou bien en français les articles de Wikipédia sur Ethereum et les contrats.
Comme d'habitude lorsqu'un gros problème de cybersécurité est publié, on trouve du grand n'importe quoi dans les médias ou sur les rézosocios. Il est donc important de commencer par être précis sur les faits :
Mais cela ne veut pas dire que cette bogue est juste un détail sans importance et qu'on peut passer. Il s'agit d'une crise grave, dont il faudra tirer les leçons. D'abord, sur l'aspect technique (mais je parle des questions financières, légales et de gouvernance par la suite). L'origine du problème est une bogue dans le code de The DAO (pour les cœurs bien accrochés, voici les explications techniques complètes). C'est une banalité de noter qu'on ne sait pas écrire du logiciel sans bogues. Tout logiciel a des bogues et, avant de confier des fonds à un contrat, il faut garder ce point en tête. Un des rares cas dans cette affaire où les pessimistes systématiques (« ce n'est pas moi qui a inventé ce truc, donc ça va rater ») avaient raison est quand ils pointaient le fait qu'il y aura forcément des bogues dans les contrats et, qu'en l'absence de mécanisme de recours, on aura du mal à en gérer les conséquences.
Cela ne veut pas dire qu'il faut baisser les bras et renoncer à programmer. Mais il faut changer, et d'état d'esprit, et sans doute de techniques utilisées. Emin Gün Sirer fait remarquer à juste titre que l'écriture d'un contrat devrait ressembler à celle du code d'un avion ou d'une centrale nucléaire, pas à celle d'un site Web avec images et CMS. Or, aujourd'hui, pas mal de programmeurs de contrat sont plutôt dans la mentalité « si le code semble faire vaguemement ce qu'on veut, c'est bon », qui a mené à pas mal de désastres de sécurité sur le Web. Du point de vue des techniques utilisées, le même Sirer a raison de dire qu'il faut se poser la question des langages de programmation. Un langage impératif comme Solidity est-il vraiment la meilleure solution pour faire des contrats sûrs, et ne faudrait-il pas plutôt utiliser des langages plus adaptés, par exemple plus fonctionnels, inspirés d'Haskell ? Ces langages ont un fossé plus réduit entre la spécification et l'exécution. Plus radicale, la vérification formelle des contrats devrait-elle être la norme ? A priori oui, mais soyons prudents : les mécanismes de vérification formelle des programmes sont lourds et compliqués et ont leurs propres bogues.
En parlant de spécification, Vitalik Buterin a fait un très bon article pour expliquer qu'une bogue, c'est par définition une déviation par rapport à la spécification, et que réduire le nombre de bogues implique d'être clair dans la spécification, ce qui est déjà un défi considérable. Dans un message non authentifié, un individu se présentant comme l'attaquant prétend ainsi que, le code du contrat étant sa loi, par définition, toute opération faite avec le contrat The DAO est légale, y compris son vol. Il est bien sûr de mauvaise foi, mais on peut noter qu'il n'est pas possible de lui opposer une spécification précise de ce que le contrat était censé faire.
Autre leçon technique, un rappel que la complexité est l'ennemie de la sécurité. Le code de The DAO comprenait de nombreuses fonctions (comme celle permettant de retirer ses fonds, à l'origine de la bogue), ce qui augmentait la probabilité d'avoir une bogue. J'ai toujours expliqué que le terme de smart contract était dangereux car il encourageait les programmeurs à faire du code compliqué, alors qu'un bon contrat est au contraire trivial à lire et à analyser. Un programmeur de contrat ne devrait pas être admiré pour ses hacks astucieux mais au contraire pour sa capacité à faire du code ennuyeux et évident. (Je pensais à la validation d'un contrat par ses utilisateurs, mais ce raisonnement s'applique également à la sécurité.)
A posteriori, il est clair qu'on est passé trop rapidement du petit contrat « Hello, World », à un gros truc complexe, avec plein de fric, comme The DAO. C'est un peu comme si, immédiatement après la traversée de la Manche par Blériot, on avait lancé sur l'Atlantique un avion de 500 passagers payants...
Il y a aussi des leçons à tirer de l'excessive focalisation sur l'argent, commune à une bonne partie de la communauté Ethereum, et aux médias. Les médias ont surtout présenté cette crise sous son angle financier (The DAO a perdu 50 millions, l'ether a baissé de 50 %, etc) alors que la chaîne de blocs Ethereum, contrairement à celle de Bitcoin, ne sert pas qu'à des transactions financières. Des tas de contrats ne consomment des ethers que pour acheter l'essence (le mécanisme par lequel on paie pour l'exécution des contrats). Se focaliser sur les contrats à caractère financier, comme The DAO, empêche de voir toutes les potentialités de la chaîne de blocs (plusieurs articles ont ainsi présenté, de manière erronée, Ethereum comme étant juste « une crypto-monnaie concurrente de Bitcoin »). Et, évidemment, stocker autant d'argent allait attirer les voleurs. Bref, tant que les articles sur Ethereum continueront à mettre en avant le cours de l'ether en comparant avec la monnaie étatique traditionnelle, on n'arrivera pas à comprendre toutes les potentialités (disruptives, forcément disruptives) de la chaîne de blocs.
Il y a également bien des leçons à tirer de la crise de The DAO en terme de gouvernance de la chaîne de blocs. Normalement, les contrats « intelligents » étaient censés se gouverner tout seuls. Le code est la loi, il est exécuté fidèlement par la la machinerie Ethereum, et il n'y a donc pas de place pour l'interprétation ou l'action humaine. Face à la crise et au vol d'ethers, que fallait-il faire ? En schématisant, il y avait deux positions : les principiels voulaient qu'on laisse les choses se produire. The DAO avait une bogue, ils perdent leur argent. Selon eux, toute autre solution aurait mis en cause ce qui était justement l'un des principaux arguments en faveur des contrats, leur côté automatique, insensibles aux passions et aux manipulations humaines. Les réalistes, de l'autre côté, considéraient qu'on ne pouvait pas rester sans rien faire et voir le voleur emporter l'argent. Ils prônent un fork, c'est-à-dire une scission délibérée de la chaîne : une nouvelle version des logiciels est produite, appliquant des règles différentes (par exemple empêchant les transferts depuis le compte du voleur). Certains nœuds du réseau adoptent le fork, d'autres pas. Si les premiers sont plus nombreux, leur chaîne est considérée comme la bonne, les autres n'ont plus qu'à se soumettre, ou à partir et faire leur chaîne de leur côté (ce qui serait évidemment une grosse tuile pour Ethereum). Vu superficiellement, cela serait une décision centrale dans un système, la chaîne de blocs, conçu justement pour éviter cela. Mais si une telle décision peut en effet être prise par un petit groupe de gens (en gros, les développeurs des logiciels qui font marcher la chaîne ; notez que, contrairement à Bitcoin, il n'existe pas qu'un seul logiciel), sa mise en œuvre, elle, dépend de tous les gens qui gèrent des nœuds (enfin, surtout des mineurs), et qu'il faut convaincre. C'est pour cela que les articles de Buterin, par exemple, insistent sur le fait que les développeurs comme lui n'imposent pas, ils proposent. Une attitude tout à fait opposée était celle de de Stephan Tual qui, dans ce tweet et celui-ci accusait tout opposant (ceux qui refusent le fork, les principiels), d'être forcément en cheville avec le voleur, et appelait même à les dénoncer ! Ce délire robespierro-stalinien a certainement fait bien plus de mal à Ethereum que la bogue elle-même.
Un des éléments du débat était aussi le statut particulier de The DAO. Pourquoi forker juste pour eux, disent les principiels ? Fera-t-on pareil à chaque fois qu'un contrat a une bogue ? Le seul argument des réalistes est la taille : The DAO est « too big to fail ». Après que tant de gens, aussi bien à l'intérieur de la communauté Ethereum qu'à l'extérieur, aient entretenu une certaine confusion entre Ethereum et The DAO, il est difficile de laisser tomber le canard boiteux. Même si cela a mené à des injustices flagrantes, comme l'appel lancé par Slock.it à faire une attaque par déni de service contre toute la chaîne Ethereum, pour ralentir l'attaquant (cette boîte a fait une bogue, et la fait payer à tout le monde).
Cette crise pose donc évidemment la question de ce mode de gouvernance « le code [des contrats] est la seule règle ». Thibault Verbiest a ainsi estimé que ce n'était pas souhaitable et qu'il fallait une régulation étatique des chaînes de blocs.
Les habituels ricaneurs ont évidemment proclamé qu'ils avaient bien raison, et que la chaîne de blocs était fichue, et que cela les faisait bien rigoler (manger le popcorn en regardant le film est évidemment plus facile que de travailler). Mais on est loin d'une telle conclusion. Si The DAO ne survivra probablement pas à cette crise, l'idée de contrat, les autres contrats et Ethereum lui-même sont bien vivants et continueront, une fois la crise actuelle digérée. Les contrats sont une innovation et, comme toute innovation, les débuts sont un peu cahotiques. Lors des débuts de l'aviation, le projet le plus sérieux, celui qui avait de très loin le plus gros budget et la plus grande attention des médias était celui de Langley. Le 8 décembre 1903, son projet se termine après un nouveau crash, qui mène beaucoup de gens à affirmer que l'aviation est morte. Une semaine après, le premier avion des frères Wright décolle avec succès... Matthew Spoke estime même que cette attaque est une bonne chose, elle va forcer à être plus sérieux.
PS : j'ai oublié d'en parler initialement, mais voici la déclaration de conflit d'intérêt. Je ne possède pas (et n'ai jamais possédé) de tokens (de parts) de The DAO.
Date de publication du RFC : Mai 2016
Auteur(s) du RFC : C. Contavalli, W. van der Gaast
(Google), D. Lawrence (Akamai
Technologies), W. Kumari (Google)
Pour information
Réalisé dans le cadre du groupe de travail IETF dnsop
Première rédaction de cet article le 20 juin 2016
Dernière mise à jour le 13 juin 2022
Ce nouveau RFC décrit une option EDNS qui permet à un client DNS d'indiquer au serveur l'adresse IP d'origine de la requête DNS. Pourquoi diable ferait-on cela, au prix de la vie privée ? Cette option est surtout utile dans le cas de l'utilisation d'un gros résolveur DNS public (comme Google Public DNS) et d'un CDN.
Pour comprendre pourquoi, il faut se rappeler que le
DNS ne fonctionne pas de bout en bout. La
machine de M. Michu émet des requêtes DNS à un
résolveur (en général fourni par le
FAI ou par le réseau local, mais certaines
personnes, victimes du marketing, préfèrent les résolveurs publics
comme OpenDNS, plus lointains et plus
lents). Ce résolveur, à son tour, interroge les serveurs
faisant autorité. Si M. Michu voulait se connecter à un
site Web pour voir des vidéos de chats, il est possible qu'un nouvel
acteur soit présent, le CDN (comme
Akamai) qui héberge les
dites vidéos. Les serveurs DNS faisant autorité pour le CDN
renvoient souvent une adresse IP différente selon l'adresse IP du
résolveur qui les interroge. Si l'adresse IP du client est au
Sénégal, l'adresse IP du serveur de vidéos
qui sera renvoyée sera celle du centre de
données le plus « proche » du Sénégal. En temps normal,
cela fonctionne plus ou moins. Bien sûr, le serveur DNS faisant
autorité pour le CDN ne voit pas le « vrai » client, M. Michu, il
voit le résolveur DNS utilisé mais les deux sont proches : si
M. Michu est en Colombie, son résolveur DNS le sera aussi. Voici un
exemple, vu avec les sondes RIPE Atlas, où on
demande, au Sénégal (SN) puis en Colombie (CO) l'adresse IP de www.elysee.fr
, hébergé
sur un CDN états-unien :
% blaeu-resolve --country SN www.elysee.fr [207.123.59.254 209.84.7.126 8.27.7.254] : 1 occurrences [209.84.7.126 8.253.3.254 8.27.7.254] : 1 occurrences [4.26.233.254 4.26.236.126 8.254.119.126] : 1 occurrences [207.123.59.254 209.84.7.126 8.253.3.254] : 1 occurrences [207.123.59.254 8.26.223.254 8.27.7.254] : 1 occurrences Test #4106632 done at 2016-06-15T22:52:44Z % blaeu-resolve --country CO www.elysee.fr [192.221.116.253] : 3 occurrences [205.128.71.253 4.27.25.125 8.27.155.126] : 1 occurrences [206.33.52.253 209.84.20.126 8.253.16.126] : 1 occurrences Test #4106633 done at 2016-06-15T22:52:46Z
On voit qu'on a obtenu des adresses IP très différentes et, espérons-le, adaptées à chaque pays.
Autre exemple, avec un service de PowerDNS, qui renvoyait (il semble ne plus marcher) une géolocalisation du client. Ici, j'utilise dig depuis deux machines différentes, une en France et l'autre aux États-Unis :
% dig +short -t txt www.geo.powerdns.com "bonjour france 2a01:db8:8bd9:85cb:21e:8cff:fe76:29b6/26" % dig +short -t txt www.geo.powerdns.com "hello USA 204.62.14.153/22"
On voit que le résolveur que j'utilise (qui, à chaque fois, était sur le réseau local de la machine cliente), a bien été géolocalisé. Si j'utilise un résolveur public :
% dig @8.8.8.8 +short -t txt www.geo.powerdns.com "bonjour france XX.YY.152.0/11"
Ici, cela a marché car Google Public DNS a des serveurs en France. Si cela n'avait pas été le cas, j'aurais été géolocalisé... quelque part ailleurs.
Tout change (section 1 du RFC) si on utilise un résolveur DNS public comme Verisign Public DNS ou bien Yandex DNS. Dans ce cas, l'adresse IP du résolveur, vue par le serveur faisant autorité pour le CDN, n'a plus grand'chose à voir avec celle du vrai client, elle peut être très lointaine. Les serveurs DNS faisant autorité risquent donc de renvoyer une adresse IP de serveur Web qui ne soit pas optimale. Certes, tout marchera quand même mais ça sera plus lent alors qu'officiellement, le but des CDN est d'accélerer l'arrivée de la vidéo du chat (non, de François Hollande).
On voit que ce RFC résout donc un problème que n'a pas tout le monde. Seuls ceux qui se servent d'un résolveur public lointain, et qui visitent des sites Web hébergés sur un CDN (en général les gros sites commerciaux) auront le problème. C'est une des raisons qui expliquent que ce RFC a pas mal trainé (voyez cet article, qui date de plusieurs années) à l'IETF : son intérêt n'est pas évident, et il y avait beaucoup de contestation. Mais l'IETF a finalement choisi de documenter cette option (qui est effectivement déployée), sans forcément la recommander.
Donc, comment est-ce que cela résout le problème décrit plus
haut ? L'idée est de standardiser une option EDNS que les résolveurs
publics ajouteront dans leur requête aux serveurs faisant autorité,
et qui indiquera la « vraie » adresse IP d'origine (section 5 du RFC). Imaginons que
M. Michu ait pour adresse IP 192.0.2.56
et
qu'il utilise Google Public DNS. Ce dernier va transmettre la
requête au CDN et ajoutera l'option Client
Subnet (ce n'est donc pas M. Michu qui le fera). Le serveur DNS du CDN verra
une requête arriver de, mettons,
74.125.17.1
. L'option EDNS Client
Subnet contiendra le préfixe de l'adresse IP de M. Michu,
192.0.2.0/25
. Il saura alors qu'il doit adapter
ses réponses, non pas au préfixe 74.125.17.0/24
(son client direct) mais au préfixe
192.0.2.0/25
(le vrai client). C'est donc une
option entre résolveur et serveur faisant autorité, pas entre
machine terminale et résolveur.
Le format de l'option est décrite dans la section 6 du RFC. Comme toutes les options EDNS (RFC 6891), elle est encodée en TLV : le type est 8, la valeur est composée de :
192.0.2.0
dans
l'exemple plus haut).La section 7 du RFC décrit les détails du protocole. Le résolveur va mettre dans son cache les réponses du serveur faisant autorité. Normalement, l'information dans le cache est indexée par le nom de domaine (et le type de données demandé, mais je simplifie). Avec ECS (EDNS Client Subnet), l'information est indexée par le couple {nom de domaine, préfixe IP}. En effet, deux requêtes pour le même nom peuvent avoir donné des résultats différents selon le préfixe IP (c'est bien le but !).
Le résolveur qui met cette option doit choisir la longueur du préfixe envoyé. Il tient compte de deux choses :
Mais l'affaire est un peu plus compliquée : le client d'origine (la machine de M. Michu, le stub resolver) a pu mettre une option ECS elle-même (ce n'est pas courant aujourd'hui mais ça pourrait arriver). Dans ce cas, le résolveur doit en tenir compte et mettre comme longueur la plus courte entre celle demandée par le client (a priori pour protéger sa vie privée) et celle que le résolveur aurait choisi tout seul.
Si la requête reçue par le résolveur avait l'option ECS et une longueur de zéro, cela indique le souhait du client qu'on ne transmette pas son adresse IP du tout. Le résolveur doit évidemment respecter cette demande.
Et le serveur faisant autorité, que doit-il mettre dans sa réponse ? (S'il envoie des réponses différentes selon la source, et s'il gère l'option ECS, EDNS Client Subnet ; autrement, c'est simple, il ne fait rien de particulier.) Il met une option ECS dans la réponses, avec :
(Notez que le RFC est bien plus détaillé que ce résumé, car il y a plein de cas rigolos. Je me suis limité à une présentation générale, je n'essaie pas de traduire tout le RFC.)
En recevant cette réponse, le résolveur va la mettre dans son
cache, en tenant compte de la longueur du préfixe (et, bien sûr,
le résolveur transmet la réponse à son client). Une réponse
valable pour 2001:db8:43:bef::/64
ne pourra
pas être utilisée pour le client
2001:db8:43:bed::1
. Quelle longueur sera
utilisée pour indexer le cache ? Celle demandée ou bien celle
effective ? Les régles exactes sont un peu complexes (il faut
tenir compte de la longueur effective, mais aussi des limites du
cache, qui ne veut pas stocker une réponse pour des préfixes trop spécifiques), je vous
renvoie à la section 7.3.1 du RFC.
Les questions ultérieures des clients du résolveur pourront
recevoir une réponse tirée du cache, sans repasser par les
serveurs faisant autorité. Mais ECS impose d'organiser le cache
différemment. Avec le DNS classique, si on a dans le cache la
réponse à une question pour cat.example.com
(je simplifie en ne tenant pas compte du type des données DNS),
et qu'on reçoit une question pour ce nom, on peut répondre avec
les données du cache. Avec ECS, le cache doit en plus tenir compte
du préfixe stocké avec la réponse, et de l'adresse IP du
client.
Et avec DNSSEC, ça se passe comment (section 9 du RFC) ? Les CDN ne signent pas leur zone en général. Mais s'ils s'y mettent (il le faudrait), il y aura quelques précautions à prendre.
Et avec le NAT ? Il n'y a normalement pas de problèmes, sauf évidemment si le résolveur est NATé et ne le sait pas : il mettrait, dans ce cas, une adresse privée dans l'option ECS, ce qui serait idiot.
Reste à regarder les problèmes de sécurité et notamment de vie privée. ECS diminue forcément votre vie privée. Il ajoute en effet une information qui n'était pas là sans lui (et le RFC 8165 dit bien que c'est mal). C'est pour limiter les dégâts que le RFC recommande aux résolveurs qui ajoutent une option Client Subnet de la limiter aux 24 premiers bits en IPv4 et aux 56 premiers en IPv6. Un résolveur qui connait bien la topologie de son réseau peut faire encore mieux : s'il sait que tous ses clients sont proches, et couverts par le même /20, il peut ainsi ne transmettre que les vingt premiers bits, sans diminuer l'intérêt du service.
Notez que, avec les clients DNS d'aujourd'hui, votre résolveur mettra votre adresse IP dans ses requêtes sortantes. On peut en sortir (opt-out en mettant une option ECS avec une longueur nulle) mais cela nécessite une action explicite (que ne permettent pas forcément les clients DNS actuels, notamment les stub resolvers, ceux qui sont intégrés dans le système d'exploitation). Le RFC recommande donc que cette option ECS soit désactivée par défaut, en raison de ces risques.
L'option ECS peut être vue par les serveurs faisant autorité, mais également par les tiers qui espionnent le trafic. Pour empêcher cela, il faudra déployer des solutions de chiffrement du trafic DNS, comme celles sur lesquelles travaille le groupe DPRIVE.
Un bon article sur les problèmes de vie privée liés à ECS est le « Understanding the Privacy Implications of ECS » de Panagiotis Kintis, Yacin Nadji, David Dagon, Michael Farrell et Manos Antonakakis. Un autre bon article sur cette question est celui de Frank Denis.
Voyons maintenant cette option ECS en action. Elle est par exemple utilisée par Google dont le résolveur public ajoute cette option avant de l'envoyer aux serveurs faisant autorité. Mais on trouve une liste d'utilisateurs plus détaillée sur le site de promotion de la technologie.
Parmi les logiciels libres qui la mettent en œuvre, on note la
bibliothèque getdns. Ou
bien le programme dig livré avec
BIND. Voici un exemple avec la nouvelle
option +subnet
de dig (prise sur un BIND
9.11, l'option était déjà en 9.10) :
% dig +subnet=8.189.152.0/25 @ns-1568.awsdns-04.co.uk A www.amazon.com ... ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ; CLIENT-SUBNET: 8.189.152.0/25/0 ... ;; ANSWER SECTION: www.amazon.com. 60 IN A 54.239.25.192 ...
Et ce que voit le serveur faisant autorité ? On peut le savoir
en faisant tourner tcpdump sur un serveur
faisant autorité qu'on contrôle, mais il y a plus simple, utiliser
un domaine dont les serveurs faisant autorité renverront
l'information ECS qu'ils ont reçu. J'en connais trois, qui
répondent aux requêtes DNS de type TXT
:
_country.pool.ntp.org
,whoami.fastly.net
et
whoami6.fastly.net
,ecs.dyn.bortzmeyer.fr
(qui
utilise le logiciel Drink).Voici un exemple :
% dig ecs.dyn.bortzmeyer.fr TXT ... ;; ANSWER SECTION: ecs.dyn.bortzmeyer.fr. 0 IN TXT "78.196.62.0/24" ;; Query time: 15 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: lun. juin 13 14:08:23 CEST 2022
Un service analogue, edns-client-sub.net
renvoie sous
forme d'un objet JSON les options ECS reçues, ainsi que la
géolocalisation. Ici, mon résolveur n'envoie pas ECS :
% dig +short -t txt edns-client-sub.net "{'ecs':'False','ts':'1447875683.94','recursive':{'cc':'FR','srcip':'XX.YY.152.187','sport':'37512'}}"
Mais Google, lui, le fait (et heureusement, sinon j'aurais été géolocalisé en Belgique, où se trouve le serveur de Google utilisé) :
% dig @8.8.8.8 +short -t txt edns-client-sub.net "{'ecs_payload':{'family':'1','optcode':'0x08','cc':'FR','ip':'XX.YY.152.0','mask':'24','scope':'0'}, 'ecs':'True','ts':'1447875689.25','recursive':{'cc':'BE','srcip':'74.125.47.152','sport':'41735'}}"
Mais ce service ne semble plus fonctionner, en juin 2022.
Enfin, voici un exemple de code Python qui coupe ECS chez le résolveur, pour protéger la vie privée de l'utilisateur. Il utilise la bibliothèque dnspython :
opt = dns.edns.ECSOption(address='', srclen=0) # Disable ECS (RFC 7871, section 7.1.2) options = [opt] message = dns.message.make_query(qname, dns.rdatatype.from_text(qtype), use_edns=True, options=options)
Date de publication du RFC : Mai 2016
Auteur(s) du RFC : S. Krishnan (Ericsson), T. Mrugalski
(ISC), S. Jiang (Huawei
Technologies)
Pour information
Réalisé dans le cadre du groupe de travail IETF dhc
Première rédaction de cet article le 12 juin 2016
Le protocole DHCP sert à transmettre à une machine qui vient de se connecter au réseau, des informations utiles pour sa connexion. Il est surtout connu pour son utilisation avec IPv4 mais DHCP existe aussi pour IPv6 (il est normalisé dans le RFC 8415). Comme son équivalent IPv4, DHCP pour IPv6 pose un certain nombre de problèmes de vie privée, que ce RFC explore.
Il fait donc partie de la série de RFC développés après le RFC 6973 et, surtout, après les révélations de Snowden qui ont mené l'IETF à s'engager plus vigoureusement contre la surveillance massive. Ce RFC ne propose pas de solutions (elles sont décrites dans le RFC 7844), il décrit le problème.
Le problème fondamental est le même qu'en IPv4 (RFC 7819) : le client DHCP, lorsqu'il vient de se connecter à un réseau et émet des requêtes, publie des informations trop détaillées, dont certaines sont des véritables identificateurs stables (cf. section 2 de notre RFC), permettant au serveur DHCP, mais aussi à toute machine qui écoute le réseau, de suivre à la trace une machine donnée. Au contraire des solutions comme SLAAC, où le client est purement passif, DHCP impose au client d'annoncer son existence et de donner des informations. Bref, si vous avez déjà lu le RFC équivalent pour IPv4, le RFC 7819, vous n'apprendrez pas grand'chose de nouveau.
La section 3 du RFC donne une liste aussi complète que possible
des options DHCPv6 qui peuvent servir à la surveillance. D'abord,
l'adresse IP source. Bon, elle ne fait pas partie
de DHCP à proprement parler et tout protocole va la publier,
puisqu'elle apparait dans tous les paquets émis. (Dans le cas
de DHCP, la requête du client est émise depuis une adresse locale
au lien, link-local, celles qui commencent par
fe80::
.) Néanmoins, l'adresse IP source
mérite une mention car certains mécanismes de génération d'une
adresse IPv6 peuvent poser des problèmes de vie privée (cf. RFC 7721). Il faut
donc utiliser des mécanismes comme ceux du RFC 8981 ou du RFC 7217.
L'exemple suivant est celui d'une option particulièrement dangereuse pour la vie privée, Client Identifier, qui envoie au serveur le DUID (DHCPv6 Unique Identifier, RFC 8415, section 11) du client. Comme son nom l'indique, il identifie chaque machine de manière unique et, par défaut, il est stable. La méthode la plus courante pour le générer est d'utiliser l'adresse MAC, elle-même un identificateur unique et stable. Même si on prend la précaution de changer l'adresse MAC, le DUID ne change pas. C'est donc un excellent moyen de suivre une machine, cassant complètement la sécurité de techniques comme celle du RFC 8981.
Certaines options peuvent être moins clairement indiscrètes mais peuvent néanmoins révéler indirectement l'identité du client. C'est le cas de l'option Option Request qui dit au serveur quelles options on souhaiterait qu'il utilise. Cette liste de choix peut servir à distinguer entre plusieurs clients DHCP : toutes les fois où il y a un choix dans un protocole, il y a une possibilité de fingerprinting.
Certaines options n'envoient pas directement un identificateur unique mais envoient de l'information sur une classe à laquelle appartient la machine. Par exemple, les options Vendor Class et Vendor-specific Information (sections 21.16 et 21.17 du RFC 8415), ou encore l'option Client System Architecture (RFC 5970), indiquent le matériel et le logiciel du client.
On n'a vu ici que des options allant du client vers le serveur mais l'inverse existe aussi, et certaines options qu'un serveur peut envoyer sont révélatrices (par exemple Civic Location, RFC 4776). Mais les problèmes de vie privée du serveur sont moins graves que ceux du client et notre RFC passe donc rapidement (voir aussi la section 5.3).
En dehors des options DHCP, certains mécanismes utilisés dans le cadre de DHCP peuvent être bien indiscrets. C'est par exemple le cas de la demande d'adresses temporaires (RFC 8415, section 6.5), pourtant bien intentionnée. Le but était de pouvoir obtenir des adresses qui ne soient pas stables, pour minimiser justement les risques pour la vie privée. Le RFC détaille les nombreux problèmes et pièges que récèle ce mécanisme. Mais le principal problème est que la seule demande de ces adresses, visible par tout surveillant, est déjà très révélatrice ! Cela revient à sa promener avec une cagoule sur sa tête pour préserver sa vie privée.
Autre mécanisme qui peut être révélateur, la mise à jour du DNS que font certains serveurs DHCP. Si le nom utilisé est stable (cf. l'option Client FQDN mentionnée plus haut), tout surveillant ayant accès au DNS (c'est-à-dire tout le monde) pourra suivre les changements d'adresse IP de la machine, connaissant ainsi ses déplacements d'un réseau à l'autre.
Les stratégies d'allocation d'adresses du serveur DHCP peuvent également être dangereuses pour la vie privée. Le serveur DHCP dispose d'une certaine plage d'adresses. S'il alloue les adresses en commençant toujours par la plus basse adresse libre, les adresses attribuées vont être assez prévisibles, ce qui n'est en général pas bon pour la discrétion. (Et ce mécanisme, qui a certes l'avantage d'être simple et rapide, tend à concentrer les adresses allouées au début de la plage.) Autre possibilité, allouer des adresses fixes (le même client - identifié par une option comme Client Identifier - a toujours la même adresse IP). C'est évidemment très pratique pour l'administrateur du réseau local. Mais c'est la pire solution pour la vie privée, puisque cela oblige le client à divulguer son identité, et cela permet même aux serveurs extérieurs de le suivre à la trace lorsqu'il communique avec eux avec son adresse fixe. Pour la vie privée, la meilleure stratégie d'allocation est sans doute le tirage au sort parmi les adresses libres de la plage.
Maintenant qu'on a vu les vulnérabilités de DHCPv6, voyons ce qu'un attaquant peut en faire (section 5 du RFC). D'abord, il peut découvrir le type de machine chez le client (matériel et/ou logiciel), ce qui peut être utile, par exemple pour sélectionner une attaque spécifique à un système d'exploitation, ou bien, si le matériel/logiciel utilisé est rare, pour identifier un client particulier. Cette information sur le type de machine peut être trouvé dans l'adresse MAC (les premiers octets identifient le vendeur), dans les identificateurs dérivés de l'adresse MAC, ou dans les options comme Vendor Class.
L'espion peut également utiliser ces faiblesses de DHCPv6 pour identifier les réseaux visités précédemment (je n'en ai pas parlé plus haut, mais il existe une option qui indique la précédente adresse IP utilisée : elle est pratique pour obtenir une adresse stable, mais elle est indiscrète).
Plus généralement, le surveillant peut essayer de découvrir une identité stable, lui permettant de savoir combien de machines utilisent ce serveur DHCP, et lui permettant également de corréler deux machines sur deux réseaux, découvrant qu'il s'agit en fait de la même. Le DUID est particulièrement sensible ici.
Le surveillant peut ainsi suivre une machine, soit dans le temps (toutes ses activités en un réseau donné), soit dans l'espace (suivre à la trace un engin mobile).
Si le surveillant a les moyens d'une agence d'un État riche
(par exemple si le surveillant est la NSA),
il peut effectuer une surveillance massive très efficace (RFC 7258). Il est par exemple conceptuellement
aisé de bâtir une liste de très nombreuses machines, en observant
beaucoup de réseaux : les failles de sécurité de DHCPv6 citées
dans ce RFC permettront de reconnaitre chaque machine
individuelle. Ainsi, un organisme comme la NSA peut se faire une
base de données permettant de répondre très vite à des questions
du genre « où était 38:59:f9:7d:b6:47
la
dernière fois qu'on l'a vu ? »
Enfin, la section 6 de notre RFC rappelle une triste réalité : en sécurité, il faut en général faire des compromis. Ici, le RFC note que toute authentification du client va à l'encontre du souhait de préserver la vie privée. Ce genre de choix (sécurité de son réseau, ou bien vie privée des utilisateurs) est bien embêtant pour l'administrateur système.
Date de publication du RFC : Mai 2016
Auteur(s) du RFC : Donald Eastlake (Huawei), Mark
Andrews (ISC)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF dnsop
Première rédaction de cet article le 10 juin 2016
La grande majorité des requêtes DNS passent aujourd'hui sur UDP. Ce protocole ne fournit aucun mécanisme permettant de vérifier un tant soit peu l'adresse IP source de la requête. Contrairement à ce qui arrive avec TCP, il est trivial de mentir sur l'adresse IP source, sans être détecté. Cela permet des comportements négatifs, comme les attaques par réflexion. Ce nouveau RFC propose un mécanisme simple et léger pour s'assurer de l'adresse IP source du client : des petits gâteaux, les cookies.
Le principe est le même que pour les cookies de HTTP (décrits dans le RFC 6265) : le serveur DNS génère un nombre imprévisible qu'il transmet au client. Celui-ci renvoie ce nombre à chaque requête, prouvant qu'il recevait bien les réponses, et n'avait donc pas triché sur son adresse IP. (Notez une grosse différence avec les cookies du Web : ils changent quand l'adresse IP du client change et ils ne peuvent donc pas être utilisés pour suivre à la trace un client mobile.)
Bien sûr, une autre solution serait d'utiliser TCP (comme proposé dans le RFC 7766) ou bien DTLS (RFC en cours de discussion). Mais les petits gâteaux se veulent une solution moins radicale, de déploiement peut-être plus facile. Ils ne sont pas forcément utilisés seuls, ils peuvent être combinés avec d'autres mesures anti-usurpation, comme celles du RFC 5452.
Comme avec toute technique de sécurité, il faut regarder en détail les menaces auxquelles elle répond (section 2 du RFC). En usurpant l'adresse IP source, un méchant peut effectuer des attaques par déni de service, et il peut empoisonner un cache. Voyons ces deux cas.
D'abord, l'attaque par déni de service : en usurpant l'adresse IP source, on peut effectuer une attaque par réflexion. Dans ces attaques, le méchant envoie un paquet à un tiers, le réflecteur, en mentant sur son adresse IP source : le méchant met celle de la victime. Lorsque le réflecteur répondra, il enverra un message à la victime. Cette attaque est surtout intéressante lorsqu'elle est combinée avec l'amplification. Si la répo