使用 Fargate + ACM + ALB 构建安全的 HTTPs Web 服务器

Posted

技术标签:

【中文标题】使用 Fargate + ACM + ALB 构建安全的 HTTPs Web 服务器【英文标题】:Building a secure HTTPs web server with Fargate + ACM + ALB 【发布时间】:2019-02-04 22:40:42 【问题描述】:

我正在尝试最简单的部署,以在 Fargate 中启动并运行 https Web 服务器。

我已使用 Amazon Certificate Manager 创建了一个 public certificate。

我有一个 Application Load Balancer,它在两个端口上与 Fargate 容器通信: 80 用于 http 和 443 为 https

这是问题所在:当我在端口 80 (http) 上运行我的网络服务器并通过 ALB 连接时,它工作正常(不安全,但它提供了 html)。

当我在启用 TLS 的端口 443 上运行我的网络服务器时,它不会通过 ALB 连接。

另一点是,当在端口 443 上启用 TLS 运行我的网络服务器时,我没有证书或证书密钥,因此很困惑如何从 Amazon 获取。

我的另一个问题是:我说 ELB 将通过 HTTPS 与客户端通信但 ELB 可以通过 HTTP 与容器通信是否有意义?这安全吗?

感谢您的帮助,我的网络知识非常生疏。

【问题讨论】:

“我的另一个问题是”.. 考虑将您的 SO 帖子限制为一个问题。有多个问题不集中,这让我们很难回答。 如何为 ALB 配置目标组? ALB 安全组是否允许 443 上的流量? @bluescores 感谢并为多个问题感到抱歉...我已将安全组配置为允许 443。那么,如果我可以通过 https (443) 从公共 Internet 与 ALB 通信,那么ALB 是否可以通过 http (80) 与我的 Web 服务器通信? 【参考方案1】:

说 ELB 将通过 HTTPS 与客户端通信,但 ELB 可以通过 HTTP 与容器通信,对我来说有意义吗?

是的。您应该确保您的 Web 服务器在端口 80 上接受来自 ALB 的流量。这是在应用程序级别、在 Web 服务器上以及与您的目标组完成的,这是 ALB 将用来确定将流量路由到的方式您的网络服务器。这是它通常的工作方式:

client --(443)--> ALB --(80)--> web server

需要检查的一些事项:

目标组配置为在端口 80 上将流量发送到 FG Web 服务器 目标组健康检查配置为检查端口 80 FG 任务安全组在端口 80 上有来自 ALB 的入口 Web 服务器配置为监听 80 端口

旁注:您可以将目标组配置为在 443 上将流量发送到目标(Fargate 中的 Web 服务器),但正如您所说,如果容器中没有正确的证书设置,您将无法正确终止 SSL它就是行不通。您需要将自己的证书上传到 ACM 才能正常工作,这会让您陷入安全漏洞,即如何避免将您的私钥烘焙到 Docker 映像中。

【讨论】:

谢谢!这就是我所怀疑的,因为当从公共互联网连接到 ALB 时,我的 Web 服务器似乎不需要支持 SSL,应该通过 SSL,然后 ALB --> Web 服务器应该由 AWS 保护。一个后续问题,为了保护我的网络服务器,我应该确保它不在可公开访问的子网中?而是将其放在只有 ALB 可以与之通信的私有子网上,而 ALB 位于公共子网上? 不客气。是的,您可以将 Web 服务器放在私有子网中,将 ALB 放在公共子网中,只要确保私有子网和公共子网都在同一个 AZ 中,它应该只是工作™ 您还应该确保 ALB 的安全组接受端口 443 中的流量

以上是关于使用 Fargate + ACM + ALB 构建安全的 HTTPs Web 服务器的主要内容,如果未能解决你的问题,请参考以下文章

AWS ECS Fargate ALB 错误(请求超时)

Terraform 和 AWS:ACM 证书从未经过验证

ECS Fargate 自动扩缩得更快?

Netflix Zuul/Ribbon/Eureka 与 AWS ELB/ALB 和 ECS

如何启动具有公共 DNS 的 ECS Fargate 容器?

在 ECS Fargate 中操作 Celery Worker