无法将条件语句与 s3 存储桶策略中的操作和资源匹配



我的目标是拒绝所有用户对存储桶的大部分写入访问权限,但一个用户除外,该用户对附加到用户的单独策略中定义的存储桶具有完全访问权限。存储桶的顶级目录都包含类似的子目录。我需要拒绝访问除名为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": ["/"]
}
}
}
]
}

尝试将此策略放在存储桶上时,我收到错误:

"调用 PutBucketPolicy 时出错(格式不正确的策略( 操作:条件不适用于操作和 声明中的资源">

我发现的最好的线索是"字符串条件旨在作为新对象的要求应用"https://serverfault.com/questions/569046/anonymous-access-to-s3-bucket-only-from-my-ec2-instances 我一直很难找到文档来深入研究这一点。

我相信问题是您使用的条件键不适用于您指定的操作。例如,如果您查看有关 S3 特定条件键的文档,您会发现对于每种类型的权限(操作(,只有一小部分"适用条件键"。

s3:前缀和 s3:分隔符条件键仅适用于 s3:ListBucket 和 s3:ListBucketVersions 权限,但这两个权限都不存在于操作列表中。

如果您尝试匹配 s3 存储桶键,则可能需要在资源部分中进行匹配。例如,您可以使用"arn:aws:s3:::bucket-test-a/*/subf/*"来匹配子f 路径。如果要匹配除 subf 路径之外的所有内容,则应使用 NotResource 而不是 Resource。

我还注意到您将存储桶级操作与对象级操作分组。尽管这通常适用于简单策略,但您可能必须将策略拆分为多个语句,以便您的资源与您的操作匹配。

最新更新