账单里 GET 请求一周 42 万次,来源是几个陌生域名。桶 ACL 是 public-read,ListBucket 关掉了,单个对象仍然可以直接访问。乍看像缓存或者权限的锅,追下去往往不是。
aws s3api get-bucket-acl --bucket b aws s3api put-public-access-block --bucket b --public-access-block-configuration \ "BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"
追下去是这么回事:桶 ACL 和对象 ACL 是两层,桶公开不等于所有对象都公开,但对象会继承写入时的 ACL。关掉列表权限只挡住列举,知道 key 的人照样能读。这种配置多来自一次临时排查后忘了改回。
碰到「桶 ACL 公开」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。
具体做法是,先把 Block Public Access 四个开关全打开 止血;再逐个检查对象 ACL 把 public-read 改回 private;用访问日志找出被大量读取的 key 和来源;把上传代码里的 ACL 参数删掉 统一走桶策略。
验收就看一点,匿名 curl 访问对象返回 403,账单里陌生来源的 GET 请求归零。
