授权——谁可以做什么,以及你如何证明这一点
Control Center 要回答两个授权问题,而它们截然不同。“这个人可以调用这个操作吗?” 关乎人、角色与仓库。“这个智能体可以造成这种影响吗?” 关乎操作、参数与影响范围—— 后者属于护栏。
本页讲的是第一个问题,以及两者都会留下的记录。
单一决策点
标题为“单一决策点”的部分所有涉及人的授权决策都经由同一个函数得出结果:
can(principal, permission, resource) → allow | deny + why一个权限的形式是 <domain>:<tier>——tickets:write、
members:administer、repos:read。权限目录是派生出来的,而不是
手工编写的:它由操作本身计算得出(操作名的前缀给出域,它已经强制执行的
角色下限给出层级),因此全部约 550 个操作都带有权限,无需任何人手动输入。
这一派生机制正是值得保护的特性。它意味着新增操作默认就受到管控—— 手工标注模型的失败模式是有人忘了标注,而他们忘掉的恰恰是管控。 有一项棘轮测试会固定由此得到的域集合,因此在新的前缀下新增操作, 是人有意做出的命名决定,而不是一次意外。
这四个层级与内置角色精确对应:
| 层级 | 角色下限 | 示例 |
|---|---|---|
read |
访客 | tickets:read |
write |
成员 | tickets:write |
administer |
管理员 | members:administer |
own |
所有者 | workspace:own |
五个内置角色——所有者、管理员、成员、查看者、访客——是这套目录上的 预设。每个工作区的所有权只有一个席位,需通过转让所有权显式移交 (否则离职的所有者将无法被移除:SCIM 取消预配会拒绝任何工作区所有者—— 请先移交)。
自定义角色是减法式的。 自定义角色会指定一个基础预设(admin、
member、viewer 或 guest——绝不能是 owner),以及一组从其中
移除的权限——“管理员,但不能管理成员”。它授予的权限永远不会超过其基础
预设,这正是它们可以安全引入现有安装的原因:所有既有检查仍然是可靠的
上界。成员以 custom:<id> 的形式持有它们,而无法理解该值的旧客户端
会回退到访客,而不是贸然猜测。
角色之下还有按仓库授予的权限(none / read / review /
write):工作区成员身份绝不会悄悄给出高于代码托管的权限。所有暴露代码
的界面都会检查这些权限——包括那些以旁路方式触达代码的界面,例如在
空间的工作树上打开的终端或编辑器会话。
服务器专属权限
标题为“服务器专属权限”的部分有些操作与工作区完全无关:安装范围的设置、SSO 配置、提供方凭据、模型 管理、整个安装的备份。这些操作声明为服务器专属权限,除该安装的 操作员(记录在案的服务器所有者)外,对所有人一律拒绝。这里刻意只保留 一个操作员身份,以及关于它的唯一定义。
审计追踪
标题为“审计追踪”的部分每一个授权决策——无论允许还是拒绝——都会追加到按工作区划分、 以哈希链串联的审计追踪中。
只记录拒绝的日志能回答“我们拦截了什么?”,却回答不了“这个智能体究竟 做了什么,又是谁授权的?”——而这正是事故复盘要问的第一个问题。因此每条 记录都会写下完整的归属链:执行主体、它所代表的人、它所经由的委派、 操作及其参数(以摘要形式)、决策,以及作出该决策的规则。
各条目串成一条链:每条的哈希都覆盖前一条,因此编辑、删除或重排任何一行 都会破坏其后的所有哈希。验证链会重新推导整条链,并指出第一个不成立 的环节。无法核验的审计日志只是日志;能重新推导的才是证据。
有两个值得了解的后果:
- 审计表不受基于时间的清理。哈希链无法从中间裁剪。保留的做法是先 导出、再截断,而截断会留下一个携带被移除片段末端哈希的检查点, 因此留存下来的内容仍能一路校验回起点。
- 它与活动时间线并列,而不是叠在其上。时间线记录人做了什么;这里 记录什么被授权、什么被拒绝。借助共享的关联 id,可以在两者中读懂 同一次调用。
它导出为换行分隔的 JSON,并可以流式发送到 SIEM(Splunk、Elastic、 Sentinel——一个带 bearer token 的 HTTP 端点)。流式发送按设计就是尽力 而为:SIEM 宕机绝不能阻塞智能体的工具调用,而且无论哪种情况,持久、 可校验的副本都在磁盘上。
安装可以设置最长会话时长和空闲超时。两者都在设备凭据检查处强制 执行,所有经过认证的通道都会汇聚到那里——客户端能无视的会话约束回答的 是问卷,而不是攻击者。安装还可以要求使用 SSO,这会禁用新设备的手动配对 (带有锁定保护:在不存在可用 SSO 连接时会拒绝该设置)。
不是什么
标题为“不是什么”的部分- 不是按对象的 ACL。 这里刻意不提供按工单或按消息的权限。团队真正 需要的是仓库级隔离,而它已经存在;按对象共享会造成组合爆炸,而这里 并没有表现出这种需求。
- 不是用 DSL 配置的策略引擎。 词汇表是刻意封闭的,因此整份策略都 可以被呈现、解释和枚举。
- 除服务器之外,不在任何地方强制执行。 客户端检查的存在只是为了不 提供一个必然会被拒绝的操作入口。权威决策始终由服务器作出。