如何配置亚马逊云端以阻止某些 S3 存储桶文件访问?

Posted

技术标签:

【中文标题】如何配置亚马逊云端以阻止某些 S3 存储桶文件访问?【英文标题】:How to configure amazon cloudfront to block some S3 bucket files access? 【发布时间】:2016-05-12 10:38:18 【问题描述】:

在 S3 上,我们将所有文件设为私有。用户无法通过 S3 链接加载任何文件。但它们都是通过云端链接公开的。

如何限制对 ./restricted.txt 的访问? (只有使用签名 URL 链接的用户才能通过云端链接查看该文件),./not_restricted.txt 必须同时公开。

我是怎么做到的。

我在 s3 上创建了 /public 和 /private 文件夹,分离了我的私人/公共文件,创建了指向 /public 的云端源。所以我在 /public 文件夹中的所有 S3 文件都是公共的,我可以使用没有公共前缀 /img1.jpg 而不是 /public/img1.jpg 的链接加载它们,因为 cloudfront 将 /public 视为根文件夹。

现在我在 /private 或 /public 文件夹上方任何其他位置的所有文件都是通过 S3 和云端链接私有的。

但我不知道如何为将具有云端路径的 /private/restricted.txt 文件创建签名 URL。我可以创建使用 S3 路径的签名 url,但我需要有云端链接。

提前致谢。

【问题讨论】:

【参考方案1】:

在 CloudFront 中有“缓存行为”的概念。基于 URL 路径,这些允许您修改缓存行为,包括使用签名 URL/Cookie 的要求。

如果我理解你想要:

维护您的私有 S3 存储桶 通过 CloudFront (/public) 维护一些公共路径 拥有通过 CloudFront (/private) 的私有路径

这可以通过简单地在您的 CloudFront 分配中添加一个新的缓存行为并将 Restrict Viewer Access (Use Signed URLs or Signed Cookies) 设置为是来完成。例如:

所以重申一下,实现这一目标的最简单方法是

在 S3 和 CloudFront 之间使用 OAI 有一个 CloudFront 分配指向您的 S3 存储桶(root,而不是 /public) 创建一个为 /private 启用签名 URL 的新缓存行为

如果这不能回答您的问题,例如,如果您需要维护路径并且不能在 URL 架构本身中使用 /public 和 /private,请通过评论告诉我,我可以尝试详细说明。谢谢!

【讨论】:

嗨,你试过这样做吗?亚马逊支持的答案是“不可能”。我试图再添加一种行为,但私有文件仍然可见,即使启用了限制访问(仅签名的 url cookie)选项也是如此。我猜这是因为您无法更改默认行为入口点,它是 *.因此,无论第二种行为,它都提供私人文件。谢谢。你清楚我想要达到的目标。 @Rantiev - 让我试试这个并确认。我很可能是错的! :) 感谢您的反馈。 @Rantiev 是的 - 现在刚刚测试了它,它适用于我的测试 CF 发行版。行为示例:cf.alexjs.im/tmp/cf-private.png -- 然后是 cf-beta.alexjs.im/private cf-beta.alexjs.im/public cf-beta.alexjs.im -- 看起来都正常 那个文件链接吗? cf-beta.alexjs.im/private 还是只是空文件夹?您能否提供 2 个具有相同路径的链接,除了 /public /private 部分我的意思是 cf-beta.alexjs.im/private/private.png cf-beta.alexjs.im/public/public.png cf-beta - 这是云端分发路径还是您的 S3 存储桶名称? 我让它在我的设置中工作。所以我创建了 2 种行为:1. 登录时为 /private 2. 为 *(默认)当签名为 OFF 时

以上是关于如何配置亚马逊云端以阻止某些 S3 存储桶文件访问?的主要内容,如果未能解决你的问题,请参考以下文章

不使用亚马逊 S3 存储桶创建亚马逊云端分发

AWS 静态网站 + 云端签名 cookie

如何使用 axios 将文件上传到亚马逊 s3 存储桶?

Amazon S3 存储桶策略阻止用户代理

允许 lambda 函数访问 S3 存储桶但阻止外部 IP

如何从亚马逊 s3 存储桶中删除文件?