<?xml version="1.0" encoding="utf-8"?>
<entry title="Résumé du protocole HIP">
<date>2010-12-21</date>
<content>
<p>La parution régulière de <wikipedia name="Request for comments">RFC</wikipedia> sur
<wikipedia xml:lang="en" name="Host Identity Protocol">HIP</wikipedia> (<foreign>Host Identity Protocol</foreign>) me donne à penser qu'un petit résumé de ce
protocole est une bonne idée (ce texte est très inspiré du chapitre 3 du <rfc num="6079" local="true"/>). HIP est un protocole de <link
local="separation-identificateur-localisateur">séparation entre
l'identificateur et le localisateur</link>. Avant HIP, les <wikipedia
name="Adresse IP">adresses IP</wikipedia> servaient les deux rôles à
la fois : comme localisateur, elles identifient une position de la
machine sur l'<wikipedia>Internet</wikipedia> (pas une <link
local="hostname-physical-location">localisation physique</link>, bien
sûr), et changent donc si la machine se déplace ou si le réseau change
de <wikipedia name="Fournisseur d'accès à Internet">FAI</wikipedia>. Comme identificateur, elles sont
utilisées par les protocoles des couches supérieures, notamment
<wikipedia name="Transmission Control Protocol">TCP</wikipedia> pour identifier une connexion en cours et,
si elles changent, la connexion est cassée. Cette dualité de rôle des
adresses IP rend certains problèmes comme la
<wikipedia xml:lang="en" name="Mobile computing">mobilité</wikipedia>, le renumérotage (cf. <rfc num="5887" local="true"/>) ou le
<foreign><wikipedia xml:lang="fr" name="Multi-homing">multihoming</wikipedia></foreign> très durs à
traiter.</p>
<p>HIP, normalisé dans le <rfc num="7401" local="true"/>, résout le problème en limitant les adresses IP au rôle de
localisateur. Ainsi, un paquet HIP est un paquet IP normal et les
routeurs n'ont pas besoin d'être modifiés. HIP est entièrement mis en
&#x153;uvre dans la machine terminale. Les identificateurs sont, eux,
des <wikipedia name="Cryptographie asymétrique">clés publiques</wikipedia>, permettant une
authentification des machines (leur nom officiel est HI, pour
<foreign>Host Identifier</foreign>). Comme ces clés sont souvent très
longues, et, pire, de taille variable, HIP introduit également un
<wikipedia name="Fonction de hachage" anchor="Fonction_de_hachage_cryptographique">condensat cryptographique</wikipedia> des clés, le HIT
(<foreign>Host Identifier Tag</foreign>), qui a la taille d'une
adresse <wikipedia>IPv6</wikipedia> et peut donc être présenté aux
couches supérieures comme TCP, sans trop les traumatiser. (Sur
<wikipedia>FreeBSD</wikipedia>, vous trouverez le HIT de votre machine
sous <computer>/etc/hip</computer>.)</p>
<p>Les HIT sont rangés dans un préfixe IPv6 spécial, nommé
<foreign>Orchid</foreign> (<rfc num="7343" local="true"/>),
<computer>2001:20::/28</computer>, avant d'éviter toute collision avec
les adresses IPv6 « normales ».</p>
<p>Pour établir une connexion, HIP utilise un échange de quatre
paquets (comme SCTP, alors que TCP n'en utilise que trois). Pour
envoyer ces paquets, le pair à l'initiative de la connexion doit
connaître le localisateur (l'adresse IP) du répondeur. Il peut la
trouver dans le <wikipedia name="Domain Name System">DNS</wikipedia> (<rfc num="8005"
local="true"/>) ou bien via un serveur de rendez-vous (<rfc num="8004"
local="true"/>). En <wikipedia>pair-à-pair</wikipedia>, une
<wikipedia name="Table de hachage distribuée">DHT</wikipedia> pourrait être un bon moyen de résoudre un
identificateur en localisateur, et le <rfc num="6537" local="true"/> explore cette piste. (Sur <wikipedia>FreeBSD</wikipedia>,
on peut même mettre HIT et adresse - identificateur et localisateur -
du pair dans <computer>/etc/hosts</computer>.) HIP dispose également d'un mécanisme
pour pouvoir fonctionner à travers les <wikipedia name="Network Address Translation">NAT</wikipedia>
(<rfc num="5770" local="false"/>). Une fois la connexion établie, les
localisateurs peuvent changer (<rfc num="5206" local="false"/>), la
connexion continue.</p>
<p>HIP dispose d'une forte sécurité : protection contre les
usurpations d'identificateur par le fait que ceux-ci sont une clé
cryptographique et que les messages sont signés, protections contre les
<wikipedia name="Attaque par déni de service">DoS</wikipedia> au moment de l'établissement de la
connexion (une faiblesse traditionnelle de TCP lorsqu'il est utilisé
seul). Le « <wikipedia name="Certificat électronique">certificat</wikipedia> » que représente cette
clé est auto-signé par défaut (et est donc accepté par TOFU <foreign>Trust
On First Use</foreign> comme dans <wikipedia name="Secure Shell">SSH</wikipedia>) mais, si on veut avoir encore plus de
sécurité, on peut tout à fait avoir un serveur central qui alloue les
identificateurs et les lie à des identificateurs des applications. HIP
n'a pas qu'un seul modèle de sécurité pour authentifier les pairs.</p>
<p>Qu'est-ce que HIP change pour les applications ? Une application
traditionnelle peut tout à fait utiliser HIP (cf. <rfc num="5338"
local="false"/>) mais une <wikipedia name="Interface de programmation">API</wikipedia> standard figure dans le <rfc num="6317" local="true"/> pour celles qui veulent aller plus loin.</p>
<p>Il 
existe des mises en &#x153;uvres de HIP pour <link
url="http://hip4inter.net/">FreeBSD</link> (le développement a stoppé en <wikipedia>2008</wikipedia>) et <link
url="http://www.openhip.org/">Linux</link> mais aucun des deux ne
semble 
proche d'une intégration dans le système officiel (pour FreeBSD, rien n'est prévu). Le projet <link
url="http://www.openhip.org/">OpenHIP</link> adapte également des
logiciels comme <wikipedia>Wireshark</wikipedia> pour qu'ils aient un
support HIP. <link url="http://infrahip.hiit.fi/">InfraHIP</link>
travaille également à l'infrastructure HIP et <link url="http://infrahip.hiit.fi/hipl/manual/index.html">à des implémentations</link>. Ils ont réalisé une <link
url="http://infrahip.hiit.fi/index.php?index=how">bonne explication de
HIP en une page</link> qui concurrence sérieusement cet article. Un
compte-rendu des expériencs pratiques avec HIP se trouve dans le <rfc
num="6538" local="true"/>.</p>
</content>
</entry>
