Utworzenie połączenia OpenVPN na Windows Server i Mikrotik z migracją do Linuxa

Dzień dobry!

Każda firma prędzej czy później staje przed koniecznością zdalnego dostępu.
Praktycznie każdy specjalista IT musi stawić czoła potrzebie zorganizowania zdalnego dostępu do swoich sieci w firmie.

Mnie, jak wielu, ta potrzeba dopadła z nakazem „na wczoraj”. Po analizie wszystkich „za” i „przeciw”, oraz przeszukaniu ton informacji i odrobinie zabawy z teorią, postanowiłem przystąpić do instalacji.

Dla bezpieczeństwa wybrałem OpenVPN w następującej konfiguracji: na serwerze z systemem Windows Server 2012 zainstalowałem maszynę wirtualną, na której również był Windows Server 2012, a na nim, z kolei, serwer OpenVPN, który wydawał i podpisywał certyfikaty.

Dla wygody nazwijmy go 'serwerem certyfikacji'. Następnie wziąłem certyfikat serwera, wprowadziłem go do Mikrotik, a na samym routerze Mikrotik uruchomiłem OpenVPN z kontami oraz profilami. Do wydania certyfikatu klienta również użyłem serwera certyfikacji.

Oczywiście, realizacja była kiepska, a chociaż mój dotychczasowy niewielki doświadczenie w takich sprawach każe mi być ostrożnym w kwestiach bezpieczeństwa, nie było to najgorsze rozwiązanie.

Ta konfiguracja działała przez jakiś czas, a następnie otrzymałem nowe zadanie: przenieść serwer certyfikacji na Linux, zachowując jednocześnie połączenie z Mikrotik — klienci nie powinni ucierpieć.

Moje znajomości Linuxa ograniczały się na tamten moment do Ubuntu 16.04 LTS z graficznym interfejsem, które było używane jako terminal do połączeń RDP z serwerem Windows. Tak więc, sudo apt-get -f install -y, i ani centymetra więcej.

Po zbadaniu, jaki system operacyjny z rodziny Linux jest bardziej stabilny i przyszłościowy dla mojej organizacji, zdecydowałem się na CentOS 7 Minimal.

Na początek postanowiłem trochę zgłębić teorię, aby zrozumieć, jak to wszystko działa. Obejrzałem kilka filmów instruktażowych na kanale www.youtube.com/channel/UCKdRgZWgy42YxoFcTJ30LTA (Wcale nie jest to reklama, po prostu trafiłem na pierwszy kanał). Dziewczyna z przyjemnym głosem zapoznała mnie z podstawami pracy w wybranym systemie operacyjnym.

Na początek uruchomiłem Hyper-V na swoim komputerze, zainstalowałem tam CentOS 7 Minimal, podczas instalacji utworzyłem użytkownika Admin i całkowicie zamknąłem ssh dla roota. Pożegnawszy się z ładnym, kolorowym ekranem, zanurkowałem w czarno-biały świat terminala.

Myślę, że nie ma sensu opisywać procesu instalacji oprogramowania, lepiej skupić się na problemach, które pojawiły się w trakcie i dla ich rozwiązania musiałem napisać mały skrypt (który znajduje się poniżej. Opis każdej z narzędzi można znaleźć w internecie, ale w momencie, gdy to robiłem, tego skryptu jeszcze nie było, wszystko było robione po raz pierwszy, na wyczucie i na chybił trafił).

W skrypcie starałem się zautomatyzować instalację minimalnie wymaganych narzędzi dla serwera, wyłączyć Selinux, podłączyć repozytorium Epel, zainstalować OpenVPN itd. Poniżej znajduje się sam skrypt, jest prosty, ale można go używać. Nie będę go szczegółowo omawiał, ale jeśli ktoś będzie potrzebował, piszcie, odpowiem.

Po użyciu skryptu pojawi się już skonfigurowany serwer OpenVPN, mrugający zielonym oczkiem.

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

Instalacja OpenVPN nie powiodła się całkowicie.

Nie znając specyfiki polityki praw w systemach Linux, spędziłem wiele czasu na analizowaniu logów i nadawaniu wszystkim plikom wymaganych uprawnień.

Kiedy przycisk OpenVPN stał się zielony, bardzo się ucieszyłem, ale jak się okazało, to było dopiero początek. Z prostoty duszy, liczyłem na wymianę certyfikatów głównych i pliku crl.pem, mając nadzieję, że wszystko zadziała. Ostatecznie musiałem przenieść z serwera na Windows następujące pliki:

Serv.crt — Certyfikat serwera
Serv.key — Klucz serwera
Ca.crt — Certyfikat główny
Ca.key — Klucz główny
Crl.pem — Plik odwołanych certyfikatów
Dh.pem — Klucz Diffiego-Hellmana
Index.txt — Plik z informacjami o aktualnych certyfikatach
Serial — on także odpowiada za aktualność certyfikatów

Potrzebna była także folder certs_by_serial, plik vars oraz wszystkie klucze i certyfikaty klientów.
Na Mikrotik certyfikaty pozostały na miejscu, więc wszystko zadziałało.

Problemy pojawiły się, gdy próbowałem odwołać certyfikat, to w ogóle nie działało — plik index.txt musiał być przekonwertowany do formatu unix, a ja tego od razu nie zrobiłem. Skorzystałem z narzędzia dos2unix.

Teraz certyfikaty były odwoływane, ale nadal działały bez żadnych problemów, ponieważ Mikrotik nie wiedział, że zostały odwołane i musiałbym jakoś mu o tym powiedzieć.

Po przeczytaniu instrukcji oraz skonsultowaniu się z Alexanderem ERI (ogromne dzięki!), uruchomiłem prosty serwer http Apache na serwerze certyfikacji i opublikowałem na nim plik odwołanych certyfikatów. Całkowicie zamknąłem dostęp do niego, z wyjątkiem opublikowanego pliku z jednego IP.

W terminalu Mikrotik, w zakładce /System/Certificates/CRL wskazałem ścieżkę do opublikowanego crl.pem. Należy tu wyjaśnić, że Mikrotik przyjmuje tylko HTTP i absolutny adres w zakładce CRL, czyli powinno to wyglądać mniej więcej tak: 127.0.0.1/crl/1.crl
Wszystko zaczęło działać, przynajmniej dla wersji 6.4.2.x RouterOS, ale konfiguracje klientów musiałem tworzyć ręcznie, co było dla mnie dużym problemem i powodowało wiele niedogodności. Kiedy po tygodniu musiałem stworzyć konfiguracje dla około 50 klientów, postanowiłem przyspieszyć ten proces, używając fragmentu cudzego skryptu znalezionego w Internecie.

Skrypt działa w ten sposób: po uruchomieniu podajemy "nazwę klienta", odpowiadamy na pytanie "czy ustawić hasło?", po czym pobieramy gotowy plik konfiguracyjny "klient.ovpn", z zintegrowanymi certyfikatami i ustawieniami. Aby go użyć, trzeba znajdować się w /etc/openvpn. Podpiszę komentarzami linijki, w których ścieżkę należy zamienić na swoją. Musimy również stworzyć plik z ustawieniami klienta, aby skrypt mógł je wstawić podczas tworzenia konfiguracji.

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

Po chwili nowe ograniczenia dotyczące zdalnego dostępu zmusiły mnie do zlikwidowania tego serwera oraz działającej kombinacji z Mikrotik. Utworzono nowy serwer OpenVPN dla pracowników działu IT, który teraz działa w pełni na CentOS. Ale to już zupełnie inna historia.

Składam ogromne podziękowania dla Iwana i Pawła za pomoc w redakcji artykułu.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster