安全
安全
工作区中的访问控制是声明出来的,而不是写代码实现的。每一次读取与写入——无论来自页面、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 的身份读取,因此租户代码永远看不到调用方无权读取的行。