Blog

OpenVPN-Review: Sicherheitsanalyse von OpenVPN-Konfigurationsdateien

Wie bereits in einem früheren Blog-Artikel angekündigt, wollen wir die sichere Konfiguration von OpenVPN-Installation erleichtern und haben deshalb vor kurzem die erste Version des OpenVPN-Review Tools veröffentlicht.

OpenVPN-Review bietet eine Möglichkeit, bestehende OpenVPN-Konfigurationsdateien auf deren Sicherheit zu überprüfen. Hierbei werden die wichtigsten Faktoren betrachtet und bewertet. Das Resultat soll eine Übersicht über die Sicherheit sowie Vorschläge zur Verbesserung bieten.

Das Tool ist in Python3 geschrieben und sollte auf dem OpenVPN Server ausgeführt werden, um die eingesetzte SSL/TLS-Bibliothek (OpenSSL oder mbedTLS) miteinbeziehen zu können. Grundsätzlich ist es auch möglich, Konfigurationsdateien von Clients oder auch Konfigurationsdateien des Servers auf dem Client zu bewerten. Dies kann aber zu einer unvollständigen Bewertung führen.

Das Script ist quelloffen und auf GitHub frei verfügbar.

Ziel

Die Steigerung der Infrastruktursicherheit ist unsere Intention. Das grundsätzliche Ziel ist es, die Sicherheit von OpenVPN-Servern zu verbessern. Der Einsatzzweck des Servers ist hierbei irrelevant.

Leider bereitet die Konfiguration von sicherheitsrelevanten Systemen häufig Probleme. Einstellungen von Cipher-Suites, Hashing-Algorithmen oder anderen Verschlüsselungsoptionen erfordern ein bestimmtes Grundwissen. Außerdem ändern sich die Voraussetzungen stetig. In den Artikeln „Sichere SSL-/TLS-Konfiguration“ und „Sichere Konfiguration eines VPN mit OpenVPN“ beschreiben wir, wie eine sichere Konfiguration für Webserver oder OpenVPN-Server aussieht. Mit OpenVPN-Review wollen wir eine Methode anbieten, um die fertige OpenVPN-Konfiguration zu prüfen und Verbesserungsmöglichkeiten zu identifizieren.

Hierbei soll das Resultat primär eine Übersicht über die Konfiguration bieten und eine Richtlinie zur Verbesserung darstellen. Das Resultat sollte nicht als absoluter Beweis für Sicherheit gesehen werden.

Benutzung

Das Script wird über die Kommandozeile mit Python3 bedient. Mit der Angabe von -h/–help wird eine Übersicht der möglichen Argumente ausgegeben:

  -h, --help            show this help message and exit
  -c CONFIG, --config CONFIG
                        The OpenVPN configuration file (default /etc/openvpn/server/server.conf)
  -s, --server          Flag to define that the script is running on the OpenVPN server. The default tls-cipher for the server can only be identified on the server itself.
                        If the script is executed on a differnt system and this flag is set, the results may be distorted.
                        If the default tls-cipher is configured and the script is not executed on the server, the results will be incomplete.
  -m, --mbedtls         Flag to define that mbedTLS is used for OpenVPN.
  -v, --verbose         Verbose mode
  -vv, --veryverbose    Very verbose mode

Die wichtigsten Optionen sind hierbei -c/–config und -s/–server. Die zu untersuchende Konfigurationsdatei wird mit der -c/–config-Option definiert. Die Option -s/–server definiert, dass das Tool auf dem OpenVPN-Server betrieben wird und erlaubt somit die Integration der installierten SSL/TLS-Bibliothek. Dies ist deswegen nötig, da es von der eingesetzten SSL-Bibliothek abhängig ist, welche Cipher standardmäßig verwendet werden. Eine genaue Beschreibung gibt es weiter unten.

Im einfachsten Fall sieht die Benutzung mit den Optionen –server und –config folgendermaßen aus:

Die hier verarbeitete Konfigurationsdatei ist aus dem früheren Blog für die OpenVPN-Konfiguration entnommen. Es wird sehr schnell deutlich, dass die Konfiguration Verbesserungsmöglichkeiten bietet. Für die Option tls-version-min wird der Standardwert 1.0 verwendet. Das bedeutet, dass die Verschlüsselung des Kontrollkanals theoretisch auch auf TLSv1.0 stattfinden kann. TLSv1.0 muss inzwischen als unsicher angesehen werden, weswegen die sichere alternative TLSv1.2 hier definiert werden sollte.

Mit den Optionen -v bzw. -vv ist es möglich, eine ausführlichere Beschreibung zu erhalten.

Wenn die Konfiguration angepasst wird und tls-version-min auf 1.2 geändert wurde, wird in dem Resultat deutlich, dass sich die Konfiguration verbessert hat. Die Konfiguration in dem früheren Blog-Artikel wurde auch aufgrund dieser Einsicht angepasst.

Die nächsten Verbesserungsmöglichkeiten bieten sich jetzt bei der Liste der erlaubten Datenkanalverschlüsselungsmethoden (ncp-ciphers). Die bestehende Konfiguration kann aber bereits als sehr gut angesehen werden.

Eine beispielhafte, schlechte Konfiguration würde folgendes Resultat erzielen:

Die Konfiguration wurde sehr deutlich als schlecht bewertet (Rating: F). Die ausführlichere Beschreibung mit dem Argument -v beinhaltet hier auch effektive Verbesserungsvorschläge.

Das Tool versucht dem Benutzer zu verdeutlichen, welche Optionen wie verändert werden sollten, um eine sicherere Konfiguration zu erhalten.

In diesem Fall wird vorgeschlagen, den Hashing-Algorithmus (auth) sowie die Liste der Kontrollkanalcipher (ncp-ciphers) zu ändern. Zudem wird empfohlen, die Option tls-crypt zu setzen und die TLS-Version nicht einzuschränken.

Server-Modus

Das Script kann mit dem -s/–server-Argument im Server-Modus betrieben werden. Somit kann das Tool auf die installierte SSL/TLS-Bibliothek zugreifen. Dies ist vor allem für den Standardwert der Datenkanalverschlüsselung (Option tls-ciphers) relevant.

Der Standardwert hierfür ist nämlich von der eingesetzten SSL/TLS-Bibliothek abhängig und variiert stark. Ohne Zugriff auf diese Liste kann das Script die Sicherheit dieser Option nicht bewerten und dementsprechend wird die Bewertung angepasst.

Eine sonst gute Konfiguration wird dadurch schlecht bewertet. Die Liste der Standartciphersuites kann mit dem folgenden SSL-Befehl identifiziert werden:

$ openssl ciphers 'DEFAULT:!EXP:!LOW:!MEDIUM:!kDH:!kECDH:!DSS:!PSK:!SRP:!kRSA'

Im Server-Modus identifiziert das Script diese automatisch und bewertet die Konfiguration dementsprechend. Das obige Beispiel im Server-Modus würde mit OpenSSL 1.1.0f auf Debian 9 folgende Liste bewerten:

ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA

Bei mbedTLS ist diese Liste abhängig von der Konfiguration. Eine Liste der unterstützten TLS-Cipher-Suites kann mit dem folgenden Befehl ausgegeben werden.

$ mbedtls_ssl_server2 --verbose

OpenVPN-Review in den Kinderschuhen

Das Script befindet sich aktuell noch in der Beta-Version und wird noch weiterentwickelt bzw. vervollständigt. Unerwartete Fehler oder unbekannte Argumente sind also noch durchaus möglich.

Ein bekanntes Problem besteht in Verbindung mit der enormen Vielzahl an TLS-Cipher-Suites. Mit unterschiedlichen SSL/TLS-Bibliotheken in verschiedensten Versionen ergeben sich unzählige mögliche Optionen.

Unbekannte Werte werden in der Ausgabe des Scripts rot markiert und als unbekannt betitelt.

In diesem Beispiel werden zwei Cipher-Suites nicht erkannt:

tls-cipher: ECDHE-RSA-AES-512-GCM-SHA384
tls-cipher: ECDHE-ECDSA-GIB-512-SON-SHA1024

Hier hoffen wir auf Ihre Mithilfe. Unbekannte Werte oder andere Probleme mit dem Werkzeug können vorzugsweise als Issue auf GitHub gemeldet werden.

Wir versuchen dann, diese möglichst zeitnah zu implementieren und das Tool zu vervollständigen.

Zukunft

Das Script wird künftig mit derzeit unbekannten Cipher(-Suites) oder Hashing-Algorithmen erweitert. Weiter ist die Unterstützung für die Renegotiation-Optionen und die keysize-Option geplant.

Außerdem wird eine Funktion hinzugefügt, die die installierte OpenVPN-Version mit der dem Script bekannte OpenVPN-Version vergleicht. Somit kann sichergestellt werden, ob das Script möglicherweise veraltet ist und dementsprechend möglicherweise verfälschte Resultate liefert.

Das Script wird in Zukunft mit einem zweiten Tool ergänzt, das die Bewertung der Serverkonfiguration ohne Zugriff auf diese – von der Position des Clients aus – erlaubt. Es ist dann ähnlich zu verwenden wie sslscan, nur für OpenVPN-Installationen.

Vorheriger Beitrag
Verschlüsselung leicht gemacht
Nächster Beitrag
Basis-Absicherung für den eigenen Server (1/2)

Ähnliche Beiträge

Es wurden keine Ergebnisse gefunden, die deinen Suchkriterien entsprechen.