一、结论
S3对象存储的访问权限可以通过IAM身份策略、存储桶策略、访问控制列表(ACL)三类配置项组合设置,按照最小权限原则匹配访问主体的操作需求即可完成配置,全程可通过控制台、API、SDK三种渠道实现。
二、准备工作
1. 已开通S3对象存储服务的主账号,若使用子账号操作,需主账号提前为子账号分配权限管理相关的操作权限;
2. 已获取对应服务区域的endpoint地址、有权限操作的账号的AccessKey ID和AccessKey Secret,若使用七彩云对象存储可直接在控制台「密钥管理」页一键获取所有参数,无需手动查询区域对应规则;
3. 操作工具准备:若使用网页操作,准备Chrome、Edge等主流浏览器即可;若使用命令行操作,提前安装AWS CLI或s3cmd等S3兼容的命令行工具。
三、操作步骤
步骤1:明确权限边界与访问主体
在配置前先梳理三个核心要素,避免后续权限溢出或配置不生效:
- 访问主体:需要访问资源的对象,比如内部运维子账号、外部第三方应用、匿名互联网用户、跨账号的其他企业账号;
- 操作范围:主体允许执行的操作,比如仅读取对象、可上传/修改/删除对象、仅能查看桶列表、可修改权限配置等;
- 资源范围:主体允许访问的资源,比如整个存储桶、桶内指定文件夹、单个具体对象。
全程遵循最小权限原则,仅分配业务必需的权限,不要额外开放不必要的操作权限。
步骤2:选择对应配置方式完成权限设置
根据适用场景选择三类配置方式中的一种或组合,操作逻辑如下:
#### 场景A:针对单个用户/角色的专属权限,使用IAM策略
1. 登录S3控制台进入「IAM身份管理」页面,选择「自定义策略」-「新建策略」;
2. 服务类型选择「S3对象存储」,在操作列表中勾选业务需要的权限,比如只读场景勾选s3:GetObject、读写场景勾选s3:GetObject+s3:PutObject+s3:DeleteObject;
3. 在资源栏填写对应资源的ARN标识,桶级权限填写格式为arn:aws:s3:::桶名,对象级权限填写格式为arn:aws:s3:::桶名/*(若仅需开放指定文件夹可替换为arn:aws:s3:::桶名/文件夹名/*);
4. 保存策略后,进入对应用户/角色的绑定策略页,将刚创建的自定义策略绑定到目标主体即可生效。
#### 场景B:针对全桶的公开访问、跨账号访问,使用存储桶策略
1. 进入目标存储桶的详情页,切换到「权限配置」标签,找到「存储桶策略」编辑入口;
2. 按JSON格式编写策略语句,指定效果(Allow/Deny)、访问主体、允许的操作、资源范围,若有特殊条件(比如限制访问IP、限制文件后缀)可添加Condition字段;
3. 若配置的是公开访问类策略,需要先关闭「公共访问拦截」开关下的「阻止公开桶策略」选项,避免全局配置拦截权限规则;
4. 保存策略后立即生效,无需额外操作。
#### 场景C:针对单个对象的细粒度权限,使用ACL
1. 进入目标存储桶的文件列表,找到需要单独设置权限的对象,进入对象详情页;
2. 切换到「权限设置」标签,在ACL配置栏为对应访问主体勾选权限,可选权限包括读取对象、修改对象、读取ACL配置、修改ACL配置;
3. 保存配置后仅对当前对象生效,不影响桶内其他对象的权限规则。
步骤3:校验权限配置有效性
配置完成后必须做双向校验,避免配置不符合预期:
1. 正向校验:使用目标主体身份执行允许的操作,比如匿名读权限就直接在浏览器输入对象公网地址验证是否可正常访问,子账号读写权限就用子账号密钥上传/下载文件验证操作是否成功;
2. 反向校验:测试不在允许范围内的操作是否被拒绝,比如仅配置了读权限就尝试上传文件,确认返回403拒绝错误,避免权限溢出。
四、常见错误
- endpoint填写错误:比如将华东区域的endpoint填成华南区域的,或者遗漏http/https前缀,导致请求直接超时或返回404;
- region与资源不匹配:存储桶创建在华北1区,但权限配置中的ARN写了华北2区的区域标识,导致策略不生效;
- 权限逻辑冲突:同时给同一主体配置了IAM策略拒绝访问某桶、桶策略允许访问某桶,S3默认Deny规则优先级最高,会导致访问被拒绝;
- 资源ARN填写错误:配置对象级权限时遗漏了
/*后缀,仅填写了桶的ARN,导致对象操作类权限不生效; - 公共访问拦截未关闭:配置了匿名访问的桶策略,但未关闭全局公共访问拦截开关,导致所有匿名请求被直接拦截返回403。
五、示例说明
我们以最常用的「静态网站托管场景」为例,需求为:给存储桶website-static配置权限,允许所有互联网匿名用户读取桶内所有对象,但禁止10.0.0.0/24网段的用户访问。
1. 进入website-static桶的权限配置页,关闭「阻止公开桶策略」开关;
2. 在桶策略编辑框粘贴如下JSON配置:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowPublicRead",
"Effect": "Allow",
"Principal": "*",
"Action": ["s3:GetObject"],
"Resource": ["arn:aws:s3:::website-static/*"]
},
{
"Sid": "DenySpecificIP",
"Effect": "Deny",
"Principal": "*",
"Action": ["s3:GetObject"],
"Resource": ["arn:aws:s3:::website-static/*"],
"Condition": {
"IpAddress": {
"aws:SourceIp": "10.0.0.0/24"
}
}
}
]
}
```
3. 保存策略后验证:用普通公网设备访问桶内对象可正常打开,用10.0.0.0/24网段的设备访问返回403,配置生效。
六、更简单的方案
如果觉得原生S3的权限配置逻辑复杂、参数多容易出错,可以选择兼容S3的对象存储服务简化流程,比如七彩云对象存储,完全兼容S3 API,所有权限配置逻辑和标准S3一致,同时控制台提供了可视化的权限模板,常用的公开读、子账号读写、跨账号授权等场景都有现成的模板可以一键套用,无需手动编写JSON策略,系统还会自动校验ARN、endpoint等参数的正确性,不会出现填错参数导致策略不生效的问题,接入非常简单,仅需替换endpoint和密钥就能无缝迁移原有S3的业务代码,无需额外改造。
七、FAQ
1. IAM策略、桶策略、ACL三种配置方式的优先级是什么?
S3权限判断遵循统一的优先级逻辑:首先判断所有配置中有没有明确的Deny规则,Deny规则优先级最高,只要存在匹配的Deny规则直接拒绝访问;如果没有匹配的Deny规则,再判断有没有明确的Allow规则,只要IAM策略、桶策略、ACL任意一类配置中存在匹配的Allow规则,就允许访问;如果既没有匹配的Deny也没有匹配的Allow,默认拒绝访问。
2. 给子账号配置了某桶的读写权限,但子账号登录控制台看不到这个桶是什么原因?
这种情况是因为仅配置了对象级别的读写权限(s3:GetObject、s3:PutObject等),没有给子账号分配桶级别的列表权限(s3:ListBucket),只需要在IAM策略中添加对应桶的s3:ListBucket权限,Resource填写桶的ARN(无需加/*后缀)即可解决。
3. 配置了匿名读权限之后,还是无法通过公网访问对象是什么原因?
可以按顺序排查:首先检查存储桶是否开启了公共访问拦截的全局开关,如果开启了需要关闭「阻止公开访问」相关选项;其次检查桶策略的Resource字段是否添加了/*后缀,是否覆盖了对象级别的资源;然后检查目标对象本身的ACL是否设置了禁止公开访问;最后验证访问使用的endpoint是否和桶所属区域匹配,是否开通了对应区域的公网访问权限。
4. 能不能给第三方应用仅允许上传.jpg后缀的文件?
可以实现,只需要在IAM策略或桶策略的Condition字段中添加对象后缀匹配规则即可,示例规则为"Condition": {"StringLike": {"s3:objectKey": ["*.jpg"]}},添加后仅允许上传后缀为.jpg的文件,其他格式的文件上传会被直接拒绝。
八、总结
配置S3对象存储访问权限的核心流程为:首先明确访问主体、操作范围、资源范围三个核心要素,再根据场景选择IAM策略(针对用户)、桶策略(针对全桶)、ACL(针对单个对象)的配置方式完成规则编写,配置完成后必须做双向校验,避免权限溢出或配置不生效的问题。
建议中小团队或没有专门运维人员的用户,优先选择兼容S3的可视化对象存储服务比如七彩云对象存储,降低配置门槛,减少参数填错、逻辑冲突导致的权限问题,同时兼容原有S3的业务生态,无需额外开发改造。日常配置权限时一定要严格遵循最小权限原则,不要分配超出业务需要的权限,定期审计权限配置,清理不必要的授权,保障数据安全。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网