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 的指针。这种映射关系是安全策略执行的基础。

Endpoint 与 Identity 映射关系 Cilium Endpoint Pod: frontend-v1-abc IP: 10.0.1.5 Labels: app=frontend version=v1 Identity: 1024 Cilium Identity ID: 1024 Label 组合: app=frontend version=v1 全局唯一 Endpoint Pod: frontend-v1-xyz IP: 10.0.1.6 Labels: app=frontend version=v1 Identity: 1024 多个具有相同标签集合的 Endpoint 共享同一个 Identity,策略只需针对 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 程序执行以下步骤实现微隔离:

  1. 提取源 Identity:从数据包的 Security Context(通过 BPF 辅助函数或隧道封装头部)中提取源端点的 Identity。
  2. 查找目标 Identity:根据目标 IP 地址,在本地 Endpoint 映射表中查找目标端点的 Identity。
  3. 策略匹配:在 BPF Map 中查找 (源 Identity, 目标 Identity, 目标端口) 三元组是否匹配已下发的策略规则。
  4. 执行动作:允许(Allow)或拒绝(Drop)。
基于 Identity 的微隔离执行流程 1. 提取源 Identity 从数据包 Security Context 2. 查找目标 Identity IP → Endpoint Map 3. 策略匹配 (SrcID, DstID, Port) 4a. 允许 (Allow) 转发数据包 4b. 拒绝 (Drop) 丢弃并记录审计日志 整个匹配过程在 BPF 程序中完成,无需进入用户态,延迟在微秒级。

4.5 服务目录平台中的策略设计建议

  • 使用服务级别标签:为每个微服务定义统一的标签体系,如 service=catalog、tier=backend、environment=prod。
  • 避免使用 Pod 唯一标签:如 pod-template-hash,会导致每次更新生成新的 Identity,增加策略复杂度。
  • 分层策略:基础策略(如禁止跨环境访问)使用宽泛标签;精细策略(如仅允许特定版本访问)使用更具体的标签组合。
  • 审计与监控:利用 cilium monitor 观察 Identity 的分配和策略命中情况,验证策略正确性。
常见陷阱: 如果两个 Deployment 的标签完全一致,它们会被分配到同一个 Identity。此时编写的策略会同时影响这两个 Deployment,可能导致意外的权限扩散。务必确保不同安全级别的服务具有差异化的标签组合。