如何在 Istio 中同时启用 Mutual TLS 和 gRPC TLS,以便 Istio 可以收集指标,但 gRPC 认为连接是“安全的”

And*_*den 7 ssl grpc istio

这是一个“原则上”的问题,因为我试图了解 mTLS 在 Istio 中的实现方式,以及它如何与支持 mTLS 的服务(例如 gRPC)一起工作。

考虑到我有一个启用了“mtls 无处不在”的集群。这有效地在 envoy 代理之间通过 mTLS 管道建立了所有 TCP 连接的隧道,并且 envoy 和服务之间的连接是纯文本的。

但是,有些服务至少需要 TLS 连接才能使用 Envoy 代理;理想情况下是 mTLS 连接。其中之一是 gRPC,它需要 TLS 才能使用其核心 JWT 身份验证:

https://grpc.io/docs/guides/auth.html#authenticate-with-google

所以,问题变成了:

  • 是否可以让特使代理“窥探”在原始服务本身进行 mTLS 加密的连接?理想情况下使用 Citadel 提供的证书和密钥
  • 否则解决方案是创建一种新的身份验证方法,忽略它是在明文上的事实,因为它将被 Istio 使用 mTLS 吗?

<3 干杯

Fil*_*lov 0

Istio 试图解决的众多问题之一是将证书管理从应用程序层卸载到 sidecar 容器。我个人不知道如何使用 Citadel 来管理应用程序容器中的证书,至于“窥探”,您可能会尝试使用envoy 过滤器来烹饪一些东西,但即使您可以,这也将是很容易破坏的自定义解决方案。不知何故,我认为这行不通,或者根本无法做到。您的第一个问题/方法似乎走错了路。

不幸的是,我无法直接回答您的第二个问题,但我曾短暂参与过一个项目,该项目使用带有JWT 的gRPC 微服务,该服务已由 Istio 验证,并且我们肯定不会处理容器中的证书。因此,如果没有具体的实施细节,我会说选项二是可行的方法。

值得一提的是,这是所使用的身份验证策略的示例。

apiVersion: "authentication.istio.io/v1alpha1"
kind: "Policy"
metadata:
  name: {{ template "service.name" . }}
  labels:
    app: {{ template "service.name" . }}
    chart: {{ template "service.chart" . }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
spec:
  targets:
  - name: {{ template "service.name" . }}
  origins:
  - jwt:
      issuer: https://auth.company.com/
      jwksUri: https://auth-service.auth.svc.cluster.local:8008/keys/public
      audiences:
      - dGQVkdEluc3RhrmNps:CompanyApp:CompanyOrg
  principalBinding: USE_ORIGIN
Run Code Online (Sandbox Code Playgroud)