跨账号访问AWS S3存储桶执行cp命令报403 Forbidden错误
问题根因
现有桶策略、跨账号IAM授权的语法配置无错误,aws s3 ls可正常列取文件、aws s3 cp触发HeadObject接口返回403的核心原因是:
S3对象级权限独立于桶级策略存在,跨账号上传的对象默认所有权归属上传方账号,桶所属账号默认不持有这类对象的完全控制权,无法通过桶策略将这类对象的访问权限授权给其他身份。
两类操作的权限校验逻辑差异:
s3:List*属于桶级操作,仅校验桶策略、调用方IAM权限,现有配置满足校验要求,因此列文件操作正常s3:GetObject、HeadObject属于对象级操作,除校验桶权限、调用方IAM权限外,还会校验对象本身的所有权与ACL配置。问题涉及的文件由第三方AWS账号上传,默认状态下这类对象的访问控制权完全归属上传账号,桶侧配置的授权规则对该类对象不生效。
修复方案
后续新增对象权限永久配置
在桶所属账号侧修改S3桶配置:
- 进入桶的「对象所有权(Object Ownership)」设置项,选择**强制桶拥有者(Bucket owner enforced)**模式保存
- 该配置开启后会自动禁用桶内所有对象的ACL,所有新上传对象的所有权强制归属桶所属账号,现有桶策略会对所有新对象自动生效,无需额外做对象级授权。
存量对象权限修复
对于其他账号已上传的存量文件,使用桶所属账号下持有对应S3权限的身份,执行以下任一操作即可恢复访问:
- 批量将存量对象复制到原路径,复制时添加参数
--acl bucket-owner-full-control,复制完成后对象所有权自动转移给桶所属账号 - 批量修改存量对象的ACL,授予桶所属账号完全控制权限,修改完成后桶策略即可对这些对象生效。
内容的提问来源于stack exchange,提问作者jessefournier
相关产品推荐
相关产品推荐

