BEZPIECZNA KOMUNIKACJA MQTT

Blog
BEZPIECZNA KOMUNIKACJA MQTT

Przemysł 4.0 to nie tylko innowacje, usprawnienia oraz automatyzacja tych obszarów przemysłu, które dotąd nie były zautomatyzowane. Wraz z rozwojem koncepcji Przemysłu 4.0 pojawia się również coraz więcej potencjalnych zagrożeń – dotychczas marginalizowanych lub pomijanych w analizach dotyczących automatyzacji kolejnych stanowisk pracy. Współczesne fabryki coraz częściej podążają za trendem integracji praktycznie każdego urządzenia ze sterownikiem PLC, wykorzystując do tego otwarty protokół komunikacyjny TCP/IP. Zaletą tego rozwiązania jest jego elastyczność – za pomocą kilku wcześniej zdefiniowanych wiadomości wymienianych pomiędzy sterownikiem PLC a urządzeniem zewnętrznym, możliwa jest efektywna wymiana danych dotyczących stanu urządzenia, nawet jeśli pochodzi ono od innego producenta. Dodatkowo, system umożliwia rozpoznawanie błędów oraz ich przetwarzanie bezpośrednio w sterowniku PLC, tak aby operatorzy mogli szybko reagować na nie poprzez wizualizację systemu SCADA.

 

Warto również wspomnieć, że wiele rozwiązań SCADA umożliwia bezpośrednią komunikację ze sterownikami PLC właśnie za pomocą protokołu TCP/IP, co jeszcze bardziej ułatwia integrację systemów automatyki.

 

Rozwiązanie to wydaje się na pierwszy rzut oka idealne do prostego i elastycznego komunikowania się z urządzeniami zewnętrznymi. Istnieje jednak jedno poważne zagrożenie, które bardzo często jest pomijane w dyskusjach na temat tej komunikacji. Mowa o braku szyfrowania przesyłanych wiadomości przy wymianie danych pomiędzy klientami w podstawowej wersji protokołu TCP/IP, a taka konfiguracja jest najczęściej stosowana w przemyśle. Jest to bardzo poważne zagrożenie w dobie rozpędu zagrożeń cybernetycznych, ponieważ dane przesyłane za pomocą niezabezpieczonego protokołu komunikacyjnego mogą w łatwy sposób zostać przechwycony. Problem ten potęguje też fakt, że jednym z terenów przemysłu 4.0 jest rozszerzanie zdalnego dostępu do fabryki w celu pomocy utrzymania ruchu, optymalizacji procesu czy ściągania danych.

 

Niezabezpieczona komunikacja TCP/IP
Niezabezpieczona komunikacja TCP/IP

 

Powyższy rysunek ilustruje sposób przesyłania niezabezpieczonego ruchu TCP/IP. Za pomocą aplikacji WireShark uruchomiono nasłuchiwanie na porcie, przez który transmitowane są wiadomości. Wyniki pokazują, że osoba trzecia, posiadająca dostęp do takiej sieci, może w prosty sposób rozpocząć przechwytywanie komunikacji i odczytywać przesyłane dane. W rzeczywistych warunkach ruch sieciowy zazwyczaj jest kierowany przez przełącznik (switch), co oznacza, że ramki trafiają wyłącznie na porty, do których podłączony jest docelowy klient. Taka architektura zwiększa bezpieczeństwo, ponieważ uniemożliwia łatwe podsłuchiwanie komunikacji przez osoby postronne. Jednak dla doświadczonych atakujących nie stanowi to większego problemu – mogą oni zastosować techniki takie jak np. MAC flooding. Polega ona na przepełnieniu tablicy MAC przełącznika dużą liczbą fałszywych adresów MAC, co w efekcie prowadzi do tzw. „fail-open”. W takim przypadku przełącznik zaczyna przesyłać ruch na wszystkie porty, umożliwiając podsłuchiwanie ruchu przez dowolnego użytkownika w sieci.

 

Zabezpieczenie ruchu sieciowego na przykładzie MQTT:

 

Protokół MQTT (Message Queuing Telemetry Transport) to wydajny, lekki protokół komunikacyjny, który został zaprojektowany z myślą o urządzeniach o ograniczonych zasobach – jest więc szczególnie popularny w środowisku Internetu Rzeczy (IoT). Dzięki niskim wymaganiom sprzętowym umożliwia niezawodną wymianę informacji nawet przy słabym łączu sieciowym.

 

Główne cechy protokołu MQTT:

  • komunikacja oparta na modelu publikacja/subskrypcja, co wyróżnia protokół MQTT na tle innych rozwiązań, opierających się głównie na tradycyjnej komunikacji klient-serwer,
  • centralne zarządzanie wymianą wiadomości za pośrednictwem brokera, czyli serwera pośredniczącego pomiędzy urządzeniami publikującymi i subskrybującymi określone tematy,
  • w przeciwieństwie do standardowego TCP/IP, MQTT umożliwia zastosowanie dodatkowych warstw zabezpieczeń, takich jak TLS/SSL, które zapewniają szyfrowanie transmisji.

 

Aby ułatwić wdrożenie komunikacji opartej na protokole MQTT, powszechnie korzysta się z gotowych rozwiązań oferowanych przez różnych producentów. Wybór odpowiedniego brokera zależy od specyfiki projektu, skali wdrożenia oraz wymagań dotyczących kosztów i dostępnych funkcji.

 

Pod względem kosztów integratorzy mogą wybierać spośród brokerów dostępnych zarówno w wersjach darmowych do zastosowań komercyjnych, jak i w modelu płatnej subskrypcji. Rozwiązania komercyjne zwykle oferują bardziej zaawansowane możliwości konfiguracji, lepsze zabezpieczenia oraz wsparcie techniczne.

 

Do najpopularniejszych brokerów MQTT należą:

  • Mosquitto – Lekki i popularny broker open-source, szeroko wykorzystywany w środowiskach IoT. Obsługuje protokoły MQTT w wersjach 3.1 i 3.1.1. Dzięki niewielkim wymaganiom sprzętowym sprawdza się idealnie na urządzeniach o ograniczonych zasobach.
  • HiveMQ – Komercyjny broker MQTT, przeznaczony do dużych systemów IoT. Oferuje wysoką skalowalność, zaawansowane funkcje zarządzania oraz niezawodność i wydajność niezbędną w środowiskach przemysłowych.

 

Wybór odpowiedniego brokera powinien być podyktowany zarówno wymaganiami technicznymi, jak i planowanym kosztem wdrożenia i utrzymania systemu.

 

HiveMQ - Grafika informacyjna
HiveMQ – Grafika informacyjna

 

Jak działa MQTT?

 

Protokół MQTT polega na uruchomieniu tzw. brokera na urządzeniu, które pełni funkcję „serwera” pośredniczącego w całej komunikacji pomiędzy wszystkimi urządzeniami (klientami) w sieci. W praktyce wymiana informacji odbywa się poprzez precyzyjnie zdefiniowane tematy (topics) – klienci publikują wiadomości w wybranych tematach, a ci, którzy subskrybują dany temat, automatycznie otrzymują każdą nową wiadomość pojawiającą się w tym kanale. Jest to model typu „publish-subscribe”, pozwalający na łatwe skalowanie systemu i elastyczne dodawanie nowych urządzeń bez konieczności budowania dodatkowych, dedykowanych połączeń pomiędzy nimi. Dodanie kolejnego urządzenia wymaga jedynie nawiązania połączenia z brokerem i ewentualnie konfiguracji certyfikatów bezpieczeństwa, a także ustalenia, które tematy ma ono subskrybować lub na których publikować dane.

 

Graficzne przedstawienie działania brokera
Graficzne przedstawienie działania brokera

 

MQTT oferuje mechanizm QoS (Quality of Service), który pozwala określić niezawodność dostarczania wiadomości między urządzeniami.

Dostępne są trzy poziomy QoS:

  • QoS 0 – Wiadomość jest wysyłana tylko raz, bez gwarancji dostarczenia. Nie ma potwierdzeń ani ponownych prób wysyłki. To najszybszy i najmniej obciążający poziom, używany tam, gdzie pełna niezawodność nie jest konieczna.
  • QoS 1 – Wiadomość zostanie dostarczona przynajmniej raz; w razie potrzeby broker ponawia wysyłkę, aż uzyska potwierdzenie odbioru. Możliwe są sporadyczne duplikaty wiadomości.
  • QoS 2 – Wiadomość dotrze do odbiorcy dokładnie raz, co gwarantuje najwyższą niezawodność, ale wiąże się z większym obciążeniem komunikacyjnym.

 

Poziom QoS ustala nadawca wiadomości i obowiązuje wszystkich subskrybujących dany temat. Wybór właściwego poziomu zależy od potrzeb aplikacji – wymaganej niezawodności, szybkości działania oraz dostępności zasobów.

 

Graficzne przedstawienie komunikacji z brokerem w zależności od poziomu QoS
Graficzne przedstawienie komunikacji z brokerem w zależności od poziomu QoS

 

Study Case:

 

W ramach testów komunikacji MQTT w środowisku przemysłowym przeprowadziliśmy próbę nawiązania połączenia między komputerem PC a sterownikiem PLC. Do realizacji zadania wykorzystano język programowania Python, który pełnił rolę klienta nr 1, oraz sterownik PLC z rodziny S7-1500, działający jako klient nr 2. Brokerem obsługującym komunikację był Mosquitto, uruchomiony w kontenerze Docker.

 

W celu utworzenia kontenera w środowisku Docker należy przygotować plik konfiguracyjny w formacie YAML, na podstawie którego tworzony jest kontener. W przeprowadzonych przez nas testach skupiliśmy się na sprawdzeniu aplikacji pod kątem podstawowej konfiguracji, dodatkowo zabezpieczonej za pomocą certyfikatu SSL.

 

Plik konfiguracyjny yaml
Plik konfiguracyjny yaml

 

W celu prostej weryfikacji czy środowisko, docker zostało poprawnie skonfigurowane użyto aplikacji MQTTX, które oferuje przejrzyste GUI do łączenia się ze brokerami MQTT. W tym celu wygenerowane zostały odpowiednie certyfikaty, które należy zaaplikować po stronie klienta.

 

Konfiguracja klienta MQTTX
Konfiguracja klienta MQTTX

 

Po uruchomieniu brokera w środowisku Docker i połączeniu klienta możliwe było wymienianie informacji i publikowanie wiadomości do tematów.

 

Wysłane widomości do broekra
Wysłane wiadomości do brokera

 

W celu przeprowadzenia rzetelnych testów uruchomiono dodatkowo dwóch klientów. Jeden z nich został zaimplementowany w języku Python, wykorzystując bibliotekę Paho. Python cechuje się wyjątkowo łatwym prototypowaniem aplikacji, dlatego został wybrany do tego zadania.

 

Prosta aplikacja działa na zasadzie utworzenia klienta MQTT, który komunikuje się z brokerem za pomocą portu 8883 — port zarezerwowany domyślnie dla komunikacji zabezpieczonej protokołem SSL/TLS.

 

Po uruchomieniu klient subskrybuje temat „Test1”, a następnie uruchamia dodatkowy wątek, umożliwiający wysyłanie wiadomości z poziomu środowiska IDE, w którym stworzono aplikację.

 

Kod źródłowy aplikacji
Kod źródłowy aplikacji

 

Trzeci klient został uruchomiony na sterowniku PLC. W celach testowych wykorzystano sterownik zasymulowany za pomocą oprogramowania S7-PLCSIM Advanced V6.0 Upd1. Do zaprogramowania sterownika wykorzystano środowisko TIA Portal w wersji 19.

 

Do połączenia z brokerem MQTT zastosowano funkcję LMQTT_Client, przygotowaną przez firmę Siemens i udostępnioną za pośrednictwem biblioteki Libraries_Comm_Controller. Funkcja ta umożliwia implementację klienta MQTT bezpośrednio na sterowniku PLC, co pozwala na integrację przemysłowych systemów automatyki z protokołem MQTT.

 

Wywołanie funkcji LMQTT_Client
Wywołanie funkcji LMQTT_Client

 

Aby nawiązać komunikację MQTT poprzez port 8883, konieczne było dodanie certyfikatów do projektu w środowisku TIA Portal. Cały proces odbywa się z poziomu zakładki Security settings.

 

Pierwszym krokiem jest zabezpieczenie projektu — należy ustawić wymóg logowania do projektu przy użyciu nazwy użytkownika oraz hasła spełniającego standardy bezpieczeństwa określone przez firmę Siemens. Dopiero po aktywowaniu tych zabezpieczeń możliwe jest przejście do zakładki Certificate Manager, gdzie dodaje się odpowiednie certyfikaty.

 

Zakładka certificate manager
Zakładka certificate manager

 

Następnie należy przejść do zakładki Trusted certificates and root certification authorities, gdzie można zaimportować certyfikaty oraz klucze niezbędne do nawiązania połączenia z brokerem. Import odpowiednich certyfikatów umożliwia weryfikację tożsamości brokera oraz zapewnia bezpieczną wymianę danych w ramach komunikacji MQTT przy użyciu SSL/TLS.

 

Zaimportowane certyfikaty do TIA Portal
Zaimportowane certyfikaty do TIA Portal

 

Następnie, w ustawieniach sterownika PLC, należy wskazać, z którego certyfikatu ma korzystać urządzenie. W tym celu w odpowiedniej sekcji konfiguracji wybiera się wcześniej zaimportowany certyfikat, który będzie wykorzystywany do uwierzytelniania i zapewnienia bezpiecznej komunikacji z brokerem MQTT. Wskazanie właściwego certyfikatu jest kluczowe dla prawidłowego ustanowienia połączenia szyfrowanego oraz spełnienia wymagań polityki bezpieczeństwa projektu.

 

Określenie certyfikatów
Określenie certyfikatów

 

Na koniec należy poprawnie skonfigurować ustawienia połączenia w odpowiednim bloku sterownika. Po tej konfiguracji komunikacja z brokerem MQTT może zostać zainicjowana.

 

Parameteryzacja bloku LMQTT
Parameteryzacja bloku LMQTT

 

Po poprawnym skonfigutrowaniu połączenia i wpisaniu odpowiedniego użytkwnika i hasła komunikacja z system zostanie nawiązania i wiadomości zostaną przetwarzane.

 

Komunikacja szyfrowana za pomocą MQTT
Komunikacja szyfrowana za pomocą MQTT

 

Jak można zauważyć, wiadomości przesyłane za pomocą komunikacji szyfrowanej nie mogą zostać odczytane bez zastosowania odpowiednich certyfikatów uwierzytelniających.

 

Podsumowanie

 

MQTT wyróżnia się na tle tradycyjnej komunikacji TCP/IP przede wszystkim prostotą implementacji oraz elastycznością w kwestii bezpieczeństwa. Standardowe połączenia TCP/IP domyślnie nie oferują szyfrowania, przez co przesyłane dane mogą być podatne na podsłuch i ingerencję osób niepowołanych. W praktyce oznacza to, że wdrożenie dodatkowych zabezpieczeń w tradycyjnych rozwiązaniach sieciowych bywa skomplikowane i czasochłonne.

 

W przypadku MQTT sytuacja wygląda zupełnie inaczej – protokół ten został zaprojektowany tak, aby maksymalnie uprościć zarówno konfigurację, jak i rozbudowę systemu komunikacji. Dzięki natywnemu wsparciu dla szyfrowania (np. poprzez TLS), bardzo łatwo można podnieść poziom bezpieczeństwa transmisji, bez potrzeby przeprowadzania złożonych modyfikacji architektury. Dodanie szyfrowania w MQTT ogranicza się najczęściej do kilku prostych ustawień po stronie brokera i klienta.

 

To właśnie ta łatwość wdrożenia, elastyczność oraz dostępność mechanizmów bezpieczeństwa sprawiają, że MQTT jest idealnym wyborem dla projektów wymagających szybkiego uruchomienia, a jednocześnie gotowych do łatwej adaptacji w miarę wzrostu wymagań dotyczących ochrony danych.

Przejdź do treści