next up previous contents
suivant: Bibliographie monter: OpenBSD Howto précédent: IPv6   Table des matières

Sous-sections


IPSEC et VPN [en construction]

OpenBSD implémente IPSec de manière native, il suffit donc de s'assurer que le support IPsec est activé et d'activer les extensions de confidentialité (ESP) et d'authentification (AH), puis de configurer les associations de sécurité. Les man de référence de cette section sont les suivants :

IPsec (4) - IP Security Protocol
ipsecadm (8) - interface to setup IPsec
photurisd (8) - IPsec key management daemon
vpn (8) - configuring the system for virtual private networks
isakmpd (8) - ISAKMP/Oakley a.k.a. IKE key management daemon
isakmpd.conf (5) - configuration file for isakmpd
isakmpd.policy (5) - policy configuration file for isakmpd

Les principaux fichiers de conf se trouvent dans /usr/share/ipsec :

attributes.conf     photuris.conf       rc.vpn
isakmpd             photuris.startup    secrets.conf


Activer le support IPSec et ses extensions

Options Kernel

Les options suivantes sont nécessaires, et normallement activées par défaut. Normallement, pas besoin de recompiler.

option    CRYPTO          # Cryptographic Framework
option    IPSEC           # IPSEC 
#option         KEY       # PF_KEY (implied by IPSEC)
pseudo-device   enc  1    # option IPSEC needs the encapsulation interface

Extensions IPSEC

Le fichier sysctl comprend les deux extensions IPSEC, ESP et AH, respectivement pour le chiffrement (l'authentification réalisée par l'extension ESP ne porte que sur l'extension elle-même) et l'authentification des paquets (AH).

#/etc/sysctl.conf
net.inet.ip.forwarding=1
net.inet.esp.enable=1
net.inet.ah.enable=1

Les clés de chiffrement IPSEC sont gérées par le biais d'associations de sécurité, configurées de manière manuelle dans le cas de tout petits réseaux comme le mien, ou par le biais d'un protocole approprié de type ISAKMP.

Configurer les associations de sécurité

Une association de sécurité consiste en une adresse de destination, un indice de paramètres de sécurité (SPI), aussi appelé SAID (Security Association Identifier) qui est en fait un nombre hexadécimal, et un protocole de sécurité (correspondant aux extensions de sécurité IPSec, AH ou ESP).

Configuration manuelle

Pour établir un tunnel entre deux machines dotée d'IP fixes, une gestion manuelle suffit. Il suffit pour ça d'éditer le script /usr/share/ipsec/rc.vpn.

Ce script appelle en fait ipsecadm (8), qui est l'interface de configuration d'IPSec. ipsecadm permet de créer une association de sécurité entre deux machines et, entre autres, de spécifier les algorythmes de chiffrement et d'authentification. L'exemple ci-dessous, adapté du man, définit une association de sécurité (AS) à base de 3DES pour le chiffrement, et de HMAC-SHA1 pour l'authentication :

Inutile de taper les commandes, c'est juste pour info ! 
(Cf plus bas, conf vpn.rc)
De A vers B :
# ipsecadm new esp -forcetunnel -enc 3des -auth sha1 -spi 1000 \
  -dst 169.20.12.2 \    
  -src 169.180.254.3 \
  -key 638063806380638063806380638063806380638063806380 \
  -authkey 1234123412341234123412341234123412341234

De B vers A (en changeant SPI et en intervertissant src et dest):
# ipsecadm new esp -forcetunnel -enc 3des -auth sha1 -spi 1001 \
  -dst 169.180.254.3 \    
  -src 169.20.12.2 \
  -key 638063806380638063806380638063806380638063806380 \
  -authkey 1234123412341234123412341234123412341234

J'ai laissé ``new esp'', sans vraiment connaitre la différence avec l'ancien, j'imagine que l'ancien est là pour des questions de compatibilité... On reconnait les champs ``destinataire'' et ``source'', correspondant aux IP des 2 extrémités du tunnel.

La clé de chiffrement spécifiée est n'importe quelle chaine hexadécimale définie par vous (si possible un peu plus aléatoire que celle de l'exemple :-), dont la longueur dépend de l'algorythme choisi. Pour un 3DES, la longueur est de 24 bytes.
Un bon moyen, pour générer une telle clé de manière la plus aléatoire possible est fournie dans le man vpn
 :

openssl rand 24 | hexdump -e '20/1 "%02x"'

Idem pour la clé d'authentification. Pour SHA1, la longueur est de 20 bytes (160 bits) contre 16 bytes si on avait choisi MD5.

Il faut ensuite de définir les flux inverses (en intervertissant dest et src, et en changeant le SPI) et créer les routes IPSec. La procédure est parfaitement décrite dans la FAQ OpenBSD, http://www.openbsd.org/faq/faq13.html#ManKey. Mais Il suffit pour tout ça de stocker ses clés quelque part et de renseigner une fois pour toute /usr/share/ipsec/vpn.rc :

% openssl rand 24 | hexdump -e '20/1 "%02x"' > /etc/esp-enc-key
% openssl rand 20 | hexdump -e '20/1 "%02x"' > /etc/esp-auth-key

Pour renseigner rc.vpn, la principale embrouille vient du fait que de nombreux exemples, sans doute soucieux de ne pas citer d'IP existantes, collent des adresses de type 192.168.* en guise d'IP externes. Attention je n'ai pas encore testé la conf ci-dessous, c'est juste pour l'instant ce qui m'a semblé le plus logique mais je ne suis pas sûre (suite pour les prochains épisodes :) :

# /usr/share/ipsec/rc.vpn
# Gateway adresses
GW_LOCAL=169.180.254.3    
GW_PEER=169.20.12.2 

# Local and remote networks, numbered, syntax <network>/<mask>
LOCAL_NET_0=192.168.10.0/255.255.255.0
REMOTE_NET_0=192.168.105.0/255.255.255.0

# Crypto options and keys, note that key/iv lengths need to correspond
# to the selected encryption and authentication algorithms.
ENC=3des
AUTH=sha1
SPI_OUT=1000
SPI_IN=1001
KEYFILE=/etc/esp-enc-key
AUTHKEYFILE=/etc/esp-auth-key

Configuration automatique : Photurisd et ISAKMP

Le démon Photurisd établit les associations de sécurité pour le traffic IPSec.

DN: Where does Photurisd fit in with IPSec?

NP: Key management...it will allow you to change your encryption keys every couple of minutes if you like. Hmm, let us say you have a network application which requires security, the application would tell the kernel: hey, I want this connection encrypted, the kernel would see if it already has encryption set up and if not, it would tell Photurisd: hey, please establish encryption keys between me and this remote host. All automatically, the application does not have to do know about it. You also get rid of all those long hex numbers used for manual keying.
Source : ``OpenBSD and IPSec, leading the pack'', Daemon News, 11/98.

[A suivre]

ISAKMP a lui la réputation d'être le plus complet des protocoles de gestion des associations de sécurité. Il permet de créer, gérer, détruire des associations de sécurité mais aussi d'authentifier les partenaires d'une association de sécurité. Pour l'utiliser il faut configurer ISAKMPD, qui est précisemment le démon chargé d'établir les associations de sécurité pour le traffic IPSEC, sur le serveur comme sur le client.

Fichiers de conf :

/etc/isakmpd.policy
/etc/isakmpd/isakmpd.conf

Un sample du 2eest disponible dans les sources :

cp /usr/src/sbin/isakmpd/samples/VPN-east.conf /etc/isakmpd/isakmpd.conf

Pour le détail des fichiers de conf voir http://www.realo.ca/ipsec.pdf.

[Pas encore testé, à suivre...]


Mettre en place les nouvelles règles de filtrage

Adapté pour PF/OpenBSD-3.* à partir des règles IPF/OpenBSD-2.4 de Kjell Wooding[3] :

GW_LOCAL=169.180.254.3    
GW_PEER=169.20.12.2 
LOCAL_NET=192.168.10.0/24
REMOTE_NET=192.168.105.0/24
# Interfaces :
Ext=tun0
Int=vr1
Cif=enc0

# [snip] votre politique par défaut

# Passing in encrypted traffic from security gateways
pass in log quick on $Ext proto esp from $GW_LOCAL to $GW_PEER
pass out log quick on $Ext proto esp from $GW_PEER to $GW_LOCAL

# Idem pour traffic authentifié si on veut (inutile pour mode tunnel)
# pass in log quick on $Ext proto ah from $GW_LOCAL to $GW_PEER
# pass out log quick on $Ext proto ah from $GW_PEER to $GW_LOCAL

# Allow packets to pass from the internal (local) side of the VPN
# to the internal (remote) side of the VPN. This traffic will get 
# encapsulated within the VPN tunnel on enc0 before going
# out the physical interface.

pass in log quick on $Int from $LOCAL_NET to $REMOTE_NET
pass out log quick on $Int from $REMOTE_NET to $LOCAL_NET

# If packets are on the encrypted interface, enc0, they have been
# authenticated / decrypted. Pass them.

pass in quick on $Cif
pass out quick on $Cif


next up previous contents
suivant: Bibliographie monter: OpenBSD Howto précédent: IPv6   Table des matières
maab 2003-03-13