Naprava stoji za domačim usmerjevalnikom brez posredovanja vrat in brez javnega naslova, pa mora vseeno prejeti konfiguracijo v nekaj sekundah. Trik ni luknja v požarnem zidu. To je povezava, ki jo naprava odpre navzven proti brokerju, ki ga lahko doseže, ta pa nato pošlje sporočila nazaj po isti vzpostavljeni poti. Vsaka lastnost, ki je ljudem všeč pri tej zasnovi, in vsaka past v njej izhaja iz te obrnitve.

Kaj v resnici preide skozi NAT

Ko naprava odpre TCP povezavo do brokerja, domači usmerjevalnik ustvari preslikavo in jo ohranja živo ves čas toka. Odgovori na tem toku se vrnejo napravi, ker preslikava že obstaja. Broker nikoli ne sproži ničesar proti hiši, zato ni nezahtevanega dohodnega paketa, ki bi ga usmerjevalnik moral zavrniti. To je celoten omrežni argument in zato ta pristop deluje v omrežjih, ki jih ne nadzorujete.

Naprava mora povezavo ohranjati živo ali jo znova vzpostaviti, kar postane vprašanje zanesljivosti, ko je arhitektura določena.

Broker usmerja teme, ne posreduje HTTP

MQTT določa izmenjave objavljanja in naročanja: naprava se naroči na filter tem, ki ga sme brati, pooblaščeni krmilnik pa objavi v ustrezno temo. Broker ujame objave z naročninami in dostavi kopije. Ne ve, kaj je zahteva brskalnika, in ne bo posredoval HTTP GET na spletni strežnik naprave. Če obstoječa strojna programska oprema govori samo HTTP, zasnova z brokerjem potrebuje spremembo aplikacije ali namerno prevajalno komponento.

Tudi imena tem niso avtorizacija. Večina brokerjev podpira sezname za nadzor dostopa za vsakega odjemalca, naprave pa bi morale biti omejene na svoja lastna drevesa objavljanja in naročanja, namesto da si delijo en sam globalni imenski prostor.

Viri naprave določajo obliko TLS

ESP8266 ima omejen RAM, rokovanje TLS pa je najdražja stvar, ki jo počne. Jedro Arduino dobavlja BearSSL prav zaradi te omejitve, izbira med preverjanjem CA in pripenjanjem prstnega odtisa pa spremeni tako pomnilniški odtis kot to, kaj lahko naredi napadalec z veljavnim potrdilom za drugo ime. Preverjanje CA brokerja je močnejša možnost, ko kup dovoli. Pomembna je tudi velikost koristnega tovora: odjemalec MQTT drži medpomnilnik, sporočila, večja od njega, pa se tiho odrežejo, razen če se medpomnilnik namerno poveča.

Keepalive in časovne omejitve vtičnice so del istega proračuna, ker odjemalec, ki nikoli ne opazi mrtve povezave, preneha prejemati ukaze, ne da bi sporočil napako.

Semantika sporočil, ki ugrizne

Zadržano sporočilo broker shrani in ga dostavi poznejšim ustreznim naročnikom, kar je odlično za trenutno stanje in nevarno za enkratne ukaze: naprava, ki se znova poveže, lahko prejme včerajšnji ukaz, kot da je nov. QoS 1 zagotavlja dostavo vsaj enkrat, zato so dvojniki običajni in aplikacija mora biti varna pred ponavljanjem, idealno z identifikatorjem ali časovnim žigom, ki ga lahko zavrne. Zadnja volja vam da signal stanja, ko naprava pade, a le če povezava res ne uspe, namesto da visi.

Vedenje čiste seje odloča, ali broker obdrži vaše naročnine, medtem ko vas ni, in napaka pri tem je razlog, da nekatere naprave zgrešijo prvo sporočilo po vsaki ponovni povezavi.

TLS ščiti odsek do brokerja. To ni celovito šifriranje koristnega tovora proti operaterju brokerja, ki lahko prebere vse, kar objavite prek njega.

Omejite življenjski cikel in ga preizkusite z neškodljivimi podatki

Načrtujte ponovno povezavo z umikanjem, ne s tesno zanko ponovnih poskusov, izrecno se znova naročite, če seja ni trajna, in beležite izid povezave, da tiha povezava brez povezave pusti dokaz. Preizkusite pot ponovne povezave z vzorčnimi koristnimi tovori, ki ne storijo ničesar, ker prvi proizvodni preizkus ukaznega kanala ne sme biti resničen ukaz. Nato potrdite, kaj naredi zastarelo zadržano sporočilo pri ponovni povezavi, in se odločite, ali je takšno vedenje sprejemljivo za vsako temo.

Tako narejena zasnova odstrani eno dohodno omrežno zahtevo in pusti programsko opremo naprave, politiko brokerja in semantiko sporočil kot vidno delo namesto skritih predpostavk.

Sorodni članki