【问题标题】:AWS S3 static site with HTTPS and VPN-only access具有 HTTPS 和仅限 VPN 访问的 AWS S3 静态站点
【发布时间】:2017-07-05 02:03:58
【问题描述】:

目前我们有一个静态站点部署到 ECS(弹性容器服务)并由 ELB(弹性负载均衡器)作为前端。这个模型实际上没有意义,因为容器只是运行 NGINX 来提供静态资产。

但是,我们从这个模型中得到的是对网站的仅 VPN 访问(我们的 VPN 客户端将所有 10.x 流量转发到我们的 VPC),以及 ELB 上的 HTTPS 侦听器,这两者都是我们想保留。

将目前只能通过 VPN 访问的静态站点迁移到通过 HTTPS 从 S3/Cloudfront 提供服务并且只能通过 VPN 访问的最佳方式是什么?

We have the same VPN configuration as in this answer. 这个答案对我们有用,但它没有解决 S3 存储桶 IP 可能发生变化的问题(这会使 VPN 客户端上的建议路由规则无效),我不清楚如何让 HTTPS 使用它(AFAIK,您需要将 CF 放在 S3 静态站点的前面,但我不确定如何通过我们的 VPN 将流量路由到 Cloudfront。)

【问题讨论】:

  • 这可以做到,但是当你看到如何实现它时,它会显得有点混乱。如果站点使用 HTTPS,那么通过 VPN 访问它的原因是什么?使用 CloudFront + WAF 来简单地限制对 VPN 客户端使用的任何公共 IP 的访问会容易得多。当然,如果它们不在具有静态 IP 地址的固定位置,那么也许这就是原因。请解释一下。
  • 实际上,等等...这个计划存在问题,我们需要确保它不会违反您的政策。当存储桶处于网站托管模式时,S3 和下一个上游系统之间的传输不是 HTTP。在添加 HTTPS 之前,内容将在 S3 和它之前的任何东西(例如 CloudFront 或您的 VPC 中的代理)之间以明文形式传输。这将在 AWS 网络上,但不是端到端加密的。这是可以接受的限制吗?
  • @Michael-sqlbot S3 和 CF 之间的未加密流量是可以的,如果它在 AWS 网络上。 VPN 客户端没有静态 IP;只有到 10.x (VPC) 和 172.x(私人办公网络)的流量通过我们的 AWS VPC/VPN 网关,而 Cloudfront 是公共的。这有意义吗?
  • 如果 S3 存储桶具有静态 IP,我可以通过我们的 VPN/VPC 隧道路由来自 VPN 客户端的流量,并使用仅允许从我们的 VPN/VPC 连接访问的存储桶策略,但我会失去 HTTPS。所以对于 HTTPS,我必须使用 Cloudfront。然而,这也没有任何意义,因为它是一个仅限内部的公司网站,所以问题就变成了如何使它只能通过 VPN 访问。
  • 我也有类似的情况。我们在 S3 Hosting 上有一个仅限内部的静态站点。该存储桶有一个策略,仅限制来自 VPC 的流量,我们有 Direct Connect,因此该站点只能通过我们的网络访问。但是我们现在需要与 Cognito 集成(用于 SSO 联合),但 Cognito 不允许 HTTP 回调 URL。不太清楚如何解决这个问题。

标签: amazon-web-services amazon-s3 https vpn amazon-cloudfront


【解决方案1】:

我决定使用VPC endpoints 来控制入口。有一个内部负载均衡器(私有子网)只能通过 VPC/VPN 访问,它将流量路由到 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 连接,并且负载均衡器在 VPN 之外进行零访问(负载均衡器 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 击中?
猜你喜欢
  • 2015-09-20
  • 2018-06-28
  • 2017-07-10
  • 2020-05-18
  • 2020-12-27
  • 1970-01-01
  • 2019-11-17
  • 2018-04-18
  • 2021-08-14
相关资源
最近更新 更多