Spojení OpenVPN na Windows Server a Mikrotik s migrací tohoto řešení do Linuxu

Dobrý den!

Každé podnikání se dříve či později, nečekaně, dostane do situace, kdy potřebuje vzdálený přístup.
S potřebou zorganizovat vzdálený přístup k vlastním sítím se setká téměř každý IT odborník.

Mě, stejně jako mnohé z vás, tato potřeba zastihla s označením „včera“. Po analýze všech „pro“ a „proti“, a také po prozkoumání mnoha informací a lehkém zkoumání teorie, jsem se rozhodl přistoupit k instalaci.

Pro bezpečnost byla zvolena implementace OpenVPN následujícím způsobem: na serveru s operačním systémem Windows Server 2012 byla nainstalována virtuální mašina, na které byl také Windows Server 2012, a na něm byl spuštěn server OpenVPN, který vydával a podepisoval certifikáty.

Pro pohodlí jej nazveme „certifikační server“. Poté jsem vzal certifikát serveru, vložil ho do Mikrotiku, a na samotném směrovači Mikrotik jsem zprovoznil OpenVPN s uživatelskými účty a profily. Pro vydání certifikátu klienta jsem také využil certifikační server.

Implementace byla samozřejmě nedokonalá, a přestože v té době mé zkušenosti v podobných záležitostech byly, řekněme, nedostatečné, v otázkách zabezpečení to nebylo nejhorší řešení.

Tato kombinace fungovala nějakou dobu a bylo mi dáno nové zadání: přesunout certifikační server na Linux, přičemž zachovat spojení s Mikrotikem – klienti nesmějí být zasaženi.

Moje znalosti o Linuxu v té době končily na Ubuntu 16.04 LTS s grafickým rozhraním, které bylo používáno jako terminál pro připojení přes RDP k serveru Windows. Tedy, sudo apt-get -f install -y, a ani o centimetr více.

Po prozkoumání otázky, která distribuce Linuxu je pro moji organizaci nejstabilnější a nejnadějnější, jsem se rozhodl pro CentOS 7 Minimal.

Nejprve jsem se rozhodl trochu ponořit do teorie, abych pochopil, jak to vůbec funguje a jak je to uspořádáno. Podíval jsem se na video návody na kanálu www.youtube.com/channel/UCKdRgZWgy42YxoFcTJ30LTA (Ono to není reklama, prostě mi přišli jako první). Dívka s příjemným hlasem mě seznámila se základy práce v vybraném OS.

Nejprve jsem na svém počítači spustil Hyper-V, nainstaloval jsem tam CentOS 7 Minimal, během instalace jsem vytvořil uživatele Admin a úplně zakázal ssh pro root. Sbohem krásnému barevnému obrazovce, ponořil jsem se do černo-bílého světa terminálu.

Myslím, že není potřeba popisovat proces instalace softwaru, raději se zaměřím na problémy, které nastaly během procesu, a na jejichž vyřešení jsem musel napsat malý skript (ten je pod perexem. Popis každého z nástrojů lze najít na internetu, ale v té době, kdy jsem to všechno dělal, tento skript ještě neexistoval, všechno se dělalo poprvé, naslepo a náhodně).

Ve skriptu jsem se snažil automatizovat instalaci minimálně potřebných nástrojů pro server, vypnout Selinux, připojit repozitář Epel, nainstalovat OpenVPN a podobně. Níže je samotný skript, je jednoduchý, ale dá se použít. Nebudu ho podrobně rozebírat, ale pokud to někomu bude potřeba, napište, odpovím.

Po použití skriptu se objeví již nastavený server OpenVPN, který mrká zeleným okem.

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

Instalace OpenVPN neproběhla zcela úspěšně.

Bez znalosti specifik politiky práv na Linuxových systémech jsem strávil spoustu času studiem logů a přiřazováním potřebných práv všem souborům.

Když tlačítko OpenVPN zmodralo, velmi jsem se potěšil, ale jak se ukázalo, bylo to teprve začátek. Ve své naivitě jsem plánoval nahradit kořenové certifikáty a soubor crl.pem, doufaje, že to všechno bude fungovat. Nakonec jsem potřeboval přenést ze serveru na Windows následující soubory:

Serv.crt — Certifikát serveru
Serv.key — Klíč serveru
Ca.crt — Kořenový certifikát
Ca.key — Kořenový klíč
Crl.pem — Soubor odvolaných certifikátů
Dh.pem — Klíč Diffie-Hellman
Index.txt — Soubor s informacemi o aktuálních certifikátech
Serial — Ten také odpovídá za aktuálnost certifikátů

Také byla potřeba složka certs_by_serial, soubor vars, a všechny klientské klíče a certifikáty.
Na Mikrotiku certifikáty zůstaly na místě, takže vše fungovalo.

Problémy se objevily, když jsem se pokusil odvolat certifikát, to prostě nefungovalo — soubor index.txt bylo potřeba převést do unixového formátu, což jsem hned neudělal. Využil jsem nástroj dos2unix.

Nyní se certifikáty odvolávaly, ale nadále pracovaly bez jakýchkoli problémů, protože Mikrotik nevěděl, že byly odvolány, a bylo mu potřeba nějakým způsobem to oznámit.

Po přečtení pokynů a konzultaci s Alexandrem ERI (moc děkuji!) jsem na certifikačním serveru spustil jednoduchý http server Apache a na něm zveřejnil soubor odvolaných certifikátů. Úplně jsem uzavřel přístup k němu, kromě publikovaného souboru z jedné ip adresy.

V terminálu Mikrotik, v záložce /System/Certificates/CRL jsem zadal cestu k publikovanému crl.pem. Je třeba upřesnit, že Mikrotik přijímá pro záložku CRL pouze http a absolutní adresu, tedy to mělo vypadat přibližně takto: 127.0.0.1/crl/1.crl
Všechno fungovalo, alespoň pro verze 6.4.2.x RouterOS, ale klientské konfigurace bylo třeba vytvářet ručně, což bylo pro mě velmi nepříjemné a vyžadovalo to spoustu úsilí. Když jsem po týdnu potřeboval vytvořit konfigurace pro asi 50 klientů, rozhodl jsem se tento proces urychlit a k tomu jsem použil kousek cizího skriptu, který jsem našel na internetu.

Skriptu funguje takto: po spuštění zadáme „jméno klienta“, odpovíme na otázku „nastavit heslo nebo ne“, poté si stáhneme již hotový konfigurační soubor „klient.ovpn“, s integrovanými certifikáty a nastavením. Pro jeho použití je třeba se nacházet v /etc/openvpn. Okomentuju řádky, ve kterých je třeba změnit cestu na svou. Také je nutné vytvořit soubor s nastavením klienta, aby skript zahrnul tyto detaily během vytváření konfigurace.

#!/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 nějaké době nové nařízení o zákazu vzdáleného přístupu donutilo zrušit i tento server a fungující vazbu s Mikrotik. Byl vytvořen nový server OpenVPN pro zaměstnance IT oddělení, který nyní běží zcela na CentOS. Ale to už je úplně jiný příběh.

Vyjadřuji obrovské díky Ivanu a Pavlovi za pomoc při úpravě článku.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster