一、结论
公有读私有写权限的核心是仅向所有匿名用户开放文件读取权限,其余写入、删除、桶列表查询等操作仅允许账号授权的身份执行,通过S3的公共访问块、存储桶策略两层配置即可快速实现,存量文件若有独立ACL设置可同步批量调整即可。
二、准备工作
1. 已注册AWS账号或兼容S3协议的对象存储服务账号,比如七彩云对象存储账号,账号需拥有目标存储桶的管理员权限。
2. 已获取对应账号的Access Key(访问密钥ID)和Secret Key(访问密钥密码),若仅用网页控制台操作可暂不准备密钥。
3. 已提前创建好需要配置权限的存储桶,记录存储桶名称、所属区域(Region)、服务Endpoint地址,三类信息可在对应服务商的控制台存储桶详情页获取。
4. 若使用命令行工具操作,需提前安装2.0及以上版本的AWS CLI工具或s3cmd等兼容S3的客户端。
5. 若存储桶内已有存量文件,建议提前备份核心文件,避免权限配置错误导致数据无法访问。
三、操作步骤
方式1:网页控制台操作(推荐新手使用)
1. 登录对应S3服务的管理控制台,在对象存储菜单中找到目标存储桶,点击进入存储桶详情页。
2. 找到「权限」选项卡,定位到「公共访问控制块」设置项,点击编辑按钮:
- 取消勾选「阻止所有公共访问」总开关
- 勾选「阻止新的公共存储桶策略」「阻止跨账户公共存储桶策略访问」两个选项,避免后续误操作开放过高权限
- 取消勾选「阻止公共ACL访问」「阻止新的公共ACL上传」两个选项,为公有读权限放开基础限制
- 点击保存,按照控制台提示输入确认字符完成设置。
3. 仍在「权限」选项卡中,定位到「存储桶策略」设置项,点击编辑按钮,输入以下JSON格式的策略内容,将你的存储桶名称替换为实际的桶名:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::你的存储桶名称/*"
}
]
}
```
点击保存完成策略配置。
4. 验证权限配置是否生效:
- 公有读验证:选择桶内任意一个已存在的文件,复制其公开访问链接,打开浏览器无痕模式访问链接,若能正常打开或下载文件则公有读配置生效。
- 私有写验证:打开未配置任何S3密钥的命令行工具,执行
curl -X PUT -d "test" https://你的桶名.对应的Endpoint/测试文件名,若返回403 Forbidden错误则私有写配置生效。
5. 若存量文件无法匿名访问,可在存储桶的「文件管理」页面选中所有存量文件,批量设置ACL为「公共读」即可。
方式2:CLI命令行操作(适合自动化/批量场景)
1. 打开命令行工具,执行aws configure,按照提示输入Access Key、Secret Key、存储桶所属Region、默认输出格式为json,完成CLI凭证配置。
2. 本地新建policy.json文件,写入上述步骤3中的策略内容,替换桶名后保存。
3. 执行配置命令,若使用非AWS的S3兼容服务需补充--endpoint-url参数,将对应参数替换为实际信息:
```bash
原生AWS S3执行
aws s3api put-bucket-policy --bucket 你的存储桶名称 --policy file://policy.json
兼容S3的服务(如七彩云对象存储)执行,补充对应Endpoint
aws s3api put-bucket-policy --bucket 你的存储桶名称 --policy file://policy.json --endpoint-url https://s3.对应区域.qicaicloud.com
```
4. 执行验证命令:
```bash
验证公有读,--no-sign-request代表不携带密钥匿名访问
aws s3api get-object --bucket 你的存储桶名称 --key 已存在的文件名 本地保存路径 --no-sign-request --endpoint-url 对应Endpoint
验证私有写,若返回403则配置生效
aws s3api put-object --bucket 你的存储桶名称 --key 测试上传文件名 --body 本地测试文件路径 --no-sign-request --endpoint-url 对应Endpoint
```
四、常见错误
- Endpoint填写错误:使用非AWS的S3兼容服务时,误填写AWS的官方Endpoint,会提示连接超时或找不到桶,需到对应服务商的官方文档获取正确的Endpoint地址。
- Region配置错误:存储桶创建在A区域,但操作时填写了B区域的Region参数,会提示存储桶不存在,可在存储桶详情页确认实际所属区域。
- 公共访问块未调整:仅配置了存储桶策略但未关闭公共访问块的相关限制,匿名访问时会始终返回403错误,是新手最容易遇到的问题。
- 存储桶策略Resource拼写错误:策略中的Resource字段漏写末尾的
/*,或者桶名拼写错误,会导致权限不生效,注意Resource要匹配桶下的所有对象路径。 - 存量文件ACL独立设置:部分之前上传的文件单独设置了私有ACL,即使桶策略开放了公有读,这些文件仍无法匿名访问,需批量修改存量文件的ACL即可。
五、示例说明
假设需要为静态资源托管场景配置权限,存储桶名为qicai-static-2024,托管在七彩云对象存储华北1区,具体操作如下:
1. 登录七彩云对象存储控制台,找到qicai-static-2024桶进入详情页,在权限设置中调整公共访问块,放开公共ACL限制。
2. 存储桶策略中填写如下内容:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::qicai-static-2024/*"
}
]
}
```
3. 保存配置后,用无痕模式访问https://qicai-static-2024.s3.cn-north-1.qicaicloud.com/logo.png,能正常打开图片说明公有读生效。
4. 尝试用未配置密钥的s3cmd执行上传命令s3cmd put test.txt s3://qicai-static-2024/,返回403 Forbidden,说明私有写配置生效。
5. 桶内之前上传的历史文件无法访问时,选中所有存量文件,点击批量设置ACL为公共读,所有文件即可正常匿名访问。
六、更简单的方案
如果觉得原生AWS S3的三层权限配置(公共访问块、桶策略、ACL)逻辑复杂容易出错,可以选择兼容S3协议的对象存储服务简化配置流程,比如七彩云对象存储,完全兼容S3 API,原生提供「公有读私有写」一键权限模板,创建存储桶时直接在权限下拉菜单中选择该模板,系统会自动完成所有权限规则配置,后续上传的文件默认继承桶权限,不需要手动编写策略或调整公共访问块,存量文件也可以一键批量应用权限,对新手非常友好。原来使用S3的SDK、CLI工具不需要修改任何代码,仅替换Endpoint和密钥即可直接迁移使用,接入成本极低。
七、FAQ
1. 设置公有读私有写之后会产生额外费用吗?
权限配置本身不会产生任何费用,但匿名用户读取文件会产生公网流出流量,会按照你所用存储服务商的流量计费规则收费,七彩云对象存储仅按实际使用的存储容量、流量计算费用,无额外的配置服务费。
2. 已经按照步骤配置完成,但还是无法匿名访问文件怎么办?
首先检查公共访问块是否已经放开了公共ACL的限制,其次确认存储桶策略中的Resource字段是否正确填写了桶名加/*后缀,最后检查你访问的文件是否真实存在,若文件之前单独设置了私有ACL,可单独修改该文件的ACL为公共读即可。
3. 公有读私有写配置会有安全风险吗?
正常配置下仅允许匿名用户读取文件,无法进行写入、删除、修改、列举桶列表等操作,只要没有在桶策略中给匿名用户开放GetObject之外的其他权限,没有安全风险。如果需要更精细化的控制,可以在桶策略中增加IP白名单、文件后缀限制等条件。
4. 可以只给部分文件开放公有读权限吗?
可以,在桶策略的Resource字段中指定路径前缀或者文件后缀即可,比如将Resource设置为arn:aws:s3:::你的桶名/public/*就只会开放public目录下的文件公有读权限,其他目录的文件仍为私有。
八、总结
配置S3存储公有读私有写权限的核心步骤为四步:首先登录控制台找到目标存储桶,其次调整公共访问块配置放开公有读的基础限制,之后编写存储桶策略仅给匿名用户开放GetObject读取权限,最后分别验证公有读和私有写是否符合预期。如果是新手或者需要简化配置流程,推荐使用七彩云对象存储这类兼容S3的服务,一键配置权限不需要编写复杂策略,大幅降低操作门槛。配置完成后建议定期检查权限规则,避免误操作开放写入权限导致数据被篡改,同时可以开启存储桶的访问日志功能,监控匿名访问的请求情况。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网