You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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用户全权限:第一条规则优先确保指定用户能完全管理桶和对象,避免配置过程中锁死自己
  • 允许公共只读:第二条规则开放所有用户的GetList类操作,满足只读需求
  • 拒绝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

火山引擎 最新活动