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

3 amazon-s3 amazon-web-services amazon-iam

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

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

“调用 PutBucketPolicy 操作时发生错误 (MalformedPolicy):条件不适用于语句中的操作和资源组合”

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

Pet*_*erg 12

我认为问题在于您使用的条件键不适用于您指定的操作。例如,如果您查看有关S3 特定条件键的文档,您会看到对于每种类型的权限(操作),只有一小部分“适用条件键”。

s3:prefix 和 s3:delimiter 条件键仅适用于 s3:ListBucket 和 s3:ListBucketVersions 权限,但它们都不存在于您的操作列表中。

如果您尝试匹配 s3 存储桶键,则可能必须在 Resource 部分进行匹配。例如,您可以使用“arn:aws:s3::::bucket-test-a/*/subf/*”来匹配 subf 路径。如果你想匹配除 subf 路径之外的所有内容,那么你应该使用 NotResource 而不是 Resource。

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