我的目标是拒绝向除了一个用户之外的所有用户进行大部分存储桶的写访问权限,该用户具有对附加到用户的单独策略中定义的存储桶的完全访问权限。存储桶的顶级目录都包含类似的子目录。我需要拒绝访问除名为subf
的子目录以外的所有子目录类型。大多数顶级目录包含名为subf
的子目录。
这是我目前的政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"NotPrincipal": {
"AWS": [
"arn:aws:iam::111122223333:root",
"arn:aws:iam::111122223333:user/system"
]
},
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteBucket",
"s3:DeleteBucketWebsite",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:PutAccelerateConfiguration",
"s3:PutBucketAcl",
"s3:PutBucketCORS",
"s3:PutBucketLogging",
"s3:PutBucketNotification",
"s3:PutBucketRequestPayment",
"s3:PutBucketTagging",
"s3:PutBucketVersioning",
"s3:PutBucketWebsite",
"s3:PutLifecycleConfiguration",
"s3:PutReplicationConfiguration",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:PutObjectVersionTagging",
"s3:Replicate*",
"s3:RestoreObject"
],
"Resource": [
"arn:aws:s3:::bucket-test-a/*",
"arn:aws:s3:::bucket-test-a"
],
"Condition": {
"StringNotLike": {
"s3:prefix": ["*/subf/*"]
},
"StringEquals": {
"s3:delimiter": ["/"]
}
}
}
]
}
当尝试将此策略放在存储桶上时,我收到错误:&#34;调用PutBucketPolicy操作时发生错误(MalformedPolicy):条件不适用于语句中的操作和资源组合&#34; < / p>
我发现的最好的线索是&#39;字符串条件适用于新对象的要求&#39; https://serverfault.com/questions/569046/anonymous-access-to-s3-bucket-only-from-my-ec2-instances我一直难以找到文档来深入研究这个问题。
答案 0 :(得分:3)
我认为问题在于您使用的条件键不适用于您指定的操作。例如,如果您查看S3-specific condition keys上的文档,您会看到对于每种类型的权限(操作),只有一小部分&#34;适用的条件密钥&#34;。
s3:前缀和s3:分隔符条件键仅适用于s3:ListBucket和s3:ListBucketVersions权限,但这些权限都不存在于您的操作列表中。
如果您尝试匹配s3存储桶密钥,则可能必须在“资源”部分进行匹配。例如,您可以使用&#34; arn:aws:s3 ::: bucket-test -a / * / subf / *&#34;来匹配subf路径。如果你想匹配除subf路径之外的所有东西,那么你应该使用NotResource而不是Resource。
我还注意到您正在使用对象级操作对存储桶级操作进行分组。虽然这通常适用于简单的策略,但您可能不得不将策略拆分为多个语句,以便您的资源与您的操作相匹配。