Date de publication du RFC : Février 2021
Auteur(s) du RFC : F. Gont (SI6 Networks), S. Krishnan (Kaloom), T. Narten, R. Draves (Microsoft Research)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF 6man
Première rédaction de cet article le 1 mars 2021
Une des particularités d'IPv6 est de disposer d'un mécanisme, l'autoconfiguration sans état qui permet à une machine de se fabriquer une adresse IP globale sans serveur DHCP. Autrefois, ce mécanisme créait souvent l'adresse IP à partir de l'adresse MAC de la machine et une même machine avait donc toujours le même identifiant (IID, Interface IDentifier, les 64 bits les plus à droite de l'adresse IPv6), même si elle changeait de réseau et donc de préfixe. Il était donc possible de « suivre à la trace » une machine, ce qui pouvait poser des problèmes de protection de la vie privée. Notre RFC, qui remplace le RFC 4941 fournit une solution, sous forme d'un mécanisme de création d'adresses temporaires, partiellement aléatoires (ou en tout cas imprévisibles). Les changements sont assez importants depuis le RFC 4941, qui traitait un peu les adresses IPv6 temporaires comme des citoyennes de deuxième classe. Désormais, elles sont au contraire le choix préféré.
L'autoconfiguration sans état (SLAAC, pour Stateless
  Address Autoconfiguration), normalisée dans le RFC 4862, est souvent présentée comme un des gros
  avantages d'IPv6. Sans nécessiter de serveur
  central (contrairement à DHCP), ce mécanisme permet à chaque machine
  d'obtenir une adresse globale (IPv4, via le
  protocole du RFC 3927, ne permet que des
  adresses purement locales) et unique. Cela se fait en concaténant un
  préfixe (par exemple
  2001:db8:32:aa12::), annoncé par le
  routeur, à un identifiant
  d'interface (par exemple
  213:e8ff:fe69:590d, l'identifiant de mon PC
  portable - les machines individuelles, non partagées, comme les
  ordiphones sont particulièrement sensibles
  puisque la connaissance de la machine implique celle de son maître),
  typiquement dérivé de l'adresse MAC.
Partir de l'adresse MAC présente des avantages (quasiment toute
  machine en a une, et, comme elle est relativement unique, l'unicité
  de l'adresse IPv6 est obtenue facilement) mais aussi un
  inconvénient : comme l'identifiant d'interface est toujours le même,
  cela permet de reconnaître une machine, même lorsqu'elle change de
  réseau. Dès qu'on voit une machine
  XXXX:213:e8ff:fe69:590d (où XXXX est le
  préfixe), on sait que c'est mon PC. Un tiers qui écoute le réseau
  peut ainsi suivre « à la trace » une machine, et c'est pareil pour
  les
  machines avec lesquelles on correspond sur l'Internet.
  Or, on ne peut pas cacher son adresse IP, il faut l'exposer pour
  communiquer.  Le RFC 7721 analyse le problème
  plus en détail (voir aussi le RFC 7707).
Les sections 1.2 et 2 de notre RFC décrivent la question à résoudre. Elles notent entre autre que le problème n'est pas aussi crucial que l'avaient prétendu certains. En effet, il existe bien d'autres façons, parfois plus faciles, de suivre une machine à la trace, par exemple par les fameux petits gâteaux de HTTP (RFC 6265) mais aussi par des moyens de plus haute technologie comme les métadonnées de la communication (taille des paquets, écart entre les paquets) ou les caractéristiques matérielles de l'ordinateur, que l'on peut observer sur le réseau. Parmi les autres méthodes, notons aussi que si on utilise les adresses temporaires de notre RFC 8981 mais qu'on configure sa machine pour mettre dynamiquement à jour un serveur DNS avec cette adresse, le nom de domaine suffirait alors à suivre l'utilisateur à la trace !
La section 2.2 commence à discuter des solutions possibles. DHCPv6 (RFC 3315, notamment la section 12) serait évidemment une solution, mais qui nécessite l'administration d'un serveur. L'idéal serait une solution qui permette, puisque IPv6 facilite l'existence de plusieurs adresses IP par machine, d'avoir une adresse stable pour les connexions entrantes et une adresse temporaire, non liée à l'adresse MAC, pour les connexions sortantes, celles qui « trahissent » la machine. C'est ce que propose notre RFC, en générant les adresses temporaires selon un mécanisme pseudo-aléatoire (ou en tout cas imprévisible à un observateur extérieur).
Enfin, la section 3 décrit le mécanisme de protection lui-même. Deux algorithmes sont proposés mais il faut bien noter qu'une machine est toujours libre d'en ajouter un autre, le mécanisme est unilatéral et ne nécessite pas que les machines avec qui on correspond le comprennent. Il suffit que l'algorithme respecte ces principes :
Le premier algorithme est détaillé dans la section 3.3.1 et nécessite l'usage d'une source aléatoire, selon le RFC 4086. On génère un identifiant d'interface avec cette source (attention, certains bits sont réservés, cf. RFC 7136), on vérifie qu'il ne fait pas partie des identifiants réservés du RFC 5453, puis on la préfixe avec le préfixe du réseau.
Second algorithme possible, en section 3.3.2, une génération à partir de l'algorithme du RFC 7217, ce qui permet d'utiliser le même algorithme pour ces deux catégories d'adresses, qui concernent des cas d'usage différents. Le principe est de passer les informations utilisées pour les adresses stables du RFC 7217 (dont un secret, pour éviter qu'un observateur ne puisse déterminer si deux adresses IP appartiennent à la même machine), en y ajoutant le temps (pour éviter la stabilité), à travers une PRF comme SHA-256. Plus besoin de générateur aléatoire dans ce cas.
Une fois l'adresse temporaire générée (les détails sont dans la section 3.4), et testée (DAD), il faut la renouveler de temps en temps (sections 3.5 et 3.6, cette dernière expliquant pourquoi renouveler une fois par jour est plus que suffisant). L'ancienne adresse peut rester active pour les connexions en cours mais plus pour de nouvelles connexions.
Notez que le RFC impose de fournir un moyen pour activer ou débrayer ces adresses temporaires, et que cela soit par préfixe IP, par exemple pour débrayer les adresses temporaires pour les adresses locales du RFC 4193.
Maintenant que l'algorithme est spécifié, la section 4 du RFC reprend de la hauteur et examine les conséquences de l'utilisation des adresses temporaires. C'est l'occasion de rappeler un principe de base de la sécurité : il n'y a pas de solution idéale, seulement des compromis. Si les adresses temporaires protègent davantage contre le « flicage », elles ont aussi des inconvénients comme de rendre le débogage des réseaux plus difficile. Par exemple, si on note un comportement bizarre associé à certaines adresses IP, il sera plus difficile de savoir s'il s'agit d'une seule machine ou de plusieurs. (Le RFC 7217 vise justement à traiter ce cas.)
Et puis les adresses temporaires de notre RFC ne concernent que l'identifiant d'interface, le préfixe IP reste, et il peut être révélateur, surtout s'il y a peu de machines dans le réseau. Si on veut vraiment éviter le traçage par adresse IP, il faut utiliser Tor ou une technique équivalente (cf. section 9).
L'utilisation des adresses temporaires peut également poser des problèmes avec certaines pratiques prétendument de sécurité comme le fait, pour un serveur, de refuser les connexions depuis une machine sans enregistrement DNS inverse (un nom correspondant à l'adresse, via un enregistrement PTR). Cette technique est assez ridicule mais néanmoins largement utilisée.
Un autre conflit se produira, note la section 8, si des mécanismes de validation des adresses IP source sont en place dans le réseau. Il peut en effet être difficile de distinguer une machine qui génère des adresses IP temporaires pour se protéger contre les indiscrets d'une machine qui se fabrique de fausses adresses IP source pour mener une attaque.
Quelles sont les différences entre le précédent RFC et celui-ci ? La section 5 du RFC résume les importants changements qu'il y a eu depuis le RFC 4941. Notamment :
Passons maintenant aux mises en œuvre. L'ancienne norme, le RFC 4941, est appliqué par presque tous les
  systèmes d'exploitation, souvent de manière plus protectrice de la
  vie privée, par exemple en étant activé par défaut. Les
  particularités de notre nouveau RFC ne sont pas toujours d'ores et
  déjà présentes. Ainsi, il existe des patches
  pour
  FreeBSD et pour
  Linux mais pas forcément intégrés aux versions
  officielles. Sur
  Linux, le paramètre sysctl qui contrôle ce protocole est
  net.ipv6.conf.XXX.use_tempaddr où XXX est le
  nom de l'interface réseau, par exemple eth0. En
  mettant dans le fichier /etc/sysctl.conf :
# Adresses temporaires du RFC 8981 net.ipv6.conf.default.use_tempaddr = 2
  On met en service les adresses temporaires, non « pistables » pour
  toutes les interfaces (c'est le sens de la valeur
  default). Pour s'assurer que les réglages soient bien pris en
  compte, il vaut mieux faire en sorte que le module
  ipv6 soit chargé tout de suite (sur
  Debian, le mettre dans
  /etc/modules) et que les interfaces fixes aient
  leur propre réglage. Par exemple, sur Debian,
  on peut mettre dans /etc/network/interfaces :
iface eth2 inet dhcp pre-up sysctl -w net.ipv6.conf.eth2.use_tempaddr=2
Ou alors il faut nommer explicitement ses interfaces :
net.ipv6.conf.eth0.use_tempaddr = 2
  Notez aussi
  qu'ifconfig n'affiche pas quelles
  adresses sont les temporaires (mais ip addr
  show le fait).
Notons que l'adresse « pistable » est toujours présente mais
  vient s'y ajouter une adresse temporaire choisie au hasard. Selon
  les règles du RFC 6724, rappelées dans la
  section 3.1 de notre RFC, c'est cette adresse temporaire qui sera
  choisie, en théorie, pour les connexions sortantes (voir aussi le
  RFC 5014 pour une API permettant de contrôler ce
  choix). Avec Linux, il faut pour cela que
  use_tempaddr vale plus que un (sinon, l'adresse
  temporaire est bien configurée mais pas utilisée par
  défaut). ifconfig affichera donc :
wlan0     Link encap:Ethernet  HWaddr 00:13:e8:69:59:0d  
...
          inet6 addr: 2001:db8:32:aa12:615a:c7ba:73fb:e2b7/64 Scope:Global
          inet6 addr: 2001:db8:32:aa12:213:e8ff:fe69:590d/64 Scope:Global
puis, au démarrage suivant, l'adresse temporaire (la première ci-dessus) changera :
wlan0     Link encap:Ethernet  HWaddr 00:13:e8:69:59:0d
...
          inet6 addr: 2001:db8:32:aa12:48a9:bf44:5167:463e/64 Scope:Global
          inet6 addr: 2001:db8:32:aa12:213:e8ff:fe69:590d/64 Scope:Global
Sur NetBSD, il n'y a qu'une seule variable
  syscvtl pour toutes les interfaces. Il suffit donc de mettre dans
  /etc/sysctl.conf :
net.inet6.ip6.use_tempaddr=1
  Pour que l'adresse temporaire soit utilisée par défaut, c'est
  net.inet6.ip6.prefer_tempaddr.  Sur
  FreeBSD, je n'ai pas essayé, mais je suppose
  que les variables sysctl au nom bien parlant
  net.inet6.ip6.use_tempaddr et
  net.inet6.ip6.prefer_tempaddr sont là pour
  cela.
Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)
Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)