Liaison sécurisée avec openvpn

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

openssl

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