Creare ed effettuare il provisioning di dispositivi IoT Edge su larga scala con un TPM in Linux

Si applica a: Segno di spunta IoT Edge 1.5 IoT Edge 1.5 Segno di spunta IoT Edge 1.4 IoT Edge 1.4

Importante

IoT Edge 1.5 LTS e IoT Edge 1.4 LTS sono versioni supportate. IoT Edge 1.4 LTS raggiungerà la fine del servizio il 12 novembre 2024. Se si usa una versione precedente, vedere Aggiornare IoT Edge.

Questo articolo fornisce istruzioni per il provisioning automatico di un dispositivo Azure IoT Edge per Linux usando un modulo TPM (Trusted Platform Module). È possibile effettuare automaticamente il provisioning di dispositivi IoT Edge con il servizio Device Provisioning in hub IoT di Azure. Se non si ha familiarità con il processo di provisioning automatico, vedere la panoramica sul provisioning prima di continuare.

Questo articolo illustra due metodologie. Selezionare la propria preferenza in base all'architettura della soluzione:

  • Provisioning automatico di un dispositivo Linux con hardware TPM fisico.
  • Eseguire il provisioning automatico di una macchina virtuale (VM) Linux con un TPM simulato in esecuzione in un computer di sviluppo Windows con Hyper-V abilitato. È consigliabile usare questa metodologia solo come scenario di test. Un TPM simulato non offre la stessa sicurezza di un TPM fisico.

Le istruzioni differiscono in base alla metodologia, quindi man mano che si procede assicurarsi di entrare nella scheda corretta.

Le attività sono le seguenti:

  1. Recuperare le informazioni di provisioning per il TPM.
  2. Creare una registrazione singola per il dispositivo in un'istanza del servizio Device Provisioning in hub IoT.
  3. Installare il runtime IoT Edge e connettere il dispositivo all'hub IoT.

Prerequisiti

Risorse cloud

  • Un hub IoT attivo
  • Un'istanza del servizio Device Provisioning in Hub IoT in Azure, collegata all'hub IoT

Requisiti dei dispositivi

Un dispositivo Linux fisico che fungerà da dispositivo IoT Edge.

I produttori di dispositivi possono fare riferimento alle indicazioni sull'integrazione di un TPM nel processo di produzione.

Nota

TPM 2.0 è necessario quando si usa l'attestazione TPM con il servizio Device Provisioning.

Quando si usa un TPM è possibile creare solo registrazioni del servizio Device Provisioning individuali, non di gruppo.

Configurare il dispositivo

Se si usa un dispositivo Linux fisico con un TPM non sono necessari altri passaggi per configurare il dispositivo.

È possibile continuare.

Recuperare le informazioni di provisioning per il TPM

Nota

In precedenza in questo articolo veniva usato lo strumento tpm_device_provision di IoT C SDK per generare le informazioni di provisioning. Se in precedenza si usava questo strumento, tenere presente che i passaggi seguenti generano un ID di registrazione diverso per la stessa chiave di verifica dell'autenticità pubblica. Se è necessario ricreare l'ID di registrazione come prima, vedere come viene generato dallo strumento tpm_device_provision dell'SDK C. Assicurarsi che l'ID di registrazione per la registrazione singola nel servizio Device Provisioning corrisponda all'ID di registrazione che il dispositivo IoT Edge è configurato per usare.

In questa sezione si usano gli strumenti software TPM2 per recuperare la chiave di verifica dell'autenticità per il TPM e quindi generare un ID di registrazione univoco. Questa sezione corrisponde al Passaggio 3: Il dispositivo ha firmware e software installato nel processo per l'integrazione di un TPM nel processo di produzione.

Installare gli strumenti TPM2

Accedere al dispositivo e installare il pacchetto tpm2-tools.

sudo apt-get install tpm2-tools

Eseguire lo script seguente per leggere la chiave di verifica dell'autenticità, creandone una se non esiste già.

#!/bin/sh
if [ "$USER" != "root" ]; then
  SUDO="sudo "
fi

$SUDO tpm2_readpublic -Q -c 0x81010001 -o ek.pub 2> /dev/null
if [ $? -gt 0 ]; then
  # Create the endorsement key (EK)
  $SUDO tpm2_createek -c 0x81010001 -G rsa -u ek.pub

  # Create the storage root key (SRK)
  $SUDO tpm2_createprimary -Q -C o -c srk.ctx > /dev/null

  # make the SRK persistent
  $SUDO tpm2_evictcontrol -c srk.ctx 0x81000001 > /dev/null

  # open transient handle space for the TPM
  $SUDO tpm2_flushcontext -t > /dev/null
fi

printf "Gathering the registration information...\n\nRegistration Id:\n%s\n\nEndorsement Key:\n%s\n" $(sha256sum -b ek.pub | cut -d' ' -f1 | sed -e 's/[^[:alnum:]]//g') $(base64 -w0 ek.pub)
$SUDO rm ek.pub srk.ctx 2> /dev/null

La finestra di output mostra la Chiave di verifica dell'autenticità del dispositivo e un ID registrazione univoco . Copiare questi valori per usarli in un secondo momento, quando si creerà una registrazione singola per il dispositivo nel servizio Device Provisioning.

Dopo aver ottenuto l'ID di registrazione e la chiave di verifica dell'autenticità, si è pronti per continuare.

Suggerimento

Se non si vogliono usare gli strumenti software TPM2 per recuperare le informazioni, è necessario trovare un altro modo per ottenere le informazioni di provisioning. La chiave di verifica dell'autenticità, che è univoca per ogni chip TPM, deve essere richiesta al produttore del chip TPM. È possibile derivare un ID di registrazione univoco per il dispositivo TPM. Ad esempio, come illustrato in precedenza, è possibile creare un hash SHA-256 della chiave di verifica dell'autenticità.

Creare una registrazione del servizio Device Provisioning

Usare le informazioni di provisioning del TPM per creare una registrazione singola nel servizio Device Provisioning.

Quando si crea una registrazione nel servizio Device Provisioning, si ha la possibilità di dichiarare uno Stato iniziale dispositivo gemello. Nel dispositivo gemello è possibile impostare tag per raggruppare i dispositivi in base a una qualsiasi metrica usata nella propria soluzione, come l'area, l'ambiente, la località o il tipo di dispositivo. Questi tag vengono usati per creare distribuzioni automatiche.

Suggerimento

I passaggi descritti in questo articolo sono relativi al portale di Azure, ma è anche possibile creare registrazioni singole usando l'interfaccia della riga di comando di Azure. Per altre informazioni, vedere az iot dps enrollment. Come parte del comando dell'interfaccia della riga di comando, usare il flag edge-enabled per specificare che la registrazione è per un dispositivo IoT Edge.

  1. Nel portale di Azure passare all'istanza del servizio Device Provisioning in hub IoT.

  2. In le impostazioni selezionare Gestisci registrazioni.

  3. Selezionare Aggiungi registrazione singola e quindi completare la procedura seguente per configurare la registrazione:

    1. In Meccanismo selezionare TPM.

    2. Specificare la Chiave di verifica dell'autenticità e l'ID di registrazione copiati dalla VM o dal dispositivo fisico.

    3. Se si desidera, specificare un ID per il dispositivo. Se non si specifica un ID dispositivo, viene usato l'ID di registrazione.

    4. Selezionare Vero per dichiarare che la macchina virtuale o il dispositivo fisico è un dispositivo IoT Edge.

    5. Scegliere l'hub IoT collegato a cui si vuole connettere il dispositivo oppure selezionare Collega a nuovo hub IoT. È possibile scegliere più hub e il dispositivo verrà assegnato a uno di essi in base al criterio di assegnazione selezionato.

    6. Aggiungere un valore di tag allo Stato iniziale dispositivo gemello, se si desidera. È possibile usare tag per identificare come destinazione gruppi di dispositivi per la distribuzione di moduli. Per altre informazioni, vedere Distribuire moduli IoT Edge su larga scala.

    7. Seleziona Salva.

Ora che esiste una registrazione per questo dispositivo, il runtime IoT Edge può effettuare automaticamente il provisioning del dispositivo durante l'installazione.

Installare IoT Edge

In questa sezione si prepara la macchina virtuale Linux o il dispositivo fisico per IoT Edge. Quindi, si installa IoT Edge.

Eseguire i comandi seguenti per aggiungere il repository di pacchetti e quindi aggiungere la chiave di firma del pacchetto Microsoft all'elenco di chiavi attendibili.

Importante

Il 30 giugno 2022, il sistema operativo Raspberry Pi OS Stretch è stato ritirato dall'elenco dei sistemi operativi supportati di livello 1. Per evitare potenziali vulnerabilità di sicurezza, aggiornare il sistema operativo host a Bullseye.

L'installazione può essere eseguita con pochi comandi. Aprire un terminale ed eseguire i comandi seguenti:

  • 22.04:

    wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
    sudo dpkg -i packages-microsoft-prod.deb
    rm packages-microsoft-prod.deb
    
  • 20.04:

    wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
    sudo dpkg -i packages-microsoft-prod.deb
    rm packages-microsoft-prod.deb
    

Per altre informazioni sulle versioni del sistema operativo, vedere Piattaforme supportate da Azure IoT Edge.

Nota

I pacchetti software di Azure IoT Edge sono soggetti alle condizioni di licenza disponibili in ogni pacchetto (usr/share/doc/{package-name} o nella directory LICENSE). Prima di usare un pacchetto, leggere le condizioni di licenza. L'installazione e l'uso del pacchetto costituiscono accettazione di tali condizioni. Se non si accettano le condizioni di licenza, non usare il pacchetto.

Installare un motore di contenitore

Azure IoT Edge si basa su un runtime del contenitore compatibile con OCI. Per gli scenari di produzione è consigliabile usare il motore Moby. Il motore Moby è il motore di contenitori ufficialmente supportato con IoT Edge. Le immagini del contenitore Docker CE/EE sono compatibili con il runtime di Moby. Se si usano pacchetti snap di Ubuntu Core, lo snap di Docker è gestito da Canonical ed è supportato per gli scenari di produzione.

Installare il motore Moby.

sudo apt-get update; \
  sudo apt-get install moby-engine

Per impostazione predefinita, il motore del contenitore non imposta limiti di dimensioni per i log dei contenitori. Nel corso del tempo questo può causare il riempimento del dispositivo con i log e l'esaurimento dello spazio su disco. Tuttavia, è possibile configurare il log per la visualizzazione locale, anche se è facoltativo. Per altre informazioni sulla configurazione della registrazione, vedere Elenco di controllo della distribuzione di produzione.

I passaggi seguenti illustrano come configurare il contenitore per l'uso del driver di registrazione local come meccanismo di registrazione.

  1. Creare o modificare il file di configurazione del daemon Docker esistente

    sudo nano /etc/docker/daemon.json
    
  2. Impostare il driver di registrazione predefinito sul driver di registrazione local, come illustrato nell'esempio.

       {
          "log-driver": "local"
       }
    
  3. Riavviare il motore del contenitore per rendere effettive le modifiche.

    sudo systemctl restart docker
    

Installare il runtime IoT Edge.

I servizio IoT Edge fornisce e gestisce gli standard di sicurezza nel dispositivo Edge. Il servizio viene avviato a ogni avvio del dispositivo e ne esegue il bootstrap avviando la parte restante del runtime IoT Edge.

Nota

A partire dalla versione 1.2, il servizio di identità IoT controlla il provisioning e la gestione delle identità per IoT Edge e per altri componenti del dispositivo che devono comunicare con l'hub IoT.

I passaggi descritti in questa sezione rappresentano il processo tipico per installare l'ultima versione di IoT Edge in un dispositivo dotato di connessione Internet. Se è necessario installare una versione specifica, ad esempio una versione non definitiva o se è necessario eseguire l'installazione offline, seguire i passaggi di installazione offline o di una versione specifica più avanti in questo articolo.

Suggerimento

Se si dispone già di un dispositivo IoT Edge che esegue una versione precedente e si vuole eseguire l'aggiornamento all'ultima versione, seguire la procedura descritta in Aggiornare il runtime e il daemon di sicurezza di IoT Edge. Le versioni successive sono tanto diverse dalle versioni precedenti di IoT Edge che sono necessari passaggi specifici per l'aggiornamento.

Installare l'ultima versione di IoT Edge e il pacchetto del servizio di identità IoT (se non è già aggiornato):

  • 22.04:

    sudo apt-get update; \
       sudo apt-get install aziot-edge
    
  • 20.04:

    sudo apt-get update; \
       sudo apt-get install aziot-edge defender-iot-micro-agent-edge
    

Il pacchetto facoltativo defender-iot-micro-agent-edge include il micro-agente di sicurezza di Microsoft Defender per IoT, che fornisce visibilità dell'endpoint sulla gestione della postura di sicurezza, sulle vulnerabilità, sul rilevamento delle minacce, sulla gestione della flotta e altro ancora, per agevolare la protezione dei dispositivi IoT Edge. È consigliabile installare il micro agente con l'agente Edge per abilitare il monitoraggio della sicurezza e la protezione avanzata dei dispositivi Edge. Per altre informazioni su Microsoft Defender per IoT, vedere Che cos'è Microsoft Defender per IoT per gli sviluppatori di dispositivi.

Effettuare il provisioning del dispositivo con la relativa identità cloud

Dopo aver installato il runtime nel dispositivo, configurarlo con le informazioni da usare per connettersi al servizio Device Provisioning e all'hub IoT.

Recuperare l'Ambito ID del servizio Device Provisioning e l'ID registrazione del dispositivo raccolti in precedenza.

Creare un file di configurazione per il dispositivo in base a un file modello fornito come parte dell'installazione di IoT Edge.

sudo cp /etc/aziot/config.toml.edge.template /etc/aziot/config.toml

Aprire il file di configurazione nel dispositivo IoT Edge.

sudo nano /etc/aziot/config.toml
  1. Trovare la sezione delle configurazioni di provisioning del file. Rimuovere il commento dalle righe per il provisioning TPM e assicurarsi che tutte le altre righe di provisioning siano impostate come commento.

    # DPS provisioning with TPM
    [provisioning]
    source = "dps"
    global_endpoint = "https://global.azure-devices-provisioning.net"
    id_scope = "DPS_ID_SCOPE_HERE"
    
    # Uncomment to send a custom payload during DPS registration
    # payload = { uri = "PATH_TO_JSON_FILE" }
    
    [provisioning.attestation]
    method = "tpm"
    registration_id = "REGISTRATION_ID_HERE"
    
    # auto_reprovisioning_mode = Dynamic
    
  2. Aggiornare i valori di id_scope e registration_id con le informazioni sul dispositivo e sul servizio Device Provisioning. Il valore scope_id è l'Ambito ID dalla pagina di panoramica dell'istanza del servizio Device Provisioning.

    Per altre informazioni sulle impostazioni di configurazione del provisioning, vedere Configurare le impostazioni del dispositivo IoT Edge.

  3. Facoltativamente, trovare la sezione della modalità di reprovisioning automatico del file. Usare il parametro auto_reprovisioning_mode per configurare il comportamento di reprovisioning del dispositivo. Dinamico: effettuare il reprovisioning quando il dispositivo rileva che potrebbe essere stato spostato da un hub IoT a un altro. Si tratta dell'impostazione predefinita. AlwaysOnStartup: effettuare il reprovisioning quando il dispositivo viene riavviato o un arresto anomalo causa il riavvio dei daemon. OnErrorOnly: non attivare mai il provisioning automatico del dispositivo. Ogni modalità ha un fallback implicito di reprovisioning del dispositivo se il dispositivo non è in grado di connettersi all'hub IoT durante il provisioning delle identità a causa di errori di connessione. Per altre informazioni, vedere Concetti di reprovisioning di un dispositivo hub IoT.

  4. Facoltativamente, rimuovere il commento dal parametro payload per specificare il percorso di un file JSON locale. Il contenuto del file viene inviato al servizio Device Provisioning come dati aggiuntivi al momento della registrazione del dispositivo. Questo è utile per l'allocazione personalizzata. Ad esempio, se si vogliono allocare i dispositivi in base a un ID di modello IoT Plug and Play senza intervento umano.

  5. Salva e chiude il file .

Concedere l'accesso IoT Edge al TPM

Il runtime IoT Edge si basa su un servizio TPM che gestisce l'accesso al TPM di un dispositivo. Questo servizio deve accedere al TPM per effettuare automaticamente il provisioning del dispositivo.

È possibile concedere l'accesso al TPM eseguendo l'override delle impostazioni di sistema, in modo che il servizio aziottpm disponga di privilegi a livello radice. Se non si vuole elevare i privilegi di servizio, è possibile usare la procedura seguente per concedere manualmente l'accesso al modulo TPM.

  1. Creare una nuova regola che conceda al runtime IoT Edge l'accesso a tpm0 e tpmrm0.

    sudo touch /etc/udev/rules.d/tpmaccess.rules
    
  2. Aprire il file delle regole.

    sudo nano /etc/udev/rules.d/tpmaccess.rules
    
  3. Copiare le informazioni di accesso seguenti nel file di regole. tpmrm0 potrebbe non essere presente nei dispositivi che usano un kernel precedente al 4.12. I dispositivi che non hanno tpmrm0 ignoreranno questa regola senza problemi.

    # allow aziottpm access to tpm0 and tpmrm0
    KERNEL=="tpm0", SUBSYSTEM=="tpm", OWNER="aziottpm", MODE="0660"
    KERNEL=="tpmrm0", SUBSYSTEM=="tpmrm", OWNER="aziottpm", MODE="0660"
    
  4. Salvare e chiudere il file.

  5. Attivare il sistema udev per valutare la nuova regola.

    /bin/udevadm trigger --subsystem-match=tpm --subsystem-match=tpmrm
    
  6. Verificare che la regola sia stata applicata.

    ls -l /dev/tpm*
    

    L'output dell'operazione riuscita è simile al seguente:

    crw-rw---- 1 root aziottpm 10, 224 Jul 20 16:27 /dev/tpm0
    crw-rw---- 1 root aziottpm 10, 224 Jul 20 16:27 /dev/tpmrm0
    

    Se si riscontra che non state applicate le autorizzazioni corrette, provare a riavviare la macchina per aggiornare udev.

  7. Applicare le modifiche di configurazione apportate nel dispositivo.

    sudo iotedge config apply
    

Verificare l'esito positivo dell'installazione

Se non è già stato fatto, applicare le modifiche di configurazione apportate nel dispositivo.

sudo iotedge config apply

Verificare che il runtime IoT Edge sia in esecuzione.

sudo iotedge system status

Esaminare i log del daemon.

sudo iotedge system logs

Se vengono visualizzati errori di provisioning, è possibile che le modifiche alla configurazione non siano ancora state applicate. Provare a riavviare il daemon IoT Edge.

sudo systemctl daemon-reload

In alternativa, provare a riavviare la VM per verificare se le modifiche diventano effettive al nuovo avvio.

Se il runtime viene avviato correttamente, è possibile accedere all'hub IoT e verificare se è stato eseguito il provisioning automatico del nuovo dispositivo. Il dispositivo è ora è pronto per l'esecuzione di moduli IoT Edge.

Elencare i moduli in esecuzione.

iotedge list

È possibile verificare che sia stata usata la registrazione singola creata nel servizio Device Provisioning. Passare all'istanza del servizio Device Provisioning nel portale di Azure. Aprire i dettagli della registrazione per la registrazione singola creata. Si noti che lo stato della registrazione è assegnata e che l'ID dispositivo è elencato.

Passaggi successivi

Il processo di registrazione del servizio Device Provisioning consente di impostare l'ID dispositivo e i tag del dispositivo gemello mentre si effettua il provisioning del nuovo dispositivo. È possibile usare questi valori per identificare come destinazione singoli dispositivi o gruppi di dispositivi usando la gestione automatica dei dispositivi.

Leggere l'articolo su come Distribuire e monitorare i moduli IoT Edge su larga scala tramite il portale di Azure o usando l'interfaccia della riga di comando di Azure.