Hoe IoT-toepassingen snel en veilig met Google Cloud kunnen worden verbonden

Door Stephen Evanczuk

Bijgedragen door De Noord-Amerikaanse redacteurs van DigiKey

Op bedrijven gerichte clouddiensten, zoals Google Cloud, bieden IoT-ontwikkelaars een breed scala aan mogelijkheden, van schaalbare virtuele machineservices tot kant-en-klare artificial intelligence (AI)-toepassingen. Een fundamentele vereiste voor dergelijke diensten is het gebruik van specifieke beveiligingsmethodes voor het tot stand brengen en onderhouden van een veilige verbinding tussen IoT-apparaten en de cloud. Voor ontwikkelaars kan het implementeren van geschikte beveiligingsmechanismen echter vertragingen met zich meebrengen en ontwerpprojecten met strakke deadlines ingewikkelder maken.

Het PIC-IoT WG-ontwikkelingsbord van Microchip Technology is gebouwd met een speciale beveiligings-IC en biedt een kant-en-klare oplossing voor Google Cloud-connectiviteit. De kit gebruikt een speciale beveiligings-IC en biedt een uitgebreid platform dat is ontworpen om de ontwikkeling van IoT-ontwerpen, die in staat zijn om veilig verbinding te maken met Google Cloud-diensten, te versnellen. Dit artikel beschrijft de belangrijkste vereisten voor veilige connectiviteit en laat zien hoe ontwikkelaars aan deze vereisten kunnen voldoen door de PIC-IoT WG in een typisch IoT-ontwerp te gebruiken.

De complexiteit van beveiliging

De mogelijkheid om verbindingen tussen IoT-apparaten en externe hostservers te beveiligen is essentieel voor de algehele beveiliging van IoT-toepassingen en gerelateerde genetwerkte resources van bedrijven. Deze servers en andere bedrijfssystemen kunnen mogelijkheden en prestaties bieden die eenvoudigweg niet beschikbaar zijn in IoT-apparaten die zijn gebouwd met microcontrollers met beperkte resources en een minimaal geheugen. Voor eenvoudige IoT-apparaten waarvan wordt verwacht dat ze sensorgegevens leveren of op bepaalde tijden actuators bedienen, kunnen alleen de verwerkingsvereisten voor het implementeren van zelfs de meest basale beveiligingsalgoritmen vanwege hun aard al onhaalbaar zijn.

Beveiligingsmethoden zijn gebaseerd op het basisprincipe dat het doorbreken van een beveiligingsbarrière duurder moet zijn dan de zaken die de barrière moet beschermen. Voor algoritmische beveiligingsmethoden betekent dit dat het ontcijferen van een versleuteld bericht of het verbreken van een authenticatieprotocol zoveel berekeningen moet vergen dat het de moeite niet waard is. Het verbreken van algoritmische beveiliging moet op zijn minst een dusdanig niveau van rekenhulpmiddelen en een dusdanige hoeveelheid tijd vereisen dat deze de waarde of actualiteit van de beschermde gegevens of het communicatiekanaal overschrijden. Om deze reden proberen cryptografische algoritmen waardevolle gegevens te begraven onder een reeks complexe, reken-intensieve verwerkingsstappen met een geheime sleutel. Het veelgebruikte AES-algoritme (Advanced Encryption Standard) onderwerpt gegevens bijvoorbeeld aan meerdere verwerkingsrondes, elk bestaande uit een reeks stappen die begint met een geheime sleutel, gevolgd door byte-substituties, verschuivingen en matrixberekeningen (Afbeelding 1).

Schema van cryptografische algoritmen die opzettelijk een reeks complexe manipulaties gebruiken

Afbeelding 1: cryptografische algoritmen zijn bedoeld om ontcijfering ingewikkeld en daadwerkelijk onmogelijk te maken en gebruiken opzettelijk een reeks van complexe manipulaties zoals deze stap in het AES-algoritme, waarbij data worden gecombineerd met bits die zijn afgeleid van een privésleutel. (Bron afbeelding: Wikimedia Commons)

Met symmetrische cryptografische algoritmen zoals AES, gebruiken ontvangers van een versleuteld bericht dezelfde geheime sleutel om de gegevens te ontcijferen. Asymmetrische algoritmen gebruiken daarentegen twee sleutels, een privésleutel en een openbare sleutel, en elimineren zo de risico's die gepaard gaan met het gebruik van een gedeelde sleutel ten koste van grotere rekencomplexiteit. Bij deze benadering wisselen een zender en een ontvanger openbare sleutels uit terwijl ze hun eigen privésleutels geheim houden. De ene partij kan de openbare sleutel van de ander gebruiken om een bericht te versleutelen dat alleen met de privésleutel van de ander kan worden gedecodeerd.

Voor nog meer bescherming steunen geavanceerde algoritmen op asymmetrische cryptografiemethoden met openbare sleutels om veilige uitwisseling mogelijk te maken van een kortstondige gedeelde privésleutel, die slechts voor de duur van een specifieke berichtenuitwisselingssessie wordt gebruikt om gegevens te versleutelen. Gezien het kritieke karakter van deze sleuteluitwisselingen, begraven geavanceerde algoritmen zoals Elliptic Curve Diffie-Hellman (ECDH) de geheimen nog dieper onder complexe berekeningen met elliptische curven. Authenticatieprotocollen zoals Transport Layer Security (TLS) combineren mechanismen zoals de sleuteluitwisseling van Diffie-Hellman met formale identificatiemethoden, met behulp van digitale certificaten met ingebedde openbare sleutel met een verifieerbare digitale handtekening van een certificeringsinstantie (certificate authority - CA) die de authenticiteit van het certificaat bevestigt.

Zoals deze korte beschrijving suggereert, berusten beveiligingsmethoden op lagen van cryptografische algoritmen en protocollen die uiteindelijk afhankelijk zijn van privésleutels. Deze lagen hebben voortdurend aanvallen door hackers te verduren en de gehele beveiligingsstructuur zal snel instorten als de privésleutels kunnen worden ontdekt.

Om deze reden is op hardware gebaseerde veilige opslag van de sleutel een fundamentele vereiste voor de beveiliging van IoT-apparaten. Bovendien maken de rekentechnische complexiteit van deze algoritmen en protocollen speciale cryptografie-engines noodzakelijk, die in staat zijn om complexe berekeningen voor hun rekening te nemen om de microcontrollers met hun beperkte resources te ontlasten.

Op hardware gebaseerde beveiliging

Gespecialiseerde hardware-apparaten voor beveiligingselementen, zoals de ATECC608A CryptoAuthentication IC van Microchip Technology bieden de functies die nodig zijn om geheimen te beschermen en de uitvoering van cryptografische algoritmen te versnellen. De ATECC608A biedt onder andere een on-chip EEPROM voor beveiligde opslag van maximaal 16 sleutels, certificaten en andere gegevens alsmede andere noodzakelijke functies zoals een NIST SP 800-90A/B/C-conforme generator van random getallen.

De ATECC608A is niet alleen een apparaat voor beveiligde opslag, maar kan ook de uitvoering van een aantal algoritmen, waaronder AES voor symmetrische cryptografie en ECDH voor asymmetrische cryptografie versnellen. Het apparaat biedt ook ondersteuning voor services van hoger niveau, zoals secure boot (zie “Een crypto chip gebruiken om secure boot-functie toe te voegen aan IoT-apparaatontwerpen”).

Naast de directe prestatievoordelen die worden behaald door het overnemen van de uitvoering van deze algoritmen, leveren de integratie van de ATECC608A van deze crypto-engines, beveiligde opslag en andere functies indirect een extra beveiligingslaag op: sleutels blijven afgeschermd van onbetrouwbare entiteiten. Deze entiteiten zijn onder meer microcontrollers die niet specifiek voor beveiliging zijn ontworpen, software die op de microcontroller draait en individuen die de software gebruiken. Het vermogen van het apparaat om privésleutels te genereren biedt verdere beveiliging gedurende provisioning in productie- of distributiefaciliteiten.

Het resultaat is een vermindering van het aantal bedreigingsvectoren in vergelijking met conventionele, op software gebaseerde beveiligingsmethoden. Dit ondersteunt het type diepte-verdediging dat de kern van een effectief beveiligingsbeleid vormt.

Deze uitgebreide integratie van functionaliteit in de ATECC608A vereenvoudigt de vereisten voor de hardware-interface. Het apparaat werkt als een gewoon I2C-randapparaat dat zelfs de I2C-bus van een microcontroller kan delen met andere apparaten, bijvoorbeeld digitale sensors zoals de MCP9808 van Microchip Technology (Afbeelding2).

Schema van ATECC608A CryptoAuthentication IC van Microchip Technology

Afbeelding 2: aangezien de ATECC608A CryptoAuthentication IC van Microchip Technology (links) zijn beveiligingsverwerking volledig op chip completeert, kan het een simpele I2C hardware-interface bieden voor gebruik met andere I2C-apparaten zoals de MCP9808 I2C digitale temperatuursensor van Microchip Technology (rechts). (Bron afbeelding: Microchip Technology)

Op softwareniveau resulteert de uitgebreide functionaliteit van de ATECC608A echter in een meer complexe interface. De CryptoAuthLib bibliotheek van Microchip Technology abstraheert deze interface naar een reeks van intuïtieve functieaanroepen die beschikbaar zijn in de CryptoAuthLib-toepassingsprogrammeerinterface (application programming interface - API). Deze bibliotheek is met gerelateerde drivers en middleware gebundeld in de MPLAB X Integrated Development Environment (IDE) van Microchip Technology. Alhoewel de CryptoAuthLib API en drivers de basiselementen vormen voor aangepaste ontwerpen met de ATECC608A, kunnen ontwerpers extra uitdagingen aangaan door de volledige beveiligingsketen die nodig is voor veilige connectiviteit met Google Cloud te implementeren. Het PIC-IoT WG-ontwikkelingsbord van Microchip Technology overwint ook deze hindernis.

Een end-to-end IoT toepassing ontwikkelen

Het PIC-IoT-bord, gebaseerd op de ATECC608A en de goedkope PIC24FJ128GA705 16-bits microcontroller van Microchip Technology, is een draadloos IoT-ontwerp dat de ATWINC1510 Wi-Fi module van Microchip Technology, de TEMT6000X01 omgevingslichtsensor van Vishay Semiconductor en de MCP9808 I2C-temperatuursensor bevat. Daarnaast kunnen ontwikkelaars het hardwarebasisplatform gemakkelijk uitbreiden door toevoeging van sensors en actuators die worden geleverd met de honderden beschikbare MikroElektronika Click-borden. Voor software-ontwikkeling biedt Microchip Technology zijn MPLAB X IDE en bijbehorende snelle prototype-tool MPLAB Code Configurator (MCC).

Het bord en de bijbehorende software bieden een kant-en-klaar platform voor het evalueren van een end-to-end IoT-basistoepassing die van het IoT-sensortoestel naar Google Clouddiensten loopt via veilige verbindingen. De kit implementeert een unieke benadering, ontworpen om authenticatie over en weer mogelijk te maken, zelfs met IoT-apparaten met beperkte resources. In deze benadering kan het IoT-apparaat lichtgewicht TLS-diensten gebruiken om Google-zijde van de verbinding te authenticeren en JavaScript Object Notation (JSON) webtokens (JWT) om zichzelf te authenticeren bij de Google-servers (zie “Een eenvoudigere oplossing voor het veilig verbinden van IoT-apparaten met de cloud”). Samen met apparaatdrivers, bordondersteuningspakketten en middleware-diensten demonstreert Microchip Technology deze benadering als deel van een complete complete IoT-sampletoepassing, beschikbaar voor het PIC-IoT-bord via de MPLAB-ontwikkelingssuite.

Aan de hand van de sampletoepassing kunnen ontwikkelaars ervaring opdoen, niet alleen met cloud-toepassingen, maar ook met IoT-specifieke diensten die door grote providers van clouddiensten worden geleverd om IoT-apparaten met hun cloud te verbinden. IoT-apparaten verschaffen zich bijvoorbeeld toegang tot Google Cloud-resources via Google Cloud IoT Core, die verschillende diensten biedt die nodig zijn om de apparaten te verbinden, de bijbehorende metadata te beheren en nog veel meer (Afbeelding 3).

Schema van Google Cloud dat een speciaal dienstenaanbod aanbiedt, Google Cloud IoT Core

Afbeelding 3: net als andere aanbieders van clouddiensten voor bedrijven, biedt Google Cloud een speciaal dienstenaanbod, Google Cloud IoT Core, ontworpen om de unieke vereisten in samenhang met de integratie van IoT-apparaten met cloud-resources te ondersteunen. (Bron afbeelding: Google)

Clouddiensten gebruiken

Aan het back-end biedt Google Cloud IoT Core apparaten toegang tot hoogwaardige Google Cloud-resources via een data broker die een publicatie/abonnement (pub/sub)-model gebruikt. Aan het front-end biedt IoT Core een brug die IoT-apparaatconnectiviteit ondersteunt met behulp van Hypertext Transfer Protocol (HTTP) of Message Queuing Telemetry Transport (MQTT). MQTT is een standaard berichttransport van de International Organization for Standardization (ISO) dat is ontworpen om met de minimale communicatiebandbreedte en resources van IoT-apparaten te werken. De softwareapplicatie van Microchip Technology voor het PIC-IoT-bord demonstreert het gebruik van MQTT op een Transmission Control Protocol/Internet Protocol (TCP/IP)-aansluiting die is beveiligd met de eerder beschreven methode voor wederzijdse authenticatie TLS/JWT.

Nadat er een veilige verbinding tot stand is gebracht, gebruikt de software MQTT om met de Google Cloud IoT Core-diensten te communiceren om een kanaal, of “topic”, te realiseren dat wordt gebruikt om sensorgegevens naar de Google Cloud te sturen en te reageren op commando's van clouddiensten. Google vraagt de IoT-apparaatsoftware om zich te registreren en vervolgens data naar een bepaald topic van het formulier /devices/{deviceID}/events te zenden en biedt de optie voor subtopics onder de brede events topic. Naast andere topics, zoals die voor apparaatbeheerfuncties, wijst Google een topic /devices/{device-id}/commands toe om commando's van de cloud naar het IoT-apparaat te zenden. Google biedt zelfs een catch-all topic (/devices/{device-id}/commands/#) waarmee IoT-apparaten commando's kunnen ontvangen die via een willekeurig subtopic worden verzonden.

De PIC-IoT-toepassing demonstreert de verschillende procedures met behulp van een uitbreidbare software-architectuur die is gebaseerd op timers en callbacks. Door deze architectuur hoeft de hoofdmodule (main.c) alleen de hoofdroutine (main()) alsmede routines op toepassingsniveau te leveren voor het verzenden (sendToCloud()) en ontvangen (receivedFromCloud()) van berichten. De main() routine zelf roept slechts een paar initialisatieroutines aan voordat een eindeloze lus wordt ingevoerd die de timerplanner uitvoert en een placeholder voor gebruikersroutines biedt (lijst 1)

Copy void receivedFromCloud(uint8_t *topic, uint8_t *payload) { char *toggleToken = "\"toggle\":"; char *subString; if ((subString = strstr((char*)payload, toggleToken))) { LED_holdYellowOn( subString[strlen(toggleToken)] == '1' ); } debug_printer(SEVERITY_NONE, LEVEL_NORMAL, "topic: %s", topic); debug_printer(SEVERITY_NONE, LEVEL_NORMAL, "payload: %s", payload); } // This will get called every 1 second only while we have a valid Cloud connection void sendToCloud(void) { static char json[70]; // This part runs every CFG_SEND_INTERVAL seconds int rawTemperature = SENSORS_getTempValue(); int light = SENSORS_getLightValue(); int len = sprintf(json, "{\"Light\":%d,\"Temp\":\"%d.%02d\"}", light,rawTemperature/100,abs(rawTemperature)%100); if (len >0) { CLOUD_publishData((uint8_t*)json, len); LED_flashYellow(); } } #include "mcc_generated_files/application_manager.h" /* Main application */ int main(void) { // initialize the device SYSTEM_Initialize(); application_init(); while (1) { // Add your application code runScheduler(); } return 1; } 

Lijst 1: de sampletoepassing van Microchip Technology voor het PIC-IoT-bord gebruikt timers en callbacks die de hoofdlus vereenvoudigen en ontwikkelaars in staat stellen om hun eigen diensten en toepassingsroutines gemakkelijk toe te voegen. (Codebron: Microchip Technology)

De routine SYSTEM_Initialize(), opgeroepen vóór de eindeloze lus, initialiseert hardwarecomponenten waaronder de klok, analoog/digitaal-omzetter (ADC), interrupts enzovoorts. De routine application_init() initialiseert diverse softwaresystemen waaronder de CryptoAuthentication bibliotheek en maakt verbinding met de Wi-Fi en met de cloud zelf. Als laatste taak stelt application_init() een timer van 100 milliseconden (ms) in voor uitvoering van de MAIN_dataTask(). Wanneer de timer afloopt en de MAIN_dataTask() wordt opgeroepen, checkt hij de verbinding met de cloud en doet eens per seconde de oproep sendToCloud(), waarbij de leds van het bord op passende wijze worden ingesteld om de huidige bedrijfsstatus van de toepassing aan te geven (Lijst 2). De ontwikkelaars kunnen een weergave van sensorwaarden bekijken op een gratis sandbox account dat Microchip Technology aanbiedt op Google Cloud.

Copy // This gets called by the scheduler approximately every 100ms uint32_t MAIN_dataTask(void *payload) { static time_t previousTransmissionTime = 0; // Get the current time. This uses the C standard library time functions time_t timeNow = time(NULL); // Example of how to send data when MQTT is connected every 1 second based on the system clock if (CLOUD_isConnected()) { // How many seconds since the last time this loop ran?
int32_t delta = difftime(timeNow,previousTransmissionTime); if (delta >= CFG_SEND_INTERVAL) { previousTransmissionTime = timeNow; // Call the data task in main.c sendToCloud(); } } if(shared_networking_params.haveAPConnection) { LED_BLUE_SetLow(); } else { LED_BLUE_SetHigh(); } if(shared_networking_params.haveERROR) { LED_RED_SetLow(); } else { LED_RED_SetHigh(); } if (LED_isBlinkingGreen() == false) { if(CLOUD_isConnected()) { LED_GREEN_SetLow(); } else { LED_GREEN_SetHigh(); } } // This is milliseconds managed by the RTC and the scheduler, this return makes the // timer run another time, returning 0 will make it stop return MAIN_DATATASK_INTERVAL; } 

Lijst 2: met behulp van een timer en callback-mechanisme zendt de PIC-IoT sampletoepassing van Microchip Technology eens per seconde sensorgegevens naar de cloud (CFG_SEND_INTERVAL=1) en werkt de leds van het bord bij om de huidige bedrijfsstatus aan te geven. (Codebron: Microchip Technology)

De verwerking van commando's van de cloud is al net zo gemakkelijk. De sampletoepassing demonstreert hoe een callback-routine zoals receivedFromCloud() geassocieerd wordt om de ontvangen berichten te verwerken. Als onderdeel van de initialisatiefase roept de eerder genoemde routine application_init() een routine (CLOUD_subscribe()) aan die het proces voor registratie bij de Google Cloud uit voert. Als onderdeel van dit proces werkt de software een tabel (imqtt_publishReceiveCallBackTable) bij met de callback aan receivedFromCloud() (Lijst 3). In dit geval gebruikt de sampletoepassing de topic config en codeert de index in de tabel sinds NUM_TOPICS_SUBSCRIBE=1, maar het topic met meer algemene commando's en afgeleide subtopics zijn een andere optie.

Copy void CLOUD_subscribe(void) { mqttSubscribePacket cloudSubscribePacket; uint8_t topicCount = 0; // Variable header cloudSubscribePacket.packetIdentifierLSB = 1; cloudSubscribePacket.packetIdentifierMSB = 0; // Payload for(topicCount = 0; topicCount < NUM_TOPICS_SUBSCRIBE; topicCount++) { sprintf(mqttSubscribeTopic, "/devices/%s/config", deviceId); cloudSubscribePacket.subscribePayload[topicCount].topic = (uint8_t *)mqttSubscribeTopic; cloudSubscribePacket.subscribePayload[topicCount].topicLength = strlen(mqttSubscribeTopic); cloudSubscribePacket.subscribePayload[topicCount].requestedQoS = 0; imqtt_publishReceiveCallBackTable[0].topic = mqttSubscribeTopic; imqtt_publishReceiveCallBackTable[0].mqttHandlePublishDataCallBack = receivedFromCloud; MQTT_SetPublishReceptionHandlerTable(imqtt_publishReceiveCallBackTable); } if(MQTT_CreateSubscribePacket(&cloudSubscribePacket) == true) { debug_printInfo("CLOUD: SUBSCRIBE packet created"); sendSubscribe = false; } } 

Lijst 3: de sampletoepassing van Microchip Technology laat zien hoe ontwikkelaars gemakkelijk callback-routines aan ontvangen MQTT-berichten kunnen associëren, in dit geval door de functie receivedFromCloud() te definiëren als de callback voor ontvangen berichten van de standaard topic. (Codebron: Microchip Technology)

Ontwikkelaars kunnen de PIC-IoT hardware- en softwarebundel gebruiken om onmiddellijk te beginnen met het verkennen van verschillende scenario's voor het verzenden en ontvangen van gegevens aan en van de Google Cloud. De PIC-IoT hardware met ATECC608A CryptoAuthentication inrichting zijn vooraf geconfigureerd voor ondersteuning van Google Cloud IoT Core en dit gebruiksmodel. Ontwikkelaars kunnen de MPLAB X IDE en MPLAB Code Configurator gebruiken om de IoT-toepassing te wijzigen of een hele nieuwe toepassing voor veilige verbinding met de Google Cloud te bouwen.

Conclusie

Zorgen voor veilige verbindingen tussen IoT-apparaten en genetwerkte resources is essentieel voor iedere via een netwerk aangesloten service-omgeving en absoluut noodzakelijk wanneer met commerciële clouddiensten wordt gewerkt. Het bouwen van de lagen van softwarediensten die nodig zijn voor veilige connectiviteit kan aanzienlijke vertragingen veroorzaken bij IoT-projecten en kan zelfs onhaalbaar zijn in IoT-ontwerpen met beperkte resources. Door gebruik te maken van een ontwikkelingsbord zoals PIC-IoT van Microchip Technology, dat een speciale beveiligings-IC bevat, kunnen ontwikkelaars snel een IoT-toepassing bouwen die in staat is om veilig verbinding te maken met Google Cloud.

DigiKey logo

Disclaimer: The opinions, beliefs, and viewpoints expressed by the various authors and/or forum participants on this website do not necessarily reflect the opinions, beliefs, and viewpoints of DigiKey or official policies of DigiKey.

Achtergrondinformatie over deze auteur

Image of Stephen Evanczuk

Stephen Evanczuk

Stephen Evanczuk heeft meer dan 20 jaar ervaring in het schrijven voor en over de elektronicasector met betrekking tot heel wat onderwerpen, waaronder hardware, software, systemen en toepassingen zoals het IoT. Hij behaalde zijn filosofiediplomain neurowetenschappen over neuronale netwerken en werkte in de ruimtevaartsector op massaal verspreide veilige systemen en algoritmeversnellingsmethoden. Wanneer hij geen artikels over technologie en techniek schrijft, werkt hij aan toepassingen voor “deep learning” voor herkennings- en aanbevelingssystemen.

Over deze uitgever

De Noord-Amerikaanse redacteurs van DigiKey