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

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

我得到以下错误:

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

我的保单中遗漏了什么?


当前回答

刚刚遇到了这个问题,并为那些想要在同一策略中拥有ListBucket和GetObject的人找到了一个更短的解决方案。重要的是在Resource下列出bucket-name和bucket-name/*。

{
  "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": "*"
    }
  ]
}

其他回答

要解决这个问题,您需要在策略规则中找到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/*"
            ]
        }
    ]
}

只需在json policy resource中做一个更改。

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

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

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

无论何时尝试应用桶策略。记住这一点,如果你正在使用像“s3:ListBucket”,“s3:GetBucketPolicy”,“s3:GetBucketAcl”等与桶相关的操作,policy中的资源属性应该被提到为<" resource ": "arn:aws:s3:::bucket_name">。

Ex.

{
    "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”等与对象相关的操作,则policy中的资源属性应提到为<" resource ": "arn:aws:s3:::bucket_name/*">。

ex.

{
  "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”等操作,这些操作与桶和对象都相关,那么策略中的资源属性应该被提到为<" resource ": ["arn:aws:s3:::bucket_name/*", " resource ": "arn:aws:s3:::bucket_name">。

ex.

{
    "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/*"
            ]
        }
    ] }

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

简单地说,这意味着您在策略中写入的操作不适用于资源。我试图公开我的存储桶,这样任何人都可以从我的存储桶中下载。我得到错误,直到我删除(“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": "*"
    }
  ]
}

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

这很简单,只需要在结尾加上“/*”。您只给出了根目录链接,但是需要将操作应用到对象。

类型, “资源”:“在攻击:aws: s3::: surplace-audio / *”