你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

MQTT 客户端的访问控制

借助访问控制,可以使用基于角色的访问控制模型来管理客户端发布或订阅主题的授权。 鉴于 IoT 环境的巨大规模,为每个客户端分配对每个主题的权限极其繁琐。 Azure 事件网格的 MQTT 代理功能通过将客户端和主题分组到客户端组和主题空间中来应对这种规模挑战。

访问控制模型的主要组件包括:

一个客户端,代表需要发布和/或订阅 MQTT 主题的设备或应用程序。

一个客户端组,即一组客户端,它们需要对同一组 MQTT 主题拥有相同的发布和/或订阅访问权限。 客户端组代表 RBAC 模型中的主体。

一个主题空间,它通过一组主题模板代表多个主题。 主题模板是支持变量以及 MQTT 通配符的 MQTT 筛选器的扩展。 每个主题空间代表同一组客户端为了进行通信而需要使用的主题。 主题空间代表 RBAC 模型中的资源。

一个权限绑定,它向特定客户端组授予在特定主题空间所代表的主题上进行发布或订阅的访问权限。 权限绑定代表 RBAC 模型中的角色。

Diagram of the access control model.

示例:

以下示例详细说明了如何根据以下要求配置访问控制模型。

示例 1:

某家工厂有多个区域,每个区域包括需要相互通信的机器。 但是,不允许该工厂的其他区域中的机器与上述机器通信。

客户端 角色 主题/主题筛选器
Area1_Machine1 Publisher areas/area1/machines/machine1
Area1_Machine2 订阅者 areas/area1/machines/#
Area2_Machine1 Publisher areas/area2/machines/machine1
Area2_Machine2 订阅者 areas/area2/machines/#

Configuration

  • 为每台机器创建一个客户端资源。
  • 为每个工厂区域的机器创建一个客户端组。
  • 为每个区域创建一个主题空间,代表该区域的机器通信的主题。
  • 为每个区域的客户端组创建两个权限绑定,用于发布和订阅其相应区域的主题空间。
客户端 客户端组 权限绑定 主题空间
Area1_Machine1 Area1Machines Area1-Pub Area1Messages - 主题模板:areas/area1/machines/#
Area1_Machine2 Area1Machines Area1-Sub Area1Messages - 主题模板:areas/area1/machines/#
Area2_Machine1 Area2Machines Area2-Pub Area2Messages - 主题模板:areas/area2/machines/#
Area2_Machine2 Area2Machines Area2-Sub Area2Messages - 主题模板:areas/area2/machines/#

示例 2:

假设以上示例有一个额外的要求:每个区域包含管理客户端和机器,并且这些机器在遭到入侵的情况下,不得拥有发布访问权限。 另一方面,管理客户端需有发布访问权限才能向机器发送命令,并需有订阅访问权限才能从机器接收遥测数据。

客户端 角色 主题/主题筛选器
Area1_Machine1 Publisher areas/area1/machines/machine1
订阅者 areas/area1/mgmt/#
Area1_Mgmt1 Publisher areas/area1/mgmt/machine1
订阅者 areas/area1/machines/#
Area2_Machine1 Publisher areas/area2/machines/machine1
订阅者 areas/area2/mgmt/#
Area2_Mgmt1 Publisher areas/area2/mgmt/machine1
订阅者 areas/area2/machines/#

配置:

  • 为每个机器和管理客户端创建客户端资源。
  • 在每个区域创建两个客户端组:一个用于管理客户端,另一个用于机器。
  • 为每个区域创建两个主题空间:一个代表遥测主题,另一个代表命令主题。
  • 为每个区域的管理客户端创建两个权限绑定,以发布到命令主题空间并订阅遥测主题空间。
  • 为每个区域的机器创建两个权限绑定,以订阅命令主题空间并发布到遥测主题空间。
客户端 客户端组 权限绑定 主题/主题筛选器
Area1_Machine1 Area1Machines Area1Machines-Pub Area1Telemetry - 主题模板:areas/area1/machines/#
Area1Machines-Sub Area1Commands - 主题模板:areas/area1/mgmt/#
Area1_MgmtClient1 Area1Mgmt Area1Mgmt-Pub Area1Commands - 主题模板:areas/area1/mgmt/#
Area1Mgmt-Sub Area1Telemetry - 主题模板:areas/area1/machines/#
Area2_Machine1 Area2Machines Area2Machines-Pub Area2Telemetry - 主题模板:areas/area2/machines/#
Area2Machines-Sub Area2Commands - 主题模板:areas/area2/mgmt/#
Area2_ MgmtClient1 Area2Mgmt Area2Mgmt-Pub Area2Commands - 主题模板:areas/area2/mgmt/#
Area2Mgmt-Sub Area2Telemetry - 主题模板:areas/area2/machines/#

粒度访问控制

通过精细访问控制,可以控制客户端组中每个客户端发布或订阅其自己的主题的授权。 这种精细访问控制是通过在主题模板中使用变量来实现的。

即使客户端组可以使用其所有主题模板访问特定的主题空间,主题模板中的变量也使你能够控制该客户端组中每个客户端发布或订阅其自己的主题的授权。 例如,如果客户端组“machines”包含两个客户端:“machine1”和“machine2”。 通过使用变量,可以只允许 machine1 仅在 MQTT 主题“machines/machine1/telemetry”上发布其遥测数据,而“machine2”在 MQTT 主题“machines/machine2/telemetry”上发布消息。

变量代表客户端身份验证名称或客户端属性。 在与 MQTT 代理通信期间,每个客户端将使用替代值来替换 MQTT 主题中的变量。 例如,${client.authenticationName} 变量替换为每个客户端的身份验证名称:machine1、machine2 等。MQTT 代理只允许访问具有替代值的客户端,该替代值与身份验证名称或指定属性的值相匹配。

例如,请考虑以下配置:

  • 客户端组:Machines
  • 主题空间:MachinesTelemetry
    • 主题模板“machines/${client.authenticationName}/telemetry”。
  • 权限绑定:客户端组:machines;主题空间:machinesTelemetry;权限:发布者

如果使用此配置,只有客户端身份验证名称为“machine1”的客户端可以在主题“machines/machine1/telemetry”上发布,并且只有客户端身份验证名称为“machine 2”的机器可以在主题“machines/machine2/telemetry”上发布,依此类推。 因此,machine2 无法代表 machine1 发布虚假信息,即使它有权访问同一主题空间,反之亦然。

Diagram of the granular access control example.

后续步骤:

详细了解授权和身份验证: