Ce blog n'a d'autre prétention que de me permettre de mettre à la disposition de tous des petits textes que j'écris. On y parle surtout d'informatique mais d'autres sujets apparaissent parfois.
Première rédaction de cet article le 7 Mai 2008
Le VCS Subversion s'est largement imposé comme la référence en matière de VCS centralisé, c'est-à-dire reposant sur un dépôt unique de données. Contrairement à son prédécesseur CVS, Subversion permet, par exemple, de déplacer facilement un fichier ou un répertoire à l'intérieur du dépôt, sans perdre l'historique. Mais ce déplacement n'est pas possible entre dépôts différents. Il existe une manipulation pour le faire mais elle nécessite quelques efforts.
Pour Subversion, le monde se réduit à un
dépôt à la fois. Si on a un dépôt B
(https://svn.nic.fr/ReD-AFNIC/Etudes dans
l'exemple ci-dessous) et qu'on souhaite y importer des fichiers venus d'un dépôt
A
(svn+ssh://bortzmeyer@foobar.example.com/home/bortzmeyer/AFNIC-Subversion
dans l'exemple ci-dessous), en gardant leur historique (donc, sans
utiliser les fonctions d'importation classiques), la simple copie ne
marche pas :
% svn copy svn+ssh://bortzmeyer@foobar.example.com/home/bortzmeyer/AFNIC-Subversion \
https://svn.nic.fr/ReD-AFNIC/Etudes
svn: Source and dest appear not to be in the same repository (src: 'svn+ssh://bortzmeyer@foobar.example.com/home/bortzmeyer/AFNIC-Subversion'; dst: ' https://svn.nic.fr/ReD-AFNIC/Etudes')
La manipulation exacte est possible mais plus complexe. Il faut :
svnadmin : svnadmin dump
/home/bortzmeyer/AFNIC-Subversion > svn.dumpsvndumpfilter pour ne garder que le
sous-arbre qui nous intéresse. Attention, le chemin à donner en
paramètre est un chemin absolu dans le dépôt (ici, on garde trois
sous-arbres, anycast, EPP et
dDOS-February-2007). La commande utilisée est
svndumpfilter
include /RD/anycast /RD/EPP /RD/dDOS-February-2007 < svn.dump >
svn-filtered.dumpNode-path). Par exemple, si le fichier
dump contient Node-path:
IETF/Behave/tests-socket, et qu'on charge ce fichier dans
le répertoire /ReD-AFNIC, le fichier résultant
sera en /ReD-AFNIC/IETF/Behave/tests-socket. Ce changement peut se faire avec la fonction
de rechercher / remplacer d'un éditeur
ordinaire (les fichiers de dump de Subversion sont
de simples fichiers texte) ou bien avec un outil comme
sed ou perl.svn
commit) ou bien directement dans le dépôt avec
svn mkdir URL.svnadmin : svnadmin load --parent-dir
/ReD-AFNIC /home/Subversion-Repository <
svn-filtered.dump. L'option
--parent-dir permet d'indiquer à quel endroit on
accroche le sous-arbre.Les deux commandes svnadmin nécessitent
d'avoir les droits pour accéder aux fichiers du dépôt Subversion, en
lecture pour la première étape et en écriture pour la seconde. Par
exemple, si le dépôt final n'est accessible qu'en
HTTP et que les données sont propriétaires de
l'utilisateur sous le nom duquel tourne le serveur HTTP (cet
utilisateur est www-data par défaut sur une
Debian), il faudra exécuter la commande sous
l'identité de www-data par exemple avec
sudo : sudo -u www-data svnadmin load ....
Si svnadmin load échoue avec un message du genre :
<<< Started new transaction, based on original revision 4
svnadmin: File not found: transaction '92-1', path '/ReD-AFNIC/Etudes/two'
* adding path : ReD-AFNIC/Etudes/two ... %
c'est qu'un répertoire manque. Il faut, comme indiqué ci-dessus, changer les noms dans le fichier de dump ou bien créer le répertoire. C'est le point le plus délicat de la manipulation.
Une fois copié l'ancien dépôt, il est prudent de faire un
svn delete sur cet ancien dépôt, pour éviter de
continuer à l'utiliser par accident.
Quelques avertissements, enfin :
Bref, pour résumer, cette manipulation n'est pas idéale. Avec Subversion, il vaut mieux réfléchir avant de mettre les fichiers dans des dépôts séparés, copier entre dépôts restera toujours un pis-aller !
Merci beaucoup à Kevin Grover pour ses explications détaillées sur la manipulation à faire, merci aussi à Les Mikesell pour des détails utiles.
Blair Zajac me suggère qu'on peut aussi utiliser la propriété
svn:externals de Subversion pour « copier »
l'ancien dépôt sans réellement le fusionner (pas tout à fait ce dont
j'avais besoin mais cette technique peut être utile dans d'autres cas).
Pour tester différentes idées, j'ai écrit un script shell qui réalise cette manipulation sur des dépôts « bidons ».
Première rédaction de cet article le 7 Mai 2008
Tous (ou presque tous ?) les langages de programmation permettent de noter une donnée qui n'existe pas, le rien, le néant. Mais chacun utilise un symbole différent.
En SQL, c'est le
NULL. Ainsi, un booléen en
SQL est tri-valué : vrai, faux ou
NULL. Cela agace prodigieusement certains
théoriciens comme Date.
Python utilise
None. N'importe quelle variable peut prendre la
valeur None.
Perl utilise
undef. N'importe quelle variable peut prendre
cette valeur.
Lisp utilise traditionnellement
#f qui sert aussi à noter « faux ». Plus
récemment, une valeur spécifique, nil, a été
utilisée à la place. La liste vide () convient aussi.
Pascal désigne les pointeurs invalides par
nil. Pascal est statiquement et assez fortement typé et les
variables des autres types n'ont pas de valeur
nil possible.
Ruby utilise également
nil.
Haskell est typé et ne permet pas de valeur
« nulle » sauf si on utilise la monade Maybe qui permet d'avoir une valeur
Nothing.
Visual Basic a le même terme,
Nothing.
C utilisait
traditionnellement 0, valable aussi bien pour les
entiers, les caractères et les pointeurs. Aujourd'hui, la bonne pratique
est plutôt d'utiliser la macro NULL.
Merci à Bertrand Petit pour sa suggestion originale.
Première rédaction de cet article le 4 Mai 2008
Vous aimez le café ? Comme moi, comme les informaticiens, vous en buvez plusieurs fois par jour ? Cela vous aiguise l'esprit et vous rend plus efficace ? Alors, vous êtes comme Miguel Lienzo, le héros du roman « Le marchand de café » de David Liss.
Miguel est marchand à Amsterdam au 17ème siècle, lors d'un des moments de plus grande splendeur de la ville, où se développe le lieu de travail de Miguel, la Bourse, où se vendent les premiers contrats à terme, où les Juifs portugais comme Miguel bénéficient d'une relative liberté. La Bourse est un univers impitoyable, Miguel a des dettes, a provoqué la colère d'un homme important, et va tenter d'utiliser le café, que pratiquement aucun européen ne boit encore, pour « se refaire »...
Argent, amour, trahison, récits de voyages, navires chargés de riches cargaisons, rien ne manque à cet excellent roman de vacances.
Auteur(s) du livre: Wolfgang Kleinwächter (éditeur)
Éditeur: Germany land of ideas
Publié en 2007
Première rédaction de cet article le 4 Mai 2008
Ce livre est un recueil d'articles produits par différents acteurs de la gouvernance Internet un peu partout dans le monde. On n'y trouvera aucune unité, chacun a juste dévelopé un thème qui lui tenait à cœur (comme Latid Latif expliquant qu'IPv6 va sauver le monde). Il n'y a pas non plus grande originalité dans un livre où la plupart des auteurs avaient déjà eu de nombreuses occasions de faire connaitre leur point de vue.
Les articles sont courts et il y a peu de questions originales traitées. Le spectre des idées politiques est large, personne n'a été oublié, ce qui fait qu'un article d'Anriette Esterhuysen de l'APC, qui appelle à l'intervention publique pour s'assurer que tous les citoyens sont connectés, et qui met en garde contre les extensions des privilèges des titulaires de propriété intellectuelle est immédiatement suivi d'un article de George Sadowsky, de l'ISOC, qui explique que seul le Dieu Marché doit être autorisé à intervenir et qu'il est crucial de maintenir et d'étendre les droits déjà exorbitants dont jouissent les titulaires de propriété intellectuelle.
La plupart des articles n'apprendront rien à celui qui a déjà un peu étudié la gouvernance Internet, d'autant plus que la langue de bois est fort active (articles de Vint Cerf ou de Hamadoun Touré). Seuls quelques auteurs se sont aventurés hors de leur domaine habituel (comme Louis Pouzin qui écrit sur les identités numériques).
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 4995, 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.
Première rédaction de cet article le 26 Avril 2008
Un rapport de Greg Kroah-Hartman publié sur lwn.net le 7 avril fait le point sur l'état du Linux Driver Project (LDP), un projet qui vise à augmenter le nombre de pilotes de périphériques pour le noyau Linux. Ce rapport est très optimiste, est-ce justifié ?
Greg Kroah-Hartman résume la situation ainsi :
Tout le monde partage t-il cette vision optimiste ? Non, comme le montre, par exemple, la discussion qui a suivi sur le site. Les remarques critiques les plus fréquentes concernent les performances et l'étendue des fonctions gérées. Par exemple, dans certains cas, le pilote Linux ne fait que du polling et délivre donc des performances inférieures au pilote Windows qui accepte les interruptions. Ou bien le pilote Linux ne gère pas telle ou telle fonction comme la 3D pour une carte graphique. Dans les deux cas, un Linuxien zélé peut dire « Ce matériel fonctionne sous Linux » alors qu'il marche moins bien que sous Windows.
Mais Greg Kroah-Hartman oublie également d'autres problèmes fréquents :
Greg Kroah-Hartman, pour mieux appuyer sa démonstration, ne parle que du noyau proprement dit et « élimine » les cartes graphiques, une source fréquente de problèmes, car leurs pilotes sont en général dans X.Org, pas dans le noyau, et les scanneurs et imprimantes, pour la même raison.
Donc, on ne peut certainement pas dire que la situation des pilotes de périphérique avec Linux soit aussi rose que la peint cet article. Mais la faute à qui s'il y a tant de problèmes ? Il faut se rappeler que l'origine du mal n'est pas à chercher du côté des développeurs Linux comme Greg Kroah-Hartman, mais plutôt du côté des entreprises qui ne produisent pas de documentations pour leurs matériels, ou bien exigent la signature de NDA pour y avoir accès, quant elles ne refusent pas purement et simplement tout pilote libre, de peur que la lecture du source ne révèle comment fonctionne leur matériel.
Première rédaction de cet article le 22 Avril 2008
Les DHT sont un moyen entièrement pair-à-pair de stocker de l'information dans le réseau. Leur force est la résistance aux attaques, leur faiblesse le fait qu'on ne puisse pas garantir l'authenticité des données stockées, puisque le mécanisme classique de « faire confiance au serveur qui fait autorité », utilisé par exemple pour le DNS, ne s'applique pas aux DHT où on ignore même sur lequel des milliers de serveurs de la DHT nos précieuses données seront stockées.
Il faut donc utiliser la cryptographie et signer les données.
Voici donc un protocole possible, suivi de son application au service OpenDHT. L'expérience prouve largement que les amateurs (et même parfois les professionnels) ne voient jamais les failles de sécurité des protocoles cryptographiques qu'ils conçoivent : les critiques sont donc les bienvenues.
Pour éviter les collisions sur le mot « clé », je ne l'utilise que pour la clé cryptographique. Je nomme « nom de l'attribut » (ou index) l'« endroit » où on veut stocker et « valeur de l'attribut » la chose qu'on veut stocker.
Chaque entité qui veut stocker des trucs dans la DHT a une clé cryptographique asymétrique. Pour un protocole comme HIP (RFC 5201), la clé serait le HI (Host Identifier).
Notez qu'on n'a pas dit comment on connaissait les clés publiques de ses partenaires. Le mécanisme pour cela est en dehors de ce protocole.
Les failles que je vois pour l'instant :
Le programme qui écrit la donnée, d'abord. Il s'utilise ainsi :
% python put.py -k 82AEEF63 quelquechose.example.org 192.0.2.42
La ligne ci-dessus stocke la valeur 192.0.2.42
dans la DHT, indexée par le nom
quelquechose.example.org, en signant avec la clé
OpenPGP 0x82AEEF63. Il fabrique les deux noms
(celui composé de la clé et de l'attribut et celui qui sert à stocket
la signature) :
key = Binary(sha.new(pgp_key + attribute).digest()) key_for_sig = Binary(sha.new(pgp_key + attribute + ".SIGNATURE").digest())
puis écrit dans la DHT :
proxy.put(key, bin_value, ttl, "put-authentic.py")] proxy.put(key_for_sig, Binary(signature), ttl, "put-authentic.py")
Le programme qui lit les données vérifie les signatures. Il s'utilise ainsi :
% python get.py -k 82AEEF63 quelquechose.example.org
À noter que rien n'empêche plusieurs écritures sur le même nom (les attributs sont multi-valués dans OpenDHT) donc le programme doit boucler sur tous les résultats obtenus. Autrement, il fait simplement l'inverse du programme d'écriture :
signatures, pm = proxy.get(key_for_sig, maxvals, pm, "get-authentic.py") vals, pm = proxy.get(key, maxvals, pm, "get-authentic.py")
Si un méchant a essayé d'insérer de fausses données, cela se voit tout de suite (rappelons qu'on ne peut pas empêcher cette insertion, juste la détecter a posteriori) :
% python get.py -k 82AEEF63 quelquechose.example.org Good signature from: uid: OpenDHT Authenticity Test (Test only, not a real user) <stephane+opendht@sources.org> Value is "192.0.2.42" BAD signature from: uid: OpenDHT Authenticity Test (Test only, not a real user) <stephane+opendht@sources.org> Value is "102.0.2.42"
Date de publication du RFC : Mars 2005
Auteur(s) du RFC : R. Arends (Telematica), R. Austein (ISC), M. Larson (Verisign), D. Massey (Colorado State University), S. Rose (NIST)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF dnsext
Première rédaction de cet article le 22 Avril 2008
Complétant la série des RFC sur DNSSEC, ce
RFC 4034 décrit les types d'enregistrements utilisés par ce
protocole, DNSKEY, RRSIG,
DS et
NSEC.
DNSSEC, décrit dans les RFC 4033 et RFC 4035, permet de signer cryptographiquement les enregistrements DNS de faon à garantir leur authenticité. Pour cela, DNSSEC ne modifie pas le format des paquets DNS, mais il ajoute plusieurs types d'enregistrement nouveaux. Notre RFC fait partie de la série de RFC qui décrit DNSSEC-bis (la première version de DNSSEC, assez différente, n'ayant eu aucun succès) et il succède au RFC 2535.
La plupart des exemples ci-dessous ont été obtenus pour la zone
sources.org qui est désormais signée. Vous pouvez
interroger en DNSSEC ses serveurs de noms (dig NS
sources.org. vous en donnera la liste).
Chacun des nouveaux types d'enregistrement va faire l'objet d'une section. La
section 2 est consacrée à DNSKEY, les clés publiques des
zones. Un de ces enregistrements stocke notamment l'algorithme de chiffrement
utilisé et la clé. La représentation texte officielle (chaque type
d'enregistrement DNS a une représentation binaire, utilisée sur le
câble, et une représentation texte, utilisée par exemple dans les
fichiers de zone de BIND), décrite en section
2.2, affiche la clé encodée en Base64 :
sources.org. 86400 DNSKEY 256 3 3 ( CL9vwM+5gCMZdycMOYJQ7lSspHDTsaZmZkDR l+KNx/VytmbPSfcdYmhJJHyTdGpzqXmm6qEd 4Kpyqbd59RXv9JCVVM3MntiX/hruxbB3WsV0 hlVej1IuWFDncJFLWhaD9UjgGm+UoqlQJGVJ rGZf7KvwL4iKZhr1fiDEJFD7e9cxU8dojhHp mmAOZLjEYKytDMB0rj8/Mnm5cVVu29UFS+0y jvkdbQD0EJ9FwF/8MwG4DHj6ZtFwxeNp2NCD 6oj0kxDi5ktY0rQtSv506aAMmGBqS6tNno+g 9KgCLZ5jk5e8fpl9Rlmd2SlVMAyf8E3C9joB ZqCqYX+VcooSrcvgn/4m6CTDPxK+DuE+KW5/ NiE062MKdID7xAxiCj14Suj9K9TKL60buuFa gJ3qTjhS5C62uPk8U9+zHpQ0qjcb0gv3/M+l RcXi46g0OF17cTLy83lgU6s2ApMmaboeUbm2 3lfCEl8B6R2BhE98mfoDNg+Xlj63X8w93LCo XP/c1SZivNolol/Ky6apULe3euFuwdOFfYCR ) ; key id = 55957
Ici, la clé 55957 utilise
DSA/SHA-1 (valeur 3). Ces
clés peuvent être générées, par exemple, par le programme
dnssec-keygen,
qui fait partie de BIND. Bien lire la liste des algorithmes
utilisables pour une zone dans l'annexe A.1 sinon, on aura un message du genre
a key with algorithm 'HMAC-SHA256' cannot be a zone key.
Les enregistrements RRSIG sont le cœur
de DNSSEC, puisqu'ils stockent les signatures des autres
enregistrements. Ce sont les RRSIG que vérifie un
validateur DNSSEC. Un enregistrement RRSIG
contient notamment :
Sous la forme texte décrite en section 3.2, voici un tel enregistrement :
laperouse.sources.org. 86400 IN MX 10 aetius.bortzmeyer.org.
86400 RRSIG MX 3 3 86400 20080522104407 (
20080422104407 55957 sources.org.
CIxBOzsaxBexcAQQE1ukqNfBz5yDnPBVhgxr
MNR7FrfM2iH/AOWoO/8= )
Ici, ce RRSIG signe un MX.
La section 4 est consacrée à NSEC, un type
d'enregistrement qui va résoudre un problème délicat, la « preuve de
non-existence ». En effet, DNSSEC fonctionne en joignant une signature
aux enregistrements existants, ce qui permet de prouver leur
existance. Mais si un nom n'existe pas et que le serveur veut renvoyer
NXDOMAIN (No Such Domain) ? On
ne peut pas signer un enregistrement qui n'existe pas. La solution
DNSSEC est de créer des enregistrements NSEC qui
sont signés et qui indiquent l'enregistrement
suivant (l'ordre est défini dans la section
6, c'est simplement l'ordre des codes ASCII). Ainsi, si je demande nexistepas.example.org
et que je récupère :
lulu.sources.org. 43200 IN NSEC patou.sources.org. AAAA RRSIG NSEC
je sais que nexistepas.sources.org n'existe pas,
puique le NSEC ci-dessus me garantit qu'il n'y a
rien entre lulu et patou.
Un autre type d'enregistrement permettant la « preuve de
non-existence », le NSEC3, est décrit dans le
RFC 5155. En effet, le NSEC a un gros
inconvénient, il permet l'énumération complète de
la zone, en suivant simplement les NSEC. Cette
faiblesse des NSEC est
une des raisons pour lesquelles DNSSEC n'a pas été d'avantage
déployé.
C'est très bien de signer sa zone mais ensuite, comment les
résolveurs partout dans le monde vont-ils connaitre sa clé ? Ils ont
pu l'obtenir par un autre moyen et la mettre dans leur configuration
(ce qu'on nomme une trust anchor). Mais un tel
mécanisme ne se généralise évidemment pas à tout l'Internet. Il faut
donc un seul trust anchor, la clé de la racine
(DLV, décrit dans le RFC 5074, permet que la racine DNSSEC ne
soit pas forcément la racine classique) et un système de
délégations. Ces délégations sont mises en œuvre par les
enregistrements DS, décrits en section 5. Ces
enregistrements contiennent un condensat
cryptographique de la clé :
sources.org. IN DS 55957 3 1 A12F149F84B34E09501C32CC9F984FB9E1ED196A
Ici, 55957 est l'identité de la clé, 3 l'algorithme de la clé et 1 celle du condensat (SHA-1, la liste complète est maintenue par l'IANA).
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.
L'architecture générale de HIP est décrite dans le RFC 4423. 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 4423, 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 : 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.
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 : 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.
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 = DSA), 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.
Première rédaction de cet article le 18 Avril 2008
Lors de la réunion Sparkling Point du 17 avril, j'ai fait un exposé sur « Les conséquences politiques des choix techniques », suivant l'observation de Lawrence Lessig que « The code is the law » (l'architecture - d'un système technique - est la loi).
Je développe trois exemples, empruntés au monde de l'Internet, les politiques d'allocations d'adresses IP, la révision de la norme sur les noms de domaines en Unicode et les débats sur la nouvelle architecture de routage et d'adressage de l'Internet.
Les transparents de cet exposé sont visibles :
Première rédaction de cet article le 14 Avril 2008
Il y a traditionnellement deux moyens de donner des noms à des
engins connectés à un réseau (que ces engins soient des ordinateurs,
des PDA, des téléphones, etc) : un système
d'allocation hiérarchique comme le DNS et un
système complètement local comme le NBP d'Apple
ou comme le LLMNR du RFC 4795. Le premier est lourd, très chargé politiquement et administrativement et échappe aux contrôles des
engins connectés. Le second ne marche que sur un réseau local et ne
présente aucune sécurité (n'importe quelle machine peut dire qu'elle
se nomme FileServer). Cet excellent
article détaille un mécanisme qui permet des allocations
locales, utilisables globalement, et sûres.
L'article Persistent Personal Names for Globally Connected Mobile Devices, de Bryan Ford, Jacob Strauss, Chris Lesniewski-Laas, Sean Rhea, Frans Kaashoek et Robert Morris (MIT) décrit leur système UIA (Unmanaged Internet Architecture). L'idée de base est de tenir compte des réseaux sociaux et du fait que les gens qui communiquent se rencontrent physiquement de temps en temps. Du fait de ce point de départ, UIA ne remplace donc pas toutes les fonctions du DNS. Le principe d'UIA est que chaque machine s'attribue un nom et que ce nom, pour être utilisable depuis une autre machine, nécessite une introduction, qui nécessite le rapprochement physique. Une fois l'identité de chaque machine apprise, elles peuvent s'éloigner, UIA maintient une correspondance entre l'identité et l'adresse IP actuelle, et diffuse cette correspondance aux autres machines connues (un tel système ne convient donc que pour des petits groupes, par pour tout l'Internet). Cette correspondance est authentifiée par cryptographie, comme dans HIP (RFC 4423).
Le système se généralise à d'autres utilisateurs, en indiquant le
nom de ces autres utilisateurs. Si Bob a une machine nommée
myPDA, Alice pourra, après introduction du groupe
Bob, utiliser le nom
myPDA.Bob.
Le protocole n'est pas purement théorique, une implémentation est disponible.
Première rédaction de cet article le 13 Avril 2008
Dernière mise à jour le 14 Avril 2008
Après des années passées à administrer des machines Debian où la mise à jour vers une nouvelle version du système est simple et marche à (presque) tous les coups, passer un ordinateur NetBSD de la version 3 à la version 4 est un amusant retour en arrière, comme de faire un stage dans une île déserte avec juste un briquet et un couteau.
La machine est une Sun UltraSparc 10. Elle était en NetBSD 3.1 et vient de passer en NetBSD 4. Ce que j'ai fait, sur les excellents conseils de Mark Weinem :
http://ftp.netbsd.org/pub/NetBSD/NetBSD-4.0/sparc64/binary/sets/. J'ai utilisé pour cela la commande
wget --mirror --no-parent --execute robots=off
http://ftp.netbsd.org/pub/NetBSD/NetBSD-4.0/$(uname -m)/binary/sets/. Pour le reste de la manipulation, on va supposer
qu'on a tout copié dans /var/tmp/netbsd4. On se
rend dans ce répertoire.
pax -zrf
kern-GENERIC.tgz. pax est simplement
un frontal aux différents formats d'archivage comme tar.mv /netbsd /netbsd.old et mettre le nouveau
noyau, récupéré à l'étape précédente avec mv netbsd /netbsd. On pourra redémarrer sur
l'ancien noyau, si nécessaire, avec la commande boot
netbsd.old de l'invite de démarrage de la Sparc./ofwboot, puis copier le
nouveau (qu'on trouve dans l'ensemble base.tgz,
en ./usr/mdec/ofwboot).etc.tzg et
xetc.tgz contiennent, comme leur nom l'indique,
des fichiers de configuration. On ne les installera pas directement,
la machine étant déjà configurée.cd
/) et on installe : for set in $(ls
/var/tmp/netbsd4/*.tgz | grep -v etc | grep -v kern); do; pax -zrf
$set; done.postinstall check. Ce programme va vérifier
que tout est bien en place. Exécuter ensuite la commande qu'indiquera postinstall.etcupdate ainsi :
etcupdate -s /var/tmp/netbsd4/etc.tgz -s
/var/tmp/netbsd4/xetc.tgz. etcupdate
est interactif et, pour chaque fichier de configuration pour lequel il
y a une nouveauté, il demandra s'il doit garder l'ancien, installer le
nouveau ou bien fusionner interactivement les deux (le système est
nettement moins intelligent que son équivalent Debian, qui regarde si
l'ancien fichier a été modifié localement, avant de poser la question).
À noter que cette opération n'a mis à jour que le système de base. Autre différence avec Debian, le système est coupé en deux, le système de base et les applications, qui se gèrent à la main, ou bien via un système comme pkgsrc.
Il existe d'autres méthodes pour mettre à jour un système NetBSD. Citons notamment la possibilité de démarrer la machine sur un CD-ROM NetBSD et de choisir l'option de mise à jour (merci à Marc Baudoin pour ses explications). Cela simplifie le processus mais ne peut pas s'effectuer à distance.
Une autre solution, pour ceux qui aiment le compilateur, est de compiler soi-même le système de base (attention, je ne l'ai pas fait moi-même, l'opération est trop lente et consomme trop de place disque, je recopie juste une documentation) :
cd /usr/srccvs updateMAMACHINE) et ./build.sh -U -u
kernel=MAMACHINE.cp /netbsd /netbsd.old puis cp
/usr/src/sys/arch/$(uname -m)/compile/obj/MAMACHINE/netbsd
/netbsdcd /usr/src./build.sh -U tools./build.sh -U -u distributionPremière rédaction de cet article le 13 Avril 2008
Dans ce film de César Charlone et Enrique Fernández, (El baño del papa dans la version originale), on fait beaucoup de vélo mais pas pour s'amuser comme le cadre parisien stressé qui se détend en faisant du Vélib'. Ici, on est dans la campagne uruguayenne et les cyclistes sont des contrebandiers, qui profitent des différences de prix entre l'Uruguay et le Brésil proche pour gagner quelques petits sous.
Pas de la contrebande de haute volée, avec des marchandises précieuses, encore moins d'armes ou de drogue, les héros du film transportent de l'huile, du sucre, parfois une bouteille de whisky. Il faut pédaler sur une piste difficile, parfois en pleine nature pour éviter les contrôles, il faut risquer la rencontre avec la douane qui confisque parfois les marchandises, selon son arbitraire.
Mais tout va changer, espèrent les habitants de Melo : le pape Jean-Paul II va venir faire un discours dans leur village et les voisins brésiliens ne vont pas manquer d'affluer par milliers. Tout le village se met donc au travail pour valoriser cette visite papale. La plupart créent des stands de nourriture ou de boisson, mais un des contrebandiers a une meilleure idée. Il va installer des toilettes et faire payer très cher leur usage.
Tous investissent leurs maigres économies, empruntent à la banque, vendent leur outil de travail (leur vélo) pour investir dans ce grand projet. Les quantités de nourriture achetées sont énormes, alors qu'on ne connait que la future affluence que ce que promet la télévision locale. Non seulement ils prennent des risques à se faire pâmer les propagandistes du MEDEF, qui n'ont jamais vus de tels risquophiles, mais ils travaillent comme des fous pendant des jours, dans l'espoir de gagner un peu plus.
Je ne vous dis pas la fin, mais ceux qui ont déjà vus des films latino-américains se doutent que cela se terminera moins bien que dans les films états-uniens, où l'esprit d'entreprise est toujours récompensé.
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 2141 et
RFC 3406, 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 »).
Première rédaction de cet article le 10 Avril 2008
L'adoption par l'ISO de la norme Open XML, proposée par Microsoft, a fait couler beaucoup d'encre, notamment en raison des manœuvres peu glorieuses qui ont permis le retournement de veste du représentant français, malgré les faiblesses techniques de la proposition (des méthodes analogues ont été utilisées dans d'autres pays). La conclusion de la plupart des observateurs, à juste titre, était que l'approbation d'une norme à l'ISO dépendait plus des qualités du lobbyiste que de celles de la norme. (Voir par exemple le communiqué de l'APRIL.) C'est juste mais, dans ce cas, pourquoi diable le monde du logiciel libre, qui avait fait approuver peu de temps auparavant OpenDocument à l'ISO a t-il choisi cet organisme ?
Il existe de nombreuses organisations de normalisation dans le monde. Les tenants du logiciel libre, y compris des grosses entreprises comme Sun ou IBM avaient choisi de porter le format OpenDocument à l'ISO et s'étaient bruyamment vantés de son approbation par cet organisme. C'était tendre la perche à Microsoft : utiliser ses moyens pour faire approuver n'importe quoi par une bureaucratie est le principal domaine de compétence du géant de Redmond. Il n'y a donc pas de quoi s'étonner du succès de la proposition Microsoft à l'ISO. À l'ISO, les participants aux groupes de travail (qui sont parfois de réels experts du domaine) ne sont pas ceux qui votent. Le vote est fait par des représentants des gouvernements, dont on ne sait pas trop bien qui les a désigné où à qui ils répondent. Il est en général impossible de savoir qui a voté quoi. Par exemple, la France a t-elle voté OUI ou NON à la norme ISO 639-3 ? Je vous laisse chercher.
Un tel système favorise les bons lobbyistes, qui ont l'oreille des gouvernements. C'est le terrain où Microsoft est fort et où le monde du logiciel libre a étrangement choisi de se rendre.
Il existe des organisations de normalisation plus ouvertes, où les experts du domaine ont un poids plus important et où les décisions sont d'avantage transparentes, comme le W3C, l'IETF ou OASIS. Pourquoi être allé à l'ISO ? Pourquoi découvrir seulement maintenant que l'ISO « manque de crédibilité » ? L'ISO a toujours été fermée, bureaucratique, ne rendant pas de compte au public et ne distribuant même pas ses normes sur Internet. Faire normaliser un format ouvert à l'ISO, c'est comme faire voter la déclaration des Droits de l'Homme par le parlement tunisien !
Première rédaction de cet article le 10 Avril 2008
Un utilitaire très pratique, pgtop, permet de voir l'activité des processus de PostgreSQL, de regarder les requêtes SQL en cours d'exécution, les statistiques, etc.
pgtop ressemble (délibérement) à la commande
top d'Unix. Sur une Debian "lenny" avec
PostgreSQL 8.3, j'ai testé la version
(actuellement beta) 3.6.2-beta3. configure &&
make pour le compiler (j'ai juste dû ajouter
LDFLAGS = -lcurses dans le Makefile, voilà ce que
c'est que d'utiliser des versions beta). Puis je le lance avec
pg_top -p 5433 -d MABASE et, merveille, je vois
l'activité de mon SGBD. Je vais maintenant
savoir, lorsque ça rame, pourquoi ça rame.
On trouve de nombreux exemples en http://ptop.projects.postgresql.org/screenshots/.
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 et un amusant et intéressant article de Tim Bray, Matthew-6:9.txt#line=,1.
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) 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 le route réellement empruntée n'est pas contrôlé 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é.)
Articles des différentes années : 2000 2001 2002 2003 2004 2005 2006 2007 2008
Syndication : Flux Atom avec seulement les résumés et Flux Atom avec tout le contenu