MQTT 用戶端的存取控制
存取控制可讓您使用角色型存取控制模型來管理用戶端發佈或訂閱主題的授權。 鑑於 IoT 環境的規模龐大,將每個用戶端的權限指派給每個主題非常繁瑣。 Azure 事件方格的 MQTT 代理功能可透過將用戶端和主題分組到用戶端群組和主題空間,來解決此規模挑戰。
存取控制模型的主要元件包括:
用戶端代表需要發佈和/或訂閱 MQTT 主題的裝置或應用程式。
用戶端群組是一組用戶端,需要相同的存取權來發佈和/或訂閱相同的 MQTT 主題集。 用戶端群組代表 RBAC 模型中的主體。
主題空間代表透過一組主題範本的多個主題。 主題範本是支援變數以及 MQTT 萬用字元的 MQTT 篩選延伸模組。 每個主題空間都代表一組相同用戶端需要用來通訊的主題。 主題空間代表 RBAC 模型中的資源。
權限繫結將存取權授與特定用戶端群組,以發佈或訂閱特定主題空間所代表的主題。 權限繫結代表 RBAC 模型中的角色。
範例:
下列範例詳細說明如何根據下列需求設定存取控制模型。
範例 1:
工廠具有多個區域,包括需要彼此通訊的電腦。 不過,不允許來自工廠其他區域的電腦與其通訊。
用戶端 | Role | 主題/主題篩選 |
---|---|---|
Area1_Machine1 | 發行者 | areas/area1/machines/machine1 |
Area1_Machine2 | 訂閱者 | areas/area1/machines/# |
Area2_Machine1 | 發行者 | areas/area2/machines/machine1 |
Area2_Machine2 | 訂閱者 | areas/area2/machines/# |
組態
- 為每部電腦建立用戶端資源。
- 為每個工廠區域電腦建立用戶端群組。
- 為每個區域建立主題空間,代表區域電腦通訊的主題。
- 為每個區域用戶端群組建立兩個權限繫結,以發佈和訂閱其對應的區域主題空間。
用戶端 | 用戶端群組 | 權限繫結 | 主題空間 |
---|---|---|---|
Area1_Machine1 | Area1Machines | Area1-Pub | Area1Messages -Topic Template: areas/area1/machines/# |
Area1_Machine2 | Area1Machines | Area1-Sub | Area1Messages -Topic Template: areas/area1/machines/# |
Area2_Machine1 | Area2Machines | Area2-Pub | Area2Messages -Topic Template: areas/area2/machines/# |
Area2_Machine2 | Area2Machines | Area2-Sub | Area2Messages -Topic Template: areas/area2/machines/# |
範例 2:
假設前一個範例的額外需求:每個區域都有管理用戶端以及電腦,而且如果其中任一電腦遭到入侵,則電腦不得具備發佈的存取權。 另一方面,管理用戶端需要發佈存取權,才能將命令傳送至電腦,並訂閱從電腦接收遙測的存取權。
用戶端 | Role | 主題/主題篩選 |
---|---|---|
Area1_Machine1 | 發行者 | areas/area1/machines/machine1 |
訂閱者 | areas/area1/mgmt/# | |
Area1_Mgmt1 | 發行者 | areas/area1/mgmt/machine1 |
訂閱者 | areas/area1/machines/# | |
Area2_Machine1 | 發行者 | areas/area2/machines/machine1 |
訂閱者 | areas/area2/mgmt/# | |
Area2_ Mgmt1 | 發行者 | areas/area2/mgmt/machine1 |
訂閱者 | areas/area2/machines/# |
設定:
- 為每部電腦和管理用戶端建立用戶端資源。
- 為每個區域建立兩個用戶端群組:一個用於管理用戶端,另一個用於電腦。
- 為每個區域建立兩個主題空間:一個代表遙測主題,另一個代表命令主題。
- 為每個區域的管理用戶端建立兩個權限繫結,以發佈至命令主題空間及訂閱遙測主題空間。
- 為每個區域的電腦建立兩個權限繫結,以訂閱命令主題空間及發佈至遙測主題空間。
用戶端 | 用戶端群組 | 權限繫結 | 主題/主題篩選 |
---|---|---|---|
Area1_Machine1 | Area1Machines | Area1Machines-Pub | Area1Telemetry -Topic Template: areas/area1/machines/# |
Area1Machines-Sub | Area1Commands -Topic Template: areas/area1/mgmt/# | ||
Area1_MgmtClient1 | Area1Mgmt | Area1Mgmt-Pub | Area1Commands -Topic Template: areas/area1/mgmt/# |
Area1Mgmt-Sub | Area1Telemetry -Topic Template: areas/area1/machines/# | ||
Area2_Machine1 | Area2Machines | Area2Machines-Pub | Area2Telemetry -Topic Template: areas/area2/machines/# |
Area2Machines-Sub | Area2Commands -Topic Template: areas/area2/mgmt/# | ||
Area2_ MgmtClient1 | Area2Mgmt | Area2Mgmt-Pub | Area2Commands -Topic Template: areas/area2/mgmt/# |
Area2Mgmt-Sub | Area2Telemetry -Topic Template: areas/area2/machines/# |
細微的存取控制
細微的存取控制可讓您控制用戶端群組內每個用戶端的授權,以發佈或訂閱自己的主題。 這個細微的存取控制是使用主題範本中的變數來達成。
雖然用戶端群組可以存取具有其所有主題範本的特定主題空間,但主題範本內的變數可讓您控制該用戶端群組內每個用戶端的授權,以發佈或訂閱自己的主題。 例如,如果用戶端群組 “machines” 包含兩個用戶端:“machine1” 和 “machine2”。 藉由使用變數,您可以允許只有 machine1 僅在 MQTT 主題 “machines/machine1/telemetry” 上發佈遙測,以及允許 “machine2” 在 MQTT 主題 “machines/machine2/telemetry” 上發佈訊息。
變數代表用戶端驗證名稱或用戶端屬性。 在與 MQTT 代理通訊期間,每個用戶端都會以替代的值取代 MQTT 主題中的變數。 例如,變數 ${client.authenticationName} 會取代為每個用戶端的驗證名稱:machine1、machine2 等等。MQTT 代理只允許存取具有符合其驗證名稱或指定屬性值之替代值的用戶端。
例如,請考慮下列設定:
- 用戶端群組:電腦
- 主題空間:MachinesTelemetry
- 主題範本 "machines/${client.authenticationName}/telemetry"。
- 權限繫結:用戶端群組:電腦;主題空間:machinesTelemetry;權限:發行者
使用此設定時,只有具備用戶端驗證名稱 “machine1” 的用戶端可以在主題 "machines/machine1/telemetry" 上發佈,只有具備用戶端驗證名稱 “machine 2” 的電腦可以在主題 "machines/machine2/telemetry" 上發佈,依此類推。 因此,machine2 無法代表 machine1 發佈虛假資訊,即使其可以存取相同的主題空間,反之亦然。
後續步驟:
深入了解授權和驗證: