密钥管理Skill managing-secrets

密钥管理技能专注于安全地存储、旋转和交付各种秘密,如API密钥、数据库凭证和TLS证书,用于应用程序和基础设施。它涉及使用工具如HashiCorp Vault、云提供商密钥管理器和Kubernetes集成,支持静态和动态密钥、自动旋转、密钥扫描和合规性。关键词包括:密钥管理、Vault、Kubernetes、云安全、秘密存储、旋转、API密钥、数据库凭证、TLS证书、合规。

云安全 0 次安装 2 次浏览 更新于 3/23/2026

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:版本化静态密钥(蓝/绿)

  1. 在Vault中创建新密钥版本
  2. 更新暂存环境
  3. 监控错误(24-48小时)
  4. 渐进生产部署(10% → 50% → 100%)
  5. 撤销旧密钥(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. 立即旋转(1小时内)
  2. 在提供商撤销
  3. 从Git历史中移除(BFG Repo-Cleaner)
  4. 强制推送(通知团队)
  5. 审计访问(谁在泄漏窗口期间有访问权限)
  6. 记录事件

详细修复,请参见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

  1. 安装Vault(Helm图表)
  2. 初始化和解封Vault
  3. 启用Kubernetes认证
  4. 安装外部密钥操作符
  5. 创建SecretStore(Vault连接)
  6. 创建ExternalSecret(密钥映射)

逐步指南,请参见examples/vault-eso-setup/

工作流2:动态数据库凭证

  1. 启用数据库密钥引擎
  2. 配置数据库连接
  3. 创建带TTL的角色
  4. 应用获取凭证
  5. Vault自动续订租约

实现,请参见examples/dynamic-db-credentials/

工作流3:密钥扫描修复

  1. Gitleaks检测密钥
  2. 阻止提交(预提交钩子)
  3. 开发者移除密钥
  4. 开发者存储在Vault
  5. 开发者引用Vault路径

设置,请参见examples/secret-scanning/

与相关技能集成

  • auth-security:OAuth客户端密钥,JWT签名密钥
  • databases-*:动态数据库凭证
  • deploying-applications:容器注册表凭证
  • observability:Grafana/Datadog API密钥
  • infrastructure-as-code:云提供商凭证

安全最佳实践

  1. 永不提交密钥到Git(使用Gitleaks预提交钩子)
  2. 尽可能使用动态密钥
  3. 定期旋转密钥(静态季度,动态小时)
  4. 实现最小权限(Vault策略,RBAC)
  5. 启用审计日志
  6. 静态加密(Vault存储,etcd加密)
  7. 使用短TTL(动态密钥<24小时)
  8. 监控失败访问尝试

常见陷阱

环境变量中的密钥

环境变量在进程列表中可见。 **解决方案:**使用基于文件的密钥(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/CD
  • scripts/setup_vault.sh - 自动化Vault安装