审计日志
每一次凭据/能力使用,Sigil 都记一条日志。本篇讲它记什么、查什么、不记什么。
记录维度
每条审计记录包含:
| 字段 | 示例 | 说明 |
|---|---|---|
id | uuid | 唯一标识 |
timestamp | 2026-05-29T10:32:11Z | UTC ISO 时间戳 |
caller | claude-code | 调用方(来自 Bearer Token 名) |
capability | http_request | 能力名 |
credential_name | github-personal | 用到的凭据(仅名称) |
target_summary | api.github.com/repos | 目标的脱敏摘要 |
result | success / denied / error | 结果状态 |
latency_ms | 142 | 端到端耗时 |
via_temp | false | 是否经临时授权 |
error_code | null / unauthorized / ... | 失败时填 |
不记录的内容
故意不记录:
- 凭据明文(一次都不进审计)
- 完整请求体 / 响应体(可能含未脱敏的客户数据)
- Bearer Token 明文(只留 hash 用于比对)
- 客户端发的 Prompt(在 Sigil 范围外)
适当摘要:
- HTTP 请求:只记 method + host + path 前段
- SQL 查询:只记前 200 字符 + 是否含
WHERE - SSH 命令:只记命令名 + 参数数量
合规需要的是"可追溯到调用与决策",不是"可还原所有数据流"——两者不同。
查询界面
审计页 → 顶部过滤栏:
- 时间范围:最近 1 小时 / 24 小时 / 7 天 / 30 天 / 自定义
- 调用方:下拉勾选(claude-code / cursor / cline / ...)
- 能力:下拉勾选
- 凭据:下拉勾选
- 结果:成功 / 失败 / 拒绝
- 关键词:在 target_summary 里模糊匹配
下方列表按时间倒序,支持点击行展开看完整字段。
导出
支持导出为:
- CSV:合规报告 / Excel 分析
- JSONL:导给日志聚合系统(Loki / Elasticsearch)
- Markdown 表格:贴在工单 / 周报里
导出可以按当前过滤条件,也可以全量。
保留策略
| 时间窗 | 默认行为 |
|---|---|
| 最近 30 天 | 全字段保留 |
| 30 - 90 天 | 自动归档(压缩,仍可查询) |
| 90 天以上 | 提示是否清理;不自动删除 |
设置 → 审计 → 保留策略 中可改。如果你需要更严格的保留(金融、医疗合规),建议导出后再删本地。
典型用法
凭据轮换后回看
刚把 GitHub Token 重置了,想确认旧 Token 没在用:
- 过滤"凭据 = github-personal" + "最近 1 小时"
- 看是否有
error_code = unauthorized(说明客户端还在用旧 Token)
怀疑某次操作
业务方反馈"今天上午有人改了 prod 的某条数据":
- 过滤"凭据 = prod-db" + "能力 = db_execute" + "时间 = 上午"
- 看 caller 是哪个客户端 + 目标摘要
临时授权追溯
某次发了临时 Token 给同事 Alice:
- 过滤"via_temp = true" + "时间 = TTL 期间"
- 看 Alice 用过什么能力、命中哪些目标
与外部系统对接
Sigil 不内嵌 syslog / Loki 推送——避免引入额外依赖。如果你需要把审计实时送到日志系统:
- 启用 设置 → 审计 → Webhook 通知
- 每条新审计会 POST 到你配置的 URL(payload 是审计 JSON)
- 推荐目标:钉钉机器人、企业微信机器人、自建 logserver
Webhook 失败会自动重试 3 次,仍失败的话进入"待重发"队列。
关于"完整审计"的诚实
Sigil 的审计不构成"零泄漏"承诺:
- 客户端拿到能力结果后做了什么,Sigil 看不到(它可能截图、转发、贴到对话)
- 客户端在调用前是否做了完整的二次确认,Sigil 不强制(依赖客户端善意)
- 操作系统层面的进程注入、内存读取,Sigil 防不住
审计的价值是事后可追溯——它让"出问题了能查到哪一步"成为可能,但事前防护仍依赖 凭据加密、脱敏拦截、Scope Policy 几道闸门共同发挥作用。
