Collegamento OpenVPN su Windows Server e Mikrotik con migrazione di questo materiale in Linux

Buongiorno!

Prima o poi, ogni azienda ha la necessità di avere accesso remoto.
Praticamente ogni specialista IT si trova di fronte alla necessità di organizzare l'accesso remoto alle proprie reti aziendali.

Anche a me, come a molti altri, questa necessità è arrivata con la scadenza di “ieri”. Dopo aver analizzato tutti i «pro» e i «contro», nonché dopo aver setacciato tonnellate di informazioni e aver sfogliato un po' di teoria, ho deciso di procedere con l'installazione.

Per motivi di sicurezza, ho scelto OpenVPN nella seguente configurazione: su un server con sistema operativo Windows Server 2012 è stata installata una macchina virtuale, su questa, anch'essa Windows Server 2012, e su di essa un server OpenVPN, che emetteva e firmava certificati.

Per comodità, lo chiameremo «server di certificazione». Dopodiché, ho preso il certificato del server, l'ho inserito in Mikrotik, e sul router Mikrotik ho attivato OpenVPN con account e profili. Ho utilizzato lo stesso server di certificazione per emettere il certificato del cliente.

L'implementazione è stata decisamente imperfetta e, sebbene la mia esperienza in questi aspetti fosse, diciamo, insufficiente, rispetto alla sicurezza, non era la peggiore delle soluzioni.

Questa configurazione ha funzionato per un certo periodo e mi è stata data una nuova indicazione: trasferire il server di certificazione su Linux, mantenendo la connessione con Mikrotik — i clienti non dovevano subire danni.

Le mie conoscenze su Linux a quel tempo si limitavano a Ubuntu 16.04LTS con interfaccia grafica, utilizzato come terminale per connettersi tramite RDP a un server Windows. Cioè, sudo apt-get -f install -y, e neanche un centimetro in più.

Dopo aver studiato quale sistema operativo della famiglia Linux fosse più stabile e promettente per la mia organizzazione, mi sono fermato su CentOS 7 Minimal.

Per cominciare, ho deciso di approfondire un po' la teoria, per capire come funzionasse. Ho guardato video didattici sul canale www.youtube.com/channel/UCKdRgZWgy42YxoFcTJ30LTA (Non è assolutamente pubblicità, ma sono stati i primi che ho trovato). Una ragazza dalla voce piacevole mi ha introdotto alle basi del lavoro nel sistema operativo scelto.

Per iniziare, ho avviato Hyper-V sul mio computer, ho installato CentOS 7 Minimal, durante l'installazione ho creato l'utente Admin e ho completamente disabilitato ssh per root. Dopo aver salutato il bellissimo schermo colorato, mi sono immerso nel mondo in bianco e nero del terminale.

Non ha senso descrivere il processo di installazione del software, è meglio concentrarsi sui problemi emersi durante il processo e per i quali ho dovuto scrivere un piccolo script (che si trova sotto). È possibile trovare online la descrizione di ciascuna delle utility, ma in quel momento, quando stavo facendo tutto questo, non c'era ancora questo script, tutto veniva fatto per la prima volta, a tentoni e alla cieca.

Nello script ho cercato di automatizzare l'installazione delle utility minime necessarie per il server, disabilitare Selinux, collegare il repository Epel, installare OpenVPN e altro. Qui sotto c'è lo script stesso, è semplice, ma può essere utilizzato. Non lo esaminerò in dettaglio, ma se qualcuno ne avesse bisogno, scrivetemi e risponderò.

Dopo aver utilizzato lo script, avrete un server OpenVPN già configurato, che lampeggia con una luce verde.

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

L'installazione di OpenVPN non è andata del tutto bene.

Non conoscendo le peculiarità della politica dei diritti nei sistemi Linux, ho speso molto tempo a esaminare i log e ad assegnare i diritti necessari a tutti i file.

Quando il pulsante OpenVPN è diventato verde, mi sono molto rallegrato, ma, come si è rivelato, era solo l'inizio. Per semplicità, avevo intenzione di sostituire i certificati radice e il file crl.pem, sperando che tutto funzionasse. Alla fine, ho dovuto trasferire dal server a Windows i seguenti file:

Serv.crt — Certificato del server
Serv.key — Chiave del server
Ca.crt — Certificato radice
Ca.key — Chiave radice
Crl.pem — File dei certificati revocati
Dh.pem — Chiave Di Diffie-Hellman
Index.txt — File con informazioni sui certificati attuali
Serial — risponde anche all'attualità dei certificati

Era necessaria anche la cartella certs_by_serial, il file vars e tutte le chiavi e i certificati client.
Su Mikrotik i certificati sono rimasti al loro posto, quindi tutto ha funzionato.

I problemi sono emersi quando ho cercato di revocare un certificato, non funzionava di fatto — il file index.txt doveva essere convertito in formato unix, ma non l'avevo fatto subito. Ho utilizzato l'utility dos2unix.

Ora i certificati venivano revocati, ma continuavano a funzionare senza alcun problema, perché Mikrotik non sapeva che erano stati revocati e doveva in qualche modo essere informato.

Dopo aver letto le istruzioni e consultato Alexander ERI (grazie mille!), ho avviato un semplice server http Apache sul server di certificazione e ho pubblicato il file dei certificati revocati. Ho completamente chiuso l'accesso, tranne che al file pubblicato da un solo ip.

Nel terminale Mikrotik, nella scheda /System/Certificates/CRL, ho indicato il percorso al crl.pem pubblicato. Qui è importante specificare che Mikrotik accetta solo http e indirizzi assoluti nella scheda CRL, quindi doveva apparire all'incirca così: 127.0.0.1/crl/1.crl
Tutto ha funzionato, almeno per le versioni 6.4.2.x di RouterOS, ma le configurazioni client dovevano essere create manualmente, e questo per me è stato deludente e ha causato molti inconvenienti. Quando dopo una settimana ho dovuto creare configurazioni per circa 50 clienti, ho deciso di velocizzare questo processo e per fare ciò ho utilizzato un pezzo di script trovato nel web.

Lo script funziona così: dopo l'avvio indichiamo il "nome del cliente", rispondiamo alla domanda "impostare una password o meno", dopodiché recuperiamo il file di configurazione già pronto "client.ovpn", con integrati i certificati e le impostazioni. Per utilizzarlo, è necessario trovarsi in /etc/openvpn. Commenterò le righe in cui il percorso deve essere sostituito con il proprio. È inoltre necessario creare un file con le impostazioni del cliente, in modo che lo script le utilizzi durante la creazione della configurazione.

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

Dopo un po' di tempo, la nuova disposizione per vietare l'accesso remoto ha costretto a chiudere anche questo server, e la configurazione funzionante con Mikrotik. È stato creato un nuovo server OpenVPN, per i membri del dipartimento IT, che ora funziona interamente su CentOS. Ma questa è un'altra storia.

Esprimo un sentito ringraziamento a Ivan e Pavel per l'aiuto nella revisione dell'articolo.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster