OpenVPN-bind på Windows Server og Mikrotik med migration af dette til Linux

Goddag!

Hver virksomhed får på et tidspunkt pludselig brug for fjernadgang.
Næsten hver IT-specialist står overfor behovet for at organisere fjernadgang til deres netværk.

Som mange andre blev jeg ramt af dette behov med et: “i går”. Efter at have analyseret alle fordele og ulemper samt gennemgået tonvis af information og dykket lidt ned i teorien, besluttede jeg at gå i gang med installationen.

Af sikkerhedsmæssige årsager valgte jeg OpenVPN i følgende opsætning: på en server med operativsystemet Windows Server 2012 blev der installeret en virtuel maskine, hvor også Windows Server 2012 blev installeret, og på den var der OpenVPN-serveren, der udstedte og underskrev certifikater.

For nemheds skyld kalder vi den "certificeringsserver". Derefter tog jeg servercertifikatet, indsatte det i Mikrotik, og på selve Mikrotik-routeren opsatte jeg OpenVPN med brugerkonti og profiler. Jeg brugte også certificeringsserveren til at udstede klientcertifikater.

Implementeringen var selvfølgelig noget kaotisk, og selvom jeg på det tidspunkt ikke havde meget erfaring med sådanne ting, var det ikke den værste løsning i forhold til sikkerhed.

Denne opsætning fungerede i et stykke tid, og jeg fik en ny opgave: at flytte certificeringsserveren til Linux, samtidig med at forbindelsen til Mikrotik skulle opretholdes — klienterne måtte ikke lide overlast.

Mine Linux-viden på det tidspunkt stoppede ved Ubuntu 16.04LTS med grafisk interface, som jeg brugte som terminal til at forbinde til Windows-serveren via RDP. Det vil sige, sudo apt-get -f install -y, og ikke mere.

Efter at have undersøgt, hvilken OS fra Linux-familien der er mere stabil og lovende for min organisation, landede jeg på CentOS 7 Minimal.

Først besluttede jeg at dykke lidt ned i teorien for at forstå, hvordan det hele fungerer. Jeg så videolektioner på kanalen www.youtube.com/channel/UCKdRgZWgy42YxoFcTJ30LTA (Overhovedet ikke reklame, de kom bare op først). En kvinde med en behagelig stemme introducerede mig til grundlæggende arbejde i den valgte OS.

Først startede jeg Hyper-V på min computer, installerede CentOS 7 Minimal der, og under installationen oprettede jeg brugeren Admin og lukkede helt for ssh til root. Efter at have sagt farvel til den flotte farverige skærm, dykkede jeg ind i en sort-hvid verden af terminalen.

Jeg mener, der ikke er nogen grund til at beskrive installationsprocessen for softwaren. Det er bedre at fokusere på de problemer, der opstod undervejs, og som gjorde, at jeg måtte skrive et lille script (det er ved siden af. Beskrivelsen af hver enkelt værktøj kan findes på internettet, men på det tidspunkt, hvor jeg lavede det hele, var dette script endnu ikke eksisterende; alt blev gjort for første gang, på gefühl og gæt).

I scriptet forsøgte jeg at automatisere installationen af de minimalt nødvendige værktøjer til serveren, deaktivere Selinux, tilslutte Epel-repositoriet, installere OpenVPN osv. Herunder selve scriptet; det er simpelt, men det kan bruges. Jeg vil ikke gå i dybden med det, men hvis nogen har brug for det, kan I skrive, så svarer jeg.

Efter at have brugt scriptet vil der være en allerede konfigureret OpenVPN-server, der blinker med et grønt lys.

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

Installation af OpenVPN gik ikke helt som planlagt.

Uden at vide om de specifikke tilladelsespolitikker i Linux-systemer brugte jeg en masse tid på at studere logfiler og tildele de nødvendige rettigheder til alle filer.

Da OpenVPN-knappen blev grøn, blev jeg meget glad, men som det viste sig, var det kun begyndelsen. Med god tro forventede jeg at udskifte rodcertifikaterne og filen crl.pem i håbet om, at alt ville fungere. I sidste ende måtte jeg overføre følgende filer fra serveren til Windows:

Serv.crt — Servercertifikat
Serv.key — Servernøgle
Ca.crt — Rodcertifikat
Ca.key — Rodnøgle
Crl.pem — Fil med tilbagekaldte certifikater
Dh.pem — Diffie-Hellman-nøgle
Index.txt — Fil med oplysninger om aktuelle certifikater
Serial — det er også ansvarligt for certifikaternes aktualitet

Jeg fik også brug for mappen certs_by_serial, filen vars, og alle klientnøgler og certifikater.
På Mikrotik forblev certifikaterne på deres pladser, så alt fungerede.

Problemerne opstod, da jeg forsøgte at tilbagekalde et certifikat; det fungerede overhovedet ikke — filen index.txt skulle konverteres til unix-format, og jeg gjorde ikke det med det samme. Jeg brugte værktøjet dos2unix.

Nu blev certifikaterne tilbagekaldt, men de fortsatte med at fungere uden problemer, fordi Mikrotik ikke vidste, at de var tilbagekaldt, og det havde brug for at få besked om det.

Efter at have læst instruktionerne og talt med Alexander ERI (en stor tak!), har jeg opsat en simpel http-server Apache på certifikationsserveren og offentliggjort filen med tilbagekaldte certifikater. Jeg har helt lukket adgangen til den, bortset fra den offentliggjorte fil fra én ip.

I terminalen Mikrotik, under fanen /System/Certificates/CRL, angav jeg stien til den offentliggjorte crl.pem. Her skal det præciseres, at Mikrotik kun accepterer http og en absolut adresse til fanen CRL, dvs. det skulle se omtrent sådan ud: 127.0.0.1/crl/1.crl
Alt fungerer, i det mindste for versioner 6.4.2.x RouterOS, men klientkonfigurationer måtte oprettes manuelt, hvilket var frustrerende og medførte betydelige ulemper for mig. Da jeg en uge senere skulle oprette konfigurationer for cirka 50 kunder, besluttede jeg at fremskynde denne proces og brugte et stykke kode fra en anden skript, som jeg fandt på internettet.

Skripten fungerer således: efter lanceringen angiver vi "klientnavn", svarer på spørgsmålet "installere password eller ej", hvorefter vi henter den færdige konfigurationsfil "klient.ovpn" med integrerede certifikater og indstillinger. For at bruge den, skal man befinde sig i /etc/openvpn. Jeg vil kommentere linjerne, hvor stien skal erstattes med ens egen. Det er også nødvendigt at oprette en fil med klientindstillinger, så skripten kan indsætte dem under oprettelsen af konfigurationen.

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

Efter et stykke tid tvang en ny indførelse af forbud mod fjernadgang mig til at lukke denne server samt det fungerende setup med Mikrotik. En ny OpenVPN-server blev oprettet til IT-afdelingens ansatte, som nu kører fuldstændigt på CentOS. Men det er en helt anden historie.

Jeg vil gerne udtrykke en stor tak til Ivan og Pavel for hjælpen med redigeringen af artiklen.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster