【发布时间】:2018-03-24 13:23:46
【问题描述】:
我已使用 Liip Imagine 捆绑包设置了 Amazon S3 缓存解析器,但在获取存储桶上设置的正确权限以防止目录内容在浏览器中列出时遇到问题。
我的场景:
该网站在 S3 上有很多图片资源 - 一些是手动上传的,还有很多是使用 Vich Upload 捆绑包通过 CMS 上传的。我使用 Imagine 捆绑包根据 config.yml 文件中定义的过滤器(用于缩略图和预览等内容)解析缓存的图像,然后将其存储在以过滤器命名的 S3 存储桶中的单独目录中。简而言之,将原始文件上传到 S3 -> 自动解析存储在 S3 上的缓存文件。效果很好。
问题
我能够在第一次请求时解析缓存文件的唯一方法是对存储桶拥有广泛开放的公共权限。这不好,因为当您执行此操作时,S3 会以 XML 文件的方式公开一个“bucket explorer”,该文件列出了整个存储桶的内容(或至少前 1000 条记录)。我需要公开所有文件,但我无法在任何给定时间列出它们,因为我们遇到了人们在新产品发布之前嗅探这个客户网站的问题。我至少不想要一个文件名列表。
我的尝试
我已经结合以下存储桶策略尝试了存储桶 ACL 中的几种设置组合:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::[MY_BUCKET]/*"
}
]
}
我发现缓存文件将无法解析,除非公共访问权限下的“所有人”组被授予“列出对象”权限。一旦我关闭该权限(禁止在浏览器中查看 XML 文件),就无法再从上传中解析未缓存的文件。
我还尝试了什么
根据我在此处找到的一些建议,我还尝试将存储桶配置为网站并在根目录中上传默认的 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>
桶结构是这样的
[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 的配置信息,但我对此没有任何问题,因此认为没有必要。
最终我只需要能够让解析器完成它的工作并阻止浏览器访问存储桶内容。
【问题讨论】:
标签: php symfony amazon-s3 liipimaginebundle