我遵循这个答案的说明来生成以下S3桶策略:

{
  "Id": "Policy1495981680273",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1495981517155",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::surplace-audio",
      "Principal": "*"
    }
  ]
}

我得到以下错误:

操作不适用于语句中的任何资源

我的保单中遗漏了什么?


当前回答

仅仅删除s3:ListBucket权限对我来说并不是一个足够好的解决方案,可能对其他许多人来说也不是。

如果你想要s3:ListBucket权限,你只需要有桶的普通arn(没有结尾的/*),因为这个权限适用于桶本身,而不是桶内的项目。

如下所示,你必须拥有s3:ListBucket权限,作为一个单独的语句,与bucket内的项目相关的权限,如s3:GetObject和s3:PutObject:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"        
      ],
      "Principal": {
        "AWS": "[IAM ARN HERE]"
      },
      "Resource": "arn:aws:s3:::my-bucket-name"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject", 
        "s3:PutObject"
      ],
      "Principal": {
        "AWS": "[IAM ARN HERE]"
      },
      "Resource": "arn:aws:s3:::my-bucket-name/*"
    }
  ]
}

其他回答

错误操作不适用于语句中的任何资源

简单地说,这意味着您在策略中写入的操作不适用于资源。我试图公开我的存储桶,这样任何人都可以从我的存储桶中下载。我得到错误,直到我删除(“s3:ListBucket”)从我的声明。

{
  "Id": "Policyxxxx961",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmtxxxxx4365",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucket-name/*",
      "Principal": "*"
    }
  ]
}

因为列表桶不应用于桶内部,因此删除此操作策略可以很好地工作。

要解决这个问题,您需要在策略规则中找到Resource,并在数组中添加arn桶,一个带*,第二个末尾不带*。这将修复错误。

{
    "Version": "2012-10-17",
    "Id": "Policy3783783783738",
    "Statement": [
        {
            "Sid": "Stmt1615891730703",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::76367367633:user/magazine-demo-root-user"
            },
            "Action": [
                "s3:ListBucket",
                "s3:ListBucketVersions",
                "s3:GetBucketLocation",
                "s3:DeleteObject",
                "s3:AbortMultipartUpload",
                "s3:Get*",
                "s3:Put*"
            ],
            "Resource": [
                "arn:aws:s3:::magazine-demo",
                "arn:aws:s3:::magazine-demo/*"
            ]
        }
    ]
}

转到实例中的Amazon S3。 进入“权限->公共访问”页签。 选择“编辑”,取消勾选“阻止所有公共访问”并保存。 您将在权限选项卡和访问控制列表中看到“公共”标签。

仅仅删除s3:ListBucket权限对我来说并不是一个足够好的解决方案,可能对其他许多人来说也不是。

如果你想要s3:ListBucket权限,你只需要有桶的普通arn(没有结尾的/*),因为这个权限适用于桶本身,而不是桶内的项目。

如下所示,你必须拥有s3:ListBucket权限,作为一个单独的语句,与bucket内的项目相关的权限,如s3:GetObject和s3:PutObject:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"        
      ],
      "Principal": {
        "AWS": "[IAM ARN HERE]"
      },
      "Resource": "arn:aws:s3:::my-bucket-name"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject", 
        "s3:PutObject"
      ],
      "Principal": {
        "AWS": "[IAM ARN HERE]"
      },
      "Resource": "arn:aws:s3:::my-bucket-name/*"
    }
  ]
}

您必须检查Policy-的Resource标记下定义的arn模式

“资源”:“当arn: aws s3::: s3mybucketname / *

在桶的公共访问策略被解除后,如果你遇到这个问题,在结尾添加“/*”将有助于解决这个问题。