# D7:权限与安全治理 状态:`beta.4` 闭环已完成 优先级:P0 日期:2026-07-16 ## 1. 产品目标 让个人和团队敢于把真实电脑、真实项目交给飞书里的 Codex:默认权限保持可解释,临时提权有明确范围和到期时间,仓库可以进一步收紧主机规则,任何外部副作用都不能因为“完全访问”而跳过确认。 ## 2. 已确认决策 - `CODEX_SANDBOX_MODE=danger-full-access` 只代表服务和管理员的最高能力,不再作为会话永久默认值。 - 长期默认最高为“工作区写入”。完全访问只能按“下一任务”“30 分钟”或“当前会话”临时租用。 - 下一任务和限时租约有效期均为 30 分钟;当前会话租约硬上限为 60 分钟。 - 租约绑定飞书成员、成员会话、当前项目;会话租约额外绑定 Codex thread。切项目、切 thread、到期、用完或立即撤销都会失效。 - 成员只能为自己提权。管理员可以撤销他人的租约,但不能替成员创建完全访问租约。 - 已经运行的任务使用启动时权限快照;撤销或降权影响后续任务,不在半途改变已经启动的 Codex sandbox。 - 仓库策略使用根目录 `.feishu-codex-policy.json`。它只能收紧角色/服务上限,不能扩大权限或取消桥接层外部动作确认。 - 仓库策略在创建确认卡、任务入队和任务真正执行前都会重新读取;排队期间修改策略会对尚未启动的任务生效。 - commit、push、部署、发布和 PR/MR 始终保留飞书确认底线。仓库允许列表表示“可以申请”,不表示静默放行;拒绝列表优先级最高。 - 日志、文本回复、outbox 重放、审计摘要、任务卡、审批卡、确认卡、Diff 和测试摘要使用同一套凭据脱敏规则。 - 应用层命令识别只是纵深防御,不声明等同于操作系统沙箱。高风险团队部署仍建议使用独立系统账号或容器。 ## 3. 权限状态机 ```text 安全默认(只读 / 工作区写入) → 本人确认临时完全访问范围 → 绑定成员 + 会话 + 项目(会话租约再绑定 thread) → 下一任务消费 / 30 分钟到期 / 60 分钟到期 / 手动撤销 / 切换资源 → 自动回落到安全默认 ``` 完全访问租约不会写回成员的长期设置。仓库策略和角色上限任一方不允许完全访问时,授权入口会隐藏或拒绝,已有租约也不会被任务消费。 ## 4. 仓库策略 复制包内示例为项目根目录 `.feishu-codex-policy.json`: ```json { "version": 1, "sandbox": { "maximum": "workspace-write" }, "operations": { "allow": ["commit", "push", "pull_request"], "deny": ["deploy"], "requireApproval": ["commit", "push", "pull_request"] } } ``` 规则语义: - `sandbox.maximum`:本仓库任务的最高 sandbox;可以低于主机/角色上限,不能高于它。 - `operations.allow`:可申请的外部动作白名单;省略表示沿用桥接服务允许的动作集合。 - `operations.deny`:无条件拒绝,优先于允许列表和任何旧确认卡。 - `operations.requireApproval`:声明仓库要求显式审批的动作;当前四类外部动作本身已有不可降低的桥接层确认底线。 - 策略必须是根目录普通 JSON 文件,版本为 `1`,大小不超过 64 KB;符号链接、未知动作和无效结构会安全阻止任务。 支持的外部动作:`commit`、`push`、`pull_request`、`deploy`。 ## 5. 统一脱敏 离开本机进程前会隐藏: - 常见 API Key、access/refresh/id token、密码、cookie、session secret 和 webhook URL 赋值。 - Bearer/Basic 凭据、GitHub/OpenAI/Slack 常见 token 形式和 JWT。 - URL 中的用户名与密码。 - PEM 私钥块。 诊断显示还会把用户主目录折叠为 `~`。已知敏感文件路径继续由 D6 审阅规则整段隐藏,不依赖正文正则。 ## 6. 验收标准 - 完全访问不会永久保存到成员偏好;安全默认在租约结束后自动恢复。 - 下一任务租约只消费一次;限时租约按时间失效;会话租约切 thread 后失效。 - 租约不能跨成员、聊天或项目使用;切项目会立即撤销现有租约。 - 管理员不能替其他成员授予完全访问,外部动作确认也继续绑定任务所有者和当前项目。 - 仓库策略可以降低 sandbox 上限、限制可申请动作和拒绝外部动作,不能放宽主机规则。 - 策略在确认、入队、执行三个阶段重新验证,旧卡和排队任务不能绕过更新后的拒绝规则。 - 无效、过大或符号链接策略文件以失败关闭,不静默忽略。 - 外部动作即使在临时完全访问任务中仍要求确认;凭据修改、外部删除和代表用户联系他人仍被全局规则阻止。 - 飞书文本、主要交互卡、审计摘要、Codex/lark 日志、测试摘要和 Diff 使用共享脱敏实现并有自动测试。 ## 7. 开发任务 - [x] D7-T01:把永久完全访问改为下一任务、30 分钟和当前会话租约。 - [x] D7-T02:租约绑定成员、会话、项目和 thread,并在切换、到期或消费后回落。 - [x] D7-T03:控制中心新增租约状态、原生确认和立即撤销入口。 - [x] D7-T04:成员只能自助提权,管理员仅能代为撤销;租约操作写入审计。 - [x] D7-T05:新增仓库级 JSON 策略、严格验证和失败关闭。 - [x] D7-T06:确认卡、入队和执行前重复检查仓库策略。 - [x] D7-T07:项目卡显示策略状态,设置中心遵守项目 sandbox 上限。 - [x] D7-T08:抽取共享凭据脱敏并覆盖日志、诊断、outbox、审计和主要卡片。 - [x] D7-T09:补齐租约隔离、过期、策略验证、符号链接和卡片脱敏测试。 ## 8. 非目标 - 把正则命令检查描述成不可绕过的操作系统安全边界。 - 允许仓库策略关闭全局外部动作确认或提高主机/角色权限。 - 管理员在成员不知情时替成员创建完全访问租约。 - 在飞书中收集密码、Token、私钥或其他秘密回答。 - beta.4 自动为每个任务创建容器、虚拟机或 Git worktree。