In Zeiten von Cyber Security, Cloud und Home Office sind sichere Zugänge zu Business-relevanten Daten immer wichtiger. Linux-Experte Renato Testa zeigt uns in diesem Artikel, wie Sie eine sichere openVPN aufsetzen.
In diesem Teil meines Linux-Security-Blogs möchte ich euch ein VPN mit openVPN vorstellen.
Im Folgenden werden wir:
Ein VPN (Virtual Private Network) ist ein abgesicherter Daten-Tunnel der als Transportmedium das Internet benutzt.
Für die sichere Vernetzung von ganzen Netzen (z.B. Firmenstandorte) verwenden wir u.A. andere Ansätze wie z.B. Libre- oder StrongSWAN. Da wir mit unseren mobilen Geräten aber meist hinter einem DSL-Router stehen, sind oft Protokolle welche obige Ansätze verwenden, blockiert.
Für openVPN stehen für alle gängigen Plattformen entsprechende Clients zur Verfügung:
Und das Wichtigste: openVPN ist sicher!
Aus Sicht des Benutzers gibt es zwei Anwendungen:
Im Folgenden verfolgen wir den ersten Ansatz. Diesen zur zweiten Variante zu erweitern ist reine Konfiguration, da nur das Routing zu einem weiteren, internen, Subnetz hinzukommt und NAT, Masquerading entfällt.
Soweit die Theorie und somit Zeit für eine Tasse Kaffee und die Ärmel hochzukrempeln…
Um dir die Zeit zum Lesen zu verkürzen, können die «glory details» nach belieben per Klick aufgerufen werden.
Für das hier beschriebene VPN benötigst du:
Im Beispiel wurde eine VM mit Debian Buster auf Proxmox verwendet. Der Server besitzt eine öffentliche IP.
Als Erstes installieren wir openVPN:
$ sudo apt update
$ sudo apt install openvpn
Eine PKI erstellen
Da wir von Null beginnen, brauchen wir eine PKI (Public Key Infrastruktur). Wir brauchen eine CA um die für openVPN benötigten Schlüssel/Zertifikate zu signieren. Dieser, zugegeben etwas langatmige, Schritt belohnt uns mit einer PKI. Diese sollte streng behütet werden in einer VM, die nur gestartet/benutzt wird, wenn Zertifikate generiert/signiert werden müssen.
Darauf laden wir uns EasyRSA, eine Sammlung von Scripts, um Schlüssel, Zertifikate und Requests mit openSSL zu generieren: Code-Details 1: PKI erstellen
Uff, geschafft, zumindest beinahe. Wir haben nun alle Schlüssel und Zertifikate für unseren Server beieinander und verfügen über eine PKI.
Generieren der Client Zertifikate/Schlüssel
Wir verfügen ja nun über die nötige Infrastruktur die es braucht um für unsere Clients Zertifikate und Schlüssel zu beglaubigen (signieren). Da sich dieser Vorgang für jeden Client wiederholt und ich ein recht fauler Mensch bin, packen wir die folgende Aktionen einfach in ein Shell-Script. Dieses Script laden wir auf unseren VPN-Server.
Der Vorteil eines Scriptes liegt natürlich auch darin, dass gewährleistet wird, dass es immer gleich abgearbeitet wird! Das folgende Script führt uns durch alle nötigen Schritte um ein <CLIENT>.ovpn und die zugehörigen Schlüssel/Zertifikate zu generieren. Die Schritte welche eine Aktion auf dem CA-System (PKI) bzw. das kopieren von Dateien zwischen VPN-Server <=> CA-Server benötigen eine funktionierende SSH-Verbindung. Das Script zeigt dir wie.
Code-Details 2: Script: create-vpn-client.sh
Wir haben nun ein Script, welches uns die für den Client benötigten Dateien in einem Zip-Archiv liefert bzw. welches wir unseren Klienten bereitstellen können.
Im nächsten Schritt setzen wir unseren openVPN-Service auf.
Aufsetzen des openVPN-Servers
Wie Eingangs erwähnt muss dies ein System sein, welches direkt erreichbar ist. In meinem Beispiel handelt es sich um eine VM mit Debian Buster auf Proxmox. Wir werden im folgenden den VPN-Service konfigurieren und da wir direkt von diesem Server ins Internet wollen, NAT und Masquerading mittels iptables aufsetzen. Wenn wir gerade bei iptables sind, wird das System auch sonst noch etwas gehärtet.
In einem vorherigen Schritt haben wir das «openvpn»-Packet bereits installiert mittels:
# zcat /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf
Nun können wir uns eine Basis kopieren oder du kannst auch mein Beispiel übernehmen: Code-Details 3: vpn server.conf
iptables
Damit die in Interfaces (tunN), Protokolle und NAT/Masquerading zusammenspielen, verwenden wir Regeln mit iptables. Zudem muss der Kernel in der Lage sein, IPv4-Pakete forwarden zu können.
IPv4 Pakete forwarden
Meist ist IPv4 ausgeschaltet und muss überhaupt zugelassen werden, damit zwischen den Netzwerk-Interfaces (tunN und ethN) Pakete vermittelt werden.
Mittels:
$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
lässt sich das herausfinden.
Mittels:
$ sysctl -w net.ipv4.ip_forward=1
wird das forwarden erlaubt. Um es persistent zu ändern muss in der Datei «/etc/sysctl.conf» die entsprechende Zeile geändert werden.
iptables-Regeln
Unsere Regeln wollen oder müssen:
Mittels:
# ip6tables -F
# iptables -F
# iptables -F -t nat
# iptables -F -t mangle
putzen wir alle Regeln weg. Geht beim Setzen der Regeln etwas schief, werden wir das öfters benutzen (müssen).
Unsere iptables-Anpassungen nehmen wir in den zwei Dateien «/etc/iptables/rules.v4» und «/etc/iptables/rules.v6» vor.
Code-Details 4: iptables rules.v6
Code-Details 5: iptables rules.v4
Die Namen der Interfaces oder das interne Netz musst du entsprechend anpassen!
Obige Dateien werden nun mittels «ip6tables-restore» verarbeitet und somit die Regeln angewendet:
# ip6tables-restore < /etc/iptables/rules.v6
# iptables-restore < /etc/iptables/rules.v4
und können mit
# ip6tables -L
...
# iptables -L
...
aufgelistet werden.
Serverseitig sind wir nun soweit. Das Setup des Servers – PKI, OpenVPN, IPTables – ist, das erste Mal, aufwändig. Aber der Aufwand lohnt sich, weil
Linux
# apt install openvpn
# openvpn -config <Pfad zum *.ovpn>
oder via GUI mit dem Network-Manager.
MacOS
Windows
2 Kommentare
Der erste Command `apt update` hat einen Tippfehler
Vielen Dank für den Hinweis!