S3 存储桶策略允许任何人查看 - 但不能列出 - 存储桶中的所有文件?

S3 bucket policy to allow anyone to view - but not list - all files in bucket?

我想 public S3 存储桶的一个极其常见的模式是允许任何人(即 public)查看存储桶中的每个文件 if他们得到了该对象的 URL,但不允许 public 到 list 存储桶中的项目(即他们不应该能够生成列表桶中的每一项)。

对于许多 public 网站来说,这可能是一种非常常见的配置,这些网站永远不会在 public 视图中隐藏任何资产。

我做的第一件事是转到 S3 -> 单击存储桶 -> 权限 -> 'Block Public Access' -> 编辑 -> 取消选中所有框(从而允许完全 public 访问桶中的项目)。

但是当我使用浏览器直接访问图片URL时,它仍然是'Access Denied',我怀疑是因为我还没有允许public通过[=访问10=].

问题

允许 public 的任何成员查看(也称为 'read')S3 存储桶中的任何对象的最简单策略是什么1,但是不在存储桶中列出(即查看所有对象的列表)?

1 他们需要 URL 才能这样做,除非他们猜到了。

是的,你是对的,你仍然被拒绝访问,因为没有政策。

GET 对象的简单策略是。 Docs供参考

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::Bucket-Name/*"
            ]
        }
    ]
}

注意:这里没有使用ListObject,它不允许用户列出存储桶中的对象

在 AWS 控制台访问:S3 -> 单击您的存储桶 -> 权限 -> 向下滚动到 'Bucket policy' -> 单击 'Edit'。

来自S3 Policy Examples Docs的注释:

Warning: Use caution when granting anonymous access to your Amazon S3 bucket or disabling block public access settings. When you grant anonymous access, anyone in the world can access your bucket. We recommend that you never grant anonymous access to your Amazon S3 bucket unless you specifically need to, such as with static website hosting.

对于静态网站托管,其中 public 的任何成员都应该能够访问 S3 存储桶中的 任何 文件(但不列出文件),这里是政策:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicRead",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
            ]
        }
    ]
}

只需将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称即可。

注意:public 不能 'list' 存储桶中的文件,因为上面没有包含 "s3:ListBucket" 操作。