You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

S3存储桶是否需要设为公开才能向应用提供用户可查看的图片?

S3公开资源存储桶安全配置方案

核心疑问直接答复

你之前配置时出现访问被拒绝的问题,本质是没理清S3「阻止公共访问」开关和桶策略的优先级关系,针对存放公开可访问图片的存储桶,不需要完全无差别放开所有公共访问设置,也不需要用签名URL方案,按最小权限规则配置即可。

  • 如果你需要支持任意匿名用户直接通过资源URL发起GET请求访问公开图片,必须针对性关闭「阻止公共访问」中拦截公开读的对应规则,否则不管桶策略怎么写,顶层拦截会直接拒绝所有匿名请求,这就是你之前按文档思路配置报403的核心原因。
  • AWS文档提到的「永远不要开启存储桶公共访问」,指的是不要无差别关闭所有公共访问拦截、不要配置过宽的全局读写/列表权限,不是禁止公开读这类合理的业务场景。

公开存储桶的正确配置步骤

第一步:调整「阻止公共访问」开关

不要把四个拦截开关全部关闭,仅关闭和ACL公开读相关的两项即可,剩余两项保持开启:

  • 关闭Block public access to buckets and objects granted through new access control lists (ACLs)
  • 关闭Block public access to buckets and objects granted through any access control lists (ACLs)

等你把桶策略配置完成、验证公开读和写权限都正常后,可以把剩下两个和桶策略公共访问拦截相关的开关重新打开,不会影响已经配置好的合法规则,还能避免后续误操作修改桶策略导致权限泄露。

第二步:编写最小权限桶策略

桶策略只需要配置三类规则,不要给多余权限:

  1. 匿名用户权限:仅允许所有来源对桶内对象执行s3:GetObject操作,绝对不要开放s3:ListBucket、任何写操作权限,避免被人遍历桶内资源、恶意上传内容
  2. 应用侧写权限:不要直接绑定EC2实例ARN,正确做法是给运行Rails应用的EC2实例绑定专属IAM角色,在策略中指定该角色为可信实体,仅开放业务需要的s3:PutObject、s3:DeleteObject、s3:PutObjectAcl这类上传、删除、修改对象的权限,资源范围严格限定在当前存储桶内
  3. 兜底拒绝规则:增加一条优先级最高的拒绝规则,除了上述两类身份(匿名读、EC2应用角色写)之外,其他所有身份、所有来源的操作全部直接拒绝,避免其他IAM权限配置不当导致的越权访问。

其他场景配置建议

  • 你提到的签名URL性能损耗、临时URL影响SEO的问题确实存在,对于固定公开访问的头像、壁纸类静态资源,现阶段直接走存储桶公开读的方案完全合理,没有必要为了追求“绝对不公开”强行用签名URL增加不必要的复杂度。
  • 等后续你部署CloudFront时,只需要给CloudFront配置OAC源访问控制,把存储桶权限调整为仅允许CloudFront身份访问对象,之后就可以把存储桶的所有「阻止公共访问」开关全部打开,用户侧全部走CloudFront域名访问资源,安全性更高,也不会影响访问速度和SEO效果。
  • 专门存放内部非公开内容的存储桶,把四个「阻止公共访问」开关全部保持开启,不要加任何匿名相关权限,仅给需要访问的对应IAM角色配置必要的读写权限即可。

内容的提问来源于stack exchange,提问作者humbledev7000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:36:14