IoT 中樞支援受控識別
受控識別會以安全的方式,以 Microsoft Entra ID 提供 Azure 服務自動受控識別。 這可消除開發人員必須藉由提供身分識別來管理認證的需求。 有兩種受控識別:系統指派和使用者指派。 IoT 中樞同時支援這兩者。
在IoT 中樞中,受控識別可用於從IoT 中樞到其他 Azure 服務的輸出連線,以取得訊息路由 、 檔案上傳 和 大容量裝置匯入/匯出 等 功能。 在本文中,您將瞭解如何在 IoT 中樞中使用系統指派和使用者指派的受控識別,以取得不同的功能。
必要條件
系統指派的受控識別
在 Azure 入口網站 中啟用或停用系統指派的受控識別
登入Azure 入口網站並流覽至您的 IoT 中樞。
從導覽功能表的 [ 安全性設定 ] 區段選取 [身分識別 ]。
選取 [ 系統指派] 索引卷 標。
將系統指派的受控識別 狀態 設定為 [ 開啟 ] 或 [關閉 ],然後選取 [ 儲存 ]。
注意
當系統指派的受控識別正在使用時,您無法關閉系統指派的受控識別。 在停用此功能之前,請確定沒有任何自訂端點使用系統指派的受控識別驗證。
使用 ARM 範本在中樞建立時啟用系統指派的受控識別
若要在資源布建階段在您的 IoT 中樞中啟用系統指派的受控識別,請使用下面的 Azure Resource Manager (ARM) 範本。
{
"$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
}
}
]
}
}
}
]
}
取代資源 name
、 location
SKU.name
和 SKU.tier
的值之後,您可以使用 Azure CLI,使用下列專案在現有的資源群組中部署資源:
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>
建立資源之後,您可以使用 Azure CLI 擷取指派給中樞的系統指派:
az resource show --resource-type Microsoft.Devices/IotHubs --name <iot-hub-resource-name> --resource-group <resource-group-name>
使用者指派的受控識別
在本節中,您將瞭解如何使用 Azure 入口網站,從 IoT 中樞新增和移除使用者指派的受控識別。
首先,您必須建立使用者指派的受控識別作為獨立資源。 若要這樣做,您可以遵循建立使用者指派的受控識別 中的 指示。
移至 IoT 中樞,流覽至 IoT 中樞入口網站中的身分識別 。
在 [使用者指派] 索引 標籤底 下,按一下 [ 建立使用者指派的受控識別 關聯]。 選擇您要新增至中樞的使用者指派受控識別,然後按一下 [ 選取 ]。
您可以從 IoT 中樞移除使用者指派的身分識別。 選擇您要移除的使用者指派身分識別,然後按一下 [ 移除 ] 按鈕。 請注意,您只會從 IoT 中樞移除它,而且此移除不會刪除使用者指派的身分識別作為資源。 若要將使用者指派的身分識別刪除為資源,請遵循刪除使用者指派的受控識別 中的 指示。
使用 ARM 範本在中樞建立時啟用使用者指派的受控識別
下列範例範本可用來建立具有使用者指派受控識別的中樞。 此範本會建立一個使用者指派的身分識別,其名稱 為 [iothub-name-provided]-identity ,並指派給建立的 IoT 中樞。 您可以視需要變更範本來新增多個使用者指派的身分識別。
{
"$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>
建立資源之後,您可以使用 Azure CLI 在中樞中擷取使用者指派的受控識別:
az resource show --resource-type Microsoft.Devices/IotHubs --name <iot-hub-resource-name> --resource-group <resource-group-name>
從IoT 中樞到其他 Azure 資源的輸出連線
受控識別可用於從IoT 中樞到其他 Azure 服務的輸出連線,以進行 訊息路由 、 檔案上傳 和 大容量裝置匯入/匯出 。 您可以選擇要用於每個IoT 中樞輸出連線到客戶擁有端點的受控識別,包括儲存體帳戶、事件中樞和服務匯流排端點。
注意
只有系統指派的受控識別,才能提供 IoT 中樞對私人資源的存取權。 如果您想要使用使用者指派的受控識別,則必須啟用這些私人資源的公用存取權,才能允許連線。
使用受控識別設定訊息路由
在本節中,我們會使用 訊息路由 傳送至事件中樞自訂端點作為範例。 此範例也適用于其他路由自訂端點。
移至Azure 入口網站中的事件中樞,將受控識別指派給正確的存取權。
選取 [存取控制 (IAM)]。
選取 [新增 > 角色指派 ]。
在 [ 角色] 索引標籤上,選取 [Azure 事件中樞資料傳送者 ]。
注意
針對儲存體帳戶,選取 [儲存體 Blob 資料參與者 [非 參與者] 或 [儲存體帳戶參與者 ] 作為角色。 針對服務匯流排,選取 [Azure 服務匯流排資料傳送者 ]。
在 [ 成員] 索引標籤上,選取 [受控識別 ],然後選取 [ 選取成員 ]。
針對使用者指派的受控識別,選取您的訂用帳戶、選取 [使用者指派的受控識別 ],然後選取使用者指派的受控識別。
針對系統指派的受控識別,選取您的訂用帳戶,選取 [所有系統指派的受控識別 ],然後選取IoT 中樞的資源名稱。
在 [檢閱 + 指派] 索引標籤上,選取 [檢閱 + 指派] 以指派角色。
如需角色指派的詳細資訊,請參閱 使用 Azure 入口網站 指派 Azure 角色
如果您需要透過 VNet 限制對自訂端點的連線,您必須開啟受信任的 Microsoft 第一方例外狀況,以讓您的 IoT 中樞存取特定端點。 例如,如果您要新增事件中樞自訂端點,請流覽至 事件中樞中的 [防火牆和虛擬網路 ] 索引標籤,然後啟用 [ 允許從選取的網路 存取] 選項。 在 [ 例外狀況] 清單中,核取 [ 允許信任Microsoft 服務存取事件中樞的 方塊。 按一下 [儲存] 按鈕。 這也適用于儲存體帳戶和服務匯流排。 深入瞭解 虛擬網路 IoT 中樞支援。
注意
您必須完成上述步驟,才能將受控識別指派正確的存取權,再將事件中樞新增為IoT 中樞中的自訂端點。 請稍候幾分鐘,讓角色指派傳播。
接下來,移至 IoT 中樞。 在您的中樞中,流覽至 [訊息路由 ],然後選取 [ 新增 ]。
在 [ 端點] 索引標籤上,提供下列資訊,為您的事件中樞建立端點:
參數 值 端點類型 選取 [事件中樞]。 端點名稱 提供新端點的唯一名稱,或選取 [ 選取現有 ] 以選擇現有的事件中樞端點。 事件中樞命名空間 使用下拉式功能表來選取訂用帳戶中的現有事件中樞命名空間。 事件中樞實例 使用下拉式功能表來選取命名空間中的現有事件中樞。 驗證類型 選取 [使用者指派 ],然後使用下拉式功能表來選取 您在事件中樞中建立的使用者指派身 分識別。 選取 [ 建立 + 下一步 ]。 您可以繼續精靈來建立指向此端點的路由,也可以關閉精靈。
您可以變更現有自訂端點的驗證類型。 使用下列步驟來修改端點:
在 IoT 中樞中,選取左側流覽窗格中的 [訊息路由 ],然後 選取 [自訂端點 ]。
選取您要修改之自訂端點的核取方塊,然後選取 [ 變更驗證類型 ]。
為此端點選擇新的驗證類型,然後選取 [ 儲存 ]。
使用受控識別來設定檔案上傳
IoT 中樞的 檔案上傳 功能可讓裝置將檔案上傳至客戶擁有的儲存體帳戶。 若要允許檔案上傳運作,IoT 中樞必須能夠連線到儲存體帳戶。 與訊息路由類似,您可以挑選慣用的驗證類型和受控識別,以IoT 中樞輸出連線到您的Azure 儲存體帳戶。
在 Azure 入口網站中,瀏覽至您的儲存體帳戶。
選取 [存取控制 (IAM)]。
選取 [新增 > 角色指派 ]。
在 [角色] 索引 標籤上,選取 [儲存體 Blob 資料參與者 ]。 (不要選取 參與者 或 儲存體帳戶參與者 。
在 [ 成員] 索引標籤上,選取 [受控識別 ],然後選取 [ 選取成員 ]。
針對使用者指派的受控識別,選取您的訂用帳戶、選取 [使用者指派的受控識別 ],然後選取使用者指派的受控識別。
針對系統指派的受控識別,選取您的訂用帳戶,選取 [所有系統指派的受控識別 ],然後選取IoT 中樞的資源名稱。
在 [檢閱 + 指派] 索引標籤上,選取 [檢閱 + 指派] 以指派角色。
如需角色指派的詳細資訊,請參閱 使用 Azure 入口網站 指派 Azure 角色
如果您需要透過 VNet 限制儲存體帳戶的連線能力,您必須開啟受信任的 Microsoft 第一方例外狀況,讓您的 IoT 中樞能夠存取儲存體帳戶。 在您的儲存體帳戶資源頁面上,流覽至 [防火牆和虛擬網路] 索引卷 標,然後啟用 [ 允許從選取的網路 存取] 選項。 在 [ 例外狀況] 清單中,核取 [ 允許信任Microsoft 服務存取此儲存體帳戶 的方塊。 按一下 [儲存] 按鈕。 深入瞭解 虛擬網路 IoT 中樞支援。
注意
您必須完成上述步驟,才能將受控識別指派正確的存取權,再將儲存體帳戶儲存在 IoT 中樞 中,以使用受控識別進行檔案上傳。 請稍候幾分鐘,讓角色指派傳播。
在 IoT 中樞的資源頁面上,流覽至 [ 檔案上傳 ] 索引標籤。
在顯示的頁面上,選取您想要在 Blob 儲存體中使用的容器、設定 檔案通知設定、SAS TTL、預設 TTL 和所需傳遞計數 上限。 選擇慣用的驗證類型,然後按一下 [ 儲存 ]。 如果您在此步驟中收到錯誤,請暫時將儲存體帳戶設定為允許從 所有網路 進行存取,然後再試一次。 一旦檔案上傳組態完成,您就可以在儲存體帳戶上設定防火牆。
注意
在檔案上傳案例中,中樞和裝置都必須與儲存體帳戶連線。 上述步驟適用于將 IoT 中樞連線到具有所需驗證類型的儲存體帳戶。 您仍然需要使用 SAS URI 將裝置連線到儲存體。 現在,SAS URI 會使用 連接字串產生。 我們即將新增支援,以使用受控識別產生 SAS URI。 請遵循檔案上傳 中的 步驟。
使用受控識別設定大容量裝置匯入/匯出
IoT 中樞支援從 客戶提供的儲存體 Blob 大量匯入/匯出裝置 資訊的功能。 此功能需要從IoT 中樞連線到儲存體帳戶。
在 Azure 入口網站中,瀏覽至您的儲存體帳戶。
選取 [存取控制 (IAM)]。
選取 [新增 > 角色指派 ]。
在 [角色] 索引 標籤上,選取 [儲存體 Blob 資料參與者 ]。 (不要選取 參與者 或 儲存體帳戶參與者 。
在 [ 成員] 索引標籤上,選取 [受控識別 ],然後選取 [ 選取成員 ]。
針對使用者指派的受控識別,選取您的訂用帳戶、選取 [使用者指派的受控識別 ],然後選取使用者指派的受控識別。
針對系統指派的受控識別,選取您的訂用帳戶,選取 [所有系統指派的受控識別 ],然後選取IoT 中樞的資源名稱。
在 [檢閱 + 指派] 索引標籤上,選取 [檢閱 + 指派] 以指派角色。
如需角色指派的詳細資訊,請參閱 使用 Azure 入口網站 指派 Azure 角色
使用 REST API 或 SDK 進行匯入和匯出作業
您現在可以使用 Azure IoT REST API 來建立匯入和匯出作業。 您必須在要求本文中提供下列屬性:
- storageAuthenticationType :將值設定為 identityBased 。
- inputBlobContainerUri :只在匯入作業中設定此屬性。
- outputBlobContainerUri :針對匯入和匯出作業設定此屬性。
- identity :將值設定為要使用的受控識別。
Azure IoT 中樞 SDK 也支援服務用戶端登錄管理員中的這項功能。 下列程式碼片段示範如何使用 C# SDK 在 中起始匯入作業或匯出作業。
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
});
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>"
)
))
注意
- 如果 storageAuthenticationType 設定為 identityBased 且 userAssignedIdentity 屬性不是 Null ,則作業會使用指定的使用者指派受控識別。
- 如果未使用 userAssignedIdentity 中指定的 使用者指派受控識別來設定 IoT 中樞,作業將會失敗。
- 如果 storageAuthenticationType 設定為 identityBased userAssignedIdentity 屬性為 null,作業將會使用系統指派的身分識別。
- 如果未使用使用者指派的受控識別來設定 IoT 中樞,則工作將會失敗。
- 如果 storageAuthenticationType 設定為 identityBased ,且中樞上未 設定使用者指派 或 系統指派的 受控識別,作業將會失敗。
SDK 範例
下一步
使用下列連結來深入瞭解IoT 中樞功能: