
Problématique
Il n'y a pas si longtemps, beaucoup ne savaient pas ce que c'était de travailler depuis chez soi. La pandémie a radicalement changé la situation dans le monde, tout le monde a commencé à s'adapter aux circonstances, à savoir que sortir de chez soi est devenu tout simplement dangereux. Beaucoup ont dû rapidement organiser le travail à domicile pour leurs employés.
Cependant, l'absence d'une approche réfléchie dans le choix des solutions de travail à distance peut entraîner des pertes irréversibles. Les mots de passe des utilisateurs peuvent être volés, permettant ainsi à un malfaiteur de se connecter sans contrôle au réseau et aux ressources informatiques de l'entreprise.
C'est pourquoi la nécessité de créer des réseaux VPN d'entreprise fiables a considérablement augmenté. Je vais vous parler de fiable, sécurisé et simple à utiliser VPN.
Il fonctionne selon un schéma IPsec/L2TP, utilisant pour l'authentification des clients des clés et certificats non extrayables, stockés sur des tokens, et transmet les données sur le réseau sous forme chiffrée.
Pour la configuration, nous avons utilisé un serveur sous CentOS 7 (adresse : centos.vpn.server.ad) et un client sous Ubuntu 20.04, ainsi qu'un client sous Windows 10.
Description du système
Le VPN fonctionnera selon le schéma IPSec + L2TP + PPP. Le protocole Point-to-Point Protocol (PPP) fonctionne au niveau de la couche de liaison du modèle OSI et assure l'authentification de l'utilisateur ainsi que le chiffrement des données transmises. Ses données sont encapsulées dans les données du protocole L2TP, qui assure la création de la connexion sur le réseau VPN, mais ne fournit ni authentification ni chiffrement.
Les données L2TP sont encapsulées dans le protocole IPSec, qui fournit également l'authentification et le chiffrement, mais contrairement au protocole PPP, l'authentification et le chiffrement se font au niveau des appareils, et non au niveau des utilisateurs.
Cette caractéristique permet d'assurer l'authentification des utilisateurs uniquement à partir de certains appareils. Nous allons utiliser le protocole IPSec comme cela et permettre l'authentification des utilisateurs depuis n'importe quel appareil.

L'authentification de l'utilisateur par le biais de cartes intelligentes sera effectuée au niveau du protocole PPP à l'aide du protocole EAP-TLS.
Des informations plus détaillées sur le fonctionnement de ce schéma peuvent être trouvées dans .
Pourquoi ce schéma répond à toutes les trois exigences d'un bon réseau VPN
- La fiabilité de ce schéma a été prouvée par le temps. Il est utilisé pour le déploiement de réseaux VPN depuis 2000.
- L'authentification sécurisée de l'utilisateur est assurée par le protocole PPP. ne fournit pas un niveau de sécurité suffisant, car pour l'authentification, au mieux, une authentification par login et mot de passe est utilisée. Nous savons tous que le login et le mot de passe peuvent être vus, devinés ou volés. Cependant, le développeur dans de ce protocole a corrigé ce point et a ajouté la possibilité d'utiliser des protocoles basés sur le chiffrement asymétrique pour l'authentification, comme EAP-TLS. En outre, il a ajouté la possibilité d'utiliser des cartes à puce pour l'authentification, ce qui a rendu ce système plus sécurisé.
Actuellement, des négociations actives sont en cours pour fusionner ces deux projets, et on peut être certain que tôt ou tard, cela se produira. Par exemple, dans les dépôts Fedora, une version patchée de PPP utilisant des protocoles sécurisés pour l'authentification est déjà disponible depuis longtemps. - Il n'y a pas si longtemps, ce réseau ne pouvait être utilisé que par des utilisateurs Windows, mais nos collègues de l'Université d'État de Moscou, Vasily Shokov et Alexander Smirnov, ont trouvé et l'ont amélioré. Grâce à des efforts conjoints, nous avons résolu de nombreux bogues et défauts de fonctionnement du client, simplifié l'installation et la configuration du système, même lors de la compilation à partir des sources. Les améliorations les plus significatives sont :
- Correction des problèmes de compatibilité de l'ancien client avec l'interface des nouvelles versions d'openssl et qt.
- Suppression de la transmission du code PIN PPPD du jeton via un fichier temporaire.
- Correction du lancement incorrect du programme de demande de mot de passe via l'interface graphique. Cela a été réalisé en établissant un environnement correct pour le service xl2tpd.
- La compilation du démon L2tpIpsecVpn est désormais réalisée en conjonction avec la compilation du client lui-même, ce qui facilite le processus de compilation et de configuration.
- Pour faciliter le développement, le système Azure Pipelines a été intégré pour tester la validité de la compilation.
- Ajout de la possibilité de réduire de force Dans le contexte d'openssl. Cela est utile pour un support correct des nouveaux systèmes d'exploitation, où le niveau de sécurité standard est réglé sur 2, avec des réseaux VPN utilisant des certificats qui ne répondent pas aux exigences de sécurité de ce niveau. Cette option sera utile pour travailler avec des réseaux VPN anciens déjà existants.
La version corrigée peut être trouvée dans .
Ce client prend en charge l'utilisation de cartes à puce pour l'authentification, tout en masquant au maximum les complexités de la configuration de ce schéma sous Linux, rendant la configuration du client aussi simple et rapide que possible.
Bien sûr, pour une communication conviviale entre PPP et le client GUI, il a également fallu quelques modifications dans chaque projet, mais néanmoins, elles ont pu être minimisées au maximum :
- Corrigé
- Corrigé . Cette erreur empêchait le chargement depuis le fichier local /etc/ppp/openssl.cnf de quoi que ce soit, à part les informations sur les moteurs openssl pour travailler avec des cartes à puce, ce qui était très gênant si, par exemple, en plus des informations sur les moteurs, nous voulions définir autre chose. Par exemple, fixer le niveau de sécurité lors de l'établissement de la connexion.
Vous pouvez maintenant procéder à la configuration.
Configuration du serveur
Installons tous les paquets nécessaires.
Installation de strongswan (IPsec)
Tout d'abord, configurons le pare-feu pour le travail de l'ipsec
sudo firewall-cmd --permanent --add-port=1701/{tcp,udp}
sudo firewall-cmd --permanent --add-service=ipsec
sudo firewall-cmd --reloadEnsuite, commençons l'installation
sudo yum install epel-release ipsec-tools dnf
sudo dnf install strongswanAprès l'installation, il est nécessaire de définir la configuration pour strongswan (une des mises en œuvre de l'IPSec). Pour cela, modifions le fichier /etc/strongswan/ipsec.conf :
config setup
nat_traversal=yes
virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
oe=off
protostack=netkey
conn L2TP-PSK-NAT
rightsubnet=vhost:%priv
also=L2TP-PSK-noNAT
conn L2TP-PSK-noNAT
authby=secret
pfs=no
auto=add
keyingtries=3
rekey=no
ikelifetime=8h
keylife=1h
type=transport
left=%any
leftprotoport=udp/1701
right=%any
rightprotoport=udp/%any
ike=aes128-sha1-modp1536,aes128-sha1-modp1024,aes128-md5-modp1536,aes128-md5-modp1024,3des-sha1-modp1536,3des-sha1-modp1024,3des-md5-modp1536,3des-md5-modp1024
esp=aes128-sha1-modp1536,aes128-sha1-modp1024,aes128-md5-modp1536,aes128-md5-modp1024,3des-sha1-modp1536,3des-sha1-modp1024,3des-md5-modp1536,3des-md5-modp1024Nous allons également définir un mot de passe général pour l'accès. Ce mot de passe doit être connu de tous les participants du réseau pour l'authentification. Cette méthode est par nature peu fiable, car ce mot de passe peut facilement devenir connu de personnes à qui nous ne voulons pas donner accès au réseau.
Cependant, ce fait n'affectera pas la sécurité de l'organisation du réseau, car le cryptage principal des données et l'authentification des utilisateurs sont réalisés par le protocole PPP. Mais pour être juste, il convient de noter que strongswan prend en charge des technologies d'authentification plus sécurisées, par exemple, à l'aide de clés privées. De plus, strongswan offre la possibilité d'assurer l'authentification via des cartes intelligentes, mais actuellement, seul un nombre limité d'appareils est pris en charge, rendant l'authentification par jetons et cartes intelligentes Rutoken difficile pour le moment. Définissons le mot de passe général via le fichier. /etc/strongswan/ipsec.secrets:
# ipsec.secrets - strongSwan IPsec secrets file
%any %any : PSK "SECRET_PASSPHRASE"Redémarrons strongswan :
sudo systemctl enable strongswan
sudo systemctl restart strongswanInstallation de xl2tp
sudo dnf install xl2tpdConfigurons-le via le fichier /etc/xl2tpd/xl2tpd.conf:
[global]
force userspace = yes
listen-addr = 0.0.0.0
ipsec saref = yes
[lns default]
exclusive = no
; définit l'adresse statique du serveur dans le réseau virtuel
local ip = 100.10.10.1
; définit la plage d'adresses virtuelles
ip range = 100.10.10.1-100.10.10.254
assign ip = yes
refuse pap = yes
require authentication = yes
; cette option peut être désactivée après une configuration réussie du réseau
ppp debug = yes
length bit = yes
pppoptfile = /etc/ppp/options.xl2tpd
; indique l'adresse du serveur dans le réseau
name = centos.vpn.server.adRedémarrons le service :
sudo systemctl enable xl2tpd
sudo systemctl restart xl2tpdConfiguration de PPP
Il est recommandé d'installer la dernière version de pppd. Pour cela, exécutons la séquence de commandes suivante :
sudo yum install git make gcc openssl-devel
git clone "https://github.com/jjkeijser/ppp"
cd ppp
./configure --prefix /usr
make -j4
sudo make installInscrivez dans le fichier /etc/ppp/options.xl2tpd le suivant (si des valeurs y figurent, elles peuvent être supprimées) :
ipcp-accept-local
ipcp-accept-remote
ms-dns 8.8.8.8
ms-dns 1.1.1.1
noccp
auth
crtscts
idle 1800
mtu 1410
mru 1410
nodefaultroute
debug
lock
proxyarp
connect-delay 5000Écrivons le certificat racine et le certificat du serveur :
#директория с сертификатами пользователей, УЦ и сервера
sudo mkdir /etc/ppp/certs
#директория с закрытыми ключами сервера и УЦ
sudo mkdir /etc/ppp/keys
#запрещаем любой доступ к этой дирректории кроме администатора
sudo chmod 0600 /etc/ppp/keys/
#генерируем ключ и выписываем сертификат УЦ
sudo openssl genrsa -out /etc/ppp/keys/ca.pem 2048
sudo openssl req -key /etc/ppp/keys/ca.pem -new -x509 -out /etc/ppp/certs/ca.pem -subj "/C=RU/CN=L2TP CA"
#генерируем ключ и выписываем сертификат сервера
sudo openssl genrsa -out /etc/ppp/keys/server.pem 2048
sudo openssl req -new -out server.req -key /etc/ppp/keys/server.pem -subj "/C=RU/CN=centos.vpn.server.ad"
sudo openssl x509 -req -in server.req -CAkey /etc/ppp/keys/ca.pem -CA /etc/ppp/certs/ca.pem -out /etc/ppp/certs/server.pem -CAcreateserialAinsi, nous avons terminé avec la configuration principale du serveur. Le reste de la configuration du serveur concerne l'ajout de nouveaux clients.
Ajouter un nouveau client
Pour ajouter un nouveau client au réseau, il est nécessaire d'enregistrer son certificat dans la liste de confiance pour ce client.
Si l'utilisateur souhaite devenir membre du réseau VPN, il crée une paire de clés et une demande de certificat pour ce client. Si l'utilisateur est de confiance, cette demande peut être signée, et le certificat obtenu peut être enregistré dans le répertoire des certificats :
sudo openssl x509 -req -in client.req -CAkey /etc/ppp/keys/ca.pem -CA /etc/ppp/certs/ca.pem -out /etc/ppp/certs/client.pem -CAcreateserialAjoutons une ligne dans le fichier /etc/ppp/eaptls-server pour faire correspondre le nom du client à son certificat :
"client" * /etc/ppp/certs/client.pem /etc/ppp/certs/server.pem /etc/ppp/certs/ca.pem /etc/ppp/keys/server.pem *NOTE
Pour ne pas se perdre, il est préférable que : le nom commun, le nom du fichier du certificat et le nom d'utilisateur soient uniques.
Il convient également de vérifier que dans d'autres fichiers d'authentification, le nom d'utilisateur que nous ajoutons n'apparaît pas, sinon des problèmes d'authentification se poseront.
Ce même certificat doit être renvoyé à l'utilisateur.
Génération de la paire de clés et du certificat
Pour réussir l'authentification, le client doit :
- générer une paire de clés ;
- avoir le certificat racine de l'AC ;
- avoir un certificat pour sa paire de clés, signé par l'AC racine.
pour le client sous Linux
Pour commencer, générons une paire de clés sur le token et créons une demande de certificat :
#идентификатор ключа (параметр --id) можно заменить на любой другой.
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type rsa:2048 -l --id 45
openssl
OpenSSL> engine dynamic -pre SO_PATH:/usr/lib/x86_64-linux-gnu/engines-1.1/pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:librtpkcs11ecp.so
...
OpenSSL> req -engine pkcs11 -new -key 45 -keyform engine -out client.req -subj "/C=RU/CN=client"Envoyez la demande newly_created client.req à l'AC. Une fois que vous aurez le certificat pour votre paire de clés, enregistrez-le sur le token avec le même ID que la clé :
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l -y cert -w ./client.pem --id 45pour les clients Windows et Linux (méthode plus universelle)
Cette méthode est plus universelle, car elle permet de générer une clé et un certificat qui seront reconnus avec succès par les utilisateurs Windows et Linux, mais nécessite un ordinateur Windows pour effectuer la procédure de génération des clés.
Avant de générer des demandes et d'importer des certificats, il faut ajouter le certificat racine du réseau VPN à la liste des certificats de confiance. Pour cela, ouvrez-le et dans la fenêtre qui s'ouvre, sélectionnez l'option "Installer le certificat" :

Dans la fenêtre qui s'ouvre, sélectionnons l'installation du certificat pour l'utilisateur local :

Installons le certificat dans le magasin des certificats racines de confiance de l'AC :

Après toutes ces étapes, nous acceptons tous les points suivants. Le système est maintenant configuré.
Créons le fichier cert.tmp avec le contenu suivant :
[NewRequest]
Subject = "CN=client"
KeyLength = 2048
KeySpec = "AT_KEYEXCHANGE"
ProviderName = "Microsoft Base Smart Card Crypto Provider"
KeyUsage = "CERT_KEY_ENCIPHERMENT_KEY_USAGE"
KeyUsageProperty = "NCRYPT_ALLOW_DECRYPT_FLAG"
RequestType = PKCS10
SMIME = FALSENous allons ensuite générer une paire de clés et créer une demande de certificat. Pour cela, ouvrez PowerShell et entrez la commande suivante :
certreq.exe -new -pin $PIN .cert.tmp .client.reqEnvoyez la demande client.req créée à votre AC et attendez de recevoir le certificat client.pem. Vous pouvez l'enregistrer sur le token et l'ajouter au magasin de certificats Windows à l'aide de la commande suivante :
certreq.exe -accept .client.pemIl convient de noter que des actions similaires peuvent être reproduites à l'aide de l'interface graphique du programme mmc, mais cette méthode est plus chronophage et moins programmable.
Configuration du client Ubuntu
NOTE
La configuration du client sur Linux est pour le moment assez longue, car elle nécessite la compilation de programmes spécifiques à partir des sources. Nous ferons en sorte que tous les changements soient intégrés dans les dépôts officiels dans un avenir proche.
Pour assurer la connexion au niveau IPSec avec le serveur, nous utilisons le paquet strongswan et le démon xl2tp. Pour simplifier la connexion au réseau à l'aide de cartes à puce, nous allons utiliser le paquet l2tp-ipsec-vpn, qui fournit une interface graphique pour simplifier la configuration de la connexion.
Nous commencerons à assembler les éléments étape par étape, mais avant cela, installons tous les paquets nécessaires au fonctionnement du VPN :
sudo apt-get install xl2tpd strongswan libp11-3Installation du logiciel pour les tokens
Installez la dernière version de la bibliothèque librtpkcs11ecp.so avec , ainsi que les bibliothèques pour travailler avec les cartes à puce :
sudo apt-get install pcscd pcsc-tools opensc libengine-pkcs11-opensslConnectez le RUTOKEN et vérifiez qu'il est reconnu par le système :
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O -lInstallation de ppp patché
sudo apt-get -y install git make gcc libssl-dev
git clone "https://github.com/jjkeijser/ppp"
cd ppp
./configure --prefix /usr
make -j4
sudo make installInstallation du client L2tpIpsecVpn
Actuellement, le client doit également être compilé à partir des sources. Cela se fait avec la séquence de commandes suivante :
sudo apt-get -y install git qt5-qmake qt5-default build-essential libctemplate-dev libltdl-dev
git clone "https://github.com/Sander80/l2tp-ipsec-vpn"
cd l2tp-ipsec-vpn
make -j4
sudo make installConfiguration du client L2tpIpsecVpn
Lancez le client installé :

Après le lancement, vous devriez voir l'applet L2tpIpsecVPN. Cliquez dessus avec le bouton droit de la souris et configurez la connexion :

Pour travailler avec les jetons, nous indiquerons d'abord le chemin du moteur OpenSSL et de la bibliothèque PKCS#11. Pour ce faire, ouvrez l'onglet "Préférences" pour configurer les paramètres openssl :
.
Fermez la fenêtre des paramètres OpenSSL et passez à la configuration du réseau. Ajoutez un nouveau réseau en cliquant sur le bouton Ajouter… dans le panneau de configuration et entrez le nom du réseau :

Après cela, ce réseau sera disponible dans le panneau de configuration. Cliquez deux fois avec le bouton droit de la souris sur le nouveau réseau pour le configurer. Dans le premier onglet, vous devez configurer IPsec. Indiquez l'adresse du serveur et la clé commune :

Ensuite, passez à l'onglet de configuration PPP et indiquez y le nom d'utilisateur avec lequel nous souhaitons nous connecter au réseau :

Après cela, ouvrez l'onglet Propriétés et indiquez le chemin vers la clé, le certificat client et l'AC :

Fermez cet onglet et effectuez la configuration finale, pour cela ouvrez l'onglet "Paramètres IP" et cochez l'option "Obtenir l'adresse du serveur DNS automatiquement" :

Cette option permettra au client d'obtenir une adresse IP personnelle du serveur dans le réseau.
Après tous les réglages, fermez tous les onglets et redémarrez le client :

Connexion au réseau
Après les réglages, vous pouvez établir une connexion au réseau. Pour cela, ouvrez l'onglet de l'applet et choisissez le réseau auquel nous souhaitons nous connecter :

Lors de l'établissement de la connexion, le client vous demandera d'entrer le code PIN du RUTOKEN :

Si une notification apparaît dans la barre d'état indiquant que la connexion a été établie avec succès, cela signifie que la configuration a été réalisée avec succès :

Dans le cas contraire, il convient de comprendre pourquoi la connexion n'a pas été établie. Pour cela, il est conseillé de consulter le journal du programme en sélectionnant dans l'applet la commande "Informations de connexion" :

Configuration du client Windows
La configuration du client sous Windows est beaucoup plus simple que sous Linux, car tout le logiciel nécessaire est déjà intégré dans le système.
Configuration du système
Installez tous les pilotes nécessaires pour travailler avec les RUTOKEN en les téléchargeant depuis .
Importation du certificat racine pour l'authentification
Téléchargez le certificat racine du serveur et installez-le dans le système. Pour cela, ouvrez-le et dans la fenêtre qui s'ouvre, sélectionnez l'option "Installer le certificat" :

Dans la fenêtre qui s'ouvre, choisissez l'installation du certificat pour l'utilisateur local. Si vous souhaitez que le certificat soit accessible à tous les utilisateurs de l'ordinateur, il faut alors choisir l'installation du certificat sur l'ordinateur local :

Installons le certificat dans le magasin des certificats racines de confiance de l'AC :

Après toutes ces étapes, nous acceptons tous les points suivants. Le système est maintenant configuré.
Configuration de la connexion VPN
Pour configurer la connexion VPN, accédez au panneau de gestion et sélectionnez l’option pour créer une nouvelle connexion.

Dans la fenêtre contextuelle, choisissez l'option de création de connexion pour accéder au poste de travail :

Dans la fenêtre suivante, sélectionnez la connexion via VPN :

et entrez les données de connexion VPN, tout en indiquant l'option d'utilisation de la carte intelligente :

La configuration n’est pas encore terminée. Il reste à indiquer la clé commune pour le protocole IPsec, pour cela, passons à l'onglet « Paramètres des connexions réseau » puis allons à l'onglet « Propriétés de cette connexion » :

Dans la fenêtre qui s’ouvre, allons à l'onglet "Sécurité", choisissons "Réseau L2TP/IPsec" comme type de réseau et sélectionnons "Options avancées" :

Dans la fenêtre qui s'ouvre, nous indiquerons la clé commune IPsec :

Connexion
Une fois la configuration terminée, vous pouvez essayer de vous connecter au réseau :

Lors du processus de connexion, il nous sera demandé d'entrer le code PIN du jeton :

Nous avons configuré un réseau VPN sécurisé et nous avons vérifié que ce n'est pas difficile.
Remerciements
Nous aimerions remercier à nouveau nos collègues Vasily Shokov et Alexander Smirnov pour leur collaboration dans la simplification de la création de connexions VPN pour les clients Linux.
Source : habr.com
