通过HTTP从Cloudfront访问Amazon S3

3
  • 我有一个S3存储桶,用作静态网站。
  • 我有一个Cloudfront分发,指向存储桶的HTTP端点。
  • 我想将对我的S3存储桶的访问限制为仅限Cloudfront。

我猜我可以通过添加Principal:arn:iam:cloudfront ....来实现此目的。

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

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

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

现在我无法通过arn:iam:cloudfront限制访问。因为Cloudfront变成了另一个网络爬虫,S3变成了另一个Web服务器。

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

将用户代理限制为CloudFront和Principal到AWS:*可以做一些简要工作,但它不能阻止UserAgent欺骗。

我该如何解决这个问题?


已解决。完整教程可在此处查看:http://tuts.emrealadag.com/post/cloudfront-cdn-for-s3-static-web-hosting/ - aladagemre
2个回答

3
不要将起点配置为S3,而是将其配置为自定义起点,然后使用存储桶的网站端点主机名作为起源服务器主机名。
此时,您应该能够配置一个Origin Custom Header,CloudFront将向起源发送该标头,该起源恰好是存储桶的网站端点。 User-Agent不在 CloudFront无法转发的自定义标头列表中,因此您应该能够在CloudFront发送到S3的请求中发送自定义用户代理字符串(类似于静态密码),并配置您的存储桶仅允许该自定义用户代理。
它仍然可以在理论上被欺骗,但由于它是您随意制定的随机字符串,所以除了您、S3和CloudFront之外,没有人知道该值,并且很难为某人仿冒一个未知的值,特别是因为S3只是拒绝访问而没有解释。

非常感谢,设置User-Agent为自定义的内容成功了! - aladagemre

1
你尝试过这种方法吗?

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

为了确保用户只能通过CloudFront URL访问您的对象,无论这些URL是否签名,请执行以下任务:
创建一个源访问身份,它是一个特殊的CloudFront用户,并将源访问身份与您的分发相关联。(对于Web分发,您将源访问身份与源相关联,以便可以保护您的所有或部分Amazon S3内容。)您还可以在创建分发时创建源访问身份并将其添加到您的分发中。
更改Amazon S3存储桶上的权限或存储桶中的对象的权限,以使只有源访问身份具有读取权限(或读取和下载权限)。当用户通过CloudFront访问您的Amazon S3对象时,CloudFront源访问身份代表您的用户获取对象。如果用户直接使用Amazon S3 URL请求对象,则被拒绝访问。源访问身份有权访问Amazon S3存储桶中的对象,但用户没有该权限。

是的,我将Principal - CanonicalUser值添加为源访问标识,但它没有起作用。我猜这是我提到的原因导致的。如果我直接连接S3存储桶到CloudFront,它应该可以工作。但由于子目录问题,我必须连接S3存储桶的URL而不是存储桶对象。 - aladagemre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接