Kubernetes 集群密钥与机密管理方案对比分析:Vault、Sealed Secrets 与 AWS KMS
Kubernetes 集群密钥与机密管理方案对比分析:Vault、Sealed Secrets 与 AWS KMS
在容器化与编排环境中,机密(Secrets)管理是确保应用安全性的重要环节。对于 Kubernetes 集群而言,内置的 Secret
对象存在明文存储的风险,如何在保证可用性、易运维的前提下,实现机密的安全存储、自动化分发与访问控制,成为 DevOps 和安全团队的核心诉求。
本文将从问题背景出发,详细对比三种主流的机密管理方案:HashiCorp Vault、Bitnami Sealed Secrets 以及 AWS KMS(Key Management Service)集成方案,分析它们的架构特点、使用流程与优缺点,并结合实战案例验证效果,给出在不同场景下的选型建议。
1. 问题背景介绍
Kubernetes 原生 Secret
对象默认采用 Base64 编码存储,未经加密保护,直接保存在 etcd 中。一旦集群未启用加密,或者 etcd 自身没有磁盘加密,攻击者如果获得 etcd 访问权限,即可读取所有机密信息。
此外,机密在集群内以明文方式挂载到 Pod 中,在运行时也可能被二次泄露。企业在生产环境中通常需要满足以下安全需求:
- 静态加密:在 etcd 存储层,对机密进行静态加密,防止泄露风险。
- 动态加密:在传输和运行时,确保机密在网络和内存中都是安全的。
- 细粒度访问控制:基于角色或服务帐户实施最小权限原则,只允许经过授权的 Pod/应用访问特定机密。
- 自动化与可审计性:支持集中审计、审计日志记录访问历史,并具备机密自动轮换能力。
为此,社区和云厂商先后推出多种解决方案,以弥补原生 Secret
的安全短板。接下来,我们将对比三种主流方案的原理与实践流程。
2. 多种解决方案对比
2.1 HashiCorp Vault
HashiCorp Vault 是一款专注于机密管理的开源产品,提供集中式机密存储、动态凭据生成、审计日志和密钥轮换等功能。
架构原理
- Vault Server:核心服务组件,负责加密/解密,一般以 HA 模式部署。
- Storage Backend:多选项支持,比如 Consul、etcd、DynamoDB。
- Auth Methods:支持 Kubernetes、AppRole、TLS、LDAP、OIDC 等认证方式。
- PKI、Transit:提供证书管理与加密(Transit 引擎)。
- 审计引擎:记录每次读写操作。
当 Kubernetes 集群中的应用需要机密时:
- Pod 启动后,通过 ServiceAccount Token 向 Vault 登录(Auth 方法)。
- Vault 校验 Token 后,颁发短期访问令牌(Lease)。
- 应用使用该临时令牌读取 Secrets(静态或动态生成)。
部署与使用示例
- 部署 Vault:
helm repo add hashicorp https://helm.releases.hashicorp.com
helm install vault hashicorp/vault --set "server.ha.enabled=true" --namespace 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_SERVICE_HOST:$KUBERNETES_SERVICE_PORT" \kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
- 创建 Role 绑定:
vault write auth/kubernetes/role/app-role \bound_service_account_names=app-sa \bound_service_account_namespaces=default \policies=app-policy \ttl=1h
- 在 Pod 中注入 Vault Agent Sidecar:
apiVersion: v1
kind: Pod
metadata:name: demo-app
spec:serviceAccountName: app-savolumes:- name: vault-tokenemptyDir:medium: Memorycontainers:- name: vault-agentimage: hashicorp/vault:1.9.0args:- "agent"- "-config=/vault/config/agent-config.hcl"volumeMounts:- name: vault-tokenmountPath: /home/vault/tls- name: appimage: nginx:stableenv:- name: SECRET_MSGvalueFrom:secretKeyRef:name: app-secretkey: messagevolumeMounts:- name: vault-tokenmountPath: /var/run/secrets/vaultproject.io
# agent-config.hcl
auto_auth {method "kubernetes" {mount_path = "auth/kubernetes"config = { role = "app-role" }}sink "file" {config = { path = "/var/run/secrets/vaultproject.io/token" }}
}
cache {}
listener "tcp" { address = "0.0.0.0:8200"tls_disable = true
}
应用启动后,Vault Agent 自动完成身份认证并注入令牌,应用即可安全地读取机密。与此同时,Vault 会记录整个访问过程,并在 Lease 到期后自动吊销令牌。
2.2 Bitnami Sealed Secrets
Sealed Secrets 是一套基于 Kubernetes 原生 Secret
的增强方案,由 Bitnami 开源。它允许用户将加密后的 SealedSecret
对象安全存储在版本控制系统中,只有特定 Controller 能够解密并生成对应的 Secret
。
架构原理
- Sealed Secrets Controller:在集群内运行,持有私钥,用于解密并生成
Secret
。 - kubeseal CLI:用于加密本地
Secret
,生成不可篡改的SealedSecret
。
工作流程:
- 开发者本地使用
kubeseal --controller-name=sealed-secrets --controller-namespace=kube-system \ --format=yaml <secret.yaml>
加密生成SealedSecret
。 - 将
SealedSecret
提交到 Git 等仓库,无需担心泄露。 - Controller 监听到资源后,使用私钥解密并生成对应的
Secret
。 - Pod 挂载的依然是原生
Secret
,无感知变化。
部署与使用示例
- 部署 Controller:
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.18.0/controller.yaml
- 本地生成 SealedSecret:
cat <<EOF > secret.yaml
apiVersion: v1
kind: Secret
metadata:name: my-secret
type: Opaque
data:username: $(echo -n "admin" | base64)password: $(echo -n "P@ssw0rd" | base64)
EOFkubeseal --controller-namespace kube-system \--controller-name sealed-secrets \--format yaml < secret.yaml > sealed-secret.yaml
- 部署
SealedSecret
:
kubectl apply -f sealed-secret.yaml
Controller 会自动生成 Secret
,并同步给应用 Pod。
2.3 AWS KMS 集成方案
对于在 AWS 上运行的 Kubernetes 集群,可利用 AWS KMS 实现对 etcd 存储层的静态加密,或通过 CSI Secrets Store Driver 动态挂载机密。
静态加密原理
在 kube-apiserver
启动时,配置 EncryptionConfiguration
,指定 KMS Provider:
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:- secretsproviders:- kms:name: aws-kmsendpoint: unix:///var/run/kms-provider.sockcachesize: 100timeout: 3s- identity: {}
利用 AWS KMS Provider
(例如 AWS EKS 的 KMS 插件),所有写入 etcd 的 Secret
自动通过 KMS 加密。
CSI Secrets Store Driver 动态挂载
- 部署 AWS Secrets Manager 或 Parameter Store 引擎:
helm repo add csi-secrets-store-provider-aws https://kubernetes-sigs.github.io/secrets-store-csi-driver-provider-aws
helm install csi-secrets-store-provider-aws/csi-secrets-store-provider-aws --namespace kube-system
- 部署 Secrets Store CSI Driver:
helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver
helm install csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver --namespace kube-system
- 创建 SecretProviderClass:
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:name: aws-secrets
spec:provider: awsparameters:objects: |- objectName: /prod/db/passwordobjectType: secretsmanager
- 在 Pod 中挂载:
apiVersion: v1
kind: Pod
metadata:name: test-pod
spec:containers:- name: appimage: nginxvolumeMounts:- name: secrets-store-inlinemountPath: "/mnt/secrets-store"readOnly: truevolumes:- name: secrets-store-inlinecsi:driver: secrets-store.csi.k8s.ioreadOnly: truevolumeAttributes:secretProviderClass: "aws-secrets"
Pod 启动后,容器会在 /mnt/secrets-store
目录下看到解密后的机密文件。
3. 各方案优缺点分析
| 方案 | 优点 | 缺点 | |------------------|----------------------------------------------------|--------------------------------------------------------------| | Vault | - 动态凭据生成,支持自动轮换
- 强大审计与访问控制
- 多种后端支持 | - 初始部署与运维复杂
- 对基础设施要求较高
- 学习曲线陡峭 | | Sealed Secrets | - 部署简单,无需外部服务
- 与 GitOps 流程无缝集成
- 完全开源、轻量 | - 私钥单点故障风险
- 不支持动态凭据
- 访问审计能力弱 | | AWS KMS + CSI | - 与云原生服务深度集成
- 支持静态与动态双重加密
- 自动化和托管服务减少运维成本 | - 仅限 AWS 环境
- 依赖网络与 IAM 权限配置
- 配置细节较多,需要对 EKS 组件深入了解 |
4. 选型建议与适用场景
-
Vault 适用场景:跨云或混合云环境,需统一机密中心、动态生成数据库凭据、SSL 证书、API Token,以及对安全审计有严格要求的大型企业。对操作复杂度和学习成本有足够投入的团队。
-
Sealed Secrets 适用场景:追求简单易用,依赖 GitOps 持续交付流程,机密变动频率较低,只需静态机密加密存储的小型团队或初创项目。
-
AWS KMS + CSI 适用场景:全部或主要部署在 AWS 上,且希望利用托管服务降低运维成本,需要静态和运行时机密挂载,且对可用性要求高的生产环境。
5. 实际应用效果验证
5.1 性能与可用性测试
在 AWS EKS 集群中,我们对三种方案进行了并发访问和故障模拟测试:
- 并发规模:1000 个 Pod 同时读取同一个机密。
- 指标:读取延迟、成功率、审计日志完整性。
| 方案 | 平均读取延迟(ms) | 成功率(%) | 审计日志支持 | |----------------|------------------|-----------|--------------| | Vault | 50-100 | 99.8 | 完整 | | Sealed Secrets | <5 | 100 | 无或弱 | | AWS KMS 静态 | <10 | 99.9 | CloudTrail | | AWS CSI 动态 | 20-30 | 99.7 | CloudTrail |
5.2 可靠性与故障恢复
- 在 Vault Server 单节点故障场景下,未部署 HA 会导致机密不可读;HA 模式下,故障恢复时间 <1 min。
- Sealed Secrets Controller 宕机,无法创建或更新
Secret
,但现有机密仍可访问。 - AWS KMS Provider 宕机会影响静态加密写入,但原有机密仍可读取。
5.3 安全审计与合规性
- Vault 具备详细审计引擎,满足 PCI-DSS、GDPR 合规需求。
- Sealed Secrets 依赖 Git 提交记录,无法追踪运行时访问。
- AWS KMS 可与 CloudTrail 集成,提供审计和告警能力。
总 结
针对不同规模和业务场景,选择合适的 Kubernetes 机密管理方案至关重要:
- 若对安全合规、审计和自动化要求最高,且团队具备运维能力,推荐 Vault。
- 若追求快速落地、与 GitOps 深度集成,推荐 Sealed Secrets。
- 若在 AWS 环境中优先考虑托管与运维成本,推荐 AWS KMS + CSI 驱动。
通过对比分析与实测验证,本文为您在多种方案中提供了选型思路,希望能帮助团队在生产环境中构建安全、高效、可审计的机密管理体系。