使用 TLS 保护 Kubernetes 服务

Posted

技术标签:

【中文标题】使用 TLS 保护 Kubernetes 服务【英文标题】:Securing Kubernetes Service with TLS 【发布时间】:2018-11-26 08:37:16 【问题描述】:

我有一个内部应用程序,仅通过具有集群 IP 的服务向集群上的其他应用程序公开。其他服务正在通过它的 DNS (serviceName-namespace.svc.cluster.local) 访问此应用程序。此应用程序处理敏感数据,因此尽管所有通信都在集群内,但我想使用 TLS 来保护与此应用程序的通信。

我的问题是 - 如何在服务上启用 TLS?是否已经存在某些东西或者我应该在应用程序代码上处理它?另外,集群上是否已经有可以为.svc.cluster.local签名证书的CA?

澄清一下,我知道我可以为此目的使用 ingress。唯一的问题是仅将此服务保持在内部 - 因此只有集群内的服务才能访问它。

谢谢, 奥马尔

【问题讨论】:

你检查过 Jetstack 的cert-manager 项目了吗? 不,但现在快速浏览一下之后 - 我不确定这是否适用于内部服务,使用内部 DNS 【参考方案1】:

检查教程“Secure Kubernetes Services with Ingress, TLS and LetsEncrypt”是否适用于您:

Ingress 可以通过使用不同的 Ingress Controller 由不同的实现支持。其中最受欢迎的是nginx Ingress Controller,但也有其他可用选项,例如Traefik、Rancher、HAProxy 等。每个控制器都应支持基本配置,但甚至可以公开其他功能(例如重写规则,身份验证模式)通过注释。

给它一个域名并启用 TLS。 LetsEncrypt 是一个免费的 TLS 证书颁发机构,使用 kube-lego 控制器,我们可以自动请求和更新公共域名的 LetsEncrypt 证书,只需在我们的 Ingress 定义中添加几行!

为了使其正常工作,需要一个公共域名,并且应该有一个指向 Nginx 服务的外部 IP 的 A 记录。

为了限制在集群域内部(svc.cluster.local),you might need CoreDNS。

【讨论】:

我知道这可以通过 ingress 完成,我之前使用过几次 ingress。我不想使用入口,因为我想将此服务保持在内部(例如,只能从集群内部访问)。通过阅读here 似乎有可能,但这似乎有点复杂。另外,我应该使用什么证书? @OmerLeviHevroni 您可以使用自签名证书进行测试 (kubernetes.io/docs/concepts/services-networking/…) 我知道,但这听起来不像是我想在生产中使用的东西。这意味着我应该将自签名证书滚动到使用此服务的每个客户端。 @OmerLeviHevroni 同意:在工作中,我们使用由 F5 管理的通配符证书(我们的代理:f5.com/glossary/reverse-proxy) 是的,我没有通用的解决方案,我只是指出我们的工作。【参考方案2】:

按照下面的@vonc cmets,我想我有一个解决方案:

为此服务购买一个公共有效域(例如something.mycompany.com)。 使用 CoreDNS 添加覆盖规则,以便所有对something.mycompany.com 的请求都将转到something-namesapce.svc.cluster.local,因为该服务不会暴露在外部(这也可以通过我的用例的普通 A 记录来完成)。 使用 Nginx 或其他工具处理带有 something.mycompany.com 证书的 TLS。

这听起来很复杂,但可能会奏效。你怎么看?

【讨论】:

【参考方案3】:

我刚刚发现 Kubernetes API 可用于生成一个证书,该证书将被集群上运行的所有 pod 信任。此选项可能比其他选项更简单。您可以找到文档here,包括生成证书和使用证书的完整流程。

【讨论】:

有趣,而且比我的回答容易。 +1 这对你有用吗?您链接到的文档描述了将 pod IP 作为 SAN 放入证书中。当 pod 被回收并失效时,这些肯定会定期更改吗? 我还没玩过。如果有机会,我会试一试并更新 @OmerLeviHevroni:它是否适用于这个解决方案?还有,文件上写着Now you can use server.crt and server-key.pem as the keypair to start your HTTPS server.是什么意思? example.default.svc.cluster.local 是所有服务的默认 URL。我们需要在哪里提供该证书? 您需要将它们提供给您的服务以启动 TLS 连接。这真的取决于堆栈 - 不同的技术有不同的配置选项。【参考方案4】:

在 Google Cloud 上,您可以将负载平衡器服务设为内部,如下所示:

    annotations = 
      "cloud.google.com/load-balancer-type" = "Internal"
    

【讨论】:

以上是关于使用 TLS 保护 Kubernetes 服务的主要内容,如果未能解决你的问题,请参考以下文章

fabric之使用传输层安全性(TLS)保护通信安全

使用TLS 1.2保护Web请求

如何使用 SSL/TLS 和/或消息级安全性保护 RESTful php Web 服务

kubernetes(k8s)ingress tls和path的使用

Dotnet 5 Kubernetes TLS 在生产中失败

Istio 不仅为微服务而生——保护Kubernetes中的服务