Configurarea OpenVPN pe Windows Server și Mikrotik, cu migrarea acestei configurații în Linux

Bună ziua!

Oricărei companii, mai devreme sau mai târziu, îi devine necesar accesul de la distanță.
Practically every IT professional encounters the need to organize remote access to their networks in the company.

Această necesitate m-a prins, ca și pe mulți alții, cu eticheta „ieri”. După ce am analizat toate „avantajele” și „dezavantajele”, precum și după ce am răsfoit tone de informații și m-am cufundat puțin în teorie, am decis să încep instalarea.

În scopuri de securitate, am ales OpenVPN într-o configurație specifică: pe un server cu sistem de operare Windows Server 2012, am instalat o mașină virtuală, pe care am pus, de asemenea, Windows Server 2012, iar pe acesta am instalat serverul OpenVPN, care genera și semna certificate.

Pentru comoditate, să-i spunem „server de certificare”. Apoi, am luat certificatul serverului, l-am introdus în Mikrotik, iar pe routerul Mikrotik am configurat OpenVPN cu conturi și profile. Am folosit, de asemenea, serverul de certificare pentru emiterea certificatului clientului.

Implementarea a fost, bineînțeles, complicată, și, deși experiența mea în astfel de lucruri nu era suficientă la acel moment, în ceea ce privește securitatea, aceasta a fost o soluție rezonabilă.

Această configurație a funcționat o vreme și am primit o nouă indicație: să migrez serverul de certificare pe Linux, menținând în același timp conexiunea cu Mikrotik — clienții nu ar trebui să sufere.

Cunoștințele mele despre Linux la acel moment se limitau la Ubuntu 16.04 LTS cu interfață grafică, care era utilizat ca terminal pentru conexiunea RDP la serverul Windows. Cu alte cuvinte, sudo apt-get -f install -y, și nimic mai mult.

Cercetând care sistem de operare din familia Linux este mai stabil și promițător pentru organizația mea, am decis să aleg CentOS 7 Minimal.

La început, am decis să mă familiarizez puțin cu teoria, pentru a înțelege cum funcționează totul. Am urmărit tutoriale video pe canalul www.youtube.com/channel/UCKdRgZWgy42YxoFcTJ30LTA (Nu este reclamă, pur și simplu au fost primii care mi-au apărut). O fată cu o voce plăcută m-a introdus în conceptele de bază ale lucrului în sistemul de operare ales.

La început, am lansat Hyper-V pe computerul meu, am instalat CentOS 7 Minimal, iar în timpul instalării am creat utilizatorul Admin și am blocat complet SSH pentru root. Și, astfel, am spus adio frumosului ecran colorat și m-am cufundat în lumea alb-negru a terminalului.

Cred că nu are sens să descriu procesul de instalare a software-ului, mai bine să accentuez problemele care au apărut în proces și pentru rezolvarea cărora a trebuit să scriu un mic script (acesta este mai jos. Descrierea fiecărei utilitare o puteți găsi pe internet, dar în acel moment, când am făcut toate acestea, acest script nu exista încă, totul s-a făcut pentru prima dată, pe întuneric și la întâmplare).

În script am încercat să automatizez instalarea utilitarelor minim necesare pentru server, să dezactivez Selinux, să conectez repository-ul Epel, să instalez OpenVPN, etc. Mai jos este scriptul, care este simplu, dar poate fi folosit. Nu voi analiza scriptul, dar dacă cineva are nevoie, scrieți-mi, voi răspunde.

După utilizarea scriptului, va apărea un server OpenVPN deja configurat, winking with a green eye.

#!/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

Instalarea OpenVPN nu a fost complet un succes.

Neștiind despre particularitățile politicii de permisiuni în sistemele Linux, am petrecut mult timp studiind logurile și alocând permisiunile necesare pentru toate fișierele.

Când butonul OpenVPN a devenit verde, m-am bucurat foarte mult, dar, după cum s-a dovedit, aceasta a fost doar începutul. Într-o stare de naivitate, am sperat să înlocuiesc certificatele rădăcină și fișierul crl.pem, sperând că totul va funcționa. În cele din urmă, a fost necesar să transfer de pe server pe Windows următoarele fișiere:

Serv.crt — Certificatul serverului
Serv.key — Cheia serverului
Ca.crt — Certificatul rădăcină
Ca.key — Cheia rădăcină
Crl.pem — Fișierul certificatelor revocate
Dh.pem — Cheia Diffie-Hellman
Index.txt — Fișierul cu informații despre certificatele actuale
Serial — el este responsabil și de actualitatea certificatelor

De asemenea, a fost necesară folderul certs_by_serial, fișierul vars și toate cheile și certificatele clientului.
Pe Mikrotik, certificatele au rămas la locul lor, așa că totul a funcționat.

Problemele au apărut când am încercat să revoc certificat, nu a funcționat deloc — fișierul index.txt trebuia să fie convertit în format unix, dar eu nu am făcut asta din start. Am folosit utilitarul dos2unix.

Acum, certificatele erau revocate, dar continuau să funcționeze fără nicio problemă, pentru că Mikrotik nu știa că erau revocate și trebuia să îi comunic cumva acest lucru.

După ce am citit instrucțiunile și m-am consultat cu Alexander ERI (vă mulțumesc foarte mult!), am ridicat un server http Apache pe serverul de certificare și am publicat pe acesta fișierul cu certificate revocate. Am închis complet accesul, cu excepția fișierului publicat dintr-un singur ip.

În terminalul Mikrotik, în tab-ul /System/Certificates/CRL, am specificat calea către crl.pem publicat. Trebuie menționat că Mikrotik acceptă pentru tab-ul CRL doar http și o adresă absolută, adică ar trebui să arate aproximativ așa: 127.0.0.1/crl/1.crl
Totul a funcționat, cel puțin pentru versiunile 6.4.2.x RouterOS, însă configurațiile clienților trebuiau create manual, ceea ce m-a întristat și a cauzat multe neplăceri. Când după o săptămână mi s-a solicitat să creez configurații pentru aproximativ 50 de clienți, am decis să accelerăm acest proces și am folosit un mic fragment dintr-un script găsit pe internet.

Scriptul funcționează astfel: după lansare, specificăm «numelui clientului», răspundem la întrebarea «să stabilim o parolă sau nu», după care primim fișierul de configurație „client.ovpn”, cu certificatele și setările integrate. Pentru a-l folosi, trebuie să ne aflăm în /etc/openvpn. Voi comenta liniile în care calea trebuie înlocuită cu a mea. De asemenea, este necesar să creăm un fișier cu setările clientului, astfel încât scriptul să le utilizeze în timpul creării configurației.

#!/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

După un timp, noua intrare privind interzicerea accesului de la distanță a forțat uciderea acestui server și a legăturii active cu Mikrotik. A fost creat un nou server OpenVPN, pentru angajații departamentului IT, care acum funcționează complet pe CentOS. Dar asta este deja o cu totul altă poveste.

Îmi exprim profunda recunoștință lui Ivan și Pavel pentru ajutorul oferit la editarea articolului.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster