具有 HTTPS 和仅限 *** 访问的 AWS S3 静态站点
Posted
技术标签:
【中文标题】具有 HTTPS 和仅限 *** 访问的 AWS S3 静态站点【英文标题】:AWS S3 static site with HTTPS and ***-only access 【发布时间】:2017-07-05 02:03:58 【问题描述】:目前我们有一个静态站点部署到 ECS(弹性容器服务)并由 ELB(弹性负载均衡器)作为前端。这个模型实际上没有意义,因为容器只是运行 nginx 来提供静态资产。
但是,我们从这个模型中得到的是对网站的仅 *** 访问(我们的 *** 客户端将所有 10.x 流量转发到我们的 VPC),以及 ELB 上的 HTTPS 侦听器,这两者都是我们想保留。
将目前只能通过 *** 访问的静态站点迁移到通过 HTTPS 从 S3/Cloudfront 提供服务并且只能通过 *** 访问的最佳方式是什么?
We have the same *** configuration as in this answer. 这个答案对我们有用,但它没有解决 S3 存储桶 IP 可能发生变化的问题(这会使 *** 客户端上的建议路由规则无效),我不清楚如何让 HTTPS 使用它(AFAIK,您需要将 CF 放在 S3 静态站点的前面,但我不确定如何通过我们的 *** 将流量路由到 Cloudfront。)
【问题讨论】:
这可以做到,但是当你看到如何实现它时,它会显得有点混乱。如果站点使用 HTTPS,那么通过 *** 访问它的原因是什么?使用 CloudFront + WAF 来简单地限制对 *** 客户端使用的任何公共 IP 的访问会容易得多。当然,如果它们不在具有静态 IP 地址的固定位置,那么也许这就是原因。请解释一下。 实际上,等等...这个计划存在问题,我们需要确保它不会违反您的政策。当存储桶处于网站托管模式时,S3 和下一个上游系统之间的传输不是 HTTP。在添加 HTTPS 之前,内容将在 S3 和它之前的任何东西(例如 CloudFront 或您的 VPC 中的代理)之间以明文形式传输。这将在 AWS 网络上,但不是端到端加密的。这是可以接受的限制吗? @Michael-sqlbot S3 和 CF 之间的未加密流量是可以的,如果它在 AWS 网络上。 *** 客户端没有静态 IP;只有到 10.x (VPC) 和 172.x(私人办公网络)的流量通过我们的 AWS VPC/*** 网关,而 Cloudfront 是公共的。这有意义吗? 如果 S3 存储桶具有静态 IP,我可以通过我们的 ***/VPC 隧道路由来自 *** 客户端的流量,并使用仅允许从我们的 ***/VPC 连接访问的存储桶策略,但我会失去 HTTPS。所以对于 HTTPS,我必须使用 Cloudfront。然而,这也没有任何意义,因为它是一个仅限内部的公司网站,所以问题就变成了如何使它只能通过 *** 访问。 我也有类似的情况。我们在 S3 Hosting 上有一个仅限内部的静态站点。该存储桶有一个策略,仅限制来自 VPC 的流量,我们有 Direct Connect,因此该站点只能通过我们的网络访问。但是我们现在需要与 Cognito 集成(用于 SSO 联合),但 Cognito 不允许 HTTP 回调 URL。不太清楚如何解决这个问题。 【参考方案1】:我决定使用VPC endpoints 来控制入口。有一个内部负载均衡器(私有子网)只能通过 VPC/*** 访问,它将流量路由到 VPC 端点。
存储桶策略看起来像(Terraform 模板)
"Version": "2012-10-17",
"Id": "Policy1415115909152",
"Statement": [
"Sid": "deny-get-if-not-from-vpce",
"Action": [
"s3:GetObject"
],
"Effect": "Deny",
"Resource": [
"arn:aws:s3:::$bucket",
"arn:aws:s3:::$bucket/*"
],
"Condition":
"StringNotEquals":
"aws:sourceVpce": "$vpce_id"
,
"Principal": "*"
,
"Sid": "allow-get-if-from-vpce",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::$bucket",
"arn:aws:s3:::$bucket/*"
],
"Condition":
"StringEquals":
"aws:sourceVpce": "$vpce_id"
,
"Principal": "*"
]
而且它有效!我们获得了 SSL 连接,并且负载均衡器在 *** 之外进行零访问(负载均衡器 DNS 无法解析,并且 S3 静态站点本身出现 403)。
见http://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies-vpc-endpoint.html。
【讨论】:
嗨,了解 ELB 如何将流量路由到 VPC 端点会有用吗?据我所知,您只能将实例添加到 ELB。您是否将 ELB 指向运行某些代理软件的实例? 路由表中需要有一个条目将流向 S3 的流量定向到 VPC 端点。请参阅docs.aws.amazon.com/AmazonVPC/latest/UserGuide/… 中的图表。我们使用 Terraform(基础架构即代码)来执行此操作,以便使用 terraform.io/docs/providers/aws/d/vpc_endpoint.html 自动创建条目。 感谢@yangmillstheory 我仍然不明白流量是如何从负载均衡器到达 S3 存储桶的。带有路由表的 VPC 端点允许来自子网内的流量访问 S3 存储桶,并且负载均衡器位于子网内,但据我所知,没有任何东西允许从负载均衡器接收到的流量被定向到桶里。 您好,您是否在这种情况下完全删除了 CloudFront?还是负载均衡器被 CloudFront 击中?以上是关于具有 HTTPS 和仅限 *** 访问的 AWS S3 静态站点的主要内容,如果未能解决你的问题,请参考以下文章