OpenVPN härten
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 und ein Diffie-Hellman von 3072-Bit eingestellt. In der Regel genügen diese Werte und funktionieren auch auf ältere Hardware. Will man eine erhöhte Sicherheit, kann man diese durch hinzufügen von Optionalen Werten zu 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).
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
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
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 signifikante 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