Sur les serveurs Linux, on souhaite parfois disposer d’échanges sécurisés sans devoir se soucier des protocoles mis en œuvre. On peut souvent utiliser des surcouches telles que smtps ou smtp-tls, ftp-tls, scp, rsync over ssh, ou votre-protocole-préféré-sur-ssh, mais cela peut s’avérer compliqué.

Lorsque l’on souhaite surtout sécuriser les transferts entre 2 ou 3 stations Linux, on peut aujourd’hui utiliser très facilement IPSEC. Cette norme, qui définit des extensions au protocole IP qui se charge du transfert d’informations entre 2 machines, permet d’authentifier les machines, et de chiffrer tout contenu échangé entre ces dernières.

Ipsec est cependant une norme très complexe : la RFC2401 (cliquez pour une version en français) présente les différents protocoles mis en jeux : AH pour l’authentification, ESP pour le chiffrement des contenus, mais aussi IKE pour l’échange de clé.

Notre but étant de faire simple, nous n’allons pas utiliser IKE ici. Il vous suffira en effet d’échanger manuellement les clés entre les 2 ou 3 machines, et ce de manière statique, quitte à renouveler ces dernières régulièrement si vous êtes paranoïaques …

On utilisera pour cela le package debian ipsec-tools, qui contient tout le nécessaire. Ah, il faut aussi disposer d’un noyau Linux supportant Ipsec, à savoir disposant des modules esp4, ah4 (pour ESP et AH sur IPV4) ainsi que les modules de cryptographie, tels que md5, des ou aes etc. (selon les algos retenus pour la signature et le chiffrement.)

On configure ensuite le package ipsec-tools en créant un fichier /etc/ipsec-tools.conf comme suit :
Cet exemple configure AH et ESP entre 192.168.0.10 et 192.168.0.6. Tout d’abord la configuration sur 192.168.0.6 :


#!/usr/sbin/setkey -f
flush;
spdflush;

# AH SAs cle de 128 bits :
add 192.168.0.6 192.168.0.10 ah 0x200 -A hmac-md5 0xc0291ff014dccdd03874d9e8e4cdf3e6;
add 192.168.0.10 192.168.0.6 ah 0x300 -A hmac-md5 0x96358c90783bbfa3d7b196ceabe0536b;

# ESP SAs cle de 192 bits (168 + 24 de parite) :
add 192.168.0.6 192.168.0.10 esp 0x201 -E 3des-cbc 0x7aeaca3f87d060a12f4a4487d5a5c3355920fae69a96c831;
add 192.168.0.10 192.168.0.6 esp 0x301 -E 3des-cbc 0xf6ddb555acfd9d77b03ea3843f2653255afe8eb5573965df;

# Normes de securite imposees :
spdadd 192.168.0.6 192.168.0.10 any -P out ipsec esp/transport//require ah/transport//require;
spdadd 192.168.0.10 192.168.0.6 any -P in ipsec esp/transport//require ah/transport//require;

Puis celle sur 192.168.0.10 (on recopie généralement le fichier ipsec-tools.conf via scp d’une machine à l’autre) :


#!/usr/sbin/setkey -f
flush;
spdflush;

# AH SAs cle de 128 bits :
add 192.168.0.6 192.168.0.10 ah 0x200 -A hmac-md5 0xc0291ff014dccdd03874d9e8e4cdf3e6;
add 192.168.0.10 192.168.0.6 ah 0x300 -A hmac-md5 0x96358c90783bbfa3d7b196ceabe0536b;

# ESP SAs cle de 192 bits (168 + 24 de parité) :
add 192.168.0.6 192.168.0.10 esp 0x201 -E 3des-cbc 0x7aeaca3f87d060a12f4a4487d5a5c3355920fae69a96c831;
add 192.168.0.10 192.168.0.6 esp 0x301 -E 3des-cbc 0xf6ddb555acfd9d77b03ea3843f2653255afe8eb5573965df;

# Normes de sécurite imposées :
spdadd 192.168.0.6 192.168.0.10 any -P in ipsec esp/transport//require ah/transport//require;
spdadd 192.168.0.10 192.168.0.6 any -P out ipsec esp/transport//require ah/transport//require;

Notez la seule différence entre ces fichiers : l’ordre IN / OUT dans les 2 lignes SPDADD …

Il faut bien évidemment générer vos propres clés, à savoir les zones commençant pas 0x. les 2 premières étant des clés de 128 bits, il faut y mettre 32 octets hexadecimaux, et 48 pour les clés 3des-cbc.

Le plus simple pour obtenir ces clés aléatoirement est de se baser sur le périphérique /dev/urandom de votre machine, en procédant ainsi :


# Affiche 32 caractères hexadécimaux aléatoires :
hexdump -e '8/2 "%04x" ' /dev/urandom -n 16; echo

# Affiche 48 caractères hexadécimaux aléatoires :
hexdump -e '8/2 "%04x" ' /dev/urandom -n 24; echo

et voilà. Une fois que vous avez généré vos clés AH et ESP pour chaque paire de machines (ip source / ip destination), lancez le chiffrement forcé en utilisant


/etc/init.d/setkey start

Ensuite, vous pourrez vérifier que le dialogue entre 2 machines utilisant IPSEC est bien chiffré grâce à tcpdump :


# tcpdump -n "host 192.168.0.6"
01:23:27.996891 IP 192.168.0.10 > 192.168.0.6: AH(spi=0x00000302,seq=0x1): ESP(spi=0x00000303,seq=0x1), length 88
01:23:27.998282 IP 192.168.0.6 > 192.168.0.10: AH(spi=0x00000202,seq=0x277ac2): ESP(spi=0x00000203,seq=0x277ac2), length 88
01:23:28.999853 IP 192.168.0.10 > 192.168.0.6: AH(spi=0x00000302,seq=0x2): ESP(spi=0x00000303,seq=0x2), length 88
01:23:29.001726 IP 192.168.0.6 > 192.168.0.10: AH(spi=0x00000202,seq=0x277ac3): ESP(spi=0x00000203,seq=0x277ac3), length 88
4 packets captured
15653 packets received by filter
0 packets dropped by kernel

pas bavard hein ?

PS: on me signale qu’il peut être alors nécessaire de signaler au pare-feu qu’il ne doit accepter que le trafic ipsec entre les machines. Cela peut-être utile en effet si l’on veut imposer un dialogue sécurisé lorsque ispec-tools est off, mais sachez qu’une fois ipsec-tools lancé, le noyau Linux imposera (c’est le rôle des lignes avec spdadd) le chiffrement et l’authentification des paquets échangés entre ces 2 machines. Il n’est donc pas vraiment nécessaire de filtrer très précisément le traffic entre vos stations ainsi sécurisées.

Catégories : français