具有 HTTPS 和仅 VPN 访问权限的 AWS S3 静态站点

yan*_*ory 10 vpn https amazon-s3 amazon-web-services amazon-cloudfront

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

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

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

我们具有与此答案相同的 VPN 配置。这个答案对我们有用,但它没有解决 S3 存储桶 IP 可能发生变化的问题(这会使 VPN 客户端上提议的路由规则无效),而且我不清楚如何让 HTTPS 与此一起工作(AFAIK,您需要将 CF 放在 S3 静态站点的前面,但我不确定如何通过我们的 VPN 将流量路由到 Cloudfront。)

yan*_*ory 2

我决定使用VPC 端点来控制入口。有一个只能通过 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": "*"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

它有效!我们获得 SSL 连接,负载均衡器在 VPN 外部进行零访问(负载均衡器 DNS 无法解析,并且 S3 静态站点本身出现 403)。

请参阅http://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies-vpc-endpoint.html。

  • 我仍然不明白流量如何从负载均衡器到达 S3 存储桶。具有路由表的 VPC 端点允许来自子网内的流量访问 S3 存储桶,并且负载均衡器位于子网内,但据我所知,不存在任何允许从负载均衡器接收的流量进行定向的东西到桶里。 (5认同)
  • 路由表中需要有一个条目将 S3 的流量引导至 VPC 终端节点。请参阅 http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-endpoints.html 中的图表。我们使用 Terraform(基础设施即代码)来执行此操作,以便使用 https://www.terraform.io/docs/providers/aws/d/vpc_endpoint.html 自动创建该条目。 (2认同)