使用 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 进行身份验证。 请使用对称密钥X.509 向 IoT 中心进行设备身份验证。

身份验证和授权

身份验证是证明你自己的身份的过程。 身份验证向 IoT 中心验证用户身份或设备标识。 它有时缩写为 AuthN。

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

当某个 Microsoft Entra 安全主体请求访问 IoT 中心服务 API 时,首先会对该主体的标识进行身份验证。 要进行身份验证,请求需要在运行时包含 OAuth 2.0 访问令牌。 用于请求令牌的资源名称是 https://iothubs.chinacloudapi.cn。 如果应用程序在 Azure VM、Azure Functions 应用或 Azure 应用服务应用之类的 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 资源管理器角色。 读取者角色是一种不错的选择,因为它是允许在门户中导航的最受限制的角色。 它不包含 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 权限的角色 - 例如所有者参与者。 要使该帐户拥有资源访问权限并可以在门户中导航,请分配读取者角色。

从 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 示例

后续步骤

  • 要详细了解在应用程序中使用 Microsoft Entra ID 的优点,请参阅与 Microsoft 标识平台集成
  • 若要了解如何在授权和身份验证中使用访问令牌、刷新令牌和 ID 令牌,请参阅安全令牌