3. IoT平台设备策略最小权限配置
策略边界:设备只能“发状态、收命令”
智能灯设备在 MQTT 上的最小权限可以收敛为两条:发布只允许写自己的状态上报主题,订阅只允许读自己的命令下发主题。任何跨设备、跨产品、通配符越权发布都应在平台侧被拒绝,而不是依赖设备端自律。
本案例使用如下主题约定({pid} 为产品 ID,{did} 为设备 ID):
- 状态上报(设备 → 云):
iot/{pid}/{did}/light/state - 命令下发(云 → 设备):
iot/{pid}/{did}/light/cmd
策略核心逻辑:
允许
允许
其余主题、其余动作一律 Deny(默认拒绝)。
允许
iot/light01/dev001/light/state 的 Publish;允许
iot/light01/dev001/light/cmd 的 Subscribe;其余主题、其余动作一律 Deny(默认拒绝)。
策略文档与关键字段
下面是一份可直接用于创建的最小权限策略示例。策略采用“显式允许 + 默认拒绝”的结构,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"
}
]
}
| 字段 | 取值 | 作用 |
|---|---|---|
| Effect | Allow | 仅显式允许的动作可通过,未列出即拒绝 |
| Action | iot:Publish / iot:Subscribe | 分别对应设备上报与接收命令 |
| Resource | 精确主题字符串 | 锁定到本设备本功能,防止跨设备访问 |
| Version | 2024-01-01 | 策略语法版本,按平台要求填写 |
验证越权发布被拒绝
验证时使用同一设备证书建立 MQTT 连接,分别执行合法发布与越权发布,观察平台返回码与日志。合法发布应成功,越权发布应收到拒绝或连接被断开。
- 使用设备证书连接 Broker,确认 TLS 握手成功。
- 向
iot/light01/dev001/light/state发布一条状态消息,预期成功。 - 向
iot/light01/dev002/light/state发布消息,预期被拒绝。 - 向
iot/light01/dev001/light/cmd执行发布(非订阅),预期被拒绝。 - 查看平台审计日志,确认出现
Not authorized或等价拒绝记录。
验证要点:越权发布被拒绝时,客户端可能表现为发布失败、连接被断开或收到错误码。只要平台侧日志明确记录拒绝,即说明策略生效。
不要为了“方便调试”在策略中加入
iot/+/+/light/state 或 iot/#。通配符会直接破坏最小权限边界,使一台设备可以冒充或干扰其他设备。
最小权限检查清单
| 检查项 | 通过标准 |
|---|---|
| 发布主题是否精确到设备 | Resource 含具体 pid 与 did,无通配符 |
| 订阅主题是否仅限命令 | 只允许 cmd 主题,不允许 state 或其他 |
| 是否默认拒绝 | 未显式允许的动作全部被拒绝 |
| 越权发布是否被拦截 | 跨设备发布返回拒绝并记录日志 |
| 合法发布是否正常 | 本设备 state 主题发布成功 |