TP Cryptographie 2: Passerelle IPSec
Configuration de VirtualBox
Ping depuis les machines au Routeur.



On obtient ainsi la vidéo d’un coffre fort.

Finalement sur la machine IPSec il faut ajouter une default gateway vers l’addresse locale de la machine Routeur.
Dans /etc/network/interfaces:

Mise en place d’un proxy IPSec
Création de l’IPsec CA
On commence par créer un répertoire pour les fichiers qui seront utilisés pour l’installation de la CA et du tunnel.
sudo su -
mkdir -p pki/{cacerts,certs,private}
chmod 700 pkiPuis on crée la clé privée de la CA
pki --gen --type rsa --size 4096 --outform pem > pki/private/ca-key.pemCe clé servira à la génération d’un certificat auto-signé de la CA
pki --self --ca \
	--in pki/private/ca-key.pem \
	--lifetime 3650 \
	--dn "CN=IPSec CA" --outform pem > pki/cacerts/ca-cert.pemCe certificat sera copié sur les machines qui auront confiance à l’authorité IPSec CA. Quand la CA genère un certificat pour notre serveur IPSec, l’authenticité de ce dernier pourra être vérifiée.
Création du certificat du serveur IPSec
Comme toute à l’heure, on commence par la création de la clé du serveur.
pki --gen --type rsa --size 4096 --outform pem > pki/private/server-key.pemMaintenant il faut créer un certificat pour ce serveur et le signé par la clé privée de notre CA.
pki --pub \
	--in pki/private/server-key.pem \
	--outform pem > pki/certs/server-cert-unsigned.pem
pki --issue \
	--in pki/certs/server-cert-unsigned.pem \
	--lifetime 365 \
	--cacert pki/cacerts/ca-cert.pem --cakey pki/private/ca-key.pem \
	--dn "CN=172.16.11.11" --san 172.16.11.11 \
	--flag serverAuth --outform pem \
	> pki/certs/server-cert.pem
rm pki/certs/server-cert-unsigned.pemle flag serverAuth spécifie à pki que ce certificat sera utiliser pour l’authentification d’un serveur.
Finalement on copie les certificats à /etc/ipsec.d:
cp -r pki/* /etc/ipsec.d/Configuration de StrongSwan
Configuration du serveur
Déplacons nous dans /etc/ipsec.conf. On voit qu’il y a deux connection psk-vpn et vpn-rsa. On a besoin que d’une seule (J’ai effacé psk-vpn).
- On besoin d’une communication entre IPSec(left) etVisu(right)
left=172.16.11.11
right=192.168.11.100 # %any- L’authentification de IPSecse fait par un certificat. Celle deVisuest de typeeap-mschapv2
leftauth=pubkey
leftid=172.16.11.11
leftcert=server-cert.pem
leftsendcert=always
rightauth=eap-mschapv2
eap_identity=%identity # Demander les identifiant du client- Pour l’authentification de la machine Visu(et autres) on a besoin de créer des identifiants. Ceci se fait dans/etc/ipsec.secrets:
: RSA "server-key.pem"
Visu : EAP "VisuMDP"- Finalement, on doit relancer de daemon de StrongSwan
systemctl restart ipsecConfiguration du client
Installation de StrongSwan sur la machine Visu
Pour cette étape il faut activer l’interface réseau NAT. Ensuite on met à jour la base apt et installer les packets suivant.
sudo apt update && sudo apt upgrade
sudo apt install strongswan strongswan-starter strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins libstrongswan-extra-plugins libtss2-tcti-tabrmd0 libcharon-extra-plugins package -yConfiguration IPSec
Dans le fichier de configuration on faut répéter ce qu’on a fait pour le serveur mais inveser left par right.
Donc dans /etc/ipsec.conf:
# Basic configuration
config setup
	strictcrlpolicy=no
	uniqueids = yes
# Add connections here.
conn rsa-vpn
	left=192.168.11.100           # %any
	leftauth=eap-mschapv2
	eap_identity=Visu             # Visu: Mon identifiant est Visu
	right=172.16.11.11
	rightid=172.16.11.11
	rightauth=pubkey
	auto=startAuthentification
On copie le certificat du serveur VPN vers Visu
Dans IPSec:
nc -l -p 3000 < pki/cacerts/ca-cert.pemDans Visu:
nc 172.16.11.11 3000 > /etc/ipsec.d/cacerts/ca-cert.pemMaintenant on ajoute un identifiant et un mot de passe pour Visu. Dans /etc/ipsec.secrets:
Visu : EAP "VisuMDP"Et on relance le daemon de StrongSwan:
sudo systemctl start strongswan-starterIt doesn’t work
L’authentification échoue avec la notification suivante :
[IKE] loading EAP_MSCHAPV2 method failedJ’ai cherché les raisons en ligne et apparament, ceci se produit parce qu’il manquent quelques package qu’on peut installer avec apt.
sudo apt update && sudo apt upgrade
sudo apt install apt install libcharon-extra-plugins libstrongswan-extra-pluginsIt works
Après l’installation, si on fait un ping on voit ces packets passer sur la machine Routeur.

Configuration du proxy IPSec
L’idée est simple, il faut que Visu envoye tout ses packets à IPSec.
Sur IPSec, dans /etc/ipsec.conf:
leftsubnet=0.0.0.0/0		# Demande au client d'envoyer son traffic sur le VPNSur Visu, dans le fichier équivalent:
rightsubnet=0.0.0.0/0It doesn’t work well
Ceci ne marche pas bien: Quand on ping Raspbian depuis Visu:
Sur l’interface enp0s3 (connecté à IPSec) on observe:

et sur l’interface enp0s8 (connectée à Visu):

Le problème ici est que l’adresse IP source est celle de la machine Visu, ainsi la réponse ne va pas passer par IPSec
Un fix
Une solution simple est de créer un nouveau bloc d’adresses IP (virtuelles) et de donner à Visu une adresse IP.
Sur IPSec, dans /etc/ipsec.conf:
rightsourceip=10.20.30.0/24Et on utiliser iptables pour traduire ces addresses virtuelles à quelque chose que qui peut être routé par Routeur.
iptables -t nat -A POSTROUTING -s 10.20.30.0/24 -j MASQUERADESur Visu, dans le fichier équivalent:
leftsourceip=%config			# Demander une addresse IP privéeSur Wireshark, on confirme l’implémentation :

est également possible d’ajouter une route sur le Routeur pour transmettre le trafic vers 10.20.30.0/24 à 172.16.11.11 (j’ai testé et ça fonctionne). Ceci est moins flexible parce qu’elle dépend de la plage virtuelle définie sur la machine IPSec, mais elle offre moins de latence.
Il y a sans doute plusieurs solutions valides. J’aimerais savoir laquelle est une ‘bonne pratique’ et pourquoi, s’il vous plaît. 
Mise en place d’un proxy IPSec derrière un Firewall
Pour la configuration du Firewall je vais utiliser iptables. La configuration sera sauvée sous /root/iptables-vpn.sh
#!/bin/sh
# Désactiver le forwarding par defaut
iptables -P FORWARD DROP
# Autoriser le traffic de toute sorte de source ou à destination de IPSec
iptables -A FORWARD -s 172.16.11.11 -j ACCEPT
iptables -A FORWARD -d 172.16.11.11 -j ACCEPT
# Si un trafic est établi, on continue de l'autoriser
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPTCeci fonctionne assez bien:
- Si - Visun’est pas connectée au VPN, quand on ping- Camera- Un packet ICMP arrive sur le routeur mais il est rejeté:    
- Visu arrive à pinger IPSecet connecter au VPN
 
- Un packet ICMP arrive sur le routeur mais il est rejeté: 
- Si - Visuest connectée au VPN, alors elle communique avec le réseau avec une IP NATée derrière- 172.16.11.11et le routeur accepte son traffic
Closing Remarks
TP vraiment intéressant. J’ai bien aimé la méthode DIY adoptée par ce TP parce que ça m’a donné la chance de contempler differentes solutions et évlauer les pros/cons.
