Files
oci-portal/.trellis/spec/backend/oci-audit.md
T
2026-07-16 16:36:31 +08:00

1.8 KiB

OCI 审计事件集成约定

2026-07 审计日志重构(数据源切换 + 检索 + 配额回退)沉淀;实现见 internal/oci/audit.go

数据源:双通道,Search 主路 + Audit API 回退

  • Audit API(audit.ListEvents)无排序参数,窗口内固定按处理时间正序分页。任何"从最新往更早"的列表需求禁止直接用它凑批——首批会拿到窗口内最旧的一段(2026-07-16 曾以此形态上线出 bug)。
  • 倒序列表一律走 Logging Search(loggingsearch.SearchLogs,search "<tenancy>/_Audit" | ... | sort by datetime desc)。硬约束:单次查询时间窗 ≤ 14 天、limit ≤ 1000、时间过滤基于处理时间而非发生时间。
  • 部分免费租户 Logging Search 服务配额为零(报错含 Rate limit exceeded + maxQueriesPerMinute: 0,SDK 解析该错误体还会失败),属永久不可用,须自动回退 Audit API(小窗正序 + 前端全局重排);普通限流(配额非零)不回退。游标携带通道模式,续查不再试错。

检索语义

  • logContent = '*词*' 是对整条日志 JSON 所有字段值的包含匹配,会命中隐藏认证元数据(如 opc-principal 头里的 ttype: login),只可作服务端粗筛;用户可见语义必须再做客户端精筛(只匹配列表可见字段,不区分大小写,* 通配分段)。
  • 用户输入进检索语句前必须消毒(去引号/反斜杠/控制字符、截断),见 SanitizeAuditTerm

批式回溯的预算纪律

  • 单批双预算:页数(maxAuditPages)+ 时间(auditBatchTimeBudget≈20s)。全文检索命中稀疏时大窗扫描单页可达十余秒,没有时间预算会出现 3 分钟级单请求。
  • 空窗按倍增扩窗(上限受 14 天查询窗约束);响应回传 scannedThrough 供前端展示回溯进度,前端自动补批必须封顶,由用户显式继续。