Skip to content

8.4 数据安全与隐私保护

8.4.1 数据加密存储与密钥管理

设备上传的数据被加密传输到平台,通信链路的安全有了保障。但链路加密是“在路上”的保护,一旦数据落到磁盘、数据库或对象存储里,链路加密的效力就到头了。如果攻击者入侵了服务器、窃取了数据库备份,或者拿走了物理硬盘,存储层没有加密的数据就等于在裸奔——用户名、设备ID、传感器读数、位置信息全都能直接读取。

数据静态加密(Encryption at Rest)正是解决这个问题的手段。它确保数据在存储介质上始终以密文形式存在,只有持有正确密钥的应用进程才能解密读取。但在物联网场景里,静态加密比传统 Web 应用要复杂几个层次:设备种类多、密钥数量巨大、云边协同需要跨环境分发密钥,而且资源受限设备不能承受复杂的加解密运算。本节从工程角度拆解数据加密存储的几个关键环节——选什么算法、密钥怎么管、云边如何分离。

加密算法的选型:AES 仍是主力

对称加密算法中,AES(Advanced Encryption Standard)因为性能优秀、硬件加速支持广泛,是物联网数据加密存储的事实标准。AES 有三种密钥长度:128 位、192 位和 256 位。256 位提供最高的安全强度,但加解密速度比 128 位慢一些,在服务器端这个差距通常可以忽略,但在端侧 MCU 上就需要权衡。

实际部署时,推荐的做法是用 AES(例如 256 位)加密数据,然后用非对称算法(如 RSA 或 ECC)加密 AES 密钥本身——这叫信封加密(Envelope Encryption)。信封加密的好处是:数据量大时用对称算法加密效率高,而密钥量小,用非对称算法保护起来更灵活,也方便做访问控制。主流云平台的密钥管理服务普遍采用这种模式。

下面是一个使用 Python 实现对称加密并保存到本地文件的示例。说明: 这是一个演示示例,生产环境下密钥管理应由 KMS 或 HSM 负责,不应硬编码在代码里。本例使用 cryptography 库的 Fernet 封装(内部基于 AES-128-CBC + HMAC),实际应用中可根据需要选择 AES-256-GCM 等模式。

python
import os
from cryptography.fernet import Fernet

# 生成密钥(生产环境应由 KMS 生成并安全存储)
key = Fernet.generate_key()
cipher = Fernet(key)

# 待加密的传感器数据
sensor_data = b'{"device_id": "temp_001", "temperature": 23.5, "timestamp": 1700000000}'

# 加密
encrypted_data = cipher.encrypt(sensor_data)

# 存储到文件(示意:实际应写入数据库或对象存储)
with open('sensor_data.enc', 'wb') as f:
    f.write(encrypted_data)

# 解密
with open('sensor_data.enc', 'rb') as f:
    loaded_encrypted = f.read()

decrypted_data = cipher.decrypt(loaded_encrypted)
print(decrypted_data.decode())

这个例子演示了最基本的流程:密钥生成、加密、存储、读取解密。但工程里真正的难点不在加解密本身,而在密钥怎么生成、怎么分发、怎么轮换、怎么销毁。

密钥管理服务(KMS)与 HSM

密钥管理服务是解决密钥全生命周期问题的核心组件。以通用云 KMS 为例,它提供的核心能力包括:

  • 密钥生成:在安全的硬件环境里生成密钥,用户只能拿到密钥的引用 ID,拿不到明文密钥。
  • 密钥存储:密钥加密后存储,解密密钥的主密钥本身由 HSM 保护。
  • 密钥轮换:定期生成新密钥,旧密钥仍可解密历史数据,但新数据用新密钥加密。
  • 密钥撤销:一旦密钥泄露,可以立即禁用,阻止继续使用。
  • 审计日志:记录谁、在什么时候、用什么权限调用过哪个密钥。

这些功能在多个主流云厂商的密钥管理服务中均有实现。它们普遍支持信封加密:调用者用 KMS 生成一个数据密钥(Data Key),用数据密钥加密数据,然后把加密后的数据密钥和数据一起存储。解密时,调用者把加密的数据密钥发给 KMS,KMS 用主密钥解密后返回明文数据密钥。这样,真正的数据密钥只在内存中短暂存在,不会落盘。

对于高安全等级的场景,需要引入硬件安全模块(HSM,Hardware Security Module)。HSM 是专用的加密硬件,密钥物理上不能导出,所有加密操作都在 HSM 内部完成。云厂商提供云 HSM 服务,企业也可以采购物理 HSM 部署在自建机房。HSM 的成本远高于纯软件 KMS,通常只用于保护最核心的密钥(如 KMS 的主密钥),或满足特定合规要求。

密钥生命周期管理流程

下面这个密钥管理流程图描述了从密钥生成到销毁的全过程。这张图用泳道表示流程中涉及的角色,便于理解不同角色的职责。

图8-9 密钥生命周期管理与云边协同流程密钥从生成、分发、轮换到撤销和销毁有明确状态;撤销后云端与边缘都必须停止使用。图8-9 密钥生命周期管理与云边协同流程密钥从生成、分发、轮换到撤销和销毁有明确状态;撤销后云端与边缘都必须停止使用。云端边缘分发 (TLS)轮换 (TLS)撤销 (TLS)密钥生成使用中密钥轮换轮换中密钥撤销已撤销密钥销毁待销毁密钥接收与使用使用中密钥轮换轮换中密钥撤销已撤销 · 停止使用密钥销毁待销毁颜色=使用中(绿色)、轮换中(黄色)、已撤销/停用(红色)、待销毁(灰色)虚线箭头=通过 TLS 加密通道同步图8-9 云端作为密钥状态的权威源,分发、轮换、撤销均经 TLS 加密通道同步到边缘;撤销后边缘同状态密钥即停止使用,防止旧密钥继续有效。
图 8-9 密钥生命周期管理与云边协同流程

云端与边缘的密钥分离策略

物联网系统不像传统后端那样只有一个数据中心。数据可能从边缘网关产生、加密,再往上送,也可能在边缘侧被本地应用消耗。如果所有的密钥都集中存在云端,边缘侧断网时,加解密就全停了。正确的做法是分两层管理密钥。

第一层是云端的主密钥(Master Key),保存在 KMS 或 HSM 中,永不离开安全区域。主密钥的作用是派生和保护下一级密钥。

第二层是工作密钥(Working Key),分布在边缘网关或端侧设备上。工作密钥也有自己的生命周期,并且通常用密钥封装(Key Wrapping)技术保护:主密钥加密工作密钥,边缘在收到加密的工作密钥后,在本地安全环境(如 TEE [可信执行环境,Trusted Execution Environment])中解密并缓存。工作密钥只能用于特定的时间段或特定的数据域,到期自动替换,云端可以随时远程撤销泄露的工作密钥。

这种分离策略有几个好处:云端主密钥安全级别最高,很少暴露;边缘工作密钥即使被破解,也只影响局部数据,不波及全局;断网时边缘仍然能用已缓存的工作密钥处理本地数据。

工程权衡与检查清单

数据加密存储的强度不是越高越好,需要根据数据敏感度和成本做取舍。以下是一份工程检查清单,供评估现有或新建系统的加密存储方案时参考。

检查清单:数据加密存储与密钥管理

  • [ ] 所有持久化存储(数据库、对象存储、备份磁盘、日志)是否均启用了静态加密?
  • [ ] 密钥是否由独立的 KMS 或 HSM 管理,而非与应用代码或配置文件一起存放?
  • [ ] 是否实现了信封加密,且数据密钥(Data Key)的明文只在内存中短暂存在?
  • [ ] 密钥是否支持定期轮换?轮换策略是否兼顾兼容性(旧密钥仍可解密历史数据)?
  • [ ] 边缘和端侧的工作密钥是否与云端主密钥分离?工作密钥是否在可信执行环境中解密和缓存?
  • [ ] 是否具备密钥撤销能力?撤销后解密请求是否被有效拒绝?
  • [ ] 所有密钥操作是否记录审计日志?日志是否可以追溯“谁、何时、用什么密钥、做了什么”?
  • [ ] 是否对 HSM 或 KMS 进行了冗余部署?单点故障时加密服务是否可用?

下两小节将在此基础上,进一步讨论数据脱敏与匿名化技术(8.4.2),以及如何通过 RBAC/ABAC 模型精确控制谁能访问哪些数据(8.4.3)。

8.4.2 数据脱敏与匿名化技术

加密存储保障了数据的机密性,但数据最终要用于分析、训练模型,甚至需要开放给第三方合作伙伴。一旦数据从加密的数据库中被查询出来,呈现在报表或 API 响应中,就脱离了加密的保护范围。此时,即便数据是加密传输的,查询结果中包含的具体温度读数、GPS 坐标或设备 ID 依然是明文。数据脱敏与匿名化技术解决的就是这个问题:在数据“被看见”之前,先把敏感信息模糊化或去除,让数据能用但不能追溯到具体的个人或设备。

脱敏与匿名化的本质区别

脱敏和匿名化经常混用,但法律和技术上的含义完全不同。

脱敏是对数据进行可逆的或规则化的变换,目的是在非生产环境(如测试、开发)中保护敏感数据。典型的例子是把真实姓名替换成“张三”、“李四”这样的占位符,或者把手机号中间四位变成 ****。脱敏后的数据仍然保留统计特征,但不暴露原始值。

匿名化则要求数据经过处理后,即使结合外部信息也无法重新识别出数据主体。匿名化后的数据不再被视为个人数据,因此不受 GDPR 等隐私法规的约束。但匿名化的标准非常高——数据发布者必须证明,攻击者无法通过任何“合理可能的手段”(包括关联其他公开数据集)完成重识别。实践中,真正达到法律意义上的“匿名化”很难,大部分企业实际采用的是“假名化”,即把直接标识符替换成一个不可逆的假名,但保留了间接标识符,使得与外部数据关联后仍有可能重识别。

常见的数据脱敏技术对比

表8-7 常见数据脱敏技术对比

技术定义优点缺点
数据掩盖将敏感字段替换为虚构但格式一致的值(如 name 替换为 User_001实现简单,不改变数据分布可逆性取决于替换算法;随机替换可能破坏关联规则
泛化将精确值替换为更宽泛的范围(如 age:35 变成 age:[30-40];GPS 坐标模糊到街区级)保持数据的统计可用性,不可逆泛化粒度越粗,数据效用损失越大
置换/混洗在同一列内随机重排各行的值(如把所有人的薪资数据在行间打乱)保护个体值隐私,保留列级的统计分布如果列间存在强关联(如职位与薪资),攻击者可基于多列关联推断
差分隐私在查询结果中注入精心控制的随机噪声,使得攻击者无法判断某个具体个体是否在数据集中提供可数学证明的隐私保证(ε 预算);抗重识别能力极强添加噪声会牺牲数据精度;隐私预算的分配与持续管理需要工程投入
k-匿名要求数据集中的每一条记录,在准标识符(如年龄、性别、邮编)上的取值都至少与 k-1 条其他记录相同简单直观,适合结构化表格数据高维数据容易失效(维度灾难);对背景知识攻击防护不足

k-匿名模型的应用与局限

k-匿名是结构化数据匿名化最经典的方法之一。假设一张患者健康记录表,包含年龄、性别、邮编和诊断结果。如果一条记录在“年龄-性别-邮编”组合上是唯一的——例如有个“男、38岁、10001”的记录——那么即使姓名被删除,攻击者也能通过外部选民登记表把这条记录关联到具体个人。k-匿名通过泛化或抑制技术,确保每个等价类(即准标识符取值相同的记录集合)中至少包含 k 条记录。当 k=5 时,攻击者最多只能把目标锁定到 5 个人中的某一个。

但在物联网场景里,k-匿名的问题很突出。智能设备上报的数据往往是高维的——温度、湿度、位置、时间戳、设备型号、固件版本。随着维度的增加,等价类的规模迅速缩小,k-匿名要求难以满足。即便强制泛化,也会使数据精度严重下降,失去分析价值。

差分隐私:物联网场景下的更优选择

差分隐私(Differential Privacy,DP)的概念由学术界在 2000 年代中期正式提出。它的核心思想是:对数据集的查询结果添加精心设计的随机噪声,使得攻击者即使知道除目标个体之外的所有其他记录,也无法可靠地推断该个体的信息。直观理解是:数据集 DD'(仅相差一条记录)的查询结果,在统计上“几乎一样”。

DP 的优势在于提供了一个可量化的隐私保护参数——ε(隐私预算)。ε 越小,保护越强,但添加的噪声也越大,查询结果的准确性越低。在智能家居平台中,常见 ε 取值在 1 到 10 之间,具体取决于数据敏感度和使用场景。例如,聚合查询“统计今日所有室内温度高于 30℃ 的设备数量”比“查询某房间昨天每小时的温度读数”要“安全”得多,可以分配一个较大的 ε 值。

差分隐私的工程落地有两个关键环节:

  1. 隐私预算管理:每个查询消耗一部分 ε 预算。当总预算耗尽后,数据集必须被替换或弃用。需要为不同的查询类型(聚合、统计、训练)设定不同的 ε 上限,并持久化记录已使用的预算。
  2. 噪声注入策略:拉普拉斯机制用于数值型查询(如平均数),指数机制用于非数值型查询(如 Top-K 排行榜)。噪声的规模和 ε 成反比,和数据集的敏感度成正比。
图8-10 数据脱敏与匿名化决策流程数据发布先分级;内部受控使用可选择脱敏,对外发布必须达到匿名化目标并通过重识别风险评估。图8-10 数据脱敏与匿名化决策流程“做过掩盖”不等于匿名化;对外发布必须通过重识别风险评估。内部受控使用对外发布 / 开放数据待发布数据字段 · 用途 · 接收方数据分级分类P0 直接标识符 · P1 准标识符 · P2 敏感 · P3 非敏感使用边界?内部 / 对外脱敏处理掩盖 · 置换 · 泛化受控交付权限 · 审计 · 限用途匿名化处理泛化 · k-匿名必要时注入差分隐私重识别风险可接受?允许发布保存评估证据与版本硬边界脱敏数据仍可能被重新识别,只适用于有权限、有限用途的内部场景。匿名化是否成立取决于重识别风险评估证据,不取决于处理步骤的名称。圆角矩形 = 开始 / 结束矩形 = 处理动作菱形 = 可验证决策图8-10 大多数项目的问题在于混淆脱敏和匿名化:做了一层掩盖就当成匿名化发布,导致重识别风险泄露。差异在于强匿名化必须通过重识别风险评估。
图 8-10 数据脱敏与匿名化决策流程

数据分级:脱敏策略的基础

不分青红皂白地对所有字段施加同样强度的脱敏,要么保护不足,要么数据效用全失。工程上应该先做数据分级分类

一种典型的分级方法:

  • P0 — 直接标识符:设备 ID、用户 ID、完整手机号、住宅地址。必须脱敏或替换。
  • P1 — 准标识符:年龄、性别、邮编、设备 MAC 地址、外网 IP。需做泛化或 k-匿名处理。
  • P2 — 敏感属性:精确位置、诊断结果、设备运行时序波形。视发布场景决定是否加差分噪声。
  • P3 — 非敏感属性:聚合指标(日平均温度、总设备数)。可适度降低保护等级。

分级的结果是一张脱敏策略配置表,在 IoT DC3 这类平台中,通常用一个独立的配置中心管理,每个租户可以设定自己的分级规则。

物联网独特的脱敏挑战

相比传统 Web 应用,物联网数据有两个独有的隐私痛点。

第一是时空精确性。传感器读数的精确时间戳和 GPS 坐标本身就是隐私信息——连续几天的一台智能电表数据可以推断出屋主的作息规律。脱敏时需要把时间戳泛化到小时或天级,GPS 坐标模糊到一个几十米范围的网格。

第二是设备标识的强关联。设备 ID 对外部系统可能只是一个编号,但在平台内部,设备 ID 与真实用户账号、家庭地址通过业务逻辑绑定。如果设备 ID 用在数据分析中未被替换,攻击者一旦拿到平台侧的数据集,就能通过设备 ID 遍历到用户。因此,设备 ID 必须与真实账号分离,采用一个“分析用假名 ID”来挂载到外部数据表。

脱敏与匿名化的工程检查清单

  • 区分脱敏和匿名化的业务边界:脱敏后的数据允许内部使用,匿名化后的数据才允许对外发布或以 Open Dataset 形式共享
  • 为每类数据集制定分级分类清单,明确定义 P0-P3 字段
  • 根据攻击者背景知识、数据维度和使用目的选择 k-匿名、差分隐私或其他方法;k 不设脱离场景的统一下限,对时序与位置数据还要评估轨迹关联带来的重识别风险
  • 实施隐私预算管理,避免同一数据集反复查询导致总额超限
  • 数据发布前执行重识别风险评估:用外部公开数据集(如人口普查数据、社交媒体数据)尝试关联,验证能否解出原始记录
  • 定期审计脱敏规则,特别是新增字段或新的数据用途时,必须重新审核分级

这些技术与 8.4.1 节的数据加密存储组合在一起,构成了数据安全的全链路保护:传输中加密(8.3 节)、存储中加密(8.4.1 节)、查询发布时脱敏(本节)。三个层次缺一不可。

8.4.3 访问控制与权限模型(RBAC/ABAC)

加密存储保障了数据在静态时的机密性,脱敏技术让数据在“被看见”时不会泄露隐私。但数据最终要提供给谁、在什么条件下可以读/写/执行操作,这是访问控制要回答的问题。想象一下:一个智能楼宇平台需要让物业管理员调节空调温度,但只允许租户查看自己房间的温湿度——这种细粒度的判断靠的是权限模型。

从“你是谁”到“你能做什么”

访问控制有两个核心步骤:认证回答了“你是谁”,授权回答了“你能做什么”。认证通过后,系统得到一个确定的“主体”(用户或设备),但主体不能为所欲为——授权模型决定了它能触碰哪些资源、执行哪些操作。

在物联网平台中,授权模型面临几个独特的压力:

  • 设备数量远大于用户数量:一个平台可能管理百万级设备,每个设备的属性和状态都在动态变化。
  • 操作语义多样化:除了传统的读/写,还包括“启动固件升级”、“修改配置参数”、“下发命令”、“查看历史数据”等业务层面的操作。
  • 多租户隔离需求:不同租户(企业、家庭)的数据必须严格分开——即使两个租户都拥有“智能空调”这种设备类型,也不能互相操作对方的空调。

RBAC(基于角色的访问控制)和ABAC(基于属性的访问控制)是解决这些问题的两种主流方案。

RBAC:角色作为权限的集合

RBAC 的核心思想很简单:不把权限直接分配给用户,而是分配给角色,再把角色分配给用户。用户与权限之间隔了一层角色,这样做的好处是管理复杂度从 O(用户数 × 权限数) 降为 O(角色数 × 权限数)。在典型的物联网平台中,角色数量通常是个位数(如“管理员”、“运维工程师”、“操作员”、“访客”),而用户基数可能成千上万。

RBAC 的设计遵循最小权限原则:每个角色只包含完成其工作所需的最少权限集合。同时应坚持 fail-closed 策略:查不到权限就拒绝,绝不默认放行。

下面是一个针对智能楼宇管理平台的角色权限配置

表8-8 RBAC 权限配置示例

角色可访问资源允许的操作作用域限制
物业管理员楼宇所有设备读、写、配置、升级本楼宇全部租户
工程维护空调、新风系统读、配置仅允许修改温控参数
租户自己的房间设备仅能看到房间内设备状态
系统审计员操作日志不可查看设备实时数据

上述配置中,“工程维护”角色虽然能修改空调配置,但它无法执行“固件升级”这种高风险操作;“租户”角色也只能“读”自己的房间,看不到隔壁房间的数据。每个角色的权限边界是清晰且固定的。

ABAC:用属性做动态决策

RBAC 的静态角色化处理方式,在面对复杂场景时会变得僵硬。比如“在工作时间(9:00-18:00),允许工程维护人员对空调系统执行写操作,但非工作时间必须经过二级审批”——这种策略涉及时间、操作类型、审批状态等多个维度,单纯靠角色无法表达。

ABAC 则用属性作为决策因子。属性通常分为四类:

  1. 主体属性:用户的角色、部门、安全等级。
  2. 资源属性:设备类型、所在地域、所属租户。
  3. 环境属性:当前时间、IP地址范围、网络状态。
  4. 操作属性:读/写/执行、是否为批量操作。

权限引擎根据预定义的策略规则,对这四类属性进行布尔运算,得到最终决策。例如:

IF 主体角色 = "工程维护"
AND 资源类型 = "空调"
AND 环境时间 BETWEEN 09:00 AND 18:00
THEN 授予写权限

ABAC 的优点是灵活、细粒度,但代价是策略复杂度的提升。策略数量稍多,就容易出现规则冲突;缺乏标准化工具,调试和审计也更困难。处理冲突的常见做法是设置策略优先级(数值越小优先级越高)并默认采用“拒绝优先”(Deny-override)策略。因此在实际工程中,常见做法是在平台核心层使用 RBAC 保证清晰简洁,在边缘或特定领域启用 ABAC 做补充。

JWT:在令牌中携带权限信息

访问控制决策必须在每次请求发生时实时做出,但决策所需要的用户角色、权限、租户信息不能每次都从数据库查询——那样延迟太高。JWT(JSON Web Token,RFC 7519) 解决了这个问题,将权限信息编码进一个自包含的令牌中,客户端每次请求携带此令牌,服务端验证签名后即可直接提取权限数据,不需要查库。

JWT 的常见紧凑结构由三部分组成:Header(声明算法和令牌类型)、Payload(携带声明,如角色和权限)、Signature(对编码后的 Header 和 Payload 计算签名或消息认证码,用于完整性校验)。Header 和 Payload 通常只是 Base64URL 编码,并不提供保密性;敏感数据不应直接放入普通签名 JWT,需要保密时应采用加密令牌或其他受保护通道。在物联网平台中,JWT 适合以下几种场景:

  • 浏览器端 WebSocket 接入:如果把用户名和密码暴露在前端 JavaScript 中,任何人打开控制台都能看到。而使用有效期很短的 JWT,即使泄露,攻击者能操作的时间窗口也很窄。
  • 设备鉴权:设备可以通过内置的私钥签名一个 JWT 来证明自己的身份,避免在固件中硬编码用户名密码。
  • 微服务间调用:网关在认证用户后生成 JWT,下游服务只需验证签名即可信任携带的角色和权限。

一个简化的 JWT 生成和验证流程如下:

python
import jwt
import datetime

# 密钥应妥善保管,实际部署中可从环境变量或秘密管理服务获取
SECRET_KEY = "your-secret-key-should-be-rotated-regularly"

def generate_token(user_id, role, tenant_id, expires_in_hours=2):
    payload = {
        "sub": user_id,
        "role": role,
        "tenant_id": tenant_id,
        "iat": datetime.datetime.utcnow(),
        "exp": datetime.datetime.utcnow() + datetime.timedelta(hours=expires_in_hours)
    }
    token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")
    return token

def verify_and_extract(token):
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
        return payload
    except jwt.ExpiredSignatureError:
        raise PermissionError("Token has expired.")
    except jwt.InvalidTokenError:
        raise PermissionError("Invalid token.")

服务端在收到带有 JWT 的请求后,执行如下决策链:

  1. 解析并验证 JWT 签名 → 确认令牌可信且未过期。
  2. 提取 roletenant_id
  3. 结合目标资源的属性,查询权限矩阵:该角色对目标资源类型是否有指定操作的权限。
  4. 检查租户边界:当前请求的 tenant_id 是否等于资源所属的 tenant_id(或具有跨租户特权)。
  5. 通过则放行,否则返回 403。

JWT 在物联网中的局限来自纯无状态校验:如果服务端只验证签名和过期时间,不查询任何外部状态,那么令牌在过期前不会自动感知权限已被收回。工程上可组合短有效期、撤销表、令牌内省、密钥轮换和会话版本号;一旦引入这些机制,就要承担相应的状态一致性与可用性成本。高风险设备指令还应绑定一次性 nonce、有效时间窗、目标资源和幂等键,防止重放及跨设备复用。

下图展示了 JWT 认证与授权在物联网平台中的完整工作流:

图8-11 物联网平台 JWT 认证与授权架构展示 JWT 认证与授权在物联网平台中的四层架构与鉴权流程。图8-11 物联网平台 JWT 认证与授权架构展示 JWT 认证与授权在物联网平台中的四层架构与鉴权流程:认证层颁发令牌、授权层执行 RBAC/ABAC 决策、审计日志记录上下文。租户边界租户 A租户 B① 策略层管理控制台 · 运营人员配置角色、权限与 ABAC 规则表达式角色权限ABAC规则策略下发② 授权层授权决策点 (PDP)接收 API 网关请求执行 RBAC / ABAC 策略输出:允许 / 拒绝资源(设备 / 数据)受保护资源允许审计日志记录决策上下文记录未明确授予 → 拒绝fail-closed · 拒绝跨租户请求 → 拒绝JWT · user_id/role/tenant_id/exp携带 JWT③ 认证层用户 / 设备提交身份信息用户名 / 密钥 / 证书认证服务验证身份 · 颁发 JWTuser_idroletenant_idexp提交身份颁发 JWT④ 基础设施层数据库· 用户凭证· 角色映射· 策略规则JWT 签发服务签名密钥 · 令牌生成HS256 / RS256签名密钥用户凭证校验策略规则读取蓝色=策略配置 · 绿色=允许路径 · 红色=拒绝路径 · 虚线=租户边界图8-11 JWT 认证与授权架构:认证层颁发令牌、授权层执行 RBAC/ABAC 决策、审计日志记录上下文,租户边界贯穿始终,未明确授予的权限一律拒绝(fail-closed)。
图 8-11 物联网平台 JWT 认证与授权架构

多租户细粒度授权:角色与租户的正交组合

在多租户物联网平台中,权限模型必须考虑一个正交维度:租户边界。一个用户可能同时属于多个租户(比如一个运维工程师服务于多个物业公司),或者一个租户内有多个拥有不同角色的用户。

“能读设备”的权限不代表能读别家租户的设备。授权引擎必须在做出“允许操作”的决定后,再校验一次“允许操作哪个租户范围内的数据”。一次请求中通常携带两个关键标识:

  • 租户 ID:决定数据的作用域。
  • 角色:决定能执行的操作级别。

两者是“且”的关系——缺一不可。角色再高,也不能跨过租户边界;租户即使正确,角色不够也不能执行敏感操作。

对 IoT DC3 的当前实现,只能确认其使用平台约定的 Token、租户上下文和资源权限机制;不能把本节介绍的 JWT、OAuth 2.1、ABAC、WebSocket/MQTT 统一鉴权或完整审计链写成已经落地的项目事实。外部 AI Agent 接入时,应在现有认证基础上补充工具白名单、风险分级、确认和审计;若采用 MCP 授权规范或 OAuth 体系,还需单独实现并验证授权服务器、受众绑定、令牌生命周期和资源级权限。

通过这套组合,平台既能保持 RBAC 的简洁易管理,又能在必要时利用 ABAC 处理动态、多维度的策略需求,实现多租户环境下安全与灵活性的平衡。

从工业软件到 AI 智能体 · 构建面向智能体演进的多协议、云原生、开源工业物联网平台