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 :

[pastacode lang= »bash » message= » » highlight= » » provider= »manual » manual= »apt-get%20install%20openssl%20openvpn%20easy-rsa »/]

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

[pastacode lang= »bash » message= » » highlight= » » provider= »manual » manual= »mkdir%20%2Fetc%2Fopenvpn%2Fclientsconfig%0Amkdir%20%2Fetc%2Fopenvpn%2Feasy-rsa%0Amkdir%20%2Fetc%2Fopenvpn%2Feasy-rsa%2Fkeys%0Acp%20%2Fusr%2Fshare%2Feasy-rsa%2F*%20%2Fetc%2Fopenvpn%2Feasy-rsa%2F%0Acd%20%2Fetc%2Fopenvpn%2Feasy-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 » :

[pastacode lang= »bash » message= » » highlight= » » provider= »manual » manual= »nano%20-w%20vars »/]

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.

[pastacode lang= »bash » message= » » highlight= » » provider= »manual » manual= »source%20.%2Fvars%0A.%2Fclean-all%0A.%2Fbuild-dh%0A.%2Fbuild-ca%0A.%2Fbuild-key-server%20server »/]

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) :

[pastacode lang= »bash » message= » » highlight= » » provider= »manual » manual= »openvpn%20–genkey%20–secret%20keys%2Fta.key »/]

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

[pastacode lang= »bash » message= » » highlight= » » provider= »manual » manual= ».%2Fbuild-key%20client%0A%23%20Vous%20pouvez%20changer%20le%20nom%20du%20client%2C%20mais%20cela%20modifiera%20%C3%A9galement%20le%20nom%20du%20certificat%20et%20de%20la%20cl%C3%A9. »/]

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 :

[pastacode lang= »bash » message= » » highlight= » » provider= »manual » manual= »cd%20%2Fetc%2Fopenvpn%2Feasy-rsa%2Fkey%0Acp%20ca.crt%20server.crt%20server.key%20ta.key%20dh2048.dem%20%2Fetc%2Fopenvpn%0A%23%20On%20va%20en%20profiter%20aussi%20pour%20r%C3%A9cup%C3%A9rer%20les%20fichiers%20pour%20le%20client%20%3A%0Acp%20ca.crt%20client.crt%20client.key%20ta.key%20dh2048.dem%20%2Fetc%2Fopenvpn%2Fclientsconf »/]

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

[pastacode lang= »bash » message= » » highlight= » » provider= »manual » manual= »local%20192.168.1.150%0Aport%20443%0Aproto%20tcp%0Adev%20tun%0Aca%20%2Fetc%2Fopenvpn%2Fca.crt%0Acert%20%2Fetc%2Fopenvpn%2Fserver.crt%0Akey%20%2Fetc%2Fopenvpn%2Fserver.key%0Adh%20%2Fetc%2Fopenvpn%2Fdh2048.pem%0Aserver%2010.8.0.0%20255.255.255.0%0Apush%20%22route%2010.8.0.0%20255.255.255.0%22%0Apush%20%22redirect-gateway%20def1%20bypass-dhcp%22%0Apush%20%22dhcp-option%20DNS%208.8.8.8%22%0Apush%20%22dhcp-option%20DNS%208.8.4.4%22%0Aclient-to-client%0Akeepalive%2010%20120%0Acipher%20AES-256-CBC%0Aauth%20SHA512%0Atls-cipher%20TLS-DHE-RSA-WITH-AES-256-CBC-SHA%0Acomp-lzo%0Amax-clients%2010%0Auser%20nobody%0Agroup%20nogroup%0Apersist-key%0Apersist-tun%0Astatus%20%2Fetc%2Fopenvpn%2Fopenvpn-status.log%0Averb%203%0Achroot%20%2Fetc%2Fopenvpn%2Fjail%0A »/]

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 :

[pastacode lang= »bash » message= » » highlight= » » provider= »manual » manual= »openvpn%20–config%20%2Fetc%2Fopenvpn%2Fserver.conf%0A%23%20Pour%20un%20lancement%20automatique%20%0Audpate-rc.d%20openvpn%20defaults%0A%23%20Et%20v%C3%A9rifier%20que%20la%20configuration%20sera%20bien%20charg%C3%A9%20dans%20%2Fetc%2Fdefault%2Fopenvpn%0A%23%20Ligne%20AUTOSTART%3D%22all%22%20decomment%C3%A9e%20ou%20plus%20strict%2C%20une%20ligne%20AUTOSTART%3D%22server%22%20n’autorisant%20QUE%20le%20fichier%20server.conf%20(ignorant%20les%20autres%20fichiers%20config%20s’il%20y%20en%20a). »/]

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 :

[pastacode lang= »bash » message= » » highlight= » » provider= »manual » manual= »mkdir%20%2Fetc%2Fopenvpn%2Fjail%0Amkdir%20%2Fetc%2Fopenvpn%2Fjail%2Ftmp%0Amkdir%20%2Fetc%2Fopenvpn%2Fjail%2Fdev%0Achmod%20755%20%2Fetc%2Fopenvpn%2Fjail%20-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 :

[pastacode lang= »bash » message= » » highlight= » » provider= »manual » manual= »client%0Aremote%20%3Cvotre_IP_internet_serveur%3E%20443%0Aproto%20tcp%0Adev%20tun%0Aresolv-retry%20infinite%0Anobind%0Apersist-key%0Apersist-tun%0Amute-replay-warnings%0Ans-cert-type%20server%0Akey-direction%201%0Aca%20ca.crt%0Acert%20client.crt%0Akey%20client.key%0Atls-auth%20ta.key%201%0Acipher%20AES-256-CBC%0Aauth%20SHA512%0Atls-cipher%20TLS-DHE-RSA-WITH-AES-256-CBC-SHA%0Acomp-lzo%0Averb%201%0Amute%2020″/]

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 :

[pastacode lang= »bash » message= » » highlight= » » provider= »manual » manual= »iptables%20-t%20nat%20-A%20POSTROUTING%20-s%2010.8.0.0%2F24%20-o%20eth0%20-j%20ACCEPT »/]

Il faut également activer l’IP4.Forwarding :

[pastacode lang= »bash » message= » » highlight= » » provider= »manual » manual= »nano%20-w%20%2Fetc%2Fsysctl.conf%0A%23%20Ajouter%20%C3%A0%20la%20fin%20%3A%0Anet.ip4.ip_forward%20%3D%201%0A%23%20Sauvegarder%20et%20quitter%20le%20fichier%0Asysctl%20-p%0A%23%20Normalement%2C%20cela%20vous%20r%C3%A9-affiche%20la%20ligne%20ajouter%20au%20fichier. »/]

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) :

[pastacode lang= »bash » message= » » highlight= » » provider= »manual » manual= »iptables%20-A%20INPUT%20-i%20tun%2B%20-j%20ACCEPT%0Aiptables%20-A%20OUTPUT%20-o%20tun%2B%20-j%20ACCEPT%0Aiptables%20-A%20FORWARD%20-i%20tun%2B%20-j%20ACCEPT%0Aiptables%20-A%20FORWARD%20-i%20tun%2B%20-o%20eth0%20-m%20state%20–state%20RELATED%2CESTABLISHED%20-j%20ACCEPT%0Aiptables%20-A%20FORWAR%20-i%20eth0%20-o%20tun%2B%20-m%20state%20–state%20RELATED%2CESTABLISHED%20-j%20ACCEPT »/]

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) :

[pastacode lang= »bash » message= » » highlight= » » provider= »manual » manual= »sshd%20%3A%20192.168.1.%20%3A%20allow%0Asshd%20%3A%2010.8.0.%20%3A%20allow%0Asshd%20%3A%20ALL%20%3A%20deny »/]

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.