3. IoT平台设备策略最小权限配置

IoT平台设备策略最小权限配置 学习卡片

策略边界:设备只能“发状态、收命令”

智能灯设备在 MQTT 上的最小权限可以收敛为两条:发布只允许写自己的状态上报主题,订阅只允许读自己的命令下发主题。任何跨设备、跨产品、通配符越权发布都应在平台侧被拒绝,而不是依赖设备端自律。

本案例使用如下主题约定({pid} 为产品 ID,{did} 为设备 ID):

  • 状态上报(设备 → 云):iot/{pid}/{did}/light/state
  • 命令下发(云 → 设备):iot/{pid}/{did}/light/cmd
策略核心逻辑:
允许 iot/light01/dev001/light/state 的 Publish;
允许 iot/light01/dev001/light/cmd 的 Subscribe;
其余主题、其余动作一律 Deny(默认拒绝)。
智能灯设备 dev001 证书身份已注册 MQTT over TLS IoT 策略引擎 默认拒绝 · 显式允许 Allow Publish iot/light01/dev001/ light/state Allow Subscribe iot/light01/dev001/ light/cmd Deny 其他全部 跨设备 / 通配符 / 其他动作 IoT 云平台 Broker 策略校验 审计日志 PUBLISH state SUBSCRIBE cmd PUBLISH 其他主题 越权发布结果 连接被拒绝 / 发布失败 日志记录 Not authorized

策略文档与关键字段

下面是一份可直接用于创建的最小权限策略示例。策略采用“显式允许 + 默认拒绝”的结构,Resource 精确到设备级主题,不使用 # 或 + 通配符。

{
  "Version": "2024-01-01",
  "Statement": [
    {
      "Sid": "AllowLightStatePublish",
      "Effect": "Allow",
      "Action": "iot:Publish",
      "Resource": "iot/light01/dev001/light/state"
    },
    {
      "Sid": "AllowLightCmdSubscribe",
      "Effect": "Allow",
      "Action": "iot:Subscribe",
      "Resource": "iot/light01/dev001/light/cmd"
    }
  ]
}
字段取值作用
EffectAllow仅显式允许的动作可通过,未列出即拒绝
Actioniot:Publish / iot:Subscribe分别对应设备上报与接收命令
Resource精确主题字符串锁定到本设备本功能,防止跨设备访问
Version2024-01-01策略语法版本,按平台要求填写

验证越权发布被拒绝

验证时使用同一设备证书建立 MQTT 连接,分别执行合法发布与越权发布,观察平台返回码与日志。合法发布应成功,越权发布应收到拒绝或连接被断开。

  1. 使用设备证书连接 Broker,确认 TLS 握手成功。
  2. 向 iot/light01/dev001/light/state 发布一条状态消息,预期成功。
  3. 向 iot/light01/dev002/light/state 发布消息,预期被拒绝。
  4. 向 iot/light01/dev001/light/cmd 执行发布(非订阅),预期被拒绝。
  5. 查看平台审计日志,确认出现 Not authorized 或等价拒绝记录。
验证要点:越权发布被拒绝时,客户端可能表现为发布失败、连接被断开或收到错误码。只要平台侧日志明确记录拒绝,即说明策略生效。
不要为了“方便调试”在策略中加入 iot/+/+/light/state 或 iot/#。通配符会直接破坏最小权限边界,使一台设备可以冒充或干扰其他设备。

最小权限检查清单

检查项通过标准
发布主题是否精确到设备Resource 含具体 pid 与 did,无通配符
订阅主题是否仅限命令只允许 cmd 主题,不允许 state 或其他
是否默认拒绝未显式允许的动作全部被拒绝
越权发布是否被拦截跨设备发布返回拒绝并记录日志
合法发布是否正常本设备 state 主题发布成功