跳到主要内容

K8s 敏感信息管理:从 Secret 到 External Secrets Operator

为何要重新审视 Kubernetes Secret

Kubernetes 原生 Secret 只是 Base64 编码的字符串,默认写入 etcd 且未加密,拥有集群读写权限的任何人都能轻松获取。随着集群中敏感变量(数据库密码、API Token、云凭证)数量激增,企业需要一套覆盖“存储、分发、轮换、审计”的完整方案。本指南介绍:

  • 原生 Secret 的风险与改进方式(静态加密、RBAC、审计)
  • Sealed Secrets 如何在 GitOps 流程中安全存储 Secret
  • External Secrets Operator/ESO 联合 Vault、AWS Secrets Manager 等外部密钥管理系统(KMS)
  • Secret 轮换策略与 CI/CD 集成思路

原生 Secret 的改进措施

  1. 启用 etcd 加密:在 kube-apiserver 添加 --encryption-provider-config,使用 KMS/密钥轮换对 secrets 资源进行静态加密。
  2. 最小权限 RBAC:仅允许特定 Namespace/ServiceAccount 读取 Secret,结合 kubectl auth can-i get secret 验证。
  3. 禁用默认挂载:通过 automountServiceAccountToken: false 防止 Pod 自动获得默认 token。
  4. 审计日志:开启 API 审计,监控对 Secret 的 get/list 操作。

尽管如此,原生 Secret 仍不适合直接存入 Git 仓库,需配合额外工具。

Sealed Secrets:GitOps 友好的加密版本

  • 工作原理kubeseal CLI 使用集群中的 controller 公钥,将普通 Secret 加密后生成 SealedSecret CRD。加密内容可安全提交到 Git;只有拥有私钥的 controller 能在集群内解密并创建真实 Secret。
  • 场景:GitOps 流程需要把 Secret 与应用配置放在同一仓库;只希望在集群内解密。

示例:

kubectl create secret generic db-credentials \
--from-literal=USER=app \
--from-literal=PASSWORD='M!x3d' \
--dry-run=client -o yaml > secret.yaml

kubeseal --controller-namespace kube-system \
--format yaml < secret.yaml > sealed-secret.yaml

应用到集群:

kubectl apply -f sealed-secret.yaml

优势:无须外部 KMS,兼容 GitOps;缺点是无法动态轮换,仍需手动更新。

External Secrets Operator(ESO)

ESO 负责把外部密钥管理系统(AWS Secrets Manager、HashiCorp Vault、GCP Secret Manager 等)的值同步到 Kubernetes Secret,具备动态轮换能力。

  1. 安装
    helm repo add external-secrets https://charts.external-secrets.io
    helm install external-secrets external-secrets/external-secrets \
    --namespace external-secrets --create-namespace
  2. SecretStore/ClusterSecretStore:描述外部提供者(Provider)与认证方式。
    apiVersion: external-secrets.io/v1beta1
    kind: ClusterSecretStore
    metadata:
    name: aws-secrets
    spec:
    provider:
    aws:
    service: SecretsManager
    region: ap-southeast-1
    auth:
    secretRef:
    accessKeyIDSecretRef:
    name: aws-cred
    key: access-key
    namespace: external-secrets
    secretAccessKeySecretRef:
    name: aws-cred
    key: secret-key
    namespace: external-secrets
  3. ExternalSecret:定义要同步的 Key、刷新周期及目标 Secret。
    apiVersion: external-secrets.io/v1beta1
    kind: ExternalSecret
    metadata:
    name: payment-db
    namespace: payment
    spec:
    refreshInterval: 1h
    secretStoreRef:
    name: aws-secrets
    kind: ClusterSecretStore
    target:
    name: payment-db
    creationPolicy: Owner
    data:
    - secretKey: username
    remoteRef:
    key: prod/payment
    property: username
    - secretKey: password
    remoteRef:
    key: prod/payment
    property: password

外部值变化后,ESO 会在下一次刷新周期自动更新 Kubernetes Secret,可配合 Deployment 的 checksum 注解触发滚动更新。

HashiCorp Vault 集成思路

  • Vault Agent Injector:以 Sidecar 注入方式,把 Vault 中的秘密写入共享 Volume,适合短期令牌。
  • ESO + Vault Provider:通过 Kubernetes auth 方法(JWT + Role)访问 Vault,并自动同步至 Secret。
  • Vault CSI Driver:直接以 Volume 形式挂载 Secret,适合文件型证书。

关键配置:

  1. 在 Vault 中启用 Kubernetes Auth:
    vault auth enable kubernetes
    vault write auth/kubernetes/config \
    token_reviewer_jwt="$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \
    kubernetes_host="https://$KUBERNETES_PORT_443_TCP_ADDR:443" \
    kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
  2. 创建 Vault Role,把某个 ServiceAccount 映射到特定路径:
    vault write auth/kubernetes/role/payment \
    bound_service_account_names=payment-app \
    bound_service_account_namespaces=payment \
    policies=payment-policy \
    ttl=1h

Secret 轮换与治理策略

  • 短周期凭证:配合 Vault/ESO 的自动刷新,减少凭证长期暴露风险。
  • 滚动更新:在 Deployment/StatefulSet 中使用 ConfigMap/Secret 的 hash 注解(checksum/config),Secret 更新后自动触发 Pod 重启。
  • 权限审计:使用 Kyverno/OPA 阻止 default ServiceAccount 读取敏感 Secret,或强制 Secret 命名遵循规范。
  • 集中登记:维护 Secret 清单与负责人,任何新密钥都需登记描述用途、来源、轮换周期。

工具对比

方案加密存储动态同步GitOps 友好复杂度
原生 Secret + etcd 加密一般
Sealed Secrets
External Secrets Operator✅(由外部 KMS 提供)✅(与 Git 分离敏感值)
Vault Agent/ESO + Vault需额外配置

总结

通过“原生 Secret 加固 + GitOps 加密(Sealed Secrets) + 动态同步(ESO/Vault)”的组合,可以覆盖大多数企业在敏感信息管理方面的需求。下一篇我们将聚焦容器镜像安全,结合 Trivy 扫描与 Kyverno/OPA 准入策略构建完整供应链防线。