使用 Microsoft Entra ID(预览版)控制对 Azure IoT 中心设备预配服务 (DPS) 的访问

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

与使用安全令牌相比,使用 Microsoft Entra ID 对访问进行身份验证并使用 Azure RBAC 控制权限能够提供更高的安全性与易用性。 为了最大限度地减少安全令牌中固有的潜在安全问题,我们建议尽可能将 Microsoft Entra ID 与 Azure IoT 中心设备预配服务 (DPS) 配合使用。

注意

Azure IoT 中心设备预配服务 (DPS) 设备 API(例如注册设备或设备注册状态查找)不支持使用 Microsoft Entra ID 进行身份验证。 使用对称密钥X.509 对设备的 Azure IoT 中心设备预配服务 (DPS) 进行身份验证。

身份验证和授权

当某个 Microsoft Entra 安全主体请求访问 Azure IoT 中心设备预配服务 (DPS) API 时,首先会对该主体的标识进行身份验证。 要进行身份验证,请求需要在运行时包含 OAuth 2.0 访问令牌。 用于请求令牌的资源名称是 https://azure-devices-provisioning.cn。 如果应用程序在 Azure VM、Azure Functions 应用或 Azure 应用服务应用之类的 Azure 资源中运行,可将其表示为托管标识。

对 Microsoft Entra 主体进行身份验证后,下一步是授权。 在此步骤中,Azure IoT 中心设备预配服务 (DPS) 使用 Microsoft Entra 角色分配服务来确定主体拥有哪些权限。 如果主体的权限与请求的资源或 API 匹配,则 Azure IoT 中心设备预配服务 (DPS) 将为该请求授权。 因此,此步骤要求将一个或多个 Azure 角色分配给安全主体。 Azure IoT 中心设备预配服务 (DPS) 提供一些拥有通用权限组的内置角色。

使用 Azure RBAC 角色分配管理对 Azure IoT 中心设备预配服务 (DPS) 的访问

在使用 Microsoft Entra ID 和 RBAC 的情况下,Azure IoT 中心设备预配服务 (DPS) 要求请求 API 的主体具有适当级别的授权权限。 若要为主体授予权限,需为该主体分配角色。

为确保符合最低特权原则,请始终在尽量最小的资源范围(可能是 Azure IoT 中心设备预配服务 (DPS) 范围)分配适当的角色。

Azure IoT 中心设备预配服务 (DPS) 提供了以下 Azure 内置角色以用于通过 Microsoft Entra ID 和 RBAC 授权访问 DPS API:

角色 说明
设备预配服务数据参与者 允许对设备预配服务数据平面操作进行完全访问。
设备预配服务数据读取器 允许对设备预配服务数据平面属性进行完全读取访问。

还可以通过组合所需的权限来定义与 Azure IoT 中心设备预配服务 (DPS) 配合使用的自定义角色。 有关详细信息,请参阅为 Azure 基于角色的访问控制创建自定义角色。

控制平面写入和共享访问策略密钥

该 Microsoft.Devices/provisioningServices/write 操作允许主体创建或更新 DPS 资源的任何属性,包括 authorizationPolicies 集合。 由于 CreateOrUpdate 的 Azure 资源管理器(ARM)协定接受调用方为每个策略提供的 primaryKey 和 secondaryKey 值,因此,持有 DPS 资源的 write 权限的主体可以:

  • 将任何共享访问策略(包括根 provisioningserviceowner 策略)的主键或次键设置为他们选择的值,然后以该策略进行认证。
  • 轮换任何共享访问策略的密钥,这将导致现有使用方失效。
  • 添加一个新的命名共享访问策略,并选定一个关键值。

因此, Microsoft.Devices/provisioningServices/write 在功能上等价于资源共享访问策略凭证的全面管理,无论主体是否持有 Microsoft.Devices/provisioningServices/listkeys/action 或 Microsoft.Devices/provisioningServices/listkey/action。

Important

自定义角色如果在DPS资源上授予 Microsoft.Devices/provisioningServices/write 但不授予 listkeys/action , 并不会 将凭证管理与资源配置隔离开来。 主体仍通过写路径完全控制共享访问策略密钥材料。 不要依赖这种模式来进行最小权限配置。

如果你需要将资源配置与共享访问策略的凭证管理分离,请使用以下模式之一:

  • 对于数据平面,优先使用 Microsoft Entra ID 身份验证。 为注册管理分配内置的 设备预配服务数据参与者 或 设备预配服务数据读取者 角色,并尽可能在该资源上禁用共享访问签名 (SAS) 访问。
  • 将 write 限制在资源范围内。 因为 write 涉及密钥控制,只授予你信任且拥有共享访问策略凭证的主体。
  • 审计控制平面活动。 通过控制平面 PUT 对 authorizationPolicies 所做的更改会在 Azure 活动日志中记录为 Microsoft.Devices/provisioningServices/write 操作。 在审计凭证访问时,将这些事件与 listkeys/action 事件一并审查。

同样的考虑也适用于 Azure IoT 中心。 详情请参见“通过使用 Microsoft Entra ID 控制对 IoT 中心 的访问。

资源范围

向安全主体分配 Azure RBAC 角色之前,请确定安全主体应具有的访问权限的范围。 无论何时,最好都只授予最窄的可能范围。 在较大范围内定义的 Azure RBAC 角色会被其下层资源继承。

此列表描述了可在哪些范围级别访问 IoT 中心,从最窄的范围开始:

  • Azure IoT 中心设备预配服务 (DPS)。 在此范围,角色分配将应用于 Azure IoT 中心设备预配服务 (DPS)。 不支持在更小范围(例如注册组或个人注册)进行角色分配。
  • 资源组。 在此范围,角色分配将应用于资源组中的所有 IoT 中心。
  • 订阅。 在此范围,角色分配将应用于订阅中所有资源组内的所有 IoT 中心。
  • 管理组。 在此范围,角色分配将应用于管理组的所有订阅中所有资源组内的所有 IoT 中心。

Azure IoT 中心设备预配服务 (DPS) API 的权限

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

RBAC 操作 说明
Microsoft.Devices/provisioningServices/attestationmechanism/details/action 获取证明机制详细信息
Microsoft.Devices/provisioningServices/enrollmentGroups/read 读取注册组
Microsoft.Devices/provisioningServices/enrollmentGroups/write 写入注册组
Microsoft.Devices/provisioningServices/enrollmentGroups/delete 删除注册组
Microsoft.Devices/provisioningServices/enrollments/read 读取注册信息
Microsoft.Devices/provisioningServices/enrollments/write 写入注册信息
Microsoft.Devices/provisioningServices/enrollments/delete 删除注册记录
Microsoft.Devices/provisioningServices/registrationStates/read 读取注册状态
Microsoft.Devices/provisioningServices/registrationStates/delete 删除注册状态

适用于 Azure CLI 的 Azure IoT 扩展

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

  • 当 --auth-type 的值为 key 时,CLI 在与 Azure IoT 中心设备预配服务 (DPS) 交互时会自动发现适当的策略。

  • 当 --auth-type 的值为 login 时,将使用已登录该主体的 Azure CLI 中的访问令牌来执行该操作。

  • 以下命令目前支持 --auth-type:

    • az iot dps enrollment
    • az iot dps enrollment-group
    • az iot dps registration

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

SDK 和示例

从 Azure 门户访问 Microsoft Entra ID

注意

目前在预览期间无法从 Azure 门户访问 Microsoft Entra ID。

后续步骤