3. 授权模型设计原则:最小权限、职责分离、默认拒绝

好,我们进入第三讲。前面聊了 Topic 授权模型的基础概念,今天要讲的这三个原则,才是真正决定你系统安全下限的东西。

我见过太多物联网平台,功能做得花里胡哨,结果授权模型一塌糊涂。说白了,就是这三个原则没吃透。咱们一个一个来拆。

3.1 最小权限原则

这个原则听起来简单——只给刚刚好的权限,不多给一分。但实际落地的时候,坑特别多。

核心思想: 每个主体(设备、用户、服务)只拥有完成其任务所必需的最小权限集合。

我个人的经验法则: 如果你在写授权策略时,觉得“这个权限可能以后用得上”,那就先别给。以后用得上,以后再加。

3.1.1 为什么容易违反?

你想想看,开发的时候图省事,直接把“管理员”角色甩给设备。结果呢?一个温度传感器居然有固件升级权限。这不是给自己埋雷吗?

我在一个智能楼宇项目里就遇到过这种事。一个门禁控制器,因为绑了“超级设备”角色,居然能修改其他楼层的空调策略。后来排查了三天才发现是权限过大导致的。

3.1.2 在 Topic 模型中的落地

在 MQTT 或类似的 Topic 授权模型里,最小权限原则具体表现为:

  • Topic 路径精确匹配: 能写 device/001/temp,就别用 device/001/#
  • 操作类型限制: 只读设备就别给 publish 权限
  • 时间窗口约束: 某些设备只在特定时段需要权限
场景 错误做法 正确做法
温度传感器上报 允许 publish 所有 topic 只允许 publish sensor/temperature/+/data
手机 App 查看设备 赋予设备管理权限 只赋予订阅设备状态 topic 的权限
OTA 升级服务 允许读写所有设备 topic 只允许向指定设备 topic 发布升级指令

小技巧: 我习惯在授权策略里加一个“权限清单”注释块,每次新增权限都写清楚理由。三个月后回头看,能砍掉至少 30% 的多余权限。

3.2 职责分离

这个原则说白了就是:不能让一个人(或一个设备)既当运动员又当裁判员。

核心思想: 将敏感操作拆分成多个步骤,由不同主体分别执行,避免单点滥用。

3.2.1 为什么需要职责分离?

我记得有个客户,他们的智能门锁系统里,同一个设备既能开锁又能记录开锁日志。结果出了安全事故后,日志被删得干干净净。这就是典型的职责未分离。

你想想看,如果开锁和记日志是两个不同的服务,一个被攻破,另一个还能留下证据。

3.2.2 在 Topic 授权中的典型场景

  • 设备注册 vs 设备激活: 注册服务只能写入注册 topic,激活服务只能读取并处理激活请求
  • 命令下发 vs 状态确认: 控制服务能 publish 命令,但只有设备自身能 publish 状态确认
  • 策略配置 vs 策略审计: 配置人员能修改授权策略,审计人员只能读取

注意: 职责分离不是简单的“多设几个角色”。它要求你在流程设计上就拆开。我曾经见过一个系统,虽然分了三个角色,但三个角色用的是同一个 API Key——那跟没分有什么区别?

3.3 默认拒绝策略

这个原则最容易被忽视。很多人的思路是“先开放,再收紧”。但安全设计恰恰相反——先全部拒绝,再逐个放行。

核心思想: 任何未明确授权的访问,默认都是拒绝的。

3.3.1 默认拒绝 vs 默认允许

对比维度 默认拒绝 默认允许
安全基线 高,遗漏即保护 低,遗漏即漏洞
配置复杂度 初期稍高,需逐条添加 初期低,但后期难维护
审计难度 容易,所有权限都有记录 困难,不知道谁开了什么
典型风险 可能误拒正常请求 可能遗漏恶意访问

3.3.2 在 Topic 模型中的实现

在 Topic 授权模型里,默认拒绝策略通常通过以下方式实现:

  • ACL 默认规则: 在访问控制列表末尾添加一条“deny all”规则
  • 通配符黑名单: 先拒绝所有 # 通配符,再开放具体路径
  • 空角色策略: 新设备默认分配空角色,无任何权限
# 一个典型的默认拒绝 ACL 配置示例
# 注意:最后一条规则是拒绝所有

# 允许温度传感器上报数据
allow publish sensor/temperature/+/data from device:temp_sensor

# 允许手机 App 查看设备状态
allow subscribe device/+/status from user:app_user

# 默认拒绝所有其他操作
deny all

我的习惯: 在写 ACL 时,我会先把 deny all 写上去,然后再往上加 allow 规则。这样就不会漏掉。你试试看,这个顺序能帮你发现很多“我以为有权限但实际上没有”的情况。

3.4 三个原则的关系

这三个原则不是孤立的。它们互相支撑,形成一个完整的授权设计框架。

授权模型三原则关系图 安全授权模型 最小权限原则 职责分离原则 默认拒绝策略 三者协同效果: 最小权限 + 默认拒绝 = 攻击面最小化 职责分离 + 最小权限 = 权限滥用风险降低 粒度控制 Topic 路径精确到叶子节点 流程拆分 敏感操作分步执行 白名单思维 未明确允许即禁止

3.5 避坑指南

最后,分享几个我在项目中踩过的坑,希望能帮你少走弯路。

我曾经犯过的错:

  • 给设备配了 # 通配符权限,想着“以后扩展方便”。结果一个被攻破的灯泡,差点控制了整个楼宇系统。
  • 把“查看设备日志”和“删除设备日志”放在同一个角色里。审计的时候发现日志被人为清空过,但查不出是谁干的。
  • 默认允许了所有内网设备的访问。后来一个内部测试设备被暴露到公网,直接成了后门。

嗯,这三个原则说起来简单,但真正做好不容易。我建议你在设计授权模型时,先把这三个原则写在白板上,每加一条权限就问自己一遍:符合最小权限吗?有没有职责分离?默认拒绝了没有?

养成这个习惯,你的系统安全基线至少能提升一个档次。