Skip to content

安全、Ambient 模式与对比

基于 Istio 1.22(Ambient GA)· 核于 2026-08

速查

  • 零信任安全模型:Istio 默认假设「网络不可信」,用 mTLS + 授权策略保护所有服务间通信。三大安全能力:①身份(mTLS 双向证书认证,每服务一个 SPIFFE 身份);②认证(RequestAuthentication 校验客户端 JWT);③授权(AuthorizationPolicy 控制谁能调谁)。
  • mTLS 双向认证:Sidecar 之间自动建立 mTLS——双方都验对方证书(由 istiod CA 签发,SPIFFE 格式身份如 spiffe://cluster.local/ns/default/sa/order-sa),通信全程加密。防窃听(加密)与伪造(双向验证书)。默认 PERMISSIVE 模式(接受加密也接受明文,便于迁移),生产建议 STRICT(只接受加密)。
  • PeerAuthentication:控制 mTLS 模式——PERMISSIVE(过渡,加密明文都接受)/ STRICT(只加密)。按命名空间或工作负载粒度配置。
  • AuthorizationPolicy:授权(谁能调谁)。声明式 ALLOW/DENY 规则,基于 principals(调用方身份)、namespaces、source IP、方法、路径等匹配。默认全部拒绝,需显式 ALLOW。
  • RequestAuthentication:校验客户端请求的 JWT(JSON Web Token),验证签名与受众。常用于外部用户携带 JWT 访问 API。
  • Ambient 模式 GA(1.22+):去 Sidecar 的新架构——ztunnel(节点级 DaemonSet,Rust,L4 mTLS)+ waypoint(按需 Envoy,L7 流量管理)。分层按需:L4 加密人人有(ztunnel 轻量),L7 治理按需加(waypoint)。降低 Sidecar 模式的资源开销。
  • ztunnel:每节点一个,Rust 写的轻量 L4 代理,做 mTLS 加密与 L4 路由。替代每 Pod 一个 Envoy 做基础加密。
  • waypoint:按命名空间/服务按需部署的 Envoy(L7),需要 VirtualService 金丝雀/熔断等 L7 治理时才挂。不需要 L7 的服务只用 ztunnel。
  • Sidecar vs Ambient:Sidecar(每 Pod 一个全功能 Envoy,资源重但功能全,成熟)/ Ambient(节点级 ztunnel + 按需 waypoint,资源轻,1.22 GA,未来方向)。两者在 1.22+ 共存可逐命名空间迁移。
  • vs Linkerd:Istio(Envoy/C++,功能全重型,Ambient 降开销)/ Linkerd(自研 Rust 代理,轻量易用,功能少)。重度流量治理选 Istio,极简高性能选 Linkerd。

一、零信任与 mTLS

传统安全模型是「边界信任」——内网默认可信,只在边界(防火墙/网关)做防护。一旦攻击者突破边界(或内网有被 compromise 的服务),内网服务间通信可被窃听与伪造。零信任反其道:「永不信任,持续验证」——内网也不可信,所有通信都要认证与加密。Istio 用 mTLS 实现服务间零信任:

   服务 A 的 Sidecar                 服务 B 的 Sidecar
        │                                  │
        │  1. 双方都出示 istiod 签发的证书    │
        │  (身份 = SPIFFE ID,如            │
        │   spiffe://cluster.local/...       │
        │   /sa/order-sa)                   │
        │  2. 互相验证对方证书(双向)        │
        │  3. 协商对称密钥,建立加密通道       │
        └─────────── mTLS 加密通信 ──────────┘
  • SPIFFE 身份:每个服务有唯一身份(SPIFFE ID,基于 ServiceAccount),格式 spiffe://<trust-domain>/ns/<namespace>/sa/<service-account>。证书由 istiod(CA)签发,周期性轮转(默认 24h)。
  • 双向认证:A、B 互相验证书(不只是客户端验服务端,服务端也验客户端),防中间人伪造。
  • 加密通信:证书协商出对称密钥,后续流量加密,防窃听。
  • PERMISSIVE vs STRICT:迁移期用 PERMISSIVE(加密明文都接受,避免一刀切切断旧服务),全迁移后切 STRICT(只加密,拒绝明文)。生产强烈建议 STRICT。

二、PeerAuthentication:mTLS 模式

yaml
apiVersion: security.istio.io/v1
kind: PeerAuthentication
metadata:
  name: default
  namespace: production     # 整个 production 命名空间
spec:
  mtls:
    mode: STRICT            # 只接受 mTLS 加密流量
  • PERMISSIVE(默认):加密与明文都接受。用于迁移——旧服务(未注入 Sidecar)仍能访问,新服务享受加密。
  • STRICT:只接受 mTLS 加密,拒绝明文。生产目标态,强制全加密。
  • 粒度:可命名空间级(metadata.namespace)或工作负载级(selector.matchLabels 选 Pod)。

三、AuthorizationPolicy:授权

yaml
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: allow-web-to-order
  namespace: production
spec:
  selector:
    matchLabels:
      app: order-service           # 作用于 order-service
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/prod/sa/web-sa"]   # 只允许 web 调
      to:
        - operation:
            methods: ["GET", "POST"]
            paths: ["/order/*"]      # 且只能调 /order/* 的 GET/POST
  • action:ALLOW(允许匹配的,其他拒绝)/ DENY(拒绝匹配的)/ AUDIT(记录日志)/ CUSTOM(自定义)。
  • 默认拒绝:命名空间内若定义了任何 ALLOW 策略,则未显式 ALLOW 的请求都拒绝(白名单模式,最小权限)。
  • 匹配维度:from(来源——principals 身份、namespaces、ipBlocks)、to(操作——methods、paths、ports)、when(条件——key=value,如 request.auth.claims[role] == admin)。
  • AuthorizationPolicy vs 网络 ACL:基于服务身份(SPIFFE)而非 IP,更稳定(Pod IP 变化不影响),更贴合微服务语义。

四、RequestAuthentication:JWT 校验

yaml
apiVersion: security.istio.io/v1
kind: RequestAuthentication
metadata:
  name: jwt-validator
  namespace: production
spec:
  selector:
    matchLabels:
      app: api-gateway
  jwtRules:
    - issuer: "https://auth.example.com"
      jwksUri: "https://auth.example.com/.well-known/jwks.json"
      audiences: ["api.example.com"]   # 校验 audience
  • Sidecar 拦截请求,校验 Authorization header 的 JWT 签名(用 jwksUri 的公钥)与 issuer/audience。
  • 无效 JWT 直接拒绝(401),有效 JWT 的 claims 可在 AuthorizationPolicy 的 when 条件中引用(如 request.auth.claims[role])做细粒度授权。

五、Ambient 模式 GA:去 Sidecar 的新架构

Sidecar 模式的痛点是「每 Pod 一个 Envoy 的资源开销」——集群数千 Pod 就要跑数千 Envoy,内存 CPU 可观。Ambient 模式(1.22 GA)用两层替代:

   ┌─── 节点 1 ───┐         ┌─── 节点 2 ───┐
   │ Pod A 业务   │         │ Pod B 业务   │
   │ Pod C 业务   │         │ Pod D 业务   │
   │              │         │              │
   │ ztunnel      │         │ ztunnel      │  ← 每节点一个 DaemonSet
   │ (L4 mTLS)  │ ──────→ │ (L4 mTLS)  │     Rust 轻量,做加密
   └──────────────┘         └──────────────┘

   需 L7 治理的服务(如 order 需金丝雀)按需挂 waypoint:
   ┌─── waypoint(Envoy,L7)───┐
   │ 处理 order 的 VirtualService │  ← 金丝雀/熔断等 L7 规则
   │ 路由/熔断等                  │
   └─────────────────────────────┘
  • ztunnel:每个节点一个(DaemonSet),Rust 写的轻量 L4 代理。职责:mTLS 加密 + 基本 L4 路由。所有节点流量默认经 ztunnel 加密,享受零信任但无 Sidecar 开销。这是 Ambient 的基础层,人人享有。
  • waypoint:按需部署的 Envoy(L7)。需要 L7 治理(VirtualService 金丝雀/AB/熔断/重试)的命名空间或服务才挂 waypoint,把 L7 规则下发给它。不需要 L7 的服务只用 ztunnel(最轻)。
  • 分层按需的价值:L4 加密是基础设施(ztunnel 共享,省资源),L7 治理是高级功能(按需 waypoint)。比「每 Pod 一个全功能 Envoy」省大量资源——尤其对只需 mTLS 不需 L7 治理的服务。
  • 迁移:Sidecar 与 Ambient 共存(1.22+),可逐命名空间迁移。Ambient 是 Istio 官方力推的未来方向。

六、Istio vs Linkerd

维度IstioLinkerd
出品方Google/IBM/Lyft(CNCF)Buoyant(CNCF)
数据面代理Envoy(C++,功能全)自研 Rust 代理(linkerd2-proxy,轻量)
功能全(流量/安全/观测/金丝雀/镜像)较少(基础流量/安全/观测)
复杂度高(CRD 多,学习陡)低(极简易用)
性能中(Envoy 开销)高(Rust 轻量)
新架构Ambient(ztunnel+waypoint,去 Sidecar)多种安装模式(轻量)
生态CNCF 主流,功能与社区最强CNCF,轻量易用派
适用重度流量治理、大集群、需精细控制追求极简、性能、快速上手
  • Envoy vs Rust 代理:Istio 用 Envoy(C++,功能全但重),Linkerd 用自研 Rust 代理(轻量、内存安全、性能好但功能少)。这是两者最核心的技术差异。
  • 选型:需要重度流量治理(金丝雀/AB/镜像/复杂熔断)与大集群选 Istio;追求极简部署、高性能、快速上手的中小项目选 Linkerd。Istio 是事实主流(功能与生态占优)。

下一步

理解了安全与 Ambient 后,下一步看参考——CRD 速查、流量模型、安全模型、易错点与 istioctl 命令速查,作为速查手册。