ChatGPT解决这个技术问题 Extra ChatGPT

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

我得到以下错误:

行动不适用于声明中的任何资源

我的保单缺少什么?

我在链接中尝试了解决方案:stackoverflow.com/a/36551238/2786039 现在可以使用了。问候

O
Oluwafemi Sule

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

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

使用此信息,资源应具有如下值:

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

不敢相信存储桶的策略和/或策略生成器中没有提到这一点!
我正在使用 * ,它仍然给出了那个错误。有人可以帮助我吗?
@YehudaClinton,为我工作。确保同时添加 /*
@CarlesAlcolea - 现在有点像“ARN 应遵循以下格式:arn:aws:s3:::/。使用逗号分隔多个值。”
为我工作!谢谢!
L
Luke

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

如果您想要 s3:ListBucket 权限,您只需要拥有存储桶的普通 arn(最后没有 /*),因为此权限适用于存储桶本身,而不适用于存储桶内的项目。

如下所示,您必须将 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/*"
    }
  ]
}

同意。对于某些操作,需要 ListBucket 权限才能执行 GetObject,所以这个答案比较彻底。
这对我有用,只是强调了 AWS 在指导用户做基本事情方面还需要做多少工作。
Damnit Bezos,您会认为官方 AWS 策略生成器输出的 JSON 会相应地执行此操作。
这次真是万分感谢。我希望我现在可以给你 EthosCoin。
这对我有用。谢谢。很难理解错误信息。
L
Luke

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

简而言之,这意味着该操作(您在策略中编写)不适用于该资源。我试图公开我的存储桶,以便任何人都可以从我的存储桶下载。在我从声明中删除 ("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": "*"
    }
  ]
}

因为列表存储桶不适用于存储桶内部,因此通过删除此操作策略可以正常工作。


以上部分帮助我解决问题,谢谢@luke
e
elexhobby

刚刚遇到这个问题,并为那些希望在同一策略中使用 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": "*"
    }
  ]
}

错误 - S3 策略语法不允许使用 Principal
上述解决方案都不适合我,委托人要么无效,要么我会被拒绝访问。
这是正确的,在这种情况下,资源应该是一个数组,并且包括这两行......投票。
P
Peter

要解决此问题,您需要在策略规则中执行什么操作,找到 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/*"
            ]
        }
    ]
}

这就是我需要的答案! CloudFront 生成的默认策略只有最后带有 /* 的资源。
R
Ravi Teja Mureboina

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

{“版本”:“2012-10-17”,“声明”:[{“Sid”:“AddPerm”,“效果”:“允许”,“主体”:“*”,“行动”:[“s3 :GetObject" ], "资源": [ "arn:aws:s3:::mrt9949" ] } ] }

我已将上面的代码更改为

{“版本”:“2012-10-17”,“声明”:[{“Sid”:“AddPerm”,“效果”:“允许”,“主体”:“*”,“行动”:[“s3 :GetObject" ], "资源": [ "arn:aws:s3:::mrt9949/*" ] } ] }

将 /* 添加到您的存储桶名称中,它将解决问题

这里我的存储桶名称是 mrt9949


谢谢!花了很长时间寻找这个
Y
Yehuda Clinton

就我而言,此错误的解决方案是尝试删除我正在应用的一些操作。其中一些与此资源无关或无法使用。在这种情况下,它不会让我包括这些:

GetBucketAcl ListBucket ListBucketMultipartUploads


S
Sandeep Sindham

每当您尝试应用使用存储桶策略时。记住这件事,如果你使用像“s3:ListBucket”、“s3:GetBucketPolicy”、“s3:GetBucketAcl”等与bucket相关的动作,策略中的资源属性应该被称为<“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”等操作。这些操作与存储桶和对象相关,则策略中的资源属性应称为 <"Resource": ["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/*"
            ]
        }
    ] }

M
Marcel Gosselin

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

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

注意:在bucket-name之后添加/*

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


这与几年前发布的公认答案有何不同? stackoverflow.com/a/44228514/3589609
A
Avilon

转到您的实例中的 Amazon S3。

转到权限 -> 公共访问选项卡。

选择编辑并取消选中阻止所有公共访问并保存。

您将在权限选项卡和访问控制列表中看到“公共”标签。


N
Nithya Narayanan

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

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


P
Pinaki

您必须检查策略的资源标签下定义的 arn 模式-

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

如果您在为您的存储桶解除公共访问策略后遇到问题,最后添加“/*”将有助于解决问题。


S
Swadhin Lenka

来自 AWS >文档 > AWS 身份和访问管理 >用户指南 https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_resource.html

它在注释中明确定义,某些服务不允许您为单个资源指定操作。

在 Resource 元素中使用通配符 *

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


z
zavr

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

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

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

另外,使用 SDK 时,必须在末尾指定前缀为 domain.co/user/ WITH slash,否则会被拒绝访问。希望它可以帮助任何人


S
Sukhanth Vijayakumaran

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

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


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅