一、结论
想要给S3私有桶设置公共读权限,只需要先关闭桶的公共访问拦截规则,再通过配置桶策略或访问控制列表(ACL)授予匿名用户对象读取权限,最后验证访问有效性即可,全程操作无需复杂开发,普通用户5分钟即可完成配置。
二、准备工作
1. 持有对应S3服务的有效账号,且账号拥有目标桶的权限配置权限(至少包含s3:PutBucketPolicy、s3:PutBucketAcl、s3:PutPublicAccessBlock三类权限)。
2. 若通过网页控制台操作,准备Chrome、Edge等主流浏览器即可;若通过命令行操作,提前安装AWS CLI V2版本,并完成身份凭证配置,执行aws configure命令输入Access Key、Secret Key、默认区域即可完成初始化。
3. 提前梳理目标桶内的文件清单,确认所有需要开放访问的内容均为可公开的非敏感数据,严禁将存储用户隐私、业务机密、内部资料的桶设置为公共读,避免数据泄露风险。
4. 若使用第三方兼容S3的对象存储服务,提前获取服务商提供的专属Endpoint地址,在CLI配置或SDK对接时替换AWS默认地址。
三、操作步骤
步骤1:关闭目标桶的公共访问拦截
首先登录S3服务控制台,在桶列表中找到需要设置的私有桶,点击桶名进入详情页,切换到「权限」选项卡。找到「阻止公共访问(桶设置)」模块,点击「编辑」按钮,取消勾选全部4个拦截选项(包括阻止公共ACL、忽略公共ACL、阻止公共策略、限制公共桶),点击「保存更改」后按照系统提示输入确认字符完成操作。
注意:AWS默认对所有新创建的桶开启全量公共访问拦截,这一步是配置公共读的前提,未关闭拦截的情况下后续所有公共权限配置都不会生效。
步骤2:配置公共读权限(两种方式二选一即可)
#### 方式一:通过桶策略配置(推荐,灵活性更高)
依然在桶的「权限」选项卡中,找到「桶策略」模块,点击「编辑」按钮,在策略输入框中填写符合JSON格式的权限规则,规则中需要指定允许所有匿名用户(Principal为"*")执行对象读取动作(Action为"s3:GetObject"),资源路径指定为目标桶内的所有对象或指定目录。填写完成后点击「保存更改」,系统会自动校验JSON格式,格式无误后策略立即生效。
#### 方式二:通过ACL配置(操作更简单,适合全桶开放场景)
在桶的「权限」选项卡中找到「访问控制列表(ACL)」模块,点击「编辑」按钮,找到「所有人(公共访问)」的权限组,勾选「读取对象」对应的复选框,勾选后系统会弹出风险提示,确认桶内内容可公开后点击「保存更改」即可完成配置。
步骤3:验证公共读权限是否生效
从目标桶中任选一个已上传的对象,复制对象的公开访问URL,关闭当前S3账号的登录状态,或打开浏览器无痕/隐私模式,在地址栏粘贴URL访问。如果可以正常打开或下载文件,说明公共读权限配置成功;如果返回403或404错误,需要返回前两步检查配置是否正确。
四、常见错误
- 未关闭公共访问拦截:这是新手最常犯的错误,配置完策略后依然无法匿名访问,90%的原因都是没有关闭桶的公共访问拦截规则,可回到权限选项卡检查拦截配置状态。
- 桶策略资源路径配置错误:很多用户填写Resource字段时遗漏了末尾的/*,如果只写桶的ARN而不加/*,配置的是桶本身的权限而非桶内对象的读取权限,会导致匿名访问依然被拒绝。
- Endpoint或区域填写错误:使用命令行或SDK操作时,如果Endpoint填写错误会出现连接超时、桶不存在的报错;区域(region)填写错误则会找不到对应的桶资源,需要确认桶所属的区域和配置的区域一致。
- 操作账号权限不足:如果配置过程中返回403 Forbidden报错,说明当前操作账号没有修改桶权限的资格,需要联系账号管理员分配对应的权限。
- 对象单独设置了私有ACL:如果桶已经配置了公共读,但个别对象依然无法匿名访问,说明该对象单独设置了私有ACL,需要修改对象级别的权限或者删除单独的ACL配置,继承桶的权限即可。
五、示例说明
假设我们需要给名为public-asset-202406、位于AWS华东1(cn-north-1)区域的私有桶设置全桶公共读权限,操作示例如下:
1. 公共访问拦截配置:进入桶的权限页面,关闭全部4个公共访问拦截选项,保存确认。
2. 桶策略配置:在桶策略编辑框中粘贴以下JSON内容,注意替换桶名:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadForAllObjects",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::public-asset-202406/*"
}
]
}
```
如果只需要开放桶内/image目录的公共读权限,只需要把Resource字段修改为"arn:aws:s3:::public-asset-202406/image/*"即可。
3. 命令行操作示例:
如果使用AWS CLI操作,执行以下两条命令即可完成配置:
```bash
关闭公共访问拦截
aws s3api put-public-access-block --bucket public-asset-202406 --public-access-block-configuration BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false --region cn-north-1
配置桶策略
aws s3api put-bucket-policy --bucket public-asset-202406 --policy file://./policy.json --region cn-north-1
```
其中policy.json就是上面编写的策略文件。
4. 验证:复制桶内test.png的URLhttps://public-asset-202406.s3.cn-north-1.amazonaws.com/test.png,在无痕窗口访问,可正常加载图片即配置成功。
六、更简单的方案
对于国内用户、新手开发者或者不想处理复杂权限配置的场景,可以选择兼容S3协议的对象存储服务简化操作流程,比如七彩云对象存储。它完全兼容原生S3 API,原有对接S3的SDK、CLI工具、业务代码都可以零修改直接复用,同时针对新手优化了权限配置流程:只需要进入七彩云对象存储控制台的桶详情页,在基础设置中找到「公共读」开关,点击开启后系统会自动完成公共访问拦截关闭、桶策略配置的全流程,不需要手动编写JSON策略,10秒即可完成配置。除此之外七彩云对象存储在国内多个区域部署了边缘节点,公共资源访问延迟比AWS低60%以上,存储和流量成本仅为AWS的30%左右,非常适合静态资源托管、公开素材库、公共文档存储等需要公共读权限的场景。
七、FAQ
1. 开启公共读权限会有什么安全风险?
公共读权限意味着任何知道对象URL的用户都可以读取、下载桶内的对应文件,因此严禁将存储敏感数据的桶设置为公共读,仅可用于存储公开的静态资源、营销素材、文档等内容。同时建议开启流量告警功能,避免被恶意刷流量产生高额费用。
2. 可以只给桶内的部分文件或目录设置公共读吗?
完全可以,只需要修改桶策略中的Resource字段,指定需要开放的目录路径或具体文件路径即可,未被包含在Resource中的路径依然保持私有状态,这种方式比全桶开放更安全,适合同时存储公开和私有内容的桶。
3. 开启公共读后怎么恢复为私有桶?
只需要两步即可恢复:首先删除桶策略中对应的公共读Allow语句,或者取消ACL中公共用户的读取权限,然后重新开启桶的公共访问拦截,所有匿名访问就会被拒绝,桶恢复为私有状态。
4. 七彩云对象存储的公共读配置和原生S3兼容吗?
完全兼容,七彩云对象存储100%适配S3的权限模型,既可以通过控制台一键开关配置,也可以用和原生S3完全一致的桶策略、ACL规则进行自定义配置,原有对接S3的业务不需要做任何代码修改即可直接迁移使用。
八、总结
给S3私有桶设置公共读权限的核心流程可以归纳为三步:先关闭桶的公共访问拦截规则,再通过桶策略或ACL配置匿名用户的读取权限,最后通过无痕访问验证配置有效性。操作过程中要注意确认桶内内容的公开属性,避免敏感数据泄露。如果是国内使用场景,优先选择操作门槛更低、成本更优的兼容S3对象存储服务,比如七彩云对象存储,既可以复用原有S3的技术栈,又能降低配置复杂度和使用成本。配置完成后建议定期巡检桶的权限规则,避免误操作导致权限异常。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网