4. 多集群身份与信任:SPIFFE标准、工作负载身份、信任域、证书轮换机制

在ClusterMesh多集群架构中,身份与信任是安全通信的基石。每个工作负载(Pod)都需要一个不可伪造的身份,以便在跨集群通信时进行认证和授权。本章深入解析SPIFFE标准、工作负载身份、信任域以及证书轮换机制,帮助您构建零信任的多集群网络。

4.1 SPIFFE标准:通用工作负载身份规范

SPIFFE(Secure Production Identity Framework for Everyone)是一个开放标准,定义了如何在动态、异构的环境中为工作负载颁发和验证身份。其核心是SPIFFE ID,格式如下:

spiffe://<trust-domain>/<path>
  • trust-domain:信任域,标识身份的可信边界,通常对应一个集群或组织。
  • path:工作负载的路径,用于唯一标识一个服务或Pod。

在Kubernetes环境中,SPIFFE ID通常映射为:

spiffe://cluster.local/ns/<namespace>/sa/<service-account>

这种设计使得身份与基础设施解耦,工作负载迁移或扩缩容时,身份保持不变。

关键点:SPIFFE标准不依赖IP地址或DNS名称,而是基于加密身份(X.509证书或JWT令牌),天然适合动态、多集群的云原生环境。

4.2 工作负载身份:从ServiceAccount到SPIFFE证书

在ClusterMesh中,每个Pod的身份由以下组件共同构成:

组件 作用 说明
Kubernetes ServiceAccount 身份声明 Pod通过绑定的ServiceAccount声明自己的身份归属
SPIFFE ID 身份标识 将ServiceAccount映射为标准的SPIFFE格式ID
X.509证书 身份凭证 由集群CA签发的短期证书,包含SPIFFE ID
Envoy Sidecar 身份代理 负责加载证书、发起mTLS握手、验证对端身份

工作负载身份的生命周期如下:

  1. Pod启动时,Cilium Agent为其生成私钥和证书签名请求(CSR)。
  2. Agent将CSR提交给集群的CA(Certificate Authority)。
  3. CA验证Pod的ServiceAccount后,签发包含SPIFFE ID的X.509证书。
  4. 证书和私钥通过本地Unix Socket注入到Pod的Envoy Sidecar中。
  5. Sidecar使用该证书与其他集群的Sidecar建立mTLS连接。
最佳实践:确保每个ServiceAccount对应一个独立的SPIFFE路径,避免多个服务共享同一身份,以便实现细粒度的访问控制。

4.3 信任域:多集群信任边界

信任域(Trust Domain)定义了身份的可信边界。在单集群场景下,信任域通常为cluster.local。在多集群场景下,每个集群可以拥有独立的信任域,也可以共享同一个信任域。

ClusterMesh支持两种信任域模型:

模型 信任域配置 适用场景 安全级别
统一信任域 所有集群使用相同的信任域(如cluster.local) 完全信任的集群联邦 中
独立信任域 每个集群使用不同的信任域(如cluster1.local、cluster2.local) 多租户、安全隔离要求高 高

当使用独立信任域时,跨集群通信需要建立信任域之间的信任关系。ClusterMesh通过以下方式实现:

  • 根CA交换:集群之间交换根CA证书,建立双向信任。
  • 信任锚点:每个集群维护一个信任锚点列表,包含其他集群的根CA。
  • 身份验证:验证对端证书时,检查其SPIFFE ID的信任域是否在信任锚点列表中。
多集群信任域模型 集群 A 信任域: cluster-a.local 工作负载: spiffe://cluster-a.local/ns/default/sa/frontend 工作负载: spiffe://cluster-a.local/ns/default/sa/backend 根CA: ca.cluster-a.local 集群 B 信任域: cluster-b.local 工作负载: spiffe://cluster-b.local/ns/default/sa/payment 工作负载: spiffe://cluster-b.local/ns/default/sa/notify 根CA: ca.cluster-b.local 交换根CA 建立信任 说明:集群A和集群B拥有独立的信任域,通过交换根CA证书建立跨集群信任关系

4.4 证书轮换机制:自动续期与安全

短期证书是零信任安全模型的核心。ClusterMesh默认使用15分钟有效期的证书,并实现自动轮换机制,确保证书泄露的影响范围最小化。

4.4.1 证书轮换流程

  1. 定时检查:Envoy Sidecar每隔证书有效期的1/3(默认5分钟)检查证书剩余时间。
  2. 触发轮换:当证书剩余时间小于有效期的一半(约7.5分钟)时,触发轮换。
  3. 生成新CSR:Sidecar生成新的私钥和CSR,发送给Cilium Agent。
  4. CA签发:Agent将CSR提交给集群CA,CA验证后签发新证书。
  5. 热加载:新证书加载到Sidecar中,旧证书在过期后自动废弃。
  6. 连接保持:已建立的mTLS连接不受影响,新连接使用新证书。
注意:证书轮换期间,如果CA不可用,Sidecar会继续使用旧证书直到其过期。建议为CA配置高可用,避免单点故障导致整个集群的证书无法续期。

4.4.2 证书轮换参数

参数 默认值 说明
certificate-validity-duration 15m 证书有效期,建议不超过1小时
certificate-renewal-before-expiry 7m30s 证书到期前多久开始轮换
ca-validity-duration 365d 根CA证书有效期
ca-renewal-before-expiry 30d 根CA到期前多久开始轮换

4.4.3 根CA轮换策略

根CA证书轮换比工作负载证书更复杂,需要确保新旧CA的平滑过渡。ClusterMesh支持以下策略:

  • 双CA模式:同时维护新旧两个CA,旧CA继续验证已有连接,新CA用于签发新证书。
  • 信任锚点更新:在跨集群场景下,需要同步更新所有集群的信任锚点列表。
  • 手动验证:根CA轮换建议在维护窗口执行,并验证所有集群的mTLS连接正常。
证书轮换生命周期 初始签发 T=0 正常使用 T=0~7m30s 触发轮换 T=7m30s 新证书生效 T=15m 证书轮换关键点 1. 证书有效期15分钟,每5分钟检查一次剩余时间 2. 剩余时间小于7.5分钟时触发轮换,新证书热加载不影响现有连接

4.5 多集群信任验证实战

在ClusterMesh中,验证多集群信任是否正常工作的常用方法:

# 查看集群A的信任锚点
kubectl exec -n kube-system ds/cilium -c cilium-agent -- cilium identity list

# 查看集群B的信任锚点
kubectl exec -n kube-system ds/cilium -c cilium-agent -- cilium identity list

# 验证跨集群mTLS连接
kubectl exec -n kube-system ds/cilium -c cilium-agent -- cilium monitor -t trace | grep "from identity"

# 检查证书状态
kubectl exec -n kube-system ds/cilium -c cilium-agent -- cilium status | grep "Certificate"
排障提示:如果跨集群通信失败,首先检查信任域配置是否一致,然后验证根CA证书是否已正确交换。使用cilium connectivity test命令可以快速诊断多集群网络连通性和身份认证问题。

4.6 安全加固建议

  • 缩短证书有效期:将工作负载证书有效期从15分钟缩短至5分钟,进一步降低泄露风险。
  • 启用证书吊销:配置CRL(Certificate Revocation List)或OCSP(Online Certificate Status Protocol),在证书泄露时立即吊销。
  • 审计证书轮换:记录所有证书签发和轮换事件,便于事后审计。
  • 隔离信任域:生产环境与非生产环境使用不同的信任域,避免跨环境身份混淆。
  • 定期轮换根CA:至少每6个月轮换一次根CA证书,并验证所有集群的信任关系。