侧边栏壁纸
  • 累计撰写 208 篇文章
  • 累计创建 16 个标签
  • 累计收到 5 条评论

目 录CONTENT

文章目录

如何使用 Cloudflare 为 S3 存储桶网站添加 HTTPS在支持 HTTPS 和自定义域的 S3 存储桶中托管静态网站

Wake
2024-07-23 / 0 评论 / 0 点赞 / 1,041 阅读 / 2,080 字

前言:

AWS S3 提供了一种将文件存储在高度可用的对象存储中的简单方法,它还支持设置静态网站。如果不需要动态内容,那么使用 S3 存储桶是一个很有吸引力的托管选项。几乎不需要为存储支付任何费用,而且可以忘记可扩展性。

这种方法有两个问题。它不支持使用你自己的域名,并且连接到它,它不支持HTTPS。要解决这些问题,需要与 S3 一起使用提供这些缺失功能的另一项服务。

一种选择是 Cloudflare,它提供支持 S3 存储桶网站的代理,并且可以与自定义域名一起使用。

本文介绍了在 Cloudflare 提供加密和 DNS 设置的情况下设置在 S3 中托管的自己的静态网站所需执行的步骤。

作为先决条件,需要在 Cloudflare 或其他地方注册的自己的域名。

设置

要使用 Cloudflare 在自己的域上托管静态网站,需要设置 S3 和 Cloudflare 这两项服务。前者存储网站并提供 HTTP 接口,而后者管理代理和 HTTPS 设置。
image-1721702573031

桶设置

第一步是创建一个存储桶并上传内容。这可以使用 CLI 或使用控制台手动完成。

桶的名称很重要。它必须是站点的域,否则它将无法工作。这是因为 S3 使用浏览器发送的 Host 标头来知道要使用哪个存储桶,而该标头是站点的域。
image-1721702617756

公共访问

接下来,需要取消阻止公共访问。存储桶网站本质上会公开所有对象,而这些对象必须允许匿名访问。

近年来,由于存储桶配置错误导致的安全漏洞越来越多,例如这个和这个漏洞,AWS 开始对此采取措施。现在当它的策略允许公共访问时,桶上有一个显着的标签,这是一件好事。它允许某人在不解密存储桶策略的情况下验证存储桶是否私有。

另一个障碍是新存储桶的公共访问被阻止,需要明确禁用它以允许公共访问。我对此有不同的看法,因为默认情况下存储桶是私有的,需要启用公共访问。现在需要在两个地方而不是一个地方启用它。

因此,要使存储桶网站正常运行,请确保禁用公共访问块:
image-1721703025234
然后,当然,需要一个允许匿名访问的存储桶策略:

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

桶网站

最后,启用存储桶网站托管。请注意端点 URL,因为这是网站可用的地方:
image-1721705364568
当在浏览器中打开 URL 时,它会起作用:
image-1721705404902
但要注意两件事。首先,它被报告为“不安全”,这意味着它使用 HTTP 而不是 HTTPS。其次,它使用存储桶网站 URL 而不是自己的域。

对于 bucket 网站,这是你能走的最远的地方。S3 不允许任何配置将站点托管在不同的域上,并且肯定没有办法添加证书来提供 HTTPS。需要为这些功能使用不同的服务。幸运的是,有几种方法可以从这里开始。在本文的其余部分,我们将研究如何配置 Cloudflare 以提供缺少的功能。

Cloudflare 设置

要将 Cloudflare 用于你的域,需要将其用作域的名称服务器。如果已将域转移到 Cloudflare,则无需执行任何其他操作。如果使用不同的域提供商,则需要添加两个指向 Cloudflare 的 NS 记录。确切的过程取决于域提供商,但在 Cloudflare 文档上有详细的文档。

然后需要设置 Cloudflare DNS。在根目录添加一条CNAME记录,域名为S3 bucket网站(没有http://的部分)。确保“代理状态”为“已代理”。
image-1721705462400
这些设置背后发生了很多事情。

首先,根据 DNS 标准,域的顶点不允许使用 CNAME。顶点是“裸”域,这是它的注册方式,例如example.com. 相比之下,www.example.com就不是顶点。这会阻止 CNAME 重定向并提示使用子域,例如www. 为了解决这个问题,Cloudflare 提供了CNAME 扁平化。这将解析 CNAME 指向的 A 记录并返回这些记录。因此,可以在顶点上使用 CNAME,同时保持对标准的遵从性。

其次,内容指向 S3 存储桶网站的域,但这并不是定义它指向哪个存储桶的内容。相反,它使用 HTTP 请求的主机标头,该标头是 Cloudflare ( ) 管理的域名example.com。有趣的是,如果只指定存储桶网站域的末尾( ) ,它就会起作用s3-website-eu-west-1.amazonaws.com

第三,代理设置定义 Cloudflare 将站在访问者和存储桶网站之间。这就是它提供 HTTPS 的方式。

由于 bucket 网站使用纯 HTTP,需要配置“灵活”模式:
image-1721705489416
此设置为访问者提供加密连接,但为存储桶网站提供未加密连接。

最后,作为最佳实践,启用从 HTTP 到 HTTPS 的自动重定向。这确保流量将被加密,但即使通过 HTTP 访问网站也能正常工作:
image-1721705599704
通过所有这些设置,在浏览器中打开域会通过安全连接显示网站:
image-1721705625063

这种方式安全吗 ?

浏览器显示挂锁,但加密不是端到端的。虽然访问者和 Cloudflare 之间的流量使用 HTTPS,但 Cloudflare 和 S3 之间的部分没有。相反,它使用公共互联网来获取网站的纯文本。

这暗示了一种错误的安全感。如果攻击者可以捕获浏览器和 Cloudflare 之间以及 Cloudflare 和 S3 之间的流量,他就可以关联给定用户发出的请求。这违背了加密的目的。

另一方面,连接最关键的部分是在用户附近。易于监控的公共 WiFi 网络或流经单个路由器的酒店网络流量比在两个数据中心之间流动的数据危险得多。

优点

主要优点是该网站可以在自己的域名上访问,并且带有挂锁图标。从成本上讲,它几乎是免费的。需要为 S3 端的存储、请求和带宽付费,但 Cloudflare 对于此用例是免费的。

这种设置的一个好处是不需要配置 HTTPS 的细节。有很多选项,很容易出错。甚至还有一个在线测试器来验证的设置。Cloudflare 管理证书和加密,确保设置安全。

借助 Cloudflare 的 CNAME 扁平化功能,可以在不破坏某些客户端的情况下使用顶级域。这是一些 DNS 提供商遇到的问题,而且很难解决。

此外,此设置通过 Cloudflare 的网络路由流量,并且提供的不仅仅是路由。它添加缓存,提供一些 DDoS 保护,以及可以指定永远在线的错误页面。

缺点

主要缺点是需要使用两种不同的服务。这使得从长远来看更难维护,但根据我的经验,在初始设置后没有太多事情要做。

并且缺乏端到端加密会损害一些安全性。

0

评论区