Die Kombination von OpenVPN auf Windows Server und Mikrotik mit der Migration dieses Setups nach Linux

Hallo!

Jedes Unternehmen benötigt früher oder später unerwartet Fernzugriff.
Praktisch jeder IT-Spezialist sieht sich mit der Notwendigkeit konfrontiert, Fernzugriff auf die Netzwerkressourcen seines Unternehmens zu organisieren.

Mich, wie viele andere, traf dieses Bedürfnis mit dem Etikett „gestern“. Nach Analyse aller „Vorzüge“ und „Nachteile“ sowie dem Durchforsten von Unmengen an Informationen und ein wenig Theorie, beschloss ich, mit der Installation zu beginnen.

Aus Sicherheitsgründen wählte ich OpenVPN in folgender Umsetzung: Auf einem Windows Server 2012 wurde eine virtuelle Maschine installiert, die ebenfalls Windows Server 2012 hatte, und darauf wiederum der OpenVPN-Server, der Zertifikate ausstellte und signierte.

Zur Bequemlichkeit nennen wir ihn „Zertifizierungsserver“. Anschließend nahm ich das Serverzertifikat, steckte es in den Mikrotik und richtete auf dem Router Mikrotik OpenVPN mit Benutzerkonten und Profilen ein. Für die Ausstellung des Clientzertifikats verwendete ich ebenfalls den Zertifizierungsserver.

Die Umsetzung war natürlich problematisch, und obwohl meine Erfahrung in solchen Angelegenheiten zu diesem Zeitpunkt, sagen wir, nicht ausreichend war, war es in Bezug auf die Sicherheit nicht die schlechteste Lösung.

Diese Kombination funktionierte eine Zeit lang und ich erhielt die neue Anweisung: den Zertifizierungsserver auf Linux zu migrieren, wobei die Verbindung zu Mikrotik beibehalten werden sollte – die Clients durften nicht darunter leiden.

Mein Wissen über Linux beschränkte sich zu diesem Zeitpunkt auf Ubuntu 16.04LTS mit grafischer Benutzeroberfläche, das als Terminal zur RDP-Verbindung zum Windows-Server verwendet wurde. Das heißt, sudo apt-get -f install -y, und keinen Millimeter mehr.

Nach einer Untersuchung, welches Betriebssystem aus der Linux-Familie stabiler und zukunftsträchtiger für meine Organisation war, entschied ich mich für CentOS 7 Minimal.

Zuerst beschloss ich, ein wenig in die Theorie einzutauchen, um zu verstehen, wie das Ganze funktioniert. Ich schaute mir Tutorials auf dem Kanal www.youtube.com/channel/UCKdRgZWgy42YxoFcTJ30LTA (Keine Werbung, sie kamen mir einfach zuerst in den Sinn). Eine Frau mit angenehmer Stimme erklärte mir die Grundlagen der Arbeit in dem gewählten Betriebssystem.

Zu Beginn startete ich Hyper-V auf meinem Computer, installierte CentOS 7 Minimal und schuf während der Installation den Benutzer Admin, wobei ich den SSH-Zugang für root vollständig sperrte. 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 konzentriere ich mich auf die Probleme, die währenddessen auftraten, und die Lösungen, für die ich ein kleines Skript schreiben musste (es befindet sich unter dem Absatz. Eine Beschreibung jeder der Dienstprogramme kann man im Internet finden, aber zu der Zeit, als ich all dies tat, existierte dieses Skript noch nicht, alles wurde zum ersten Mal, im Dunkeln und durch Erfahrung gemacht).

In dem Skript bemühte ich mich, die Installation der minimal erforderlichen Dienstprogramme für den Server zu automatisieren, Selinux zu deaktivieren, das Epel-Repository zu aktivieren, OpenVPN zu installieren usw. Unten das Skript selbst, es ist einfach, aber es kann verwendet werden. Ich werde es nicht auseinandernehmen, aber wenn jemand es benötigt, schreibt mir, ich werde antworten.

Nach der Verwendung des Skripts erschien ein bereits konfigurierten OpenVPN-Server mit einem grünen Licht.

#!/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 verlief nicht ganz erfolgreich.

Da ich die Besonderheiten der Berechtigungen in Linux-Systemen nicht kannte, verbrachte ich viel Zeit mit dem Studium der Protokolle und der Zuweisung der erforderlichen Berechtigungen für alle Dateien.

Als der OpenVPN-Button grün wurde, war ich sehr erfreut, aber es stellte sich heraus, dass das erst der Anfang war. Aus gutem Herzen plante ich, die Root-Zertifikate und die Datei crl.pem zu ersetzen, in der Hoffnung, dass alles funktionieren würde. Letztendlich musste ich die folgenden Dateien vom Server nach Windows übertragen:

Serv.crt — Serverzertifikat
Serv.key — Server-Schlüssel
Ca.crt — Root-Zertifikat
Ca.key — Root-Schlüssel
Crl.pem — Datei mit zurückgezogenen Zertifikaten
Dh.pem — Diffie-Hellman-Schlüssel
Index.txt — Datei mit Informationen über aktuelle Zertifikate
Serial — Er sorgt ebenfalls für die Gültigkeit der Zertifikate

Ich benötigte auch den Ordner certs_by_serial, die Datei vars und alle Client-Schlüssel und Zertifikate.
Die Zertifikate blieben auf dem Mikrotik, deshalb funktionierte alles.

Probleme traten auf, als ich versuchte, ein Zertifikat zu widerrufen, es funktionierte überhaupt nicht – die Datei index.txt musste ins Unix-Format konvertiert werden, und das hatte ich zunächst nicht getan. Ich verwendete das Tool dos2unix.

Jetzt wurden die Zertifikate widerrufen, funktionierten aber weiterhin ohne Probleme, da der Mikrotik nicht wusste, dass sie zurückgezogen wurden und ihm irgendwie mitgeteilt werden musste.

Nach dem Lesen der Anleitungen sowie der Beratung mit Alexander ERI (vielen Dank!), stellte ich auf dem Zertifizierungsserver einen einfachen http-Server Apache auf und veröffentlichte darauf die Datei mit den zurückgezogenen Zertifikaten. Den Zugriff darauf schloss ich vollständig aus, außer für die veröffentlichte Datei von einer IP-Adresse.

Im Mikrotik-Terminal, im Tab /System/Certificates/CRL habe ich den Pfad zur veröffentlichten crl.pem angegeben. Hierbei ist zu beachten, dass Mikrotik im CRL-Tab nur http und absolute Adressen akzeptiert, das heißt, es sollte ungefähr so aussehen: 127.0.0.1/crl/1.crl
Alles funktionierte, zumindest für die Versionen 6.4.2.x des RouterOS, aber die Client-Konfigurationen musste ich manuell erstellen, was für mich sehr unangenehm war und viele Unannehmlichkeiten verursachte. Als ich eine Woche später Konfigurationen für etwa 50 Kunden erstellen musste, entschloss ich mich, diesen Prozess zu beschleunigen und verwendete dafür ein Stück eines fremden Skripts, das ich im Internet gefunden hatte.

Das Skript funktioniert so: Nach dem Start geben wir den „Namen des Kunden“ an, antworten auf die Frage „Passwort festlegen oder nicht“, danach holen wir uns die bereits fertige Konfigurationsdatei „client.ovpn“, die die integrierten Zertifikate und Einstellungen enthält. Um diese zu verwenden, muss man sich im /etc/openvpn befinden. Ich werde die Zeilen mit Kommentaren versehen, in denen der Pfad durch den eigenen ersetzt werden muss. Außerdem muss eine Datei mit den Kundeneinstellungen erstellt werden, damit das Skript sie während der Konfigurationserstellung einfügen kann.

#!/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 eine neue Anweisung zum Verbot des Fernzugriffs dazu, auch diesen Server und die funktionierende Verbindung zu Mikrotik abzuschalten. Ein neuer OpenVPN-Server wurde für die IT-Abteilung eingerichtet, der jetzt vollständig unter CentOS läuft. Aber das ist eine ganz andere Geschichte.

Ich danke Ivan und Pavel sehr für die Hilfe beim Überarbeiten des Artikels.

Quelle: habr.com

Erwerben Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster