跳到主要内容

安全

安全

工作区中的访问控制是声明出来的,而不是写代码实现的。每一次读取与写入——无论来自页面、Agent、Envoy、自动化、集成还是 API 密钥——都由宿主按照执行者的策略进行评判,因此规则在每条路径上都成立。

谁在执行

  • 成员持有其来源团队(src/access_control/team/+team.ts)的策略。管理员不受授权限制。外部成员(如客户与供应商门户用户)只能看到受众允许他们访问的应用。
  • Envoy 在会话实例上依据其声明的 policies 作答;在私信中,已关联成员自身的权限会与之合并。参见 Envoy。
  • 访客使用公开应用的页面,只持有该应用的公开策略:他们可以提交表单、读取已发布的行,但永远不能读回任何提交内容。
  • 自动化依据其声明的 runAs 策略执行。集成不声明策略:数据源或出站运行以 { kind: 'system', by: { integration, feed | outbound, instance } } 的身份执行,只写入其定义所声明的内容——数据源写入其 into 集合的非本地字段,出站规则的 events 通过集合的 update 白名单修补它自己的记录。二者都没有团队,因此都不能审批。
  • API 密钥持有其所选来源团队的策略;请求内容永远不能自行指定策略。

各部分如何配合

  • 集合限定了任何调用方最多能读取(read.fields)与写入(其输入白名单)的内容。
  • **策略**按集合授予可访问的行(where)、字段、查询与操作,以及状态转移。多个策略的授权取并集。
  • 字段遮罩隐藏读取授权未列出的字段:被遮罩的字段不会出现在行、筛选、排序、标签与文件下载中。
  • **审批**为指定团队挂起一次写入,在允许该写入的写入授权上声明。
  • 限流按策略限制执行者、IP 地址与 Envoy 发送者的速率。

在哪里强制执行

宿主把每个授权的范围合并进每一条读写语句,把遮罩代入每一个谓词,并在写入语句内部路由审批。transform 以工作区身份读取,但查询、操作与自动化以其调用方或 runAs 的身份读取,因此租户代码永远看不到调用方无权读取的行。