我按照this answer的说明生成了以下S3存储分区策略:
{
"Id": "Policy1495981680273",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1495981517155",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::surplace-audio",
"Principal": "*"
}
]
}
我收到以下错误:
操作不适用于语句
中的任何资源
我的政策中缺少什么?
答案 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: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/*"
}
]
}
答案 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)
答案 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