对象与属性的安全策略

第 4 课 · 共 7 课 约 9 分钟

objectSecurityPolicy 管行,propertySecurityGroups 管列;必填 Marking 属性与 markingConstraint;读取时判定。

本课目标

读完这一课,你将能够

  • 分清对象安全策略(行)、属性安全策略(列)和单元格级,说出策略由什么组成
  • 说出策略的限制:只在读取时生效、主键不入属性策略、一个属性至多一个策略、对象策略最多 10 个比较、权重合计小于 10,000
  • 用必填 Marking 属性、markingConstraint 和行策略设计访问控制

行、列与单元格

Markings 是整份资源的一道门,这一节讲更细的:同一个 Object Type 里,哪些行、哪些列给谁。对象安全策略决定一行(一个对象)你看不看得到;属性安全策略在它之上,再盖住某几个属性。两者叠起来就是单元格级:先过行,再过列。

对象安全策略(行级)属性安全策略(列级)
管什么一个对象看不看得到某几个属性值看不看得到
没通过时整个对象不出现那个属性读到空值(null)
范围缺省管全部属性只管被选中的属性
例子采购员只看自己负责国家的 suppliercustomer.creditLimitUsd 只给财务

读一个属性值要连过三关:在对象类型上是 Viewer;通过你配置的细粒度策略;通过 Markings 与组织的检查。三关都是「与」。

一条策略里有什么

策略的核心是一条细粒度规则:把用户的属性、对象的属性和一个具体的值放在一起比较,再用「与」「或」组合。例如「用户的负责国家等于供应商的 country」。

随口一问

让采购员读到全部供应商,再靠界面把不该看的行藏起来。

好的交代

在读取层规定:采购员只读得到 country 等于自己负责国家的 supplier 行,界面只是照实显示。

  1. 建对象安全策略

    在 customer 上限定谁看得到哪些客户行。

  2. 决定继承什么

    策略缺省继承数据源上的 Markings 与组织;不需要的去掉,需要的加上。

  3. 建属性安全策略

    选中 creditLimitUsd,给策略起个名字,要求持有 finance。

  4. 用真人测试

    指定一个用户和一个对象,看他能读到哪些属性,再保存。

记住这些限制:属性策略需要对象策略;主键不能进属性策略;非主键属性至多属于一个属性策略。对象策略最多 10 个比较。权重不是比较数:常量 1,集合 1,000,Marking 条件 3,000。对象与属性策略的权重合计要小于 10,000。改策略的人要是 Owner,还要满足改前、改后的相关 Markings。添加要 USE;去掉或停止继承要 DECLASSIFY 和 USE。

强制控制属性与受限视图

按每行自己的 Markings 判定访问,用必填的 marking 或 array<marking> 属性。AIDC 当前只支持 Marking,不支持 Organization 或 CBAC 控制属性。用 dataSecurity.markingConstraint.markingIds 限定可写值,再在行策略的 markingProperty 条件中引用属性。只存值不设条件,不会过滤行。

  • 必须必填,不能为 null;空列表表示人人都满足,等于不设限。
  • 建它时要声明允许的 Markings 范围;写入超出范围的值会被拒绝,Action 提交也会失败。
  • 缺省隐藏:它是别的字段的「门」,通常不必出现在对象视图里。

受限视图是更早的做法:在数据源一侧,按用户属性过滤数据集的行,再让 Object Type 接在视图上。它只能建在数据集上,改了策略要重建。官方现在推荐对象与属性安全策略:策略更新几乎立即生效,也能用于流式数据。数据集在本体(Ontology)之外也要按行控制时,受限视图仍然有用。

在 AIDC 里:配置与测试行列策略

这些策略只在读取时生效。AI 分析步骤拿到的数据进入模型上下文后,输出不自动继承源控制。检查工作流的拥有者权限、输出内容和目标资源,不能只靠提示词。

要保护 creditLimitUsd,可以直接在客户类型的 propertySecurityGroups 中引用财务 Marking。无需强制拆类型。Object Type 仍继承父资源权限,自己的授予不能减去继承权限。

用 aidc semantic security test customer --user <账号 id> --pk C-1001 测试行列访问。结果只报告能否看见,不返回属性值。

如果业务需要独立的信用档案,可以另建 CustomerCredit,再用一对一 Link Type 连回 customer。这是可选建模方案。拆开以后仍要配置财务 Marking 或安全策略,不能假设少授予就收紧了继承权限:

{
  "kind": "objectType",
  "apiName": "CustomerCredit",
  "title": "客户信用",
  "description": "客户的信用额度,只给财务读。",
  "schema": {
    "titleColumn": "customerId",
    "columns": [
      { "name": "customerId", "type": "string", "primaryKey": true, "title": "客户 ID" },
      { "name": "creditLimitUsd", "type": "decimal", "title": "信用额度(美元)", "notNull": true }
    ]
  }
}
{
  "kind": "linkType",
  "apiName": "CustomerCreditProfile",
  "title": "客户的信用档案",
  "schema": {
    "from": "customer", "to": "CustomerCredit", "cardinality": "ONE_TO_ONE",
    "apiNameAtoB": "credit", "apiNameBtoA": "customer",
    "foreignKey": { "side": "to", "property": "customerId" }
  }
}

下一节讲另一半:改了、批了、导出了,怎样留下账。

要点

  • 对象安全策略管行,属性安全策略管列;没过行,整个对象不出现,没过列,属性读到空值。
  • 属性策略需要对象策略;主键不入属性策略;一个属性至多一个策略。对象策略最多 10 个比较,行列策略权重合计小于 10,000。
  • 强制控制属性让每一行带着自己的 Markings;受限视图是更早的做法,新设计优先用安全策略。
  • AIDC 已有行列策略、必填 Marking 属性与 markingConstraint。策略只在读取时生效,输出不会自动继承。

练一练

把一条保护要求拆成策略

拿示例工厂的两个要求,先写成策略,再写成 AIDC 今天做得到的样子。

用一句话写出「采购员只看自己负责国家的供应商」:左边是用户的什么属性,右边是 supplier 的哪个属性,用什么比较。

小测

选一个答案,马上看解析。

Q1一个用户通过了对象安全策略,但没通过 creditLimitUsd 所在的属性安全策略。他读到什么?

Q2下面哪一条是属性安全策略的限制?

Q3AIDC 今天要在同一个 customer 类型内,让采购员能读客户却读不到 creditLimitUsd,靠什么?

延伸阅读