Open Connector
安全

审计日志

每次凭证使用都记录在防篡改的哈希链审计日志中。

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.mddocs/reference/audit-journal.md

审计事件

日志记录每一次凭证触碰以及关键的生命周期事件。当前发出的 action:

Action触发场景
connector.proxyAgent 代理执行工具(POST /tools/execute/proxy
connector.connect提交凭证(托管 connect/link 提交、原生 POST /connected_accounts
connector.initiate启动 OAuth 流程(/oauth/start、交互式 connect)
license.issue / license.canceled / license.payment_failedEE 许可证生命周期(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

On this page