3.5. IPSec

IPSec est un nouveau protocole basé sur IP qui autorise les liens chiffrés à la demande entre deux machines. La mise en œuvre d'IPSec est obligatoire dans le cadre d'IPv6 et peut être incorporée dans IPv4. Qu'IPSec soit obligatoire pour IPv6 ne signifie pas pour autant qu'il est systématiquement déployé par les administrateurs réseau. IPSec n'est pas facile à mettre en œuvre à cause des mécanismes de déploiement automatiques des clefs. Le DNS peut aider mais cette méthode n'est pas encore courante. En outre, les autorités de certification ne proposent pas d'outils pour un déploiement à grande échelle en entreprise.

3.5.1. FreeS/WAN

FreeS/WAN est une souche IPSec renommée pour GNU/Linux. La version actuelle (1.9.7) doit être patchée pour gérer les certificats X.509v3. Une telle version modifiée est disponible sur ce site. Certaines distributions l'incluent en standard, il est donc conseillé de commencer par vérifier si c'est le cas pour celle qu'on utilise. Cette version présente l'intérêt de permettre l'usage d'OpenSSL pour la création des certificats de FreeS/WAN et des enregistrements CERT du DNS. En outre, l'interaction avec la souche IPSec de Microsoft est réalisable. On se reportera à la page de Nate's pour davantage d'informations.

3.5.1.1. Passerelle FreeS/WAN

On crée un certificat dont le CN correspond au nom de domaine complètement qualifié de la passerelle IPSec, par exemple host.example.com. Ne pas oublier de signer le certificat. On dispose des deux fichiers newcert.pem et newreq.pem. Le fichier newreq.pem doit être édité pour ne plus contenir que la clef privée : on supprime tout ce qui n'est pas compris entre les balises --BEGIN RSA PRIVATE KEY-- et --END RSA PRIVATE KEY--. Il faut ensuite copier ces fichiers sur la passerelle en faisant attention à ce que le transfert soit sécurisé. Les fichiers de configuration de FreeS/WAN se trouvent dans le répertoire /etc/freeswan pour ma distribution. À ajuster suivant les cas.

mv newreq.pem /etc/freeswan/ipsec.d/private/host.example.com.key
mv newcert.pem /etc/freeswan/ipsec.d/host.example.com.pem

On copie le certificat racine dans le répertoire de configuration de FreeS/WAN. Il ne faut copier que le certificat, pas la clef.

mv cacert.pem /etc/freeswan/ipsec.d/cacerts

On génère une liste de révocation ou on copie l'existante à l'emplacement adéquat :

openssl ca -genrcl -out /etc/freeswan/ipsec.d/crls/crl.pem

Toujours sur la passerelle, on inclut dans le fichier ipsec.secrets la ligne ci-dessous :

: RSA host.example.com.key
 "password"

Le mot de passe est celui qui a servi à créer la paire de clef. On configure le fichier ipsec.conf comme suit :

config setup
interfaces=%defaultroute
klipsdebug=none
plutodebug=none
plutoload=%search
plutostart=%search
uniqueids=yes
conn %default
keyingtries=1
compress=yes
disablearrivalcheck=no
authby=rsasig
leftrsasigkey=%cert
rightrsasigkey=%cert
conn roadwarrior-net
leftsubnet=<sous_reseau>/<masque_de_sous_reseau>
also=roadwarrior
conn roadwarrior
right=%any
left%defaultroute
leftcert=host.example.com.pem
auto=add
pfs=yes

Comme on peut le voir, deux liens sont établis, l'un avec la passerelle, l'autre avec le réseau situé derrière la passerelle. Ceci s'avère très pratique si un pare-feu ou un traducteur d'adresses est actif sur la passerelle. La configuration autorise tout propriétaire d'un certificat valide à se connecter à la passerelle.

3.5.1.2. Client FreeS/WAN

La procédure est semblable. Il faut créer un certificat dont le CN correspond au nom de domaine complètement qualifié de l'hôte, par exemple clienthost.example.com. Le certificat doit être signé par la même autorité de certification que la passerelle. Le lien est alors autorisé.

Comme pour la passerelle, on copie de façon sécurisée les fichiers suivants dans les répertoires de configuration :

mv newreq.pem /etc/freeswan/ipsec.d/private/clienthost.example.com.key
mv newcert.pem /etc/freeswan/ipsec.d/clienthost.example.com.pem

On copie le certificat racine dans le répertoire de configuration de FreeS/WAN. Il ne faut copier que le certificat, pas la clef.

mv cacert.pem /etc/freeswan/ipsec.d/cacerts

On génère une liste de révocation ou on copie l'existante à l'emplacement adéquat :

openssl ca -genrcl -out /etc/freeswan/ipsec.d/crls/crl.pem

Enfin, on copie le certificat (mais pas la clef privée) de la passerelle :

mv host.example.com.pem /etc/fresswan/ipsec.d/host.example.com.pem

Le fichier ipsec.secrets est édité de la même façon pour charger la clef privée :

: RSA clienthost.example.com.key
 "password"

On édite le fichier ipsec.conf pour activer la connexion :

config setup
interfaces=%defaultroute
klipsdebug=none
plutodebug=none
plutoload=%search
plutostart=%search
uniqueids=yes
conn %default
keyingtries=0
compress=yes
disablearrivalcheck=no
authby=rsasig
leftrsasigkey=%cert
rightrsasigkey=%cert
conn roadwarrior-net
left=(ip of host)
leftsubnet=(gateway_host_subnet)/(gateway_host_netmask)
also=roadwarrior
conn roadwarrior
left=(ip of host)
leftcert=host.example.com.pem
right=%defaultroute
rightcert=clienthost.example.com.pem
auto=add
pfs=yes

On met ensuite le VPN en action :

ipsec auto --up roadwarrior
ipsec auto --up roadwarrior-net

Afin que le lien s'établisse automatiquement, on remplace dans le fichier de configuration la directive « auto=add » par « auto=start ».

3.5.1.3. Client MS Windows 2000/XP

La procédure est identique à celle du client FreeS/WAN. On crée un certificat, par exemple pour winhost.example.com, qui doit à présent être converti au format pkcs12. On se reportera à la section « MS Outlook et les certificats » pour le détail de la marche à suivre. On s'assure de ce que le fichier .p12 est attaché au certificat de l'autorité de certification racine.

On note le résultat de la commande :

openssl x509 -in cacert.pem -noout -subject

Ce fichier doit être copié de façon sécurisée sur la machine MS Windows.

On installe à présent l'utilitaire ipsec.exe de Marcus Muller, par exemple dans le répertoire c:\ipsec.

On ouvre la console de gestion Microsoft (Microsoft Management Console/MMC) puis on clique sur « Add/Remove Snap-in », « Add », « Certificates », « Add », « Computer Account » et « Next ». On choisit alors « Local computer » et « Finish ». Dans « IP Security Policy Management », choisir « Add », « Local Computer » puis « Finish », « Close » et enfin « OK ».

On peut à présent ajouter le certificat .p12.

On clique sur la flèche d'ajout pour « Certificates (Local Computer) » puis avec le bouton droit sur « Personal » avant de cliquer sur « All Tasks », « Import » et « Next ». On renseigne ensuite le chemin d'accès au fichier .p12 (ou on navigue pour atteindre le fichier) et on clique sur « Next ». On rentre alors le mot de passe de protection du fichier puis on clique sur « Next ». On choisit « Automatically select the certificate store based on the type of certificate », « Next », « Finish » et on répond positivement à toutes les questions qui se présentent. On sort de la console et on enregistre la séquence correspondante dans un fichier pour ne pas avoir à se la farcir à chaque fois.

On installe ipsecpol.exe (Windows 2000) ou ipseccmd.exe (Windows XP) comme indiqué dans la documentation de l'utilitaire ipsec. On édite le fichier ipsec.conf de la machine MS Windows en remplaçant "RightCA" par la sortie de la commande « openssl x509 -in cacert.pem -noout -subject »; mise en forme comme indiqué ci dessous (il faut remplacer les / par des virgules et changer le nom de quelques champs comme indiqué dans l'exemple) :

conn roadwarrior
left=%any
right=(ip_du_systeme_distant)
rightca="C=FJ, ST=Fiji, L=Suva, O=SOPAC, OU=ICT, CN=SOPAC Root"
network=auto
auto=start
pfs=yes
conn roadwarrior-net
left=%any
right=(ip_du_systeme_distant)
rightsubnet=(sous_reseau)/(masque_de_sous_reseau)
rightca="C=FJ, ST=Fiji, L=Suva, O=SOPAC, OU=ICT, CN=SOPAC Root"
network=auto
auto=start
pfs=yes

On démarre à présent le lien.

Pour cela on invoque la commande « ipsec.exe ». Voici un exemple de sortie de cette commande :

C:\ipsec>ipsec
IPSec Version 2.1.4 (c) 2001,2002 Marcus Mueller
Getting running Config ...
Microsoft's Windows XP identified
Host name is: (local_hostname)
No RAS connections found.
LAN IP address: (local_ip_address)
Setting up IPSec ...
Deactivating old policy...
Removing old policy...
Connection roadwarrior:
MyTunnel : (local_ip_address)
MyNet : (local_ip_address)/255.255.255.255
PartnerTunnel: (ip_of_remote_system)
PartnerNet : (ip_of_remote_system)/255.255.255.255
CA (ID) : C=FJ, ST=Fiji, L=Suva, O=SOPAC, OU=ICT, CN=SOPAC Root...
PFS : y
Auto : start
Auth.Mode : MD5
Rekeying : 3600S/50000K
Activating policy...
Connection roadwarrior-net:
MyTunnel : (local_ip_address)
MyNet : (local_ip_address)/255.255.255.255
PartnerTunnel: (ip_of_remote_system)
PartnerNet : (remote_subnet)/(remote_netmask)
CA (ID) : C=FJ, ST=Fiji, L=Suva, O=SOPAC, OU=ICT, CN=SOPAC Root...
PFS : y
Auto : start
Auth.Mode : MD5
Rekeying : 3600S/50000K
Activating policy...
C:\ipsec>

On émet un ping vers la passerelle qui devrait afficher « Negotiating IP Security » pendant quelques instants avant de répondre au ping. Pour une T1 qui attaque un VPN derrière un modem cable, il s'écoule typiquement de trois à quatre pings. Une fois la même chose faite depuis le réseau interne à l'autre extrémité du lien, ce dernier devrait être opérationnel.