撤销访问与审计操作
撤销与审计回答不同问题。撤销阻止凭证继续被使用;审计记录已经发生了什么。系统两者都需要,且不能用其中一个推断另一个。
撤销路径
委托凭证在缺失、过期、撤销、伪造或绑定其他用户时必须 fail-closed。参考包一次性签发不透明 token,只保存哈希,并提供撤销与轮换操作。页面把安全凭证视图转换为 Surface 会话;token 本身不进入会话或响应。
撤销时:
- 存储提交撤销状态;
- 失效事件可以通知打开的客户端;
- 下一次
describe或invoke重新检查凭证,在执行前失败; - 页面停止把 Agent 显示为已连接。
事件总线是加速器。事件丢失不能让已撤销 token 继续可用。事实来源是存储的 introspect,且在下一次请求前检查。多实例部署需要共享存储或等价的强一致机制;两个独立内存存储不构成共享撤销系统。
Surface 审计
Surface 审计是元数据,不是业务请求副本。当前事件包括:
- 请求 id 与方法;
- Agent id、会话 id、用户 id,以及可用时的租户;
- 能力 id 与折叠记录 id;
- 结果:completed、business_error、denied 或 failed;
- 协议或业务错误码;
- 耗时;
- 可选公开 approval id。
它不包含输入参数、响应正文、Cookie、token 或审批秘密。这个限制是有意的:审计证明谁做了什么、结果如何;具体业务证据由业务后端按自己的合规保留规则保存。
审批关联
高风险操作需要真人审批时,审计应能把已执行请求与已消费审批 challenge 关联。使用公开 approval id,不要把 token 或 hash 返回给 Agent。关联查询失败不一定改变业务结果,但缺失 approval id 必须作为审计完整性问题被运维看见。
绑定应包含请求 id、能力、记录、用户、Agent、会话、规范化参数 hash 与有效期。页面审批后端负责签发和消费;Surface 只把公开 id 交给审计出口,并在返回 Agent 前剥离审批证据。
运行时限额与防重放
限流在执行前检查,并按已验证会话隔离。自定义限流器抛错或返回非法决定时 fail-closed。防重放作用于 invoke;窗口内重复请求 id 被拒绝,不再次执行。不同会话可以复用 id,窗口外重试在业务层面也不自动幂等。
运维演练
- 请求等待时撤销 Agent;确认下一次调用在执行器前失败。
- 断开事件流;确认 introspect 仍拒绝已撤销 token。
- 重启一个网关实例;确认页面重新连接或开始新会话。
- 批准危险请求;确认审计有公开 approval id,Agent 响应没有。
- 强制审计写入失败;确认业务结果不变,错误可见。
- 复用 invoke id;确认没有第二次副作用。
有用的承诺不是“网关记录了一切”,而是“系统能证明哪个会话发起了哪项声明调用、是否完成、是否有真人审批,同时不把凭证或业务载荷写进日志”。

