Skip to content
Encyklopedia protokołów | | 5 min czytania

MQTT - protokół IoT i bezpieczeństwo komunikacji publish/subscribe

MQTT (Message Queuing Telemetry Transport) - model pub/sub, porty 1883 i 8883, bezpieczeństwo brokera, segmentacja sieci IoT/IIoT. Encyklopedia protokołów OT.

MQTTport 1883IoTIIoT
MQTT - protokół IoT i bezpieczeństwo komunikacji publish/subscribe

MQTT (Message Queuing Telemetry Transport) to lekki protokół komunikacyjny oparty na modelu publish/subscribe, zaprojektowany w 1999 roku przez Andy’ego Stanford-Clarka (IBM) i Arlena Nippera (Cirrus Link) do transmisji telemetrii z rurociągów naftowych przez łącza satelitarne o ograniczonej przepustowości. Dziś MQTT jest dominującym protokołem w ekosystemie IoT i IIoT - od czujników środowiskowych i inteligentnych liczników, przez systemy monitoringu SCADA, po platformy chmurowe AWS IoT Core, Azure IoT Hub i Google Cloud IoT.

Standard MQTT jest utrzymywany przez OASIS i aktualnie obowiązuje wersja 5.0 (2019), choć wersja 3.1.1 (2014) pozostaje najszerzej stosowana w urządzeniach embedded.

Architektura publish/subscribe

W przeciwieństwie do protokołów request/response (HTTP, Modbus TCP), MQTT opiera się na pośredniku - brokerze - który zarządza dystrybucją wiadomości między nadawcami (publishers) i odbiorcami (subscribers). Klienci nie komunikują się bezpośrednio - publikują wiadomości w tematach (topics), a broker doręcza je wszystkim subskrybentom danego tematu.

ParametrMQTT (nieszyfrowany)MQTT over TLS
TransportTCPTCP + TLS 1.2/1.3
Port18838883
UwierzytelnianieOpcjonalne (username/password)Certyfikaty X.509 + username/password
SzyfrowanieBrakAES-256-GCM (TLS)
QoS0 (at most once), 1 (at least once), 2 (exactly once)Jak obok
Overhead nagłówka2 bajty minimum+ narzut TLS

Model publish/subscribe ma istotne konsekwencje dla bezpieczeństwa. Broker jest centralnym punktem - kto kontroluje brokera, kontroluje całą komunikację. Subskrypcja na temat wildcard (#) pozwala nasłuchiwać wszystkich wiadomości przechodzących przez brokera.

Zastosowania w OT i IoT

MQTT znalazł szerokie zastosowanie w:

  • IIoT i telemetria - przesyłanie danych z czujników do platform SCADA i historyków (np. Sparkplug B - specyfikacja MQTT dla przemysłu)
  • Inteligentne budynki - integracja urządzeń IoT z systemami BMS
  • Energetyka - komunikacja z inteligentnymi licznikami (AMI) i falownikami PV
  • Edge computing - agregacja danych na bramkach IoT przed przesłaniem do chmury

W kontekście przemysłowym szczególne znaczenie ma Sparkplug B - specyfikacja definiująca strukturę tematów i payloadów MQTT dla systemów SCADA/IIoT, z obsługą birth/death certificates (informowanie o dostępności urządzeń) i typami danych kompatybilnymi z systemami automatyki.

TIP

Nigdy nie uruchamiaj brokera MQTT na porcie 1883 w środowisku produkcyjnym. Port 1883 oznacza komunikację jawną - bez szyfrowania i bez wymuszenia uwierzytelniania. Każdy broker produkcyjny powinien nasłuchiwać wyłącznie na porcie 8883 (TLS) z wzajemnym uwierzytelnianiem certyfikatami (mTLS).

Ocena bezpieczeństwa

MQTT sam w sobie jest protokołem transportowym - nie narzuca polityk bezpieczeństwa, a jedynie udostępnia mechanizmy, które trzeba świadomie włączyć i skonfigurować.

Typowe podatności instalacji MQTT:

  • Broker bez uwierzytelniania - domyślna konfiguracja wielu brokerów (np. Mosquitto) nie wymaga loginu. Skanery Shodan identyfikują tysiące otwartych brokerów MQTT w internecie
  • Brak autoryzacji na poziomie tematów - nawet z uwierzytelnianiem, klient po zalogowaniu często może subskrybować dowolny temat (w tym #), uzyskując dostęp do całej telemetrii
  • Komunikacja jawna na porcie 1883 - hasła przesyłane w plaintext, dane telemetryczne (wartości pomiarowe, stany urządzeń) widoczne dla każdego w segmencie sieciowym
  • Retained messages i Last Will - wiadomości retained pozostają na brokerze i są dostarczane nowym subskrybentom, co może ujawnić stan systemu atakującemu
  • Brak walidacji payloadu - broker nie weryfikuje zawartości wiadomości, co umożliwia wstrzykiwanie fałszywych danych telemetrycznych

MQTT v5.0 wprowadza mechanizm Enhanced Authentication (rozszerzalne uwierzytelnianie, np. SCRAM), ale jego adopcja w urządzeniach embedded jest wciąż ograniczona.

Segmentacja i ochrona

Bezpieczeństwo instalacji MQTT wymaga działań na trzech poziomach: konfiguracja brokera, segmentacja sieciowa i monitoring.

Konfiguracja brokera:

  1. Wymuś TLS 1.2+ na wszystkich listenerach - wyłącz listener na porcie 1883
  2. Wdróż mTLS - wzajemne uwierzytelnianie certyfikatami X.509 dla urządzeń IoT
  3. ACL na poziomie tematów - każde urządzenie powinno mieć dostęp wyłącznie do swoich tematów (np. site/floor1/sensor42/+)
  4. Ogranicz wildcard subscriptions - zablokuj subskrypcje # i + dla klientów IoT

Segmentacja sieciowa:

  1. Broker w dedykowanej strefie DMZ - oddzielony firewallem zarówno od sieci IoT/OT, jak i od sieci IT/chmury
  2. Osobne brokery dla różnych poziomów krytyczności - broker dla telemetrii środowiskowej nie powinien obsługiwać komunikacji ze sterownikami PLC
  3. Mostkowanie (bridging) zamiast jednego globalnego brokera - brokery lokalne na edge, z kontrolowanym forwardingiem do brokera centralnego

Szczegółowe podejście do projektowania stref i korytarzy w sieciach OT i IoT opisujemy w artykule o segmentacji sieci OT.

TIP

Przy audycie instalacji MQTT zacznij od prostego testu: połącz się z brokerem bez poświadczeń i zasubskrybuj temat #. Jeśli otrzymasz jakiekolwiek wiadomości - masz potwierdzenie krytycznej podatności.

Narzędzia open source

NarzędzieJęzykOpisLink
mosquittoCBroker MQTT + narzędzia CLI do publikowania i subskrypcji (mosquitto_pub, mosquitto_sub)GitHub
MQTT ExplorerDesktop GUIGraficzny klient do przeglądania tematów, podglądu wiadomości i struktury brokeraGitHub
paho-mqttPythonBiblioteka kliencka MQTT - publikowanie, subskrypcja, obsługa QoS i TLSGitHub

TIP

Test otwartego brokera: mosquitto_sub -h broker_ip -t '#' -v subskrybuje WSZYSTKIE tematy - jeśli pojawiają się wiadomości, broker nie wymaga uwierzytelniania.

Źródła

Omówimy zakres, metodykę i harmonogram.