Openstuff Wiki : HowtoIPsec

HomePage :: Categories :: PageIndex :: RecentChanges :: RecentlyCommented :: Login/Register

Création d'un tunnel IPsec basé sur des certificats X.509


1 Un peu de théorie


IPsec est une extension du protocole IP permettant de sécuriser les échanges en mettant en place de l'authentification ou du chiffrage. Il est implémenté dans IPv6 et a été backporté pour IPv4. Commençons par quelques notions relatives à IPsec ...

1.1 Associations et politique de sécurité


Les communications peuvent être protégées suivant deux modèles:

Pour cela, IPsec met en oeuvre des associations de sécurité SA. Ces associations sont unidirectionnelles et définissent les mécanismes de sécurité à appliquer. Ces associations sont stockées dans une SAD (Security Association Database) qui contient donc l'ensemble des associations de sécurité. Une association regroupe différentes informations, dont:

Il reste à savoir quel trafic protéger. Ces informations font partit de la politique de sécurité SP (Security Policy) et sont stockés dans la SPD (Security Policy Database). Cette base précise, en fonction de différents critères, les actions à effectuer sur un paquet. Une SP définie les informations suivantes:


1.2 Extentions IPsec


Il y a deux principales extensions IPsec:


1.3 Le protocole IKE


Il existe deux méthodes pour la configuration des associations de sécurité. La première, qui est la plus simple, est la gestion manuelle. Cette méthode se trouve rapidement inadaptée dans un réseau important et est complètement statique (pas renouvellement des clés). La seconde, permet la gestion automatique. Elle s'appuie sur le protocole IKE (Internet Key Exchange). Ce protocole nécessite:

Ce protocole fonctionne en deux phases: la première authentifie les machines et effectue un échange Diffie-Hellman. Puis, la seconde négocie les associations de sécurité. Les clés sont régulièrement re-généré pour s'assurer de la confidentialité.

Pour plus d'information, voir le document de Pascal Gachet sur la Gestion des clés pour Ipsec.

2 Un peu de pratique, enfin :)


Pour cette partie nous allons utiliser un noyau Linux 2.6 avec IPsec-Tools sur une distribution Debian. Nous testerons ici uniquement que le mode transport avec deux machines ayant les adresses 10.234.68.116 et 10.234.68.126.

2.1 Noyau et outils


Veillez à activer les options suivantes dans votre noyau:
  PF_KEY sockets (NET_KEY) [Y/n/m/?] y
  IP: AH transformation (INET_AH) [Y/n/m/?] y
  IP: ESP transformation (INET_ESP) [Y/n/m/?] y
  IP: IPsec user configuration interface (XFRM_USER) [Y/n/m/?] y

Cryptographic API (CRYPTO) [Y/n/?] y
  HMAC support (CRYPTO_HMAC) [Y/n/?] y
  Null algorithms (CRYPTO_NULL) [Y/n/m/?] y
  MD5 digest algorithm (CRYPTO_MD5) [Y/n/m/?] y
  SHA1 digest algorithm (CRYPTO_SHA1) [Y/n/m/?] y
  DES and Triple DES EDE cipher algorithms (CRYPTO_DES) [Y/n/m/?] y
  AES cipher algorithms (CRYPTO_AES) [Y/n/m/?] y


Vous pouvez normalement vérifier les options actuelles dans
/boot/config-2.6.*


Si elles y sont déjà, passez à la suite ! Sinon, vous avez gagné le droit de recompiler votre noyau :)

L'installation des outils est assez simple, il suffit d'installer le package ipsec-tools :
apt-get install ipsec-tools


2.2 Ipsec, configuration manuelle (setkey mon ami !)


2.2.1 Configuration

Ici, il va falloir configurer l'ensemble des paramètres à la mimine. On va donc créer un fichier /etc/setkey.conf sur la machine 10.234.68.126:

#!/usr/sbin/setkey -f

# Flush la SAD et la SPD
flush;
spdflush;

# AH SA - clés de 128 bit
add 10.234.68.116 10.234.68.126 ah 0x200 -A hmac-md5
0xc72181f57a580f2ea6be8ab39f3e0b9c;
add 10.234.68.126 10.234.68.116 ah 0x300 -A hmac-md5
0x0b6c39e262cda3d40bbb0285c9ed1294;

# ESP SA - clés de 192 bit
add 10.234.68.116 10.234.68.126 esp 0x201 -E 3des-cbc
0xd9bedb8247335346f6db6e08cdf25589fd863cdbf7444139;
add 10.234.68.126 10.234.68.116 esp 0x301 -E 3des-cbc
0xd05c9f4bf6bed221d8d21251759d87c3dc6983d9d01b9719;

# Security policies
spdadd 10.234.68.116 10.234.68.126 any -P in ipsec
	       esp/transport//require
	       ah/transport//require;
	       
spdadd 10.234.68.126 10.234.68.116 any -P out ipsec
	       esp/transport//require
	       ah/transport//require;


Pour l'autre machine (10.234.68.116), repartir du même fichier en corrigeant les lignes spdadd en inversant le in et le out :

spdadd 10.234.68.116 10.234.68.126 any -P in ipsec
devient
spdadd 10.234.68.126 10.234.68.116 any -P out ipsec


Générer vos propres clés avec les commandes suivantes:
$ # clés de 128 bit
$ dd if=/dev/random count=16 bs=1| xxd -ps
0a9d75684bdb3f0b724f0734c837b878
16+0 records in
16+0 records out
16 bytes (16 B) copied, 0.000223961 seconds, 71.4 kB/s

$ # clés de 192 bit
$ dd if=/dev/random count=24 bs=1| xxd -ps
1df0116962e08502727b4af4dc9b92c3eb7261401e2b57b7
24+0 records in
24+0 records out
24 bytes (24 B) copied, 0.000357197 seconds, 67.2 kB/s


Pensez également à restreindre les droits sur le fichier:
# chmod 600 /etc/setkey.conf


2.2.2 Mise en place

Une fois la configuration faite, chargez la avec :
# setkey -f /etc/setkey.conf


Vous pouvez afficher l'état de la SAD et de la SPD via les commandes suivantes:
# setkey -D
No SAD entries.
# setkey -DP
10.234.68.116[any] 10.234.68.126[any] any
	    in ipsec
	    esp/transport//require
	    ah/transport//require
	    created: Apr 30 16:09:24 2007  lastused:                     
	    lifetime: 0(s) validtime: 0(s)
	    spid=448 seq=2 pid=6182
	    refcnt=1
10.234.68.126[any] 10.234.68.116[any] any
	    out ipsec
	    esp/transport//require
	    ah/transport//require
	    created: Apr 30 16:09:24 2007  lastused:                     
	    lifetime: 0(s) validtime: 0(s)
	    spid=465 seq=1 pid=6182
	    refcnt=1
10.234.68.116[any] 10.234.68.126[any] any
	    fwd ipsec
	    esp/transport//require
	    ah/transport//require
	    created: Apr 30 16:09:24 2007  lastused:                     
	    lifetime: 0(s) validtime: 0(s)
	    spid=458 seq=0 pid=6182
	    refcnt=1


La SAD est vierge, car aucun trafic n'a été généré entre nos machines. Donc aucune association de sécurité n'est encore active.

2.2.3 Tests

Maintenant, lançons un tcpdump sur une des machines, puis lançons un ping sur l'autre:
# tcpdump -ni eth0 host 10.234.68.116 and  10.234.68.126
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

( nous lancons ici la commande "ping 10.234.68.126" sur l'autre machine)
16:15:20.823239 IP 10.234.68.116 > 10.234.68.126: AH(spi=0x00000200,seq=0x4): ESP(spi=0x00000201,seq=0x4)
16:15:20.823440 IP 10.234.68.126 > 10.234.68.116: AH(spi=0x00000300,seq=0x4): ESP(spi=0x00000301,seq=0x4)
16:15:21.822117 IP 10.234.68.116 > 10.234.68.126: AH(spi=0x00000200,seq=0x5): ESP(spi=0x00000201,seq=0x5)
16:15:21.822160 IP 10.234.68.126 > 10.234.68.116: AH(spi=0x00000300,seq=0x5): ESP(spi=0x00000301,seq=0x5)


Nous voyons bien la présence des entêtes AH et ESP. Maintenant, regardons de nouveau notre SAD:
# setkey -D
10.234.68.126 10.234.68.116 
	    esp mode=transport spi=769(0x00000301) reqid=0(0x00000000)
	    E: 3des-cbc  d05c9f4b f6bed221 d8d21251 759d87c3 dc6983d9 d01b9719
	    seq=0x00000000 replay=0 flags=0x00000000 state=mature 
	    created: Apr 30 16:10:48 2007   current: Apr 30 16:11:08 2007
	    diff: 20(s)     hard: 0(s)      soft: 0(s)
	    last: Apr 30 16:10:52 2007      hard: 0(s)      soft: 0(s)
	    current: 324(bytes)     hard: 0(bytes)  soft: 0(bytes)
	    allocated: 3    hard: 0 soft: 0
	    sadb_seq=3 pid=6215 refcnt=0
[...]


Magnifique, hein ?

2.2.4 Nettoyage

Pour supprimer les entrées dans la SAD et la SPD il suffit d'appliquer les commandes suivantes :
# setkey -F
# setkey -FP


2.3 Ipsec, configuration automatique avec Racoon


Ici, le protocole IKE va être utilisé pour authentifier les machines et négocier les différents paramètres. Il est possible d'authentifier les machines en utilisant:

Ici nous utiliserons des certificats X.509.

2.3.1 Installation et configuration de Racoon

Installation du package racoon:
apt-get install racoon


Nous allons maintenant définir les politiques de sécurités. Par rapport à la configuration manuelle, nous n'avons pas besoin de définir les associations de sécurité: racoon le fera pour nous !
Nous créons donc un fichier /etc/racoon/setkey.sh sur la machine 10.234.68.126 contenant:
spdflush;
spdadd 10.234.68.116 10.234.68.126 any -P in ipsec
	       esp/transport//require;
spdadd 10.234.68.126 10.234.68.116 any -P out ipsec
	       esp/transport//require;


Pour l'autre machine, il suffit d'inverser le in et le out. Donnez les droits d'exécution à ce fichier (chmod +x).

Maintenant passons a la configuration de Racoon via le fichier /etc/racoon/racoon.conf
path certificate "/etc/racoon/certs";

remote anonymous
{
	    # Some IPSec implementations have been found to
	    # be vulnerable when used in aggressive exchange
	    # mode
	    exchange_mode main ;

	    # Allow for the extension described in RFC 2407
	    # called Domain of Interpretation which allows
	    # negotiation of the traditional 32-bit sequence
	    # numbers or extended 64-bit sequence numbers
	    doi ipsec_doi ;

	    # Local identifier is taken from the Subject field
	    # of the X.509 certificate (Distinguised Name)
	    my_identifier asn1dn ;

	    # Remote identifier is taken from the Subject field
	    # of the X.509 certificate presented by the remote
	    # peer (Distinguised Name)
	    peers_identifier asn1dn ;

	    # Checks that the oeer identity that appears in the
	    # ID payload matches the identity specified in the
	    # peers_identifier option
	    verify_identifier on ;

	    # Specifies the path to the certificate and private
	    # key files, encoded in PEM, relative to the
	    # "path certificate" option specified above
	    certificate_type x509 "machine.crt" "machine.key" ;

	    # Specifies the path to the CA certificate file,
	    # encoded in PEM, relative to the "path certificate"
	    # option specified above
	    ca_type x509 "ca.crt" ;

	    # Configures the size of the nonce in bytes, which
	    # must be no less than 8 and no more than 256
	    nonce_size 16 ;

	    # Lifetime the Phase 1 SA proposal
	    lifetime time 24 hour ;

	    proposal
	    {
	            # Encryption algorithm for phase 1
	            encryption_algorithm 3des ;

	            # Hash algorithm for phase 1
	            hash_algorithm sha1 ;

	            # RSA Signature authentication
	            authentication_method rsasig ;

	            # Diffie-Hellman group for phase 1
	            dh_group 2 ;
	    }
}

sainfo anonymous
{
	    # Diffie-Hellman group for phase 2
	    pfs_group 2;

	    # Lifetime for the SA
	    lifetime time 1 hour ;

	    # Encryption algorithms to be used in the SA
	    encryption_algorithm 3des, blowfish;

	    # Authentication algorithms to be used in the SA
	    authentication_algorithm hmac_sha1, hmac_md5 ;

	    # Use deflate compression (IPComp)
	    compression_algorithm deflate ;
}


Nous avons donc:

Attention, ces certificats sont tous au format PEM.

2.3.2 Mise en place

Lancement du démon Racoon avec les options de debug:
# racoon -F -v -f /etc/racoon/racoon.conf
Foreground mode.
2007-04-30 16:51:11: INFO: @(#)ipsec-tools 0.5.2 (http://ipsec-tools.sourceforge.net)
2007-04-30 16:51:11: INFO: @(#)This product linked OpenSSL 0.9.7e 25 Oct 2004 (http://www.openssl.org/)
2007-04-30 16:51:11: INFO: 10.234.68.126[500] used as isakmp port (fd=7)
2007-04-30 16:51:11: INFO: 10.234.68.126[500] used for NAT-T
2007-04-30 16:51:11: INFO: 127.0.0.1[500] used as isakmp port (fd=8)
2007-04-30 16:51:11: INFO: 127.0.0.1[500] used for NAT-T


Initialisation de la SPD:
# /etc/racoon/setkey.sh


2.3.3 Tests

Maintenant, refaisons notre ping ...
# ping 10.234.68.126
connect: Resource temporarily unavailable


Pas de panique ! La raison est que l'association n'a pas encore été faite. L'envoi du paquet a déclenché l'échange de clés, regardons les log de Racoon:
2007-04-30 16:53:48: INFO: respond new phase 1 negotiation: 10.234.68.126[500]<=>10.234.68.116[500]
2007-04-30 16:53:48: INFO: begin Identity Protection mode.
2007-04-30 16:53:48: INFO: received Vendor ID: DPD
2007-04-30 16:53:48: WARNING: unable to get certificate CRL(3) at depth:0 SubjectName:/C=FR/ST=...
2007-04-30 16:53:48: WARNING: unable to get certificate CRL(3) at depth:1 SubjectName:/C=FR/ST=...
2007-04-30 16:53:48: INFO: ISAKMP-SA established 10.234.68.126[500]-10.234.68.116[500] spi:6804e61587539a8b:96ccfa145aafcde6
2007-04-30 16:53:49: INFO: respond new phase 2 negotiation: 10.234.68.126[0]<=>10.234.68.116[0]
2007-04-30 16:53:50: INFO: IPsec-SA established: ESP/Transport 10.234.68.116->10.234.68.126 spi=86524214(0x5284136)
2007-04-30 16:53:50: INFO: IPsec-SA established: ESP/Transport 10.234.68.126->10.234.68.116 spi=184788808(0xb03a748)


Voyons ce que donne le tcpdump en relançant de nouveau un ping:
# tcpdump -ni eth0 host 10.234.68.116 and  10.234.68.126
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

16:54:57.542645 IP 10.234.68.116 > 10.234.68.126: ESP(spi=0x05284136,seq=0x1)
16:54:57.542839 IP 10.234.68.126 > 10.234.68.116: ESP(spi=0x0b03a748,seq=0x1)
16:54:58.547061 IP 10.234.68.116 > 10.234.68.126: ESP(spi=0x05284136,seq=0x2)
16:54:58.547107 IP 10.234.68.126 > 10.234.68.116: ESP(spi=0x0b03a748,seq=0x2)


On voit bien, une nouvelle fois, les entête ESP.

2.3.4 Automatisation

Cette configuration peut être appliqué automatiquement via les scripts de démarrage /etc/init.d/setket et /etc/init.d/racoon. Pensez à modifier le fichier /etc/default/setkey en dé-commentant la ligne suivante (setkey est désactivé par défaut):
 RUN_SETKEY=yes 

Pensez également à mettre la configuration de setkey dans le fichier /etc/ipsec-tools.conf.
Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by WikkaWiki
Page was generated in 0.0805 seconds