审计日志
每次凭证使用都记录在防篡改的哈希链审计日志中。
Open Connector 将每一次代理的凭证使用都记录到一个防篡改的哈希链审计日志中。审计日志回答了这样一个问题:"哪个 Agent、代表哪个用户、在什么时间调用了哪个工具、结果如何?"——并附带记录未被事后篡改的密码学证据。
该日志是磁盘上一个只追加的 NDJSON 文件(.audit/*.jsonl),每行一条记录,由 apps/server/src/audit.ts 基于 evlog 写入;当配置了 OTLP_ENDPOINT 时,同样的事件还会镜像到您的可观测性栈。磁盘文件是完整性凭证,OTLP 是可查询的副本。
审计日志记录什么
每条记录是一条 wide event。审计载荷位于 audit 键下:
Prop
Type
审计日志绝不记录凭证值、第三方请求体或响应载荷——只记录元数据(id、action、outcome、status)。任何 changes 字段在写入记录前都会被脱敏(见 脱敏)。
哈希链机制
每条记录的 hash 是对规范化的记录内容加上前一条记录的 hash(即 prevHash)计算的 SHA-256。该链的工作方式类似区块链:每条记录都承诺了它前一条记录。这意味着:
- 插入攻击可被检测——在中间插入一条记录会从该处起断开整条链。
- 删除/重排序可被检测——删除或移动一条记录会让其后继记录的
prevHash指向一个不再是其前驱的哈希。 - 篡改可被检测——修改任何字段都会使该记录的
hash以及其后所有哈希失效。
无需独立的验证服务。仓库自带验证器:verifyAuditChain(readAuditJournal(dir))(位于 apps/server/src/audit.ts)通过 evlog 自己的签名器重新推导整条链,链完整时返回 -1,否则返回第一条被破坏记录的索引。参见工程指南 docs/how-to/verify-the-audit-journal.md 与 docs/reference/audit-journal.md。
审计事件
日志记录每一次凭证触碰以及关键的生命周期事件。当前发出的 action:
| Action | 触发场景 |
|---|---|
connector.proxy | Agent 代理执行工具(POST /tools/execute/proxy) |
connector.connect | 提交凭证(托管 connect/link 提交、原生 POST /connected_accounts) |
connector.initiate | 启动 OAuth 流程(/oauth/start、交互式 connect) |
license.issue / license.canceled / license.payment_failed | EE 许可证生命周期(Stripe webhook) |
webhook_subscription.delivery / webhook_endpoint.delivery | 一次出站 webhook 投递尝试 |
trigger.event.received | 一个经过验证的入站 trigger 事件被接收 |
auth.email | 一封事务性认证邮件(验证/重置/邀请)被发送 |
此列表是描述性的,而非冻结的契约——新的凭证入口会添加自己的 action。
脱敏
密钥和 PII 在记录写入之前就被屏蔽(在 initLogger 流水线中,位于 drain 之前):
- 路径擦除(
auditRedactPreset)将audit.changes.*下枚举的密钥字段(token/apiKey/accessToken/refreshToken/secret/password/认证头)屏蔽为"[REDACTED]"。 - 内容掩码器(email / JWT / IPv4 / 信用卡)在生产环境中开启以全面保护 PII,在开发环境中关闭以便本地调试链接保持可读。
访问日志
目前没有审计读取/导出的 HTTP API。您有两种方式访问该日志:
磁盘上(完整性凭证)
直接读取 apps/server/.audit/*.jsonl,并用自带的验证器确认它未被篡改——参见 docs/how-to/verify-the-audit-journal.md。
通过 OTLP / Loki(可查询的镜像)
当设置了 OTLP_ENDPOINT 时,相同的事件会写入 OpenTelemetry Logs。在 Loki 中:
{service="open-connector-server"} | json | audit_action =~ "connector\\..*"查询某个连接的所有代理调用:
{service="open-connector-server"} | json
| audit_action = "connector.proxy"
| audit_target_id = "conn_01j9xyz789"完整的已验证查询库见 docs/observability/queries.md。Loki 是运维工具,使用 Loki 形态的 id——它是便于查询的镜像,而非防篡改的凭证。
保留与合规
该日志是磁盘上只追加的 NDJSON 文件(外加可选的 OTLP 副本)——而非数据库表。保留策略由您作为运维方负责:
- GDPR / 被遗忘权:日志不存储用户 PII——只存 id(
actor/target),不存姓名或邮箱。要满足擦除请求,删除对应的 connected account;引用其 id 的审计记录为合规连续性而保留,但不含任何可识别个人身份的信息。 - SOC 2 / ISO 27001:哈希链提供访问日志未被事后篡改的不可否认证据。随时运行
verifyAuditChain即可产出该证据。 - 长期保留:按计划将
.audit/*.jsonl文件(和/或 OTLP 副本)归档到只追加的存储(S3、GCS)。高级的长期保留/导出由@open-connector/ee-audit许可证权益门控(auditPolicy()/assertAuditExport());这些门控所守护的租户范围读取/导出 API 是一项跟踪中的后续工作,尚未构建。
默认的哈希链状态是内存中、单进程的。对于多进程或多实例部署,请用共享状态支撑该链(signed(..., { strategy: "hash-chain", state })),使其在重启后存续并跨实例。权衡取舍见 docs/explanation/audit-journal.md。