AWS S3 策略限制文件夹删除

AWS S3 policy restrict folder delete

我有一个名为“uploads”的 S3 存储桶,结构如下:

uploads|
       |_products
       |_users
       |_categories
       |_...  

我想限制用户删除文件夹(产品、用户等),但他们可以删除文件夹中的对象。我的政策:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectTagging",
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:GetObjectTagging"
            ],
            "Resource": [
                "arn:aws:s3:::uploads",
                "arn:aws:s3:::uploads/*"
            ]
        },

        {
            "Effect": "Allow",
            "Action": [
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::uploads/banners/*",
                "arn:aws:s3:::uploads/brands/*",
                "arn:aws:s3:::uploads/categories/*",
                "arn:aws:s3:::uploads/products/*",
                "arn:aws:s3:::uploads/users/*"
            ]
        }

    ]
} 

但是我测试过,用户可以删除文件夹,我哪里出错了?

Amazon S3 中不存在文件夹。

如果创建了一个对象(例如banners/sale.jpg),那么banners目录就会神奇地出现。然后,如果该对象被删除,那么该目录将神奇地消失。这是因为 Amazon S3 中不存在目录。

因此,您不必担心有人会删除目录,因为当在该路径中创建对象时,它会自动重新出现。

如果在 S3 管理控制台中使用 创建文件夹 按钮,则会创建一个与目录同名的 zero-length 对象。这会强制目录为 'appear'(即使它不存在)。

根据您的描述,听起来用户可以删除 zero-length 对象,因为它与您指定的 Resource 具有相同的路径。如果是这样,那么就无法仅通过策略来防止这种情况发生。