O Eclipse Mosquitto
Eclipse Mosquitto je open-source MQTT broker s podporou MQTT protokolu 5.0, 3.1.1 a 3.1. Podporuje autentifikáciu, certifikáty a je malý a jednoducho konfigurovateľný. Je použiteľný aj na vytvorenie redundantného riešenia s nasledovnou konfiguráciou:
- Sú dva redundantné aplikačné servery (fyzické alebo virtualizované) - Windows alebo Linux.
- Na oboch serveroch sú spustené D2000 Servery ako redundantná aplikácia (Master/Standby).
- Na oboch serveroch sú spustené MQTT brokery Eclipse Mosquitto, nakonfigurované v režime TLS s certifikátom podpísaným certifikačnou autoritou. Sú spustené bez konfigurácie výmeny správ medzi sebou, t.j. každý z nich je úplne nezávislý.
- D2000 Kom proces má nakonfigurovanú linku TCP/IP-TCP Redundant, s nakonfigurovaným overovaním certifikátu MQTT brokera a s nakonfigurovanými certifikátmi. D2000 KOM je teda pripojený k obidvom MQTT brokerom súčasne.
- Ostatní MQTT klienti (PLC a iné zariadenia) sú pripojení aspoň k jednému z MQTT brokerov (t.j. umožňujú nakonfigurovať 2 IP adresy MQTT brokerov, voči ktorým sa snažia striedavo nadviazať spojenie).
- Na overovanie totožnosti všetkých klientov sa používajú TLS certifikáty podpísaným certifikačnou autoritou.
Tento dokument uvádza príklad základnej konfigurácie MQTT brokera Eclipse Mosquitto.
Konfiguračný súbor mosquitto.conf
Príklad pre konfiguráciu na Linux Ubuntu (samotný konfiguračný súbor broker.conf sa nachádza v /etc/mosquitto/conf.d):
broker.conf
#MQTTS listener on port 8883
listener 8883
#broker certificate
certfile /etc/mosquitto/certs/broker.crt
#broker private key
keyfile /etc/mosquitto/certs/broker.key
#require valid certificates of clients
require_certificate true
#file with certificate authority's public key(s)
cafile /etc/mosquitto/ca_certificates/caMQTT.crt
#use CN (Common Name) of client certificate as username (and ignore MQTT username+password)
use_identity_as_username true
#password file is not used for username/password verification (due to use_identity_as_username true)
#password_file pwfile
#acl file with defined access rights
acl_file /etc/mosquitto/myacl.conf
Príklad pre konfiguráciu na Windows:
mosquitto.conf
#MQTTS listener on port 8883
listener 8883
#broker certificate
certfile c:\Program Files (x86)\mosquitto\broker.crt
#broker private key
keyfile c:\Program Files (x86)\mosquitto\broker.key
#require valid certificates of clients
require_certificate true
#file with certificate authority's public key(s)
cafile c:\Program Files (x86)\mosquitto\caMQTT.crt
#use CN (Common Name) of client certificate as username (and ignore MQTT username+password)
use_identity_as_username true
#password file is not used for username/password verification (due to use_identity_as_username true)
#password_file pwfile
#acl file with defined access rights
acl_file c:\Program Files (x86)\mosquitto\myacl.conf
Poznámka: Je možné overovať MQTT klientov aj na základe mena a hesla. V tom prípade musí byť vypnuté použitie identity a zadefinovaný súbor s heslami:
use_identity_as_username false
password_file c:\Program Files (x86)\mosquitto\pwfile
V súbore pwfile je nutné zadefinovať mená a heslá užívateľov pomocou utility mosquitto_passwd. Pri prvom použití je nutné použiť prepínač -c na vytvorenie súboru, pri ďalších to už nie je potrebné. Parameter -b aktivuje dávkový režim, ktorý umožňuje zadávanie hesiel z príkazového riadku:
mosquitto_passwd.exe -b -c pwfile myuser1 mypassword1
mosquitto_passwd.exe -b pwfile myuser2 mypassword2
Upozornenie: Ak sa overujú MQTT klienti na základe mena a hesla a zároveň sú vyžadované certifikáty, nikde nie je definovaná väzba medzi užívateľom a certifikátom. Takže ak by niekto získal certifikát (a súkromný kľúč) iného užívateľa, mohol by ho použiť na pripojenie k MQTT brokeru.
Konfiguračný súbor myacl.conf
Konfiguračný súbor obsahuje pravidlá pre MQTT klientov, ktoré definujú, aké MQTT topicy môžu čítať (subscribe) a zapisovať.
Príklad pre jednoduchých MQTT klientov:
- MQTT klient s certifikátom obsahujúcim Common Name=myPLC, zverejňujúci dáta s topicom PLC1/out a prijímajúci príkazy s topicom PLC1/cmd
- MQTT klient s certifikátom obsahujúcim Common Name=myD2000, čítajúci dáta s topicom PLC1/out a posielajúci príkazy s topicom PLC1/cmd
myacl.conf
#user without username: anonymous is forbidden, but just to make sure: deny everything
topic deny
#MQTT client myPLC: writes to PLC1/out, subscribes to PLC1/cmd
user myPLC
topic write PLC1/out
topic read PLC1/cmd
#MQTT client myD2000: reads from PLC1/out, writes to PLC1/cmd
user myD2000
topic read PLC1/out
topic write PLC1/cmd
Príklad pre MQTT Sparkplug klientov:
MQTT Host Application s certifikátom Common Name=myHost, so Sparkplug Host ID=D2000komHA
MQTT Edge Node s certifikátom Common Name=myEdge, s group_id=myGroup, s edge_node_id=myEdgeNode
myacl.conf
#user without username: anonymous is forbidden, but just to make sure: deny everything
topic deny
#MQTT Edge Node: writes to DATA/BIRTH/DEATH for myGroup/myEdgeNode (and its subdevices), subscribes NCMD/DCMD and queries the state of Host Application
user myEdge
topic write spBv1.0/myGroup/NDATA/myEdgeNode/#
topic write spBv1.0/myGroup/DDATA/myEdgeNode/#
topic write spBv1.0/myGroup/NBIRTH/myEdgeNode/#
topic write spBv1.0/myGroup/DBIRTH/myEdgeNode/#
topic write spBv1.0/myGroup/NDEATH/myEdgeNode/#
topic write spBv1.0/myGroup/DDEATH/myEdgeNode/#
topic read spBv1.0/myGroup/NCMD/myEdgeNode/#
topic read spBv1.0/myGroup/DCMD/myEdgeNode/#
topic read spBv1.0/STATE/D2000komHA
#MQTT Host Application: reads/writes its STATE, reads everything (this might be more precisely specified based on topics above), writes commands for myEdgeNode (and its subdevices)
user myHost
topic readwrite spBv1.0/STATE/D2000komHA
topic read spBv1.0/#
topic write spBv1.0/myGroup/NCMD/myEdgeNode
topic write spBv1.0/myGroup/DCMD/myEdgeNode/#
Generovanie a podpisovanie TLS certifikátov
Na generovanie kľúčov a TLS certifikátov a ich podpisovanie je nutné mať nainštalovaný OpenSSL balík. Na platforme Windows je možné použiť napr. Win32/Win64 OpenSSL Installation Project (na inštalovaný do c:\Program Files\OpenSSL-Win64\bin).
Nasledovný postup popisuje vytvorenie kľúčov a TLS certifikátov pre MQTT brokera, MQTT klienta myPLC (PLC alebo iné zariadenie) a MQTT klienta myD2000 (D2000 KOM proces).
1.1 Vytvorenie certifikačnej autority
Tento krok je možné preskočiť, ak už máte existujúcu certifikačnú autoritu, prípadne vaše certifikáty podpisuje niekto iný. Parametrom -days sa určuje doba platnosti certifikátu. Parameter -keyout definuje názov súboru so súkromným kľúčom (ktorý je nutné chrániť pred odcudzením) a parameter -out definuje názov certifikátu (ktorý je potrebné zverejniť).
openssl req -new -x509 -days 1000 -extensions v3_ca -keyout caMQTT.key -out caMQTT.crt
Pri vytváraní kľúča je nutné zadať heslo, ktoré je jeho ochranou.
1.2 Nakopírovanie certifikátu certifikačnej autority
Certifikát certifikačnej autority (caMQTT.crt) je nutné nakopírovať tak, aby k nemu mal prístup D2000 KOM (najjednoduchšie do aplikačného adresára) a nastaviť cestu k nemu ako parameter "Certifikát partnera" (#APPDIR#\caMQTT.crt) v konfigurácii linky TCP/IP-TCP Redundant.
Certifikát certifikačnej autority (caMQTT.crt) je nutné nakopírovať na MQTT broker, aby pomocou neho MQTT broker vedel overovať platnosť certifikátov MQTT klientov (adresár /etc/mosquitto/ca_certificates).
Poznámka: V prípade redundantných MQTT brokerov a redundantných D2000 aplikačných serverov (a ďalších MQTT klientov) je nutné nakopírovať certifikát certifikačnej autority na všetky príslušné servery!
2.1 Vytvorenie kľúča a požiadavky na podpísanie certifikátu pre MQTT brokera
Tento krok treba zopakovať pre každý z MQTT brokerov.
Vytvorenie kľúča (s veľkosťou 2048 bitov):
openssl genrsa -out broker.key 2048
Vytvorenie požiadavky na podpísanie (csr - certificate signing request). Je nutné zadať viacero parametrov, hodnoty udávané v príklade je nutné upraviť. Odporúčané je, aby CN (Common Name) zodpovedalo názvu počítača s MQTT brokerom.
openssl req -out broker.csr -key broker.key -new
Country Name (2 letter code) [AU]:SK
State or Province Name (full name) [Some-State]:Slovakia
Locality Name (eg, city) []:Žilina
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Ipesoft
Organizational Unit Name (eg, section) []:D2000
Common Name (e.g. server FQDN or YOUR name) []:myserver
Email Address []:ipesoft@ipesoft.sk
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
2.2 Vytvorenie certifikátu pre MQTT brokera
Tento krok treba zopakovať pre každý z MQTT brokerov.
Ak ste vyššie vytvorili certifikačnú autoritu, vytvárate certifikát (podpisujete certificate signing request). V opačnom prípade pošlete súbor broker.csr na podpis príslušnej certifikačnej autorita (napr. IT oddelenie firmy).
Parameter -days udáva dobu platnosti certifikátu v dňoch.
openssl x509 -req -in broker.csr -CA caMQTT.crt -CAkey caMQTT.key -CAcreateserial -out broker.crt -days 1000
Súbor broker.crt (certifikát MQTT brokera) je spolu so súborom broker.key (súkromný kľúč MQTT brokera) potrebné nakopírovať na MQTT brokera (adresár /etc/mosquitto/certs). Súbor broker.key je navyše odporúčané chrániť (prístupovými právami, kryptovaním) tak, aby k nemu mal prístup iba užívateľ, pod ktorým beží MQTT broker.
3.1 Vytvorenie kľúča a požiadavky na podpísanie certifikátu pre MQTT klienta
Podobne ako pre MQTT brokera, aj pre MQTT klienta je nutné vytvoriť kľúč a požiadavku na podpísanie certifikátu. Postup je ten istý, líšia sa iba názvy súborov.
Vytvorenie kľúča (s veľkosťou 2048 bitov):
openssl genrsa -out myPLC.key 2048
Vytvorenie požiadavky na podpísanie (csr - certificate signing request). Je nutné zadať viacero parametrov, hodnoty udávané v príklade je nutné upraviť. Nutné je zadať také CN (Common Name), ktoré zodpovedá názvu MQTT užívateľa:
openssl req -out myPLC.csr -key myPLC.key -new
Country Name (2 letter code) [AU]:SK
State or Province Name (full name) [Some-State]:Slovakia
Locality Name (eg, city) []:Žilina
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Ipesoft
Organizational Unit Name (eg, section) []:D2000
Common Name (e.g. server FQDN or YOUR name) []:myPLC
Email Address []:ipesoft@ipesoft.sk
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
3.2 Vytvorenie certifikátu pre MQTT klienta
Ak ste vyššie vytvorili certifikačnú autoritu, vytvárate certifikát (podpisujete certificate signing request). V opačnom prípade pošlete súbor myPLC.csr na podpis príslušnej certifikačnej autorita (napr. IT oddelenie firmy).
Parameter -days udáva dobu platnosti certifikátu v dňoch.
openssl x509 -req -in myPLC.csr -CA caMQTT.crt -CAkey caMQTT.key -CAcreateserial -out myPLC.crt -days 1000
Súbor myPLC.crt (certifikát MQTT klienta) je spolu so súborom myPLC.key (súkromný kľúč MQTT klienta) potrebné nakopírovať na MQTT klienta. Súbor myPLC.key je navyše odporúčané chrániť (prístupovými právami, kryptovaním) tak, aby k nemu mal prístup iba užívateľ, pod ktorým beží MQTT klient.
4 Zopakovanie postupu pre D2000 MQTT klienta
Rovnako, ako bol vytvorený a podpísaný kľúč pre MQTT klienta myPLC, je nutné vytvoriť a podpísať kľúč pre MQTT klienta myD2000. Jeho verejný certifikát (myD2000.crt) aj súkromný kľúč (myD2000.key) je nutné nakopírovať tak, aby k ním mal prístup D2000 KOM (najjednoduchšie do aplikačného adresára) a nastaviť cestu k ním ako parametre "Môj certifikát" (#APPDIR#\myD2000.crt) a "Môj kľúč" (#APPDIR#\myD2000.key) v konfigurácii linky TCP/IP-TCP Redundant.
Konfigurácia D2000 linky typu TCP/IP-TCP Redundant bude vyzerať takto:
Poznámka: Súkromný kľúč pre D2000 MQTT klienta (myD2000.key) je odporúčané chrániť aj heslom, ktoré je potrebné zadať do poľa "Zdieľaný kľúč". Viac informácií je v popise linky TCP/IP-TCP Redundant.

0 komentárov