目标
找出所有允许匿名读取或写入的存储桶,确认哪些公开是业务需要的,关闭意外暴露,同时不破坏确实需要公开访问的静态资源。
步骤
- 盘点所有账户中的存储桶,包括自动化创建的桶,记录账户、区域、创建时间、静态网站配置和公共访问阻止设置。
- 检查桶策略和 ACL 中是否存在通配符主体,然后从云网络之外发送匿名 GET 和 PUT,测试已知对象和不存在的键。
- 与归属团队确认公开访问是否必要、哪些路径需要公开、是否已有 CDN 或签名 URL;为每个有意公开的桶记录负责人和分发路径。
- 变更前导出桶策略和 ACL,对非有意公开的桶启用四项“阻止公共访问”设置,并保存备份:
aws s3api get-public-access-block --bucket acme-marketing-assets
aws s3api get-bucket-policy --bucket acme-marketing-assets > policy-backup.json
aws s3api put-public-access-block --bucket acme-marketing-assets \
--public-access-block-configuration \
BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true
curl -s -o /dev/null -w "%{http_code}\n" \
https://acme-marketing-assets.s3.amazonaws.com/index.html
- 对需要公开的资源改用 CDN 加源站访问控制,桶保持私有,并更新应用中的资源地址。
- 从外部重新执行匿名检查,开启访问日志,并对允许通配符主体的策略变更加告警。
验证
在云网络之外对每个桶执行匿名 GET 和 PUT,确认返回 403;检查公共访问阻止设置全部开启;通过 CDN 访问仍然正常;访问日志和策略告警能够产生记录。
回滚
恢复导出的策略并关闭公共访问阻止,即可在数秒内回到变更前状态。若发现匿名写入,应先保留日志和对象版本证据,再关闭访问,否则会破坏事件定级所需的证据;匿名写入应按安全事件处理。删除对象或对象版本才是不可逆步骤,不要把清理和暴露修复放在同一次变更中。重新开放公共访问只允许用于有负责人、有书面理由的桶,并在变更后重新测试。