script-security-Stufen in OpenVPN von 0 bis 3 – und was jede freischaltet
Jede script-security-Stufe erweitert, was ein Profil ausführen darf: zuerst Admin-Helfer, dann Benutzerskripte, dann Passwörter in der Umgebung. Lesen Sie die Direktiven.
Importieren Sie ein Profil in einen Desktop-Client, und der erste Fehler ist oft eine Zeile, die der Client nicht befolgen will: ein Skript-Hook, den er nicht ausführt, oder ein script-security-Wert, den er für zu freizügig hält. Die Zahl zu erhöhen lässt den Dialog verschwinden. Es erweitert aber auch, was dieses Profil auf Ihrem Rechner ausführen darf, was eine seltsame Sache ist, die man gewährt, nur um eine Warnung loszuwerden. Verfolgen Sie den Import bis zur Direktive, und die Entscheidung wird konkret.
Vom Importdialog zur Direktive
Das Profil ist eine Textdatei mit Direktiven, und der Client liest sie, bevor irgendein Tunnel existiert. Eine Direktive wie up, down oder tls-verify benennt ein externes Programm, das OpenVPN zu einem festgelegten Zeitpunkt ausführen soll. Ob OpenVPN bereit ist, es auszuführen, ist eine separate Einstellung namens script-security, und das Profil setzt sie meist ebenfalls.
Die Warnung betrifft also nicht Kryptografie oder Zertifikate. Sie betrifft eine Konfigurationsdatei, die den Client bittet, etwas auf dem Host auszuführen, und den Client, der prüft, ob seine aktuelle Berechtigungsstufe diese Anfrage erlaubt.
Zwei verschiedene Fehler sehen in diesem Stadium gleich aus. Ein Profil, das eine Stufe verlangt, die der Client nicht gewährt, erzeugt eine Ablehnung. Ein Profil, das eine Stufe verlangt, die der Client gewährt, bei dem aber das Skript fehlt, erzeugt stattdessen einen Laufzeitfehler, und beides wird in Support-Threads vermischt. Das eine ist eine Berechtigungsfrage, das andere eine Paketierungsfrage.
Was jede Stufe tatsächlich öffnet
Stufe 0 verbietet Aufrufe externer Programme vollständig, was für einen Client stimmig ist, der seine Schnittstelle ohne Hilfe selbst konfiguriert, und unstimmig für einen, der das Betriebssystem aufruft. Stufe 1, der Standard, erlaubt die eingebauten Programme, die Schnittstellen- und Routenkonfiguration benötigen. Keine der beiden Stufen führt etwas aus, das der Benutzer beigesteuert hat.
| Level | What OpenVPN may execute | What it exposes |
|---|---|---|
| 0 | No external programs at all | Interface and route setup must not depend on helpers |
| 1 (default) | Built-in helpers such as ip, ifconfig, route or netsh | Privileged commands the platform already ships |
| 2 | Built-in helpers plus user-defined scripts | Whatever the named script does with the client's privileges |
| 3 | Everything above, plus passwords in environment variables | Credentials visible to child processes and their logs |
Stufe 2 ist die interessante Grenze, weil sie benutzerdefinierte Skripte zulässt. Von da an gelten die Rechte des Clients für Code, den Sie vielleicht nie gelesen haben, aufgerufen zu Zeitpunkten, die Sie nicht gewählt haben, in einer Umgebung, die Verbindungsdetails enthält. Stufe 3 geht weiter und erlaubt, Passwörter über Umgebungsvariablen weiterzugeben, weshalb das Handbuch sie als potenziell unsicher beschreibt.
Keine dieser Zahlen ist eine Stärkeeinstellung. Ein Profil auf Stufe 3 hat keine bessere Verschlüsselung als eines auf Stufe 1; es hat lediglich eine größere Ausführungsfläche, und der Tunnel ist identisch.
Entscheiden Sie, was das Profil verdient
Fragen Sie, wofür das Skript da ist, bevor Sie fragen, welche Stufe es braucht. Ein Hook, der DNS-Einstellungen durchsetzt oder nach dem Verbinden eine Route repariert, ist ein legitimer Grund, etwas auszuführen. Ein Hook, der eine unbekannte Binärdatei in einem temporären Verzeichnis aufruft, ist ein Grund anzuhalten.
Der Pfad des Skripts zählt genauso viel wie das Skript. Ein relativer Pfad wird gegen das Verzeichnis aufgelöst, das der Client verwendet, und ein beschreibbares Verzeichnis macht aus einem einmaligen Import einen dauerhaften Ausführungsplatz. Absolute Pfade in einem Verzeichnis, das der Benutzer nicht ändern kann, sind die Form, die vorzuziehen ist.
Skripte erben auch die Umgebung des Clients, in der Anmeldedaten und Verbindungsmetadaten leben. Genau diese Vererbung macht Stufe 3 in Kombination mit einem Skript gefährlich, das seine Umgebung protokolliert, und deshalb verdient ein Diagnoseauszug von einem Client mit Skripten einen zweiten Blick, bevor er in ein Ticket geklebt wird. Entfernen Sie die Umgebung, bevor Sie ihn weitergeben.
grep -nE 'script-security|^up |^down |tls-verify' client.ovpnÄndern Sie eine Sache, und beobachten Sie dann auch den Abbau
Wenn das Profil wirklich ein Skript braucht, ändern Sie nur die Stufe und nur für dieses Profil. Führen Sie den Client im Vordergrund mit ausführlicher Ausgabe aus, damit die eigenen Fehler des Skripts sichtbar sind, statt von einem Dienstmanager verschluckt zu werden.
openvpn --config client.ovpn --script-security 2 --verb 3
ip route show default
Testen Sie den gesamten Lebenszyklus, nicht nur das Verbinden. Ein Down-Hook, der scheitert, hinterlässt Routen, die auf einen toten Tunnel zeigen, was einen Rechner ergibt, der verbunden aussieht und nichts erreicht. Verbinden Sie sich einmal neu und trennen Sie einmal, bevor Sie die Änderung als abgeschlossen bezeichnen, und prüfen Sie danach jeweils die Routentabelle.
Bewahren Sie eine Kopie des ursprünglichen Profils auf. Wenn ein Plattform-Client dasselbe Skriptmodell nicht umsetzt, kann das Löschen von Direktiven, bis der Import gelingt, die DNS- oder Routenintegration entfernen, die der Tunnel brauchte, und die resultierende Verbindung authentifiziert sich einwandfrei, während sie nichts auflöst.
Die zu dokumentierende Entscheidung ist eng: welches Skript, unter welchem Pfad, auf welcher Stufe gewährt, für welches Profil. Alles andere im Profil bleibt unverändert, und das ist ein Satz, den ein Prüfer nachvollziehen kann.