权限模型总览:两类控制
组织、Markings、角色与行列策略;资源继承、读取过滤与导出的边界。

本课目标
读完这一课,你将能够
- 分清强制控制与自主控制,说出它们在「随数据传播」上的差别
- 说出本体(Ontology)里要保护的三样东西:定义、对象与链接、属性值
- 判断一条保护要求该用哪类控制,并说清 AIDC 今天有哪些
先问三件事
前一门课讲完了读写本体的四个入口:API、SDK、CLI 和 MCP。这一门回答它们背后绕不开的问题:谁能看,谁能改,改本体本身时怎样不出事。
设计权限之前,先分清本体里有三样东西要保护。第一样是定义:customer 有哪些属性、叫什么名字。第二样是对象与链接,也就是真正的数据行:某一个客户,某一张销售订单。第三样是属性值:同一个客户里,creditLimitUsd 这一格。
定义
看得到定义,不等于看得到数据。一个人可以知道 customer 有信用额度这一列,却读不到任何一个客户。
对象与链接
行级问题:这一行你能不能看。采购员该不该看到所有供应商?
属性值
列级问题:同一行里这一格你能不能看。销售看得到客户,看不到 creditLimitUsd。
再问两件事:谁会读取数据,是人、智能体还是应用;哪些路径会复制或导出数据。平台内的继承和平台外的文件是两种边界,不能把它们混为一谈。
强制控制与自主控制
| 强制控制 | 自主控制 | |
|---|---|---|
| 例子 | Markings、组织 | 角色(Owner、Editor、Viewer)、对象与属性的安全策略、受限视图 |
| 谁来执行 | 平台一律执行,不看你是什么角色,应用的逻辑也绕不过 | 资源的 Owner 通过分享,一项一项授予 |
| 方向 | 只限制:满足全部要求才放行 | 只增加:给了才有 |
| 随数据传播 | 沿资源层级与数据依赖继承;不保证任意副本或平台外导出继续受控 | 只在读的那一刻过滤,读出来的数据不再带着策略 |
| 拿掉它 | 要有专门的「扩大访问」权限,Owner 也不例外 | Owner 可以改授予;改安全策略还要满足相关 Markings 与角色要求 |
资源上的敏感要求,用 Markings;同一类型里谁能读哪些行和列,用对象与属性安全策略。两者可以叠加。复制、Function结果、Action 写值和导出要另外检查,源控制不会自动跟过去。
自主控制停在哪里
行级、列级策略过滤的是「读」。读出来的行就是普通数据,没有任何 Markings 能让后面的代码再套一次策略。所以下面这些出口,源头的策略都跟不过去:
- Function 的返回值:AIDC 已有隔离运行时,
ctx按调用人的权限读对象。结果不自动继承源数据的安全控制。用aidc semantic functions list查看已发布的 Function。 - Action 的写入:从一个受保护的类型读,写进另一个类型,生效的是写入目标的规则。
- 模型上下文:智能体或工作流的 AI 分析步骤读到数据以后,模型怎么转述、总结,都和源头策略无关。
- API、SDK、SQL 的响应:调用方在自己的上下文里拿到数据,可以显示、记录、转发。
- 数据写入与导出:写进对象类型的行按目标的规则;导出的文件在平台之外,什么都不带。
只在 customer.creditLimitUsd 上设了读限制,就认为信用额度不会外泄。
读限制之外,检查哪些 Action、工作流和导出会把值搬到别处。为目标资源另设控制,并检查输出内容。
这不是漏洞,是设计:读的人本来就有权读,这一点始终成立。丢掉的只有传播,约束不会跟着数据离开源头。
在 AIDC 里:现在怎样设权限
先摸清现状。下面两条命令,先列出你所在组织看得见的对象类型,再看某个类型上谁有什么角色(RID 形如 ri.ontology.aidc.object-type.…,后面是类型的 id):
aidc resources list --scope organization --type objectType
aidc resources roles <rid>
| 现在的控制 | 配置入口与边界 | |
|---|---|---|
| 强制控制 | 组织按命名空间隔离;资源 Markings 对 Owner 和 developer 同样生效 | aidc semantic admin marking-categories … 管类别,aidc semantic admin markings … 管成员和角色;aidc semantic filesystem mark 挂资源 Marking |
| 自主控制 | Owner / Editor / Viewer 三种角色;Private / Group / Public / Open to Internet 四档 | objectSecurityPolicy 管行,propertySecurityGroups 管列;Groups 支持嵌套、成员管理与到期 |
| SQL 读取 | 标准 Ontology SQL(Spark SQL)按调用人过滤对象;受保护属性返回 NULL | POST /api/v2/sqlQueries/executeOntology?preview=true;Postgres 方言与数据库直连另有边界 |
| 智能体的凭证 | Agent Key 按主体权限与 restrictions 读取对象、执行获准 Action | operations 限定读写操作,objectTypes 限定类型,actionTypes 限定 Action;限制不能提权 |
要点
- 本体里要保护三样东西:定义、对象与链接、属性值,它们的权限是分开的。
- Markings 沿资源层级和数据依赖继承;行列策略在读取时过滤。平台外导出不自动受控。
- Function 结果、Action 写值、模型上下文和导出不自动继承源控制,要检查目标与输出。
- AIDC 已有组织隔离、三种角色、四档开放程度、Groups、Markings 和行列安全策略。
练一练
给示例工厂画一张保护清单
拿示例工厂的对象类型,先不管技术,只回答:谁该看到什么。
挑 customer,写出它的定义、行、属性值三层各自谁该看到。
creditLimitUsd 不能被非财务读到。写出列策略,再说明汇总报表与导出还要检查什么。
跑 aidc resources roles RID,记下 customer 类型上现在有哪些授予,标出你不认识的那一条。
小测
选一个答案,马上看解析。
Q1要求「敏感资源的 Owner 也必须满足数据分级要求才能读」,该用哪类控制?
Markings 对所有角色生效,包括 Owner。它们沿资源层级和数据依赖继承,但不保证平台外导出继续受控。
Q2creditLimitUsd 上设了列级读限制。一个 Action 把这个值写进销售订单的备注,备注的读者能看到额度吗?
读限制不会自动跟着写值走。目标位置的规则决定谁能看到,必须另行检查。
Q3AIDC 今天能做到下面哪一件事?
已有列策略。propertySecurityGroups 可以保护 creditLimitUsd;Object Type 不能单独设为 Private,导出也不会自动继承控制。