Amazon S3存储桶策略配置异常:含Root在内均遭访问拒绝
解决S3桶策略配置后全Access Denied的问题
我之前也踩过S3桶策略的权限坑,帮你理清楚问题根源和解决办法:
问题根源分析
你遇到的所有操作(包括Root)都返回Access Denied,大概率是桶策略的规则优先级或资源范围配置错误:
- S3的权限评估逻辑是:
显式拒绝 > 显式允许 > 默认拒绝,如果你的策略里先写了覆盖范围过宽的拒绝规则(比如误把Principal设为*的拒绝),会直接覆盖后面的允许规则 - 另一个常见错误是资源范围不完整:只指定了桶内对象(
arn:aws:s3:::your-bucket/*),没包含桶本身(arn:aws:s3:::your-bucket),导致桶级操作(比如ListBucket)直接被拒绝 - 还有可能是混淆了IAM用户权限和桶策略:即使桶策略允许,IAM用户本身的权限如果被拒绝也会导致访问失败,但你说Root也被拒绝,所以主要还是桶策略的问题
符合预期的正确桶策略示例
按@jarmod的方案调整后的策略应该是这样的(替换你的账号ID、桶名、IAM用户ARN):
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowSpecifiedIAMUserFullAccess", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/your-designated-user" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::your-bucket-name", "arn:aws:s3:::your-bucket-name/*" ] }, { "Sid": "AllowPublicReadOnlyAccess", "Effect": "Allow", "Principal": "*", "Action": [ "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::your-bucket-name", "arn:aws:s3:::your-bucket-name/*" ] }, { "Sid": "DenyRootAccountAccess", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::your-bucket-name", "arn:aws:s3:::your-bucket-name/*" ] } ] }
策略逻辑拆解
- 允许指定IAM用户全权限:第一条规则优先确保指定用户能完全管理桶和对象,避免配置过程中锁死自己
- 允许公共只读:第二条规则开放所有用户的
Get和List类操作,满足只读需求 - 拒绝Root访问:最后一条显式拒绝Root账户的所有操作,因为拒绝规则优先级高于允许,所以Root会被拦截,而前两条允许规则不受影响
额外注意事项
你提到配置后触发了一个未说明的问题,大概率是S3的Block Public Access(BPA) 警告:如果要允许公共只读访问,需要在桶的公共访问设置中,关闭Block public access to buckets and objects granted through bucket policies这个选项,否则公共访问规则会被BPA拦截。
内容的提问来源于stack exchange,提问作者Jason 'Slingshot' Miller




