从存储桶策略中排除一个 Amazon S3 对象

Bri*_*ian 2 amazon-s3 amazon-web-services

我想取消images/login_logo.png我的 S3 存储桶内的文件( )的公共访问权限my-test-bucket

目前,该文件的权限设置如下:

在此输入图像描述

正如你在上图中看到的。它不适合所有人公开访问。

但我仍然可以从 s3 链接访问它。

这种现象是我的存储桶策略造成的吗?

{
    "Version": "2012-10-17",
    "Id": "Policy1528702071704",
    "Statement": [
        {
            "Sid": "Stmt1528702067249",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my-test-bucket/*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

如果是这样,在包含大约 10,000 个文件的大型公共存储桶中取消单个文件的公共访问权限的最佳方法是什么?

由于这个问题,我无法申请make public大桶。

Joh*_*ein 5

默认情况下,Amazon S3 中的所有对象都是私有的。

您可以通过存储桶策略(例如上面的策略)或通过添加特定对象的权限来使对象可访问。

如果这些方法中的任何一个授予对对象的访问权限,则该对象是可访问的。因此,您的存储桶策略授予对整个存储桶的访问权限这一事实意味着您的对象是公共的。

对一个文件进行例外处理的唯一方法是添加拒绝策略,例如:

{
    "Version": "2012-10-17",
    "Id": "Policy1528702071704",
    "Statement": [
        {
            "Sid": "AllowALl",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my-test-bucket/*"
        },
        {
            "Sid": "DenyOneObject",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my-test-bucket/images/login_logo.png"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

Deny始终会覆盖Allow 因此该对象将保持私有。

但是,请小心:此策略拒绝所有人(包括您!)的读取访问权限。您可能需要对其进行调整,以便仍然可以访问(可能通过使用NotPrincipal)。