CIPE : Crypto IP Encapsulation
Le projet CIPE d'Olaf Titz est né de la volonté de créer un logiciel permettant de se passer du protocole PPP fréquemment utilisé dans ce domaine. Olaf a ainsi implémenté un ensemble de choix techniques permettant de créer très simplement un VPN.
Avant de commencer la description de CIPE et son utilisation, nous reviendrons sur les bases techniques concernant le tunneling et les VPN.
Un grand nombre de protocoles ne protègent pas leurs informations en les chiffrant. Si nous prenons le cas de POP3, on s'aperçoit alors que non seulement les messages électroniques circulent en clair sur le réseau mais également les noms d'utilisateurs et leurs mots de passe. Il est alors facile pour une personne malintentionnée d'écouter les communications entre client et serveur et de récupérer les informations qui l'intéresse. Sachant, de plus, qu'il existe un certain nombre de logiciels permettant d'automatiser la procédure (dsniff par exemple), c'est avec bien des tracas que l'on relève ses mails depuis un endroit peu sûr (du lieu de travail à la maison par exemple).
Bien sûr, il existe toujours la possibilité d'utiliser des versions spécifiques de ces protocoles. Mais, dans ce cas, on se heurte rapidement à un mur d'incompatibilités avec les applications clientes et serveurs. Or, le propre d'Internet est justement de conserver un minimum de compatibilité permettant à l'ensemble des machines du super réseau de communiquer.
Tunneling et VPN
La solution au problème qui vient d'être exposé est toute simple. Comme les protocoles peu sûrs ne peuvent être remplacés, il suffit de les utiliser sur un réseau protégé. L'astuce consiste alors à créer une connexion chiffrée entre le client et le serveur et c'est par l'intermédiaire de cette connexion que la liaison en clair s'effectuera. On crée ainsi un tunnel chiffré permettant la communication entre les machines.
Ce tunnel peut être créé sur plusieurs niveaux d'un réseau existant :
- au niveau réseau : les paquets circulant entre les machines sont chiffrés par un logiciel placé directement au-dessus du support réseau. C'est le cas pour CIPE.
- au niveau transport : c'est la liaison logique entre des programmes fonctionnant de concert sur les machines qui chiffrent la communication. Ces programmes interceptent les communications les concernant et les traitent à la volée. C'est le cas pour SSL par exemple.
- au niveau application : ici, c'est l'application elle-même qui protège ces communications. Cette méthode est celle qui offre le moins de compatibilité puisque client et serveur dialogue dans un "patois" qui leur est propre. Une application souhaitant être compatible avec la méthode de communication utilisée doit être calquée sur les spécifications de l'application d'origine. Tous les logiciels et plugins de chiffrement des clients mails entrent, par exemple, dans cette catégorie.
Un VPN ou Virtual Private Network (Réseau privé virtuel) est une généralisation du concept de tunnel. Il s'agit de faire circuler dans le tunnel non seulement les informations des applications, mais également tout ce qui concerne les couches réseau et transport. Ainsi, on crée un nouveau réseau à l'intérieur du tunnel. Vous imaginerez facilement les avantages d'un VPN en considérant deux réseaux locaux (LAN) ayant besoin d'être reliés via un réseau peu sûr comme Internet. Les deux LAN se relient par un tunnel traversant Internet et forment un nouveau LAN virtuel est sûr : le VPN.
Attention, il faut bien comprendre que même si les données (application + réseau) circulant dans le VPN reste inaccessibles depuis l'extérieur, les données continuent de circuler en clair à l'intérieur du VPN. Entendez par là que si une personne malintentionnée se trouve dans le VPN, elle pourra toujours écouter et analyser les informations y circulant.
Avec un système de type Unix (comme GNU/Linux), le VPN utilise un tunnel IP over IP, c'est-à-dire que le réseau virtuel est un réseau IP fonctionnant sur un réseau IP. Mais il est également possible de faire transiter n'importe quel protocole réseau dans un VPN. Vous pouvez, par exemple interconnecter deux réseaux IPX via un réseau IP tel qu'Internet.
Concernant les VPN en IP, il est d'usage d'utiliser des plages d'adresses réservées aux LAN (comme 192.168.0.0/16 ou 10.0.0.0/8). On évitera ainsi toute confusion entre adresses IP du VPN et celles d'Internet.
CIPE
CIPE est une implémentation de tunneling/VPN de type réseau. Il vous permet de constituer facilement un réseau :
- entre deux machines (via un LAN). Ceci permet, par exemple, de sécuriser la communication entre un serveur POP3 et un client situé sur le LAN. Dans ce cas, nous considérons que le LAN n'est pas sûr et que des personnes sont susceptibles d'écouter vos mails.
- entre deux LAN (via Internet).
La compilation et l'installation de CIPE est relativement simple, la suite classique de commande fera l'affaire :
$ ./configure --prefix=/usr
$ make
$ su
# make install
Notez cependant que vous devrez avoir en votre possession les bibliothèques OpenSSL (et les fichiers en-tête bien sûr) afin de compiler l'outil PKCIPE. Ce dernier permet de non seulement faciliter la configuration de CIPE, mais permet surtout de se passer de clefs statiques. PKCIPE vous permettra ainsi d'utiliser des signatures RSA et un échange de clefs Diffie-Hellman. Mais cet outil n'est pas indispensable au fonctionnement de CIPE.
Le ./configure accepte plusieurs paramètres vous permettant de personnaliser la compilation. Vous pouvez par exemple spécifier l'algorithme de chiffrement utilisé pour le tunnel :
- blowfish (par défaut)
- idea en spécifiant --enable-idea
Il vous est également possible de spécifier le protocole que CIPE devra utiliser :
- le protocole 3 (par défaut) est celui recommandé pour une utilisation classique de CIPE. Le périphérique CIPE fonctionnera comme un périphérique IP point-to-point (comme PPP ou SLIP).
- le protocole 4 (--enable-protocol=4) ne vous sera utile que dans des cas bien spécifiques où vous souhaitez faire transiter dans le tunnel autre chose que de l'IP. Le protocole 4 est semblable au 3, si ce n'est dans le fait qu'il transporte également les en-têtes de niveau liaison (modèle OSI). Le périphérique CIPE se verra également pourvu d'une adresse MAC que vous devrez spécifier dans le fichier de configuration. Vous ne devriez pas avoir besoin, en principe, du protocole 4.
Au terme du make install, vous devez posséder sur le système un ou plusieurs démons ciped et un ou plusieurs modules pour votre kernel.
Les modules et binaires du démon sont nommés en fonction de l'algorithme de chiffrement utilisé et du protocole utilisé :
module/binaire
chiffrement
protocole
cipcb.o/ciped-cb
blowfish
3
cipci.o/ciped-ci
idea
3
cipdb.o/ciped-db
blowfish
4
cipdi.o/ciped-di
idea
4
Les différents modules peuvent parfaitement cohabiter dans le kernel ainsi que les démons en mémoire.
Configuration et premier essai
Le démon CIPE quel qu'il soit utilise un fichier de configuration /etc/cipe/options. Tout comme PPP, il est également possible de placer dans ce répertoire des fichiers ip-up et ip-down qui seront respectivement exécutés lors de l'activation et la désactivation de l'interface CIPE.
Le fichier options ainsi que le répertoire où il sera placé devront appartenir à l'utilisateur root et les permissions de lecture et d'écriture définies uniquement pour cet utilisateur. Il est également possible de spécifier un fichier de configuration spécifique à l'aide de l'option -o du démon. Attention cependant, il sera impératif de spécifier le chemin complet (absolu) vers le fichier.
Voici un exemple simpliste de fichier de configuration :
# nous activons le débogage
# les messages seront envoyés sur STDERR
# et non dans le log système
debug
# Notre adresse IP dans le tunnel
# c-a-d l'adresse de notre interface
# CIPE
ipaddr
192.168.16.1
# L'adresse IP distante
# tout simplement celle de l'interface
# CIPE de l'hôte distant
ptpaddr
192.168.16.2
# Notre adresse IP réelle et
# le port sur lequel nous travaillons
me
192.168.0.10:6543
# L'adresse IP réelle de l'hôte
# distant
peer
192.168.0.51:6789
# Nous spécifions ici que nous n'utilisons
# pas de clef et donc pas de chiffrement
# il s'agit d'un simple test
nokey
En dehors des lignes de commentaire, notre fichier de configuration se limite à 6 lignes : difficile de faire plus simple. Nous avons ici deux machines sur un LAN : 192.168.0.10 et 192.168.0.51. Ces deux machines vont se connecter sous la forme d'un VPN. 192.168.0.10 deviendra 192.168.16.2 dans le VPN et 192.168.0.51 deviendra 192.168.16.1. Bien sûr, il faut également écrire un fichier de configuration pour 192.168.0.51 :
debug
ipaddr
192.168.16.2
ptpaddr
192.168.16.1
me
192.168.0.51:6789
peer
192.168.0.10:6543
nokey
Enfin, nous pouvons lancer nos démons (sans oublier, auparavant, de charger les modules CIPE dans le kernel) :
# modprobe cipcb
# ciped-cb -o /le/fichier/options
Nous procédons de même sur l'autre machine. Dès son lancement, le démon nous informera de ce qu'il fait (nous sommes en mode debug) :
CIPE daemon vers 1.5.2 (c) Olaf Titz 1996-2000
device=(none)
debug=yes
ipaddr=192.168.16.1
ptpaddr=192.168.16.2
mask=
bcast=
mtu=0
metric=0
cttl=0
me=192.168.0.10:6543
peer=192.168.0.51:6789
key=(none)
nokey=yes
socks=
tokxc=0
tokey=0
ipup=(none)
ipdown=(none)
arg=(none)
maxerr=8
tokxts=0
ping=0
toping=0
dynip=no
hwaddr=(none)
ifconfig=no
checksum=no
Using cipcb0 index 0
sending CT_CONFREQ
Nous pouvons immédiatement vérifier que tout fonctionne correctement avec ifconfig :
cipcb0 Link encap:IPIP Tunnel HWaddr
inet addr:192.168.16.1 P-t-P:192.168.16.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MTU:1442 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
Comme vous pouvez le constater, nous obtenons une nouvelle interface réseau (cipcb0). Nous pouvons à présent router la nouvelle machine :
# route add -host 192.168.16.2 dev cipcb0
puis immédiatement tester le VPN :
# ping 192.168.16.2
Si ça ne ping pas, contrôlez les messages apparaissant sur la console où vous avez lancé le démon. Il est fort probable que vous ayez un message comme celui-ci :
kxchg: recv: Connection refused
Plusieurs possibilités s'offrent alors :
- soit la clef utilisée pour le chiffrement n'est pas bonne (ce qui n'est pas le cas ici, puisque nous ne chiffrons pas la communication) ;
- soit les options (IP et port réel) ne sont pas correctes ;
- soit le démon CIPE de la machine distante n'est pas lancé.
Configuration avancée
Si tout fonctionne correctement dans la phase de test, vous pouvez passer aux choses sérieuses. La première manipulation consistera à éliminer la ligne nokey du fichier de configuration pour la remplacer par :
key
3248fd20adf9c00ccf9ecc2393bbb3e4
La clef statique est constituée d'une valeur sur 128 bits codée en hexadécimal. Vous pouvez obtenir une telle clef en utilisant, par exemple, l'utilitaire md5sum sur une entrée aléatoire :
# ps auxw | md5sum
4f2d6062aea6f4aaf80b606b6f291bd6
Lorsque la connexion utilisant une clef réussit, le démon vous gratifie d'un message vous indiquant le protocole et l'algorithme de chiffrement utilisé par l'hôte distant :
peer configuration info: proto=3, crypto=b, version=1.5, correct key parser
Vous disposez également d'un grand nombre d'autres paramètres vous permettant d'affiner la configuration de votre VPN :
- device permet de préciser le nom du périphérique CIPE. En l'absence de cette mention, la première interface sera utilisée.
- ping permet de préciser un intervalle en seconde pour un ping. Ceci permet de garder la connexion de manière continue. Par défaut, aucun ping n'est effectué. Attention, il s'agit d'un ping interne à CIPE et non un ping ICMP.
- ipup permet de spécifier le chemin et le nom d'un script à lancer à la place de /etc/cipe/ip-up.
- ipdown, idem mais pour /etc/cipe/ip-down.
- arg permet de spécifier un argument à envoyer aux scripts ip-up et ip-down.
Autres options spécifiques au protocole 4 :
- hwaddr permet de spécifier une adresse MAC pour l'interface CIPE utilisée en mode Ethernet.
- mask permet de préciser un net-masque pour l'interface CIPE.
- bcast permet de spécifier une adresse broadcast.
Conclusion
Comme nous l'avons sommairement vu, CIPE est un utilitaire aussi bien souple que puissant. Nous n'avons pas couvert ici les aspects concernant l'utilisation de PKCIPE soumise à la présence d'OpenSSL. Sachez simplement que dans ce cas, l'une des machines devra être serveur et l'autre cliente. Les clefs RSA utilisées devront être générées et extraites à l'aide des utilitaires rsa-keygen et openssl.
Vous trouverez dans la documentation au format info (source fournie) toutes les indications nécessaires à la mise en
uvre de PKCIPE. Cependant, dans bien des cas, un chiffrement à l'aide d'une clef statique de 128 bits sera suffisant.
Finissons cet article en signalant qu'une implémentation de CIPE existe pour Win32. Ceci vous permettra de "tolérer" la présence de machines Windows dans le VPN.
Liens
CIPE Homepage
http://sites.inka.de/~bigred/devel/cipe.html
Description complète du protocole CIPE
http://sites.inka.de/~bigred/devel/CIPE-Protocol.txt
CIPE Win32
http://cipe-win32.sourceforge.net/