跳转到内容

授权——谁可以做什么,以及你如何证明这一点

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 配置的策略引擎。 词汇表是刻意封闭的,因此整份策略都 可以被呈现、解释和枚举。
  • 除服务器之外,不在任何地方强制执行。 客户端检查的存在只是为了不 提供一个必然会被拒绝的操作入口。权威决策始终由服务器作出。