使用 Microsoft Entra ID 控制对IoT 中心的访问

可以使用 Microsoft Entra ID 来对 Azure IoT 中心 服务 API 的请求进行身份验证,例如“创建设备标识”和“调用直接方法”。 还可以使用Azure基于角色的访问控制(Azure RBAC)来授权这些相同的服务 API。 通过结合使用这些技术,您可以授予一个 Microsoft Entra 安全主体访问 IoT 中心 服务 API 的权限。 此安全主体可以是用户、组或应用程序服务主体。

通过使用 Microsoft Entra ID 进行访问身份验证,并通过使用 Azure RBAC 控制权限,可以提高安全性,并比安全令牌更易于使用。 为了最大程度地减少安全令牌中固有的潜在安全问题,我们建议尽可能强制实施 Microsoft Entra 身份验证。

注意

IoT 中心 设备 API(例如设备到云的消息和更新报告的属性)不支持使用 Microsoft Entra ID 进行身份验证。 使用 symmetric 密钥X.509对设备进行身份验证到 IoT 中心。

身份验证和授权

身份验证是证明你自己的身份的过程。 身份验证用于验证用户或设备的身份以连接到 IoT 中心。 身份验证有时缩写为 AuthN

Authorization是确认IoT 中心上经过身份验证的用户或设备的权限的过程。 授权指定了你被允许访问的资源和命令,以及可以用这些资源和命令进行的操作。 授权有时缩写为 AuthZ。

当 Microsoft Entra 安全主体请求访问 IoT 中心 服务 API 时,主体首先身份验证。 要进行身份验证,请求需要在运行时包含 OAuth 2.0 访问令牌。 用于请求令牌的资源名称是 https://iothubs.chinacloudapi.cn。 如果应用程序在Azure资源(如 Azure VM、Azure Functions 应用或Azure 应用服务应用)中运行,则可以将其表示为 托管标识

对Microsoft Entra主体进行身份验证后,下一步是 授权。 在此步骤中,IoT 中心使用Microsoft Entra角色分配服务来确定主体拥有哪些权限。 如果主体的权限与请求的资源或 API 匹配,IoT 中心授权请求。 因此,此步骤需要向安全主体分配一个或多个Azure角色。 IoT 中心提供一些具有常见权限组的内置角色。

使用 Azure RBAC 角色分配管理对IoT 中心的访问权限

使用 Microsoft Entra ID 和 RBAC,IoT 中心要求请求 API 的主体具有适当的授权权限级别。 若要为主体授予权限,需为该主体分配角色。

为了确保最低特权,请始终在尽可能低的资源范围内分配适当的角色,这通常是IoT 中心范围。

IoT 中心提供以下Azure内置角色,用于使用 Microsoft Entra ID 和 RBAC 授权访问IoT 中心服务 API:

角色 说明
IoT 中心数据参与者 允许完全访问IoT 中心数据平面操作。
IoT 中心 数据读取者 允许对IoT 中心数据平面属性进行完全读取访问。
IoT 中心 注册表参与者 允许完全访问IoT 中心设备注册表。
IoT 中心孪生参与者 允许对所有IoT 中心设备和模块孪生进行读写访问。

还可以通过组合所需的 权限 来创建用于 IoT 中心 的自定义角色。 有关详细信息,请参阅Azure自定义角色

资源范围

在向安全主体分配Azure RBAC 角色之前,请确定安全主体应具有的访问范围。 无论何时,最好都只授予最窄的可能范围。 Azure在更广泛的范围内定义的 RBAC 角色由它们下面的资源继承。

此列表描述从最窄的范围开始,可以限定对IoT 中心的访问权限的级别:

  • IoT 中心。 在此范围,角色分配将应用于 IoT 中心。 没有比单个 IoT 中心更小的范围。 不支持在更小的范围(例如单个设备标识)内进行角色分配。
  • 资源组。 在此范围,角色分配将应用于资源组中的所有 IoT 中心。
  • 订阅。 在此范围,角色分配将应用于订阅中所有资源组内的所有 IoT 中心。
  • 一个管理小组。 在此范围内,角色分配将应用于管理组中所有订阅的所有资源组内的所有 IoT 中心。

IoT 中心服务 API 的权限

下表描述了可用于IoT 中心服务 API 操作的权限。 要使客户端能够调用特定的操作,请确保该客户端的已分配 RBAC 角色为该操作提供足够的权限。

RBAC 操作 说明
Microsoft.Devices/IotHubs/devices/read 读取任何设备或模块标识。
Microsoft.Devices/IotHubs/devices/write 创建或更新任何设备或模块标识。
Microsoft.Devices/IotHubs/devices/delete 删除任何设备或模块标识。
Microsoft.Devices/IotHubs/twins/read 读取任何设备或模块孪生。
Microsoft.Devices/IotHubs/twins/write 写入任何设备或模块孪生。
Microsoft.Devices/IotHubs/jobs/read 返回作业列表。
Microsoft.Devices/IotHubs/jobs/write 创建或更新任何任务。
Microsoft.Devices/IotHubs/jobs/delete 删除任何作业。
Microsoft.Devices/IotHubs/cloudToDeviceMessages/send/action 向任何设备发送面向设备的云消息。
Microsoft.Devices/IotHubs/cloudToDeviceMessages/feedback/action 接收、完成或丢弃云到设备的消息反馈通知。
Microsoft.Devices/IotHubs/cloudToDeviceMessages/queue/purge/action 删除设备的所有挂起命令。
Microsoft.Devices/IotHubs/directMethods/invoke/action 在任何设备或模块上调用直接方法。
Microsoft.Devices/IotHubs/fileUpload/notifications/action 接收、完成或丢弃文件上传通知。
Microsoft.Devices/IotHubs/statistics/read 读取设备和服务统计信息。
Microsoft.Devices/IotHubs/configurations/read 读取设备管理配置。
Microsoft.Devices/IotHubs/configurations/write 创建或更新设备管理配置。
Microsoft.Devices/IotHubs/configurations/delete 删除任何设备管理配置。
Microsoft.Devices/IotHubs/configurations/applyToEdgeDevice/action 将配置内容应用于边缘设备。
Microsoft.Devices/IotHubs/configurations/testQueries/action 验证配置的目标条件和自定义指标查询。

提示

注意

若要使用 Microsoft Entra ID 从IoT 中心获取数据,将路由设置为自定义事件中心终结点。 若要访问 内置的事件中心兼容终结点,请使用与以前一样连接字符串(共享访问密钥)方法。

强制实施Microsoft Entra身份验证

默认情况下,IoT 中心通过 Microsoft Entra ID 和 共享访问策略和安全令牌支持服务 API 访问。 若要最大程度地减少安全令牌中固有的潜在安全漏洞,可以禁止使用共享访问策略进行访问。

警告

通过拒绝使用共享访问策略的连接,使用此方法进行连接的所有用户和服务将立即失去访问权限。 值得注意的是,由于设备预配服务(DPS)仅支持使用共享访问策略链接 IoT 中心,所有设备预配流都失败,并出现“未授权”错误。 请仔细操作,并计划将访问权限替换为Microsoft Entra基于角色的访问。

如果使用设备预配服务,请不要继续操作。

  1. 确保服务客户端和用户对 IoT 中心拥有足够的访问权限。 遵循最低特权原则

  2. 登录到 Azure 门户并导航到 IoT 中心。

  3. 从导航菜单的“安全设置”部分选择“共享访问策略”。

  4. 在“使用共享访问策略连接”下,选择“拒绝”,然后查看警告。

    显示如何关闭 IoT 中心共享访问策略的截图。

  5. 选择“保存”。

现在只能通过 Microsoft Entra ID 和 RBAC 访问IoT 中心服务 API。

在 Azure 门户中访问 Microsoft Entra ID

可以使用共享访问策略或Microsoft Entra权限从Azure门户提供对IoT 中心的访问权限。

尝试从 Azure 门户访问 IoT 中心 时,Azure 门户会首先检查您是否被分配了一个具有 Microsoft.Devices/iotHubs/listkeys/action 的 Azure 角色。 如果有,Azure门户使用共享访问策略中的密钥来访问IoT 中心。 如果条件不满足,Azure 门户将尝试通过您的 Microsoft Entra 帐户访问数据。

若要使用 Microsoft Entra 帐户从 Azure 门户访问IoT 中心,需要有权访问IoT 中心数据资源(如设备和孪生)。 还需要权限才能转到Azure门户中的IoT 中心资源。 IoT 中心提供的内置角色授予对设备和孪生等资源的访问权限,但不会授予对IoT 中心资源的访问权限。 因此,访问门户还需要分配 Azure 资源管理器角色,例如 Reader。 读取者角色是一种不错的选择,因为它是允许在门户中导航的最受限制的角色。 它不包括 Microsoft.Devices/iotHubs/listkeys/action 权限(通过共享访问策略提供对所有IoT 中心数据资源的访问权限)。

若要确保帐户在分配的权限之外没有访问权限,请在创建自定义角色时不包括 Microsoft.Devices/iotHubs/listkeys/action 权限。 例如,若要创建一个可以读取设备标识但不能创建或删除设备的自定义角色,请创建符合以下要求的自定义角色:

  • 具有 Microsoft.Devices/IotHubs/devices/read 数据操作。
  • 没有 Microsoft.Devices/IotHubs/devices/write 数据操作项。
  • 没有 Microsoft.Devices/IotHubs/devices/delete 数据操作。
  • 没有 Microsoft.Devices/iotHubs/listkeys/action 功能。

然后,请确保帐户没有具有 Microsoft.Devices/iotHubs/listkeys/action 权限的任何其他角色,例如 OwnerContributor。 要使该帐户拥有资源访问权限并可以在门户中导航,请分配读取者角色。

通过Azure CLI访问Microsoft Entra ID

针对IoT 中心的大多数命令都支持Microsoft Entra身份验证。 可以使用 --auth-type 参数(接受 keylogin 值)来控制用于运行命令的身份验证类型。 key 值为默认值。

  • --auth-type 具备 key 值时,CLI 会在与 IoT 中心 交互时,自动发现合适的策略。

  • --auth-type 拥有 login 值时,将使用来自登录主体的 Azure CLI 访问令牌来进行操作。

有关详细信息,请参阅 Azure CLI 发布页的 Azure IoT 扩展

SDK 示例

后续步骤