审计日志来源:CloudTrail 与 Secrets Manager 自身日志

很多团队刚开始做 Secrets Manager 审计时,第一反应就是「去 CloudTrail 查一下」。这没错,但你仔细想想,CloudTrail 记录的是管理事件,而 Secrets Manager 内部其实还有一层更细粒度的日志——也就是 Secrets Manager 自身的审计日志。这两者有什么区别?什么时候该用哪个?

我在这章就帮你把这两个来源彻底拆开,看看各自能记什么、不能记什么,以及在实际落地时怎么搭配使用。

CloudTrail 能记录什么

CloudTrail 是 AWS 的审计基础设施,几乎所有 API 调用都能被它抓到。对于 Secrets Manager,CloudTrail 主要记录的是管理平面(Control Plane)操作。说白了,就是谁在什么时间、从哪个 IP、调用了哪个 API,结果成功还是失败。

具体来说,CloudTrail 能记录的操作包括:

  • CreateSecret — 创建密钥
  • UpdateSecret — 更新密钥
  • DeleteSecret — 删除密钥
  • RotateSecret — 轮换密钥
  • PutSecretValue — 写入密钥值
  • GetSecretValue — 读取密钥值(注意:这是数据平面操作)
  • DescribeSecret — 查看密钥元数据
  • ListSecrets — 列出密钥
  • TagResource / UntagResource — 打标签
  • RestoreSecret — 恢复已标记删除的密钥

嗯,这里要注意:GetSecretValue 虽然属于数据平面操作,但 CloudTrail 默认也会记录它(只要开启)。所以很多安全团队靠 CloudTrail 来追踪谁读了哪些密钥。

我遇到过不少客户,以为 CloudTrail 只记管理事件,结果把 GetSecretValue 的审计漏了。好在 AWS 早就把这个包含进去了。但有个坑:CloudTrail 不记录密钥的明文值,只记录请求参数和响应大小。换句话说,你知道某人在 10:32 调用了 GetSecretValue,但你不知道他读到的密码具体是什么——除非你自己把响应内容存下来。

Secrets Manager 自身日志有什么不同

Secrets Manager 自身日志,其实指的是通过 AWS CloudTrail 的“数据事件”来捕获的,或者通过 Secrets Manager 的“审计日志”功能(也就是将日志发送到 CloudWatch Logs 或 S3)。

事实上,纯正的“Secrets Manager 自身日志”并不存在——AWS 并没有提供一个独立的日志系统叫“Secrets Manager 审计日志”。但大家口头上说的“自身日志”,通常指以下两种更细粒度的记录:

  1. CloudTrail 数据事件:可以单独开启对 GetSecretValue 等数据操作的记录。注意:默认 CloudTrail 只记录管理事件,数据事件需要额外付费配置。
  2. Secrets Manager 的 CloudWatch Logs 集成:你可以让 Secrets Manager 在密钥轮换、版本创建等事件发生时,直接向 CloudWatch 发送日志。这是 API 调用日志之外的业务事件日志。

我个人的习惯是:把 CloudTrail 当作主干,把 CloudWatch Logs 集成当作补充。为什么呢?因为 CloudTrail 记录的是“谁调用了什么 API”,而 CloudWatch 日志能记录“密钥轮换时发生了哪些内部步骤”。

来看一个具体的对比表格:

对比维度 CloudTrail(管理事件) CloudTrail(数据事件) Secrets Manager → CloudWatch 日志
是否默认开启 是(默认开启 Trail) 否,需手动启用并付费 否,需手动配置事件订阅
记录内容 API 名称、调用者、时间、源IP、请求参数 同上,但仅针对指定的数据操作(如 GetSecretValue) 密钥版本变化、轮换开始/结束、轮换失败原因等内部事件
是否记录密钥明文 否 否 否(仅记录元数据)
支持的密钥操作范围 管理操作(创建/删除/更新/轮换等) 数据操作(读取/写入) 轮换生命周期、版本管理
主要用途 变更审计、权限异常分析 读取频率分析、异常访问检测 轮换失败排查、密钥合规监控
成本考量 免费额度内(管理事件一般免费100MB) 按数据事件量计费,高频读取可能成本较高 按 CloudWatch 日志写入量计费,一般较低

从表格能看出,三个来源覆盖的视角完全不同。我曾在一次事故复盘中发现,CloudTrail 管理事件完美记录了某人删除了一个密钥,但是删除的原因(误操作还是自动轮换脚本的 bug)完全看不出来。后来靠 Secrets Manager 的 CloudWatch 日志才定位到是轮换 Lambda 函数抛出异常导致自动删除了旧版本。

实际落地:如何搭配使用

我个人推荐三层的审计日志架构:

  1. 第一层:CloudTrail 管理事件 —— 必开。记录所有密钥的管理变更,这是合规审计的底线。
  2. 第二层:CloudTrail 数据事件 —— 按需开启。如果密钥敏感度高(比如数据库密码),建议开启对 GetSecretValue 的数据事件审计,用于检测异常读取。
  3. 第三层:Secrets Manager 事件 → CloudWatch Logs —— 建议开。主要用于监控轮换健康状态,以及密钥版本的非标准操作。

我曾经遇到过这样的场景:某个密钥被反复轮换,导致下游服务频繁断开连接。CloudTrail 只记录了一堆 RotateSecret 调用,看不出问题出在哪。但 Secrets Manager 的 CloudWatch 日志里明确写了“轮换 Lambda 执行超时—重试中”。你看,这就是第三层的价值。

小技巧:你可以把这三个日志源都集中到一个 S3 桶里,然后用 Athena 做跨来源查询。比如搜同一个密钥 ID,在 CloudTrail 里看谁操作了它,在 CloudWatch 日志里看轮换过程是否有异常。

那些容易忽略的细节

再讲几个我踩过的坑:

  • CloudTrail 数据事件需要指定资源类型 — 如果你只开启了数据事件,但没选择 Secrets Manager 作为资源类型,那么 GetSecretValue 并不会被记录。别问我怎么知道的……
  • Secrets Manager 的 CloudWatch 日志不是实时 — 通常有几分钟的延迟,紧急排查时要注意。
  • 不要在两个来源中重复记录相同信息 — CloudTrail 数据事件已经记录了 GetSecretValue 的调用时间和调用者,你再通过 CloudWatch 日志去记同样的 API 调用就浪费钱了。
  • 轮换事件在 CloudTrail 中只显示“RotateSecret”调用 — 但轮换过程中的实际步骤(比如生成新版本、测试新版本)只会出现在 CloudWatch 日志里。
注意:如果你使用了 AWS Organizations 并启用了 CloudTrail Organizations Trail,那么所有成员账户的 Secrets Manager 管理事件都会被自动汇集到管理账户。但数据事件和 CloudWatch 日志仍需在每个成员账户单独配置。这一点容易被忽略。

知识结构总览

为了让这些关系更直观,我画了一张图。你可以看到三个日志来源与 Secrets Manager 的交互关系:

Secrets Manager 审计日志来源架构 Secrets Manager 审计日志来源架构 AWS Secrets Manager (密钥存储与轮换) CloudTrail 管理事件 CreateSecret/UpdateSecret/DeleteSecret 默认开启 CloudTrail 数据事件 GetSecretValue / PutSecretValue 需手动开启并付费 Secrets Manager → CloudWatch 轮换事件/版本变化/失败详情 需手动配置事件订阅 统一分析 (S3 + Athena / CloudWatch Logs Insights) 聚合三个来源进行关联查询 CloudTrail 管理/数据事件合并 可统一放入一个 Trail CloudWatch 日志 独立存储,费用另计

从这张图你也可以看出,三个来源彼此独立,但又互补。没有哪个来源能覆盖所有场景,所以别偷懒只开一个。我刚开始做审计方案时也想过“CloudTrail 管理事件不就够了吗”,后来发现连轮换失败的具体原因都看不到,才老老实实把三层都搭起来。

总结几个实用建议

  • 最低配置:至少开启 CloudTrail 管理事件,这是合规底线。
  • 标准配置:管理事件 + Secrets Manager 到 CloudWatch 的日志(用于轮换监控)。
  • 增强配置:在上面基础上,对高敏感密钥开启 CloudTrail 数据事件,专门追踪 GetSecretValue。
  • 别忘了标签:在密钥上打标签(如 Environment=Production, Compliance=SOC2),然后在 CloudTrail 或 CloudWatch 日志中基于标签做过滤查询,会省很多事。

好了,关于审计日志来源,该说的我都说了。你下次配置 Secrets Manager 审计时,记得把这层结构记在心里。别只盯着 CloudTrail 一个来源,多一层日志,就多一分安全感。