在 Istio 中如何关闭 mTLS 双端加密以避免双重 TLS?

解读

国内生产环境常见“双重 TLS”场景:

  1. CouchDB 自身已启用 TLS 1.2/1.3 端口 6984;
  2. Istio 默认 STRICT 模式 mTLS 会在 Sidecar 之间再建一层 TLS。
    结果:客户端 → Envoy(TLS)→ Envoy(TLS)→ CouchDB,握手两次,CPU 翻倍、延迟增加,并可能因证书链不一致导致 “x509: certificate signed by unknown authority”
    面试官想确认你能否在 不破坏零信任架构 的前提下,把 Istio 层的 mTLS 精准关闭,仅保留 CouchDB 的自有 TLS,实现“单 TLS”链路。

知识点

  1. Istio 身份认证策略
    • PeerAuthentication 控制 Sidecar 到 Sidecar 的 mTLS;
    • DestinationRuletrafficPolicy.tls.mode 控制 客户端 Sidecar 如何发起 TLS
    • 两者需 同时匹配 才会触发 mTLS。
  2. 作用范围优先级
    命名空间级 > 服务级 > Pod 级;mode: DISABLE 可显式关闭。
  3. CouchDB 侧要求
    必须保留 httpsd 配置,[ssl] 段证书路径正确,且 客户端不再校验 Istio 证书,只校验 CouchDB 证书。
  4. 国内云厂商注意
    阿里云 ASM、腾讯云 TCM 均默认 全网格 STRICT,关闭需白名单审批,面试时要提到 “变更流程合规”

答案

  1. 精准关闭 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                  # 明确关闭
    
  2. 同步创建 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 保持一致
    
  3. 验证:

    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,即成功
    
  4. 若需 仅对指定端口 关闭,可在 PeerAuthentication 里加 portLevelMtls: {6984: {mode: DISABLE}},其余端口继续 STRICT,体现 精细化治理能力

拓展思考

  1. 渐进式迁移
    国内金融客户常要求 “先观察再下线”。可先用 PERMISSIVE 模式收集 7 天指标,确认无 5xx 后再改 DISABLE,面试时展示 “灰度闭环” 思维。
  2. 证书生命周期解耦
    关闭 Istio mTLS 后,CouchDB 证书仍可由 Vault + cert-manager 自动轮转,实现 “网格卸责,应用自治”
  3. 多集群联邦
    跨地域主主复制 场景,若两地集群均使用 Istio,需在 出口网关 再关一次 mTLS,避免 “三重 TLS”
  4. 零信任补偿
    关闭 mTLS 后,用 NetworkPolicy + EnvoyFilter 做 L4 白名单,并启用 CouchDB 的 _session 认证 + JWT 插件,向面试官说明 “安全左移” 并未降级。