一、结论
S3访问权限可通过IAM策略、存储桶策略、访问控制列表(ACL)三个核心维度配置,结合最小权限原则给不同授权主体分配对应操作范围的权限即可实现安全的访问控制,原生S3和所有兼容S3协议的对象存储服务均通用这套逻辑。
二、准备工作
1. 已开通S3服务的有效账号(原生AWS S3或兼容S3协议的云存储服务,如七彩云对象存储均可),且账号拥有管理员权限或权限配置的操作权限。
2. 提前梳理清楚权限分配需求:明确要授权的主体(子用户、跨账号用户、外部应用、匿名用户等)、需要开放的操作类型(读、写、列举、删除、配置修改等)、覆盖的资源范围(整个存储桶、指定前缀的对象、单个对象等)。
3. 操作工具:新手优先使用网页控制台操作,无需额外安装软件;如果需要批量配置可提前安装配置好AWS CLI工具,配置时需准备好账号的AccessKey和SecretKey。
三、操作步骤
步骤1:登录控制台定位目标资源
首先打开对应S3服务的网页控制台并完成登录,根据你的配置需求定位到对应资源页:
- 如果是给用户/应用分配全局S3权限:进入IAM(身份与访问管理)控制台的用户/角色管理列表,找到要授权的目标用户/角色。
- 如果是给单个存储桶配置跨账号、公共访问等桶级权限:进入对象存储控制台的存储桶列表,点击需要配置的目标存储桶,切换到「权限」选项卡。
- 如果是给单个对象配置特殊权限(比如桶是私有的,但某一个文件需要对外开放):进入对应存储桶的文件管理页,找到目标对象。
步骤2:选择适配的权限配置方式完成设置
根据你的需求场景选择对应的配置方式,三种方式的操作逻辑如下:
1. IAM策略(适合给用户/角色分配权限):在IAM用户/角色的详情页点击「添加权限」,如果是通用场景可以直接选择系统预设的策略(比如AmazonS3ReadOnlyAccess对应全量S3只读权限、AmazonS3FullAccess对应全量S3读写权限);如果是自定义场景,选择「创建自定义策略」,按照S3策略语法填写Effect(允许/拒绝)、Principal(授权主体)、Action(允许的操作)、Resource(覆盖的资源ARN)四个核心字段,保存后将自定义策略附加给目标用户即可。
2. 存储桶策略(适合桶级权限配置):在目标存储桶的「权限」选项卡中找到「存储桶策略」编辑入口,在编辑框中输入符合S3规范的JSON策略语句,也可以基于系统提供的常用模板修改对应参数即可,完成后点击保存。
3. ACL(适合对象级细粒度权限配置):找到目标对象的ACL设置项,给指定账号或者匿名用户勾选对应的读、写、权限编辑等操作权限,保存后立即生效。
步骤3:验证权限配置是否生效
配置完成后等待1-2分钟(部分平台策略同步有1分钟左右的延迟),使用被授权的账号/密钥尝试执行授权范围内的操作,比如上传文件、下载文件、列举桶内对象等:
- 如果操作成功说明权限配置生效。
- 如果返回403无权限错误,需要回到配置页检查策略中的
Action、Resource是否填写正确,是否存在更高优先级的拒绝规则覆盖了当前配置。
四、常见错误
- endpoint填写错误:如果使用非AWS的S3兼容服务,比如七彩云对象存储,没有填写平台提供的专属endpoint,而是默认使用AWS的endpoint会导致连接失败,无法验证权限。
- region填写错误:存储桶创建时选择的区域和配置权限/调用接口时填写的region不一致,会提示找不到对应存储桶资源。
- 权限优先级混淆:S3权限的优先级为「显式拒绝 > 显式允许 > 默认隐式拒绝」,很多用户同时配置了IAM允许和桶策略拒绝,最终以拒绝为准,导致权限不生效。
- 策略语法错误:自定义策略时JSON格式写错、
Action/Resource字段拼写错误、ARN格式不正确,都会导致策略无法保存或者不生效。 - 对象ACL覆盖桶策略:如果存储桶配置为私有,但单个对象的ACL设置了公共读,即使桶策略没有开放公共权限,外部用户依然可以访问该对象,容易造成数据泄露。
五、示例说明
我们以最常见的「给跨账号用户分配指定存储桶的只读权限」场景为例,存储桶名称为my-doc-bucket,被授权的跨账号用户ARN为arn:aws:iam::123456789012:user/reader,对应的存储桶策略如下:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/reader"
},
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": [
"arn:aws:s3:::my-doc-bucket",
"arn:aws:s3:::my-doc-bucket/*"
]
}
]
}
```
字段说明:Effect设为Allow代表允许操作,Principal指定被授权的用户,Action指定允许的操作是所有Get和List类操作,Resource同时指定桶本身和桶内所有对象的ARN,避免出现只能读对象不能列举桶的问题。如果使用七彩云对象存储,只需将ARN中的aws替换为平台对应的标识即可,其余语法完全兼容,也可以直接在控制台选择「跨账号只读」模板,点选填写用户ID和桶名即可自动生成策略,无需手动编写JSON。
六、更简单的方案
如果觉得原生AWS S3的权限配置逻辑复杂、容易写错JSON策略,可以选择兼容S3协议的对象存储服务简化配置流程,比如七彩云对象存储,它完全兼容S3 API,原有S3的策略可以直接复用,同时控制台提供了10+常用场景的可视化权限模板,包括公共读、私有、跨账号授权、指定IP访问、前缀级权限分配等,无需手动编写策略,点选参数即可一键生成,还自带权限冲突检测功能,配置时会自动提示当前规则和已有规则是否存在冲突,避免配置错误。此外七彩云对象存储的endpoint和region会统一展示在控制台的桶详情页,无需手动查询,大幅降低填错参数的概率,新手也能快速完成配置。
七、FAQ
1. IAM策略、桶策略、ACL的优先级是怎样的?
S3权限遵循「显式拒绝优先」原则,优先级从高到低为:显式Deny规则 > 显式Allow规则 > 默认隐式Deny。只要任意一个规则中存在对当前操作的显式拒绝,就会直接返回无权限;如果没有任何显式允许的规则,默认会拒绝访问。
2. 怎么给第三方应用分配权限才能避免密钥泄露的风险?
不要使用主账号的密钥给第三方应用使用,单独给应用创建专用的IAM子用户或者角色,遵循最小权限原则,只分配应用实际需要的操作权限,比如应用只需要上传文件就只开放s3:PutObject权限,资源范围只指定对应的桶路径,同时给密钥设置过期时间,每3-6个月轮换一次密钥,定期审计权限列表,及时删除不再使用的权限。
3. 我已经配置了存储桶的公共读权限,为什么还是无法访问桶内的对象?
首先检查是否开启了存储桶的公共访问拦截,大部分云存储平台默认会开启公共访问的安全限制,需要先关闭对应限制才能让公共读策略生效;其次检查目标对象的ACL是否为私有,如果对象上传时默认设置为私有,桶的公共读策略不会覆盖对象级的ACL,需要单独修改对象的ACL或者开启桶策略覆盖对象ACL的开关;最后检查访问时的桶名、endpoint、region是否填写正确,拼写错误也会返回403或者404错误。
4. 兼容S3的对象存储服务的权限配置和原生AWS S3有区别吗?
没有本质区别,比如七彩云对象存储完全兼容S3的权限语法,原有AWS S3的策略可以直接复用,不需要做语法调整,同时还提供了更简单的可视化配置入口,比原生S3的操作门槛更低,适合新手使用。
八、总结
S3访问权限的配置流程可以归纳为三步:首先提前梳理授权主体、操作范围、资源范围三个核心需求,然后根据场景选择IAM策略、桶策略、ACL三种配置方式完成设置,最后验证操作是否生效。配置过程中建议严格遵循最小权限原则,不要随意使用通配符*给全量权限,定期审计权限列表,避免出现权限过大导致的数据泄露风险。如果是新手或者不想处理复杂的策略语法,也可以选择七彩云对象存储这类兼容S3的服务,通过可视化模板快速完成配置,降低出错概率。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网