简介:可信工业数据空间是面向工业数据开放共享与可信流通的新型基础设施,这份PDF报告围绕其系统架构展开系统论述。内容涵盖全球发展现状、产业需求、总体架构设计、关键技术及标准体系,并引入产业案例,完整呈现了从概念到落地的思考路径,适合工业互联网研究人员、企业数字化负责人及数据要素政策制定者阅读。报告明确提出分级分类、分步有序的流通原则,并详细拆解了接入层、管理层、服务层与应用层等架构组成,对理解工业数据如何安全交换、价值如何释放具有较强参考意义。资源为单个PDF,共14.87MB,章节结构清晰,便于按需查阅。目前已有171人学习下载。通过报告可快速建立对可信工业数据空间整体框架的认知,也能从中借鉴技术路径与标准化思路,为实际推进制造业数字化转型提供理论依据和实践参考。
1. 可信工业数据空间到底解决了哪个信任问题
2022 年的可信工业数据空间系统架构资料,回答的是跨企业数据共享里一个非常具体的问题:数据不是不能给,而是给出去之后无法证明“对方只把它用在约定的地方”。质量数据、供应链数据、设备运行数据单独躺在企业内网里价值有限,拿出去合作,传统 API 只能控制“谁有权限访问”,控制不了“拿到之后能不能转卖、能不能用于营销、能不能做二次建模”。可信工业数据空间的思路,是把数据源与数据使用者之间加一层连接器,交换之前对身份和目的做策略评估,交换之后对使用痕迹做审计追溯。这套架构在国内落地时,很多项目直接把它当作数据交易所、工业互联网平台之上的一层“信任底座”。适合做数据中台、数据交换、隐私计算、数字化转型方向的工程师和架构师阅读,也适合准备系统架构设计师考试的人在案例维度补充理解。
2. 从连接器到信任链:可信工业数据空间系统架构的分层与核心组件
2.1 连接器:每个企业边界上的一台“数据闸门”
可信工业数据空间与普通数据中台最大的区别,在于所有数据交换都不经过一个中心的“大平台”,而是每个参与方各自部署一台连接器(Connector),数据从提供方连接器直接流向消费方连接器。有的业务团队会把连接器理解成一台反代或者文件服务器,这不够。它更像一个带策略执行能力的边界网关:对外发布数据目录,对内屏蔽具体存储路径,同时处理身份证书、策略协商和传输控制。
从 2022 年前后的架构资料看,连接器的功能面大体分成三段:
- 数据目录面:把内部数据资产用统一元数据描述后发布,供其他参与方检索;
- 策略协商面:对接入请求做身份认证和授权判断,决定“这份数据能不能给你用、用于什么目的”;
- 数据传输面:真正执行数据内容传输,并在传输前后记录指纹和日志。
一个常见误区是只上一台 API 网关,把目录和策略放在企业自己的权限系统里做。API 网关解决的是“谁能调接口”,连接器解决的是“调了之后数据的用途是否受控、是否可追溯”。后者要求的不是接口鉴权,而是一整套跨企业的信任协议。
2.2 控制面与数据面必须分开,否则高吞吐场景会拖垮策略引擎
可信工业数据空间的连接器在架构上普遍把控制流和数据流拆开:控制面(Control Plane)负责身份认证、策略决定、协商流程,数据面(Data Plane)只负责数据内容传输。这个划分不是设计洁癖,而是性能上的硬要求。策略引擎要查证书、校验 ODRL 约束、写审计日志,一次决策耗时在几十到几百毫秒;但设备数据、视频数据、BOM 文件这些工业数据体量大,传输可能持续几秒甚至几分钟。如果每个二进制块都串行经过策略引擎,吞吐基本不可用。
上下游职责大致这样切分:
| 功能 | 控制面 | 数据面 |
|---|---|---|
| 参与方身份认证 | 负责,验证属性证书 | 不感知 |
| 数据目录发布与发现 | 负责维护 DCAT 目录 | 不参与 |
| 策略决策(PDP) | 负责,出评估结果 | 仅按结果执行 |
| 策略执行(PEP) | 不直接处理大数据流 | 负责拦截与放行 |
| 传输内容加密与指纹 | 不接触具体文件 | 负责 |
控制面做一次数据面能验证的短期令牌,数据面拿令牌做快速校验,这样策略决策可以慢、策略执行必须快。后面第三章的最小实现会按这个思路落地。
2.3 身份证书、属性服务与审计服务:信任链的三根柱子
很多工程师第一次接触数据空间时问:既然连接器能拦数据,为什么还需要一层更复杂的信任基础设施?原因是连接器之间是跨域互信的,A 企业凭什么相信 B 企业的连接器说“我是 B”?答案是通过信任锚点。
可信工业数据空间一般包含三类基础服务:
- 身份服务:为每个参与方签发工业级的属性证书,证书里不只是企业名称,还包括企业信用等级、合规属性、行业分类等扩展属性,策略判断时按属性做匹配;
- 策略执行服务:连接器之间的协商结果被表达成带约束的使用策略,策略引擎负责解释这些约束,并在数据面拦截异常用途;
- 审计服务:每次传输事件、策略评估事件、异常拦截事件都产生独立的存证记录,记录内容带哈希链,事后可以完整还原一次数据的“借出—使用—归还”全过程。
审计与区块链没有必然关系。轻量实现里用带哈希指针的日志表就够,只有跨多参与方对账时才引入分布式账本。区别在于:审计关心“事实是否完整可查”,区块链关心“改不了”,两者目标不同。
3. 用 200 行 Python 跑通最小可信工业数据空间:目录、PDP 与数据面拦截
3.1 先写一个最小策略决策点(PDP)
下面用一个可运行的 Python 示例,模拟连接器控制面里的策略决策点。它接收调用方属性,按照简化版 ODRL 策略返回允许、拒绝以及令牌有效期。代码刻意保持短小,方便你自己改约束条件跑实验。
# odrl_lite.py from dataclasses import dataclass from datetime import datetime, timezone from typing import Dict, Optional @dataclass class Decision: allowed: bool reason: str token_ttl: int = 300 # 令牌默认 5 分钟失效 class PolicyEngine: def __init__(self, policy: Dict): self.policy = policy def evaluate(self, attrs: Dict[str, str]) -> Decision: # attrs: consumer_id, purpose, count, region 等 for perm in self.policy.get("permission", []): if attrs.get("purpose") not in perm.get("purpose", []): continue for cons in perm.get("constraint", []): ok = self._check(cons, attrs) if not ok: return Decision(False, f"constraint failed: {cons}") # permission 命中后才检查 prohibition if not self._prohibited(attrs): return Decision(True, "permission matched") return Decision(False, "prohibition matched") return Decision(False, "no matching permission") def _check(self, cons: Dict, attrs: Dict[str, str]) -> bool: left, op, right = cons["left"], cons["operator"], cons["right"] if op == "lte": return int(attrs.get(left, 0)) <= int(right) if op == "eq": return attrs.get(left) == right return False def _prohibited(self, attrs: Dict[str, str]) -> bool: for pro in self.policy.get("prohibition", []): if pro.get("action") == "sell": return True return False这段代码先扫描 permission 列表,找到一个和调用方 purpose 匹配的项,再检查 constraint 里所有条件;约束全部通过后才去确认 prohibition 里没有禁止动作。这个顺序很重要:ODRL 的语义是 permission 决定“能不能”,prohibition 决定“是否有一票否决权”,不能把 prohibition 单个拿出来当放行条件。token_ttl参数决定策略变更多久全局生效,工业场景里我一般会给 300 秒,既避免每条请求都回控制面做完整评估,也不至于让撤销动作等太久。
3.2 数据面拿到短时令牌后直接放行,不再回查策略
控制面的 PDP 负责算,数据面的 PEP 负责执行。这里用 FastAPI 写一个数据面服务,对外暴露真实数据下载接口,但要求携带来自控制面的短期令牌。
# data_plane.py from fastapi import FastAPI, Header, HTTPException from datetime import datetime, timedelta, timezone import hashlib, hmac, json app = FastAPI() SECRET = b"demo-secret" # 生产环境从 KMS 读取 def issue_token(consumer_id: str, purpose: str, asset_id: str) -> str: payload = json.dumps({ "consumer_id": consumer_id, "purpose": purpose, "asset_id": asset_id, "exp": (datetime.now(timezone.utc) + timedelta(seconds=300)).isoformat() }, sort_keys=True) sig = hmac.new(SECRET, payload.encode(), hashlib.sha256).hexdigest() return payload + "." + sig def verify_token(token: str) -> dict: try: payload, sig = token.rsplit(".", 1) expected = hmac.new(SECRET, payload.encode(), hashlib.sha256).hexdigest() if not hmac.compare_digest(sig, expected): raise HTTPException(401, "bad signature") data = json.loads(payload) if data["exp"] < datetime.now(timezone.utc).isoformat(): raise HTTPException(401, "token expired") return data except (ValueError, KeyError): raise HTTPException(401, "malformed token") @app.get("/data/{asset_id}") def transfer(asset_id: str, authorization: str = Header(...)): token = authorization.removeprefix("Bearer ") attrs = verify_token(token) if attrs["asset_id"] != asset_id: raise HTTPException(403, "asset mismatch") # 审计:记录谁在什么目的下访问了哪个资产 print(json.dumps({ "event": "transfer", "asset_id": asset_id, "consumer_id": attrs["consumer_id"], "purpose": attrs["purpose"], "at": datetime.now(timezone.utc).isoformat() })) return {"file": f"{asset_id}.bin", "size": 1024}PEP 只验签名、过期时间和资产匹配关系,不再回调连接器控制面,这是关键设计。令牌里带有exp,所以策略撤销的最长生效时间就是令牌 TTL。如果你需要快速撤回某个企业的访问权限,把 TTL 从 300 秒下调到 60 秒能加速,代价是数据面每条请求都要做一次完整 token 校验,CPU 开销略增。注意issue_token在真实连接器里只应由控制面持有密钥调用,数据面只保存验证公钥或共享密钥,密钥永远不要下发到浏览器端。
3.3 在本地验证整个流程,并用 uname -m 确认运行环境
把两个服务分别起在 9001 和 9000 端口,本地模拟一次完整交换。先确认当前机器的系统架构,避免装错 Python 二进制依赖:
uname -m # x86_64 或 aarch64,下文安装的 cp 版本要与它一致 python3 -c "import platform; print(platform.machine())"然后启动控制面,手动签发一个测试令牌:
python3 - <<'PY' from odrl_lite import PolicyEngine import json policy = { "permission": [{ "purpose": ["quality_analysis"], "constraint": [{"left": "count", "operator": "lte", "right": 100}] }], "prohibition": [{"action": "sell"}] } engine = PolicyEngine(policy) print(engine.evaluate({"purpose": "quality_analysis", "count": 3})) print(engine.evaluate({"purpose": "marketing", "count": 3})) PY再用 curl 对数据面验证两种结果:无令牌请求被 401 拦截,带合法令牌请求返回文件信息。
curl -i http://localhost:9000/data/bom_2022 # HTTP/1.1 401 Unauthorized TOKEN="<上一步签发的token>" curl -i -H "Authorization: Bearer $TOKEN" http://localhost:9000/data/bom_2022 # HTTP/1.1 200 OK到这里一个最小可信工业数据空间就跑通了:控制面做策略决策,数据面做快速执行,两端通过短期令牌衔接。实践中连接器还有目录同步、密钥轮换、断点续传等能力,但架构骨架就是这套。许多团队在 NBIoT、MES、PLM 数据接入场景里就是这样从最小骨架长起来的。
4. 把策略写进数据资产:DCAT 元数据与 ODRL 参数的工业落地
4.1 DCAT 目录里必须填的三个字段
连接器把数据资产发布成目录,让消费方在“预约看货”阶段就能知道数据是什么、通过哪个服务去取、使用要遵守什么策略。从 2022 年的架构资料来看,数据目录普遍采用 DCAT 为主体骨架,再扩展odrl:hasPolicy把策略挂载到资产上。一条完整的数据资产元数据至少包含三个字段:
{ "@context": { "dcat": "http://www.w3.org/ns/dcat#", "dcterms": "http://purl.org/dc/terms/", "odrl": "http://www.w3.org/ns/odrl/2/" }, "@id": "https://data.example.com/bom-2022", "@type": "dcat:Dataset", "dcterms:title": "2022 产品物料清单", "dcterms:modified": "2022-12-31", "dcat:distribution": { "@id": "https://data.example.com/bom-2022#distribution", "dcat:accessService": "https://connector.example.com/data/bom-2022" }, "odrl:hasPolicy": { "@id": "https://data.example.com/policy/p123", "@type": "odrl:Policy" } }dcat:accessService标明数据面的真实入口,odrl:hasPolicy指向策略的全局唯一标识。这个字段看起来简单,但在 2022 年的多数落地项目里都被漏掉,漏掉之后消费方只能“先下载再谈授权”,信任就无从谈起。工业场景还要增加dcterms:creator和dcterms:rightsHolder,这两个字段决定事后发生数据纠纷时找谁要溯源信息。
4.2 ODRL 策略的 permission / prohibition / duty 怎么设
数据空间国际社区的标准策略语言是 ODRL,它把使用策略拆成三个块,理解了这三个块,基本就理解了可信数据空间的授权模型。
{ "@context": "http://www.w3.org/ns/odrl/2/", "@type": "odrl:Policy", "uid": "http://example.com/policy/p123", "permission": [{ "target": "http://example.com/bom-2022#distribution", "action": "read", "constraint": [ { "leftOperand": "purpose", "operator": "eq", "rightOperand": "quality_analysis" }, { "leftOperand": "count", "operator": "lte", "rightOperand": 100 } ] }], "prohibition": [{ "target": "http://example.com/bom-2022#distribution", "action": "sell" }], "duty": [{ "action": "notify", "constraint": [ { "leftOperand": "event", "operator": "eq", "rightOperand": "consumed" } ] }] }参数拆解:
permission里的constraint是策略的核心。工业场景最常用的是purpose、count、temporal和system:purpose约束用途,count限制调用次数,temporal限定可用的时间窗口,system限定只能在某类受信系统里处理数据。左操作数选错会导致策略变成“永远不匹配”。prohibition里的action有严格枚举语义:sell指转移所有权并获取对价,distribute指向第三方扩散,derive指允许派生新数据。制造业里“拿到 BOM 去做成本测算”通常会配derive而禁止distribute,如果只写了sell,对方把数据传给其子公司就拦不住。duty是 ODRL 里最容易被忽略但最有工业价值的一块。它规定数据使用方的“事后义务”,比如每次消费后必须上报使用日志、必须删除源文件、必须回传聚合结果。不履行 duty 的参与方,在下一次协商时会被身份服务打上低信任标签。
4.3 工业场景的策略参数对照表
不同工业数据的使用控制需求差异很大,下面是我在项目里沉淀下来的常见配置组合:
| 工业场景 | 策略组合 | 必调参数 |
|---|---|---|
| 设备运行数据用于售后分析 | permission(read) + duty(log) | purpose=maintenance, count<=调用次数 |
| 供应链 QC 数据联合建模 | permission(derive) + prohibition(sell) | derive 指向中间结果集,不做原样转发 |
| BOM 共享但防逆向 | permission(read) + duty(watermark) | watermark 策略与消费方 ID 联动 |
| 跨工厂产能协同 | permission(read) + prohibition(distribute) | temporal=每日 08:00-20:00 |
研发团队拿到这些参数后经常会问:count 在数据面怎么数?答案是需要一个外部计数服务或者数据库事务,不能在连接器进程内存里counter += 1。多数据面实例部署时内存计数会并发丢失,一旦超卖,策略引擎的外部审计会抓出不一致。2022 年之后我看到好几个项目的生产事故都出在这里:策略写得漂亮,但计数点放错了位置。
5. 验证可信性的三个硬手段:日志、指纹与策略失效实验
最后一个环节是检验“信”字有没有落地。可信工业数据空间里,任何信任最终都要落到证据上,所以验证工作围绕证据链来做。
第一步是做日志和数据指纹对账。每次数据传输,数据面都应对文件内容计算 SHA-256 并记录在审计日志里。验证时要拉出同一资产在不同时间点的指纹,确认数据没有被中途替换或篡改。
# 审计日志落到 JSON Lines 后,用 jq 过滤指定资产 tail -f /var/log/dsp/audit.log | jq 'select(.asset_id=="bom-2022") | {event, consumer_id, purpose, fp}'看到同一asset_id对应多个不同fp时要警惕,说明源文件在两次传输之间发生过未登记变更,需要回到上游存储确认。
第二步做策略失效实验。找个测试数据资产,在控制面把策略临时改成全部拒绝,然后重新签发令牌请求数据面,确认必须返回 403;再把策略恢复为允许,确认数据面在令牌过期前仍能正常放行。这能检验两条链路有没有粘连:PDP 改了策略是否真的影响后续请求,PEP 会不会因为缓存了旧 token 而继续放行。
第三步检查边界条件。重点看三个点:
- 令牌 TTL 过长:把 TTL 调成 86400 秒模拟“长期令牌”,审计日志里是否出现跨自然日的持续会话,相关记录要能从数据库按会话 ID 汇总出来;
- prohibition 的覆盖范围:策略里禁止 distribute 时,下载接口是否仍然允许带
purpose=derive的令牌拉取原文件,如果允许,说明 PEP 只校验了 permission 没校验 prohibition; - 多实例并发计数:用 ab 或自写并发脚本同时打数据面,验证 count 约束是否严格等于设定上限,超限请求应被拒绝。
三个手段建议连成一条回归流水线,放进 CI 里定时跑。连接器本身就是被审计对象,审计程序自己要可重复执行,手动验证一次不能证明系统长期可信,只有持续可复现的验证链路,才是可信工业数据空间最后的兜底。
本文还有配套的精品资源,点击获取