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 pki
Puis on crée la clé privée de la CA
pki --gen --type rsa --size 4096 --outform pem > pki/private/ca-key.pem
Ce 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.pem
Ce 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.pem
Maintenant 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.pem
le 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
IPSec
se fait par un certificat. Celle deVisu
est 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 ipsec
Configuration 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 -y
Configuration 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=start
Authentification
On copie le certificat du serveur VPN vers Visu
Dans IPSec
:
nc -l -p 3000 < pki/cacerts/ca-cert.pem
Dans Visu
:
nc 172.16.11.11 3000 > /etc/ipsec.d/cacerts/ca-cert.pem
Maintenant 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-starter
It doesn’t work
L’authentification échoue avec la notification suivante :
[IKE] loading EAP_MSCHAPV2 method failed
J’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-plugins
It 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 VPN
Sur Visu
, dans le fichier équivalent:
rightsubnet=0.0.0.0/0
It 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/24
Et 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 MASQUERADE
Sur Visu
, dans le fichier équivalent:
leftsourceip=%config # Demander une addresse IP privée
Sur 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 ACCEPT
Ceci fonctionne assez bien:
Si
Visu
n’est pas connectée au VPN, quand on pingCamera
- Un packet ICMP arrive sur le routeur mais il est rejeté:
- Visu arrive à pinger
IPSec
et connecter au VPN
Si
Visu
est connectée au VPN, alors elle communique avec le réseau avec une IP NATée derrière172.16.11.11
et 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.