MQTT – Sparkplug

Yleistä

MQTT -protokollan historia ja yleiskatsaus löytyvät Wikipediasta.

MQTT Sparkplug esittely löytyy HiveMQ-sivuilta ja täsmälliset Sparkplug-määrittelyt dokumentista Sparkplug 3.0 standardi

MQTT-standardi määrittelee hyvin yksinkertaisen ja kevyen protokollan, jossa tiedon julkaisijat ja tilaajat pysyvät hyvin joustavasti lähettämään ja vastaanottamaan tietoa. Vapaus aiheiden määrittelyssä ja lähetettävän viestin sisällön rakenteessa ovat MQTT-protokollan merkittävimmät puutteet.

Sparkplug poistaa MQTT-protokollan liiallisen vapauden aiheuttamat haitat määrittämällä mm. viestien aiherakenteen ja viestien hyötykuorman rakenteen. Sparkplug on yhteysprotokolla, joka hyödyntää MQTT-protokollaa viestien välittämiseen, eikä vaadi mitään muutoksia MQTT-välityspalvelimiin.

MQTT Sparkplug -aiherakenne

MQTT Sparkplug -hyötykuorma

MQTT Sparkplug -viestit säätösalaojituksen ohjauksessa

Edellisessä luvussa oli MQTT-Sparkplug viestien aiherakenne, joka määrittää myös säätösalaojituksen viestien aiherakenteen. Opinnäytetyön Ohjelmistokeskeinen automaatio peltojen vesitalouden hallinnassa liitteessä 1 Pellon vesitalouden hallinnan Sparkplug-nimiavaruuden yleiskuvaus on malli säätösalaojakaivon osoitteesta, joka kohdistuu säätökaivuun B3:

spBv1.0/1234567890/DCMD/SP1/B3

Säätösalaojakaivo B3 (laitetunnus) on viestin kohde ja SP1 (reunasolmu) on MQTT-Sparkplug viestin vastaanottaja, joka ohjaa viestin säätökaivolle B3.

Viestityyppi (message id) kentässä on viestityyppinä <komento> (DCDM), joka tarkoittaa B3 säätökaivolle kohdistuvaa ohjausviestiä. Viestin sisällössä, jota käsitellään seuraavassa luvussa, on ohjaustoimenpiteen tiedot.

Ryhmätunnus (group_id) kentässä voidaan käytetään esimerkiksi tunnusta, joka mahdollistaa MQTT-välityspalvelimella viestiliikenteen rajaamien maatilakohtaiseksi. Tästä tarkemmin MQTT-ACL -sivulla

MQTT Sparkplug -viestin sisältö

Sparkplug -viestien sisällössä käytetään Googlen protokollapuskureita tietojen koodaamiseen. Viestien sisältö riippuu viestin tyypistä ja kussakin viestityypissä on pakolliset kentät, jotka on kuvattu spesifikaatiossa. Esimerkiksi DCMD (laitekomento) käskyllä säätökaivon luukun avaus:

{
”timestamp”: 1729254055,
”metrics”: [{
”name”: ”Säätökaivon luukku auki”,
”timestamp”: 1729254055,
”dataType”: ”Boolean”,
”value”: true
}]
}

Viestin välitys palomuurin taakse?

TCP/IP -tietoliikenneprotokollan mukaisen datapaketin tietoturvallinen välittäminen palomuurin taakse on haastavaa mikäli yhteys muodostetaan julkisen Internetin puolelta. Toisaalta jokainen verkkosivuilta tieto hakenut on saanut palomuurin taakse datapaketteja ilman erityisiä palomuurin asetuksia.

Säätösalaojituksen automaation ohjauksessa toimilaite tarvitsee julkisen IP-osoitteen ja tarvittavat asetukset palomuuriin, mikäli automaatiolaitteeseen avataan yhteys Internetistä päin. Mutta verkkoon päin viestin voi lähettää ilman julkista IP-osoitetta ja paluuviestissä voidaan välittää ohjaustietoa.
MQTT-Sparkplug -ohjauksessa salaojasäätökaivo tilaa palvelimelta itselleen osoitetut viestit, joten yhteys avataan palomuurin takaa päin, ei verkosta päin.

MQTT-protokollan kyberhyökkäys rajapinta on pieni, koska MQTT-viestien tilaaja saa vain yhdeltä palvelimelta tietoa. Vastaava tilanne olisi verkkosivuja selattaessa, että otettaisiin yhteys vain yhden palvelimeen sivuihin. Mutta entä jos juuri se kyseinen palvelin on joutunut haittaohjelmien kohteeksi.

Miten voi suojautua ulkopuolisen haittaviesteiltä, jotka tulevat MQTT-välittäjän kautta?

Avoin MQTT-välittäjä julkisessa netissä on kaikkien saavutettavissa. MQTT-Sparkplug viestien aiherakenne on helposti selvitettävissä. Riittää kun tilaa kaikki Sparkplug viestit MQTT-välittäjällä käyttämällä tilauksessa aihetta spBv1.0/#. Kyseinen tilaus palauttaa tilaajalle kaikki MQTT-välityspalvelimen kautta kulkevat viestit, jotka alkavat merkeillä ”spBv1.0/”. Saatujen MQTT-viestien sisältöä muutamalla voidaan lähettää (julkaista) haittaviestejä, jotka voivat tehdä esimerkiksi haitallisia säätötoimenpiteitä.

Pääsääntöisesti MQTT-välityspalvelimet vaativat tunnuksen ja salasanan viestien tilaamiseen ja lähettämiseen. Netistä löytyy kuitenkin useita suojaamattomia MQTT-välityspalvelimia, joiden kautta voi lähettää testiviestejä. Suojaamattomassa MQTT-välityspalvelimessa tunnus/salasana-parit lähetetään salaamattomana, tai palvelun käyttäjille kerrotaan julkinen tunnus salasana esimerkiksi ”admin/admin”. Näiden MQTT-välittäjien käyttäminen muuhun kuin testeihin ei ole järkevää.

On kuitenkin oleellista muistaa, että suojaamatointa MQTT-välityspalvelinta voi käyttää vain niiden automaatiolaitteiden haitalliseen ohjaamiseen, jotka ovat kytkeytyneet kyseessä olevalle MQTT -välityspalvelimelle. Toisin sanoen suojaamattomat MQTT-välityspalvelimet eivät muodosta riskiä suojattujen MQTT-palvelimien käyttämiselle.

Mutta onko tunnus/salasana suojaus riittävä? MQTT-välityspalvelimille on saattanut jäädä testitunnuksia tai jollain käyttäjällä on ns. helposti arvattava tunnus/salasana yhdistelmä. Yksikin tunnus, joka avaa pääsyn palvelimelle mahdollistaa kaikkien viestien salakuuntelun ja haittaviestien lähettämisen, ellei muita suojauskeinoja, tunnistautumisen lisäksi, ole käytetty.

Paras tietoturva saavutetaan luopumalla tunnus/salasana tunnistautumisesta, jolloin salasanan paljastuminen ei ole mahdollista. Tunnistautumisessa voidaan käyttää sertifikaattia ja kun viestien välitys rajataan MQTT-välityspalvelimen ACL-pääsynhallintaluettelolla saadaan muodostettua luottamuksellinen yhteys säätösalaojan automaatiojärjestelmään. Lisätietoa MQTT-välityspalvelimen ACL (Access Control Lists) pääsynhallintaluettelosta sivulta: Mikä on ACL

Galileo Oy tarjoaa MQTT-ACL-välityspalvelua salatuilla tietoliikenneyhteydellä ja sertifikaatti-tunnistautumisella osoitteessa: https://mqtts.galileo.fi. Lisätietoa sertifikaatin käyttämisestä ja ACL-pääsynhallintaluettelosta säätösalaojituksen ohjaustekniikassa sivulla Sertifikaatin asennus