S3 Bucket操作不适用于任何资源

时间:2017-05-28 14:30:52

标签: amazon-web-services amazon-s3

我按照this answer的说明生成了以下S3存储分区策略:

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

我收到以下错误:

  

操作不适用于语句

中的任何资源

我的政策中缺少什么?

15 个答案:

答案 0 :(得分:104)

来自IAM文档,http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Action

某些服务不允许您为单个资源指定操作;相反,您在Action或NotAction元素中列出的任何操作都适用于该服务中的所有资源。在这些情况下,您在Resource元素中使用通配符*。

有了这些信息,资源应该具有如下值:

"Resource": "arn:aws:s3:::surplace-audio/*"

答案 1 :(得分:36)

错误操作不适用于语句

中的任何资源

简单地说,这意味着您在政策中写的行动并不适用于资源。我试图公开我的桶,以便任何人都可以从我的桶中下载。我收到错误,直到我从我的陈述中删除(" 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": "*"
    }
  ]
}

因为列表存储桶不适用于存储桶,因此删除此操作策略工作正常。

答案 2 :(得分:26)

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

如果您需要s3:ListBucket权限,则只需拥有存储桶的简单地址(末尾没有/*),因为此权限适用于存储桶本身,而不适用于存储桶中的项目桶。

如下所示,您必须具有s3:ListBucket权限作为独立声明,而不是与诸如s3:GetObjects3: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/*"
    }
  ]
}

答案 3 :(得分:6)

刚遇到这个问题,并为那些希望在同一策略中具有ListBucket和GetObject的人找到了一个较短的解决方案。

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

答案 4 :(得分:2)

要解决此问题,您需要在策略规则中执行什么操作,找到 Resource,并将您的 arn 存储桶添加到数组中,一个带有 *,第二个没有 { {1}} 结尾。这将修复错误。

*

答案 5 :(得分:1)

从AWS>文档> AWS Identity and Access Management>用户指南 https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_resource.html

注释中清楚地定义了它,某些服务不允许您为单个资源指定操作。

您在Resource元素中使用通配符*

“资源”:“ arn:aws:s3 ::: surplace-audio / *”

答案 6 :(得分:0)

我在创建存储桶时也遇到了类似的问题

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::mrt9949"
            ]
        }
    ]
}

我已将上面的代码更改为

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::mrt9949/*"
            ]
        }
    ]
}

在存储桶名称中添加 / * 即可解决问题

这里我的存储桶名称是mrt9949

答案 7 :(得分:0)

对于我来说,此错误的解决方案是尝试删除我正在应用的某些操作。其中一些与该资源无关或无法使用该资源。 在这种情况下,不会让我包括这些内容:

GetBucketAcl 清单桶 ListBucketMultipartUploads

答案 8 :(得分:0)

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

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

即使在为您的存储桶解除了公共访问策略阻止之后仍然遇到问题,最后加上“ / *”也将有助于解决该问题。

答案 9 :(得分:0)

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

答案 10 :(得分:0)

您还可以为每个文件夹配置ListBuckets,就像这样

Author(id=8, name=Super, surname=MB, department=Department(id=1, de=Halle, en=Factory));

这些规则与SES一起使用以接收电子邮件,但允许外部用户查看SES放入存储桶中的文件。 我按照这里的指示进行:https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/

此外,在使用SDK时,必须在末尾将前缀指定为{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowSESPuts-1521238702575", "Effect": "Allow", "Principal": { "Service": "ses.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::buckets.email/*", "Condition": { "StringEquals": { "aws:Referer": "[red]" } } }, { "Sid": "Stmt1586754972129", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::596322993031:user/[red]" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::buckets.email", "Condition": { "StringEquals": { "s3:delimiter": "/", "s3:prefix": [ "", "domain.co", "domain.co/user" ] } } }, { "Sid": "Stmt1586754972129", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::596322993031:user/[red]" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::buckets.email", "Condition": { "StringLike": { "s3:prefix": "domain.co/user/*" } } }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::596322993031:user/[red]" }, "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": "arn:aws:s3:::buckets.email/domain.co/user/*" } ] } ,并带有斜杠,否则访问将被拒绝。希望对所有人有帮助

答案 11 :(得分:0)

每当您尝试应用使用存储桶策略时。记住这一点,如果您正在使用与存储桶相关的操作,例如“ s3:ListBucket”,“ s3:GetBucketPolicy”,“ s3:GetBucketAcl”等,则策略中的资源属性应称为<“ Resource”:“ arn:aws:s3 :::: bucket_name“>。

例如。

{
    "Version": "2012-10-17",
    "Id": "Policy1608224885249",
    "Statement": [
        {
            "Sid": "Stmt1608226298927",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetBucketPolicy",
                "s3:GetBucketAcl",
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::bucket_name"
        }
    ]
}

如果您正在使用与对象相关的操作,例如“ s3:GetObject”,“ s3:DeleteObject”,“ s3:GetObject”等,则策略中的资源属性应称为<“ Resource”:“ arn :aws:s3 :::: bucket_name/*">。

例如。

{
  "Id": "Policy1608228066771",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1608228057071",
      "Action": [
        "s3:DeleteObject",
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucket_name/*",
      "Principal": "*"
    }
  ]
}

最后,如果您使用的是诸如“ s3:ListBucket”,“ s3:GetObject”之类的操作,这些操作与存储桶和对象都相关,则策略中的资源属性应称为<“资源”:[“ arn :aws:s3 ::: bucket_name / *“,”资源“:” arn:aws:s3 ::: bucket_name“>。

例如。

{
    "Version": "2012-10-17",
    "Id": "Policy1608224885249",
    "Statement": [
        {
            "Sid": "Stmt1608226298927",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::bucket_name",
                "arn:aws:s3:::bucket_name/*"
            ]
        }
    ] }

答案 12 :(得分:0)

这很简单,只需在末尾添加“/*”即可。您只提供了根目录链接,但需要将操作应用于对象。

类型, "Resource": "arn:aws:s3:::surplace-audio/*"

答案 13 :(得分:0)

您可能有多个政策声明,这个错误是一个非常普遍的错误。最好是注释除任何语句之外的所有其他语句(例如 GetObject、ListBuckets 或 PutObject)并执行代码并查看。如果它工作正常,则意味着 ARN 路径是正确的。否则,ARN 应包含单独的存储桶名称或带有 /* 的存储桶名称。

某些资源(如 ListBucket)接受具有全名(如“arn:aws:s3::::bucket_name”)的 ARN,而 GetObject 或 PutObject 需要在 bucket_name 之后添加一个 /*。根据服务更改 ARN,它现在应该可以工作了!

答案 14 :(得分:-1)

只需对 json 策略资源进行一项更改即可。

"Resource": ["arn:aws:s3:::bucket-name/*"]

注意:在bucket-name后面加上/*

参考文档: https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html