name: managing-secrets description: 使用Vault、云提供商和Kubernetes管理密钥(API密钥、数据库凭证、证书)。适用于存储敏感数据、旋转凭证、将密钥同步到Kubernetes、实现动态密钥或扫描代码中的泄漏密钥。
管理密钥
为应用程序和基础设施安全存储、旋转和交付密钥(API密钥、数据库凭证、TLS证书)。
何时使用此技能
使用当:
- 存储API密钥、数据库凭证或加密密钥
- 实现密钥旋转(手动或自动)
- 将密钥从外部存储同步到Kubernetes
- 设置动态密钥(数据库、云提供商)
- 扫描代码中的泄漏密钥
- 实现零知识模式
- 满足合规要求(SOC 2、ISO 27001、PCI DSS)
快速决策框架
框架1:选择密钥存储
| 场景 | 主要选择 | 替代方案 |
|---|---|---|
| Kubernetes + 多云 | Vault + ESO | 云密钥管理器 + ESO |
| Kubernetes + 单云 | 云密钥管理器 + ESO | Vault + ESO |
| 无服务器(AWS Lambda) | AWS密钥管理器 | AWS参数存储 |
| 多云企业 | HashiCorp Vault | Doppler(SaaS) |
| 小团队(<10个应用) | Doppler, Infisical | 1Password密钥自动化 |
| GitOps中心 | SOPS(git加密) | 密封密钥(仅K8s) |
决策树:
- Kubernetes? → 外部密钥操作符(ESO)与所选后端
- 单云? → 云原生(AWS/GCP/Azure)
- 多云/本地? → HashiCorp Vault
- GitOps? → SOPS或密封密钥
框架2:静态与动态密钥
| 密钥类型 | 使用动态? | TTL | 解决方案 |
|---|---|---|---|
| 数据库凭证 | 是 | 1小时 | Vault数据库引擎 |
| 云IAM(AWS/GCP) | 是 | 15分钟 | Vault云引擎 |
| SSH/RDP访问 | 是 | 5分钟 | Vault SSH引擎 |
| TLS证书 | 是 | 24小时 | Vault PKI / cert-manager |
| 第三方API密钥 | 否 | 季度 | Vault KV v2(手动旋转) |
框架3:Kubernetes密钥交付
| 方法 | 使用案例 | 旋转 | 需要重启 |
|---|---|---|---|
| 外部密钥操作符 | 静态密钥,定期同步 | 轮询(1小时) | 是 |
| 密钥存储CSI驱动 | 基于文件,监视旋转 | inotify | 否 |
| Vault密钥操作符 | Vault特定,动态 | 自动续订 | 可选 |
HashiCorp Vault基础知识
核心组件
- 密钥引擎:KV v2(静态)、数据库(动态)、AWS、PKI、SSH
- 认证方法:Kubernetes、JWT/OIDC、AppRole、LDAP
- 策略:基于HCL的访问控制(最小权限)
- 租约:密钥的TTL,自动续订,自动撤销
静态密钥(KV v2)
# 创建密钥
vault kv put secret/myapp/config api_key=sk_live_EXAMPLE
# 读取密钥
vault kv get secret/myapp/config
# 列出版本
vault kv metadata get secret/myapp/config
动态数据库凭证
# 配置PostgreSQL
vault write database/config/postgres \
plugin_name=postgresql-database-plugin \
connection_url="postgresql://{{username}}:{{password}}@postgres:5432/mydb"
# 创建角色
vault write database/roles/app-role \
db_name=postgres \
creation_statements="CREATE ROLE \"{{name}}\"..." \
default_ttl="1h"
# 生成凭证
vault read database/creds/app-role
详细Vault架构,请参见references/vault-architecture.md。
Kubernetes集成
外部密钥操作符(ESO)
将密钥从30+提供商同步到Kubernetes密钥。
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: vault-backend
spec:
provider:
vault:
server: "https://vault.example.com"
auth:
kubernetes:
role: "app-role"
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: database-credentials
spec:
refreshInterval: 1h
secretStoreRef:
name: vault-backend
target:
name: db-credentials
data:
- secretKey: password
remoteRef:
key: secret/data/database/config
Vault密钥操作符(VSO)
Kubernetes原生Vault集成,自动租约续订。
apiVersion: secrets.hashicorp.com/v1beta1
kind: VaultDynamicSecret
metadata:
name: postgres-creds
spec:
vaultAuthRef: vault-auth
mount: database
path: creds/app-role
renewalPercent: 67 # 在TTL的67%续订
destination:
name: dynamic-db-creds
ESO vs CSI vs VSO比较,请参见references/kubernetes-integration.md。
密钥旋转模式
模式1:版本化静态密钥(蓝/绿)
- 在Vault中创建新密钥版本
- 更新暂存环境
- 监控错误(24-48小时)
- 渐进生产部署(10% → 50% → 100%)
- 撤销旧密钥(7天后)
模式2:动态数据库凭证
Vault自动生成短TTL凭证:
- 应用从Vault获取凭证
- Vault自动续订租约(在TTL的67%)
- 过期时,Vault撤销访问
- 续订失败时,应用请求新凭证
模式3:TLS证书旋转
使用cert-manager + Vault PKI:
- cert-manager从Vault请求证书
- 自动在过期前续订(默认:持续时间的67%)
- 续订时更新Kubernetes密钥
- 可选Pod重启(通过Reloader)
详细旋转工作流,请参见references/rotation-patterns.md。
多语言集成
Python(hvac)
import hvac
client = hvac.Client(url='https://vault.example.com')
client.auth.kubernetes(role='app-role', jwt=jwt)
# 获取动态凭证
response = client.secrets.database.generate_credentials(name='postgres-role')
username = response['data']['username']
password = response['data']['password']
Go(Vault API)
import vault "github.com/hashicorp/vault/api"
client, _ := vault.NewClient(vault.DefaultConfig())
k8sAuth, _ := auth.NewKubernetesAuth("app-role")
client.Auth().Login(context.Background(), k8sAuth)
secret, _ := client.Logical().Read("database/creds/postgres-role")
TypeScript(node-vault)
import vault from 'node-vault';
const client = vault({ endpoint: 'https://vault.example.com' });
await client.kubernetesLogin({ role: 'app-role', jwt });
const response = await client.read('database/creds/postgres-role');
完整示例,请参见examples/dynamic-db-credentials/。
密钥扫描
预提交钩子(Gitleaks)
# 安装Gitleaks
brew install gitleaks
# 在暂存文件上运行
gitleaks protect --staged --verbose
预提交钩子防止密钥被提交。
设置,请参见examples/secret-scanning/pre-commit。
CI/CD集成
# GitHub Actions
- name: Run Gitleaks
uses: gitleaks/gitleaks-action@v2
修复工作流
当密钥泄漏时:
- 立即旋转(1小时内)
- 在提供商撤销
- 从Git历史中移除(BFG Repo-Cleaner)
- 强制推送(通知团队)
- 审计访问(谁在泄漏窗口期间有访问权限)
- 记录事件
详细修复,请参见references/secret-scanning.md。
零知识模式
客户端加密(E2EE)
用户密码 → PBKDF2 → 加密密钥 → 加密密钥 → 发送到服务器
服务器仅存储加密块(无法解密)。
Shamir密钥共享
将密钥拆分为N份,需要M份重构(例如,5中3)。
# 使用Shamir份额初始化Vault
vault operator init -key-shares=5 -key-threshold=3
# 解封需要5个密钥份额中的3个
vault operator unseal <KEY_1>
vault operator unseal <KEY_2>
vault operator unseal <KEY_3>
实现,请参见references/zero-knowledge.md。
库推荐(2025)
密钥存储
| 库 | 使用案例 | 信任分数 |
|---|---|---|
| HashiCorp Vault | 企业,多云 | 高(73.3/100) |
| 外部密钥操作符 | Kubernetes集成 | 高(85.0/100) |
| AWS密钥管理器 | AWS工作负载 | 高 |
| GCP密钥管理器 | GCP工作负载 | 高 |
| Azure密钥保管库 | Azure工作负载 | 高 |
密钥扫描
| 库 | 使用案例 | 信任分数 |
|---|---|---|
| Gitleaks | 预提交,CI/CD | 高(89.9/100) |
| TruffleHog | Git历史扫描 | 中 |
客户端库
| 语言 | 库 | 版本 |
|---|---|---|
| Python | hvac |
2.2.0+ |
| Go | vault/api |
最新 |
| TypeScript | node-vault |
0.10.2+ |
| Rust | vaultrs |
0.7+ |
常见工作流
工作流1:Vault + ESO on Kubernetes
- 安装Vault(Helm图表)
- 初始化和解封Vault
- 启用Kubernetes认证
- 安装外部密钥操作符
- 创建SecretStore(Vault连接)
- 创建ExternalSecret(密钥映射)
逐步指南,请参见examples/vault-eso-setup/。
工作流2:动态数据库凭证
- 启用数据库密钥引擎
- 配置数据库连接
- 创建带TTL的角色
- 应用获取凭证
- Vault自动续订租约
实现,请参见examples/dynamic-db-credentials/。
工作流3:密钥扫描修复
- Gitleaks检测密钥
- 阻止提交(预提交钩子)
- 开发者移除密钥
- 开发者存储在Vault
- 开发者引用Vault路径
设置,请参见examples/secret-scanning/。
与相关技能集成
- auth-security:OAuth客户端密钥,JWT签名密钥
- databases-*:动态数据库凭证
- deploying-applications:容器注册表凭证
- observability:Grafana/Datadog API密钥
- infrastructure-as-code:云提供商凭证
安全最佳实践
- 永不提交密钥到Git(使用Gitleaks预提交钩子)
- 尽可能使用动态密钥
- 定期旋转密钥(静态季度,动态小时)
- 实现最小权限(Vault策略,RBAC)
- 启用审计日志
- 静态加密(Vault存储,etcd加密)
- 使用短TTL(动态密钥<24小时)
- 监控失败访问尝试
常见陷阱
环境变量中的密钥
环境变量在进程列表中可见。 **解决方案:**使用基于文件的密钥(Kubernetes卷,CSI驱动)。
清单中的硬编码密钥
Base64不是加密。 **解决方案:**使用外部密钥操作符。
无密钥旋转
过时凭证增加泄露风险。 **解决方案:**使用动态密钥或自动化旋转。
生产中的根令牌
无限权限。 **解决方案:**使用具有最小权限策略的认证方法。
详细信息,请参见
references/vault-architecture.md- Vault内部,HA设置,策略references/kubernetes-integration.md- ESO,CSI驱动,VSO比较references/rotation-patterns.md- 详细旋转工作流references/secret-scanning.md- Gitleaks,修复程序references/zero-knowledge.md- E2EE,Shamir密钥共享references/cloud-providers.md- AWS,GCP,Azure密钥管理器examples/vault-eso-setup/- 完整Kubernetes设置examples/dynamic-db-credentials/- 多语言示例examples/secret-scanning/- 预提交钩子,CI/CDscripts/setup_vault.sh- 自动化Vault安装