Association OpenVPN sur Windows Server et Mikrotik avec migration de cela vers Linux

Bonjour !

Chaque entreprise a tôt ou tard besoin d'un accès à distance.
Chaque professionnel de l'informatique est confronté à la nécessité de mettre en place un accès à distance à ses réseaux.

Cette demande m'a, comme beaucoup d'autres, frappé de plein fouet avec l'étiquette « hier ». Après avoir analysé le pour et le contre, ainsi qu'épluché des tonnes d'informations et approfondi un peu la théorie, j'ai décidé de commencer l'installation.

Pour des raisons de sécurité, j'ai choisi OpenVPN dans la configuration suivante : une machine virtuelle a été installée sur un serveur fonctionnant sous Windows Server 2012, avec également Windows Server 2012, sur lequel le serveur OpenVPN a été installé, qui délivrait et signait les certificats.

Pour faciliter, appelons-le « serveur de certification ». Ensuite, j'ai pris le certificat du serveur, l'ai intégré dans Mikrotik, et sur le routeur Mikrotik, j'ai configuré OpenVPN avec des comptes et des profils. J'ai également utilisé le serveur de certification pour délivrer le certificat du client.

La mise en œuvre est, bien sûr, désastreuse, et bien que mon expérience à l'époque dans ce domaine fût, disons, insuffisante, ce n'était pas la pire solution en matière de sécurité.

Cette configuration a fonctionné un certain temps et j'ai reçu une nouvelle directive : transférer le serveur de certification sur Linux, tout en gardant la connexion avec Mikrotik — les clients ne doivent pas être affectés.

À l'époque, mes connaissances en Linux se limitaient à Ubuntu 16.04 LTS avec interface graphique, utilisée comme terminal pour la connexion RDP au serveur Windows. C'était donc sudo apt-get -f install -y, et rien de plus.

Après avoir étudié quelle distribution Linux serait la plus stable et prometteuse pour mon organisation, j'ai opté pour CentOS 7 Minimal.

Pour commencer, j'ai décidé d'explorer un peu la théorie, pour comprendre comment tout cela fonctionne. J'ai regardé des vidéos sur la chaîne www.youtube.com/channel/UCKdRgZWgy42YxoFcTJ30LTA (Ce n'est pas de la publicité, elles m'ont juste été présentées en premier). Une jeune femme à la voix agréable m'a familiarisé avec les bases de la gestion dans le système d'exploitation choisi.

Pour commencer, j'ai lancé Hyper-V sur mon ordinateur, installé CentOS 7 Minimal, et lors de l'installation, j'ai créé l'utilisateur Admin et complètement fermé ssh pour root. Ayant fait mes adieux à l'écran multicolore, je me suis plongé dans le monde noir et blanc du terminal.

Je ne pense pas qu'il soit nécessaire de décrire le processus d'installation du logiciel, il vaut mieux se concentrer sur les problèmes qui sont survenus pendant le processus et pour la résolution desquels j'ai dû écrire un petit script (il est en bas de page. La description de chaque utilitaire peut être trouvée sur Internet, mais à ce moment-là, ce script n'existait pas encore, tout a été fait pour la première fois, à tâtons et au hasard).

Dans le script, j'ai essayé d'automatiser l'installation des utilitaires minimum nécessaires pour le serveur, de désactiver Selinux, de connecter le dépôt Epel, d'installer OpenVPN, etc. Voici le script lui-même, il est simple, mais il peut être utilisé. Je ne vais pas le décomposer, mais si quelqu'un en a besoin, écrivez-moi, je répondrai.

Après l'utilisation du script, un serveur OpenVPN déjà configuré fera son apparition, clignant de l'œil avec un œil vert.

#!/bin/bash
cd /etc/sysconfig/
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' selinux
sudo setenforce 0
cd /home/Admin
sudo yum update -y
sudo yum install epel-release -y
sudo yum install mc -y
sudo yum install nano -y
sudo cp /usr/share/mc/syntax/sh.syntax /usr/share/mc/syntax/unknown.syntax
sudo yum install chrony -y
sudo systemctl start chronyd
sudo systemctl enable chronyd
sudo yum install net-tools -y
sudo yum install iftop -y
sudo yum install htop -y
sudo yum install lsof -y
sudo yum install dos2unix -y
sudo yum install wget -y
sudo yum install tcpdump -y
sudo yum install openvpn -y
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.3/EasyRSA-3.0.3.tgz
sudo tar -xvzf EasyRSA-3.0.3.tgz
sudo chown -R Admin:Admin /var/log
sudo chmod 755 /var/log
mkdir /var/log/openvpn
mkdir /etc/openvpn/ccd	
sudo chown -R Admin:Admin /etc/openvpn/ccd
sudo chown -R Admin:Admin /var/log/openvpn
chmod 755 /etc/openvpn/ccd
chmod 755 /var/log/openvpn
echo >/var/log/openvpn/openvpn-status.log
echo >/var/log/openvpn/openvpn.log
sudo chown -R Admin:Admin /etc/resolv.conf
chmod 755 /etc/resolv.conf
echo  nameserver 8.8.8.8 >>/etc/resolv.conf
cd /etc/openvpn/ 
sudo /home/Admin/EasyRSA-3.0.3/easyrsa init-pki
sudo chown -R Admin:Admin /etc/openvpn
chmod 755 /etc/openvpn
 echo  set_var EASYRSA_DN "org" >/home/Admin/EasyRSA-3.0.3/test
 echo	set_var EASYRSA_REQ_COUNTRY "RU" >>/home/Admin/EasyRSA-3.0.3/test
 echo	set_var EASYRSA_KEY_SIZE 4096 >>/home/Admin/EasyRSA-3.0.3/test
 echo	set_var EASYRSA_REQ_PROVINCE "LIP" >>/home/Admin/EasyRSA-3.0.3/test
 echo	set_var EASYRSA_REQ_CITY "Lipetsk" >>/home/Admin/EasyRSA-3.0.3/test
 echo	set_var EASYRSA_REQ_ORG "Cool-Admin" >>/home/Admin/EasyRSA-3.0.3/test
 echo	set_var EASYRSA_REQ_EMAIL "xxx.ru" >>/home/Admin/EasyRSA-3.0.3/test
 echo	set_var EASYRSA_REQ_OU "Our_ORG" >>/home/Admin/EasyRSA-3.0.3/test
 echo	set_var EASYRSA_REQ_CN "changeme" >>/home/Admin/EasyRSA-3.0.3/test
 echo	set_var EASYRSA_CERT_EXPIRE 3650 >>/home/Admin/EasyRSA-3.0.3/test
 echo	set_var EASYRSA_DH_KEY_SIZE=2048 >>/home/Admin/EasyRSA-3.0.3/test
sudo /home/Admin/EasyRSA-3.0.3/easyrsa build-ca nopass
sudo /home/Admin/EasyRSA-3.0.3/easyrsa build-server-full Serv nopass
sudo /home/Admin/EasyRSA-3.0.3/easyrsa build-client-full Client1 nopass
sudo /home/Admin/EasyRSA-3.0.3/easyrsa --vars=vars gen-dh
sudo /home/Admin/EasyRSA-3.0.3/easyrsa --vars=vars gen-crl
 mkdir keys
sudo chown -R Admin:Admin /etc/openvpn/keys
chmod 755 /etc/openvpn/keys
sudo cp /etc/openvpn/pki/ca.crt /etc/openvpn/keys
sudo cp /etc/openvpn/pki/dh.pem /etc/openvpn/keys
sudo cp /etc/openvpn/pki/crl.pem /etc/openvpn/keys
sudo cp /etc/openvpn/pki/issued/Serv.crt /etc/openvpn/keys
sudo cp /etc/openvpn/pki/private/Serv.key /etc/openvpn/keys
echo port 443 						>/etc/openvpn/server.conf
echo proto udp					>>/etc/openvpn/server.conf
echo dev tun						>>/etc/openvpn/server.conf
echo ca /etc/openvpn/keys/ca.crt			>>/etc/openvpn/server.conf		
echo cert /etc/openvpn/keys/Serv.crt			>>/etc/openvpn/server.conf
echo key /etc/openvpn/keys/Serv.key		>>/etc/openvpn/server.conf
echo dh /etc/openvpn/keys/dh.pem			>>/etc/openvpn/server.conf
echo crl-verify /etc/openvpn/keys/crl.pem		>>/etc/openvpn/server.conf
echo client-config-dir /etc/openvpn/ccd		>>/etc/openvpn/server.conf
echo topology subnet					>>/etc/openvpn/server.conf
echo server 172.21.0.0 255.255.255.0		>>/etc/openvpn/server.conf
echo route 172.21.0.0 255.255.255.0			>>/etc/openvpn/server.conf
echo push "dhcp-option DNS 8.8.8.8"		>>/etc/openvpn/server.conf
echo push "dhcp-option DNS 8.8.4.4"		>>/etc/openvpn/server.conf
echo keepalive 10 120				>>/etc/openvpn/server.conf
echo persist-key					>>/etc/openvpn/server.conf
echo persist-tun					>>/etc/openvpn/server.conf
echo status /var/log/openvpn/openvpn-status.log	>>/etc/openvpn/server.conf
echo log-append /var/log/openvpn/openvpn.log	>>/etc/openvpn/server.conf
echo verb 2						>>/etc/openvpn/server.conf
echo mute 20						>>/etc/openvpn/server.conf
echo daemon						>>/etc/openvpn/server.conf
echo mode server					>>/etc/openvpn/server.conf
echo user nobody					>>/etc/openvpn/server.conf
echo group nobody					>>/etc/openvpn/server.conf
sudo chown -R Admin:Admin /etc/sysctl.conf
chmod 755 /etc/sysctl.conf
echo net.ipv4.ip_forward=1 >>/etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf
sudo systemctl enable openvpn@server
sudo systemctl start openvpn@server
sudo systemctl status openvpn@server

L'installation d'OpenVPN n'a pas été tout à fait réussie.

Ignorant les particularités de la politique de droits sur les systèmes Linux, j'ai passé beaucoup de temps à étudier les journaux et à attribuer les droits requis à tous les fichiers.

Lorsque le bouton OpenVPN est devenu vert, j'étais très heureux, mais il s'est avéré que ce n'était que le début. Dans ma naïveté, je pensais remplacer les certificats racines et le fichier crl.pem, espérant que tout fonctionnerait. Au final, j'ai dû transférer les fichiers suivants du serveur vers Windows :

Serv.crt — Certificat du serveur
Serv.key — Clé du serveur
Ca.crt — Certificat racine
Ca.key — Clé racine
Crl.pem — Fichier des certificats révoqués
Dh.pem — Clé de Diffie-Hellman
Index.txt — Fichier avec des informations sur les certificats actifs
Serial — il est également responsable de la validité des certificats

J'avais également besoin du dossier certs_by_serial, du fichier vars, et de toutes les clés et certificats clients.
Sur Mikrotik, les certificats restaient en place, donc tout fonctionnait.

Des problèmes sont apparus lorsque j'ai essayé de révoquer le certificat, cela ne fonctionnait pas du tout — le fichier index.txt devait être converti au format Unix, et je ne l'avais pas fait tout de suite. J'ai utilisé l'outil dos2unix.

Maintenant, les certificats étaient révoqués, mais continuaient à fonctionner sans aucun problème, car Mikrotik ne savait pas qu'ils avaient été révoqués et qu'il était nécessaire de lui en faire part.

Après avoir lu les instructions et consulté Alexandre Eri (un grand merci !), j'ai mis en place un simple serveur HTTP Apache sur le serveur de certification et publié un fichier de certificats révoqués. L'accès a été complètement fermé, sauf pour le fichier publié depuis une seule adresse IP.

Dans le terminal Mikrotik, dans l'onglet /System/Certificates/CRL, j'ai spécifié le chemin vers le crl.pem publié. Il convient de préciser que Mikrotik n'accepte que les adresses HTTP pour l'onglet CRL, c'est-à-dire qu'elle doit ressembler à ceci : 127.0.0.1/crl/1.crl
Tout a fonctionné, du moins pour les versions 6.4.2.x de RouterOS, mais les configurations clients devaient être créées manuellement, ce qui m'a causé beaucoup de désagréments. Lorsque j'ai dû créer des configurations pour environ 50 clients une semaine plus tard, j'ai décidé d'accélérer ce processus en utilisant un extrait d'un script trouvé sur Internet.

Le script fonctionne ainsi : après son lancement, nous indiquons « le nom du client », répondons à la question « installer un mot de passe ou non », puis récupérons le fichier de configuration « client.ovpn » déjà préparé, avec les certificats et les paramètres intégrés. Pour l'utiliser, il faut être dans /etc/openvpn. Je commenterai les lignes où le chemin doit être remplacé par le vôtre. Il faut également créer un fichier avec les paramètres du client, que le script intégrera lors de la création de la configuration.

#!/bin/bash
function newClient () {
	echo ""
	echo "Tell me a name for the client."
	echo "Use one word only, no special characters."

	until [[ "$CLIENT" =~ ^[a-zA-Z0-9_]+$ ]]; do
		read -rp "Client name: " -e CLIENT
	done

	echo ""
	echo "Do you want to protect the configuration file with a password?"
	echo "(e.g. encrypt the private key with a password)"
	echo "   1) Add a passwordless client"
	echo "   2) Use a password for the client"

	until [[ "$PASS" =~ ^[1-2]$ ]]; do
		read -rp "Select an option [1-2]: " -e -i 1 PASS
	done

	#cd /etc/openvpn/easy-rsa/ || return
	case $PASS in
		1)
		sudo /home/admin/EasyRSA-3.0.3/easyrsa build-client-full "$CLIENT" nopass
		;;
		2)
		echo "You will be asked for the client password below"
			./easyrsa build-client-full "$CLIENT"
		;;
	esac
# Generates the custom client.ovpn
	cp /etc/openvpn/client-template.txt "$home/home/admin/IT/Temp/$CLIENT.ovpn" 
#Директория в которой хранится файл с настройками клиента.
#Директория, в которой сформируется файл конфигурации
	{
		echo "<ca>"
		cat "/etc/openvpn/pki/ca.crt" #Директория хранения корневого сертификата
		echo "</ca>"

		echo "<cert>"
		awk '/BEGIN/,/END/' "/etc/openvpn/pki/issued/$CLIENT.crt" #Директория с созданным #сертификатом клиента
		echo "</cert>"

		echo "<key>"
		cat "/etc/openvpn/pki/private/$CLIENT.key" #Директория с созданным ключом клиента
		echo "</key>"

} >> "$home/home/admin/IT/Temp/$CLIENT.ovpn" #Директория, в которой сформируется файл #конфигурации

	echo ""
	echo "Client $CLIENT added, the configuration file is available at $home/admin/IT/OVPN/Temp/$CLIENT.ovpn."
	echo "Download the .ovpn file and import it in your OpenVPN client."
exit 0;
}
newClient

Après un certain temps, une nouvelle directive interdisant l'accès à distance a obligé à supprimer ce serveur, ainsi que la connexion avec Mikrotik. Un nouveau serveur OpenVPN a été créé pour le personnel du département informatique, qui fonctionne désormais entièrement sous CentOS. Mais c'est une autre histoire.

Je tiens à remercier chaleureusement Ivan et Pavel pour leur aide dans la rédaction de cet article.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster