第2章 AWS CloudTrail 概述:定义、功能、工作原理与核心区别
说到云上的审计日志,很多人的第一反应是“不就是记录谁干了什么吗?”
其实没那么简单。我刚开始接触 AWS 的时候,也犯过把 CloudTrail 和 CloudWatch Logs 混为一谈的错误。
今天咱们就把 CloudTrail 彻底掰开揉碎,看看它到底是什么、能干什么、怎么工作,以及跟 CloudWatch Logs 到底有啥不一样。
2.1 CloudTrail 的定义
AWS CloudTrail 是一项安全审计服务,说白了就是——记录你 AWS 账户里所有 API 活动的“黑匣子”。
不管你是在控制台点了个按钮、用 CLI 跑了个命令,还是某个服务自动调用了 API,CloudTrail 都会忠实地记下来。
我经常跟团队说:“没有 CloudTrail 的 AWS 账户,就像没装摄像头的金库——你永远不知道谁在什么时候碰了哪一根金条。”
CloudTrail 记录的内容包括:
- 谁(IAM 用户/角色/联合身份)执行了操作
- 什么时间(精确到毫秒)
- 从哪个源 IP 发起的
- 调用了哪个 API 操作
- 请求参数和返回结果
- 是否成功,如果失败会记录错误码
2.2 CloudTrail 的核心功能
我个人把 CloudTrail 的功能分成三个层级,你想想看是不是这样:
| 层级 | 功能 | 说明 |
|---|---|---|
| 基础层 | 事件记录 | 默认自动记录过去 90 天的管理事件(控制台、CLI、SDK、服务调用) |
| 增强层 | 持续记录 & 长期存储 | 创建 Trail 后,事件写入 S3,可保存数年;支持 S3 生命周期策略 |
| 智能层 | 分析 & 告警 | 结合 CloudWatch Logs、Athena、Lambda 做实时告警和事后分析 |
另外有几个容易被忽略的功能点:
- 多区域聚合:一个 Trail 可以记录所有区域的事件,统一放在一个 S3 桶里
- 跨账户聚合:把多个子账户的日志整合到审计账户,方便做集中审计
- 组织级 Trail:AWS Organizations 所有成员账户自动继承,非常省心
- 数据事件:除了管理事件,还能记录 S3 对象级别的 GetObject/PutObject 等操作
2.3 CloudTrail 的工作原理
CloudTrail 并不是一个“主动轮询”的服务,而是监听 AWS 内部 API 网关的所有调用。
每一次 API 请求,都会经过 AWS 的授权层,CloudTrail 在授权通过后把请求和响应拷贝一份,写入日志。
整个流程大致分四步:
- API 调用发生(来自控制台、CLI、SDK 或服务间调用)
- AWS 内部路由到目标服务,同时 CloudTrail 捕获到事件
- 事件被格式化成 JSON 格式(包含请求/响应/身份/时间戳)
- 写入目的地:默认保留 90 天(事件历史查看器),或写入 S3(Trail 配置),还可选择同步到 CloudWatch Logs
嗯,这里要注意:CloudTrail 记录的是 API 层面的“谁-什么时候-做了什么”,而不是操作系统的系统日志。它不关心 EC2 实例内部 /var/log/messages 里的内容,只关心你调用了 RunInstances 还是 TerminateInstances。
2.4 CloudTrail 与 CloudWatch Logs 的区别
这是我在面试里经常被问到的问题,也是很多新人容易搞混的地方。
一句话总结:CloudTrail 管“谁做了什么操作”,CloudWatch Logs 管“应用/系统输出了什么日志”。
我用一个表格把核心差异列出来:
| 维度 | CloudTrail | CloudWatch Logs |
|---|---|---|
| 记录内容 | AWS API 调用(请求/响应/身份) | 应用日志、系统日志、自定义日志流 |
| 来源 | AWS 内部 API 网关 | EC2 实例、Lambda、容器、自定义代理 |
| 典型用例 | 安全审计、合规审查、IAM 权限分析 | 应用排错、性能监控、日志聚合分析 |
| 保留策略 | 默认 90 天(事件历史)或 S3 永久 | 按日志组设置保留天数(1 天到 10 年) |
| 可否修改/删除 | 不可修改(S3 中可配置写保护) | 可以通过 IAM 权限删除 |
| 数据格式 | 固定 JSON 结构(AWS 预定义) | 自由文本/JSON(由应用决定) |
我记得有一次帮客户排查安全事件,对方信誓旦旦说“我们开了 CloudTrail,肯定能查到是谁删了 S3 桶”。结果查了半天发现,他们只配置了 CloudWatch Logs 收集 EC2 系统日志,根本就没有创建 Trail……
嗯,这种坑我踩过一次就不会再犯了。
2.5 两者的协作关系
虽然功能不同,但 CloudTrail 和 CloudWatch Logs 经常配合使用:
- CloudTrail → CloudWatch Logs:创建 Trail 时选择“将事件发送到 CloudWatch Logs”,就可以在 CloudWatch 里实时查看 API 调用,并设置告警(比如收到 Root 用户登录就发通知)
- CloudTrail + CloudWatch Logs Insights:用 SQL 式查询分析日志,快速定位特定用户的操作
- CloudTrail + Lambda + CloudWatch Alarm:实现自动化的安全响应(例如检测到“删除 VPC”操作,自动触发 Lambda 发送通知并记录)
说句实话,我遇到的大部分 AWS 安全问题,都是通过 CloudTrail 日志结合 CloudWatch 告警发现的。如果你只靠人工翻日志,那效率太低了。
2.6 避坑指南:我曾经的教训
最后分享一个我自己的惨痛经历。
几年前我负责一个金融项目,合规要求必须保留所有 API 日志至少 7 年。我自信满满地创建了 Trail 写入 S3,然后觉得万事大吉。结果半年后审计发现,某几天的日志有缺失。
排查之后发现:当时用的 S3 桶开启了生命周期策略,配置的是“30天后自动删除”。而我没有做桶版本控制!
从那以后,我的 S3 审计桶都遵循三条铁律:
- 开启版本控制,防止误删或覆盖
- 启用 MFA Delete,防止恶意删除
- 配置生命周期(比如标准存储 90 天 → Glacier 3 年 → Glacier Deep Archive 7 年)
另外还要注意:创建 Trail 时,一定要检查是否勾选了“Apply to all regions”。我见过有人只选了当前区域,结果另一个区域的违规操作完全没记录。CloudTrail 是个好东西,但用错了也很要命。