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

AWS S3 static site with HTTPS and VPN-only access

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

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

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

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

我决定使用 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