Istio Ambient网格跨独立非联邦Mesh的JWT注入及mTLS实现问询
跨独立非联邦Istio Ambient 1.27.1网格通信解决方案
需求明确
Mesh A客户端服务向Mesh B服务发起HTTP请求时,需同时满足:
- 在Mesh A出口处,基于调用服务的SPIFFE身份注入JWT(优先JWT-SVID),必须在Ambient工作负载下实现,不由服务自身注入,且不能使用通用出口JWT或切换至sidecar模式。
- Mesh A出口与Mesh B入口间通过mTLS通信,需避免配置egress waypoint发起mTLS时Istio默认采用L4监听器导致HTTP过滤器失效的问题,确保JWT注入与mTLS同时生效。
资深从业者经验方案
核心思路
通过强制egress waypoint启用HTTP监听器,结合自定义Wasm插件实现SPIFFE身份驱动的JWT-SVID注入,同时配置端到端mTLS,规避L4监听器对HTTP过滤器的限制。
步骤1:配置Mesh A Egress Waypoint启用HTTP监听器并开启mTLS
通过ServiceEntry指定目标服务的HTTP协议,强制egress waypoint使用HTTP过滤器链,再通过DestinationRule配置mTLS发起规则:
apiVersion: networking.istio.io/v1beta1 kind: ServiceEntry metadata: name: mesh-b-service namespace: istio-system spec: hosts: - "mesh-b-service.example.com" ports: - number: 80 name: http protocol: HTTP resolution: DNS --- apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: mesh-b-mtls namespace: istio-system spec: host: mesh-b-service.example.com trafficPolicy: tls: mode: ISTIO_MUTUAL credentialName: mesh-a-egress-credential # 关联Mesh A的SPIFFE证书密钥对
步骤2:基于SPIFFE身份的JWT-SVID注入
使用Istio WasmPlugin在egress waypoint的HTTP过滤器链中添加自定义逻辑,提取调用服务的SPIFFE身份并注入JWT-SVID:
apiVersion: extensions.istio.io/v1alpha1 kind: WasmPlugin metadata: name: spiffe-jwt-injector namespace: istio-system spec: selector: matchLabels: istio: egressway url: oci://your-registry/spiffe-jwt-injector:v1.0 phase: AUTHN pluginConfig: spiffeTrustDomain: "mesh-a.example.com" jwtHeader: "Authorization" jwtPrefix: "Bearer "
该Wasm插件需实现核心逻辑:
- 从Envoy请求上下文提取调用服务的SPIFFE身份(格式为
spiffe://<trust-domain>/ns/<namespace>/sa/<service-account>) - 调用SPIFFE Workload API获取对应身份的JWT-SVID
- 将JWT-SVID注入指定HTTP请求头
步骤3:Mesh B入口的mTLS与JWT验证配置
在Mesh B的ingress waypoint配置严格mTLS接收规则,并验证Mesh A注入的JWT-SVID:
apiVersion: security.istio.io/v1beta1 kind: PeerAuthentication metadata: name: mesh-b-ingress namespace: istio-system spec: mtls: mode: STRICT --- apiVersion: security.istio.io/v1beta1 kind: RequestAuthentication metadata: name: spiffe-jwt-validator namespace: istio-system spec: selector: matchLabels: istio: ingressway jwtRules: - issuer: "spiffe://mesh-a.example.com" jwksUri: "https://mesh-a-spiffe-api.example.com/.well-known/jwks.json" fromHeaders: - name: Authorization prefix: "Bearer "
相关参考内容翻译
- Istio官方Issue #56379:讨论了Ambient模式下egress waypoint配置mTLS时,默认使用L4监听器导致HTTP过滤器无法生效的问题,社区给出的临时方案是通过ServiceEntry指定HTTP协议强制启用HTTP监听器。
- OPA-Envoy插件Issue #710:讨论了在Envoy过滤器链中结合mTLS与JWT注入的场景,提到利用Wasm插件在HTTP阶段处理身份提取与JWT生成,避免L4层的限制。
内容的提问来源于stack exchange,提问作者codemonkey
相关产品推荐
相关产品推荐

