SIMATIC S7-1200/1500 als secure MQTT Publisher (Teil 2 - SSL/TLS)

Simatic S7-1200/1500 MQTT Client - SSL/TLS Verschlüsselung Titelbild

Im ersten Teil SIMATIC S7-1200/1500 als MQTT Publisher (Teil 1) haben wir uns darauf konzentriert bei unserer SIMATIC S7-1500 MQTT einzurichten, sodass diese an einen MQTT Server/Broker Messages schicken kann. Wir haben sie als Publisher konfiguriert, als Server haben wir mosquitto auf Linux eingerichtet und haben bewusst auf eine Verschlüsselung der Messages verzichtet.

Im diesem Part (Teil 2) werden wir die Konfiguration der SIMATIC als auch die des mosquitto Servers anpassen, sodass ausschließlich Daten über eine verschlüsselte bzw. gesicherte Verbindung ausgetauscht werden können. Dies ist im produktiven Umfeld besonders wichtig, wenn man eine Kommunikation außerhalb des primären, gesicherten Netzes realisieren möchte.

ACHTUNG: Steuerungssysteme wie z.B. SPS/PLC oder Industrie-PCs sollten niemals ohne entsprechende IT-Security Vorkehrungen an das Internet angebunden werden. Ein umfangreiches IT-Sicherheitskonzept muss vorher erstellt werden, sodass die Absicherung jeder einzelnen Komponente sowie des gesamten Netzes sichergestellt ist! Dieser Beitrag zeigt die Konfiguration der Steuerung sowie ein mögliches Beispiel zur Absicherung! Aufgrund der Komplexität und unterschiedlichen Anwendungsanforderungen ist die Erstellung eines Cyber-Sicherheitskonzeptes jedoch immer individuell erforderlich!

Systemarchitektur für SIMATIC S7-1500 als MQTT Client und TLS verschlüsselter Datenübertragung zum Broker
Systemarchitektur für diesen Beitrag

Dieses Tutorial setzt voraus, dass die S7-1500 und der MQTT Server entsprechend SIMATIC S7-1200/1500 als MQTT Publisher (Teil 1) konfiguriert sind. Die Systemarchitektur ist identisch zu der in Teil 1, nur die IP Adresse des MQTT Broker wurde auf 192.168.1.222 geändert. Wir betrachten in diesem Artikel die notwendigen Schritte, damit der MQTT Server nur über TLS verschlüsselte Verbindungen zulässt. Gleichzeitig ändern wir die Programmierung der SIMATIC, sodass diese ebenfalls über TLS Verschlüsselung mit dem MQTT Server kommunizieren kann. Wir konzentrieren uns dabei auf die Server Authentication (die SIMATIC muss kein Client-Zertifikat präsentieren, um ihre Identität zu bestätigen).

Zertifikate und Schlüssel erstellen - im TIA Portal

Um die Verbindung zwischen der SIMATIC und dem MQTT Server (Broker) verschlüsseln zu können, müssen wir im ersten Schritt die X.509 Zertifikate und Schlüssel erstellen.

Hat man bereits einen MQTT Broker (z.B. in der Cloud) zur Verfügung, dann ist davon auszugehen, dass beim Betreiber entsprechende Zertifikate angefordert werden können. Bei der Nutzung von großen IoT Portalen können die Zertifikate beispielsweise im Kunden-Login heruntergeladen werden. Dieses Zertifikat würde man dann im TIA Portal importieren und in der SIMATIC hinterlegen. Ich möchte in diesem Tutorial jedoch zusätzlich die Gelegenheit nutzen und zeigen, wie man das TIA Portal zur Erstellung von Zertifikaten und Schlüsseln nutzen kann - diese hinterlegen wir dann in unserem eigenen MQTT Server (aka. Broker).

Die benötigten Zertifikate können beispielsweise mit OpenSSL erstellt werden. Da wir unsere SIMATIC jedoch über das TIA Portal programmieren, erstellen wir die benötigten Zertifikate auch darüber. Dies erfolgt im Global Certificate Manager. Voraussetzung hierfür: Die Global security Settings sind für die SIMATIC aktiviert und im Global Certificate Manager sind CAs (Certificate Authorities) vorhanden.

Die CAs sollten standardmäßig im Projekt vorhanden sein, diese spielen eine wichtige Rolle bei der Erstellung der Serverzertifikate. Wir erstellen ein neues Schlüsselpaar für den Server und signieren dies mit einer der verfügbaren CAs. Dazu navigieren wir zu den Device Certificates und klicken mit der rechten Maustaste auf eine freie Fläche und wählen Create aus.

In dem neuen Fenster ist bereits die Vorauswahl Signed by certificate authority getroffen, wir können dann letztlich eine CA auswählen oder die Voreinstellung beibehalten. Damit der Server schlussendlich das Schlüsselpaar auch akzeptiert, müssen wir bestimmte Parameter festlegen.

  • Im Common name of subject setzen wir die IP Adresse oder den Hostname/Domainname (je nach Szenario und Infrastruktur). Da in diesem Beispiel der MQTT Server im gleichen lokalen Netz ist, arbeiten wir hier mit der IP Adresse.
  • Als Verschlüsselungsart geben wir RSA an (siehe Rivest–Shamir–Adleman in Wikipedia), die Stärke kann mit 2048 Bit soweit bleiben und auch der Hashing Algorithmus mit sha256 ist gängige Praxis.
  • Die Gültigkeit der Zertifikate im Umfeld von Industrie 4.0 muss gut überlegt sein, da ein nachträglicher Zugang zur Steuerung u.U. nur mit größerem Aufwand möglich ist. Das TIA Portal schlägt vor, das Zertifikat in 15 Jahren auslaufen zu lassen, dies übernehmen wir in diesem Fall.
  • Für den Verwendungszweck habe ich "TLS Client / Server" ausgewählt, um hier ein wenig flexibel zu sein. Als SAN (Subject Alternative Name) habe ich ein Feld "IP" eingefügt und hier auch wieder die IP Adresse des Servers hinterlegt. Sind alle Einstellungen erfolgt, dann kann das Schlüsselpaar erstellt werden.

Im nächsten Schritt exportieren wir das Schlüsselpaar in drei verschiedenen Varianten, damit es unser Server verwenden kann:

  1. Privaten Schlüssel als PEM (ohne Passwort, da der Server dieses sonst auch bei jedem Start benötigen würde)
  2. Chain (Zertifikat und Zertifikat der CA) als PEM
  3. Zertifikat (öffentlicher Schlüssel) als PEM

Der Export kann über einen Rechtsklick auf des Zertifikat angestoßen werden: Export

Export Private Key

Export Chain (Zertifikat und Zertifikat der CA)

Zertifikat (öffentlicher Schlüssel)

Sobald die drei Files exportiert wurden, können wir diese auf den MQTT Server übertragen und mit der Konfiguration von mosquitto fortfahren.

mosquitto MQTT Server anpassen

Damit wir MQTT über TLS serverseitig nutzen können, passen wir die Konfiguration im mosquitto an. Wie im ersten Teil erläutert, läuft auch hier unser Broker auf Linux. Wir erstellen ein neues Verzeichnis für die TLS Zertifikate und den Key /etc/mosquitto/conf.d/tls_certs und kopieren dort alle drei hinein (z.B. über scp oder sftp).

Über nano erweitern wir das config file sudo nano /etc/mosquitto/conf.d/default.conf indem wir die Pfade zum Zertifikat, Key (privater Schlüssel) und der Chain einfügen, außerdem ändern wir den Port auf 8883, dieser ist für MQTT über TLS gängig. Die Config sieht schlussendlich folgendermaßen aus:

mosquitto MQTT Server Konfiguration für TLS erweitert
mosquitto MQTT Server Konfiguration für TLS erweitert

Die Konfiguration wird gespeichert und mit sudo service mosquitto restart wird der Server neu gestartet, sodass dieser die geänderten Einstellungen auch anwenden kann.

mosquitto MQTT Server Testen

Bevor wir direkt mit der SIMATIC die ersten Messages an den Server pushen, testen wir diesen mit einem CLI Client. Dies hat den Vorteil, dass wir im Falle einer fehlerhaften Konfiguration eine Fehlermeldung bekommen und auf der anderen Seite sichergehen können, dass der Server korrekt funktioniert.

Um mit dem CLI Client eine Verbindung zum Server aufbauen zu können, benötigen wir das Zertifikat der CA des Servers. Dieses haben wir im TIA Portal und exportieren es im nächsten Schritt. Hätten wir dieses nicht, könnten wir zwar unseren Client dazu bringen, die SSL Verifikation des Zertifikates zu überspringen und trotzdem eine Verbindung aufzubauen. Dies hätte jedoch den entscheidenden Nachteil, dass wir die Serveridentität nicht prüfen können und somit das Risiko eingehen unsere Prozessdaten an eine nicht vertrauenswürdige Stelle zu übermitteln. Im lokalen Netz ist das Risiko zwar gering, jedoch sollte die Serveridentität immer geprüft werden, wenn Daten über das Internet übertragen werden.

CA Zertifikat aus TIA Portal exportieren

Im TIA Portal navigieren wir wieder zu den Device Certificates und klicken bei dem kürzlich erstellten Zertifikat mit einem Rechtsklick auf Export. Ich habe das Zertifikat chainonly.pem genannt und wieder das PEM Format gewählt. Im Dialogfenster aktivieren wir diesmal nur den Export der Chain aus, es soll kein privater Schlüssel in der Datei abgelegt werden.

Die Chain übertragen wir nun auf unseren CLI Client, um die Konfiguration des Servers zu testen. Dieser temporäre Client kann ein beliebiges Device im gleichen Netz wie die SIMATIC und der MQTT Broker sein, es kann auch vom MQTT Broker aus direkt getestet werden.

Als Clients verwenden wir mosquitto_pub und mosquitto_sub. Beide Befehle sind auf dem MQTT Server vorhanden, wenn die Installation wie in Teil 1 durchgeführt wurde. Wir öffnen zwei Terminal Fenster und verwenden eines davon als Subscriber, das andere als Publisher. Wir starten zuerst den Subscriber über folgenden Command, jedoch aus dem Ordner heraus, indem sich auch unsere Chain befindet. Gleiches gilt für den Subscriber:

# Befehl, um den Subscriber zu starten:
mosquitto_sub -d -h 192.168.1.222 -p 8883 --cafile chainonly.pem -u simsiincosuser -P s71500siincosmqtt -t /controller1/data
# CA Zertifikat wird über --cafile angegeben
# Befehl, um eine Message zu publishen:
mosquitto_pub -d -h 192.168.1.222 -p 8883 --cafile chainonly.pem -u simsiincosuser -P s71500siincosmqtt -t /controller1/data -m "Hello World Again! TLS"
# CA Zertifikat wird über --cafile angegeben.

TLS für SIMATIC im TIA Portal aktivieren

Mit dem oben durchgeführten Test haben wir sichergestellt, dass der MQTT Server korrekt für TLS eingerichtet wurde und über den Port 8883 erreichbar ist. Jetzt können wir unser Projekt im TIA Portal anpassen, sodass die SIMATIC alle MQTT Verbindungen über TLS aufbaut.

Dazu öffnen wir unser Projekt und navigieren unter unserer CPU zu Program blocks und dann zu mqttdb. Dort ändern wir vier Parameter, die sich eingeklappt unter connparams befinden: port, enableTls, validateServerIdentity, brokerCert

  • port: wie oben beschrieben 8883 für TLS, wie beim Server in der Config hinterlegt (in meinem Beispiel wird dieser Wert vom KTP400 Basic Panel beschrieben)
  • enableTls: der SIMATIC wird mitgeteilt, dass die Verbindung über TLS verschlüsselt werden muss
  • validateServerIdentity: die SIMATIC gleicht das beim Verbindungsaufbau vom Server übermittelte Zertifikat mit dem in brokerCert angegebenem CA-Zertifikat ab, ob diese identisch sind - ist dies nicht der Fall, bricht die SIMATIC die Kommunikation ab)
  • brokerCert: spezifiziert das CA-Zertifikat (siehe validateServerIdentity), das der Server beim Verbindungsaufbau präsentieren muss

Das brokerCert wird bei der SIMATIC im TIA Portal über die ID angegeben, welche im Zertifikatsmanager zu finden ist. WICHTIG: Hier wird das CA Zertifikat angegeben, mit dem das im Server hinterlegte Schlüsselpaar signiert wurde.

Anschließend übertragen wir das Projekt auf die SIMATIC, stoppen und starten die CPU einmal und können dann wieder mit unserem MQTT Subscriber auf das Topic der SIMATIC subscriben. In meinem Beispiel habe ich die Einstellungen für den Broker im HMI hinterlegt (KTP400 Basic Panel). Nachdem diese neu gesetzt wurden, sehen wir in unserem Subscriber die Messages der SIMATIC eintreffen.

mosquitto_sub -d -h 192.168.1.222 -p 8883 --cafile chainonly.pem -u simsiincosuser -P s71500siincosmqtt -t /controller1/data