Свързване на OpenVPN на Windows Server и Mikrotik с миграция към Linux

Добър ден!

На всяка компания в един или друг момент изведнъж ѝ става необходимо отдалечен достъп.
С необходимостта от организиране на отдалечен достъп до мрежите на предприятието се сблъсква практически всеки IT специалист.

Мен, както и много други, тази нужда ме налегна с етикет "вчера". След като анализирах всички "за" и "против", както и претърсих тонове информация и се порових малко в теорията, реших да започна инсталацията.

С цел сигурност, избрах OpenVPN в следната конфигурация: на сервер с операционна система Windows Server 2012 беше инсталирана виртуална машина, на която също беше Windows Server 2012, а на него, от своя страна, сървър OpenVPN, който издаваше и подписваше сертификати.

За удобство ще го наречем "сервер за сертификация". След това взех сертификата на сървъра, натъпках го в Mikrotik и на самия рутер Mikrotik стартирах OpenVPN с акаунти и профили. За издаване на клиентския сертификат също използвах сървъра за сертификация.

Реализацията, разбира се, е ужасна и, макар на този етап моят опит в подобни неща да беше, да речем, недостатъчен, в областта на сигурността, това не беше най-лошото решение.

Тази свързаност поработи известно време и получих нова задача: да преместя сървъра за сертификация на Linux, при това да запазя връзката с Mikrotik — клиентите не трябва да пострадат.

Знанията ми по Linux към онзи момент се състояха единствено в Ubuntu 16.04LTS с графичен интерфейс, която се използваше като терминал за свързване по RDP към Windows сървъра. Тоест, sudo apt-get -f install -y и ни йота повече.

Изучавайки въпроса коя ОС от семейството на Linux е по-устойчива и перспективна за моята организация, се спрях на CentOS 7 Minimal.

Първо реших да се поровя в теорията, за да разбера как всичко това функционира и работи. Гледах видео уроци на канала www.youtube.com/channel/UCKdRgZWgy42YxoFcTJ30LTA (Наистина не е реклама, просто те ми попаднаха първи). Момичето с приятен глас ме запозна с основите на работа в избраната ОС.

Първо стартирах на компютъра си Hyper-V, инсталирах CentOS 7 Minimal там, по време на инсталацията създадох потребител Admin и напълно затворих ssh за root. Сбогувах се с красивия цветен екран и се потопих в черно-белия свят на терминала.

Мисля, че няма смисъл да описвам процеса на инсталиране на софтуера, по-добре е да акцентирам на проблемите, които възникнаха по време на процеса и за решаването на които ми се наложи да напиша малък скрипт (той е под заглавието. Описание на всяка от утилитите може да се намери в интернет, но в момента, когато правех всичко това, този скрипт все още не съществуваше, всичко ставаше за първи път, на сляпо и на случаен принцип).

В скрипта се опитах да автоматизирам инсталацията на минимално необходимите утилити за сървъра, да изключа Selinux, да включа репозитория Epel, да инсталирам OpenVPN и т.н. По-долу е самият скрипт, той е прост, но може да се използва. Няма да го разяснявам, но ако на някого му трябва, пишете, ще отговоря.

След използването на скрипта, ще имате вече настроен сървър OpenVPN, мигащ с зеленото си око.

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

Инсталацията на OpenVPN не мина съвсем успешно.

Не знаейки за особеностите на правната политика в Linux системите, прекарах много време в изучаване на логове и придаване на необходимите права на всички файлове.

Когато бутонът OpenVPN стана зелен, много се зарадвах, но как се оказа, това беше само началото. Поради простодушие, си помислих, че просто ще заменя кореновите сертификати и файла crl.pem, надявайки се, че всичко ще заработи. В крайна сметка, трябваше да пренеса от сървъра на Windows следните файлове:

Serv.crt — Сертификат на сървъра
Serv.key — Ключ на сървъра
Ca.crt — Коренов сертификат
Ca.key — Коренов ключ
Crl.pem — Файл с отзовани сертификати
Dh.pem — ключ на Диффи-Хелмана
Index.txt — Файл с информация за актуалните сертификати
Serial — той също отговаря за актуалността на сертификатите

Също така беше необходима папка certs_by_serial, файла vars и всички клиентски ключове и сертификати.
На Mikrotik сертификатите останаха на място, затова всичко заработи.

Проблемите се появиха, когато се опитах да отзовавам сертификат, това не работеше изобщо — файла index.txt трябваше да бъде преобразуван в unix формат, а не го направих веднага. Използвах утилитата dos2unix.

Сега сертификатите се отзоваха, но продължаваха да работят без никакви проблеми, защото Mikrotik не знаеше, че са отзовани и трябваше по някакъв начин да му съобщя.

Следвайки инструкциите и след като се консултирах с Александър ЕРИ (огромно благодаря!), инсталирах прост http сървър Apache на сертификационен сървър и публикувах файла с отзовани сертификати. Напълно затворих достъпа до него, освен до публикувания файл от един ip адрес.

В терминала на Mikrotik, в раздела /System/Certificates/CRL задействам пътя към публикувания crl.pem. Тук следва да уточня, че Mikrotik приема само http и абсолютен адрес за раздела CRL, т.е. той трябва да изглежда приблизително така: 127.0.0.1/crl/1.crl
Всичко тръгна, поне за версиите 6.4.2.x RouterOS, но клиентските конфигурации трябваше да бъдат създавани ръчно, което е малко тъжно и предизвика множество неудобства. Когато след една седмица ми се наложи да създам конфигурации за около 50 клиенти, реших да ускоря този процес и за целта използвах част от чужд скрипт, намерен в интернет.

Скриптът работи така: след стартиране задаваме 'името на клиента', отговаряме на въпроса 'да зададем ли парола или не', след което получаваме готовия файл с конфигурация 'клиент.ovpn', с интегрирани сертификати и настройки. За да го използваме, трябва да се намираме в /etc/openvpn. Ще коментирам редовете, в които трябва да замените пътя със своя. Също така е необходимо да създадете файл с настройки на клиента, така че скриптът да ги подстави в процеса на създаване на конфигурацията.

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

След известно време новото изискване за забрана на отдалечен достъп принуди да затворя и този сървър, и работещата връзка с Mikrotik. Създаде се нов сервер OpenVPN за служителите от IT отдела, който в момента работи изцяло на CentOS. Но това вече е съвсем друга история.

Изразявам огромна благодарност на Иван и Павел за помощта при редакцията на статията.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster