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 代理有复杂的能力来解析外发请求,了解各种头文件的细节,并做智能路由。
参考
最后更新于