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

Buongiorno!

A ogni azienda, prima o poi, capita di avere bisogno dell'accesso remoto.
Ogni professionista IT si trova prima o poi a dover organizzare l'accesso remoto alle reti aziendali.

Io, come molti, ho avvertito questa esigenza con urgenza. Dopo aver analizzato tutti i 'pro' e 'contro', e aver setacciato tonnellate di informazioni, ho deciso di iniziare l'installazione.

Per motivi di sicurezza, ho scelto OpenVPN in questa configurazione: su un server con sistema operativo Windows Server 2012 è stata installata una macchina virtuale, sempre su Windows Server 2012, su cui ho configurato il server OpenVPN per emettere e firmare i certificati.

Per comodità, la chiameremo 'server di certificazione'. Successivamente, ho preso il certificato del server e l'ho inserito in Mikrotik, mentre sul router Mikrotik ho avviato OpenVPN con gli account e i profili. Ho utilizzato il server di certificazione anche per emettere il certificato del cliente.

La configurazione, ovviamente, era complicata e, sebbene la mia esperienza in tali questioni fosse, diciamo, limitata, in termini di sicurezza, è stata una soluzione accettabile.

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

Le mie conoscenze di Linux a quel tempo si fermavano a Ubuntu 16.04 LTS con interfaccia grafica, che usavo come terminale per collegarmi tramite RDP al server Windows. Cioè, sudo apt-get -f install -y, e nulla più.

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

All'inizio, ho deciso di approfondire un po' la teoria, per capire come funzionasse. Ho guardato video tutorial sul canale www.youtube.com/channel/UCKdRgZWgy42YxoFcTJ30LTA (Non è pubblicità, è solo il primo che mi è capitato di trovare). Una ragazza con una voce piacevole mi ha introdotto alle basi del lavoro nel sistema operativo scelto.

All'inizio ho avviato Hyper-V sul mio computer, ho installato CentOS 7 Minimal e durante l'installazione ho creato un utente Admin, chiudendo completamente ssh per root. Salutato il bel schermo colorato, mi sono immerso nel mondo in bianco e nero del terminale.

Non ha senso descrivere il processo d'installazione del software, è meglio concentrarsi sui problemi emersi e su cui ho dovuto scrivere un piccolo script (lo troverete sotto. La descrizione di ciascuna utility può essere trovata su Internet, ma al tempo in cui mi sono occupato di questo, questo script non esisteva, tutto è stato fatto per la prima volta, a tentoni e per caso).

Nello script ho cercato di automatizzare l'installazione delle utility minime necessarie per il server, disabilitare Selinux, connettere il repository Epel, installare OpenVPN, e altro. Di seguito lo script stesso, è semplice ma può essere utilizzato. Non lo analizzerò, ma se qualcuno ha bisogno, scrivetemi e risponderò.

Dopo aver utilizzato lo script, avrai un server OpenVPN già configurato, che lampeggia con un occhio 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 a buon fine.

Ignorando le politiche dei permessi nei sistemi Linux, ho speso molto tempo a studiare i log e ad assegnare i permessi necessari a tutti i file.

Quando il pulsante OpenVPN è diventato verde, mi sono molto rallegrato, ma si è rivelato solo l'inizio. Con buona fede, pensavo di dover sostituire i certificati radice e il file crl.pem, sperando che tutto funzionasse. Alla fine, ho dovuto trasferire dal server su 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 Diffie-Hellman
Index.txt — File con informazioni sui certificati attivi
Serial — anch'esso responsabile dell'attualità dei certificati

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

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

Ora i certificati venivano revocati, ma continuavano a funzionare senza problemi, perché Mikrotik non sapeva che erano stati revocati e doveva in qualche modo ricevere questa informazione.

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

Nel terminale Mikrotik, nella scheda /System/Certificates/CRL ho specificato il percorso al crl.pem pubblicato. È importante notare che Mikrotik accetta solo http e indirizzi assoluti per la scheda CRL, quindi dovrebbe 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 dei client dovevano essere create manualmente, il che mi ha rattristato e causato molti inconvenienti. Quando, dopo una settimana, ho dovuto creare configurazioni per circa 50 clienti, ho deciso di accelerare il processo e per questo ho utilizzato un frammento di script trovato in rete.

Lo script funziona così: dopo l'avvio indichiamo "nome del cliente", rispondiamo alla domanda "impostare la password o meno", dopodiché preleviamo il file di configurazione già pronto "cliente.ovpn", con i certificati e le impostazioni integrate. Per utilizzarlo, è necessario trovarsi in /etc/openvpn. Aggiungerò commenti alle righe in cui il percorso deve essere sostituito con il proprio. È inoltre necessario creare un file con le impostazioni del cliente, affinché lo script le inserisca 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', una nuova direttiva sul divieto di accesso remoto ha costretto a chiudere anche questo server e la connessione funzionante con Mikrotik. È stato creato un nuovo server OpenVPN per il personale del dipartimento IT, che ora funziona completamente su CentOS. Ma questa è un'altra storia.

Esprimo una grande gratitudine a Ivan e Pavel per l'aiuto nella revisione dell'articolo.

Fonte: habr.com

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