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
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
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.
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).
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
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...]
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