第 9 章:确保微服务的通信安全

本文系统梳理了 Istio 在微服务安全领域的核心能力,涵盖服务间与终端用户的认证、授权、自动 mTLS、SPIFFE 身份、授权策略与外部授权集成等关键实践,帮助读者构建安全、可控的云原生服务网格。

应用安全需求与微服务挑战

应用安全的核心目标是保护数据不被未授权访问或篡改。微服务架构下,服务间通信频繁,传统基于静态 IP 的信任模型已不适用。Istio 通过自动化的身份认证、加密和访问控制,解决了多云、动态环境下的安全难题。

图 1: 单体与微服务安全对比
图 1: 单体与微服务安全对比
图 2: 多云动态环境下的微服务
图 2: 多云动态环境下的微服务

SPIFFE 身份与 Istio 证书

Istio 采用 SPIFFE 标准为每个工作负载分配唯一身份(spiffe://trust-domain/ns/namespace/sa/serviceaccount),通过自动签发和轮换 X.509 证书,实现服务间的强身份认证和加密通信。

Istio 安全资源与认证机制

Istio 主要通过以下 CRD 实现安全能力:

  • PeerAuthentication:配置服务间(mTLS)认证策略
  • RequestAuthentication:配置终端用户(JWT)认证
  • AuthorizationPolicy:基于身份和属性的细粒度访问控制
图 3: Istio 安全资源关系
图 3: Istio 安全资源关系

自动 mTLS 与服务间加密

Istio 默认为注入 Sidecar 的服务自动启用双向 TLS(mTLS),实现流量加密和身份验证。通过 PeerAuthentication 可灵活配置全局、命名空间或工作负载级别的认证模式(STRICT、PERMISSIVE、DISABLE)。

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: istio-system
spec:
  mtls:
    mode: STRICT
  • STRICT:仅允许加密流量
  • PERMISSIVE:同时接受明文和加密流量,便于平滑迁移

验证流量加密与身份

可通过 tcpdump 验证流量是否加密,通过 openssl 检查证书中的 SPIFFE ID 与 ServiceAccount 绑定:

kubectl -n istioinaction exec deploy/webapp -c istio-proxy -- openssl s_client -showcerts -connect catalog.istioinaction.svc.cluster.local:80 -CAfile /var/run/secrets/istio/root-cert.pem | openssl x509 -text -noout

证书中应包含类似 URI:spiffe://cluster.local/ns/istioinaction/sa/catalog 的身份信息。

授权策略与访问控制

Istio 的 AuthorizationPolicy 支持基于身份、命名空间、IP、请求方法、路径等多维度的访问控制。可实现网格级、命名空间级、工作负载级的精细授权。

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: allow-catalog-requests-in-web-app
  namespace: istioinaction
spec:
  selector:
    matchLabels:
      app: webapp
  action: ALLOW
  rules:
    - to:
        - operation:
            paths: ["/api/catalog*"]
  • ALLOW 策略需明确匹配,未匹配流量默认拒绝
  • 可通过 DENY 策略实现全局拒绝,提升安全基线

终端用户认证与 JWT 支持

Istio 支持通过 RequestAuthentication 验证 JWT,实现终端用户认证。结合 AuthorizationPolicy,可基于 JWT claims 实现细粒度授权。

apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
  name: jwt-token-request-authn
  namespace: istio-system
spec:
  selector:
    matchLabels:
      app: istio-ingressgateway
  jwtRules:
    - issuer: "[email protected]"
      jwks: |-
        { "keys": [ ... ] }
  • 支持多种 JWT 签发方与公钥(JWKS)配置
  • 可通过 AuthorizationPolicy 控制不同用户组的访问权限

外部授权(ExtAuthz)集成

Istio 支持通过 CUSTOM 策略集成外部授权服务(如 OPA、Gloo、自定义 HTTP 服务),实现更复杂的访问控制逻辑。

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: ext-authz
  namespace: istioinaction
spec:
  selector:
    matchLabels:
      app: webapp
  action: CUSTOM
  provider:
    name: sample-ext-authz-http
  rules:
    - to:
        - operation:
            paths: ["/"]

需在 meshConfig 中配置 extensionProviders,指定外部服务地址和端口。

常见安全配置与调试建议

  • 推荐逐步推进 mTLS,先 PERMISSIVE 后 STRICT,确保平滑迁移
  • 授权策略建议“默认拒绝,显式允许”,减少误授权风险
  • 使用 tcpdump、openssl、istioctl 等工具验证流量加密与身份
  • 外部授权需关注性能影响,建议与内置 RBAC 配合使用

总结

  • Istio 通过自动 mTLS、SPIFFE 身份、JWT 支持和细粒度授权,显著提升微服务安全性
  • 灵活的安全策略适应多云、动态环境下的服务治理需求
  • 推荐结合实际场景,合理配置认证与授权策略,持续监控与验证安全效果

参考文献

  1. Istio 官方文档 - istio.io
  2. SPIFFE 标准 - spiffe.io
  3. Open Policy Agent - openpolicyagent.org
  4. Envoy ExtAuthz - envoyproxy.io
  5. JWT 标准 - jwt.io

文章导航

独立页面

这是书籍中的独立页面。

书籍首页

评论区