Objectif
Créer liaison réseau sécurisée entre un système Linux et une passerelle d'accès
à un réseau distant.
Contexte
Le réseau distant est un réseau local d'un derrière une box d'un FAI. La
passerelle VPN est un Raspberry PI sur lequel
est installé raspbian.
Parmi les serveur VPN disponibles, j'ai choisi
openvpn.
Côté client, un poste Linux avec le client openvpn.
Mise en œuvre
Synoptique
- Mise en place d'une PKI
- Installation et configuration du serveur
- Installation et configuration du client
- Tests de connexion
- Routage et firewall sur le serveur
Mise en place d'une PKI
L'échange entre le client et le serveur se fait à l'aide de TLS pour lequel il
faut créer les certificats serveur et client.
Il est possible de mettre en place des certifiatc auto signés mais l'idéal est
de créer une PKI indépendante pour générer les certificats.
Cela se fait avec openssl que l'on trouve sur toutes les distribution linux. Il
suffit de l'installer à coup de xiapt
, pacman
, yum
...
Pour la documentation, man ca
explique bien les choses.
L'idéal est de créer sa PKI sur un système non connecté à internet pour
protéger la clé privée du CA. On peut aussi utiliser des tocken. Le projet
yubikey-ca est un exemple de mise en
œuvre avec une yubikey.
Le Net regorge de documentation sur le sujet. Parmi elles, pki
tutorial est plutôt bien
documentée.
Installation et configuration du serveur
Installation
S'agissant d'une distribution de type Debian,
l'installation de openvpn se fait simplement par
$ sudo apt install openvpn
$ sudo systemctl enable openvpn
Configuration
Sur les système avec systemd, le service openvpn est un template, ce qui permet
d'exécuter plusieurs serveurs. Le nom du service passé en paramètre est utilisé
dans le service pour choisir le fichier de configuration associé (%i).
$ cat /lib/systemd/system/openvpn@.service
[Unit]
Description=OpenVPN connection to %i
PartOf=openvpn.service
ReloadPropagatedFrom=openvpn.service
[Service]
Type=forking
ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --config /etc/openvpn/%i.conf
ExecReload=/bin/kill -HUP $MAINPID
WorkingDirectory=/etc/openvpn
[Install]
WantedBy=multi-user.target
Aussi, pour créer un service vpn ayant pour nom monvpn1
, il faut créer le
fichier de configuration /etc/openvpn/monvpn1.conf
et lancer le service
openvpn@monvpn1.service
Voici un exemple de fichier de configuration générique.
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key # This file should be kept secret
dh dh4096.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
keepalive 10 120
tls-auth ta.key 0 # This file is secret
cipher AES-256-CBC
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
verb 3
explicit-exit-notify 1
Création des éléments de chiffrement
Création de la clé de chiffrement
Création de la demande de signature du certificat
Signature du certificat
Mise en place des certificats
Installation et configuration du client
Tests de connexion
Routage et firewall sur le serveur