Supporto dell'hub IoT per le identità gestite

Le identità gestite forniscono 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.

In hub IoT, le identità gestite possono essere usate per la connettività in uscita da hub IoT ad altri servizi di Azure per funzionalità come il routing dei messaggi, il caricamento di file e l'importazione/esportazione bulk del dispositivo. 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 in 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 showing where to turn on system-assigned managed identity for an IoT hub.

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, locationSKU.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

In questa sezione viene illustrato come aggiungere e rimuovere un'identità gestita assegnata dall'utente da un hub IoT usando 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 e passare all'identità nel portale di 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 showing how to add user-assigned managed identity for an I O T hub.

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 da hub IoT ad altri servizi di Azure per il routing dei messaggi, il caricamento di file e l'importazione/esportazione bulk dei dispositivi. È possibile scegliere l'identità gestita da usare per ogni hub IoT connettività in uscita 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 assegnazione > di ruolo.

    Screenshot showing Access control (IAM) page with Add role assignment menu open.

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

    Nota

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

    Screenshot showing Add role assignment page with Role tab selected.

  5. Nella scheda Membri selezionare Identità gestita e quindi selezionare 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 del 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 usando 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 Save (Salva). Questo vale anche per l'account di archiviazione e il bus di servizio. Altre informazioni sul supporto di hub IoT per le reti virtuali.

    Nota

    È necessario completare i passaggi precedenti per assegnare l'identità gestita l'accesso corretto prima di aggiungere l'hub eventi come endpoint personalizzato in 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 di Hub eventi Usare il menu a discesa per selezionare uno spazio dei nomi di Hub eventi esistente nella sottoscrizione.
    Istanza dell'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 that shows event hub endpoint with user assigned authentication.

  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

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

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

  2. Seleziona Controllo di accesso (IAM).

  3. Selezionare Aggiungi assegnazione > di ruolo.

    Screenshot showing Access control (IAM) page with Add role assignment menu open.

  4. Nella scheda Ruolo selezionare Archiviazione Collaboratore dati BLOB. (Non selezionare Collaboratore o collaboratore Archiviazione account.

  5. Nella scheda Membri selezionare Identità gestita e quindi selezionare 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 del 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 usando 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 della risorsa 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 Save (Salva). Altre informazioni sul supporto di 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 in hub IoT per il caricamento dei 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 intende usare nell'archivio BLOB, configurare le impostazioni di notifica file, sas TTL, TTL predefinito e Numero massimo di recapito 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.

    Screen shot that shows file upload with 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 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 dei 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 assegnazione > di ruolo.

    Screenshot showing Access control (IAM) page with Add role assignment menu open.

  4. Nella scheda Ruolo selezionare Archiviazione Collaboratore dati BLOB. (Non selezionare Collaboratore o collaboratore Archiviazione account.

  5. Nella scheda Membri selezionare Identità gestita e quindi selezionare 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 del 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 usando 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 nel processo di importazione.
  • outputBlobContainerUri: impostare questa proprietà per i processi di importazione ed esportazione.
  • identity: impostare il valore sull'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 identità gestite assegnate dall'utente né assegnate 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: