mTLS

Istio 支持双向 TLS(mTLS),首先让我们来了解下什么是 mTLS。

什么是 mTLS?

在一个典型的 Kubernetes 集群中,加密的流量进入集群,经过一个负载均衡器终止 TLS 连接,从而产生解密的流量。然后,解密的流量被发送到集群内的相关服务。由于集群内的流量通常被认为是安全的,对于许多用例,这是一个可以接受的方法。

但对于某些用例,如处理个人身份信息(PII),可能需要额外的保护。在这些情况下,我们希望确保 ** 所有的 ** 网络流量,甚至同一集群内的流量,都是加密的。这为防止窥探(读取传输中的数据)和欺骗(伪造数据来源)攻击提供了额外保障。这可以帮助减轻系统中其他缺陷的影响。

如果手动实现这个完整的数据传输加密系统的话,需要对集群中的每个应用程序进行大规模改造。你需要告诉所有的应用程序终止自己的 TLS 连接,为所有的应用程序颁发证书,并为所有的应用程序添加一个新的证书颁发机构。

Istio 的 mTLS 在应用程序之外处理这个问题。它安装了一个 sidecar,通过 localhost 连接与你的应用程序进行通信,绕过了暴露的网络流量。它使用复杂的端口转发规则(通过 IPTables)来重定向进出 Pod 的流量,使其通过 sidecar。代理中的 Envoy sidecar 处理所有获取 TLS 证书、刷新密钥、终止等逻辑。

Istio 的这种工作方式虽然可以让你避免修改应用程序,但是当它可以工作时,能够工作得很好。而当它失败时,它可能是灾难性的,而且还难以调试。Istio 的 mTLS 值得一提的三个具体要点。

  • 在严格模式(Strict Mode)下,也就是我们要做的,数据平面 Envoy 会拒绝任何传入的明文通信。

  • 通常情况下,如果你对一个不存在的主机进行 HTTP 连接,你会得到一个失败的连接错误。你肯定 不会 得到一个 HTTP 响应。然而,在 Istio 中,你将 总是 成功地发出 HTTP 连接,因为你的连接是给 Envoy 本身的。如果 Envoy 代理不能建立连接,它将像大多数代理一样,返回一个带有 503 错误信息的 HTTP 响应体。

  • Envoy 代理对一些协议有特殊处理。最重要的是,如果你做一个纯文本的 HTTP 外发连接,Envoy 代理有复杂的能力来解析外发请求,了解各种头文件的细节,并做智能路由。

参考

最后更新于