Amazon S3 Policy + Liip Imagine Cache Resolver

时间:2017-10-12 14:39:17

标签: php symfony amazon-s3 liipimaginebundle

我已经使用Liip Imagine软件包设置了一个Amazon S3缓存解析程序,并且在存储桶上设置了正确的权限以防止在浏览器中列出目录内容时出现问题。

我的情景:

该网站在S3上有相当多的图像资源 - 一些手动上传,许多也通过CMS使用Vich上传捆绑上传。我使用Imagine包来解析基于config.yml文件中定义的过滤器的缓存图像(用于缩略图和预览),然后将其存储在以过滤器命名的S3存储桶中的单独目录中。简而言之,将原始内容上传到S3 - >自动解析存储在S3上的缓存文件。效果很好。

问题

我第一次请求解析缓存文件的唯一方法是在存储桶上拥有广泛的公开权限。这不好,因为当你这样做时,S3暴露了一个"桶浏览器"以XML文件的方式列出整个存储桶内容(或至少前1000个记录)。我需要将所有文件公开,但我无法在任何给定时间列出这些文件,因为我们在新产品发布之前与人们嗅探此客户网站存在问题。我至少不想要一份文件名列表。

我尝试过的事情

我已经尝试了多个存储区ACL中的设置组合以及以下存储桶策略:

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

我发现的是,除非" Everyone"否则缓存的文件将无法解析。公共访问下的组被给予"列出对象"权限。只要我关闭该权限(禁止在浏览器中查看XML文件),就无法再从上传中解析未缓存的文件。

enter image description here

我还尝试了什么

我还尝试将存储桶配置为网站,并根据我在此处找到的一些建议在根目录中上传了默认的index.html文件。这没什么。也许我错过了什么。

我还尝试确保缓存解析文件夹在S3中是公共的,其中列表中的“对象”权限已关闭。这也不起作用。

错误

删除列表对象权限后,在发生解析尝试时会产生以下错误

Error executing "CreateBucket" on "https://[MY_BUCKET].s3.amazonaws.com/"; 
AWS HTTP error: Client error: `PUT https://[MY_BUCKET].s3.amazonaws.com/` 
resulted in a `403 Forbidden` response:

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code>
<Message>Access Denied</Message><RequestId>94D939 (truncated...)
AccessDenied (client): Access Denied - <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message>
<RequestId>[HIDDEN]</RequestId>
<HostId>[HIDDEN]</HostId>
</Error>

Bucket Structure就像这样

[MY_BUCKET]
  -thumbnails // <-- where thumbnails are resolved
  -previews // <-- where previews are resolved
  -uploads  // <-- primary uploads parent dir
  --products // <-- where products are uploaded
  --other // <-- where other files are uploaded
  --images // <-- where images are manually uploaded

我的假设是解析器需要读取目录的内容以确定文件是否已被解析。

如果有必要,我可以提供symfony的配置信息,但我没有遇到问题,所以没想到有必要。

最终我只需要让解析器能够做到这一点并阻止浏览器访问存储桶内容。

1 个答案:

答案 0 :(得分:0)

我想出来了。它需要在 IAM 级别对策略进行调整,从而更改资源节点:

...
"Resource":[
    "arn:aws:s3:::[MY_BUCKET]/*"
]

为:

....
"Resource":[
    "arn:aws:s3:::*"
]