OpenVPN härten

Aus

Einleitung OpenVPN Verbindung

Eine OpenVPN-Verbindung zwischen Server und Client besteht aus zwei Kanälen. Einem Steuer-/Kontrollkanal und einem Datenkanal. Der Client initiiert die Verbindung durch eine TLS-Sitzung innerhalb der Kontrollkanal bei der Anmeldeinformationen ausgetauscht werden. Wurde diese Erfolgreich durchgeführt, wird der Datenkanal etabliert. Im Datenkanal wird sämtlicher Traffic verschlüsselt übertragen.

OpenVPN Standard

Die Standardkonfiguration des OpenVPN auf einem Synology Server ist im Default auf AES 128 (CBC), SHA-1 eingestellt. In der Regel genügt dieser Wert. Will man eine erhöhte Sicherheit, kann man dies härten. Dazu muss man Shell-Zugriff auf seinem Server haben.

Voraussetzungen

  • Umgang mit der Konsole (bei Verwendung des SSH-Zuganges)
  • Grundkenntnisse im Umgang mit Shell (vi, nano usw.)

DSM/Clients

  • getestet mit DS716+ mit installiertem VPN Packet
  • DSM 6.x
  • Windows 10, Android 5.0, OpenVPN 2.3.10

Hinweis für die Hardware

Die hier gemachten Angaben wurden primär auf einer DS716+ getestet. Bei älterer Hardware können Performance-Einbussen auftreten. Wie bei jedem System muss man jede Einstellung getrennt getestet werden.

Wie teste ich den Verlust an Performance?

Man kann mit OpenSSL einen kleinen Benchmark durchführen, bei der man sich die unterschiedlichen Schlüssellänge der Algorithmen testen kann. Als Ergebnis erhält man die Anzahl 1000 bytes pro Sekunde berechnet worden sind. Das Ergebnis kann man dann z.b. in einem Excel in Prozentwerte umrechnen.

openssl speed sha -elapsed
openssl speed aes -elapsed

Bei der ds716+ zeigte sich bei einem Vergleich von AES-128 zu AES-256 ein Verlust von ca. 30% der Performance.

AES 128 bit vs AES 256 bit

Gegen den AES sind zurzeit keine praktikablen Angriffe bekannt. Deshalb kann man sich fragen, ob der Verlust von bis zu 30% der Performance sinnvoll ist. Ein führender Kryptografie-Experte hat in mehreren Artikeln sich für AES-128 ausgesprochen, da AES-256 Designschwächen enthalten. Man spricht davon das AES-128 stärker ist, als AES-256 (Thema „key schedules“ und Zufallszahlengenerator).

[1] Bruce Schneider, 2009
[2] Guess why we're moving to 256-bit AES keys, 2013

Wichtige Pfade

Folgende Pfade sind für die härtung wichtig, bez. zum testen erforderlich:

OpenVPN starten/neu starten/stoppen:

/bin/sh /var/packages/VPNCenter/target/scripts/openvpn.sh (start|restart|stop)

Konfiguration, hier werden die jeweiligen zuätzlichen Optionen eingetragen:

vi /usr/syno/etc/packages/VPNCenter/openvpn/openvpn.conf

1. nobody für den Deamon

Standardmässig läuft der OpenVPN Dienst mit dem User root. Dies ist z.b. bei einem Einbruch ins System ein grosses Problem, da damit der Einbrecher hohe Rechte besitzt. Es empfiehlt sich einen neuen Benutzer „openvpn_server“ zu erstellen oder den User/Gruppe „nobody“ zu verwenden:

Den Benutzer, die Gruppe hinterlegt man in der openvpn.config:

user nobody
group nobody

Nach dem neustart des Dienstes kann man die Berechtigungen kontrollieren:

netstat -tlnp | grep openvpn
tcp 0 0 127.0.0.1:1195 0.0.0.0:* LISTEN 10268/openvpn
ps aux | grep openvpn

Der OpenVPN Server wird neben dem Hauptprozess (als nobody) auch 2 Childprozesse gestartet. Diese werden benötigt um Routing zu löschen, da der Hauptprozess zu wenige Privilegien hat.

Kompatibilität bei wiederaufnahme der Verbindung

Folgende Einstellungen sollten gesetzt sein.

  • persist-tun: TUN/TAP-Device wird nicht geschlossen und neugestartet, wenn der Befehl --ping-restart ausgeführt werden soll. (für IP Änderung bei Mobilefunk)
  • persist-key: die Key-Dateien werden nicht neu gelesen, wenn der Befehl --ping-restart ausgeführt werden soll. Der Deamon (mit User nobody) kann bei einem Restart der Verbindung den Key nicht mehr lesen
persist-tun
persist-key

2. tls-auth

Mit einer HMAC Signatur werden alle Pakete die bei der TLS Handshake involviert sind signiert. Werden Pakete ohne die richtige HMAC Signatur gesendet/empfangen werden sie auf der Stelle verworfen. Damit verhindert man:

  • DoS- Attacken oder Port-flooding auf dem OpenVPN UDP port.
  • Port scanning um zu verhindern ob der Server UDP Port abhört
  • Buffer overflow Sicherheitslecks in the SSL/TLS-Implementation
  • SSL/TLS Handshake Initiierung eines nicht-autorisierenden Computers (Grundsätzlich wird die Verbindung fehlschlagen, da das Zertifikat falsch sein wird. Mit der tls-auth Methode wird aber die Verbindung schon an einem früheren Zeitpunkt gekappt)

Wir generieren wie folgt eine Signatur:

openvpn --genkey --secret usr/syno/etc/packages/VPNCenter/openvpn/keys/hmac.key

Auf dem OpenVPN Server tragen wir folgende Zeile ein:

tls-auth /usr/syno/etc/packages/VPNCenter/openvpn/keys/hmac.key 0

Auf dem OpenVPN Client (Windows) tragen wir folgende Zeile ein:

tls-auth hmac.key 1

3. Cipher (Chiffre)

Der VPN Datenkanal kann auf der Synology (DS716+) problemlos auf AES 256bit, im CBC Modus umgestellt werden. Im Standard wird Blowfish-128, bez. bei Synology AES 128 verwendet. Um generell herauszufinden, welche Cipher verfügbar sind, kann diese mit folgendem Befehl anzeigen lassen:

openvpn --show-ciphers

Auf dem OpenVPN Server/Client tragen wir folgende Zeile ein:

cipher AES-256-CBC
  • Hinweis 1: Auf Android Geräten ist AES, Blowfish, und DES Ciphers supportet. Gerade AES ist die beste Wahl für Android mit ARM Prozessoren da sie am effizientesten arbeiten.
  • Hinweis 2: Bei nicht Intel Prozessoren bez. schwachen CPU ohne AES-NI kann es zu Performance-Einbussen kommen. Man kann den Cipher auf AES-128-CBC setzen

4. authentication digest (Kryptologische Hashfunktion)

Es empfiehlt sich die Hashfunktion von SHA-1 auf einen SHA-2 Standard anzuheben. Hier kann man SHA-512 verwenden.

Man kann mit folgenden Befehl alle Digests anzeigen lassen:

openvpn --show-digests

Auf dem OpenVPN Server/Client tragen wir folgende Zeile ein:

auth SHA512
  • Sollten Probleme auftreten kann "SHA1" verwendet werden. Auf keinen Fall sollte man MD5, MD4 usw. verwenden, da sie als "gebrochen" gelten.

5. tls-cipher (Cipher Suite, Chiffrensammlung)

In der letzten Option legt man die Cipher Suite fest, die der Server unterstützt. Dies hilft dabei, dass man keine unsicheren Methoden verwendet.

Damit man den Kontroll-Kanal mit dem stärksten Chiffrensammlung (cipher suites) einstellen kann muss man sich bewusst sein, das nicht jede Chiffrensammlung in jeder OpenVPN Version verfügbar ist. Die Verschlüsselung AES in GCM Modus mit TLS 1.2 verwendet SHA2, AES und Camellia in CBC Modus verwendet SHA1 über TLS 1.0.

[3] community.openvpn.net

Eine Auflistung aller Cipher Suiten kann man sich mittels folgendem Befehl holen:

openvpn --show-tls

Erklärung:

* CBC = Cipher Block Chaining Mode
* GCM = Galois/Counter Mode
* AES = Advanced Encryption Standard

Folgende Einstellungen habe ich getestet:

OpenVPN 2.3.2 und älter

  • Die Zeile ohne Umbrüche eintragen
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-256-CBC-SHA:
TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA:TLS-DHE-RSA-WITH-AES-128-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA

OpenVPN 2.3.3 und neuer

tls-cipher 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 

Zusammenfassung

Ich habe wie folgt die OpenVPN Konfiguration erweitert, die für meine ds716+, Windows 10 und Android 5.x funktioniert. Eine einbusse der Performance oder erhöhten Batterieverbrauch konnte ich nicht feststellen

Server:

cipher AES-256-CBC
auth SHA512
tls-cipher 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
user nobody
group nobody
tls-auth /usr/syno/etc/packages/VPNCenter/openvpn/keys/hmac.key 0

Windows Client:

cipher AES-256-CBC
auth SHA512
tls-cipher 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
tls-auth hmac.key 1