Service Mesh 安全架构详解 - mTLS、认证与授权

前言

安全是 Service Mesh 的核心价值之一。本文详细介绍 Service Mesh 的安全架构,包括 mTLS、身份认证、访问控制等关键安全特性。

一、Service Mesh 安全架构

1.1 安全分层模型

Service Mesh 安全架构:

┌─────────────────────────────────────┐
│         应用层安全                    │
│  - JWT 认证                          │
│  - OAuth2 授权                       │
│  - API 网关                          │
└─────────────────────────────────────┘
              │
┌─────────────────────────────────────┐
│       Service Mesh 安全层            │
│  - mTLS 加密                        │
│  - 服务身份认证                      │
│  - 细粒度授权策略                    │
└─────────────────────────────────────┘
              │
┌─────────────────────────────────────┐
│         网络安全                      │
│  - 网络策略                          │
│  - 防火墙规则                        │
└─────────────────────────────────────┘

二、mTLS(双向 TLS)

2.1 mTLS 工作原理

mTLS 握手流程:

客户端                    服务端
  │                        │
  │── ClientHello ────────>│
  │                        │
  │<── ServerHello ────────│
  │<── Server Cert ────────│
  │                        │
  │── Client Cert ────────>│
  │                        │
  │    证书验证             │
  │                        │
  │<── 加密通道建立 ────────│
  │                        │
  │==== 加密通信 =========>│

2.2 Istio 配置 mTLS

# 网格级别启用 STRICT mTLS
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: istio-system
spec:
  mtls:
    mode: STRICT

# 命名空间级别启用
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: production
spec:
  mtls:
    mode: STRICT

# 服务级别启用
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: api-mtls
  namespace: production
spec:
  selector:
    matchLabels:
      app: api
  mtls:
    mode: STRICT

# 允许明文(迁移期间)
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: api-permissive
spec:
  selector:
    matchLabels:
      app: legacy-api
  mtls:
    mode: PERMISSIVE

2.3 验证 mTLS

# 检查 mTLS 状态
istioctl authn tls-check 

# 查看证书
kubectl exec  -c istio-proxy -- pilot-agent request GET certs

# 验证加密连接
istioctl proxy-config listener  --port 15001

三、身份认证

3.1 服务身份

# 配置 JWT 认证
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
  name: jwt-auth
  namespace: default
spec:
  selector:
    matchLabels:
      app: api
  jwtRules:
  - issuer: "https://auth.example.com"
    jwksUri: "https://auth.example.com/.well-known/jwks.json"
    forwardOriginalToken: true

3.2 SPIFFE 身份

SPIFFE ID 格式:
spiffe:///ns//sa/

示例:
spiffe://cluster.local/ns/default/sa/api-service

四、访问控制

4.1 授权策略

# 允许特定服务访问
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: allow-api-access
  namespace: default
spec:
  selector:
    matchLabels:
      app: database
  action: ALLOW
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/default/sa/api-service"]
    to:
    - operation:
        methods: ["GET", "POST"]
        paths: ["/api/*"]

# 拒绝特定 IP
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: deny-external
spec:
  action: DENY
  rules:
  - from:
    - source:
        notIpBlocks: ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"]

# 基于角色的访问控制
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: rbac-policy
spec:
  selector:
    matchLabels:
      app: admin-service
  action: ALLOW
  rules:
  - from:
    - source:
        requestPrincipals: ["admin@example.com/*"]
    to:
    - operation:
        methods: ["*"]

4.2 审计日志

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: audit-policy
spec:
  action: CUSTOM
  rules:
  - to:
    - operation:
        methods: ["POST", "DELETE"]
  action: LOG

五、证书管理

5.1 自动证书轮换

# 查看证书有效期
kubectl exec  -c istio-proxy -- pilot-agent request GET certs | grep -A2 "Certificate chain"

# 证书自动轮换(Istio 默认 24 小时轮换)
# 可通过以下配置调整
istioctl install \
  --set values.pilot.caName=None \
  --set values.global.caAddress=ca.example.com:443

六、安全最佳实践

  1. 默认启用 STRICT mTLS
  2. 最小权限原则:只开放必要的访问
  3. 定期轮换证书
  4. 启用审计日志
  5. 监控异常访问
  6. 使用 SPIFFE 身份

总结

Service Mesh 提供了完整的安全架构,通过 mTLS、身份认证和细粒度授权策略,可以实现零信任安全模型,保障微服务通信安全。


Service Mesh 系列文章 5/10

发表回复

后才能评论