了解 TLS 配置

Istio 最重要的功能之一是能够锁定和保护进出网格以及网格内的网络流量。但是,配置 TLS 设置可能会很混乱,并且是常见的错误配置来源。本文档试图解释在 Istio 中发送请求时涉及的各种连接,以及如何配置其关联的 TLS 设置。有关一些最常见的 TLS 配置问题的摘要,请参阅 TLS 配置错误

Sidecar

Sidecar 流量具有各种关联连接。让我们逐一分解它们。

Sidecar proxy network connections
Sidecar 代理网络连接
  1. 外部入站流量 这是来自外部客户端并被 Sidecar 捕获的流量。如果客户端在网格内,此流量可能会使用 Istio 双向 TLS 加密。默认情况下,Sidecar 将配置为接受 mTLS 和非 mTLS 流量,称为 PERMISSIVE 模式。模式还可以配置为 STRICT,其中流量必须为 mTLS,或者 DISABLE,其中流量必须为明文。mTLS 模式使用 PeerAuthentication 资源 进行配置。

  2. 本地入站流量 这是来自边车的流量,流向您的应用程序服务。此流量将始终按原样转发。请注意,这并不意味着它始终是明文;边车可能会通过 TLS 连接。它只是意味着边车永远不会发起新的 TLS 连接。

  3. 本地出站流量 这是从您的应用程序服务发出的被边车拦截的流量。您的应用程序可能会发送明文或 TLS 流量。如果 自动协议选择 已启用,Istio 将自动检测协议。否则,您应该在目标服务中使用端口名称来 手动指定协议.

  4. 外部出站流量 这是离开边车到某个外部目的地的流量。流量可以按原样转发,也可以启动 TLS 连接(mTLS 或标准 TLS)。这由 DestinationRule 资源trafficPolicy 中的 TLS 模式设置控制。模式设置为 DISABLE 将发送明文,而 SIMPLEMUTUALISTIO_MUTUAL 将发起 TLS 连接。

关键要点是

  • PeerAuthentication 用于配置边车将接受的 mTLS 流量类型。
  • DestinationRule 用于配置边车将发送的 TLS 流量类型。
  • 端口名称或自动协议选择决定边车将解析流量的协议。

自动 mTLS

如上所述,DestinationRule 控制传出流量是否使用 mTLS。但是,为每个工作负载配置此选项可能很繁琐。通常,您希望 Istio 在任何可能的情况下始终使用 mTLS,并且仅向不属于网格的工作负载(即没有边车的工作负载)发送明文。

Istio 通过名为“自动 mTLS”的功能简化了此过程。自动 mTLS 通过执行以下操作来实现这一点。如果在 DestinationRule 中未明确配置 TLS 设置,边车将自动确定是否应该发送 Istio 双向 TLS。这意味着,无需任何配置,所有网格间流量都将使用 mTLS 加密。

网关

任何给定对网关的请求都将有两个连接。

Gateway network connections
网关网络连接
  1. 入站请求,由某些客户端(如 curl 或 Web 浏览器)发起。这通常被称为“下游”连接。

  2. 出站请求,由网关发起到某个后端。这通常被称为“上游”连接。

这两个连接都有独立的 TLS 配置。

请注意,入口和出口网关的配置是相同的。istio-ingress-gatewayistio-egress-gateway 只是两个专门的网关部署。区别在于入口网关的客户端运行在网格之外,而出口网关的目的地则在网格之外。

入站

作为入站请求的一部分,网关必须对流量进行解码,以便应用路由规则。这是根据 Gateway 资源 中的服务器配置完成的。例如,如果入站连接是明文 HTTP,则端口协议配置为 HTTP

apiVersion: networking.istio.io/v1
kind: Gateway
...
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP

类似地,对于原始 TCP 流量,协议将设置为 TCP

对于 TLS 连接,还有更多选项

  1. 封装了什么协议?如果连接是 HTTPS,则服务器协议应配置为 HTTPS。否则,对于使用 TLS 封装的原始 TCP 连接,协议应设置为 TLS

  2. TLS 连接是否被终止或通过?对于直通流量,将 TLS 模式字段配置为 PASSTHROUGH

    apiVersion: networking.istio.io/v1
    kind: Gateway
    ...
      servers:
      - port:
          number: 443
          name: https
          protocol: HTTPS
        tls:
          mode: PASSTHROUGH
    

    在此模式下,Istio 将根据 SNI 信息进行路由,并将连接按原样转发到目标。

  3. 是否应该使用双向 TLS?双向 TLS 可以通过 TLS 模式 MUTUAL 进行配置。当配置此选项时,将请求客户端证书并根据配置的 caCertificatescredentialName 对其进行验证。

    apiVersion: networking.istio.io/v1
    kind: Gateway
    ...
      servers:
      - port:
          number: 443
          name: https
          protocol: HTTPS
        tls:
          mode: MUTUAL
          caCertificates: ...
    

出站

入站侧配置了要预期什么样的流量以及如何处理它,而出站配置则控制了网关将发送什么样的流量。这由 DestinationRule 中的 TLS 设置配置,就像来自 边车 的外部出站流量一样,或者默认情况下由 自动 mTLS 配置。

唯一的区别是,在配置此选项时,您应该注意考虑 Gateway 设置。例如,如果 Gateway 配置为使用 TLS PASSTHROUGH,而 DestinationRule 配置了 TLS 发起,则最终会导致 双重加密。这可以工作,但通常不是预期的行为。

绑定到网关的 VirtualService 也需要谨慎,以 确保它与 Gateway 定义一致

这些信息是否有用?
您有任何改进建议吗?

感谢您的反馈!