自动 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 的端口上的流量,完全绕过代理。
您可以通过多种方式验证哪些流量是 mTLS
的。Buoyant Cloud 等外部系统还可以自动生成集群上 TLS
流量模式的报告。
运营问题
Linkerd
的 mTLS
需要为生产使用做一些准备,特别是对于长期存在的集群或期望有跨集群流量的集群。
默认 linkerd install
CLI 命令生成的信任锚会在 365
天后过期。之后,它必须手动轮换——这是一项重要的任务。或者,您可以自己提供信任锚并控制到期日期,例如:将其设置为 10
年而不是一年。
利用 Linkerd
的 多集群通信 必须共享一个信任锚(trust anchor
)。因此,默认的 linkerd install
设置不适用于这种情况,您必须提供明确的信任锚。
同样,默认的集群颁发者证书(issuer certificate)和密钥会在一年后过期。这些必须在到期前轮换。或者,您可以使用 cert-manager
设置自动轮换。
Buoyant Cloud 等外部系统可用于监控集群凭据,并在它们即将到期时发送提醒。
Linkerd 的 mTLS 实现是如何工作的?
Linkerd 控制平面 包含一个名为 identity
的证书颁发机构 (CA
)。该 CA
向每个 Linkerd
数据平面代理颁发 TLS
证书。每个证书都绑定到包含 pod
的 Kubernetes ServiceAccount 身份。这些 TLS
证书会在 24
小时后过期并自动轮换。代理使用这些证书来加密和验证到其他代理的 TCP
流量。
在控制平面方面,Linkerd
在集群中维护一组凭据:信任锚(trust anchor
)、颁发者证书(issuer certificate
)和私钥(private key
)。这些凭据可以在安装期间由 Linkerd
生成,也可以由外部源(例如 Vault 或 cert-manager。 颁发者证书和私钥存储在 Kubernetes Secret 中;这个 Secret
被放置在 linkerd
命名空间中,并且只能被 Linkerd 控制平面的 identity
组件使用的 service account
读取。
在数据平面方面,每个代理都在环境变量中传递信任锚。在启动时,代理会生成一个私钥,存储在 tmpfs emptyDir 中,该私钥留在内存中并且永远不会离开 pod
。代理连接到控制平面的 identity
组件,验证与信任锚的 identity
连接,并发出证书签名请求 (CSR)。CSR
包含一个初始证书,其身份设置为 pod
的 Kubernetes ServiceAccount,以及实际的 service account token
,以便该 identity
可以验证 CSR
是否有效。验证后,签名的信任包将返回给代理,代理可以将其用作 client 和 server 证书。这些证书的范围为 24
小时,并使用相同的机制动态刷新。
最后,当代理从其 pod
内的应用程序容器接收到出站连接时,它会使用 Linkerd
控制平面查找该目的地。如果它在 Kubernetes
集群中,控制平面会向代理提供目的地的端点地址,以及包括 identity
名称在内的元数据。当代理连接到目标时,它会发起 TLS
握手并验证目标代理的证书是否由信任锚签名并包含预期 identity。
注意事项和未来工作
-
除非配置了授权策略,否则
Linkerd
不强制mTLS
。 -
理想情况下,
Linkerd
使用的ServiceAccount token
不会与该token
的其他潜在用途共享。在未来的Kubernetes
版本中,Kubernetes
将支持受众/时间限制(audience/time-bound)
的ServiceAccount token
,Linkerd
将使用这些token
。