4. Cilium Identity 与安全策略:基于 Identity 的微隔离
Cilium 的安全模型核心是 基于 Identity(身份)的微隔离,而非传统的基于 IP 地址的防火墙规则。在服务目录平台中,服务实例频繁扩缩容、滚动更新,IP 地址动态变化,基于 IP 的策略难以维护。Cilium 通过为每个端点(Pod/容器)分配一个全局唯一的数字 Identity,实现了与网络拓扑解耦的安全策略。
4.1 Identity 的生成与生命周期
Identity 由 Cilium Agent 根据端点的标签集合(Labels)计算得出。具有相同标签集合的所有端点共享同一个 Identity。当端点标签发生变化时,Identity 会重新计算并分配。
| 阶段 | 触发条件 | 行为描述 |
|---|---|---|
| 分配 | 新 Pod 启动,或 Pod 标签变更 | Cilium Agent 提取 Pod 标签,通过 KV 存储(etcd)或 CRD 进行全局去重,分配一个 16 位或 24 位的数字 Identity。 |
| 缓存 | Identity 分配完成后 | 本地 Agent 缓存 Identity 与标签的映射关系,用于快速查找。 |
| 回收 | Pod 删除,且无其他端点使用该标签组合 | KV 存储中的 Identity 记录被标记为待回收,最终由 GC 机制清理。 |
关键设计: Identity 是标签集合的哈希结果,而非 Pod 实例的 UUID。这意味着同一 Deployment 下的所有 Pod(标签相同)共享同一个 Identity,策略只需针对 Identity 编写,无需关心 Pod 数量变化。
4.2 Endpoint 与 Identity 的映射关系
每个 Cilium Endpoint 代表一个网络可寻址的工作负载(如 Pod)。Endpoint 内部维护了指向其所属 Identity 的指针。这种映射关系是安全策略执行的基础。
4.3 基于标签选择器的安全策略
CiliumNetworkPolicy 使用 Kubernetes 标签选择器来匹配源端点和目标端点,而不是直接引用 IP 或 Identity 数字。Cilium 在策略下发时,会将标签选择器解析为对应的 Identity 集合,并下发到 BPF 程序中。
策略示例:允许 frontend 访问 backend
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: allow-frontend-to-backend
spec:
endpointSelector:
matchLabels:
app: backend
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
version: v1
ports:
- port: "8080"
protocol: TCP
策略解析:
endpointSelector:定义策略的目标端点(谁被保护),此处为app=backend。fromEndpoints:定义允许的源端点(谁可以访问),此处为app=frontend且version=v1。- 当
frontend-v1的 Pod 扩缩容时,其 Identity 不变,策略无需修改。
4.4 基于 Identity 的微隔离执行流程
当数据包到达节点时,Cilium 的 BPF 程序执行以下步骤实现微隔离:
- 提取源 Identity:从数据包的 Security Context(通过 BPF 辅助函数或隧道封装头部)中提取源端点的 Identity。
- 查找目标 Identity:根据目标 IP 地址,在本地 Endpoint 映射表中查找目标端点的 Identity。
- 策略匹配:在 BPF Map 中查找 (源 Identity, 目标 Identity, 目标端口) 三元组是否匹配已下发的策略规则。
- 执行动作:允许(Allow)或拒绝(Drop)。
4.5 服务目录平台中的策略设计建议
- 使用服务级别标签:为每个微服务定义统一的标签体系,如
service=catalog、tier=backend、environment=prod。 - 避免使用 Pod 唯一标签:如
pod-template-hash,会导致每次更新生成新的 Identity,增加策略复杂度。 - 分层策略:基础策略(如禁止跨环境访问)使用宽泛标签;精细策略(如仅允许特定版本访问)使用更具体的标签组合。
- 审计与监控:利用
cilium monitor观察 Identity 的分配和策略命中情况,验证策略正确性。
常见陷阱: 如果两个 Deployment 的标签完全一致,它们会被分配到同一个 Identity。此时编写的策略会同时影响这两个 Deployment,可能导致意外的权限扩散。务必确保不同安全级别的服务具有差异化的标签组合。