如何在 Istio 中同时启用 Mutual TLS 和 gRPC TLS,以便 Istio 可以收集指标,但 gRPC 认为连接 "Safe"
How to enable both Mutual TLS and gRPC TLS in Istio such that Istio can collect metrics, but gRPC considers the connection "Safe"
这是一个 "in principle" 问题,因为我试图了解 Istio 中 mTLS 的实现方式,以及它如何与其他支持 mTLS 的服务(例如 gRPC)一起工作。
假设我有一个启用了 "mtls everywhere" 的集群。这有效地通过 envoy 代理之间的 mTLS 管道建立了所有 TCP 连接,并且 envoy 和服务之间的连接是纯文本的。
但是,有些服务至少需要 TLS 连接到特使代理;理想的 mTLS 连接。其中之一是 gRPC,它需要 TLS 才能使用其核心 JWT 身份验证:
https://grpc.io/docs/guides/auth.html#authenticate-with-google
那么,问题就变成了:
- 是否可以在原始服务本身以其他方式对 mTLS 加密的连接上设置特使代理 "snoop"?理想情况下使用 Citadel
提供的证书和密钥
- 创建一个新的身份验证方法的解决方案是否忽略了它是明文的事实,因为它将由 Istio 进行 mTLS?
<3 干杯
Istio 试图解决的众多问题之一是将证书管理从应用层卸载到 sidecar 容器。我个人不知道有什么方法可以使用 Citadel 来管理应用程序容器中的证书,至于 'snooping' 你可以尝试用 envoy filter 做一些事情,但即使你可以,这也是自定义的很容易破裂的解决方案。不知何故,我认为这行不通,或者根本无法做到。您的第一个 question/approach 似乎走错了路。
不幸的是,我不能直接回答你的第二个问题,但我曾短暂参与过一个项目,该项目使用 gRPC 微服务,JWT 已通过 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
这是一个 "in principle" 问题,因为我试图了解 Istio 中 mTLS 的实现方式,以及它如何与其他支持 mTLS 的服务(例如 gRPC)一起工作。
假设我有一个启用了 "mtls everywhere" 的集群。这有效地通过 envoy 代理之间的 mTLS 管道建立了所有 TCP 连接,并且 envoy 和服务之间的连接是纯文本的。
但是,有些服务至少需要 TLS 连接到特使代理;理想的 mTLS 连接。其中之一是 gRPC,它需要 TLS 才能使用其核心 JWT 身份验证:
https://grpc.io/docs/guides/auth.html#authenticate-with-google
那么,问题就变成了:
- 是否可以在原始服务本身以其他方式对 mTLS 加密的连接上设置特使代理 "snoop"?理想情况下使用 Citadel 提供的证书和密钥
- 创建一个新的身份验证方法的解决方案是否忽略了它是明文的事实,因为它将由 Istio 进行 mTLS?
<3 干杯
Istio 试图解决的众多问题之一是将证书管理从应用层卸载到 sidecar 容器。我个人不知道有什么方法可以使用 Citadel 来管理应用程序容器中的证书,至于 'snooping' 你可以尝试用 envoy filter 做一些事情,但即使你可以,这也是自定义的很容易破裂的解决方案。不知何故,我认为这行不通,或者根本无法做到。您的第一个 question/approach 似乎走错了路。
不幸的是,我不能直接回答你的第二个问题,但我曾短暂参与过一个项目,该项目使用 gRPC 微服务,JWT 已通过 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