用途
该技能用于为任意 Cloudflare Workers 项目添加取证级(forensic-grade)结构化审计日志,满足 PDPA 2024 对安全相关事件可追溯记录的要求。
架构
整体数据流为:
API Route → auditLog() → console.log(JSON) → Cloudflare Workers Runtime → Tail Worker(palangic-audit-tail)→ R2 Bucket(NDJSON,按日期/小时分区)→ Object Lock(365 天合规保留)。
主要能力
- 创建类型化的审计工具(lib/audit.ts),定义 AuditEvent 事件类型,提供 generateRequestId() 与 auditLog() 函数。
- 为所有 API 路由埋点:在请求开始时生成 request ID,记录安全相关事件并携带该 ID,尽可能包含用户上下文。
- 创建 Tail Worker(workers/audit-tail/src/index.ts),从日志中筛选 level 为 audit 的条目,并附加 _worker、_requestUrl、_requestMethod、_ingestedAt 等字段,同时将异常记录为 worker.exception 事件。
- 将审计日志以 NDJSON 格式写入 R2,按 UTC 年/月/日/小时分区,键名形如 audit-logs/YYYY/MM/DD/HH/batch-<timestamp>.ndjson。
- 通过 Wrangler 配置 R2 绑定与 tail_consumers,并部署 tail worker。
- 通过 Cloudflare Dashboard 为 R2 存储桶启用 Object Lock(Compliance 模式,365 天)。
使用方式
- 创建审计工具:新建 lib/audit.ts,定义 AuditEvent 联合类型、generateRequestId() 和 auditLog()。
- 埋点 API 路由:在每个 API 路由中生成 request ID,记录认证失败、成功操作、错误等事件。
- 创建 Tail Worker:新建 workers/audit-tail/src/index.ts,实现 tail() 处理函数,解析日志、筛选审计条目、写入 R2。
- 配置 Wrangler:主 worker 的 wrangler.jsonc 添加 r2_buckets 与 tail_consumers;tail worker 的 wrangler.jsonc 配置 name、main、compatibility_date 与 r2_buckets。
- 部署与锁定:使用 npx wrangler r2 bucket create 创建存储桶,进入 workers/audit-tail 执行 npx wrangler deploy 部署 tail worker,然后在 Cloudflare Dashboard 的 R2 → 存储桶 → Settings → Bucket Lock Rules 添加规则(Type: Compliance,Duration: 365 days)。
记录的事件
- auth.unauthorized:未认证请求访问受保护路由,记录 route、requestId。
- webhook.rejected:无效 webhook token 或 payload,记录 reason、error。
- webhook.duplicate:重放的 webhook(幂等性捕获),记录 externalId、userId。
- webhook.credited:支付成功入账,记录 externalId、userId、credits。
- credits.spent:用户导出带水印文件,记录 userId、amount。
- credits.insufficient:用户在 0 积分时尝试导出,记录 userId。
- payment.created:发票创建成功,记录 userId、packKey、invoiceId。
- payment.error:Xendit API 失败,记录 userId、status、error。
- guest.limit_reached:访客达到每日限额,记录 fingerprint。
- worker.exception:worker 中未处理异常,记录 name、message。
适用场景
- 需要为 Cloudflare Workers 项目建立可追溯安全事件记录的场景。
- 需要满足 PDPA 2024 合规要求(Seksyen 5(1) 数据处理活动可追溯记录、Seksyen 5(2) 与数据敏感性相称的安全控制)。
- 需要不可篡改日志(写入后无法更改)的取证需求。
- 需要借助 request ID 关联单次请求流程中多个事件的事故响应场景。
限制与注意事项
- 审计日志不包含图像数据、个人文档或支付凭证。
- Request ID 为 UUID,不含 PII。
- R2 Object Lock 在 Compliance 模式下意味着任何人都无法删除日志(包括账户所有者)。
- 按日期/小时分区便于事故响应时高效查询。
- 关于收费、价格、平台支持范围等更多信息,资料中暂未提供。