Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

TLS-Proxy stunnel

&pagelevel(2)&pagelevel

Dieses Kapitel beschreibt die Einrichtung und Nutzung des ins BS2000 portierten, unter der GP License stehenden, Open Source TLS-Proxy stunnel,. Die Homepage mit weiterführenden Informationen zu dem von Michal Trojnara geführten Projekt findet sich unter https://www.stunnel.org/.

Stunnel dient grundsätzlich dazu, Anwendungen mit TLS-Unterstützung mit Diensten ohne eine solche zu verbinden oder umgekehrt. Als Portierungsbasis wurde (zum Zeitpunkt der Drucklegung des Manuals) die Version 5.72 verwendet.

Die Zielrichtung der hier vorliegenden Portierung ist die Verwendung in Verbindung mit einer MT9750-Terminal-Emulation, die eine Verbindungsabsicherung mit dem TLS-Protokoll unterstützt. Die stunnel-Instanz auf dem jeweiligen Ziel-BS2000-System ist dann der andere Endpunkt der TLS-Verbindung. Von dieser stunnel-Instanz führt dann eine zweite, ungesicherte, aber dafür lokale Verbindung zur z.B. $DIALOG- oder OMNIS-Anwendung. Eine darüber hinaus gehende Nutzung mit anderen TCP-basierten Protokollen ist grundsätzlich möglich, wird aber bislang weder explizit getestet noch garantiert. Die nachfolgende Beschreibung beschränkt sich auf Dinge, die für die Nutzung im Zusammenhang mit MT9750 wichtig sind, für weiterführende Informationen sei auf die mitgelieferte Dokumentation verwiesen.

Stunnel ist als ein alleinstehendes Programm realisiert, das in SYSLNK.TCP-IP-AP.nnn enthalten ist. Für Einrichtung und Betrieb gibt es eine Reihe von Prozeduren in SYSPRC.TCP-IP-AP.nnn, die nachfolgend im Detail erläutert sind:

STUNNEL.INSTALL

Diese Prozedur erzeugt eine ENTER-JOB-Datei SYSENT.TCP-IP-AP.nnn.STUNNEL, die später zum Starten von stunnel verwendet wird, und eine initiale Konfigurationsdatei SYSDAT.TCP-IP-AP.nnn.STUNNEL.CONF. In letzterer wird u.a. die Log-Datei und die Datei mit der TSN der stunnel-Task, die für die weiteren Prozeduren benötigt wird, konfiguriert. Außerdem ist für die Nutzung mit MT9750 schon ein Dienst konfiguriert; auf Details der Konfigurationsdatei wird in einem späteren Abschnitt eingegangen.

Um möglichst einfach und schnell stunnel ausprobieren zu können, wird außerdem eine Datei SYSDAT.TCP-IP-AP.nnn.STUNNEL.PEM generiert, die ein selbstsigniertes X.509-Zertifikat und den zugehörigen privaten RSA-Schlüssel enthält. Da diese Datei nicht individuell erzeugt wird, taugt sie nicht zur Abwehr von "Man in the Middle (MITM)"-Angriffen und sollte daher nie produktiv, sondern nur für Testzwecke eingesetzt werden; die Generierung einer produktiv einsetzbaren Alternative wird weiter unten beschrieben.

STUNNEL.START

Diese Prozedur startet mit Hilfe der von STUNNEL.INSTALL erzeugten SYSENT-Datei einen ENTER-Job, der das stunnel-Programm ausführt.

STUNNEL.STOP

Diese Prozedur beendet das stunnel-Programm.

STUNNEL.SWITCH-LOGFILE

Die jeweils aktuelle Log-Datei ist nicht einsehbar, solange das stunnel-Programm ausgeführt wird. Diese Prozedur erlaubt es, auf eine neue Log-Datei umzuschalten, deren Name der ursprüngliche (SYSLOG.TCP-IP-AP.nnn.STUNNEL) ist, an den Datum/Uhrzeit des Umschaltzeitpunkts angehängt wird. Damit wird dann die vorherige Log-Datei einsehbar.

STUNNEL.LOG-CONN

Diese Prozedur führt dazu, dass (vor allem für Diagnosezwecke) die aktuell bestehenden Verbindungen in der Log-Datei protokolliert werden.

STUNNEL.RELOAD-CONFIG

Diese Prozedur bringt stunnel dazu, die (zwischenzeitlich modifizierte) Konfigurationsdatei erneut einzulesen, um z.B. zusätzliche Dienste zu unterstützen.


Installation und Konfiguration

Da der Betrieb aus verschiedenen Gründen nur mit TSOS-Rechten funktioniert, sollte die Installation ebenfalls unter TSOS erfolgen. Hierzu wird die Prozedur STUNNEL.INSTALL in der LMS-Bibliothek SYSPRC.TCP-IP-AP.nnn aufgerufen:

/CALL-PROCEDURE FROM-FILE=*LIBRARY-ELEMENT(LIBRARY=$TSOS.SYSPRC.TCP-IP-AP.nnn,ELEMENT=STUNNEL.INSTALL)

Die dabei erzeugte initiale stunnel-Konfigurationsdatei SYSDAT.TCP-IP-AP.nnn.STUNNEL.CONF hat folgenden Inhalt:

output = SYSLOG.TCP-IP-AP.nnn.STUNNEL                          
pid    = SYSDAT.TCP-IP-AP.nnn.STUNNEL.TSN                      
sslVersionMin = TLSv1.2                                             
; Uncomment the following line if you need more log information
;debug = debug                                                 
;stack = 100000                                                
;                                                              
; Standard configuration for MT9750:                           
[MT9750]                                                       
    accept = 994                                              
    connect = 127.0.0.1:102                                    
    cert = SYSDAT.TCP-IP-AP.nnn.STUNNEL.PEM                    
;                                                              


Leerzeilen und mit einem Semikolon (;) beginnende Zeilen werden ignoriert. Die Service-übergreifenden, globalen Definitionen stehen am Anfang. Mit [<service name>]werden Service-spezifische Definitionen eingeleitet; der Service-Name dient dazu, Log-Datei-Einträge den jeweiligen Services zuzuordnen.

Globale Optionen

Mit output wird die Log-Datei spezifiziert, mit pid die Datei, die die TSN des stunnel-Jobs enthält (wird von den Prozeduren zur Adressierung des stunnel-Programms benutzt).

Da TLS-Versionen älter als 1.2 wegen sicherheitstechnischer Mängel nach Möglichkeit nicht mehr verwendet werden sollten (siehe auch RFC 8996), wird durch sslVersionMin = TLSv1.2 global eingestellt, dass nur TLS-Versionen ab TLS 1.2 verwendet werden sollen. sslVersionMin kann auch Service-spezifisch verwendet werden.

Bei Problemen sollte die höchstmögliche Logging-Stufe aktiviert werden, indem das Semikolon vor der debug Option entfernt wird. Voreinstellung dieser Option ist notice, für weitere Options-Werte sei auf die weiterführende Dokumentation verwiesen.

Die auskommentierte stack-Option gibt die Voreinstellung für einen Laufzeitsystem-Parameter an, die normalerweise ausreichend sein sollte. Sollte es bei intensiver Nutzung wider Erwarten Probleme geben, die auf einen zu kleinen Stack-Bereich hindeuten, kann man diesen Parameter versuchsweise erhöhen.

Service-spezifische Optionen

Mit accept wird die Portnummer konfiguriert, auf der TLS-Verbindungen entgegengenommen werden, MT9750 verwendet als Voreinstellung den Port 994. Mit connect wird das Ziel der zugehörigen ungesicherten Verbindung angegeben, wobei Host-Name/-IP-Adresse und Port durch einen Doppelpunkt (:) getrennt sind. Als Host wird man typischerweise localhost bzw. die IP-Adresse 127.0.0.1 angeben, da ansonsten die ungesicherte Verbindung den eigenen Host verlassen würde.

Mit cert gibt man eine Datei an, die die für den Aufbau einer TLS-Verbindung benötigte X.509-Zertifikatskette enthält und die auch den zugehörigen privaten RSA-Schlüssel enthalten muss, wenn, wie hier, dafür keine eigene Datei verwendet wird.

stunnel beendet normalerweise Verbindungen, über die längere Zeit keine Daten transportiert wurden, nach einem halben Tag, also 43200 Sekunden. Mit der TIMEOUTidle Option kann diese Zeitspanne kürzer oder länger gemacht werden, negative Werte führen zu einer unendlich langen Zeitspanne. Wenn man also gar keine Beendigung von Verbindungen im Leerlauf wünscht, sollte man eine Zeile mit dem Inhalt "TIMEOUTidle = -1" zur Service-Definition hinzufügen.

Falls inaktive Verbindungen durch z.B. Firewalls zu früh beendet werden, kann man entweder global den BCAM TCP-KEEP-ALIVE-Mechanismus aktivieren (siehe Kommando MODIFY-BCAM-OPTIONS im BCAM -Benutzerhandbuch), oder aber per Sockets-Option eine dienstspezifische Einstellung vornehmen. Dafür fügt man eine Zeile mit dem Inhalt "socket = a:SO_KEEPALIVE=<120..32767>" in die Service-Definition ein, wobei man ein Timer-Intervall zwischen 120 und 32767 Sekunden wählen kann. Ein Wert von 0 schaltet den Keep-Alive-Mechanismus für den betreffenden Dienst aus. Mit den beiden obigen Einstellungen kann dann eine Service-Definition wie folgt aussehen:

[MT9750]
    accept = 994
    connect = 127.0.0.1:102
    cert = SYSDAT.TCP-IP-AP.nnn.STUNNEL.PEM
    TIMEOUTidle = -1
    socket = a:SO_KEEPALIVE=120
;


Privater Schlüssel und Zertifikat

Wie schon erwähnt, taugt die bei der Installation erzeugte SYSDAT.TCP-IP-AP.nnn.STUNNEL.PEM Datei nur für Tests der technischen Funktionalität, nicht aber zur Abwehr von MITM-Angriffen. Für letzteres muss ein individueller privater Schlüssel mit zugehörigem X.509-Zertifikat generiert bzw. besorgt werden. Details hängen davon ab, welche Methoden zur Authentifizierung die entsprechende Client-Anwendung verwendet, es sei daher auf die jeweils aktuelle MT9750-Dokumentation verwiesen. Die zum Manual-Drucklegungszeitpunkt verfügbare MT9750-Version bietet nur eine Verifizierung des öffentlichen Schlüssels (Public Key) selbst an, die dem Vorgehen bei SSH ähnelt, nicht die Verifizierung einer X.509-Zertifikatskette. Daher reicht es, diesen zum privaten Schlüssel gehörenden öffentlichen Schlüssel in Form eines selbstsignierten Zertifikats in der gleichen Datei zu hinterlegen. Für die Generierung einer Datei mit einem derartigen Schlüsselpaar gibt es die Prozedur MAKE.SELF-SIGNED-CERT, deren Verwendung im Handbuch "interNet Services Benutzerhandbuch" beschrieben ist. Die von ihr erzeugte Datei SYSDAT.TCP-IP-AP.nnn.SERVER.PEM kann anstelle der bei der stunnel-Installation erzeugten Datei verwendet werden.


Betrieb

Starten von stunnel

Mit der Prozedur STUNNEL.START wird ein ENTER-JOB gestartet, der das stunnel-Programm ausführt:

/CALL-PROCEDURE FROM-FILE=*LIBRARY-ELEMENT(LIBRARY=$TSOS.SYSPRC.TCP-IP-AP.nnn,ELEMENT=STUNNEL.START)

Die SYSOUT/SYSLST-Ausgabe erfolgt in die Datei SYSLST.TCP-IP-AP.nnn.STUNNEL.JOB. Mit Hilfe des SET-SYSLST-READ-MARK-Kommandos kann man diese Datei anschauen, ohne stunnel beenden zu müssen, falls es z.B. zu Diagnosezwecken erforderlich sein sollte. Die Prozedur besitzt einen optionalen Parameter JOB-CLASS, mit dem der Wert des JOB-CLASS-Operanden des ENTER-JOB-Kommandos modifiziert werden kann. Der Default ist *STD.


Beenden von stunnel

Mit der Prozedur STUNNEL.STOP wird das stunnel-Programm beendet:

/CALL-PROCEDURE FROM-FILE=*LIBRARY-ELEMENT(LIBRARY=$TSOS.SYSPRC.TCP-IP-AP.nnn,ELEMENT=STUNNEL.STOP)


Log-Datei umschalten

Mit der Prozedur STUNNEL.SWITCH-LOGFILE wird das Logging auf eine neue, mit dem aktuellen Zeitstempel versehene, Datei umgestellt, so dass die bisherige Log-Datei einsehbar wird:

/CALL-PROCEDURE FROM-FILE=*LIBRARY-ELEMENT(LIBRARY=$TSOS.SYSPRC.TCP-IP-AP.nnn,ELEMENT=STUNNEL.SWITCH-LOGFILE)


Daten zu aktuellen Verbindungen in Log-Datei schreiben

Mit der Prozedur STUNNEL.LOG-CONN wird stunnel veranlasst, Informationen zu den aktuell bestehenden Verbindungen in die Log-Datei zu schreiben:

/CALL-PROCEDURE FROM-FILE=*LIBRARY-ELEMENT(LIBRARY=$TSOS.SYSPRC.TCP-IP-AP.nnn,ELEMENT=STUNNEL.LOG-CONN)


Konfiguration neu laden

Mit der Prozedur STUNNEL.RELOAD-CONFIG wird stunnel veranlasst, die Konfigurationsdatei erneut einzulesen und auszuwerten:

/CALL-PROCEDURE FROM-FILE=*LIBRARY-ELEMENT(LIBRARY=$TSOS.SYSPRC.TCP-IP-AP.nnn,ELEMENT=STUNNEL.RELOAD-CONFIG)


Weiterführende Dokumentation

SYSDOC.TCP-IP-AP.nnn enthält die auf die BS2000-Besonderheiten angepasste und um definitiv nicht unterstützten Funktionsumfang reduzierte stunnel Manual Page (Man Page) als X-Element STUNNEL-<stunnel version>.ZIP. Diese ZIP-Datei enthält die Man Page sowohl im HTML Format als auch PDF-Format. Beim Transfer der ZIP-Datei ist zu beachten, dass diese binär zum Anzeigesystem transportiert wird.