OpenVPN-Bindung auf Windows Server und Mikrotik mit Migration nach Linux

Guten Tag!

Jedes Unternehmen sieht sich früher oder später, plötzlich, mit dem Bedarf an remote Zugriff konfrontiert.
Jeder IT-Spezialist muss sich irgendwann mit der Notwendigkeit auseinandersetzen, einen Remote-Zugriff auf die eigenen Netzwerke im Unternehmen zu organisieren.

Ich wurde, wie viele andere, von diesem Bedarf mit dem Label „gestern“ überrollt. Nachdem ich alle „Für“ und „Wider“ analysiert und viele Informationen durchforstet sowie ein wenig in der Theorie gewühlt hatte, beschloss ich, mit der Installation zu beginnen.

Aus Sicherheitsgründen wurde OpenVPN in folgender Konfiguration gewählt: Auf einen Server mit Windows Server 2012 wurde eine virtuelle Maschine installiert, auf der ebenfalls Windows Server 2012 läuft, und darauf befindet sich der OpenVPN-Server, der Zertifikate ausstellt und signiert.

Zur Einfachheit nennen wir ihn „Zertifizierungsserver“. Dann nahm ich das Serverzertifikat, steckte es in Mikrotik und richtete auf dem Mikrotik-Router OpenVPN mit Konten und Profilen ein. Zur Ausstellung des Client-Zertifikats nutzte ich ebenfalls den Zertifizierungsserver.

Die Implementierung war natürlich chaotisch, und obwohl ich zu dem Zeitpunkt nicht ausreichend Erfahrung in solchen Angelegenheiten hatte, war es in Bezug auf Sicherheit nicht die schlechteste Entscheidung.

Diese Verknüpfung funktionierte eine Weile, und ich erhielt die neue Anweisung: den Zertifizierungsserver nach Linux zu transferieren, dabei musste die Verbindung zu Mikrotik erhalten bleiben — die Clients sollten nicht leiden.

Mein Wissen über Linux endete zu diesem Zeitpunkt bei Ubuntu 16.04LTS mit grafischer Benutzeroberfläche, das als Terminal für die RDP-Verbindung zum Windows-Server verwendet wurde. Also, sudo apt-get -f install -y, und kein bisschen mehr.

Nachdem ich recherchiert hatte, welches OS aus der Linux-Familie stabiler und zukunftsträchtiger für meine Organisation ist, entschied ich mich für CentOS 7 Minimal.

Zunächst wollte ich mich ein wenig mit der Theorie beschäftigen, um zu verstehen, wie das Ganze funktioniert. Ich schaute mir Video-Tutorials auf dem Kanal an, www.youtube.com/channel/UCKdRgZWgy42YxoFcTJ30LTA (Überhaupt keine Werbung, sie kamen mir einfach als Erste unter.) Eine Frau mit angenehmer Stimme führte mich in die Grundlagen der Arbeit mit dem gewählten OS ein.

Zunächst startete ich Hyper-V auf meinem PC, installierte CentOS 7 Minimal, während der Installation erstellte ich den Benutzer Admin und schloss ssh für root vollständig. Nachdem ich mich von dem schönen, bunten Bildschirm verabschiedet hatte, tauchte ich in die schwarz-weiße Welt des Terminals ein.

Ich denke, es macht keinen Sinn, den Installationsprozess der Software zu beschreiben; besser ist es, auf die Probleme hinzuweisen, die während des Prozesses auftraten und für deren Lösung ich ein kleines Skript schreiben musste (es ist im nachfolgenden Text. Eine Beschreibung jeder der Tools ist im Internet zu finden, aber zu dem Zeitpunkt, als ich all das machte, gab es dieses Skript noch nicht; alles wurde zum ersten Mal, blind und nach Gefühl gemacht).

Im Skript habe ich versucht, die Installation der minimal erforderlichen Tools für den Server zu automatisieren, Selinux zu deaktivieren, das Epel-Repository zu aktivieren, OpenVPN zu installieren usw. Unten ist das Skript, es ist einfach, aber es kann verwendet werden. Ich werde es nicht detailliert erklären, aber wenn jemand Fragen hat, schreibt mir, ich antworte.

Nach der Verwendung des Skripts wird ein bereits konfigurierter OpenVPN-Server angezeigt, der mit einem grünen Licht blinkt.

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

Die Installation von OpenVPN war nicht ganz erfolgreich.

Unwissend über die Besonderheiten der Berechtigungsrichtlinien in Linux-Systemen habe ich viel Zeit mit dem Studium der Logs und der Zuweisung der erforderlichen Berechtigungen an alle Dateien verbracht.

Als der OpenVPN-Button grün wurde, war ich sehr erfreut, aber wie sich herausstellte, war das erst der Anfang. Aus einer Naivität heraus dachte ich, ich könnte die Root-Zertifikate und die Datei crl.pem ersetzen, in der Hoffnung, dass alles funktionieren würde. Letztendlich musste ich die folgenden Dateien vom Server auf Windows übertragen:

Serv.crt — Serverzertifikat
Serv.key — Server-Schlüssel
Ca.crt — Root-Zertifikat
Ca.key — Root-Schlüssel
Crl.pem — Datei mit widerrufenen Zertifikaten
Dh.pem — Diffie-Hellman-Schlüssel
Index.txt — Datei mit Informationen über aktuelle Zertifikate
Serial — ebenfalls verantwortlich für die Aktualität der Zertifikate

Außerdem benötigte ich den Ordner certs_by_serial, die Datei vars und alle Client-Schlüssel und -Zertifikate.
Auf Mikrotik blieben die Zertifikate an Ort und Stelle, dadurch funktionierte alles.

Probleme traten auf, als ich versuchte, das Zertifikat zu widerrufen; das funktionierte überhaupt nicht — die Datei index.txt musste in das Unix-Format konvertiert werden, was ich nicht sofort gemacht habe. Ich benutzte das Tool dos2unix.

Jetzt wurden die Zertifikate widerrufen, funktionierten jedoch weiterhin ohne Probleme, da Mikrotik nicht wusste, dass sie widerrufen wurden, und ich ihm irgendwie darüber informieren musste.

Nachdem ich die Anweisungen gelesen und mich mit Alexander ERI (vielen Dank!) beraten hatte, habe ich auf dem Zertifizierungsserver einen einfachen Apache HTTP-Server eingerichtet und die Datei mit den widerrufenen Zertifikaten veröffentlicht. Den Zugriff darauf habe ich vollständig eingeschränkt, nur die veröffentlichte Datei ist von einer IP-Adresse zugänglich.

Im Mikrotik-Terminal habe ich im Tab /System/Certificates/CRL den Pfad zur veröffentlichten crl.pem angegeben. Hier sei erwähnt, dass Mikrotik im CRL-Tab nur http und absolute Adressen akzeptiert, d.h. es sollte ungefähr so aussehen: 127.0.0.1/crl/1.crl
Es hat alles funktioniert, zumindest für die RouterOS-Versionen 6.4.2.x, aber die Client-Konfigurationen musste ich von Hand erstellen, was für mich frustrierend und umständlich war. Als ich nach einer Woche Konfigurationen für etwa 50 Clients erstellen musste, beschloss ich, diesen Prozess zu beschleunigen und verwendete dafür ein Stück eines fremden Skripts, das ich im Internet gefunden hatte.

Das Skript funktioniert folgendermaßen: Nach dem Start geben wir den "Client-Namen" an und beantworten die Frage, ob ein Passwort gesetzt werden soll oder nicht. Danach holen wir die bereits fertige Konfigurationsdatei "client.ovpn" ab, in die die Zertifikate und Einstellungen integriert sind. Um sie zu verwenden, muss man sich in /etc/openvpn befinden. Ich werde die Zeilen, in denen der Pfad geändert werden muss, mit Kommentaren versehen. Außerdem ist es erforderlich, eine Datei mit den Client-Einstellungen zu erstellen, damit das Skript diese während der Konfiguration einfügt.

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

Nach einiger Zeit zwang die neue Anweisung zum Verbot des externen Zugriffs zur Abschaltung dieses Servers und der funktionierenden Verbindung zu Mikrotik. Ein neuer OpenVPN-Server wurde für die Mitarbeiter der IT-Abteilung eingerichtet, der nun vollständig auf CentOS läuft. Aber das ist eine ganz andere Geschichte.

Ich möchte Ivan und Pavel für ihre Hilfe bei der Redaktion des Artikels herzlich danken.

Quelle: habr.com

Zuverlässiges Hosting für Websites mit DDoS-Schutz kaufen, VPS VDS Server 🔥 Zuverlässiges Hosting für Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster