一、结论
你可以通过三层权限管控实现S3私有文件的访问配置:首先开启Bucket全局公共访问阻止,再配置Bucket策略仅开放给授权身份,最后设置文件级ACL为私有,即可实现未授权用户无法访问私有文件,仅指定账号/角色/IP能正常读取。整个配置流程无需复杂二次开发,通过控制台或S3 API即可完成。
二、准备工作
1. 已开通S3服务的账号,持有Bucket所有者或管理员权限,避免因自身权限不足无法修改配置。
2. 已获取对应账号的Access Key ID和Secret Access Key,用于后续API调用或工具连接验证。
3. 操作工具可以选择服务商官方Web控制台(新手优先推荐)、AWS CLI命令行工具或S3 Browser可视化客户端。
4. 目标Bucket内已经上传至少1个测试用文件(如图片、文档),用于配置完成后的权限验证。
5. 若为生产环境操作,建议提前备份现有Bucket权限配置,避免误操作导致业务访问故障。
三、操作步骤
步骤1:定位目标Bucket权限配置入口
登录你所用的S3服务控制台,在存储桶列表中找到需要配置私有权限的目标Bucket,点击进入Bucket详情页,在顶部导航栏切换到「权限设置」标签页(部分服务商命名为「访问控制」「权限管理」,功能一致)。
步骤2:开启全局公共访问阻止
在权限设置页找到「公共访问阻止」配置模块,将以下4个选项全部设置为「开启」状态,点击保存:
- 阻止新的公共ACL上传
- 阻止现有公共ACL生效
- 阻止新的公共存储桶策略创建
- 阻止现有公共存储桶策略和接入点访问
这一步的作用是从Bucket全局层面禁止所有公共访问路径,避免后续对象ACL或策略配置疏漏导致文件意外公开。
步骤3:配置Bucket授权策略
找到「Bucket策略」或「IAM权限配置」入口,选择编辑策略:
- 如果是可视化配置面板:选择「添加授权规则」,指定授权对象(可选择IAM用户、角色、指定IP段),勾选允许的操作(如文件读取、文件列表查询),资源范围选择「整个Bucket及所有文件」即可。
- 如果是JSON编辑模式:可以直接参考后续示例的策略模板,替换其中的IAM用户ARN、Bucket ARN为你自己的资源信息,控制台通常会直接展示当前Bucket的ARN,直接复制即可无需手动拼接。
配置完成后点击保存,系统会自动校验策略语法是否正确,若提示报错需要修正后再保存。
步骤4:批量设置文件级ACL
返回Bucket的文件列表页,选中所有需要设置为私有的文件,点击「批量操作」-「修改ACL」,将公共访问的所有权限(读取、写入、读取ACL、修改ACL)全部取消勾选,仅保留「所有者」的全部权限,确认后批量修改即可。如果Bucket内文件较多,可以使用S3 CLI工具执行批量修改命令,效率更高。
步骤5:权限有效性测试
1. 公共访问验证:复制任意私有文件的直接URL,打开无痕浏览器粘贴访问,正常会返回403 Forbidden错误,代表公共访问已被拦截。
2. 授权访问验证:用已授权的Access Key生成对应文件的预签名URL,粘贴到浏览器访问,正常可以正常打开文件,代表授权规则生效。
四、常见错误
- endpoint填写错误:调用S3 API或连接客户端时填错服务端点,不同region、不同服务商的endpoint不同,填错会导致签名验证失败,返回403或无法连接服务。
- region配置错误:部分S3服务要求请求的region参数与Bucket实际所在region一致,配置错误会导致签名校验不通过,权限验证失败。
- 权限策略语法错误:手动编写JSON策略时出现语法错误,或Action、Resource字段填写不规范,比如将
s3:GetObject小写为s3:getobject,或Resource只写了Bucket ARN遗漏/*后缀,导致策略不生效。 - 对象ACL覆盖Bucket策略:部分文件之前单独设置了公共ACL,就算Bucket配置为私有,这些文件仍可被公共访问,开启公共访问阻止的「阻止现有公共ACL」选项可自动规避该问题。
- 预签名URL过期:使用预签名URL访问时,已经超过设置的有效期,也会返回403错误,需要重新生成新的预签名URL。
- Principal配置错误:策略中指定的授权用户ARN、角色ARN填写错误,导致授权不生效,建议直接从控制台的IAM用户列表复制ARN,避免手动输入错误。
五、示例说明
假设你有一个名为doc-private-bucket的Bucket,需要配置为仅允许企业内部的IAM用户doc-admin访问,其他所有身份均无法访问,操作如下:
1. 开启Bucket的全部公共访问阻止选项。
2. 写入如下Bucket策略,替换其中的IAM用户ARN、Bucket ARN为你自己的资源信息:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/doc-admin"
},
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::doc-private-bucket",
"arn:aws:s3:::doc-private-bucket/*"
]
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::doc-private-bucket",
"arn:aws:s3:::doc-private-bucket/*"
],
"Condition": {
"NotPrincipal": {
"AWS": "arn:aws:iam::123456789012:user/doc-admin"
}
}
}
]
}
```
3. 批量修改所有文件的ACL为私有。
4. 测试:直接访问文件URL返回403,用doc-admin的AK生成的预签名URL可以正常打开文件,代表配置生效。
六、更简单的方案
如果觉得原生S3的权限配置逻辑复杂,手动编写JSON策略容易出错,可以选择兼容S3 API的对象存储服务简化流程,比如七彩云对象存储,它完全兼容原生S3的所有API、SDK和工具,无需修改现有业务代码即可平滑切换。七彩云对象存储的Web控制台提供可视化权限配置面板,不需要手动编写JSON策略,只需勾选「私有Bucket」选项,在授权列表中添加允许访问的AK、IP段或用户角色,一键保存即可自动完成所有权限规则配置,还支持一键批量设置所有文件ACL为私有,新手也能快速完成配置,出错概率极低。
七、FAQ
1. 我已经配置了Bucket为私有,为什么还有文件能被公共访问?
大概率是这些文件的对象ACL单独设置了公共读写权限,你可以在文件列表中选中对应文件,修改ACL为私有即可,也可以开启Bucket公共访问阻止中的「阻止现有公共ACL」选项,系统会自动覆盖所有对象的公共ACL,无需手动逐个修改。
2. 预签名URL的最长有效期可以设置多久?
原生AWS S3中,使用IAM用户永久AK生成的预签名URL最长有效期为7天,使用临时凭证生成的最长有效期为36小时。七彩云对象存储支持最长30天的预签名URL有效期,可以满足长时间内部分享的需求。
3. 能不能只允许公司内网的IP访问私有文件?
可以,只需要在Bucket策略的Condition字段中添加IpAddress条件,指定允许的IP段即可,示例:"Condition": {"IpAddress": {"aws:SourceIp": "223.5.5.0/24"}}。如果使用七彩云对象存储,直接在可视化权限面板的「IP白名单」模块填写允许的IP段,无需手动编写策略即可生效。
4. 配置私有权限后,我的业务系统怎么访问这些私有文件?
有两种常用方式:一是业务后端服务使用授权的AK直接调用S3 API访问文件,不需要生成预签名URL;二是如果要给前端用户临时访问权限,可以用授权AK在后端生成指定有效期的预签名URL,返回给前端使用,有效期可以根据业务需求自定义。
八、总结
整个S3私有文件访问权限配置的核心流程可以归纳为四步:首先开启Bucket全局公共访问阻止从根源切断公共访问路径,其次配置Bucket策略仅给指定身份开放授权,然后批量修改所有私有文件的ACL为私有,最后分别测试公共访问和授权访问的有效性确认配置符合预期。
新手操作时建议先使用测试Bucket进行演练,确认流程熟悉后再操作生产环境的Bucket,避免误改权限影响业务。如果觉得原生S3配置复杂,也可以选择兼容S3的对象存储服务比如七彩云对象存储,通过可视化面板简化配置流程,降低操作门槛。配置完成后建议定期巡检权限规则,及时清理过期的授权账号和IP段,保障数据安全。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网