CloudTrail的启用与配置

开始动手配置CloudTrail时,我建议大家先想清楚一件事:你的日志到底要记多细?

很多人一上来就全开,结果一个月下来S3账单多出几千块,找日志还得翻半天。说白了,配置Trail不是点几下鼠标就完事,你得知道每个选项背后的成本和安全意义。

3.1 创建第一个Trail

进入CloudTrail控制台,左侧点“Trails”,然后点击“创建Trail”。

嗯,这里有个选择:应用到所有区域还是仅指定区域。我的习惯是——

  1. 多区域Trail:审计场景下必须选“是”。我见过有人只开了亚太区域,结果攻击者从美东区域入侵,日志全无。单区域Trail只适合临时调试,生产环境一律多区域。
  2. 组织Trail:如果你在用AWS Organizations管理多个账号,这里会多一个“为组织创建Trail”选项。选上它,整个组织的新账号会自动接入日志记录。我以前带过一个项目,20多个账号一个个手动配,累得够呛。有了组织级Trail,一次配置,全员覆盖。
小技巧:多区域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的私钥签名。你下载后用公钥验签,就能确认日志文件在传输和存储过程中没有被篡改过。

流程大致是:

  1. CloudTrail写入日志文件到S3
  2. 自动生成对应的.digest摘要文件(包含哈希+签名)
  3. 你定期用AWS CLI或SDK下载摘要文件
  4. 用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 核心流程一览

最后,我把这一章的核心逻辑画成一张图。你对照着图,脑子里把整个配置流程过一遍——

CloudTrail启用与配置核心流程 开始创建Trail 步骤1:创建Trail • 多区域Trail • 组织Trail 步骤2:选择S3存储位置 • 版本控制 • 桶策略 步骤3:设置日志前缀 • 按环境/账号命名 步骤4:启用日志文件验证 • 摘要文件 • 定时验签 创建完成 配置要点: • 多区域 vs 单区域 • 组织Trail覆盖所有账号 • S3桶策略不能误删 • 前缀用于日志分类 验证要点: • 默认开启但不一定配置 • 摘要文件自动生成 • 每周验签一次足够

这张图把四个核心步骤串了起来。你创建Trail时,脑子里过一遍:去哪创建、存哪、用啥前缀、开不开验证——四个问题回答完,配置就到位了。

相信我,这一步做扎实了,后面十四章的日志分析、告警、取证才有底气。别嫌麻烦,现在多花十分钟,以后少熬几个通宵排查安全事件。值不值?你自己算算。