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
六、安全最佳实践
- 默认启用 STRICT mTLS
- 最小权限原则:只开放必要的访问
- 定期轮换证书
- 启用审计日志
- 监控异常访问
- 使用 SPIFFE 身份
总结
Service Mesh 提供了完整的安全架构,通过 mTLS、身份认证和细粒度授权策略,可以实现零信任安全模型,保障微服务通信安全。
Service Mesh 系列文章 5/10
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。







