Difference between revisions of "SEND"

From Livre IPv6

(Génération d'une adresse CGA)
(Génération d'une adresse CGA)
Line 53: Line 53:
 
=== Génération d'une adresse CGA ===
 
=== Génération d'une adresse CGA ===
  
Le principe est de créer une association cryptographique (un fonction de hachage) entre une clé publique et une adresse IPv6.
+
Le principe est de créer une association cryptographique (avec fonction de hachage) entre une clé publique et une adresse IPv6.
  
Par la suite lorsque que l'on parlera d'adresse, il faudra comprendre les 64 bits les plus à droite : ceux de l'identifiant d'interface.
+
Par la suite, lorsque que l'on parlera d'adresse, il faudra comprendre les 64 bits les plus à droite : ceux de l'identifiant d'interface.
  
Une adresse CGA dépend d'abord d'un paramètre de sécurité, noté Sec, codé sur 3 bits. Cette valeur est encodé dans les 3 bits les plus à gauche de l'adresse. Elle est également associé à un ensemble de paramètres dit 'Paramètres CGA', dont une clé publique.
+
Une adresse CGA dépend d'abord d'un paramètre de sécurité, noté Sec, codé sur 3 bits. Cette valeur est encodé dans les 3 bits les plus à gauche de l'adresse. L'adresse CGA est également associée à un ensemble de paramètres dit 'Paramètres CGA', dont une clé publique.
Deux valeurs sont calculés à partir de ces paramètres CGA : Hash1 (sur 64 bits) et Hash2 (sur 112 bits).
+
Deux valeurs sont calculés à partir de ces paramètres CGA : '''Hash1''' (sur 64 bits) et '''Hash2''' (sur 112 bits).
  
 
Une adresse générée cryptographiquement (CGA address) est donc définie comme une adresse IPv6 vérifiant les propriétés suivantes:
 
Une adresse générée cryptographiquement (CGA address) est donc définie comme une adresse IPv6 vérifiant les propriétés suivantes:
* Hash1 est égal à l'identifiant d'interface. Les bits de la valeur Sec, et les bits u et g sont ignorés dans cette comparaison.
+
* '''Hash1''' est égal à l'identifiant d'interface. Les bits de la valeur Sec, et les bits u et g sont ignorés dans cette comparaison.
* Les 16*Sec bits les plus à gauche de Hash2 sont nuls.
+
* Les 16*Sec bits les plus à gauche de '''Hash2''' sont nuls.
 +
 
 +
En d'autres termes, si l'on définit les valeurs '''Mask1''' et '''Mask2''' de la façon suivante:
 +
* Mask1 (sur 64 bits) = 0x1cffffffffffffff
 +
* Mask2 (sur 112 bits) = 0x0000000000000000000000000000  si Sec=0,
 +
                          0xffff000000000000000000000000  si Sec=1,
 +
                          0xffffffff00000000000000000000  si Sec=2,
 +
                          0xffffffffffff0000000000000000  si Sec=3,
 +
                          0xffffffffffffffff000000000000  si Sec=4,
 +
                          0xffffffffffffffffffff00000000  si Sec=5,
 +
                          0xffffffffffffffffffffffff0000  si Sec=6, et
 +
                          0xffffffffffffffffffffffffffff  si Sec=7.
 +
 
 +
alors les propriétés définissant une adresse CGA peuvent se réécrire ainsi:
 +
* Hash1 & Mask1 == Identifiant d'interface & Mask1
 +
* Hash2 & Mask2 == 0x0000000000000000000000000000
  
 
== Signature RSA ==
 
== Signature RSA ==

Revision as of 15:51, 23 June 2006

SeND : SEcure Neighbor Discovery

Introduction

SeND (RFC 3971) est une version sécurisée de NDP (Neighbor Discovery Protocol, RFC 2461 et RFC 2462), le protocole de découverte de voisins d'IPv6.

Il est conseillé de connaitre un minimum ce protocole (voir Découverte de voisins) et posséder quelques notions de sécurité (voir Sécurité, Généralités) avant de lire ce chapitre.

Après un état des lieux des problèmes de sécurité lié à NDP (RFC 3756), les travaux ont commencés afin de répondre à chacune des menaces décrites dans ce document. IPSec avait été envisagé à l'époque de la conception de NDP pour sécuriser ce dernier, mais cela s'est révélé inapproprié en pratique.

La première innovation est l'utilisation de CGA (RFC 3972) pour Cryptographically Generated Addresses, qui permet de créer des identifiants d'interfaces à partir d'une clé publique.

Le deuxième mécanisme important de SEND est la possibilité de découvrir automatiquement un chemin de certification sur le réseau.

Une extension du protocole NDP

Le protocole SEND ajoute des fonctions de sécurité grace à l'ajout d'options au messages NDP.

Voici la structure de tels paquets :

                    <------------NDP Message---------------->
*-------------------------------------------------------------*
| IPv6 Header      | ICMPv6   | ND Message- | ND Message      |
| Next Header = 58 | Header   | specific    | Options         |
| (ICMPv6)         |          | data        |                 |
*-------------------------------------------------------------*
                    <--NDP Message header-->

L'option CGA permet de vérifier l'identité d'une machine émettrice d'un paquet NDP. Cette option contient entre autre la clé publique de la machine émettrice, dont la cohérence avec l'adresse source utilisée est vérifiée par la machine réceptrice.

L'option RSA contient une signature du paquet, calculée avec la clé privée de la machine émettrice. Le noeud recevant le paquet peut vérifier l'intégrité at l'authenticité du paquet, grâce à la clé publique reçue conjointement ou précédemment.

La confiance dans la clé publique utilisée par les options CGA et RSA se base sur un mécanisme de certification décrit dans les chapitres suivants.

Une option d'horodatage (Timestamp) est utilisée pour protéger NDP des attaques de type 'rejeu'.

Une option unicité (NOnce) est utilisée pour protéger les associations Demande/Réponse (Solicit/Advertisement) : une réponse NDP devra contenir la même valeur NOnce que la demande correspondante pour être valide.

Enfin deux options (Certicate Path Solicitation et Certificate Path Advertisement) sont utilisées afin de permettre la découverte automatique par une machine terminal d'un chemin de certification. Ce mécanisme permet à des machines utilisant l'auto configuration sans état (RFC 2462) de vérifier la légitimité d'un routeur et celle des préfixes publiés sur le lien auprès d'un tiers de confiance sur le réseau.

Ces options sont utilisées par NDP uniquement lorsque cela est nécessaire, c'est à dire pour se protéger d'un risque d'attaque spécifique.

Adresses CGA

Une adresse CGA (Cryptographically Generated Address) est utilisée afin de prouver, en temps qu'émetteur d'un message NDP, que l'on bien le propriétaire de l'adresse source utilisée : afin prouver son identité réseau. Une paire de clé Publique/Privée est générée pour chaque noeud voulant prouver la possession d'une adresse.

Le mécanisme de génération CGA crée la partie identifiant d'interface d'une adresse IPv6, à partir d'une clé publique et d'autres paramètres, comme le mécanisme de configuration sans état. Cette adresse est ensuite utilisée comme adresse source du message NDP, auquel au ajoute également l'option CGA, qui contient les paramètres ayant servis à la génération de l'adresse. Ainsi le récepteur peut générer une adresse CGA à partir des données reçues via l'option du même nom, et comparer la CGA calculée avec la CGA utilisée comme adresse source. Elles doivent être identiques bien sûr.

Voyons ces deux phases en détails.

Génération d'une adresse CGA

Le principe est de créer une association cryptographique (avec fonction de hachage) entre une clé publique et une adresse IPv6.

Par la suite, lorsque que l'on parlera d'adresse, il faudra comprendre les 64 bits les plus à droite : ceux de l'identifiant d'interface.

Une adresse CGA dépend d'abord d'un paramètre de sécurité, noté Sec, codé sur 3 bits. Cette valeur est encodé dans les 3 bits les plus à gauche de l'adresse. L'adresse CGA est également associée à un ensemble de paramètres dit 'Paramètres CGA', dont une clé publique. Deux valeurs sont calculés à partir de ces paramètres CGA : Hash1 (sur 64 bits) et Hash2 (sur 112 bits).

Une adresse générée cryptographiquement (CGA address) est donc définie comme une adresse IPv6 vérifiant les propriétés suivantes:

  • Hash1 est égal à l'identifiant d'interface. Les bits de la valeur Sec, et les bits u et g sont ignorés dans cette comparaison.
  • Les 16*Sec bits les plus à gauche de Hash2 sont nuls.

En d'autres termes, si l'on définit les valeurs Mask1 et Mask2 de la façon suivante:

* Mask1 (sur 64 bits) = 0x1cffffffffffffff
* Mask2 (sur 112 bits) = 0x0000000000000000000000000000  si Sec=0,
                         0xffff000000000000000000000000  si Sec=1,
                         0xffffffff00000000000000000000  si Sec=2,
                         0xffffffffffff0000000000000000  si Sec=3,
                         0xffffffffffffffff000000000000  si Sec=4,
                         0xffffffffffffffffffff00000000  si Sec=5,
                         0xffffffffffffffffffffffff0000  si Sec=6, et
                         0xffffffffffffffffffffffffffff  si Sec=7.

alors les propriétés définissant une adresse CGA peuvent se réécrire ainsi:

  • Hash1 & Mask1 == Identifiant d'interface & Mask1
  • Hash2 & Mask2 == 0x0000000000000000000000000000

Signature RSA

Options horodatage et 'NOnce'

Découverte dynamique du chemin de certification

Implementations connues

  • Docomo (mai 2006, implémentation complète sous license GPL, [1] )
  • Alcatel (septembre 2005, implémentation des options CGA et RSA, [2])
Personal tools