Clients OpenVPN roadwarrior avec OpenBSD

1 - Introduction

Ce document détaille la mise en place d'un lien sécurisé entre un serveur et des clients nomades roadwarrior. Il est pour cela nécessaire de mettre en place une autorité de certification (pouvant être basée sur une PKI ou non) ainsi qu'un serveur et des clients OpenVPN.

Dans cet exemple, le protocole d'échange TLS sera utilisé par les hôtes openvpn afin d'établir un lien de communication sécurisé. Il est également possible d'utiliser des clés statiques pré-partagées, même si cette solution peut se réveller moins sécurisée et plus fastidieuse à mettre en place.

2 - Génération des clés

Certification Authority

Il est tout d'abord nécessaire de posséder une authorité de certification afin de pouvoir émettre des certificats, à destination du serveur et des clients OpenVPN. Pour se faire, il peut être avantageux d'utiliser le fichier openssl.cnf fournit avec le logiciel OpenVPN.

$ sudo cp /usr/local/share/examples/openvpn/easy-rsa/openssl.cnf /etc/ssl/

Il faut ensuite positionner quelques variables d'environnement, et créer les fichiers nécessaires afin d'être en mesure de signer des certificats.

% mkdir -p /etc/openvpn/ssl

% cd /etc/openvpn/ssl
% sudo touch index.txt
% sudo echo "00" > serial

% setenv KEY_DIR      /etc/openvpn/ssl
% setenv KEY_SIZE     1024
% setenv KEY_COUNTRY  FR
% setenv KEY_PROVINCE x
% setenv KEY_CITY     x
% setenv KEY_ORG      domain.tld
% setenv KEY_EMAIL    root@domain.tld

Pour créer le certificat du CA :

% sudo openssl dhparam -out dh1024.pem 1024
% sudo openssl genrsa -des3 -out ca.key 1024 (et spécifier pass CA)
% sudo openssl req -config openssl.cnf -new -x509 -keyout ca.key -out ca.crt -days 730

Clé / certificat du serveur OpenVPN

% sudo openssl req -config openssl.cnf -nodes -new -keyout server.key   -out server.csr
% sudo openssl ca  -config openssl.cnf -in server.csr -out server.crt

Sur le serveur comme sur les clients, les clés et certificats générés devront être placés dans /etc/openvpn/ssl.

Clé / certificat des clients OpenVPN

Voici un exemple pour le client appelé "client1", le principe est identique à celui du serveur.

% sudo openssl req -config openssl.cnf -nodes -new -keyout client1.key -out client1.csr
% sudo openssl ca -config openssl.cnf -in client1.csr -out client1.crt 

3 - Configuration d'OpenVPN

OpenVPN permet de mettre en place deux types de VPN, grâce aux modes bridge (niveau 2, aucun routage) ou routeur (niveau 3). Si le driver pour accomplir ces deux modes est le même sur les systèmes BSD, à savoir tun, il faudra différencier les drivers tun (niveau 3 uniquement) et tap (niveau 2 uniquement) sur d'autres systèmes.

Si la configuration est quasi-identique selon les systèmes, des différences peuvent apparaitre, comme le nom du device à utiliser (tun ou tun0), ou l'utilisateur OpenVPN (nobody par exemple).

Serveur

Il est possible de configurer comme suit le serveur OpenVPN, via le fichier /etc/openvpn/openvpn.conf. Celui-ci incarnera un serveur TLS, permettant l'accès des clients grâce à des opérations de routage (routes, adresses IP, etc.)

port 1194
proto udp
dev tun0

mode server
tls-server
server   192.168.2.0 255.255.255.0 
ifconfig 192.168.2.1 192.168.2.2

keepalive 15 120
ifconfig-pool-persist /etc/openvpn/ipp.txt 

push "route 192.168.1.0 255.255.255.0"

comp-lzo
user nobody
group nobody
chroot /var/empty
persist-key
persist-tun

ca   /etc/openvpn/ssl/ca.crt
cert /etc/openvpn/ssl/server.crt
key  /etc/openvpn/ssl/server.key
dh   /etc/openvpn/ssl/dh1024.pem

Dans cet exemple de configuration, l'option ifconfig-pool-persist est utilisée afin de conserver une liste des correspondances FQDN-IP ayant utilisées OpenVPN, afin d'attribuer les mêmes adresses lors des prochaines connexions clientes.

Afin d'automatiser le lancement, on peut par exemple ajouter au fichier /etc/rc.local :

echo 'lancement du démon: openvpn...'
if [ -x /usr/local/sbin/openvpn ]; then
    /usr/local/sbin/openvpn --config /etc/openvpn/openvpn.conf --daemon
fi

Clients

Il est possible de configurer comme suit les clients OpenVPN, via le fichier /etc/openvpn/openvpn.conf. Ceux-ci incarneront des clients TLS, contactant le serveur server.domain.tld pour établir des liaisons.

client
dev tun0
proto udp

tls-client
remote server.domain.tld 1194

comp-lzo
nobind
user nobody
group nobody
chroot /var/empty
persist-key
persist-tun

ca   /etc/openvpn/ssl/ca.crt
cert /etc/openvpn/ssl/client1.crt
key  /etc/openvpn/ssl/client1.key

Filtrage

Enfin, si un ou plusieurs firewalls viennent à être utilisés, il sera nécessaire d'autoriser le flux 1194/udp entrant sur le serveur OpenVPN.


Alexandre Anriot - http://www.atlantilde.com/aanriot/