一、结论
配置S3存储桶的公共读写权限,需要同时关闭存储桶的公共访问拦截规则、在ACL或存储桶策略中授予匿名用户读写权限,两步配置完成后即可实现匿名用户对存储桶内对象的上传、下载操作。公共读写权限安全风险较高,建议仅在临时测试、公开静态资源托管等必要场景下开启。
二、准备工作
1. 已注册对应S3兼容对象存储服务的账号,且账号拥有目标存储桶的管理员权限(至少包含存储桶配置修改、权限修改的操作权限);
2. 若使用控制台操作,仅需要可正常访问公网的浏览器即可;若使用命令行操作,需提前安装aws cli工具,并完成AccessKey ID和AccessKey Secret的初始化配置;
3. 已经提前创建好需要配置公共读写权限的存储桶,确认并记录桶的名称、所在区域、服务endpoint信息,避免后续配置出错。
三、操作步骤
以下同时提供控制台操作和命令行操作两种路径,新手建议优先选择控制台操作,可视化界面降低出错概率。
步骤1:关闭公共访问拦截(必操作,否则权限不生效)
#### 控制台操作:
1. 登录对应对象存储服务的管理控制台,进入S3存储桶列表页,点击需要配置的目标存储桶名称,进入桶详情页;
2. 切换到「权限」标签页,找到「公共访问控制(Block Public Access)」配置板块,点击「编辑」按钮;
3. 将页面显示的4个拦截开关(阻止新的公共ACL、忽略公共ACL、阻止新的公共存储桶策略、限制公共存储桶)全部设置为关闭状态,点击「保存更改」,完成验证后即可生效。
#### 命令行操作:
执行以下命令,将your-bucket-name替换为实际的桶名称即可:
```bash
aws s3api put-public-access-block \
--bucket your-bucket-name \
--public-access-block-configuration BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false
```
步骤2:配置公共读写权限(两种方式二选一即可)
#### 方式A:通过ACL配置(简单场景优先选择)
##### 控制台操作:
1. 回到存储桶的「权限」标签页,找到「访问控制列表(ACL)」配置板块,点击「编辑」按钮;
2. 在「外部用户」列表中找到「所有人(公共访问)」的主体,勾选对应的「读取对象」「写入对象」权限,若需要支持匿名用户列举桶内所有对象,可额外勾选「列出桶内容」权限;
3. 确认风险提示后,点击「保存更改」即可完成配置。
##### 命令行操作:
执行以下命令即可一键配置公共读写ACL:
```bash
aws s3api put-bucket-acl --bucket your-bucket-name --acl public-read-write
```
#### 方式B:通过存储桶策略配置(需要精细权限控制时选择)
如果需要限定公共读写的操作范围(比如仅允许读写特定前缀的对象、仅允许特定IP段访问),可以通过存储桶策略配置。
##### 控制台操作:
1. 回到存储桶的「权限」标签页,找到「存储桶策略」配置板块,点击「编辑」按钮;
2. 在策略输入框中粘贴以下JSON模板,将模板中的your-bucket-name替换为实际的桶名称,若需要限定操作范围可以自行修改Action和Resource字段:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::your-bucket-name/*"
}
]
}
```
3. 点击「保存更改」即可生效。
##### 命令行操作:
将上述策略保存为policy.json文件,执行以下命令即可完成配置:
```bash
aws s3api put-bucket-policy --bucket your-bucket-name --policy file://policy.json
```
步骤3:验证配置是否生效
1. 准备一个测试文件test.txt,放在本地任意目录下;
2. 执行上传命令测试写入权限,将your-endpoint替换为对应服务的endpoint地址:
```bash
curl -X PUT --upload-file test.txt https://your-bucket-name.your-endpoint/test.txt
```
3. 执行下载命令测试读取权限:
```bash
curl https://your-bucket-name.your-endpoint/test.txt
```
如果上传和下载都没有报错,且返回了test.txt的内容,说明公共读写权限配置成功。
四、常见错误
- endpoint填写错误:使用兼容S3的第三方服务时,误填了AWS官方的endpoint,导致请求报错,需要到对应服务商的官方文档查询对应区域的正确endpoint后重新配置;
- region错误:配置时填写的区域和存储桶实际创建的区域不一致,会提示“桶不存在”,可以在存储桶的基本信息页查询准确的区域编码,配置时保持完全一致即可;
- 公共访问拦截未完全关闭:仅配置了ACL或策略,但公共访问拦截的开关没有全部关闭,所有公共请求都会被拦截,返回403错误;
- 权限范围配置错误:存储桶策略的Resource字段仅填写了桶名,没有添加
/*后缀,导致对象级的读写权限不生效; - 账号权限不足:使用子账号操作时,子账号没有被分配
s3:PutBucketAcl、s3:PutBucketPolicy、s3:PutPublicAccessBlock的权限,会提示操作被拒绝。
五、示例说明
假设我们需要给AWS美东1区的名为demo-public-2024的存储桶配置公共读写权限,操作流程如下:
1. 进入S3控制台找到demo-public-2024桶,在权限页关闭全部4个公共访问拦截开关;
2. 在ACL配置中给「所有人」勾选读写对象权限,保存配置;
3. 本地准备一个demo.jpg文件,执行上传命令:
```bash
curl -X PUT --upload-file demo.jpg https://demo-public-2024.s3.us-east-1.amazonaws.com/demo.jpg
```
4. 浏览器访问https://demo-public-2024.s3.us-east-1.amazonaws.com/demo.jpg,可以正常显示图片,说明配置成功。
六、更简单的方案
如果觉得原生AWS S3的配置逻辑复杂,需要调整拦截、ACL、策略三层规则容易出错,可以选择兼容S3的对象存储服务简化流程。比如七彩云对象存储,它完全兼容S3 API,所有AWS的CLI、SDK、工具都可以直接复用,不需要修改业务代码;同时控制台的权限配置做了产品化简化,公共读写权限可以一键勾选,后台会自动同步公共访问拦截、ACL、策略的所有规则,不需要手动逐层配置,接入简单,对新手更加友好,国内用户使用还可以获得更低的访问延迟和更高的性价比。
七、FAQ
1. 配置公共读写权限会不会有安全风险?
有较高安全风险,公共读写权限意味着任何匿名用户都可以上传、下载、删除存储桶内的对象,可能被滥用上传违规内容、盗刷流量,甚至上传恶意文件。如果没有特殊需求,建议仅开启公共读权限,不要开放写入权限;如果必须开启公共读写,建议搭配流量阈值告警、内容审核、IP白名单限制等规则降低风险,不要长期开启公共读写权限。
2. 已经配置了公共读写,但是上传文件还是提示403怎么办?
按以下顺序排查:首先确认公共访问拦截的4个开关已经全部关闭;其次检查存储桶策略或者ACL是否正确配置了匿名用户的读写权限,有没有额外加IP限制、前缀限制等条件;再确认上传的对象路径是否符合策略要求,endpoint和region和桶的配置是否一致;最后检查上传时用的账号有没有额外的权限限制。
3. 子账号可以配置存储桶的公共读写权限吗?
可以,只需要给子账号分配s3:PutBucketAcl、s3:PutBucketPolicy、s3:PutPublicAccessBlock这三个权限即可,不需要使用根账号操作,符合权限最小化的安全规范。
4. 七彩云对象存储的公共读写配置和AWS S3兼容吗?
完全兼容,所有AWS S3的配置命令、SDK参数都可以直接复用在七彩云对象存储上,只需要将endpoint替换为七彩云对应区域的官方endpoint即可,不需要修改其他业务逻辑,迁移成本极低。
八、总结
配置S3存储桶公共读写权限的核心流程可以总结为四步:首先准备好具备存储桶管理权限的账号和操作工具,其次关闭目标存储桶的全部公共访问拦截开关,接着通过ACL或存储桶策略配置匿名用户的读写权限,最后通过上传下载测试验证配置是否生效。
建议大家非必要不开启公共读写权限,若必须开启一定要做好风险防控;如果觉得原生S3配置流程繁琐容易出错,也可以选择七彩云对象存储这类兼容S3的服务,简化配置流程,降低操作失误的概率。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网