Come collegare in modo rapido e sicuro le applicazioni IoT a Google Cloud

Di Stephen Evanczuk

Contributo di Editori nordamericani di DigiKey

Servizi cloud di livello aziendale come Google Cloud offrono agli sviluppatori IoT un'ampia gamma di funzionalità che vanno dai servizi scalabili per le macchine virtuali alle applicazioni di intelligenza artificiale (IA) chiavi in mano. Per stabilire e mantenere connessioni sicure tra i dispositivi IoT e il cloud, è fondamentale che questi servizi si avvalgano di metodi di sicurezza specifici. L'implementazione di meccanismi di sicurezza appropriati può tuttavia allungare i tempi e aumentare la complessità di progetti con scadenze molto strette.

Realizzata con un CI di sicurezza dedicato, la scheda di sviluppo PIC-IoT WG di Microchip Technology offre una soluzione chiavi in mano per la connettività a Google Cloud. Grazie a un circuito integrato di sicurezza dedicato, il kit fornisce una piattaforma completa studiata per accelerare lo sviluppo di progetti IoT in grado di connettersi in modo sicuro ai servizi Google Cloud. Questo articolo descrive i requisiti chiave per una connettività sicura e mostra come gli sviluppatori possono soddisfarli utilizzando la scheda PIC-IoT WG in un tipico progetto IoT.

Complessità della sicurezza

Per la protezione generale delle applicazioni IoT e delle relative risorse aziendali collegate in rete, è indispensabile proteggere le connessioni tra dispositivi IoT e server host remoti. Questi server e altri sistemi di livello aziendale possono assicurare capacità e prestazioni che mancano ai dispositivi IoT costruiti con microcontroller dotati di risorse limitate e poca memoria. Per dispositivi IoT semplici ai quali si richiede di fornire i dati dei sensori o di azionare gli attuatori in modo tempestivo, la natura stessa dei soli requisiti di elaborazione necessari per implementare anche gli algoritmi di sicurezza più basilari può renderli proibitivi.

I metodi di sicurezza si fondano sul principio di base per cui il superamento di una barriera di sicurezza dovrebbe essere più costoso delle risorse che tale barriera dovrebbe proteggere. Per i metodi di sicurezza algoritmici, questo significa che decifrare un messaggio crittografato o violare un protocollo di autenticazione sarebbe proibitivo dal punto di vista dei calcoli necessari. Quanto meno, la violazione della sicurezza algoritmica dovrebbe richiedere un livello di risorse computazionali e di tempo superiore al valore o alla tempestività del canale di comunicazione o dei dati protetti. Di conseguenza, gli algoritmi crittografici cercano di seppellire i dati più importanti sotto una serie di processi di elaborazione complessi e ad alta intensità di calcolo che implicano l'uso di una chiave segreta. Ad esempio, il diffuso algoritmo Advanced Encryption Standard (AES) sottopone i dati a più cicli di elaborazione, ognuno dei quali comprende una serie di fasi che iniziano con una chiave segreta e continuano con le sostituzioni dei byte, gli spostamenti e i calcoli della matrice (Figura 1).

Lo schema degli algoritmi crittografici utilizza di proposito una serie di manipolazioni complesse.

Figura 1: Gli algoritmi crittografici - destinati a rendere impraticabile e di fatto impossibile la decodifica - impiegano appositamente una serie di manipolazioni complesse come questa fase dell'algoritmo AES che combina i dati con bit derivati da una chiave privata. (Immagine per gentile concessione di Wikimedia Commons)

Con algoritmi crittografici simmetrici come AES, i destinatari di un messaggio crittografato utilizzano la stessa chiave segreta per decrittografare i dati. Per contro, gli algoritmi asimmetrici utilizzano una coppia di chiavi, una privata e una pubblica, eliminando così i rischi associati all'uso di una chiave condivisa ma aumentando la complessità di calcolo. In questo approccio, chi invia e chi riceve il messaggio si scambia le chiavi pubbliche mantenendo segreta quella personale privata. Una parte può utilizzare la chiave pubblica dell'altra parte per crittografare un messaggio che può essere decrittografato solo con la chiave privata dell'altra parte.

Per una maggiore protezione, gli algoritmi avanzati si basano su metodi di crittografia a chiave pubblica asimmetrica per consentire lo scambio sicuro di una chiave privata condivisa di breve durata utilizzata per crittografare i dati solo per il tempo di una particolare sessione di scambio di messaggi. Data la natura cruciale di questi scambi di chiave, algoritmi più avanzati come quello Diffie-Hellman a curva ellittica (ECDH) seppelliscono i dati riservati ancora più in profondità sotto calcoli di curve ellittiche complesse. I protocolli di autenticazione come Transport Layer Security (TLS) combinano meccanismi come lo scambio di chiavi Diffie-Hellman con metodi di identificazione formale, utilizzando certificati digitali che incorporano una chiave pubblica con una firma digitale verificabile di un'autorità di certificazione (CA) che attesta l'autenticità del certificato.

Come suggerisce questa breve descrizione, i metodi di sicurezza si basano su livelli di algoritmi e protocolli crittografici che in ultima analisi dipendono da chiavi private. Questi livelli sono soggetti a continui attacchi da parte degli hacker, ma l'intera struttura di sicurezza crollerà rapidamente se si riesce a scoprire le chiavi private.

È per questo che, per la sicurezza dei dispositivi IoT, l'archiviazione sicura delle chiavi basata su hardware è fondamentale. Inoltre, la complessità di calcolo di questi algoritmi e protocolli impone la necessità di motori di crittografia dedicati in grado di sollevare microcontroller dalle risorse limitate dall'onere di dover svolgere tali calcoli complessi.

Sicurezza basata su hardware

Dispositivi hardware con elementi di sicurezza specializzati come il circuito integrato CryptoAuthentication ATECC608A di Microchip Technology forniscono le funzionalità necessarie per proteggere i dati segreti e accelerare l'esecuzione degli algoritmi crittografici. Tra le sue caratteristiche, ATECC608A fornisce una EEPROM su chip per archiviare in modo sicuro fino a 16 chiavi, certificati e altri dati, nonché altre funzionalità necessarie, compreso un generatore di numeri casuali conforme a NIST SP 800-90A/B/C.

Oltre a essere un dispositivo di archiviazione sicura, ATECC608A può accelerare l'esecuzione di una serie di algoritmi, tra cui AES per la crittografia simmetrica ed ECDH per quella asimmetrica. Il dispositivo fornisce anche il supporto per servizi di livello superiore, compreso il boot sicuro (vedere "Utilizzare un chip crittografico per aggiungere un boot sicuro ai progetti di dispositivi IoT").

Oltre ai vantaggi diretti in termini di prestazioni ottenuti alleggerendo il carico di lavoro relativo all'esecuzione di questi algoritmi, l'integrazione di ATECC608A di questi motori di crittografia, archiviazione sicura e altre caratteristiche fornisce intrinsecamente un altro livello di sicurezza: le chiavi rimangono isolate da entità non affidabili. Queste entità comprendono i microcontroller non progettati per la sicurezza, il software in esecuzione su di essi e coloro che lo utilizzano. La capacità del dispositivo di generare chiavi private fornisce un'ulteriore sicurezza durante il provisioning in impianti di produzione o di distribuzione.

Il risultato è una riduzione del numero di vettori di minacce rispetto ai metodi di sicurezza convenzionali basati su software. Questa tecnologia supporta il tipo di difesa in profondità che sta alla base delle politiche di sicurezza efficaci.

L'integrazione completa delle funzionalità in ATECC608A semplifica i requisiti dell'interfaccia hardware. Il dispositivo opera come un'altra periferica I2C che può anche condividere il bus I2C di un altro microcontroller con altri dispositivi, come i sensori digitali MCP9808 di Microchip Technology (Figura 2).

Schema del circuito integrato CryptoAuthentication ATECC608A di Microchip Technology

Figura 2: Dato che il circuito integrato CryptoAuthentication ATECC608A di Microchip Technology (a sinistra) completa la sua elaborazione di sicurezza interamente su chip, può fornire una semplice interfaccia hardware I2C da utilizzare con altri dispositivi I2C come il sensore digitale di temperatura I2C MCP9808 di Microchip Technology (a destra). (Immagine per gentile concessione di Microchip Technology)

A livello di software, tuttavia, l'ampia funzionalità di ATECC608A si traduce in un'interfaccia più complessa. La libreria CryptoAuthLib di Microchip Technology frammenta questa interfaccia in una serie di chiamate di funzioni intuitive disponibili nell'interfaccia di programmazione dell'applicazione CryptoAuthLib (API). Questa libreria è fornita in bundle con i relativi driver e middleware nell'Ambiente di sviluppo integrato (IDE) MPLAB X di Microchip Technology. Anche se l'API CryptoAuthLib e i driver forniscono gli elementi fondamentali per progettazioni personalizzate con ATECC608A, per implementare l'intera catena di sicurezza necessaria per la connettività sicura con Google Cloud gli sviluppatori devono superare altre sfide. La scheda di sviluppo PIC-IoT WG di Microchip Technology rimuove anche questo ostacolo.

Sviluppo di un'applicazione IoT end-to-end

Basata su ATECC608A e sul microcontroller a basso costo e a 16 bit PIC24FJ128GA705 di Microchip Technology, la scheda PIC-IoT è un progetto IoT wireless che include il modulo Wi-Fi ATWINC1510 di Microchip Technology, il sensore di luce ambiente TEMT6000X01 e il sensore di temperatura I2C MCP9808 di Vishay Semiconductor. Inoltre, gli sviluppatori possono facilmente estendere la piattaforma hardware di base aggiungendo i sensori e gli attuatori in dotazione con le centinaia di schede Click di MikroElektronika disponibili. Per lo sviluppo software, Microchip Technology fornisce la sua IDE MPLAB X e il relativo tool di prototipazione rapida MPLAB Code Configurator (MCC).

La scheda e il relativo software forniscono una piattaforma chiavi in mano per valutare un'applicazione IoT end-to-end di base che va dal dispositivo sensore IoT ai servizi Google Cloud su connessioni sicure. Il kit implementa un approccio esclusivo progettato per consentire l'autenticazione reciproca, anche con dispositivi IoT con risorse limitate. In questo approccio, il dispositivo IoT può utilizzare servizi TLS leggeri per autenticare il lato Google della connessione e JavaScript Object Notation (JSON) Web Token (JWT) per autenticarsi ai server di Google (vedere "Una soluzione più semplice per collegare in modo sicuro i dispositivi IoT al cloud"). Oltre ai driver dei dispositivi, ai pacchetti di supporto scheda e ai servizi middleware, Microchip Technology dimostra questo approccio come parte di un'applicazione IoT esemplificativa completa, disponibile per la scheda PIC-IoT attraverso la suite di sviluppo MPLAB.

Tramite l'applicazione di esempio gli sviluppatori possono maturare esperienza lavorando non solo con le applicazioni cloud, ma anche con i servizi specifici per IoT messi a disposizione dai fornitori principali, per collegare i dispositivi IoT con il proprio cloud. Ad esempio, i dispositivi IoT accedono alle risorse di Google Cloud attraverso Google Cloud IoT Core, che fornisce una serie di servizi necessari per collegare questi dispositivi, gestire i relativi metadati e altro ancora (Figura 3).

Schema di Google Cloud che fornisce un'offerta di servizi specializzati, Google Cloud IoT Core

Figura 3: Come con altri fornitori di cloud aziendali, Google Cloud fornisce un'offerta di servizi specializzati, Google Cloud IoT Core, progettata per supportare i requisiti specifici associati all'integrazione dei dispositivi IoT con le risorse cloud. (Immagine per gentile concessione di Google)

Uso dei servizi cloud

Sul back end, Google Cloud IoT Core fornisce ai dispositivi l'accesso a risorse Google Cloud di alto livello attraverso un data broker che utilizza un modello di pubblicazione/abbonamento (pub/sub). Sul front end, IoT Core fornisce un ponte che supporta la connettività dei dispositivi IoT utilizzando il protocollo HTTP (Hypertext Transfer Protocol) o MQTT (Message Queuing Telemetry Transport). MQTT è uno standard dell'Organizzazione internazionale per la normazione (ISO, International Organization for Standardization) per il trasferimento di messaggi, studiato per funzionare con una larghezza di banda di comunicazione minima e con le risorse dei dispositivi IoT. L'applicazione software di Microchip Technology per la scheda PIC-IoT dimostra l'uso di MQTT in esecuzione su una connessione socket TCP/IP (Transmission Control Protocol/Internet Protocol) protetta con il metodo di autenticazione reciproca TLS/JWT descritto in precedenza.

Dopo aver stabilito la connessione sicura, il software utilizza MQTT per comunicare con i servizi Google Cloud IoT Core al fine di stabilire un canale, o "argomento", utilizzato per inviare i dati dei sensori a Google Cloud e rispondere ai comandi dei servizi cloud. Google richiede la sottoscrizione del software del dispositivo IoT, che in seguito invii i dati a un argomento designato del tipo /devices/{deviceID}/events e che fornisca l'opzione per gli argomenti secondari sotto quello generale events. Oltre ad altri argomenti come quelli per le funzioni di gestione del dispositivo, Google ne designa uno /devices/{device-id}/commands per l'invio dei comandi dal cloud al dispositivo IoT. Google fornisce anche un argomento onnicomprensivo (/devices/{device-id}/commands/#) che consente ai dispositivi IoT di ricevere i comandi inviati tramite qualsiasi argomento secondario.

L'applicazione PIC-IoT mostra queste varie procedure utilizzando un'architettura software estensibile basata su timer e callback. Grazie a questa architettura, per inviare (sendToCloud()) e ricevere (receivedFromCloud()) i messaggi, il modulo principale (main.c) deve fornire solo la routine principale (main()) e quelle a livello di applicazione. La routine main() stessa richiama semplicemente un paio di routine di inizializzazione prima di entrare in un anello infinito che esegue lo scheduler del timer e fornisce un segnaposto per le routine dell'utente (Listato 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;
}

Listato 1: L'applicazione di esempio di Microchip Technology per la scheda PIC-IoT usa una serie di timer e callback che semplifica l'anello principale e consente agli sviluppatori di aggiungere facilmente i proprio servizi e le proprie routine applicative. (Fonte del codice: Microchip Technology)

Richiamata prima dell'anello infinito, la routine SYSTEM_Initialize() inizializza i componenti hardware, compresi clock, convertitore analogico/digitale (ADC), interrupt e altri. La routine application_init() inizializza vari sistemi software, compresa la libreria CryptoAuthentication, si collega a Wi-Fi e al cloud stesso. Da ultimo, application_init() imposta un timer di 100 millisecondi (ms) per l'esecuzione di MAIN_dataTask(). Quando il timer scade e viene richiamato MAIN_dataTask(), controlla la connessione al cloud e richiama sendToCloud() una volta al secondo, impostando i LED della scheda come appropriato per indicare lo stato operativo corrente dell'applicazione (Listato 2). Da parte loro gli sviluppatori possono vedere i valori dei sensori su un account sandbox gratuito messo a disposizione da Microchip Technology su 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; 
}

Listato 2: Usando un timer e un meccanismo di callback, l'applicazione di esempio PIC-IoT di Microchip Technology invia i dati dei sensori al cloud una volta al secondo (CFG_SEND_INTERVAL=1) e aggiorna i LED della scheda per indicare lo stato operativo corrente. (Fonte del codice: Microchip Technology)

L'elaborazione dei comandi dal cloud è altrettanto semplice. L'applicazione di esempio dimostra come associare una routine di callback come receivedFromCloud() per gestire i messaggi ricevuti. Come parte della fase di inizializzazione, la routine application_init() ricordata in precedenza richiama una routine (CLOUD_subscribe()) che esegue il processo di sottoscrizione a Google Cloud. Nel quadro di questo processo, il software aggiorna una tabella (imqtt_publishReceiveCallBackTable) con il callback a receivedFromCloud() (Listato 3). In questo caso, l'applicazione di esempio usa l'argomento config e codifica in modo fisso l'indice nella tabella da NUM_TOPICS_SUBSCRIBE=1, ma in alternativa si possono usare l'argomento più generale dei comandi e gli argomenti secondari derivati.

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;
   }
}

Listato 3: Le applicazioni di esempio di Microchip Technology mostrano come gli sviluppatori possono facilmente associare le routine di callback con i messaggi MQTT ricevuti, in questo caso definendo la funzione receivedFromCloud() come il callback per i messaggi ricevuti dall'argomento predefinito. (Fonte del codice: Microchip Technology)

Gli sviluppatori possono utilizzare il bundle hardware e software PIC-IoT così come viene consegnato, per iniziare da subito a esplorare diversi scenari per l'invio e la ricezione dei dati da Google Cloud. L'hardware PIC-IoT, compreso il dispositivo CryptoAuthentication ATECC608A, sono preconfigurati per supportare Google Cloud IoT Core e questo modello d'uso. Gli sviluppatori possono utilizzare facilmente l'IDE MPLAB X e MPLAB Code Configurator per modificare o costruire un'applicazione IoT completamente nuova progettata per connettersi in modo sicuro a Google Cloud.

Conclusione

Fornire connessioni sicure tra i dispositivi IoT e le risorse collegate in rete è essenziale per qualsiasi ambiente di servizio in rete ed è imprescindibile per lavorare con i servizi cloud commerciali. La creazione dei livelli di servizi software necessari per una connettività sicura può aumentare notevolmente i ritardi dei progetti IoT ed essere un'opzione addirittura irrealizzabile nei progetti IoT con limitazioni di risorse. Grazie a una scheda di sviluppo come PIC-IoT di Microchip Technology, che include un circuito integrato di sicurezza specializzato, gli sviluppatori possono creare rapidamente un'applicazione IoT in grado di connettersi in modo sicuro a Google Cloud.

 
DigiKey logo

Esonero della responsabilità: le opinioni, le convinzioni e i punti di vista espressi dai vari autori e/o dai partecipanti al forum su questo sito Web non riflettono necessariamente le opinioni, le convinzioni e i punti di vista di DigiKey o le sue politiche.

Informazioni su questo autore

Image of Stephen Evanczuk

Stephen Evanczuk

Stephen Evanczuk ha più di 20 anni di esperienza come autore sull'industria elettronica e ha scritto su una vasta gamma di argomenti tra cui hardware, software, sistemi e applicazioni, incluso l'IoT. Ha ricevuto un Ph.D. in neuroscienze sulle reti neuronali e ha lavorato nel settore aerospaziale su sistemi di sicurezza ampiamente distribuiti e sui metodi di accelerazione algoritmica. Attualmente, quando non scrive articoli su tecnologia e ingegneria, lavora su applicazioni di deep learning per i sistemi di riconoscimento e di raccomandazione.

Informazioni su questo editore

Editori nordamericani di DigiKey