我正在按照 this answer 中的说明生成以下 S3 存储桶策略:
{
"Id": "Policy1495981680273",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1495981517155",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::surplace-audio",
"Principal": "*"
}
]
}
我得到以下错误:
行动不适用于声明中的任何资源
我的保单缺少什么?
来自 IAM 文档,http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Action
某些服务不允许您为单个资源指定操作;相反,您在 Action 或 NotAction 元素中列出的任何操作都适用于该服务中的所有资源。在这些情况下,您可以在 Resource 元素中使用通配符 *。
使用此信息,资源应具有如下值:
"Resource": "arn:aws:s3:::surplace-audio/*"
仅仅删除 s3:ListBucket
权限对我来说并不是一个足够好的解决方案,对于许多其他人来说可能也不是。
如果您想要 s3:ListBucket
权限,您只需要拥有存储桶的普通 arn(最后没有 /*
),因为此权限适用于存储桶本身,而不适用于存储桶内的项目。
如下所示,您必须将 s3:ListBucket
权限作为与存储桶内项目相关的权限(如 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": "*"
}
]
}
因为列表存储桶不适用于存储桶内部,因此通过删除此操作策略可以正常工作。
刚刚遇到这个问题,并为那些希望在同一策略中使用 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": "*"
}
]
}
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/*"
]
}
]
}
我在创建存储桶时也遇到了类似的问题
{“版本”:“2012-10-17”,“声明”:[{“Sid”:“AddPerm”,“效果”:“允许”,“主体”:“*”,“行动”:[“s3 :GetObject" ], "资源": [ "arn:aws:s3:::mrt9949" ] } ] }
我已将上面的代码更改为
{“版本”:“2012-10-17”,“声明”:[{“Sid”:“AddPerm”,“效果”:“允许”,“主体”:“*”,“行动”:[“s3 :GetObject" ], "资源": [ "arn:aws:s3:::mrt9949/*" ] } ] }
将 /* 添加到您的存储桶名称中,它将解决问题
这里我的存储桶名称是 mrt9949
就我而言,此错误的解决方案是尝试删除我正在应用的一些操作。其中一些与此资源无关或无法使用。在这种情况下,它不会让我包括这些:
GetBucketAcl ListBucket ListBucketMultipartUploads
每当您尝试应用使用存储桶策略时。记住这件事,如果你使用像“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/*"
]
}
] }
只需对 json 策略资源进行一项更改。
"Resource": ["arn:aws:s3:::bucket-name/*"]
注意:在bucket-name之后添加/*
参考文档:https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html
转到您的实例中的 Amazon S3。
转到权限 -> 公共访问选项卡。
选择编辑并取消选中阻止所有公共访问并保存。
您将在权限选项卡和访问控制列表中看到“公共”标签。
您可能有多个策略声明,并且此错误是一个非常普遍的错误。最好是注释除任何一条以外的所有其他语句(例如 GetObject、ListBuckets 或 PutObject)并执行代码并查看。如果它工作正常,则意味着 ARN 路径是正确的。否则,ARN 应仅包含存储桶名称或包含 /* 的存储桶名称。
一些资源(如 ListBucket)接受全名如“arn:aws:s3:::bucket_name”的 ARN,而 GetObject 或 PutObject 需要在 bucket_name 之后使用 /*。根据服务更改 ARN,它现在应该可以工作了!
您必须检查策略的资源标签下定义的 arn 模式-
“资源”:“arn:aws:s3:::s3mybucketname/*”
如果您在为您的存储桶解除公共访问策略后遇到问题,最后添加“/*”将有助于解决问题。
来自 AWS >文档 > AWS 身份和访问管理 >用户指南 https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_resource.html
它在注释中明确定义,某些服务不允许您为单个资源指定操作。
在 Resource 元素中使用通配符 *
“资源”:“arn:aws:s3:::surplace-audio/*”
您还可以为每个文件夹配置 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,否则会被拒绝访问。希望它可以帮助任何人
这很简单,只需在末尾添加“/*”即可。您只给出了根目录链接,但该操作需要应用于对象。
类型,“资源”:“arn:aws:s3:::surplace-audio/*”