服务网格Istio mTLS配置实战
一、mTLS概述
mTLS(Mutual TLS)是一种双向认证机制,服务之间相互验证身份,确保通信安全。
1.1 mTLS工作原理
┌─────────────────┐ ┌─────────────────┐
│ Service A │ │ Service B │
│ (客户端) │ │ (服务端) │
└────────┬────────┘ └────────┬────────┘
│ │
│ 1. ClientHello (支持的加密套件) │
│─────────────────────────────────────>│
│ │
│ 2. ServerHello + 服务端证书 │
│<─────────────────────────────────────│
│ │
│ 3. 客户端证书 + ClientKeyExchange │
│─────────────────────────────────────>│
│ │
│ 4. 服务端验证客户端证书 │
│ │
│ 5. 双方计算会话密钥 │
│ │
│ 6. 加密通信开始 │
│<─────────────────────────────────────>│
│ │
└───────────────────────────────────────┘
1.2 Istio mTLS架构
┌─────────────────────────────────────────────────────────────┐
│ Istio Control Plane │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Citadel │ │ Pilot │ │
│ │ (证书管理) │ │ (配置下发) │ │
│ └────────┬────────┘ └────────┬────────┘ │
└───────────┼─────────────────────┼─────────────────────────┘
│ │
▼ ▼
┌─────────────────────────────────────────────────────────────┐
│ Data Plane │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Envoy Proxy │────────────>│ Envoy Proxy │ │
│ │ (sidecar) │ mTLS通信 │ (sidecar) │ │
│ │ Service A │ │ Service B │ │
│ └─────────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────────┘
二、启用mTLS
2.1 全局启用mTLS
yaml
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: istio-system
spec:
mtls:
mode: STRICT
2.2 命名空间级别配置
yaml
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: my-namespace
spec:
mtls:
mode: PERMISSIVE
2.3 工作负载级别配置
yaml
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: my-service-policy
namespace: my-namespace
spec:
selector:
matchLabels:
app: my-service
mtls:
mode: STRICT
三、认证策略配置
3.1 目标规则配置
yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: my-service-dr
namespace: my-namespace
spec:
host: my-service.my-namespace.svc.cluster.local
trafficPolicy:
tls:
mode: ISTIO_MUTUAL
3.2 虚拟服务配置
yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-service-vs
namespace: my-namespace
spec:
hosts:
- my-service.my-namespace.svc.cluster.local
http:
- route:
- destination:
host: my-service.my-namespace.svc.cluster.local
subset: v1
3.3 完整示例
yaml
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: istio-system
spec:
mtls:
mode: STRICT
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: default
namespace: istio-system
spec:
host: "*.local"
trafficPolicy:
tls:
mode: ISTIO_MUTUAL
四、证书管理
4.1 查看证书
bash
# 查看Pod的证书
kubectl exec -it my-pod -c istio-proxy -- cat /etc/certs/cert-chain.pem
# 查看证书有效期
kubectl exec -it my-pod -c istio-proxy -- openssl x509 -in /etc/certs/cert-chain.pem -text -noout
4.2 证书轮换
yaml
apiVersion: "security.istio.io/v1beta1"
kind: "MeshPolicy"
metadata:
name: "default"
spec:
peers:
- mtls:
credentialName: "my-cert"
mode: STRICT
4.3 自定义CA
yaml
apiVersion: v1
kind: Secret
metadata:
name: custom-ca
namespace: istio-system
data:
root-cert.pem: <base64-encoded-root-cert>
cert-chain.pem: <base64-encoded-cert-chain>
key.pem: <base64-encoded-key>
五、mTLS策略优先级
5.1 优先级顺序
- 工作负载级别(PeerAuthentication with selector)
- 命名空间级别(PeerAuthentication without selector)
- 全局级别(MeshPolicy)
5.2 策略组合示例
yaml
# 全局策略 - 允许mTLS
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: istio-system
spec:
mtls:
mode: PERMISSIVE
# 命名空间策略 - 强制mTLS
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: sensitive
spec:
mtls:
mode: STRICT
# 工作负载策略 - 禁用mTLS
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: legacy-service
namespace: sensitive
spec:
selector:
matchLabels:
app: legacy
mtls:
mode: DISABLE
六、验证mTLS
6.1 使用istioctl验证
bash
# 检查mTLS配置
istioctl experimental analyze
# 检查特定服务
istioctl pc secret my-pod -n my-namespace
# 检查认证策略
istioctl get peerauthentication
6.2 使用curl验证
bash
# 在Pod中测试mTLS连接
kubectl exec -it my-pod -c istio-proxy -- curl -v https://my-service.my-namespace.svc.cluster.local:8080
6.3 查看Envoy配置
bash
# 查看Envoy配置
istioctl pc routes my-pod -n my-namespace
# 查看Envoy TLS配置
kubectl exec -it my-pod -c istio-proxy -- curl localhost:15000/config_dump | jq '.configs[].dynamic_active_secrets'
七、mTLS性能优化
7.1 连接复用
yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: my-service
namespace: my-namespace
spec:
host: my-service.my-namespace.svc.cluster.local
trafficPolicy:
connectionPool:
http:
maxRequestsPerConnection: 100
tls:
mode: ISTIO_MUTUAL
7.2 会话缓存
yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: my-service
namespace: my-namespace
spec:
host: my-service.my-namespace.svc.cluster.local
trafficPolicy:
tls:
mode: ISTIO_MUTUAL
maxSessionAge: 300s
maxSessionAgeGrace: 50s
7.3 证书缓存大小
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: istio
namespace: istio-system
data:
mesh: |
accessLogFile: /dev/stdout
defaultConfig:
proxyMetadata:
ISTIO_META_CERT_SDS_CACHE_SIZE: "1024"
八、故障排除
8.1 常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 连接拒绝 | mTLS模式不匹配 | 检查PeerAuthentication和DestinationRule配置 |
| 证书过期 | 证书轮换失败 | 检查Citadel日志,手动轮换证书 |
| 性能下降 | TLS握手开销 | 启用连接复用和会话缓存 |
| 证书验证失败 | CA配置错误 | 检查Secret中的证书链 |
8.2 日志分析
bash
# 查看Envoy日志
kubectl logs my-pod -c istio-proxy | grep -i tls
# 查看Citadel日志
kubectl logs -n istio-system -l app=citadel
# 查看Pilot日志
kubectl logs -n istio-system -l app=pilot | grep -i mTLS
8.3 调试工具
bash
# 使用istioctl诊断
istioctl diagnose
# 检查Pod的Envoy配置
istioctl proxy-config secret my-pod -n my-namespace
# 测试mTLS连接
kubectl exec -it my-pod -- istioctl experimental mTLS-check my-service.my-namespace.svc.cluster.local
九、最佳实践
9.1 配置建议
- 逐步启用:先使用PERMISSIVE模式,再切换到STRICT
- 分层策略:根据安全要求为不同命名空间配置不同策略
- 监控证书:设置证书过期告警
- 性能测试:在生产环境启用前进行性能测试
9.2 安全建议
- 定期轮换证书:建议90天轮换一次
- 使用强加密套件:禁用弱加密算法
- 限制证书权限:最小权限原则
9.3 监控指标
yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: istio-mtls
namespace: istio-system
spec:
selector:
matchLabels:
app: istio-pilot
endpoints:
- port: http-monitoring
path: /metrics
interval: 30s
通过合理配置Istio mTLS,可以为服务间通信提供强大的安全保障,同时保持良好的性能表现。