CloudTrail的启用与配置
开始动手配置CloudTrail时,我建议大家先想清楚一件事:你的日志到底要记多细?
很多人一上来就全开,结果一个月下来S3账单多出几千块,找日志还得翻半天。说白了,配置Trail不是点几下鼠标就完事,你得知道每个选项背后的成本和安全意义。
3.1 创建第一个Trail
进入CloudTrail控制台,左侧点“Trails”,然后点击“创建Trail”。
嗯,这里有个选择:应用到所有区域还是仅指定区域。我的习惯是——
- 多区域Trail:审计场景下必须选“是”。我见过有人只开了亚太区域,结果攻击者从美东区域入侵,日志全无。单区域Trail只适合临时调试,生产环境一律多区域。
- 组织Trail:如果你在用AWS Organizations管理多个账号,这里会多一个“为组织创建Trail”选项。选上它,整个组织的新账号会自动接入日志记录。我以前带过一个项目,20多个账号一个个手动配,累得够呛。有了组织级Trail,一次配置,全员覆盖。
控制台创建很简单,但我个人更推荐用CLI。一来可重复,二来不容易漏配置。看这段代码:
aws cloudtrail create-trail \
--name my-audit-trail \
--s3-bucket-name my-company-logs-bucket \
--is-multi-region-trail \
--enable-log-file-validation \
--tags Key=Environment,Value=Production
命令行里每个参数都明确,出了问题也方便追查。我习惯把创建Trail的CLI命令写进基础设施即代码(IaC)的脚本里,这样每次环境部署都能保持一致。
3.2 选择存储位置(S3)
CloudTrail的日志会写入你指定的S3桶。说白了,S3就是CloudTrail的仓库,这个仓库的门锁和货架你都得管好。
选桶有几点硬性要求:
- 桶名全局唯一:这是S3的规则,不是CloudTrail定的
- 桶不能是公开桶:CloudTrail会拒绝写入公开桶
- 启用桶版本控制:防止日志被恶意删除或覆盖
我给大家一个实际的项目命名习惯——按功能区域划分:
| 用途 | 建议桶名格式 | 备注 |
|---|---|---|
| 生产环境审计日志 | prod-ct-logs-{账号ID}-{区域} |
主Trail使用 |
| 非生产环境审计日志 | dev-ct-logs-{账号ID}-{区域} |
开发/测试环境 |
| 组织级审计日志 | org-ct-logs-{管理账号ID} |
组织Trail专用 |
| 安全归档日志 | archive-ct-logs-{账号ID}-glacier |
90天后转归档 |
这个命名不是标准答案,但至少团队一看就明白这桶是干什么的。你想想看,没人愿意半年后在一堆无意义前缀的文件里大海捞针吧?
CloudTrail创建Trail时会自动给S3桶附加策略,允许CloudTrail服务写入。如果你自己手动改了桶策略,一定要保证这条权限还在。我曾经遇到过一个案例,因为S3桶策略配置不当,导致日志文件被误删,整个审计记录全没了。
3.3 设置日志文件前缀
日志文件前缀,说白了就是S3桶里文件路径的“第一层目录”。
CloudTrail默认的文件路径格式是这样的:
my-bucket/AWSLogs/{account-id}/CloudTrail/{region}/{year}/{month}/{day}/{account-id}_CloudTrail_{region}_{yyyyMMddTHHmmssZ}_{random}.json.gz
如果你在创建Trail时设置了前缀,比如AuditLogs,那么路径就变成:
my-bucket/AuditLogs/AWSLogs/{account-id}/CloudTrail/...
这里我踩过一个坑。以前我们只产生日志时觉得前缀无所谓,结果后来需要做跨账号日志聚合,所有数据都要按业务线分类。没前缀的日志全搅在一起,我们花了整整两天写脚本重新整理。
所以现在我的建议是:
- 按账号或环境设置前缀,比如
prod/、dev/、audit/ - 前缀不要太长,10个字符以内最好
- 前缀不要包含特殊字符,否则S3 Select查询时会出问题
3.4 启用日志文件验证
很多人不知道这个选项是干什么的。我碰到过一些客户,Trail跑了两年,从来没用过“日志文件验证”这个功能。
日志文件验证是什么?
CloudTrail会在每写一个日志文件后,自动生成一个摘要文件(Digest File)。这个摘要文件里包含原始日志文件的哈希值,然后用AWS的私钥签名。你下载后用公钥验签,就能确认日志文件在传输和存储过程中没有被篡改过。
流程大致是:
- CloudTrail写入日志文件到S3
- 自动生成对应的
.digest摘要文件(包含哈希+签名) - 你定期用AWS CLI或SDK下载摘要文件
- 用
aws cloudtrail validate-logs命令验签
aws cloudtrail validate-logs --trail-arn arn:aws:cloudtrail:... --start-time 2024-01-01T00:00:00Z --end-time 2024-01-31T23:59:59Z
命令跑完会输出每个日志文件的验证结果:
{
"LogsSucceeded": 342,
"LogsFailed": 0,
"LogsNotFound": 0,
"DigestsSucceeded": 12,
"DigestsFailed": 0
}
如果出现LogsFailed不为零,立刻调查——可能有人动了你的审计日志。
验证操作不需要每天做。我一般设置一个cron任务每周跑一次。如果日志量很大,建议用
--end-time分段处理,一次性跑全量数据容易超时。
还记得前面CLI示例里那个--enable-log-file-validation参数吗?如果你用控制台创建,默认就是开启的。但如果你通过SDK或CloudFormation创建,务必显式设置这个参数为true。很多自动化脚本里漏掉了这一步。
3.5 核心流程一览
最后,我把这一章的核心逻辑画成一张图。你对照着图,脑子里把整个配置流程过一遍——
这张图把四个核心步骤串了起来。你创建Trail时,脑子里过一遍:去哪创建、存哪、用啥前缀、开不开验证——四个问题回答完,配置就到位了。
相信我,这一步做扎实了,后面十四章的日志分析、告警、取证才有底气。别嫌麻烦,现在多花十分钟,以后少熬几个通宵排查安全事件。值不值?你自己算算。