安全扫描发现备份桶里 37 个 .sql.gz 可以匿名下载,URL 不带签名也能打开,里面有用户邮箱和手机号。乍看像缓存或者权限的锅,追下去往往不是。

aws s3api put-bucket-acl --bucket my-backup --acl private
aws s3api get-object-acl --bucket my-backup --key db.sql.gz

追下去是这么回事:上传脚本为了省事把 ACL 设成 public-read,桶策略也没限制。备份文件一旦公开,等于把整库数据挂在网上。

「备份桶权限」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。

监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

具体做法是,立刻把桶设为私有 并关闭公共读权限;换用带过期时间的签名 URL 访问;检查历史对象 确认没有残留的公开 ACL。

验收就看一点,不带签名的 URL 返回 AccessDenied,带签名的临时链接能正常下载。

作者 9823189