Supporto dell'hub IoT per le identità gestite

Le identità gestite offrono ai servizi di Azure un'identità gestita automaticamente in Microsoft Entra ID in modo sicuro. Ciò elimina la necessità per gli sviluppatori di dover gestire le credenziali fornendo un'identità. Esistono due tipi di identità gestite: assegnata dal sistema e assegnata dall'utente. L'hub IoT supporta entrambe.

Nell'hub IoT, le identità gestite possono essere usate per la connettività in uscita dall'hub IoT ad altri servizi di Azure per funzionalità come il routing dei messaggi, il caricamento di file e l'importazione/esportazione di dispositivi in blocco. Questo articolo illustra come usare le identità gestite assegnate dal sistema e assegnate dall'utente nell'hub IoT per diverse funzionalità.

Prerequisiti

Identità gestita assegnata dal sistema

Abilitare o disabilitare l'identità gestita assegnata dal sistema nel portale di Azure

  1. Accedere al portale di Azure e passare all'hub IoT.

  2. Selezionare Identità nella sezione Impostazioni di sicurezza del menu di spostamento.

  3. Selezionare la scheda Assegnata dal sistema.

  4. Impostare lo stato dell'identità gestita assegnata dal sistema su Attivato o Disattivato, quindi selezionare Salva.

    Nota

    Non è possibile disattivare l'identità gestita assegnata dal sistema mentre è in uso. Assicurarsi che nessun endpoint personalizzato usi l'autenticazione dell'identità gestita assegnata dal sistema prima di disabilitare la funzionalità.

    Screenshot che mostra dove attivare l'identità gestita assegnata dal sistema per un hub IoT.

Abilitare l'identità gestita assegnata dal sistema al momento della creazione dell'hub, usando il modello di Resource Manager

Per abilitare l'identità gestita assegnata dal sistema nell'hub IoT in fase di provisioning delle risorse, usare il modello di Azure Resource Manager (ARM) riportato di seguito.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": 
    {
      "iotHubName": {
        "type": "string",
        "metadata": {
          "description": "Name of iothub resource"
        }
      },
      "skuName": {
        "type": "string",
        "defaultValue": "S1",
        "metadata": {
          "description": "SKU name of iothub resource, by default is Standard S1"
        }
      },
      "skuTier": {
        "type": "string",
        "defaultValue": "Standard",
        "metadata": {
          "description": "SKU tier of iothub resource, by default is Standard"
        }
      },
      "location": {
        "type": "string",
        "defaultValue": "[resourceGroup().location]",
        "metadata": {
          "description": "Location of iothub resource. Please provide any of supported-regions of iothub"
        }
      }
    },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2020-10-01",
      "name": "createIotHub",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              "type": "Microsoft.Devices/IotHubs",
              "apiVersion": "2021-03-31",
              "name": "[parameters('iotHubName')]",
              "location": "[parameters('location')]",
              "identity": {
                "type": "SystemAssigned"
              },
              "sku": {
              "name": "[parameters('skuName')]",
              "tier": "[parameters('skuTier')]",
              "capacity": 1
              }
            }
          ] 
        }
      }
    }
  ]
}

Dopo aver sostituito i valori per la risorsa name, location, SKU.name e SKU.tier, è possibile usare l'interfaccia della riga di comando di Azure per distribuire la risorsa in un gruppo di risorse esistente usando:

az deployment group create --name <deployment-name> --resource-group <resource-group-name> --template-file <template-file.json> --parameters iotHubName=<valid-iothub-name> skuName=<sku-name> skuTier=<sku-tier> location=<any-of-supported-regions>

Dopo aver creato la risorsa, è possibile recuperare l'assegnazione del sistema assegnata all'hub usando l'interfaccia della riga di comando di Azure:

az resource show --resource-type Microsoft.Devices/IotHubs --name <iot-hub-resource-name> --resource-group <resource-group-name>

Identità gestita assegnata dall'utente

Questa sezione illustra come aggiungere e rimuovere un'identità gestita assegnata dall'utente da un hub IoT usando il portale di Azure.

  1. Prima di tutto, è necessario creare un'identità gestita assegnata dall'utente come risorsa autonoma. A tale scopo, è possibile seguire le istruzioni riportate in Creare un'identità gestita assegnata dall'utente.

  2. Passare all'hub IoT, passare a Identità nel portale dell'hub IoT.

  3. Nella scheda Assegnata dall'utente, fare clic su Associa un'identità gestita assegnata dall'utente. Scegliere l'identità gestita assegnata dall'utente da aggiungere all'hub e quindi fare clic su Seleziona.

  4. È possibile rimuovere un'identità assegnata dall'utente da un hub IoT. Scegliere l'identità assegnata dall'utente da rimuovere e fare clic sul pulsante Rimuovi. Si noti che si sta rimuovendo solo dall'hub IoT e questa rimozione non elimina l'identità assegnata dall'utente come risorsa. Per eliminare l'identità assegnata dall'utente come risorsa, seguire le istruzioni in Eliminare un'identità gestita assegnata dall'utente.

    Screenshot che mostra come aggiungere un'identità gestita assegnata dall'utente per un hub IoT.

Abilitare l'identità gestita assegnata dall'utente al momento della creazione dell'hub usando il modello di Resource Manager

Il modello di esempio seguente può essere usato per creare un hub con identità gestita assegnata dall'utente. Questo modello crea un'identità assegnata dall'utente con il nome [iothub-name-provided]-identity e assegnato all'hub IoT creato. È possibile modificare il modello per aggiungere più identità assegnate dall'utente in base alle esigenze.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "iotHubName": {
      "type": "string",
      "metadata": {
        "description": "Name of iothub resource"
      }
    },
  "skuName": {
    "type": "string",
    "defaultValue": "S1",
    "metadata": {
      "description": "SKU name of iothub resource, by default is Standard S1"
    }
  },
  "skuTier": {
    "type": "string",
    "defaultValue": "Standard",
    "metadata": {
      "description": "SKU tier of iothub resource, by default is Standard"
    }
  },
  "location": {
    "type": "string",
    "defaultValue": "[resourceGroup().location]",
    "metadata": {
      "description": "Location of iothub resource. Please provide any of supported-regions of iothub"
    }
  }
},
  "variables": {
    "identityName": "[concat(parameters('iotHubName'), '-identity')]"
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2020-10-01",
      "name": "createIotHub",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
              "name": "[variables('identityName')]",
              "apiVersion": "2018-11-30",
              "location": "[resourceGroup().location]"
            },
            {
              "type": "Microsoft.Devices/IotHubs",
              "apiVersion": "2021-03-31",
              "name": "[parameters('iotHubName')]",
              "location": "[parameters('location')]",
              "identity": {
                "type": "UserAssigned",
                "userAssignedIdentities": {
                  "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',variables('identityName'))]": {}
                }
              },
              "sku": {
                "name": "[parameters('skuName')]",
                "tier": "[parameters('skuTier')]",
                "capacity": 1
              },
              "dependsOn": [
                "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',variables('identityName'))]"
              ]
            }
          ]
        }
      }
    }
  ]
}
az deployment group create --name <deployment-name> --resource-group <resource-group-name> --template-file <template-file.json> --parameters iotHubName=<valid-iothub-name> skuName=<sku-name> skuTier=<sku-tier> location=<any-of-supported-regions>

Dopo aver creato la risorsa, è possibile recuperare l'identità gestita assegnata dall'utente nell'hub usando l'interfaccia della riga di comando di Azure:

az resource show --resource-type Microsoft.Devices/IotHubs --name <iot-hub-resource-name> --resource-group <resource-group-name>

Connettività in uscita dall'hub IoT ad altre risorse di Azure

Le identità gestite possono essere usate per la connettività in uscita dall'hub IoT ad altri servizi di Azure per il routing dei messaggi, il caricamento di file e l'importazione/esportazione di dispositivi in blocco. È possibile scegliere l'identità gestita da usare per ogni connettività in uscita dell'hub IoT agli endpoint di proprietà del cliente, inclusi gli account di archiviazione, gli hub eventi e gli endpoint del bus di servizio.

Nota

Solo l'identità gestita assegnata dal sistema offre l'accesso tramite hub IoT alle risorse private. Se si vuole usare l'identità gestita assegnata dall'utente, è necessario abilitare l'accesso pubblico su tali risorse private per consentire la connettività.

Configurare il routing dei messaggi con identità gestite

In questa sezione viene usato il routing dei messaggi a un endpoint personalizzato di Hub eventi come esempio. L'esempio si applica anche ad altri endpoint personalizzati di routing.

  1. Passare all'hub eventi nel portale di Azure per assegnare l'identità gestita all'accesso corretto.

  2. Seleziona Controllo di accesso (IAM).

  3. Selezionare Aggiungi > Aggiungi assegnazione di ruolo.

    Screenshot che mostra la pagina Controllo di accesso (IAM) con il menu Aggiungi assegnazione di ruolo aperto.

  4. Nella scheda Ruolo, selezionare Mittente dati di Hub eventi di Azure.

    Nota

    Per un account di archiviazione, selezionare Collaboratore dati BLOB di archiviazione (nonCollaboratore o Collaboratore account di archiviazione) come ruolo. Per un bus di servizio, selezionare Mittente dati del bus di servizio di Azure.

    Screenshot che mostra la pagina Aggiungi assegnazione di ruolo con la scheda Ruolo selezionata.

  5. Nella scheda Membri selezionare Identità gestita e quindi Seleziona membri.

  6. Per le identità gestite assegnate dall'utente, selezionare la sottoscrizione, selezionare Identità gestita assegnata dall'utente e quindi selezionare l'identità gestita assegnata dall'utente.

  7. Per le identità gestite assegnate dal sistema, selezionare la sottoscrizione, selezionare Tutte le identità gestite assegnate dal sistema e quindi selezionare il nome della risorsa dell'hub IoT.

  8. Nella scheda Rivedi e assegna selezionare Rivedi e assegna per assegnare il ruolo.

    Per altre informazioni sulle assegnazioni di ruolo, vedere Assegnare ruoli di Azure tramite il portale di Azure

  9. Se è necessario limitare la connettività all'endpoint personalizzato tramite una rete virtuale, è necessario attivare l'eccezione di prima parte Microsoft attendibile per concedere all'hub IoT l'accesso all'endpoint specifico. Ad esempio, se si aggiunge un endpoint personalizzato dell'hub eventi, passare alla scheda Firewall e reti virtuali nell'hub eventi e abilitare l'opzione Consenti l'accesso dalle reti selezionate. Nell'elenco Eccezioni selezionare la casella di controllo per consentire ai servizi Microsoft attendibili di accedere a questo account di archiviazione. Fare clic sul pulsante Salva. Questo vale anche per l'account di archiviazione e il bus di servizio. Altre informazioni sul supporto dell'hub IoT per le reti virtuali.

    Nota

    È necessario completare i passaggi precedenti per assegnare all'identità gestita l'accesso corretto, prima di aggiungere l'hub eventi come endpoint personalizzato nell'hub IoT. Attendere alcuni minuti per la propagazione dell'assegnazione di ruolo.

  10. Passare quindi all'hub IoT. Nell'hub, passare a Routing messaggi e quindi selezionare Aggiungi.

  11. Nella scheda Endpoint, creare un endpoint per l'hub eventi specificando le informazioni seguenti:

    Parametro Valore
    Tipo di endpoint Selezionare Hub eventi.
    Nome endpoint Specificare un nome univoco per un nuovo endpoint oppure selezionare Seleziona esistente per scegliere un endpoint di Hub eventi esistente.
    Spazio dei nomi dell'Hub eventi di Azure Usare il menu a discesa per selezionare uno spazio dei nomi di Hub eventi esistente nella sottoscrizione.
    Istanza di hub eventi Usare il menu a discesa per selezionare un hub eventi esistente nello spazio dei nomi.
    Tipo di autenticazione Selezionare Assegnato dall'utente, quindi usare il menu a discesa per selezionare l'identità assegnata dall'utente creata nell'hub eventi.

    Screenshot che mostra l'endpoint dell'hub eventi con l'autenticazione assegnata dall'utente.

  12. Selezionare Crea e avanti. È possibile continuare con la procedura guidata per creare una route che punta a questo endpoint oppure chiudere la procedura guidata.

È possibile modificare il tipo di autenticazione di un endpoint personalizzato esistente. Usare la procedura seguente per modificare un endpoint:

  1. Nell'hub IoT, selezionare Routing dei messaggi nel riquadro di spostamento sinistro e quindi Endpoint personalizzati.

  2. Selezionare la casella di controllo per l'endpoint personalizzato da modificare e quindi selezionare Modifica tipo di autenticazione.

  3. Scegliere il nuovo tipo di autenticazione per questo endpoint e quindi selezionare Salva.

Configurare il caricamento di file con identità gestite

La funzionalità di caricamento di file dell'hub IoT consente ai dispositivi di caricare i file in un account di archiviazione di proprietà del cliente. Per consentire il caricamento dei file, l'hub IoT deve disporre di connettività all'account di archiviazione. Analogamente al routing dei messaggi, è possibile scegliere il tipo di autenticazione preferito e l'identità gestita per la connettività in uscita dell'hub IoT all'account di Archiviazione di Azure.

  1. Nel portale di Azure passare all'account di archiviazione.

  2. Seleziona Controllo di accesso (IAM).

  3. Selezionare Aggiungi > Aggiungi assegnazione di ruolo.

    Screenshot che mostra la pagina Controllo di accesso (IAM) con il menu Aggiungi assegnazione di ruolo aperto.

  4. Nella scheda Ruolo, selezionare Contributore dati BLOB di archiviazione. (Non selezionare Collaboratore oCollaboratore account di archiviazione).

  5. Nella scheda Membri selezionare Identità gestita e quindi Seleziona membri.

  6. Per le identità gestite assegnate dall'utente, selezionare la sottoscrizione, selezionare Identità gestita assegnata dall'utente e quindi selezionare l'identità gestita assegnata dall'utente.

  7. Per le identità gestite assegnate dal sistema, selezionare la sottoscrizione, selezionare Tutte le identità gestite assegnate dal sistema e quindi selezionare il nome della risorsa dell'hub IoT.

  8. Nella scheda Rivedi e assegna selezionare Rivedi e assegna per assegnare il ruolo.

    Per altre informazioni sulle assegnazioni di ruolo, vedere Assegnare ruoli di Azure tramite il portale di Azure

    Se è necessario limitare la connettività all'account di archiviazione tramite una rete virtuale, è necessario attivare l'eccezione di prima parte Microsoft attendibile per concedere all'hub IoT l'accesso all'account di archiviazione. Nella pagina delle risorse dell'account di archiviazione, passare alla scheda Firewall e reti virtuali e abilitare l'opzione Consenti l'accesso dalle reti selezionate. Nell'elenco Eccezioni selezionare la casella di controllo Consenti ai servizi Microsoft attendibili di accedere a questo account di archiviazione. Fare clic sul pulsante Salva. Altre informazioni sul supporto dell'hub IoT per le reti virtuali.

    Nota

    È necessario completare i passaggi precedenti per assegnare all'identità gestita l'accesso corretto, prima di salvare l'account di archiviazione nell'hub IoT per il caricamento di file usando l'identità gestita. Attendere alcuni minuti per la propagazione dell'assegnazione di ruolo.

  9. Nella pagina delle risorse dell'hub IoT, passare alla scheda Caricamento file.

  10. Nella pagina visualizzata, selezionare il contenitore che si desidera utilizzare nell'archivio BLOB, configurare i valori per i campi Impostazioni di notifica file, Durata TTL della firma di accesso condiviso, Durata TTL predefinita e Numero massimo di distribuzioni in base alle esigenze. Scegliere il tipo di autenticazione preferito e fare clic su Salva. Se viene visualizzato un errore in questo passaggio, impostare temporaneamente l'account di archiviazione per consentire l'accesso da Tutte le reti, quindi riprovare. È possibile configurare il firewall nell'account di archiviazione al termine della configurazione Caricamento file.

    Screenshot che mostra il caricamento di file con MSI.

    Nota

    Nello scenario di caricamento dei file, sia l'hub che il dispositivo devono connettersi con l'account di archiviazione. I passaggi precedenti consentono di connettere l'hub IoT all'account di archiviazione con il tipo di autenticazione desiderato. È comunque necessario connettere il dispositivo all'archiviazione usando l'URI di firma di accesso condiviso. Oggi l'URI di firma di accesso condiviso viene generato usando la stringa di connessione. Verrà aggiunto il supporto per generare presto l'URI di firma di accesso condiviso con l'identità gestita. Seguire la procedura descritta nel Caricamento file.

Configurare l'importazione/esportazione di dispositivi in blocco con identità gestite

L'hub IoT supporta la funzionalità per l'importazione/esportazione in blocco delle informazioni dei dispositivi da o verso un BLOB di archiviazione fornito dal cliente. Questa funzionalità richiede la connettività dall'hub IoT all'account di archiviazione.

  1. Nel portale di Azure passare all'account di archiviazione.

  2. Seleziona Controllo di accesso (IAM).

  3. Selezionare Aggiungi > Aggiungi assegnazione di ruolo.

    Screenshot che mostra la pagina Controllo di accesso (IAM) con il menu Aggiungi assegnazione di ruolo aperto.

  4. Nella scheda Ruolo, selezionare Contributore dati BLOB di archiviazione. (Non selezionare Collaboratore oCollaboratore account di archiviazione).

  5. Nella scheda Membri selezionare Identità gestita e quindi Seleziona membri.

  6. Per le identità gestite assegnate dall'utente, selezionare la sottoscrizione, selezionare Identità gestita assegnata dall'utente e quindi selezionare l'identità gestita assegnata dall'utente.

  7. Per le identità gestite assegnate dal sistema, selezionare la sottoscrizione, selezionare Tutte le identità gestite assegnate dal sistema e quindi selezionare il nome della risorsa dell'hub IoT.

  8. Nella scheda Rivedi e assegna selezionare Rivedi e assegna per assegnare il ruolo.

    Per altre informazioni sulle assegnazioni di ruolo, vedere Assegnare ruoli di Azure tramite il portale di Azure

Uso dell'API REST o dell'SDK per i processi di importazione ed esportazione

È ora possibile usare le API REST di Azure IoT per la creazione di processi di importazione ed esportazione. Sarà necessario specificare le proprietà seguenti nel corpo della richiesta:

  • storageAuthenticationType: impostare il valore su identityBased.
  • inputBlobContainerUri: impostare questa proprietà solo per i processi di importazione.
  • outputBlobContainerUri: impostare questa proprietà per i processi di importazione ed esportazione.
  • identity: impostare il valore all'identità gestita da usare.

Gli SDK dell'hub IoT di Azure supportano questa funzionalità anche nel gestore del Registro di sistema del client del servizio. Il frammento di codice seguente mostra come avviare un processo di importazione o esportazione usando l'SDK C#.

Frammento di codice C#

    // Create an export job
 
    using RegistryManager srcRegistryManager = RegistryManager.CreateFromConnectionString(hubConnectionString);
 
    JobProperties jobProperties = JobProperties.CreateForExportJob(
        outputBlobContainerUri: blobContainerUri,
        excludeKeysInExport: false,
        storageAuthenticationType: StorageAuthenticationType.IdentityBased,
        identity: new ManagedIdentity
        {
            userAssignedIdentity = userDefinedManagedIdentityResourceId
        });
    // Create an import job
    
    using RegistryManager destRegistryManager = RegistryManager.CreateFromConnectionString(hubConnectionString);
 
    JobProperties jobProperties = JobProperties.CreateForImportJob(
        inputBlobContainerUri: blobContainerUri,
        outputBlobContainerUri: blobContainerUri,
        storageAuthenticationType: StorageAuthenticationType.IdentityBased,
        identity: new ManagedIdentity
        {
            userAssignedIdentity = userDefinedManagedIdentityResourceId
        });

Frammento di codice Python

# see note below
iothub_job_manager = IoTHubJobManager("<IoT Hub connection string>")

# Create an import job
result = iothub_job_manager.create_import_export_job(JobProperties(
    type="import",
    input_blob_container_uri="<input container URI>",
    output_blob_container_uri="<output container URI>",
    storage_authentication_type="identityBased",
    identity=ManagedIdentity(
        user_assigned_identity="<resource ID of user assigned managed identity>"
    )
))

# Create an export job
result = iothub_job_manager.create_import_export_job(JobProperties(
    type="export",
    output_blob_container_uri="<output container URI>",
    storage_authentication_type="identityBased",
    exclude_keys_in_export=True,
    identity=ManagedIdentity(
        user_assigned_identity="<resource ID of user assigned managed identity>"
    ) 
))

Nota

  • Se storageAuthenticationType è impostato su identityBased e la proprietà userAssignedIdentity non è null, i processi useranno l'identità gestita assegnata dall'utente specificata.
  • Se l'hub IoT non è configurato con l'identità gestita assegnata dall'utente specificata in userAssignedIdentity, il processo avrà esito negativo.
  • Se storageAuthenticationType è impostato su identityBased la proprietà userAssignedIdentity è null, i processi useranno l'identità assegnata dal sistema.
  • Se l'hub IoT non è configurato con l'identità gestita assegnata dall'utente, il processo avrà esito negativo.
  • Se storageAuthenticationType è impostato su identityBased e non sono configurate né identità gestite assegnate dall'utenteassegnate dal sistema nell'hub, il processo avrà esito negativo.

Esempi di SDK

Passaggi successivi

Consultare i collegamenti seguenti per altre informazioni sulle funzionalità dell'hub IoT: