第2章:CloudTrail核心概念

CloudTrail 的核心,说白了就四个词:事件、轨迹、日志文件,以及管理事件 vs 数据事件。

我刚开始接触 CloudTrail 的时候,也被这几个概念绕得晕。后来在一次事故复盘里,因为搞混了「事件」和「日志文件」,差点把审计周期拖了两天。从那以后我就明白了——概念不清,后面全是坑。

2.1 事件:CloudTrail 的最小记录单元

事件就是一条操作记录。只要有人在 AWS 里做了点什么——创建 EC2、修改 S3 桶策略、调用 Lambda——CloudTrail 就会生成一个 JSON 格式的事件。

一个典型的事件长这样:

{
  "eventVersion": "1.08",
  "userIdentity": {
    "type": "IAMUser",
    "arn": "arn:aws:iam::123456789012:user/admin"
  },
  "eventTime": "2025-03-01T12:34:56Z",
  "eventSource": "ec2.amazonaws.com",
  "eventName": "RunInstances",
  "awsRegion": "us-east-1",
  "sourceIPAddress": "203.0.113.1",
  "requestParameters": { ... },
  "responseElements": { ... }
}

这里有几个字段我建议你重点关注:

  • eventSource / eventName:谁家的 API,哪个动作。
  • userIdentity:谁干的(用户、角色、Root 等)。
  • sourceIPAddress:从哪发起的请求。这个字段在排查异常访问时特别好用。
  • requestParameters / responseElements:具体改了啥、结果如何。
我的经验: 如果你做安全分析,别小看 eventVersion 字段。老版本的事件字段格式可能不一样,解析脚本容易出 bug。我曾经因为忽略版本差异,导致自动化分析漏掉了半个月的异常登录。

2.2 轨迹:把事件送到哪里去

事件本身就在 CloudTrail 服务里存着(默认保留 90 天)。但你真想长久审计,就得建一个轨迹(Trail)。

轨迹就是个管道。你告诉 CloudTrail:「把事件给我送到 S3 里,顺便通知 CloudWatch Logs。」

轨迹有两种:

  • 单区域轨迹:只记录一个区域的事件。适合小规模场景。
  • 多区域轨迹:把全球所有区域的事件都汇到同一个 S3 桶里。我个人的习惯是——只要预算允许,一律用多区域。否则你审计的时候发现「这个区域怎么没记录」,那才叫尴尬。
关键点:一个账户最多能建 5 条轨迹(默认限制)。但一般 1~2 条就够了:一条用于管理事件,另一条用于数据事件(后面会讲)。

轨迹可以实时投递,也可以启用日志文件验证(Log File Validation)。一旦开启,CloudTrail 会在日志文件旁生成一个 .digest 文件,用来校验日志是否被篡改。
我建议你在所有生产环境都打开这个功能——代价很小,但能让审计报告更有说服力。

2.3 日志文件:最终落地的 JSON 文本

CloudTrail 会把多条事件聚合成一个日志文件,写入 S3。文件路径很有规律:

bucket-name/AWSLogs/account-id/CloudTrail/region/yyyy/mm/dd/

文件名类似:123456789012_CloudTrail_us-east-1_20250301T1200Z_nz8x2b3c.json.gz

注意几个点:

  • 默认是 gzip 压缩。你直接下载是打不开的,得先解压。
  • 文件里是一组 JSON 对象,每行一个事件。嗯,不是标准 JSON 数组,是 JSON Lines 格式。
  • 同一个区域同一个小时内的事件会打包成一个文件。如果事件量很少,也可能没文件生成——这不算错误。

我自己遇到过一个问题:某天突然发现 S3 里少了几个小时的文件,排查半天发现是 CloudTrail 的投递权限配错了——那个 S3 桶的 KMS 密钥被轮转但忘了更新轨迹。所以,权限和密钥配置一定要定期检查。

2.4 管理事件 vs 数据事件

这是很多人最迷糊的地方。我直接给你画个表:

对比维度 管理事件 数据事件
记录对象 控制平面的操作(创建/删除/修改资源) 数据平面的操作(读写对象/调用函数/查询数据库)
典型例子 RunInstances、DeleteBucket、CreateUser GetObject、Invoke、PutItem
费用 免费(S3 存储费另算) 收费(每百万事件 $0.10)
默认是否开启 是(90 天可查) 否(需要专门配置轨迹)
常见场景 合规审计、权限滥用排查 数据泄露追溯、异常行为检测

管理事件默认就开着,数据事件你得主动买。为什么?因为数据事件的量级太大了——一个 S3 桶一天可能被读几百万次,全记下来成本爆炸。所以 AWS 把数据事件做成可选,按量付费。

避坑提醒: 我曾经有个客户,开了数据事件轨迹但忘记设置过滤器,结果一个月 S3 存储费多了 2000 美金。数据事件一定要按需过滤——只关注关键桶、关键 Lambda 函数,别全开。

那怎么选?我的建议:

  • 管理事件 → 必开,全域、多区域,免费为啥不开?
  • 数据事件 → 按敏感级别开。比如只记录包含 PII 的 S3 桶,或者只记录生产环境的 Lambda 调用。

整体关系图

下面这张图把上面几个概念串在一起。你看一眼就能明白事件怎么流转、轨迹怎么连接、最终日志怎么落盘。

CloudTrail 核心概念关系图 AWS 服务(EC2/S3/Lambda…) 产生事件 CloudTrail 服务 (默认保留 90 天) 配置轨迹 轨迹(Trail) 管理事件(免费) / 数据事件(付费) 投递 投递 S3 日志文件 JSON Lines / gzip CloudWatch Logs 实时告警 / 分析 Athena / QuickSight / 第三方 SIEM 数据事件需要通过轨迹单独 开启并设置过滤条件

从图中你能看到:事件从 AWS 服务产生,经过 CloudTrail 收集,再通过轨迹的配置,决定哪些事件被投递到 S3 或 CloudWatch Logs,最后由下游工具做审计分析。

一句话总结: 事件是原料,轨迹是管道,日志文件是成品;管理事件不要钱、直接开,数据事件要计划着开。