2016-01-08 105 views
3
  • 我有一个S3存储桶,充当静态网站。
  • 我有一个云端分布,指向存储桶的HTTP端点。
  • 我想限制只能访问我的S3存储桶到Cloudfront。

我想我可以通过添加校长做到这一点:阿尔恩:IAM:CloudFront的....通过HTTP从Cloudfront访问Amazon S3

但这允许直接S3访问,而不是HTTP端点访问。

当我配置Cloudfront直接服务于S3存储桶时,它不显示子目录index.htmls。为了达到mysite.com/blog/,我必须键入mysite.com/blog/index.html

因此,我必须使用S3的HTTP端点,就好像站点不在S3上一样,但是在Apache服务器上。

现在我不能通过arn:iam:cloudfront来限制访问。由于Cloudfront成为另一个Web爬虫,S3成为另一个Web服务器。

他们建议添加自定义标头,以便服务器能够理解它是云端。但S3不支持自定义标题。

将用户代理限制为AWS的CloudFront和Principal:*执​​行一项简短的工作,但不会阻止UserAgent欺骗。

我怎样才能解决这个问题?

+0

已解决。完整的教程可以在这里看到http://tuts.emrealadag.com/post/cloudfront-cdn-for-s3-static-web-hosting/ – aladagemre

回答

3

不要配置原点为S3在所有 - 其配置为自定义原点,然后用桶的网站端点主机作为原始服务器主机名。

此时,您应该能够配置CloudFront将发送到原点的Origin Custom Header - 恰好是存储桶的网站端点。

User-Agent不在list of custom headers that CloudFront won't forward上,所以您应该能够在CloudFront对S3的请求中发送自定义用户代理字符串(行为有点像静态密码),并将您的存储桶配置为仅允许该自定义用户代理。

理论上它仍然可能被欺骗,但由于它是一个随机字符串,所以除了你,S3和CloudFront之外,没有人知道这个值,对于某人欺骗一个未知值非常棘手,特别是S3只是拒绝访问,没有解释。

+0

非常感谢您设置User-Agent的自定义工作! – aladagemre

1

你试过这种方法吗?

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html

为了确保您的用户访问只使用CloudFront的 的网址,你的对象不管网址是否签订,执行以下 任务:

创建一个原点接入标识,是一位特殊的CloudFront用户, 并将原始访问标识与您的分配关联。 (对于 Web分配,您将原始访问标识与 原点关联,因此您可以保护全部或部分亚马逊S3内容。)您还可以创建原始访问标识并在创建时将其添加到 分布。

更改存储桶中您的Amazon S3存储桶或 对象的权限,以便只有原始访问标识已读取 权限(或读取和下载权限)。当您的用户通过CloudFront访问 您的Amazon S3对象时,CloudFront起源 访问身份代表您的用户获取对象。如果您的用户 通过使用Amazon S3网址直接请求对象,则他们会被拒绝 访问权限。源访问标识有权访问您的Amazon S3存储桶中的 中的对象,但用户不会。

+0

是的,我添加了Principal - CanonicalUser值作为原始访问身份,但它没有'工作。由于我提到的原因,我猜这不起作用。如果我将S3存储桶直接连接到CloudFront,它会有效。但是我必须连接S3存储桶的URL,而不是存储桶对象(由于子目录问题)。 – aladagemre