La crise sanitaire internationale a poussé de nombreuses entreprises à mettre en place le télétravail pour ses salariés. Des millions de connexions VPN ont été initialisées durant l’année 2020 (et 2021 ne sera pas en reste…).
Dans ce cadre, le VPN le plus sollicité est donc le VPN dit « Client-to-Site » pour donner l’accès aux salariés à distance au réseau local de l’entreprise. Et pour cela, j’ai décidé de vous expliquer comment mettre en place un VPN de ce type sur un firewall pfSense grâce au logiciel libre OpenVPN.
Configuration d’OpenVPN sous pfSense pour les accès nomades
OpenVPN est un logiciel issu du monde du libre et développé par OpenVPN Technologies Inc qui permet de créer des réseaux virtuels privés.
Ce que vous propose aujourd’hui dans le cadre de ce tuto c’est d’effectuer la mise en place d’un tunnel VPN avec ce logiciel depuis un firewall pfSense (un article sur l’installation d’un serveur OpenVPN autonome sous Debian est en phase de réflexion mais cette méthode n’a pas été privilégiée car jugée trop complexe pour une première approche).
Le but final étant que depuis un autre réseau avec des clients dits « nomades », c’est-à-dire des équipements qui sortent régulièrement de l’entreprise, on arrive à se connecter au réseau local en passant par Internet (qui sera simulé dans le cadre de ce tuto).
Le projet pouvant être assez complexe, il sera découpé en plusieurs parties que voici :
Info + : Un tutoriel sur l’installation et la configuration de base de pfSense est disponible au lien suivant : Installation d’un routeur/pare-feu pfSense |
1. Présentation de l’infrastructure
Avant de commencer, il est important de bien comprendre qu’ici, toute l’infrastructure sera virtuelle. L’adresse IP publique de l’entreprise sera donc une adresse de classe privée qui n’existe pas vraiment sur internet (non routable). Outre ce petit détail, le fonctionnement restera totalement identique.
Pour ce tuto, j’ai utilisé VirtualBox pour simuler 5 machines que voici :
- Un firewall pfsense situé sur internet ET dans le réseau local
- Un serveur Windows 2019 dans le réseau local (sans service installé)
- 3 clients (Windows 10, Ubuntu 20.04 et Android 9.0 Pie) situés sur Internet
Voici pour bien comprendre une représentation graphique de ce à quoi on veut aboutir :
Comme vous pouvez le voir, on aura donc 3 réseaux différents :
-
- Internet (WAN) : 10.0.0.0/8
- Réseau local (LAN) : 172.16.0.0/16
- Tunnel VPN : 192.168.254.0/28
Info + : Le choix de réseaux aussi différents est volontaire afin de ne pas s’emmêler les pinceaux avec uniquement sur 192.168 en /24… Les 3 clients ainsi que l’interface 1 de pfsense sont en « Réseau NAT » dans VirtualBox (j’ai dit « Réseau NAT » et pas « NAT » 😉), l’interface 2 de pfsense et le serveur sont en réseau interne. |
Si vous voulez tester également la partie de ce tuto sous Android, vous pouvez jeter un coup d’œil à la vidéo suivante pour l’installation d’Android et la configuration de la VM sous VirtualBox : Installation Android 9 Pie sous VirtualBox
Pour la suite de cet article, je considère que votre infrastructure est déjà prête.
Mon firewall est actif et fonctionnel, il a bien reçu une adresse IP venant d’internet (WAN), et une adresse IP côté LAN lui a été attribuée. Cette adresse IP côté LAN est donc la passerelle de sortie du réseau local pour toutes les machines qui seront à l’intérieur.
Maintenant que les bases sont posées, on peut rentrer dans le vif du sujet !
2. Configuration du serveur OpenVPN sur pfSense
Commençons par nous connecter à l’interface web de gestion de notre firewall pfSense depuis une machine dans le réseau local, je vais donc sur http://172.16.0.1 (qui est l’adresse IP de la patte LAN du firewall), depuis le serveur par exemple car je n’ai pas mis d’autres VM dans le LAN (oui je sais c’est pas bien… ).
Nous arrivons donc sur le dashboard de pfSense :
En premier, il faut mettre en place le service OpenVPN sur le firewall. Pour cela, allez dans le menu « VPN » et le sous-menu « OpenVPN ».
Nous allons utiliser l’assistant pour configurer OpenVPN car c’est un guide permettant de simplifier la mise en place mais sachez que toutes les manipulations peuvent être réalisées indépendamment les unes des autres avec plus de configurations disponibles. Cliquez sur « Wizards ».
Dans la liste déroulante « Type of Server », vous pourrez définir une méthode d’authentification de vos futurs utilisateurs nomades, soit par Radius, soit en liant votre annuaire AD (LDAP), soit en utilisant des utilisateurs locaux n’existant que dans pfsense, ce que nous allons faire ici, pour cela, laissez « Local User Access » et cliquez sur Next.
Il faut commencer par créer une nouvelle autorité de certification (CA). C’est une entité dite de « confiance » chargée d’authentifier les clients tentant d’établir une connexion. Cette entité délivre des certificats permettant de garantir une certaine légitimité (du demandeur et du receveur) afin d’éviter une usurpation ou une altération de la communication.
Remplissez les différents champs avec les informations de votre entreprise avec également une description reconnaissable rapidement et facilement, puis cliquez sur « Add new CA ». La longueur de clé et la durée de vie n’ont pas besoin d’être modifiées.
Ensuite ATTENTION, non vous n’avez pas loucher, on vous redemande PRESQUE la même chose. Il s’agit en fait ici de créer un certificat pour le serveur VPN lui-même, autrement dit pour l’authentifier lui-même. Laissez les champs préremplis selon vos informations précédentes, saisissez juste une fois de plus une description utile et cliquez sur Create new certificate.
Info ++ : A partir de ce point, très peu d’options par défaut seront modifiées (port, chiffrement…). Il conviendra dans votre infrastructure d’adapter les niveaux de sécurité à vos besoins, ce tuto restera dans un esprit de simplicité. |
Nous arrivons ensuite à la configuration du serveur OpenVPN.
Dans la partie « General Information », il faut veiller à ce que l’interface sélectionnée soit bien l’interface « WAN » du firewall, c’est-à-dire l’interface située côté internet car c’est par cette dernière que se feront les connexions entrantes. Le port par défaut d’OpenVPN est le 1194, vous pouvez le modifier, c’est même plus que conseillé dans une infrastructure en production.
Je ne modifie rien dans cette partie, j’ajoute simplement une petite description.
La seconde partie va concerner la sécurité mise en place pour chiffrer la communication entre le client et le serveur VPN. Il est important que tous les échanges qui transiteront dans le tunnel VPN soient sécurisés, même l’authentification entre les 2 parties.
Nous allons faire une petite pause ici pour expliquer à quoi correspondent certains termes évoqués dans cette partie parce que c’est très utile de connaître ces notions qui ne concernent pas que les firewalls ou les VPN. Je vais m’efforcer de faire ça de façon succincte et le plus simplement possible, même si c’est loin d’être simple et que ça me donne surtout de grosses migraines…
-
- Algorithme de chiffrement (AES) :
C’est la méthode qui sera définie entre les parties pour chiffrer et déchiffrer des données. En informatique, cela s’appuie sur des clés (en bits), privées et publiques qui permettent de chiffrer et déchiffrer la conversation. Pour une sécurité optimale (et évidente), il faut que seuls les possesseurs de la clé privée puissent comprendre la conversation en cours.
C’est un peu comme si vous parliez en code avec un ami ; vous vous entendez avant pour ne parler qu’en chiffre par exemple et vous vous dites, « si je te dis 1, ça veut dire pizza, et 2, ça veut dire sushis ». Vous vous croisez dans la journée avec plein de monde autour de vous et vous vous demandez « tu veux manger quoi ce soir ? », votre ami vous répond juste « 1 ». Vous savez qu’il veut manger de la pizza ce soir car vous avez défini ensemble une méthode permettant de vous comprendre par la suite, vous et vous seuls, car vous vous êtes donnés mutuellement « la clé » pour vous déchiffrer. En informatique, c’est la même chose, on utilise un principe de clé pour se comprendre. C’est un moyen de se protéger si la conversation est écoutée ou plus techniquement, si les données sont interceptées par un tiers. Le chiffrement de données le plus sécurisé actuellement est AES.
-
- Diffie-Hellman (DH) :
C’est un algorithme d’échange de clés, plus simplement, c’est une méthode permettant à 2 parties de s’accorder sur la façon de communiquer par la suite en toute confidentialité. C’est cet algorithme qui sera en charge justement de définir des clés permettant de chiffrer et déchiffrer les données échangées. Plus la clé sera longue (en bits), et plus il sera difficile et long de la percer à jour. Diffie-Hellman est un algorithme dit asymétrique. Il utilise une clé publique qui permet de chiffrer les données et une clé privée qui permet de déchiffrer ces données et qui doit donc impérativement rester confidentielle.
Attention cependant, DH bien que puissant, ne permet pas de s’assurer de parler à la bonne personne car il n’authentifie pas les 2 parties, il doit donc être couplé à une autre méthode d’authentification. Pour pallier à cela, il faut privilégier l’algorithme RSA qui permet d’assurer à la fois la confidentialité, l’intégrité mais aussi l’authenticité des échanges.
-
- Fonction/Algorithme de hachage (SHA-256 ou 512, MD5…) :
C’est une fonction mathématique transformant une chaine de caractères en une autre qui devient donc une sorte de « signature » permettant de reconnaître rapidement une donnée tout en protégeant son contenu. Elle calcule ce qu’on appelle l’empreinte d’une donnée et est utilisée dans les algorithmes de chiffrement pour s’assurer de l’intégrité de cette donnée. Cette empreinte permet d’identifier que la donnée reçue est bien la donnée attendue. La moindre altération génère une nouvelle empreinte et donc prouve que les données reçues ont été modifiées. L’algorithme de hachage le plus conseillé aujourd’hui est le SHA256 ou son grand frère le SHA512.
Info + : Les informations précédentes ont été simplifiées le plus possible car en réalité, c’est quelque chose de beaucoup plus compliqué, je vous laisse libre de faire des recherches plus poussées sur le sujet (sujet très très très intéressant mais aussi très très très complexe… ) |
Ouf on en a fini avec ça… on prend un doliprane et on revient sur notre pfsense, partie « Cryptographic Settings » !
Dans cette partie, je choisis de modifier la longueur du Diffie Hellman (DH parameters Length) par 4096 bits (juste parce que j’avais envie mais 2048 bits est une configuration basique et courante tout à fait acceptable !).
Je sélectionne également l’algorithme de chiffrement AES-256-GCM car plus sécurisé que celui défini par défaut, et l’algorithme de hachage SHA512 pour la même raison.
Ensuite nous avons la partie « Tunnel settings ». C’est ici que nous allons déclarer l’adresse réseau de notre tunnel VPN mais aussi autoriser l’accès au réseau local via ce tunnel. Remplissez uniquement les champs « Tunnel Network » avec l’adresse réseau et le masque en notation CIDR que vous souhaitez définir pour le tunnel (ici 192.168.254.0/28) ainsi que le champ « Local network » pour autoriser l’accès au LAN à travers le tunnel VPN (ici 172.16.0.0/16).
Et enfin la dernière partie, « Client settings » qui va permettre de définir des options sur le client qui se connectera à distance tels qu’un nom d’un domaine, l’attribution d’adresses DNS, NTP ou encore WINS. Je ne modifie rien ici car je n’en ai pas besoin, cliquez sur Next.
L’avant dernière étape vous permet de créer automatiquement des règles de pare-feu dans pfSense concernant la connexion VPN. Cochez les 2 cases et cliquez sur Next.
Et pour terminer cette configuration, cliquez sur Finish.
Voilà, votre serveur OpenVPN sur pfSense est prêt !
Info + : Si vous avez été attentifs, vous avez dû voir que l’assistant vous explique à la fin que pour exporter une configuration client, il faudra installer un package qui va s’avérer très utile… |
Si nous allons jeter un coup d’œil au niveau des règles de pare-feu qui se sont créés automatiquement (menu « Firewall » et sous menu « Rules »), nous allons retrouver une règle appliquée sur le WAN autorisant les entrées venant de toutes sources sur le port 1194 d’OpenVPN…
… et une règle appliquée pour le tunnel VPN autorisant tout trafic à l’intérieur de celui-ci.
3. Génération des clients OpenVPN préconfigurés
Lors de la configuration du serveur VPN, nous avons défini la méthode d’authentification via la base d’utilisateurs propre à pfSense. Il faut donc avant de poursuivre créer un utilisateur (autre que l’admin) dans pfSense pour que celui-ci se connecte à distance par la suite.
Pour cela, rendez-vous dans le menu « System », sous-menu « User Manager ».
Cliquez sur le bouton Add pour créer un nouvel utilisateur.
Définissez son nom d’utilisateur qui correspond à son login (compte de connexion), son nom complet et attribuez-lui un mot de passe.
Cochez la case Certificate pour créer un certificat pour cet utilisateur précisément, donnez-lui un nom et cliquez sur Save pour terminer.
Le serveur VPN est prêt, l’utilisateur est prêt, il ne nous reste plus qu’à récupérer la configuration pour pouvoir se connecter à distance.
Comme spoilé précédemment, on va pouvoir récupérer la configuration grâce à un plugin. Installons-le !
Allez dans le menu « System » et dans le sous-menu « Package Manager ».
Dans la partie « Available Packages », saisissez openvpn dans la barre de recherche. Cliquez sur le bouton Install de l’extension nommée « openvpn-client-export ».
Confirmez le choix d’installer ce plugin.
Après quelques secondes, un message vous confirmera que l’installation s’est correctement déroulée.
Retournez dans le menu « VPN », sous-menu « OpenVPN ». Vous verrez une nouvelle catégorie appelée « Client Export ».
Vous pourrez depuis ce point choisir de quelle connexion VPN vous souhaitez récupérer la configuration. Ici nous n’en avons qu’une seule dans « Remote Access Server », ne modifiez rien dans cette partie et descendez jusqu’à « OpenVPN Clients ».
On retrouve ici notre utilisateur créé précédemment et bien identifié par un certificat (si cette partie est vide votre côté, c’est que vous avez fait une erreur de configuration, vérifiez l’utilisateur créé précédemment).
Info ++ : Si vous avez besoin de donner l’accès à distance à de nombreuses personnes, plutôt privilégier une authentification par LDAP et/ou Radius pour faciliter l’administration. |
Dans la colonne « Export », vous disposez de plusieurs liens de téléchargement pour obtenir la configuration nécessaire à la connexion VPN.
La forme de ces exports va varier en fonction de l’OS client que vous allez utiliser, et ça tombe bien, nous en verrons 3 dans la suite de ce tuto.
4. Utilisation du client OpenVPN sous Windows 10
Commençons par tester la connexion nomade sur la machine Windows 10 située, je le rappelle, sur le réseau Internet.
Dans la colonne « Export », cliquez sur le bouton « 10/2016/2019 » pour télécharger le client OpenVPN totalement préconfiguré.
Déplacez ce fichier d’installation sur la VM Windows 10 (soit via clé usb, soit copier/coller ou soit par dossier partagé entre votre machine hôte et votre machine virtuelle si ces fonctions sont activées dans votre VirtualBox).
Une fois le fichier d’installation préconfigurée d’OpenVPN présent sur le poste client Windows 10, exécutez-le.
Comme vous pourrez le voir, il s’agit bien du setup d’installation du client OpenVPN que vous pouvez donc autoriser.
L’installation étant vraiment très classique, je ne vais pas la détailler ici. Attention cependant, à un moment, vous aurez une « post-install » à effectuer. Cliquez de nouveau sur Oui pour autoriser.
Il s’agit ici d’importer la configuration personnalisée de l’utilisateur pour lequel elle a été téléchargée. Une fois le statut « Completed » affiché, cliquez sur « Close ».
Le logiciel OpenVPN sera disponible sur le bureau de la machine.
Avant de le tester, je voudrais attirer votre attention sur le fait que le setup d’OpenVPN a en réalité créé une carte réseau virtuelle sur la machine. C’est sur cette carte réseau (ici TAP-Windows Adapter) que la connexion VPN sera active.
Vous pouvez maintenant lancer OpenVPN GUI. Un double clic sur l’icône présent sur le bureau aura pour effet d’ouvrir l’application dans la barre des tâches représentée par un petit écran avec un cadenas.
Faites un double-clic sur cet écran cadenassé. La connexion VPN est en train de se mettre en place et les identifiants seront demandés. Lors de la 1ère connexion, Windows vous demandera une exception dans le pare-feu local, cochez les cases et autorisez l’accès.
Saisissez les identifiants de l’utilisateur de vous avez créé plus tôt dans pfSense.
Après quelques secondes, un popup vous informera que vous êtes désormais connecté via OpenVPN. Vous pourrez voir qu’une adresse IP vous a été assignée et que celle-ci se trouve bien dans le réseau défini lors de la configuration du serveur VPN.
Si vous faites un ipconfig, vous verrez bien que votre machine à une adresse sur le réseau Internet ET une adresse sur le réseau VPN.
Lançons un ping à destination de l’adresse IP du serveur situé dans le réseau local pour vérifier que le LAN est bien accessible à travers le tunnel VPN (si le ping n’abouti pas, pensez à désactiver le pare-feu local du serveur où créer une règle entrante autorisant l’ICMP) :
Le ping abouti, la connexion VPN nomade sur le poste Windows 10 est désormais fonctionnelle !
Pour vous déconnecter, il vous suffit de double-cliquer sur l’icône d’OpenVPN dans la barre des tâches pour ouvrir l’application et cliquez sur Déconnecter, ou effectuer un simple clic droit.
5. Utilisation du client OpenVPN sous Ubuntu 20.04
Ensuite, petite variante, testons la connexion nomade sur la VM Ubuntu (ici 20.04) située également sur le réseau Internet.
Dans la colonne « Export », cliquez sur le bouton « Archive » pour télécharger le fichier de configuration d’OpenVPN.
Dézippez l’archive et déplacez les 3 fichiers sur la VM Ubuntu (soit via clé usb, soit copier/coller ou soit par dossier partagé entre votre machine hôte et votre machine virtuelle si ces fonctions sont activées dans votre VirtualBox).
Allez dans les paramètres réseau d’Ubuntu et cliquez sur le petit + situé en haut à droite de la partie « VPN ».
Cliquez sur « Importer depuis un fichier… ».
Sélectionnez le fichier « .ovpn » récupéré dans l’archive sur pfSense.
Saisissez le nom et le mot de passe de l’utilisateur ainsi que le mot de passe de clé Utilisateur (idem que le mot de passe de l’utilisateur) puis cliquez sur Ajouter. Vous pouvez voir que les différents fichiers nécessaires à l’identification de l’utilisateur (certificat) ont été ajoutés automatiquement grâce à la présence des 2 autres fichiers dans l’archive.
Pour initier la connexion, cliquez sur le bouton glissant à droite dans la partie VPN des configurations réseau.
Si la connexion réussie, un symbole « VPN » apparaîtra en haut à droite de l’écran.
Si on vérifie les adresses IP de la VM, on pourra voir que l’on obtient bien une IP sur le réseau 192.168.254.0/28.
La connexion est donc aussi fonctionnelle sur la machine Ubuntu !
6. Utilisation du client OpenVPN sous Android 9 Pie
Et dernière petite démo très rapide pour le fun, la configuration sous Android.
Ça peut paraître inutile mais perso j’utilise souvent OpenVPN sur smartphone ou tablette quand je n’ai pas d’ordi sous la main et que je dois rapidement accéder à un serveur, alors oui c’est petit mais pratique, faut juste prendre le coup de main ^^.
Dans la colonne « Export », cliquez sur le bouton « Android » pour télécharger le fichier de configuration d’OpenVPN.
Sur la VM Android, l’installation des Additions Invites de VirtualBox est galère pour peu d’intérêt. Personnellement, comme une adresse gmail est obligatoire pour accéder au Google Play Store, je vais me contenter de m’envoyer par mail le fichier de configuration pour le récupérer sur la VM Android .
Le fichier a été téléchargé et se trouve dans le dossier Téléchargement de l’Android.
Allez sur le Play Store, recherchez OpenVPN et installez l’application.
Lorsque l’installation est terminée, vous pouvez ouvrir l’appli et accepter les conditions générales d’utilisation.
Allez dans l’onglet « File » et autorisez l’accès au contenu de l’appareil.
Allez dans Download.
Sélectionnez le fichier de configuration et cliquez en bas sur Import.
Renseignez le nom de l’utilisateur et appuyez sur Add en haut à droite.
La configuration a bien été ajoutée à l’appareil. Pour se connecter, appuyez sur le bouton glissant devant le profil correspondant.
Saisissez le mot de passe de l’utilisateur et appuyez sur OK
Un popup de sécurité s’affiche à l’écran lors de la 1ère tentative de connexion, appuyez sur OK pour valider.
Après quelques secondes, l’appareil sous Android est bien connecté en VPN, la configuration est donc fonctionnelle !
Voilà qui met fin à ce tuto sur l’installation et la configuration d’OpenVPN (VPN client-to-site) sur un firewall pfSense !
Et surtout n’oubliez pas que cet article n’est qu’une simple démo et qu’il faut l’adapter à votre SI
A très bientôt !