一、为什么需要工作负载身份管理

在Kubernetes集群中,Pod经常需要访问云服务API(比如AWS S3、Google Cloud Storage或Azure Blob Storage)。直接在这些Pod里硬编码访问密钥(Access Key)或服务账号密钥文件,就像把家门钥匙贴在门口——非常不安全。一旦密钥泄露,黑客就能轻松访问你的云资源。

工作负载身份管理(Workload Identity)的核心思想是:让Pod动态获取临时、最小权限的访问凭证,而不是长期有效的密钥。这样即使凭证被截获,风险也大大降低。

二、主流云厂商的解决方案

1. AWS的IRSA(IAM Roles for Service Accounts)

IRSA允许你将IAM角色直接绑定到Kubernetes的Service Account上。当Pod使用这个Service Account时,会自动获得对应IAM角色的权限。

技术栈:AWS EKS + IRSA

# 1. 创建IAM角色(假设角色ARN为arn:aws:iam::123456789012:role/s3-reader)
# 2. 创建Kubernetes Service Account并注解IAM角色
apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-app-sa
  annotations:
    eks.amazonaws.com/role-arn: "arn:aws:iam::123456789012:role/s3-reader"

# 3. 在Pod中引用这个Service Account
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  serviceAccountName: my-app-sa  # 关键配置
  containers:
  - name: my-container
    image: my-app-image

注释:

  • eks.amazonaws.com/role-arn注解告诉EKS这个Service Account关联的IAM角色。
  • Pod启动后,AWS SDK会自动从实例元数据服务获取临时凭证。

2. Google Cloud的Workload Identity

GCP的方案类似,但需要通过Google Service Account(GSA)和Kubernetes Service Account(KSA)绑定实现。

技术栈:Google GKE + Workload Identity

# 1. 启用Workload Identity
gcloud container clusters update my-cluster \
    --workload-pool=my-project.svc.id.goog

# 2. 创建Kubernetes Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-app-sa
  annotations:
    iam.gke.io/gcp-service-account: "my-gsa@my-project.iam.gserviceaccount.com"

# 3. 在Pod中使用
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  serviceAccountName: my-app-sa
  containers:
  - name: my-container
    image: my-app-image

注释:

  • iam.gke.io/gcp-service-account注解将KSA与GSA绑定。
  • Pod内调用Google Cloud API时会自动使用GSA权限。

三、开源工具推荐

如果你用的是多云环境或非主流云平台,可以考虑这些工具:

1. Vault Agent Sidecar

HashiCorp Vault能动态生成数据库密码、云API密钥等敏感信息。通过Sidecar模式注入到Pod中:

技术栈:HashiCorp Vault + Kubernetes

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  template:
    spec:
      serviceAccountName: vault-auth
      containers:
      - name: my-app
        image: my-app-image
      - name: vault-agent
        image: vault:latest
        args: ["agent", "-config=/etc/vault/config.hcl"]
        volumeMounts:
        - name: vault-config
          mountPath: /etc/vault
      volumes:
      - name: vault-config
        configMap:
          name: vault-config

注释:

  • Vault Agent以Sidecar形式运行,通过Kubernetes Auth方法获取令牌。
  • 应用容器通过共享卷或HTTP API从Vault Agent获取凭证。

2. SPIFFE/SPIRE

SPIFFE是通用身份标准,SPIRE是其实现。它为每个工作负载颁发唯一身份证书:

技术栈:SPIRE + Kubernetes

# SPIRE Server部署(简化版)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spire-server
spec:
  template:
    spec:
      containers:
      - name: spire-server
        image: spire-server:latest
        args: ["-config", "/run/spire/config/server.conf"]

# 注册Pod工作负载
apiVersion: spire.spiffe.io/v1alpha1
kind: ClusterSPIFFEID
metadata:
  name: example
spec:
  spiffeIDTemplate: "spiffe://example.org/ns/{{.PodMeta.Namespace}}/sa/{{.PodSpec.ServiceAccountName}}"
  podSelector:
    matchLabels:
      app: my-app

注释:

  • SPIRE Server负责颁发SVID(SPIFFE Verifiable Identity Document)。
  • 应用容器通过Unix域套接字获取证书,用于mTLS通信。

四、最佳实践与避坑指南

1. 权限最小化原则

无论使用哪种方案,始终遵循最小权限原则。例如:

  • 只给Pod访问特定S3桶的权限,而不是整个AWS S3服务。
  • 使用条件限制(如IP范围、时间窗口)进一步约束权限。

2. 审计与轮换

  • 启用云平台的审计日志(如AWS CloudTrail、GCP Audit Logs)。
  • 设置凭证自动轮换(Vault和SPIRE都支持)。

3. 常见问题

  • IRSA在Fargate上的限制:AWS Fargate Pod需要额外配置才能使用IRSA。
  • GKE Workload Identity的域名冲突:如果集群域名与GCP项目域名冲突,需要手动调整。

五、总结

工作负载身份管理不是“可有可无”的功能,而是现代云原生架构的安全基石。根据你的云平台选择原生方案(如IRSA、Workload Identity),或通过Vault、SPIRE等工具实现统一管理。记住:临时、最小权限的凭证永远是安全的第一道防线。