在 Istio 中如何关闭 mTLS 双端加密以避免双重 TLS?
解读
国内生产环境常见“双重 TLS”场景:
- CouchDB 自身已启用 TLS 1.2/1.3 端口 6984;
- Istio 默认 STRICT 模式 mTLS 会在 Sidecar 之间再建一层 TLS。
结果:客户端 → Envoy(TLS)→ Envoy(TLS)→ CouchDB,握手两次,CPU 翻倍、延迟增加,并可能因证书链不一致导致 “x509: certificate signed by unknown authority”。
面试官想确认你能否在 不破坏零信任架构 的前提下,把 Istio 层的 mTLS 精准关闭,仅保留 CouchDB 的自有 TLS,实现“单 TLS”链路。
知识点
- Istio 身份认证策略:
PeerAuthentication控制 Sidecar 到 Sidecar 的 mTLS;DestinationRule的trafficPolicy.tls.mode控制 客户端 Sidecar 如何发起 TLS;- 两者需 同时匹配 才会触发 mTLS。
- 作用范围优先级:
命名空间级 > 服务级 > Pod 级;mode: DISABLE可显式关闭。 - CouchDB 侧要求:
必须保留httpsd配置,[ssl]段证书路径正确,且 客户端不再校验 Istio 证书,只校验 CouchDB 证书。 - 国内云厂商注意:
阿里云 ASM、腾讯云 TCM 均默认 全网格 STRICT,关闭需白名单审批,面试时要提到 “变更流程合规”。
答案
-
精准关闭 CouchDB 服务的 mTLS,只影响该服务,不破坏网格全局安全:
apiVersion: security.istio.io/v1beta1 kind: PeerAuthentication metadata: name: couchdb-disable-mtls namespace: couchdb-ns # 与 CouchDB 同命名空间 spec: selector: matchLabels: app: couchdb # 标签必须精准匹配 mtls: mode: DISABLE # 明确关闭 -
同步创建 DestinationRule,让客户端 Sidecar 直接发起 TCP,不再做 TLS 封装:
apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: couchdb-disable-mtls namespace: couchdb-ns spec: host: couchdb.couchdb-ns.svc.cluster.local trafficPolicy: tls: mode: DISABLE # 与 PeerAuthentication 保持一致 -
验证:
istioctl authn tls-check couchdb.couchdb-ns.svc.cluster.local # 期望输出:DISABLE kubectl exec -it <客户端pod> -c istio-proxy -- \ curl -k https://couchdb.couchdb-ns.svc.cluster.local:6984/_up # 返回{"status":"ok"}且耗时 <10 ms,即成功 -
若需 仅对指定端口 关闭,可在 PeerAuthentication 里加
portLevelMtls: {6984: {mode: DISABLE}},其余端口继续 STRICT,体现 精细化治理能力。
拓展思考
- 渐进式迁移:
国内金融客户常要求 “先观察再下线”。可先用PERMISSIVE模式收集 7 天指标,确认无 5xx 后再改DISABLE,面试时展示 “灰度闭环” 思维。 - 证书生命周期解耦:
关闭 Istio mTLS 后,CouchDB 证书仍可由 Vault + cert-manager 自动轮转,实现 “网格卸责,应用自治”。 - 多集群联邦:
在 跨地域主主复制 场景,若两地集群均使用 Istio,需在 出口网关 再关一次 mTLS,避免 “三重 TLS”。 - 零信任补偿:
关闭 mTLS 后,用 NetworkPolicy + EnvoyFilter 做 L4 白名单,并启用 CouchDB 的 _session 认证 + JWT 插件,向面试官说明 “安全左移” 并未降级。