© Maksim Kabakou - Fotolia.com

Härtung eines OpenVPN Servers

Dieser Beitrag wurde am 23.April 2017 auf die OpenVPN-Version 2.4 aktualisiert, insbesondere Kapitel 4.1 bis 4.3.

OpenVPN ist ein beliebtes Tool, um verschlüsselte Netzwerkverbindungen herstellen zu können. Dieser BLOG Beitrag beschäftigt sich mit der Härtung des OpenVPN Servers und beschreibt alle Konfigurationsoptionen, die Auswirkungen auf die Sicherheit der OpenVPN Verbindung haben.

Das Verständnis dieses Artikels setzt voraus, dass die grundlegende Arbeitsweise von OpenVPN bekannt ist. Einige nachfolgend beschriebenen Optionen setzen mindestens die OpenVPN Version 2.3 voraus, ein Großteil der Konfigurationsoptionen funktioniert bereits ab OpenVPN Version 2.0.x.

Nicht näher beschrieben werden Optionen, die ausschließlich den "Static key mode" betreffen. Der Fokus liegt auf dem gebräuchlicheren, zertifikatebasiertem "TLS-negotiated key mode". Ausgelassen wurden ebenfalls pkcs11/ pkcs12 Optionen.

1 Allgemeine OpenVPN Grundlagen

OpenVPN Server und Client markiert

1.1 Basics: Control- vs. Data-Channel

OpenVPN stellt zwei unabhängige Datenverbindungen her: Einen Kontroll- und einen Datenkanal.

Der Kontroll- und Datenkanal einer OpenVPN Verbindung

Der Kontrollkanal hat unter anderem folgende Aufgaben:

  • den SSL/TLS Handshake (z.B. Session Start, Schlüsselaustausch, Authentifikation, Cipher-Suite Vereinbarung) durchführen,
  • einige Aufräumarbeiten in der finalen Phase der Verbindung zu realisieren und
  • bei der Nutzung von UDP die "Nachteile" der UDP Transport Layer Unzuverlässigkeit durch Einführung von Time-Out, Packet Acknowledgement und Transmission Mechanismen auszugleichen.


Über den Datenkanal werden die eigentlichen Nutzdaten der VPN Verbindung übertragen.

Für beide Kanäle lassen sich unterschiedliche Konfigurationsoptionen festlegen.

2 Allgemeine Optionen

2.1 Option: script-security <0/1/2/3>

Diese Variable definiert, welche Anwendungen und Skripte durch OpenVPN ausgeführt werden dürfen. OpenVPN ruft zu unterschiedlichen Zeitpunkten externe Programme wie "route", "ifconfig" oder "ip" auf. Weiterhin können durch den Nutzer beispielsweise Skripte festgelegt worden, die bei bestimmten Triggern automatisch ausgeführt werden sollen.

Mögliche Werte der Variable:

  • 0: Striktes Verbot, externe Anwendungen auszuführen.
  • 1: Ausschließlich "built-in" Anwendungen wie ifconfig, ip, route, oder netsh ausführen. Diese sind für die korrekte Funktionsweise von OpenVPN erforderlich.
  • 2: Wie 1, aber zusätzlich benutzerdefinierte Skripte erlauben.
  • 3: Wie 2, aber zusätzlich ist es erlaubt, User-Passwörter zu übergeben.

© wladi - Fotolia.comStandardwert: 1
Empfehlung: 1, außer es wurden auf dem Server explizit eigene Skripte konfiguriert.

2.2 Option: user & group <groupname>

Diese Option ändert die User und Group ID des OpenVPN Prozesses nach dem Abschluss der Initialisierung. Aus Sicherheitsgründen sollte der Prozess unter einem unprivilegierten Nutzerkonto fortgeführt werden. Ein Prozess, der einmal seine Berechtigungen von root auf einen anderen Nutzer vermindert hat, kann seine Berechtigungen nicht wieder selbstständig erhöhen.

Bei der Nutzung dieser Option sollte parallel ein Blick auf die im Folgenden erläuterte Option "persist-key" geworfen werden.

Mit folgendem Befehl kann ein unprivilegierter Nutzer unter Linux angelegt werden:

# Unprivilegierten Nutzer anlegen
sudo adduser --no-create-home --disabled-login --shell /bin/false 

Bei der Verwendung dieser Option muss auf die korrekte Konfiguration der Dateibesitzer und -berechtigungen geachtet werden, dazu etwas später mehr. Vorteil dieser Konfiguration ist der Sicherheitsgewinn, der im Falle einer Kompromittierung des Prozesses darin besteht, dass der Prozess ausschließlich auf Objekte zugreifen kann, die dem User freigegeben sind.

© wladi - Fotolia.comStandardwert: "Nicht gesetzt"
Empfehlung: Der Prozess sollte unter einem unprivilegierten Nutzer ausgeführt werden.

2.3 Option: persist-key

In Kombination mit der User/Group Option kommt der Option "persist-key" eine besondere Bedeutung zu. Aus Sicherheitsgründen sollte der private Schlüssel des Users nur für root lesbar sein.

Sobald der Prozess seine Privilegien abgegeben hat, ist es dem Prozess nicht mehr möglich, den privaten Schlüssel auszulesen. Wird die Anwendung anschließend mit Hilfe des SIGUSR1 Signals neu gestartet, kann OpenVPN den privaten Schlüssel aufgrund der fehlenden Berechtigungen nicht mehr auslesen.

Abhilfe schafft hier die Option "persist-key", die den Prozess veranlasst, den Key nicht erneut auszulesen.

© wladi - Fotolia.comStandardwert: "Nicht gesetzt"
Empfehlung: Die Option sollte gesetzt sein, wenn die Option User/Group verwendet wird.

2.4 Option: chroot

Dieser Befehl "chrooted" den OpenVPN Prozess nach dem Abschluss der Initialisierung. OpenVPN ist nach dem "chroot" nicht mehr in der Lage, auf Dateien außerhalb des übergebenen Verzeichnisses zuzugreifen. Der GRSecurity Patch bietet weitere Möglichkeiten, einen Chroot-Käfig zu härten.

© wladi - Fotolia.comStandardwert: "Nicht gesetzt"
Empfehlung: Die Option sollte gesetzt werden.

3 Konfigurationsoptionen für den Server

OpenVPN Server markiert

3.1 Option: client-to-client

Diese Option aktiviert auf dem Open VPN Server innerhalb der Software das interne Routing von Client zu Client.

Diese Option ermöglich direkte, durch OpenVPN geroutete Verbindungen zwischen den Clients.

Wenn diese Option inaktiv ist, wird der gesamte Traffic, unabhängig vom Ziel, auf dem TUN/TAP Interface ausgegeben.

© wladi - Fotolia.comStandardwert: "Nicht gesetzt"
Empfehlung: Die Option sollte nicht gesetzt werden, außer sie wird benötigt.

Um Filterungen zu ermöglichen wird empfohlen, auch in diesem Fall die Option deaktiviert zu belassen und das Routing z.B. mit iptabIes zu realisieren.

3.2 Option: duplicate-cn

Erlaubt Clients, mehrere Verbindungen mit dem selben Common-Name gleichzeitig aufzubauen.

© wladi - Fotolia.comStandardwert: "Nicht gesetzt"
Empfehlung: Die Option sollte nicht gesetzt werden. Clients sollten stets einmalige Namen verwenden.

3.3 Option: auth-user-pass-verify

Verlangt vom Client die (zusätzliche) Authentifikation mit Hilfe eines Usernamen / Passworts.

© wladi - Fotolia.comStandardwert: "Nicht gesetzt"
Empfehlung: Kann optional aktiviert werden. Möglich wäre mit dieser Option die Realisierung von OTP zur Authentifikation.

3.4 Option: auth-user-pass-optional

Wenn die Option "auth-user-pass-verify" aktiv ist, lehnt Open VPN jede Verbindungsanfrage ab, die ungültige Authentifikationsdaten verwendet. Diese Einstellung macht die Übergabe von Nutzer-Daten optional und ermöglicht es beispielsweise auth-user-pass-verify, dem übergebenen Skript, die Authentifikation auf Basis anderer Werte zu prüfen.

© wladi - Fotolia.comStandardwert: "Nicht gesetzt"
Empfehlung: Für diese Option kann keine Empfehlung gegeben werden - es kommt auf den Einsatzzweck an.

3.5 Option: client-cert-not-required

Überprüft nicht das Client Zertifikat, sondern ausschließlich den Benutzernamen und das Passwort. Die gesamte Sicherheit hängt somit primär an dem Skript, welches mit auth-user-pass-verify übergeben wurde.

© wladi - Fotolia.comStandardwert: "Nicht gesetzt"
Empfehlung: Sollte nicht gesetzt werden.

3.6 Option: max-clients

Die maximale Anzahl gleichzeitiger, offener OpenVPN Verbindungen.

© wladi - Fotolia.comStandardwert: "Nicht gesetzt"
Empfehlung: Sollte auf den tatsächlichen, maximal möglichen Wert gesetzt werden.

4 Data Channel Verschlüsselung

4.1 Option: auth

Der Algorithmus, der im Rahmen der HMAC Paket Authentifikation verwendet wird.

© wladi - Fotolia.comStandardwert: SHA1
Empfehlung: SHA384

4.2 Option: cipher

Der verwendete Verschlüsselungscipher inkl. des Verschlüsselungsmodus für die Verschlüsselung der Nutzdaten. Einige ältere OpenVPN Versionen unterstützen noch nicht die erst mit TLS 1.2 standardisierten Cipher (z.B. AES-256-GCM, AES-256-CBC)

Alle verfügbaren Cipher können mit folgendem Befehl aufgerufen werden:

openvpn --show-ciphers

© wladi - Fotolia.comStandardwert: BF-CBC
Empfehlung: AES-256-CBC

Der Standardcipher ist für bestimmte Angriffe anfällig, siehe https://community.openvpn.net/openvpn/wiki/SWEET32

4.3 Option: keysize

Die Keysize des gerade beschriebenen Ciphers. Wird der Befehl "openvpn --show-ciphers" eingegeben, kommt in der Konsole folgendes Ergebnis:

...
BF-CBC 128 bit default key (variable)
BF-CFB 128 bit default key (variable)
BF-OFB 128 bit default key (variable)
RC2-40-CBC 40 bit default key (variable)
CAST5-CBC 128 bit default key (variable)
CAST5-CFB 128 bit default key (variable)
CAST5-OFB 128 bit default key (variable)
RC2-64-CBC 64 bit default key (variable)
AES-128-CBC 128 bit default key (fixed)
AES-128-OFB 128 bit default key (fixed)
AES-128-CFB 128 bit default key (fixed)
AES-192-CBC 192 bit default key (fixed)
AES-192-OFB 192 bit default key (fixed)
...

Der Wert in Klammern ist hierbei der relevante: variable bedeutet, dass sich die Keysize festlegen lässt, fixed bedeutet, das der Cipher eine unveränderliche Keysize definiert hat.

Wird die Keysize manuell definiert, muss diese neben der Server-Konfigurationsdatei auch in der OpenVPN Client-Konfigurationsdatei stehen.

© wladi - Fotolia.comStandardwert: 128
Empfehlung: 448, wenn BF-CBC (der OpenVPN Standard) verwendet wird, was jedoch nicht empfohlen wird!

4.4 Option: no-replay

Deaktiviert den Schutz von OpenVPN gegen Replay-Attacken.

© wladi - Fotolia.comStandardwert: "Nicht gesetzt"
Empfehlung: Sollte nicht gesetzt werden.

4.5 Option: replay-persist

Diese Option speichert den Status des Replay-Schutzes über OpenVPN Sessions hinweg. Insbesondere wenn OpenVPN in einem dynamischen Kontext (inetd) gestartet und gestoppt wird, ist diese Funktion sehr sinnvoll.

Diese Funktion muss zusammen mit mit der Option "tls-auth" verwendet werden.

© wladi - Fotolia.comStandardwert: "Nicht gesetzt"
Empfehlung: Sollte genutzt werden, wenn Open VPN in einem dynamischen Kontext verwendet wird.

4.6 Option: no-iv

Deaktiviert die Verwendung des Initialisierungsvektors bei der Verschlüsselung. Je nach Cipher kann dies die Sicherheit der Verschlüsselung vollkommen kompromittieren! Es gibt im Normalfall keinen Grund, diese Option zu verwenden.

© wladi - Fotolia.comStandardwert: "Nicht gesetzt"
Empfehlung: Sollte nicht genutzt werden.

5 TLS Mode Optionen

5.1 ca

Die Certificate Authority (CA) im .pem Format.

5.2 dh

Diese Datei enthält die DH Parameter. Bei den DH Parametern handelt es sich um eine Primzahl p und den Integer g, die am Anfang des Diffie Hellmann Schlüsselaustausches offen ausgetauscht werden.

Die Parameter können mit verschiedenen Stärken generiert werden:

openssl dhparam -out = <Pfad/Dateiname>.pem ${KEY_SIZE}

© wladi - Fotolia.comStandardwert: ${KEY_SIZE} = 1024 bit
Empfehlung: ${KEY_SIZE} = 4096 oder 8192 bit

5.3 cert

Lokales Client-Zertifikat im .pem Format. Das Zertifikat muss durch die Certificate Authority signiert worden sein.

5.4 key

Der private Schlüssel des Clients.

© wladi - Fotolia.comFür die Schlüsselgenerierung werden Stärken von mindestens 4096 bit empfohlen.

5.5 key-method

Bestimmt die Methode zur Schlüsselaushandlung des Datenkanals, Details findet sich in der OpenVPN Dokumentation. Die verwendete Methode sollte belassen werden, ein Wechsel auf das ältere Protokoll wird nicht empfohlen.

5.6 tls-cipher l

In dieser Variable kann eine, durch ":" getrennte Liste, zulässiger TLS-Cipher definiert werden. Durch diese Variable lassen sich beispielsweise Angriffsvektoren für die "Version Rollback- Attack" minimieren.

Mit folgendem Befehl lässt sich eine Liste aller unterstützten TLS Cipher anzeigen:

openvpn --show-tls

© wladi - Fotolia.comStandardwert: Alle verfügbaren
Empfehlung: Siehe folgende Auflistung, getrennt nach Open VPN Version bis inkl. 2.3.2 und ab der zukünftigen 2.3.3

  • Open VPN <= 2.3.2 ⇒ "TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-RSA-WITH-AES-128-CBC-SHA"
  • Open VPN >= 2.3.3 ⇒ "TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256"

5.7 reneg-bytes n / reneg-pkts n / reneg-sec n

Startet eine Neuaushandlung des Keys für den Datenkanal nach n Sekunden/ Paketen / Bytes.

© wladi - Fotolia.comStandardwert: reneg-sec 3600
Empfehlung: reneg-sec 1800

5.8 hand-window n

Das Handshake Window -- der TLS-basierte Schlüsselaustausch muss innerhalb von n Sekunden abgeschlossen werden.

© wladi - Fotolia.comStandardwert: 60 (Sekunden)
Empfehlung: Veränderung des Standardwertes nicht erforderlich.

5.9 tran-window n

Zeitdauer, die der alte Schlüssel nach Beginn der Aushandlung eines neuen Schlüssels noch gültig ist.

© wladi - Fotolia.comStandardwert: 3600 (Sekunden)
Empfehlung: Veränderung des Standardwertes nicht erforderlich, jedoch können auch niedrigere Werte versucht werden.

5.10 single-session

Nachdem der erste Client sich verbunden hat, werden alle weiteren Verbindungsanfragen abgelehnt. Die Nutzung dieser Option verhindert ebenfalls ein Reconnect des ersten Clients. "Single-Session" ist nicht dasselbe wie "max-clients 1".

© wladi - Fotolia.comStandardwert: "Nicht gesetzt"
Empfehlung: Veränderung des Standardwertes nicht erforderlich, außer die Rahmenbedingungen im Einsatz erfordern diese Option.

5.11 tls-auth file [direction]

Diese Option ist eine der wichtigsten Optionen zur Absicherung einer OpenVPN Installation, sie aktiviert einen zusätzlichen HMAC Authentication Layer. In kurzen Worten beschrieben, werden die Pakete des TLS Kontroll Kanals mit einer HMAC Signatur gesichert.

Pakete mit einer ungültigen Signatur werden aktionslos verworfen.

Die Datei kann mit folgendem Befehl generiert werden:

openvpn --genkey --secret

© wladi - Fotolia.comStandardwert: "Nicht gesetzt"
Empfehlung: Server: tls-auth 0
Client: tls-auth 1

5.12 askpass [file]

Diese Option übergibt OpenVPN das Passwort für den Private Key. Wird das Passwort nicht übergeben, ist jedoch eines notwendig, fragt OpenVPN bei jedem Start nach diesem.

© wladi - Fotolia.comStandardwert: "Nicht gesetzt"
Empfehlung: Nur notwendig, wenn der Private Key verschlüsselt wurde. In hoch sicheren Umgebungen sollte die Datei nach dem Start entweder gelöscht oder das Passwort von Hand bei jedem Start eingegeben werden.

5.13 auth-nocache

Wenn aktiviert, werden die durch die Optionen --askpass oder --auth-user-pass gespeicherten Daten nicht länger als nötig zwischengespeichert.

© wladi - Fotolia.comStandardwert: "Nicht gesetzt"
Empfehlung: Option ist nur in Umgebungen mit sehr hohen Sicherheitsanforderungen relevant.

5.14 tls-verify cmd

Bietet die Möglichkeit den X509-Name einer neuen Verbindung zu prüfen.

© wladi - Fotolia.comStandardwert: "Nicht gesetzt"
Empfehlung: Veränderung des Standardwertes nicht erforderlich, außer die Rahmenbedingungen im Einsatz erfordern diese Option.

5.15 remote-cert-tls client|server

Zur Verhinderung von Man-in-the-Middle Attacken prüft diese Option, ob das gegenüberliegende Zertifikat explizit den Type "Client" oder "Server" hat.

© wladi - Fotolia.comStandardwert: "Nicht gesetzt"
Empfehlung: Die Optionen sollte sowohl im Client, als auch auf dem Server gesetzt werden.

5.16 crl-verify

Gibt den Pfad zur Certificate Revocation List an. Diese Datei beinhaltet eine Liste aller Zertifikate, die zurückgerufen worden sind.

© wladi - Fotolia.comStandardwert: "Nicht gesetzt"
Empfehlung: Die Optionen sollte auf dem Server verwendet werden, um Zertifikate zurückrufen zu können.

6 Dateiberechtigungen

Die Berechtigungen sind darauf ausgelegt, dass sowohl die Option "user/group" als auch "persist-key" verwendet wird.

  • OpenVPN Konfigurationsdatei
    • Besitzer root:root
    • Berechtigungen 400 (nur root darf lesen)
  • ca Datei
    • Besitzer root:root
    • Berechtigungen 400 (nur root darf lesen)
  • User Zertifikat
    • Besitzer root:root
    • Berechtigungen 400 (nur root darf lesen)
  • User Keyfile
    • Besitzer root:root
    • Berechtigungen 400 (nur root darf lesen)
  • DH Parameter
    • Besitzer root:root
    • Berechtigungen 400 (nur root darf lesen)
  • Certificate Revocation List
    • Besitzer <OpenVPN User>:<OpenVPN Group>
    • Berechtigungen 400 (nur OpenVPN User darf lesen)
  • Client IP File von ifconfig-pool-persist
    • Besitzer <OpenVPN User>:<OpenVPN Group>
    • Berechtigungen 600 (nur OpenVPN User darf lesen und schreiben)

Bildnachweis:

  • Beitragsbild: © Maksim Kabakou - Fotolia.com
  • Haken vor den Empfehlungen: © wladi - Fotolia.com

7 Gedanken zu „Härtung eines OpenVPN Servers“

  1. Ich vermute hier eine falsch gesetzte Berechtigung:

    Certificate Revocation List
    Besitzer :
    Berechtigungen 400 (nur OpenVPN User darf lesen)

    Client IP File von ifconfig-pool-persist
    Besitzer :
    Berechtigungen 600 (nur OpenVPN User darf lesen)

    Ein mal heißte es 400 und dann 600 und beide male heißt es (nur OpenVPN User darf lesen)

    1. Hi,

      danke für den Hinweis. Ich habe den kompletten Beitrag aktualisiert, insbesondere Kapitel 4.1 bis 4.3. Zum Zeitpunkt der Beitragserstellung waren bei älteren OpenVPN Implementierungen zum Teil noch keine besseren Algorithmen möglich.

      Viele Grüße,
      Martin Witkowski

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert