自动 mTLS

自动 mTLS

默认情况下,Linkerd 会自动为网格化 Pod之间的所有 TCP 流量启用双向验证的传输层安全性 (mTLS)。这意味着 Linkerd 向您的应用程序添加了经过身份验证的加密通信,而您无需进行额外的工作。(并且因为 Linkerd 控制平面也在数据平面上运行,这意味着 Linkerd 控制平面组件之间的通信也通过 mTLS 自动保护。)

有关详细信息,请参阅下面的注意事项和未来工作

什么是 mTLS?

mTLS 的完整定义超出了本文档的范围。有关 mTLS 是什么以及它在 Kuberentes 集群中的工作原理的概述,建议您阅读 Kubernetes 工程师的 mTLS 指南

Linkerd 可以自动 mTLS 哪些流量?

Linkerd 透明地将 mTLS 应用于网格化 Pod 之间的所有 TCP 通信。但是,您的系统中仍有可能存在 (非)non-mTLS 流量的方法,包括:

  • 进出非网格化(non-meshed) Pod 的流量(例如 Kubernetes healthchecks
  • 标记为 skip ports 的端口上的流量,完全绕过代理。

您可以通过多种方式验证哪些流量是 mTLSBuoyant Cloud 等外部系统还可以自动生成集群上 TLS 流量模式的报告。

运营问题

LinkerdmTLS 需要为生产使用做一些准备,特别是对于长期存在的集群或期望有跨集群流量的集群。

默认 linkerd install CLI 命令生成的信任锚会在 365 天后过期。之后,它必须手动轮换——这是一项重要的任务。或者,您可以自己提供信任锚并控制到期日期,例如:将其设置为 10 年而不是一年。

利用 Linkerd多集群通信 必须共享一个信任锚(trust anchor)。因此,默认的 linkerd install 设置不适用于这种情况,您必须提供明确的信任锚。

同样,默认的集群颁发者证书(issuer certificate)密钥会在一年后过期。这些必须在到期前轮换。或者,您可以使用 cert-manager 设置自动轮换

Buoyant Cloud 等外部系统可用于监控集群凭据,并在它们即将到期时发送提醒。

Linkerd 的 mTLS 实现是如何工作的?

Linkerd 控制平面 包含一个名为 identity 的证书颁发机构 (CA)。该 CA 向每个 Linkerd 数据平面代理颁发 TLS 证书。每个证书都绑定到包含 podKubernetes ServiceAccount 身份。这些 TLS 证书会在 24 小时后过期并自动轮换。代理使用这些证书来加密验证到其他代理TCP 流量。

控制平面方面,Linkerd 在集群中维护一组凭据:信任锚(trust anchor)颁发者证书(issuer certificate)私钥(private key)。这些凭据可以在安装期间由 Linkerd 生成,也可以由外部源(例如 Vaultcert-manager颁发者证书私钥存储在 Kubernetes Secret 中;这个 Secret 被放置在 linkerd 命名空间中,并且只能被 Linkerd 控制平面identity 组件使用的 service account 读取。

数据平面方面,每个代理都在环境变量中传递信任锚。在启动时,代理会生成一个私钥,存储在 tmpfs emptyDir 中,该私钥留在内存中并且永远不会离开 pod。代理连接到控制平面identity 组件,验证与信任锚identity 连接,并发出证书签名请求 (CSR)CSR 包含一个初始证书,其身份设置为 podKubernetes ServiceAccount,以及实际的 service account token,以便该 identity 可以验证 CSR 是否有效。验证后,签名的信任包将返回给代理,代理可以将其用作 clientserver 证书。这些证书的范围为 24 小时,并使用相同的机制动态刷新。

最后,当代理从其 pod 内的应用程序容器接收到出站连接时,它会使用 Linkerd 控制平面查找该目的地。如果它在 Kubernetes 集群中,控制平面会向代理提供目的地端点地址,以及包括 identity 名称在内的元数据。当代理连接到目标时,它会发起 TLS 握手并验证目标代理的证书是否由信任锚签名并包含预期 identity

注意事项和未来工作

  • 除非配置了授权策略,否则 Linkerd 不强制 mTLS

  • 理想情况下,Linkerd 使用的 ServiceAccount token 不会与该 token 的其他潜在用途共享。在未来的 Kubernetes 版本中,Kubernetes 将支持 受众/时间限制(audience/time-bound)ServiceAccount tokenLinkerd 将使用这些 token