Sicherheitskritisch

Tech project blog of Bastian Raschke

Einrichtung eines sicheren OpenVPN-Servers auf Linux

Written by Nils Tegetmeyer.
Published 2014-06-24 in the category Debian Linux.

Ich möchte mich hiermit auch in die Reihen der Autoren für Sicherheitskritisch.de einreihen und wollte euch als erstes zeigen, wie man eine sichere Verbindung zu seinem eigenen Server oder auch einem Raspberry Pi herstellt, auch wenn man viele Kilometer weit weg ist.

Hierfür wollen wir ein so genanntes Virtual Private Network (VPN) verwenden. Da das Point-to-point-tunneling protocol (PPTP) schon länger als nicht mehr wirklich sicher gilt, möchte ich hiermit einen sicheren Weg über OpenVPN zeigen.

Generell ist die Installation der Serverkomponente auch auf Windows möglich, da ich von der Sicherheit der Windowsbetriebssysteme überhaupt nicht überzeugt bin und inzwischen auch einen Raspberry Pi besitze, möchte ich das ganze lieber für unixoide Betriebssysteme zeigen.

Installation

Die Installation selbst ist schnell gemacht und erfordert nur den einen folgenden Befehl, welcher die benötigten Pakete selbstständig herunterlädt und installiert:

~# aptitude install openvpn openssl

Für die spätere Verwendung wird ein noch Modul kopiert, welches für die Zertifikatserstellung vereinfacht:

~# cd /etc/openvpn
~# cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 ./easy-rsa

Falls eigene Zertifikate erstellt werden, können diese an einem geeigneten Ort auf dem Server gespeichert werden. Die Pfade werden später noch benötigt.

Konfiguration

Da OpenVPN aus Sicherheitsgründen hier über Zertifikate abgewickelt werden soll, wird an der folgenden Stelle festgelegt, dass kein Passwort(sondern Zertifikate) verwendet werden soll. Hierfür wird die folgende Datei editiert:

~# vi easy-rsa/vars

Vorher:

export EASY_RSA="'pwd'"

Nachher:

export EASY_RSA="/etc/openvpn/easy-rsa"

Die Datei wird nun gespeichert und geschlossen. Nun sind alle Voraussetzungen gesetzt, um die Zertifikate zu erzeugen. Sofern diese nicht extern erzeugt und durch eine CA (Certification Authority) zertifiziert werden, können die für OpenVPN verwendeten Zertifikate sehr einfach lokal erzeugt werden:

~# cd /etc/openvpn/easy-rsa
~# source vars
~# ./clean-all

Nun werden die eigentlichen Zertifikate und die CA erstellt. Da die Angaben hier recht anwenderspezifisch sind, müssen diese nach eigenem Ermessen eingesetzt werden. Die Eingabe wird aber durch eine assistentsartige Abfrage sehr einfach gemacht, wobei die Frage, ob  das Zertifikat signiert werden soll, mit Ja beantwortet wird:

~# ./build-ca OpenVPN
~# ./build-key-server server
~# ./build-key client1

~# ./build-dh

Nun sind die Zertifikate mit entsprechenden Schlüsseln erstellt worden und im Ordner ./easy-rsa/vars/ abgelegt worden. Für die Sicherheit des VPN-Servers ist allerdings wichtig zu wissen, dass die Zertifikate für die Benutzerauthentifizierung verwendet werden und somit sicherheitstechnisch sehr wichtig sind. Des Weiteren muss man wissen, dass die Sicherheit der Zertifikate selbst nur von der Vertrauenswürdigkeit der Zertifizierungsstelle (CA) abhängt. Die CA ist somit bemächtigt neue Clientzertifikate zu zertifizieren, was zu unberechtigten Nutzern auf dem OpenVPN-Server führen könnte. Aus diesem Grund ist es sicherer, wenn eine eigene CA geführt wird, welche nicht für unbefugte Personen zugänglich ist.

Der Server selbst muss nach der Erstellung der Zertifikate diese noch in seine Konfiguration aufnehmen. Die Konfiguration wird in der Datei /etc/openvpn/openvpn.conf gespeichert und wie folgt konfiguriert.

dev tun
proto udp
port 1194
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
user nobody
group nogroup
server 10.8.0.0 255.255.255.0
persist-key
persist-tun
status /var/log/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
client-to-client
push "redirect-gateway"
push "route 192.168.178.0 255.255.255.0"
#set the dns servers
push "dhcp-option DNS 194.145.226.26"
log-append /var/log/openvpn
comp-lzo
duplicate-cn
keepalive 10 120

Sofern eigene Zertifikate verwendet wurden, müssen die Pfade für ca, cert, key und dh entsprechend angepasst werden. Des Weiteren ist die Zeile push "route ..." wichtig und sollte den eigenen Bedürfnissen angepasst werden. Der Befehl sagt grundsätzlich aus, dass der Traffic, welcher über die genannte IP gehen soll, über den VPN-Server geroutet werden soll. Wenn diese Option nicht gesetzt wird, kommt es dazu, dass der Server unter seiner lokalen IP nicht angesprochen werden kann, sofern man sich in einem Netzwerk mit äquivalenter Adressstruktur befindet. Beispielsweise hat der VPN-Server die IP 192.168.178.2/24 und man ist bei einem Freund zu besuch. Dieser hat auch eine IP-Struktur von 192.168.178.0/24 wodurch beim Aufruf der Server-IP bei laufender VPN-Verbindung das entfernte Gerät erreicht werden soll, nicht ein zufällig auf der gleichen IP laufendes Gerät. Die Datei wird gespeichert und geschlossen.

Da nicht nur die VPN-Verbindung zum Server, sondern auch eine Internetverbindungsweiterleitung, funktionieren soll, können wir diese in zwei Schritten einrichten.
Einerseits wird das IP-Forwarding aktiviert, andererseits wird die Firewall (iptables) angepasst.

IP-Forwarding anschalten: In der Datei /etc/sysctl.conf wird die Zeile:

net.ipv4.ip_forward=1

eingefügt beziehungsweise die Raute am Anfang entfernt, sodass diese beim nächsten Neustart wirksam wird.

Die folgende Firewallregel kann auf unterschiedliche Wege ins System integriert werden. Beispiele hierfür wären als Startskript, in /etc/rc.local oder über das Programm iptables-persistent. Letzteres erzeugt eine Datei im Pfad /etc/iptables/rules.v4 in welcher die eingetragenen Regeln dauerhaft gespeichert werden.

Hier wird folgendes eingetragen:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -o eth0 -j MASQUERADE

Nun sollte der Server kurz neugestartet (um Fehler beim späteren Testen auszuschließen und die gerade gesetzten Einstellungen zu laden).

Vorbereiten einer Clientkonfiguration

Nun kümmern wir uns um die bevorstehende Client-Konfiguration. Aber halt, nicht so schnell, wir bleiben noch auf dem Server. Wir wechseln mit folgendem Befehl das Verzeichnis:

~# cd /etc/openvpn/easy-rsa/keys/

Hier wird eine neue Datei erstellt, welche dem Client später sagen wird, wo der den Server findet und wie er sich zu verbinden hat. Der Inhalt dieser Datei kann wie folgt aussehen (der Dateiname kann frei gewählt werden, zum Beispiel clientConfig.ovpn):

dev tun
client
proto udp
remote <IP-Adresse> 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
comp-lzo
verb 3

Hierbei ist allerdings zu beachten, dass das Feld <IP-Adresse> auf die IP bzw Hostname abgeändert wird, unter dem der OpenVPN-Server erreichbar sein wird. Soweit ist nun alles getan an Konfiguration und wir können ein kleines tarz-Archiv für den Client schüren, damit er auch alle Dateien bekommt.

Dies geschieht über folgenden Befehl:

~# tar czf openvpn-keys.tgz ca.crt client1.crt client1.key clientConfig.ovpn

Die Namen der Zertifizierungsstelle (CA), der Clientzertifikate mit Schlüssel oder Client-Konfigurationsdatei können natürlich abweichen, je nachdem wie weit die Anleitung hier befolgt wurde.

Das gerade erstellte Archiv sollte nun zum Beispiel ins Home-Verzeichnis des Servers verschoben werden (und der Besitzer geändert werden), um es schlussendlich auf den Client zu übertragen und dort einzurichten.

Die Konfiguration des Servers ist hiermit abgeschlossen und sofern Bedarf besteht, könnte es in Zukunft hier vielleicht noch eine Client-Konfiguration geben ;-)


Tags: Debian, OpenVPN, Sicherheit

Proudly generated with Pelican - without PHP, Perl, MySQL & Co. Jump to top