Serveur VPN

Paramétrage général

Installation

Pour installer les outils nécessaires à la mise en place du VPN, veuillez vous référer à la page consacrée aux Outils. Une fois les outils LibLZO, OpenSSL, et OpenVPN correctement installés, nous pouvons commencer à paramétrer notre Serveur VPN.

Création de l’environnement et de l’autorité de certification

On se place donc dans le répertoire d’installation d’OpenVPN. Vous devez pour effectuer les opérations suivantes passer Root dans votre terminal. OpenVPN contient déjà les scripts de configuration du réseau, on va donc les exécuter dans l’ordre. Tout d’abord on va initialiser les variables d’OpenVPN, puis nettoyer l’environnement pour partir d’un système sain. On va ensuite créer l’autorité de certification puis configurer les paramètres de cryptage de Diffie Helmann.

# cd /usr/share/openvpn/easy-rsa/2.0/
# su
# ./vars
# ./clean-all
# ./build-ca
# ./build-dh

Le script “build-ca” génère 2 fichiers pour le Serveur : la clé “ca.key” et le certificat “ca.crt“. Ces deux fichiers doivent être copiés dans le répertoire “/etc/openvpn” du Serveur, et seul “ca.crt” devra être distribué aux Clients. Le fichier “dh1024.pem” devra être copié sur le Serveur dans le répertoire précédent, et distribué aux Clients. Il contient les paramètres de cryptage Diffie Hellman.

# cp keys/ca.crt keys/ca.key keys/dh1024.pem /etc/openvpn/

Remarque sur le Cryptage RSA

Nous pouvons observer que ce cryptage évolué permet d’obtenir un bon niveau de sécurisation des transmissions. En particulier au cours des communications sur le WEB, les échanges seront protégés des attaques de type “Man In The Middle“.

Création du certificat du Serveur

On se place toujours dans le répertoire d’installation d’OpenVPN où vous êtes Root. On crée le certificat et la clé du Serveur “ServerName” puis on copie la clé et le certificat dans le répertoire “/etc/openvpn“.


# ./build-key-server ServerName
# cp keys/ServerName.crt keys/ServerName.key /etc/openvpn/

Sécurisation du Handshake SSL/TLS

Le Serveur VPN est à l’écoute de toute demande de connexion en provenance d’Internet. Il est par conséquent potentiellement vulnérable aux attaques de type “Denial of Service“. Ces attaques peuvent intervenir durant la phase d’initialisation de la connexion SSL/TLS, quand le Client n’est pas encore authentifié et échange avec le Serveur les options SSL/TLS initiales. Ces opérations sont “coûteuses” en temps machine et en ressources. Cette phase est donc sensible et par défaut relativement exposée. Il est possible de sécuriser cette phase en “signant” les paquets échangés à l’aide d’une clef secrète partagée entre le Client et le Serveur. C’est ce que nous mettrons en place par les commandes qui suivent. Le fichier “ta.key” ainsi créé devra être copié sur le Serveur ainsi que chez les Clients. D’autres options devront être paramétrées dans les fichiers de configuration Clients et Serveur. On se place toujours dans le répertoire d’installation d’OpenVPN où vous êtes Root.


# openvpn --genkey --secret keys/ta.key
# cp keys/ta.key /etc/openvpn/

Création d’un certificat Client

On se place toujours dans le répertoire d’installation d’OpenVPN où vous êtes Root. On crée le certificat et la clé du Client “HostName” puis on donne la clé et le certificat au Client “HostName“. Précisons qu’il est indispensable que les transmissions des clés et des certificats Clients soient parfaitement sécurisées. Dans le cas contraire la sécurité du réseau VPN serait fortement compromise !

# ./build-key HostName

Dans le cas d’une université, on ne va pas créer un certificat par machine, mais autoriser l’utilisation d’un même certificat par plusieurs machines Clientes. On pourra alors compléter la sécurité en identifiant l’utilisateur par un script sur le Serveur consultant une base LDAP. Cela sera paramétré dans le fichier de configuration du Serveur.

Révocation d’un certificat Client

Il est aisément possible de révoquer un certificat pour bannir un Client ou un Serveur corrompu. Il suffit d’insérer dans la liste des révocations (CLR), l’attribut Common-Name du certificat correspondant. Le script “revoke-full” permet de générer et mettre à jour la CLR. Le fichier “crl.pem” doit alors être diffusé à tous les membres du VPN. Pour les Clients cela peut se faire par téléchargement depuis un Serveur Web. Mais dans le cas du Serveur, cela doit être fait de façon sécurisée (SSH par exemple). On se place toujours dans le répertoire d’installation d’OpenVPN où vous êtes Root.


# ./vars
# ./revoke-full Common-Name

Authentification de l’utilisateur

Nous ne faisons qu’une authentification au niveau de la machine, mais ayant autorisé l’utilisation d’un même certificat par plusieurs clients, nous n’avons plus de réelle authentification. Bien entendu, cela n’est pas optimal pour la sécurité du VPN. Toutefois, il est possible de vérifier l’identité de l’utilisateur en rajoutant un script d’authentification LDAP, vous trouverez des exemples sur le site suivant. Mais il est toujours possible de sécuriser le réseau au niveau applicatif.

Fichier de configuration

Définir le comportement du Serveur

Nous venons de voir comment il fallait procéder pour paramétrer le Serveur au niveau de la gestion des certificats et des connexions. Nous allons maintenant définir le comportement du Serveur VPN dans le fichier “openvpn.conf” qui se trouve dans le répertoire “/etc/openvpn/“. Si celui-ci est inexistant, vous trouverez des exemples de squelettes dans le dossier “/usr/share/doc/openvpn/…“.

Généralités

Nous allons commencer par informer “le démon OpenVPN” (Processus chargé du réseau VPN) de se lancer en mode Serveur SSL/TLS. On spécifie ensuite le port d’écoute, le protocole réseau utilisé et le type d’interface utilisée. On choisira le mode “UDP” qui d’un point de vue sécurité résiste mieux aux attaques de type “DoS“. L’interface de type “tun” permet de créer un tunnel IP rouable. Il ne faudra pas oublier d’ouvrir le port que vous aurez défini si vous possédez un “pare-feu“.

# Mode Serveur
mode server
tls-server

# Port TCP ou UDP
port 1194

# Protocole TCP ou UDP
proto udp

# Création d'un tunnel IP routable
dev tun

Gestion des certificats

Nous précisons maintenant le nom des fichiers relatifs aux certificats, aux clés d’accès au réseau, et enfin le fichier des paramètres Diffie Hellman.

# Certificat d'administration SSL/TLS (ca)
ca ca.crt
# Certificate (cert)
cert server.crt
# Clé du Serveur (key)
key server.key

# Paramètres de Diffie hellman
dh dh1024.pem

Options du Serveur

On spécifie au Serveur la plage d’adressage du réseau et son netmask. Puis on précise que l’on souhaite conserver l’association IP réelle et IP virtuelle dans le fichier ipp.txt. Le Serveur fera aussi office de Serveur DNS et WINS.

# Plage d'adressage du réseau
# L'@ IP du serveur sera 10.8.0.1
server 10.8.0.0 255.255.255.0

# Sauvegarde des associations
ifconfig-pool-persist ipp.txt

# Serveur DNS - WINS
push "dhcp-option DNS 10.8.0.1"
push "dhcp-option WINS 10.8.0.1"

Gestion des Clients

Le serveur autorisera les Clients à se voir et à dialoguer entre eux. Pour ne pas surcharger le Serveur, nous avons choisi d’autoriser l’utilisation simultanée d’un même certificat par plusieurs clients différents.

# Communication entre clients
client-to-client

# Duplication de certificats
duplicate-cn

Paramètres de Sécurité

Pour déclarer qu’un client est déconnecté, on décide de lui envoyer des requêtes PING toutes les 10 sec durant 120 sec. Si il ne répond pas alors il sera déconnecté, c’est le paramètre “keepalive“. On spécifie le nom du fichier ta.key généré pour parer aux attaques de type DoS, et on autorise la compression des messages via LZO. Le nombre maximum de connexions simultanées sera limité à 100. Les privilèges du démon seront réduits après le démarrage.

# Gestion des déconnexions
keepalive 10 120

# DoS Protection
tls-auth ta.key 0

# Compression des échanges VPN
comp-lzo

# Nombre maximum de Clients
max-clients 100

# Réduction des privilèges
user nobody
group nobody

Paramètres de Logs

On précise les paramètres à omettre lors d’un redémarrage, le fichier qui contiendra l’état du réseau, et enfin le nom du fichier des logs à remplacer à chaque redémarrage du démon, avec une verbosité de niveau raisonnable.

# Paramètres omis au Restart
persist-key
persist-tun

# Statut du réseau
status openvpn-status.log

# Fichier de Logs
log /var/openvpn/openvpn.log

# Verbosité
verb 4

# Répétition maximale d'un même message
mute 20