[Cilium] Kubernetes安全核心:基于Service Account的网络策略完整指南 🛡️

大家好!今天我们将深入探讨如何利用被称为Kubernetes网络安全“终极武器”的Cilium,来建立更安全、更直观的安全策略。

特别是,我们将详细介绍如何不仅使用简单的Label(标签),而是利用Service Account(服务账户)来制定策略及其原因。🚀


🧐 为什么仅凭Label是不够的?

基本的Kubernetes NetworkPolicy是根据附加到Pod的Label(例如app: frontend)来允许或阻止流量的。然而,这里可能存在致命的安全漏洞。

  1. 伪造可能性 (Spoofing): 如果开发人员或攻击者恶意启动一个Pod并随意附加app: frontend标签,防火墙将无法区分并允许其通过。😱
  2. 管理复杂性: 每当Pod版本更改或部署策略调整时,标签管理很容易变得混乱。

💡 解决方案: 基于Service Account (SA) 的策略

Cilium提供ID(身份)基于的安全。Pod创建时分配的Service Account由Kubernetes RBAC(基于角色的访问控制)严格管理,因此它比标签是更可靠的标识符。

换句话说,这意味着只允许“拥有此身份证明(SA)的Pod”通过,而不是仅仅“拥有此标签的Pod”。


🛠️ 工作原理: io.kubernetes.serviceaccount.name

当Pod创建时,Cilium会读取该Pod的Service Account信息,并将其内部转换为一个特殊的标签进行管理。

  • 键(Key): io.kubernetes.serviceaccount.name
  • 值(Value): 实际的Service Account名称(例如: frontend-sa)

我们可以使用这个特殊标签在CiliumNetworkPolicy (CNP)中创建非常精细的规则。


📝 实战配置指南 (YAML示例)

让我们假设一个场景。

目标: 只有使用名为frontend-sa的Service Account的Pod才能访问backend Pod。

1. 编写CiliumNetworkPolicy

YAML

apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "secure-backend-access"
  namespace: "default"
spec:
  # 1️⃣ 目标设置:保护谁? (Backend)
  endpointSelector:
    matchLabels:
      app: backend

  # 2️⃣ 入站规则 (Ingress):谁可以进入?
  ingress:
  - fromEndpoints:
    - matchLabels:
        # 3️⃣ 关键点!指定Service Account名称
        io.kubernetes.serviceaccount.name: "frontend-sa"

        # (可选) 如果想明确指定是同一个命名空间
        io.kubernetes.pod.namespace: "default"

🔍 详细分析

  • endpointSelector: 这是策略将应用的目标。在这里,带有app: backend标签的Pod是受保护的目标。
  • fromEndpoints: 定义允许访问的源(起点)。
  • io.kubernetes.serviceaccount.name: 这就是奇迹发生的地方!🎩 我们没有使用普通的app标签,而是将Kubernetes认证的SA名称作为条件。现在,无论如何伪造app: frontend标签,如果SA不是frontend-sa,访问都将被阻止。

🌟 Service Account策略的优点总结

类别 普通网络策略 (标签) Cilium CNP (服务账户)
识别标准 用户随意附加的标签 K8s认证的Service Account
安全强度 低(标签易于伪造) 高(由RBAC控制)
可见性 以IP/标签为主 以应用程序/ID为主
应用示例 简单隔离 实现零信任(Zero Trust)

—

🍯 小贴士: 如果命名空间不同怎么办?

如果frontend团队的命名空间(team-a)中的SA需要访问backend命名空间(team-b),该怎么办?Cilium也可以结合命名空间标签。

YAML

  - fromEndpoints:
    - matchLabels:
        io.kubernetes.serviceaccount.name: "frontend-sa"
        io.kubernetes.pod.namespace: "team-a"  # 👈 连命名空间也指定了!

这样,只有team-a命名空间中的frontend-sa服务账户才会被精确允许。


🏁 总结

如果您正在使用Cilium,请不要再仅仅依赖不安全的标签。通过利用Service Account,您可以将基础设施级别的安全策略与应用程序的认证体系(RBAC)结合起来,构建一个更强大的纵深防御(Defense-in-Depth)策略。

立即检查您的集群策略吧!😉



Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注