Pffff IPSec la blague... Saviez-vous que dans le monde sérieux des entreprises qui gèrent des succursales, des partenaires et des tiers mainteneurs, IPSec est une réalité ? Peut-être que pour vous ce n'est pas le cas. D'autres solutions d'interconnexions sont pour vous plus abordables, plus simples à mettre en place. Peut-être aussi que pour vous IPsec est réservé à une élite... Ce n'est pas faux... IPSec est peut-être obscur, les solutions sont souvent chères ou difficiles à mettre en place, voire les deux à la fois. Mais ce qui est certain, c'est que c'est une solution propre, bien ficelée et surtout interopérable, aujourd'hui indispensable pour interconnecter son réseau avec d'autres. Avec OpenBSD, vous avez maintenant la possibilité de mettre en place simplement une solution au top. Allez, suis-moi maraud, on va leur montrer de quel bois on se chauffe à ces Juniper, Cisco et autres Enterasys.
1. Récupération, installation et compilation d'IPSec pour OpenBSD
Ne cherchez pas, il n'y a rien à faire en dehors d'installer OpenBSD sur la plate-forme de son choix (x86, amd64, macppc, zaurus, sparc...). IPSec est supporté de base. Simple non ?
2. Directement dans le vif du sujet qui brûle
Premier contact avec IPSec sur OpenBSD 4.0 :
 $ man -k ipsec
ipsec (4) - IP Security Protocol
ipsec.conf (5) - IPsec configuration file
ipsecctl (8) - control flows for IPsec
sasyncd (8) - IPsec SA synchronization daemon for
failover gateways
... de bon augure n'est-ce pas ?
3. IPSec fwwwwwWwwou FLASHBACK !
IPSec, quand on n'est pas ingénieur, ça fait peur. En fait, ça fait peur même aux ingénieurs. IPsec est un protocole imaginé par des collèges de normalisation qui ont voulu se faire plaisir : le résultat, c'est un machin complexe, sûrement trop complexe, qui oblige à être vigilant
<... suite du blabla classique qui accompagne IPsec...>. Mais bon, dans ce monde merveilleux des lutins IP, il n'y a pas encore de meilleure solution [1].
OpenBSD a ainsi été le premier système d'exploitation à inclure de base IPSec en 1997. En effet, en cette deuxième partie des années 1990, les législations concernant les moyens de chiffrement et leur exportation étaient relativement sévères, en particulier aux États-Unis.
Le projet OpenBSD basé au Canada et déjà très intéressé par l'intégration de ce genre d'outil a tout naturellement occupé cette place.
Mais, presque dix ans après, quoi de neuf ? Eh bien, pas grand-chose, en dehors d'une bonne interopérabilité entre les différentes implémentations libres ou commerciales. D'habitude, c'est là que je me mange : " ouais, c'est mort, maintenant il y a mieux, il y a OpenVPN (lecteur, insère ici ta solution de VPN SSL préférée) ". Ok, donc je disais l'interopérabilité... (là , généralement, les plus relous continuent avec OpenVPN et leur client multiplateforme). Et là je dis : " stop, ton OpenVPN tu le connectes comment aujourd'hui au Juniper ou au checkpoint de la Megacorp avec laquelle tu dois travailler ? ".
Bon et sinon IPSec...
man 4 ipsec
" Ipsec, c'est une paire de... protocoles, l'ESP (Encapsulating Security Payload) et l'AH (Authentication Header) qui fournissent les services pour sécuriser IP : la confidentialité, l'intégrité, l'authenticité, la protection... ". Après cela, on en sait un peu plus de ce que sont " AH ", " ESP ", les " SA ", les " SPI ", le mode tunnel, le mode transport, les " Lifetimes ". On découvre isakmpd(8) et aussi un exemple de configuration qui conceptualise un peu tout ça avec la mise en place d'un VPN (Virtual Private Network ou Réseau Privé Virtuel). Mais rassurez-vous, lecteur, pour le moment la seule chose que l'on doit retenir, c'est simplement que l'on veut mettre en place ce VPN.
4. Un VPN IPSec en 5 min ?
Qu'est-ce qu'un VPN ? D'après Wikipédia, un VPN est un réseau virtuel, car il relie deux réseaux " physiques " (réseaux locaux) par une liaison non fiable (par exemple, Internet) et privée, car seuls les ordinateurs des réseaux locaux, de part et d'autre du VPN, peuvent " voir " les données.
Avec IPSec, on peut monter un VPN avec le protocole ESP en mode tunnel. Par contre, pour éviter toute confusion et pour que les choses soient bien claires, quand on parle ici de monter un VPN IPSec, on parle bien de mettre en place une solution pour interconnecter deux réseaux, c'est-à -dire une solution de passerelle à passerelle.
Depuis la version 3.8 d'OpenBSD, une commande magique a fait son apparition : ipsecctl(8). Elle a gentiment écarté l'ancienne commande ipsecadm qui vient de disparaître du système. L'idée d'ipsecctl est de configurer un VPN IPSec de la même manière que l'on configure un firewall pf avec pfctl... tout un programme. Résultat : aujourd'hui, grâce à OpenBSD, on peut mettre IPSec entre toutes les mains.
Ce que j'ai oublié de dire, c'est que si vous voulez m'accompagner dans les travaux pratiques qui suivent, il ne vous faudra non pas installer un OpenBSD, mais installer deux machines sous OpenBSD. J'en vois qui ricanent déjà : " ah, elle est belle l'intéroperabilité ".
4.1 Le plan d'attaque
L'idée est de faire communiquer les deux réseaux IP " A " et " B " à travers les passerelles " Coker " et " Spud ", connues respectivement avec les adresses IP " 1.1.1.1 " et " 2.2.2.2 " sur un réseau ressemblant étrangement à Internet, mais en bien plus dangereux encore.

4.2 Première étape : configurons IPSec
Sur Coker :
# cat> /etc/ipsec.conf ike esp from 192.168.1.0/24 to 192.168.2.0/24 peer 2.2.2.2
Sérieusement, pour les utilisateurs de pf, cela ne vous rappelle-t-il pas quelque chose ?
Sur Spud :
# cat> /etc/ipsec.conf ike esp from 192.168.2.0/24 to 192.168.1.0/24 peer 1.1.1.1
4.3 Deuxième étape : installons de bons secrets
Pas de VPN sans secrets... Un des meilleurs alliés d'IPSec, c'est le certificat numérique X509 et OpenBSD ne déroge pas à cette règle. Toutefois, tout le monde ne disposant pas de certificats X509, la solution de repli était en général d'utiliser de bons vieux mots de passe (ou secret partagé ou PreShared Key). OpenBSD propose cependant en plus une solution intermédiaire.
A l'installation du système, un couple de clefs publique/privée a été généré dans le répertoire /etc/isakmpd/private/. L'idée est de distribuer la clef publique, un peu comme on a l'habitude de le faire pour SSH, aux machines avec lesquelles nous allons monter des connexions IPSec. Bref, on oublie tout de suite les mises en place de tunnels avec des mots de passe comme " test " et " toto " sous le seul prétexte que cela est plus simple et qu'il ne s'agit que d'un test... Quoique même ça, avec ipsecctl, c'est encore plus simple...
Donc, copions le fichier /etc/isakmpd/private/local.pub de Spud vers le fichier /etc/isakmpd/pubkeys/ipv4/2.2.2.2 sur Coker et de copier le fichier /etc/isakmpd/private/local.pub de Coker vers le fichier /etc/isakmpd/pubkeys/ipv4/1.1.1.1 sur Spud.
La démarche est identique avec des FQDN plutôt que des adresses IP (exemple avec aflab.est.une.loutre.gcu.info ou hr.assume.gcu-squad.org). On aurait ainsi utilisé le fichier /etc/isakmpd/pubkeys/fqdn/aflab.est.une.loutre.gcu.info sur Coker. Il faudra cependant aussi le spécifier dans /etc/ipsec.conf à l'aide des mots clefs " srcid " et " dstid " pour qu'ipsecctl retrouve ses petits (ike esp from 192.168.1.0/24 to 192.168.2.0/24 peer 2.2.2.2 srcid aflab.est.une.loutre.gcu.info dstid hr.assume.gcu-squad.org).
4.4 Troisième étape : on lance IPSec
Sur Coker :
# isakmpd -K # ipsecctl -f /etc/ipsec.conf
Sur Spud :
# isakmpd -K # ipsecctl -f /etc/ipsec.conf
Maintenant, il ne reste plus qu'à monter et tester le VPN à coup de ping(8) entre les réseaux 192.168.1.0/24 et 192.168.2.0/24. On peut aussi vérifier l'état des tunnels sur chacune des passerelles avec ipsecctl et/ou netstat.
Sur Coker :
 peer 2.2.2.2 srcid 1.1.1.1/32 dstid 2.2.2.2/32 type require
SAD:
esp tunnel from 1.1.1.1 to 2.2.2.2 spi 0x9ce94c96 auth hmac-sha2-256 enc aes \
authkey 0xa274d5679c4992715f0667e9a8288a3cbb1807aa0a3995f63e15d830469b8fd8 \
enckey 0xf287e759aca7fd6f32401693e7aa8c45
esp tunnel from 2.2.2.2 to 1.1.1.1 spi 0x2af0ed2b auth hmac-sha2-256 enc aes \
authkey 0x309e0330883fe13a2f17be33951537b85c4fa09e103c208170ce2e6abbc76f9f \
enckey 0x4cf48044e643be9fcb29b88dd50afdd6
Ou encore...
 # netstat -rnf encap Routing tables Encap: Source Port Destination Port Proto SA(Address/Proto/Type/Direction) 192.168.1/24 0 192.168.2/24 0 0 2.2.2.2/esp/use/in 192.168.2/24 0 192.168.1/24 0 0 2.2.2.2/esp/require/out
4.5 Dernière étape : on garde tout cela en mémoire
Oui on va quand même s'arranger pour qu'au prochain démarrage, le VPN soit monté automatiquement, parce que, bon, il ne faudrait pas avoir à refaire tout ça...
Donc sur Spud et Coker, on fait :
# cat> /etc/rc.conf.local isakmpd_flags="-K" ipsec=YES
Bravo, c'est terminé, vous avez mis en place un VPN IPsec en cinq minutes entre deux passerelles OpenBSD et en utilisant, pour les puristes, IKE avec des clefs asymétriques : alors vous trouvez ça encore compliqué IPSec ?
5. ipsecctl et isakmpd, copains comme cochons
Là , vous allez me dire que c'est un peu normal que ça marche aussi facilement entre deux OpenBSD. On peut faire la même chose presque aussi simplement avec n'importe quelle autre solution IPSec. Eh bien, c'est que vous avez manqué l'essentiel...
Revenons un peu sur ipsecctl et notre ligne d'ipsec.conf.
ike esp from 192.168.1.0/24 to 192.168.2.0/24 peer 2.2.2.2
Déjà , on aurait pu mettre en place un tunnel manuel, en utilisant à la place d'" ike " le mot clef " flow ". Cependant, je ne serais pas en ce moment en train de vous expliquer la magie s'opérant entre ipsecctl et isakmpd...
Pour la littérature... isaknpd(8), isaknpd.conf(5) et idaknpd.policy(5).
Bon, alors rapidement, IKE est un protocole d'échange de clefs utilisé aujourd'hui par IPSec. isakmpd, c'est le nom du démon qui gère IKE sur OpenBSD, et isakmpd.conf et isakmpd.policy sont les fichiers utilisés pour le configurer.
Le mot clef " ike " dans le fichier ipsec.conf indique à ipsecctl qu'il doit gérer le démon isakmpd. ipsecctl et ipsec.conf deviennent alors une véritable couche d'abstraction aux fichiers de configuration isakmpd.conf et isakmpd.policy, qui, soit dit en passant, en ont bien besoin. Notez que c'est aussi pour cette raison que nous avons démarré isakmpd avec l'option -K. C'est elle qui indique à isakmpd que comme ipsecctl mène la danse, il n'a pas besoin de charger quoi que ce soit.
Cependant, tous les paramètres d'isakmpd ne sont pas (encore ?) gérés par ipsecctl. Donc, dans certains cas, il faut encore travailler simultanément avec ipsecctl et un isakmpd.conf minimal.
Mais, en attendant, comparons...
Une configuration d'isakmpd qui ressemblait, avant, à ça...
[Phase 1] 2.2.2.2= ISAKMP-peer-B [Phase 2] Connections= IPsec-A-B [ISAKMP-peer-B] Phase= 1 Address= 2.2.2.2 Configuration= Default-main-mode Authentication= pipinestunefemme [IPsec-A-B] Phase= 2 ISAKMP-peer= ISAKMP-peer-B Configuration= Default-quick-mode Local-ID= Net-A Remote-ID= Net-B [Net-A] ID-type= IPV4_ADDR_SUBNET Network= 192.168.1.0 Netmask= 255.255.255.0 [Net-B] ID-type= IPV4_ADDR_SUBNET Network= 192.168.2.0 Netmask= 255.255.255.0 [Default-main-mode] EXCHANGE_TYPE= ID_PROT Transforms= AES-SHA [Default-quick-mode] EXCHANGE_TYPE= QUICK_MODE Suites= QM-ESP-AES-SHA-PFS-SUITE
...ressemble maintenant à ça :
 ike esp from 192.168.1.0/24 to 192.168.2.0/24 \ peer 2.2.2.2 main auth hmac-sha1 \ enc aes psk "pinpinestunefemme"
C'est quand même plus compréhensible... Imaginons que l'on ait des centaines de tunnels à gérer comme c'est souvent le cas sur des équipements centraux, eh bien, on appréciera tout de suite l'amélioration apportée par l'outil. C'est un peu comme, et loin de moi l'idée de lancer un troll puant, comparer des jeux de règles Netfilter à des jeux de règles pf. Je suis sûrement un peu idiot, mais j'ai toujours du mal à comprendre les jeux de règles Netfilter.
Et si, toutefois, on a des doutes sur le travail réalisé par ipsecctl ou que l'on a beaucoup d'affinités avec l'ancienne méthode, on a la possibilité de visualiser nos jeux de règles IPSec dans un format isakmpd.conf :
 # ipsecctl -vf /etc/ipsec.conf C set [Phase 1]:2.2.2.2=peer-2.2.2.2 force C set [peer-2.2.2.2]:Phase=1 force C set [peer-2.2.2.2]:Address=2.2.2.2 force C set [peer-2.2.2.2]:Authentication=pinpinestunefemme force C set [peer-2.2.2.2]:Configuration=mm-2.2.2.2 force C set [mm-2.2.2.2]:EXCHANGE_TYPE=ID_PROT force C add [mm-2.2.2.2]:Transforms=AES-SHA force C set [IPsec-192.168.1.0/24-192.168.2.0/24]:Phase=2 force C set [IPsec-192.168.1.0/24-192.168.2.0/24]:ISAKMP-peer=peer-2.2.2.2 force C set [IPsec-192.168.1.0/24-192.168.2.0/24]: Configuration=qm-192.168.1.0/24-192.168.2.0/24 force C set [IPsec-192.168.1.0/24-192.168.2.0/24]:Local-ID=lid-192.168.1.0/24 force C set [IPsec-192.168.1.0/24-192.168.2.0/24]:Remote-ID=rid-192.168.2.0/24 force C set [qm-192.168.1.0/24-192.168.2.0/24]:EXCHANGE_TYPE=QUICK_MODE force C set [qm-192.168.1.0/24-192.168.2.0/24]: Suites=QM-ESP-AES-SHA2-256-PFS-SUITE force C set [lid-192.168.1.0/24]:ID-type=IPV4_ADDR_SUBNET force C set [lid-192.168.1.0/24]:Network=192.168.1.0 force C set [lid-192.168.1.0/24]:Netmask=255.255.255.0 force C set [rid-192.168.2.0/24]:ID-type=IPV4_ADDR_SUBNET force C set [rid-192.168.2.0/24]:Network=192.168.2.0 force C set [rid-192.168.2.0/24]:Netmask=255.255.255.0 force C add [Phase 2]:Connections=IPsec-192.168.1.0/24-192.168.2.0/24
Maintenant vous avez remarqué que, dans ce précédent exemple, la configuration est plus compliquée que celle que nous avons utilisée pour monter notre VPN en cinq minutes : ??nous y avons en particulier précisé les algorithmes à utiliser. Car, en effet, si par défaut on ne précise pas certains paramètres, ipsecctl va en choisir de solides pour nous (par exemple AES-256, SHA2-256).
C'est très bête, tout le monde aurait pu le faire et pourtant, au bout de dix ans, c'est le genre d'idée qui change tout. Je rajouterai qu'en plus ça rentre complètement dans la philosophie d'OpenBSD : ??mais vraiment, pourquoi n'ont-ils pas fait ça avant ?
6. Et si ça ne marche pas ?
Justement, je parlais d'huîtres... On a de la chance, de base sous UNIX et en particulier sous OpenBSD, on a plein de trucs pour débugger les problèmes de tuyauterie IPSec.
# isakpmd -K -d -DA=50
Avec -d, on positionne isakmpd en debug, -DA=XX permet de faire varier le nombre et la qualité des informations à afficher.
# ipsecctl -s all -v
Le -v permet de détailler.
# netstat -rnf encap
# tcpdump -s1500 -nvvve -i fxp0 port 500 or port 4500 or esp
500 pour voir le protocole IKE, esp pour voir l'ESP et 4500 pour voir IPSec encapsulé dans UDP (NAT-T).
ou encore
# tcpdump -s1500 -nvvve -i enc0
enc0 pour rappel, c'est la pseudo interface liée à IPSec. Cette commande permet donc de regarder ce qui se passe à l'intérieur du tunnel.
# ping -I 192.168.1.99 192.168.3.99
Le -I peut être extrêmement pratique pour vérifier l'état du tunnel directement depuis la passerelle.
/usr/src/sbin/isakmpd/DESIGN-NOTES
On y trouve de bonnes informations sur l'implémentation d'isakmpd dans OpenBSD (il faut cependant avoir récupéré les sources). De quoi se retourner plusieurs fois le cerveau...
7. Une cerise sur un gâteau : sasyncd
Un jour de mars 2005 est tombé ceci dans le CVS du projet OpenBSD : Log Message: Directory /cvs/src/usr.sbin/sasyncd added to the repository. sasyncd ? Oui sasyncd(8), voyons... le démon de synchronisation d'IPSec.
Pourquoi synchroniser IPSec ? Pour la même raison que l'on synchronise les états d'un firewall, pour éviter de se retrouver avec des utilisateurs déconnectés et des applications plantées si quelque chose de triste arrive à notre passerelle IPSec. Mais, à vrai dire, synchroniser les informations des tunnels IPSec actifs (les " SA " ou " Security Association ") ne sert pas à grand-chose tout seul. En revanche, synchroniser quand on utilise en parallèle un mécanisme de haute disponibilité réseau comme CARP(4), cela devient une tuerie.
Je ne m'attarderai pas trop longtemps sur CARP. Cependant, pour les lecteurs qui ne connaissent pas encore ce protocole, il s'agit d'un mécanisme qui permet de partager une même adresse IP virtuelle entre plusieurs équipements sur un même LAN (ou réseau local). Un des équipements voit son interface CARP désignée, en fonction de paramètres, comme " MASTER " et les interfaces CARP des autres équipements se positionnent en " BACKUP ". C'est l'équipement possédant l'interface CARP à l'état " MASTER ", qui utilisera l'interface IP virtuelle associée. Enfin, des événements externes peuvent avoir des effets sur les interfaces CARP et ainsi entraîner l'élection d'un nouveau " MASTER ".
En mars 2005, il était cependant encore un peu tôt, et c'est seulement avec OpenBSD 4.0 que sasyncd est devenu réellement intéressant, plus robuste et plus agile. Avec l'arrivée " du compteur de dégradation " de CARP (carpdemote) contrôlable en userland, sasyncd a gagné un peu de pouvoir. Par exemple, en mode préemptif (preempt), une interface CARP ne rebasculera à l'état " MASTER " qu'après avoir complètement synchronisé ses " SA " [2][3][4]. Il est devenu agile comme un pfsync, je vous dis !
Renseignons-nous un peu… sasyncd(8) et sasycnd.conf(5).
7.1 Le nouveau plan
Nous allons tester CARP et sasyncd dans un scénario très basique en s'appuyant sur notre TP de tout à l'heure. Nous allons ajouter la machine Pinpin à notre configuration, machine qui devra travailler de concert avec Coker en partageant des interfaces CARP en mode préemptif et en synchronisant ses SA avec cette dernière. Notez que l'interface 1.1.1.1 est devenue une interface virtuelle CARP.

7.2 Configurons CARP
Sur Coker :
# sysctl -w net.inet.carp.preempt=1 # ifconfig carp0 1.1.1.1 netmask 255.255.255.0 \ vhid 1 pass pinpinestamour carpdev sis0 advskew 120 # ifconfig carp1 192.168.1.100 netmask 255.255.255.0 \ vhid 2 pass pinpinestbonheur carpdev sis1 advskew 120
Je saute volontairement la configuration des autres interfaces pour me concentrer sur les aspects spécifiques de sasyncd.
Sur Pinpin :
# sysctl -w net.inet.carp.preempt=1 # ifconfig carp0 1.1.1.1 netmask 255.255.255.0 \ vhid 1 pass pinpinestamour carpdev sis0 advskew 150 # ifconfig carp1 192.168.1.100 netmask 255.255.255.0 \ vhid 2 pass pinpinestbonheur carpdev sis1 advskew 150
7.3 Configurons sasyncd
Sur Coker :
# cat> /etc/sasyncd.conf interface carp0 peer 192.168.1.2 sharedkey b341aa065c3850edd6a61e150d6a5fd3 # chmod 0600 /etc/sasyncd.conf
Sur Pinpin :
# cat> /etc/sasyncd.conf interface carp0 peer 192.168.1.1 sharedkey b341aa065c3850edd6a61e150d6a5fd3 # chmod 0600 /etc/sasyncd.conf
Sur les deux machines :
# sasyncd
Pensez qu'il faudra relancer isakmpd, s’il a été arrêté depuis. Pensez aussi à partager les règles ipsec.conf entre les deux machines. De même, assurez-vous d'avoir bien installé le couple de clefs plublique/privée de Coker sur Pinpin, sinon la passerelle en face va nous snober. Enfin, il faut aussi partager toutes les clefs publiques identifiant les autres passerelles.
7.5 Verdict : coupable
Si tout s'est bien passé sur Pinpin et Coker, on peut voir ça en double :
# ipsecctl -sa
FLOWS:
flow esp out from 192.168.1.0/24 to 192.168.2.0/24
peer 2.2.2.2 srcid 1.1.1.1/32 dstid 2.2.2.2/32
type require
flow esp in from 192.168.2.0/24 to 192.168.1.0/24
peer 2.2.2.2 srcid 1.1.1.1/32 dstid 2.2.2.2/32
type use
SAD:
esp tunnel from 2.2.2.2 to 1.1.1.1 spi 0x90a7a6a \
auth hmac-sha2-256 enc aes \
authkey 0x073367ddb3d7ccb3c196005322b96586eb6b5c2ba1371291b896a88056ac24a8 \
enckey 0x04d53fa17ceb40907bddd456af9d8dca
esp tunnel from 1.1.1.1 to 2.2.2.2 spi 0xa11dcb8c auth \
hmac-sha2-256 enc aes \
authkey 0xbf73e23d962391252e4a6e0532eea2ea1de7db3ac1b8b1cf90adcf2fb5f866b9 \
enckey 0x42c6161bc9d802674ab5f34f819f89d5
Bref, il n'y a plus qu'Ã couper le fil...
Conclusion
ipsecctl est l'outil qui manquait et qui aurait peut-être dû arriver plus tôt. Mon avis est que c'est une bonne nouvelle pour IPSec, qui avait bien besoin d'être dépoussiéré et remis au goût du jour, (lire " simplifié "). Maintenant, il faut espérer qu'ipsecctl prenne le même chemin que pf, ou, rêvons encore un peu plus, qu'OpenSSH soit porté sur d'autres plateformes.
Avec sasyncd, c'est bien plus le travail d'horloger qui est ici intéressant. En fait, tout s'emboîte à merveille dans OpenBSD, de bgpd à ospdf, de pf à pfsync en passant par CARP. sasyncd n'est ici qu'une pièce supplémentaire au puzzle. Cependant, il a aussi l'inconvénient de complexifier quelque peu la configuration de la passerelle IPSec. Mais franchement, avouez que sasyncd, c'est quand même le genre de fonctionnalité qui vous fait regarder certains équipements réseau hors de prix comme des bouses infâmes...
Références
[1] http://www.schneier.com/paper-ipsec.html
[2] http:www.undeadly.org/cgi?action=article&sid=20060621160000
[3] http:www.oreillynet.com/pub/a/sysadmin/2006/10/26/openbsd-40.html?page=1
[4] http://www.openbsd.org/faq/pf/fr/carp.html


