Installer un serveur OpenVPN

Installer un serveur OpenVPN

29/02/2016 1 Par Vincent

Avoir un serveur bien sécurisé c’est bien mais communiquer avec lui en passant par un VPN c’est encore mieux. Autre cas de figure : dans un lieu publique les connexions peuvent être écoutés… utiliser un VPN pour ensuite accéder à internet est la façon la plus propre pour protéger ses données.

Nous allons voir ici l’installation du serveur OpenVPN (il existe d’autres protocoles VPN, comme PPTP ou L2P) que je trouve extrêmement performant et sécurisé.

L’installation des paquets de base

L’installation de base est assez simple. En fait, nous avons besoin de trois petites choses :

  • Le serveur OpenVPN
  • Le système OpenSSL pour la génération des clés et certificats
  • L’ensemble de scripts Easy-RSA pour faciliter le déploiement des clés

Pour cela, on procède (sous Debian par exemple) de la façon suivante :

apt-get install openssl openvpn easy-rsa

Ensuite, nous allons créer nos dossiers de configuration dans « /etc/openvpn » puis copier l’ensemble des scripts « Easy-RSA » à l’emplacement voulu.

mkdir /etc/openvpn/clientsconfig
mkdir /etc/openvpn/easy-rsa
mkdir /etc/openvpn/easy-rsa/keys
cp /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/
cd /etc/openvpn/easy-rsa

A cette étape, nous avons préparer l’arborescence du dossier de configuration d’OpenVPN.

Génération des certificats

Avant de lancer la génération des certificats, il faut configurer le fichier « vars » :

nano -w vars

Dans ce fichier, personnaliser les entrées « KEY_{COUNTRY,PROVINCE,CITY,ORG,EMAIL,OU} » comme bon vous semble. Ensuite, choisissez la taille des clés que vous souhaitez « KEY_SIZE ». Pour les gens normaux, 1024 bits, c’est très bien (mettre KEY_SIZE=1024). Pour les paranos, passer en 2048 bits (considéré par la NSA comme inviolable). Attention toutefois, plus les clés sont grandes, plus la génération des certificats est longue et plus vous consommerez de CPU lors de l’utilisation de votre tunnel (clé plus grande, plus de calcul pour décoder les données).

Maintenant, on passe à la génération des clés serveurs. On va en faire 3 principales :

  • Certificat et clé permettant la génération des autres certificats (ca.crt)
  • Certificat et clé du serveur (server.crt et server.key)
  • Certificat Diffie-Hellman (dh1024.dem ou dh2048.dem). Perso je suis parano, alors 2048 bits.
source ./vars
./clean-all
./build-dh
./build-ca
./build-key-server server

PS : ne mettez pas de « challange password » pour les clés serveurs, sinon vous ne pourrez pas démarrer ce dernier automatiquement puisqu’il vous demandera la clé à chaque lancement (attention donc en cas de reboot de la machine surtout si votre OpenVPN est la seul porte d’entrée de votre réseau comme chez moi 😀 ).

On réalise ensuite une clé particulière pour initier les échanges entre client et serveur (sécurité supplémentaire) :

openvpn --genkey --secret keys/ta.key

On génère nos clés clients (une clé par client) :

./build-key client
# Vous pouvez changer le nom du client, mais cela modifiera également le nom du certificat et de la clé.

Voilà à ce stade, nous avons tout ce qu’il nous faut pour faire fonctionner notre serveur de façon sécurisé. On passe à la configuration du serveur lui même et du client.

Configuration du serveur (server.conf)

Pour la configuration du serveur, on va commencer par rapatrier les clés et certificats utiles dans le dossier /etc/openvpn :

cd /etc/openvpn/easy-rsa/key
cp ca.crt server.crt server.key ta.key dh2048.dem /etc/openvpn
# On va en profiter aussi pour récupérer les fichiers pour le client :
cp ca.crt client.crt client.key ta.key dh2048.dem /etc/openvpn/clientsconf

Maintenant, on passe a la configuration du serveur, en créant (ou éditant) le fichier « server.conf » :

local 192.168.1.150
port 443
proto tcp
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh2048.pem
server 10.8.0.0 255.255.255.0
push "route 10.8.0.0 255.255.255.0"
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
client-to-client
keepalive 10 120
cipher AES-256-CBC
auth SHA512
tls-cipher TLS-DHE-RSA-WITH-AES-256-CBC-SHA
comp-lzo
max-clients 10
user nobody
group nogroup
persist-key
persist-tun
status /etc/openvpn/openvpn-status.log
verb 3
chroot /etc/openvpn/jail

Si on regarde de près, on utilise toutes les sécurités disponibles sur OpenVPN. On va même jusqu’à forcer le hachage des clés et les ciphers de cryptage (SHA512, AES-256-CBC…). Bref vous pourriez (ne le faite pas on est bien d’accord) mettre tous vos numéros de carte bleue, ya pas de problème avec le VPN.

Pour lancer le serveur enfin :

openvpn --config /etc/openvpn/server.conf
# Pour un lancement automatique 
udpate-rc.d openvpn defaults
# Et vérifier que la configuration sera bien chargé dans /etc/default/openvpn
# Ligne AUTOSTART="all" decommentée ou plus strict, une ligne AUTOSTART="server" n'autorisant QUE le fichier server.conf (ignorant les autres fichiers config s'il y en a).

Erratum : Je me rend compte que j’ai inclus dans le fichier de configuration une « jail/prison » pour bloquer l’accès au système depuis le VPN (encore une protection supplémentaire me direz-vous). Pour que cela fonctionne, il faut simplement faire ceci :

mkdir /etc/openvpn/jail
mkdir /etc/openvpn/jail/tmp
mkdir /etc/openvpn/jail/dev
chmod 755 /etc/openvpn/jail -R

Échanges de certificats avec les clients

Paragraphe très important puisqu’il récapitule l’ensemble des fichiers générés (certificats et clés) et vous indique leur importance :

  • Le certificat ca.crt doit être présent sur toutes les machines (serveur et clients)
  • La clé associée ca.key doit rester secrète. C’est elle qui permet de crypter tous les autres certificats donc elle est capitale. Dans la mesure du possible, si vous ne souhaitez plus générer de clés après l’installation, déplacer la dans un lieu sur (hors du serveur).
  • Le certificat dh2048.dem et le fichier clé ta.key doivent être présents sur toutes les machines.
  • Le certificat du serveur (server.crt) est essentiel pour le serveur et doit être accompagné de sa clé (server.key). Gardez au chaud les deux fichiers sur le serveur et particulièrement la clé (server.key) qui est également secrète.
  • Le certificat du client et sa clé (client.crt / client.key) a mettre à disposition du client.

Pour récapituler, les fichiers secrets sont : ca.key / server.key / client.key
Les fichiers a garder sur le serveur : ca.crt / server.crt / server.key / ta.key / dh2048.dem
Les fichiers a envoyer sur le client : ca.crt / client.crt / client.key / ta.key /dh2048.dem

Configuration des clients

La configuration est aussi simple que pour le serveur :

client
remote <votre_IP_internet_serveur> 443
proto tcp
dev tun
resolv-retry infinite
nobind
persist-key
persist-tun
mute-replay-warnings
ns-cert-type server
key-direction 1
ca ca.crt
cert client.crt
key client.key
tls-auth ta.key 1
cipher AES-256-CBC
auth SHA512
tls-cipher TLS-DHE-RSA-WITH-AES-256-CBC-SHA
comp-lzo
verb 1
mute 20

Autre : routage depuis le VPN vers Internet

La partie routage. La plus intéressante non. En fait, pour faire communiquer l’interface virtuelle (tun0 du tunnel) et l’interface physique (eth0 dans mon cas), il faut utiliser quelques règles iptables. Je prends l’exemple dans mon cas d’une interface OpenVPN portant le nom tun0, ip/masque : 10.8.0.0/24 et d’une interface physique (boucle locale chez moi) portant le nom eth0, ip/masque : 192.168.1.0/24.

La règle est la suivante :

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j ACCEPT

Il faut également activer l’IP4.Forwarding :

nano -w /etc/sysctl.conf
# Ajouter à la fin :
net.ip4.ip_forward = 1
# Sauvegarder et quitter le fichier
sysctl -p
# Normalement, cela vous ré-affiche la ligne ajouter au fichier.

Si vous avez suivi à la lettre mes instructions concernant le firewall (règles sur DROP pour l’INPUT et l’OUPUT), vous devez bien évidement ouvrir le port d’écoute d’OpenVPN (dans l’exemple le TCP443 car c’est le plus simple d’accès depuis tous les hotspots [port HTTPS standard]) mais également permettre le forward des interfaces tun0 vers eth0 et inversement (car on peut considérer notre connexion OpenVPN comme fiable si vous ne partagez pas à n’importe qui vos certificats et clés) :

iptables -A INPUT -i tun+ -j ACCEPT
iptables -A OUTPUT -o tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWAR -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT

Voilà c’est prêt !

Remarque pour les plus hardcore d’entre vous : maintenant que l’on a un accès sécurisé avec un VPN et des clés 2048 bits, on peut supprimer notre accès SSH depuis l’extérieur et restreindre son accès que depuis la boucle locale (chez vous par exemple) ou depuis le VPN (c’est à dire dans notre cas, l’interface tun0). Pour cela, on édite simplement le fichier /etc/hosts.allow (on aurait pu modifier le fichier /etc/ssh/sshd_config avec l’emplacement ListenAddress, mais c’est compliqué à faire alors ne tentez ça que si vous avez un accès physique à la machine et un clavier/écran à porté de mains) :

sshd : 192.168.1. : allow
sshd : 10.8.0. : allow
sshd : ALL : deny

Dans ce cas là, vous autorisez toutes les IP de la plage 192.168.1.1 à 192.168.1.254 et toutes les IP de la plage 10.8.0.1 à 10.8.0.254 et vous refusez tout le reste.