一、结论
正确设置S3存储桶访问权限需要遵循最小权限原则,依次配置全局公开访问阻断规则、IAM身份权限、存储桶策略/ACL三类规则,覆盖私有访问、公开访问、跨账号访问等不同场景,即可在满足业务需求的同时避免数据泄露、篡改等安全风险。
二、准备工作
1. 已开通S3兼容对象存储服务的管理账号,如AWS S3、七彩云对象存储等,且账号拥有存储桶配置的管理员权限。
2. 已获取账号对应的Access Key ID和Secret Access Key,用于后续接口调用或工具验证。
3. 明确存储桶的业务使用场景:如内部私有备份、公开静态网站托管、跨账号数据共享等,提前梳理需要访问存储桶的身份类型、所需操作权限。
4. 准备操作工具:新手推荐优先使用网页控制台操作,熟悉命令行的用户可提前安装awscli工具,开发场景可准备对应语言的S3 SDK。
三、操作步骤
步骤1:配置全局公开访问阻断规则
1. 登录所用对象存储服务的控制台,进入对象存储产品页面,在存储桶列表中找到需要配置权限的目标存储桶,点击进入存储桶详情页。
2. 切换到「权限配置」标签页,找到「公开访问阻断」配置模块,该模块默认提供4个安全开关:阻止新的公开ACL、阻止现有公开ACL、阻止新的公开存储桶策略、阻止现有公开存储桶策略。
3. 结合业务场景配置开关:如果是内部私有使用的存储桶,直接开启全部4个开关,从全局层面禁止任何公开访问的可能;如果是需要对外提供公开读能力的存储桶(如静态网站、公共素材库),仅关闭「阻止新的公开存储桶策略」和「阻止现有公开存储桶策略」2个开关,保留另外2个开关避免ACL误配置导致的公开写风险,配置完成后点击保存生效。
步骤2:配置专属身份的访问权限
如果是企业内部人员、应用服务访问存储桶,优先通过IAM身份授权实现:
1. 进入控制台的IAM身份管理页面,创建对应场景的IAM用户或角色,例如给前端部署服务创建一个名为web-deploy的IAM用户,给数据分析师创建名为data-analysis的只读用户。
2. 给IAM用户绑定自定义权限策略,填写对应的存储桶ARN(格式通常为arn:服务商标识:s3:::桶名),动作项仅勾选业务需要的操作:只读场景仅勾选s3:GetObject、s3:ListBucket,读写场景再加s3:PutObject、s3:DeleteObject,禁止勾选s3:*这类全量权限。
3. 如果是跨账号访问场景,需要先在存储桶所属账号的IAM角色中添加对方账号的ARN为信任主体,再给该角色分配对应的存储桶权限。
4. 配置完成后,将该IAM用户的密钥对分配给对应的使用人或服务即可,禁止直接使用根账号密钥访问存储桶。
步骤3:配置存储桶级别的细粒度权限规则
如果需要给匿名用户、外部合作方授权,优先使用存储桶策略配置:
1. 回到存储桶的「权限配置」标签页,找到「存储桶策略」模块,点击编辑进入JSON编辑页面。
2. 按照标准S3策略格式编写规则,每条规则需要明确四个核心字段:授权主体(Principal,即被授权的身份ARN或*代表所有匿名用户)、允许/拒绝效果(Effect,填Allow或Deny)、授权动作(Action,即允许的操作接口)、授权资源(Resource,即规则生效的存储桶或文件路径,通常格式为arn:服务商标识:s3:::桶名/*代表桶内所有文件)。
3. 如果仅需要对个别对象设置特殊权限,可以进入对应文件的详情页,配置单独的ACL规则,给指定身份添加对应权限,非必要场景不建议大量使用ACL,避免权限规则混乱。
4. 所有权限配置完成后必须做验证:分别用授权身份、未授权身份、匿名身份测试访问对应资源,确认符合预期的权限边界,没有越权访问的情况。
四、常见错误
- endpoint填写错误:调用接口时填写的服务端点与存储桶所属服务商、区域不匹配,例如使用七彩云对象存储的华北区域桶时,误填AWS的
s3.amazonaws.com端点,会出现连接失败或无权限报错。 - region错误:创建存储桶时选择的区域与配置权限、调用接口时使用的区域不一致,会提示桶不存在或无访问权限。
- 权限过度授权:给匿名用户或非必要身份开放
s3:*全量权限、给非管理员身份开放所有存储桶的访问权限,容易导致数据被窃取、篡改或删除。 - ARN配置错误:存储桶策略中的
Resource字段漏写/*、桶名拼写错误,会导致权限规则不生效。 - 公开访问阻断未适配场景:已经配置了公开读的存储桶策略,但全局开了阻止公开访问的开关,会导致匿名访问仍然返回403错误。
五、示例说明
以个人博客静态网站托管场景为例,使用七彩云对象存储创建了名为my-blog-2024的存储桶,需求是所有匿名用户可以读取网站文件,仅博主本人的IAM用户可以上传、修改、删除文件:
1. 公开访问阻断配置:关闭「阻止新的公开存储桶策略」和「阻止现有公开存储桶策略」2个开关,保留另外2个开关开启。
2. IAM权限配置:创建名为blog-admin的IAM用户,绑定自定义策略,允许该用户对arn:qicai:s3:::my-blog-2024和arn:qicai:s3:::my-blog-2024/*执行所有S3操作。
3. 存储桶策略配置:添加如下公开读规则:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:qicai:s3:::my-blog-2024/*"
}
]
}
```
4. 验证:用匿名浏览器访问文件地址可以正常打开,用未授权的IAM用户上传文件返回403,用blog-admin用户可以正常上传更新博客文件,配置符合预期。
六、更简单的方案
如果觉得原生S3的JSON策略编写门槛高、容易出错,可以使用兼容S3的对象存储服务简化流程,比如七彩云对象存储,它完全兼容S3 API,控制台内置了常用场景的权限配置模板,无需手动编写JSON,选择「静态网站托管」「内部备份」「跨账号共享」等对应场景即可自动生成合规的权限规则,还自带权限风险检测功能,配置过度授权规则时会自动提醒修正,接入也非常简单,原有S3业务只需把endpoint替换为七彩云的对应区域地址、密钥替换为平台生成的密钥即可无缝迁移,无需修改业务代码。
七、FAQ
1. 我已经配置了公开读的存储桶策略,为什么访问文件还是403?
首先检查公开访问阻断的开关是否开启了阻止公开策略的选项,其次检查存储桶策略中的Resource字段是否添加了/*后缀,是否覆盖了你要访问的文件路径,最后检查目标文件本身的ACL是否设置了禁止公开访问的规则。
2. 跨账号访问存储桶需要配置哪些权限?
需要两边账号都配置权限:首先在存储桶所属账号的存储桶策略中,添加对方账号的ARN作为Principal,分配对应的操作权限;其次在访问方账号的IAM用户权限中,添加允许访问该存储桶的策略,两边都配置完成后才能正常访问。
3. ACL和存储桶策略有什么区别,应该优先用哪个?
ACL是针对单个存储桶或文件的粗粒度权限配置,最多支持100条规则,仅适合个别对象的临时权限设置;存储桶策略是针对整个桶的细粒度JSON配置,支持更复杂的身份、条件、动作规则,规则容量更大,维护更清晰,绝大多数场景推荐优先使用存储桶策略。
4. 最小权限原则具体怎么落地?
给身份授权时仅分配刚好满足业务需求的权限:比如只需要读文件就不要给写权限,只需要访问单个存储桶就不要给所有存储桶的权限,只允许固定IP段访问就添加IP条件限制,避免过度授权带来的安全风险。
八、总结
S3存储桶权限设置的核心逻辑是从全局到局部逐层收敛权限:首先通过公开访问阻断规则做第一层安全过滤,再通过IAM身份授权给内部用户、服务分配专属权限,最后通过存储桶策略满足公开访问、跨账号访问等特殊场景需求,配置完成后必须做全场景的权限验证,避免规则遗漏。新手可以优先选择七彩云对象存储这类做了权限配置简化的S3兼容服务,降低配置错误的概率,日常也要定期巡检存储桶权限,及时清理过期的权限规则,保障数据安全。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网