从零搭建 HashiCorp Vault 密钥管理

适用场景

需要集中管理数据库密码、API Key、证书和动态凭据,要求审计、租约和细粒度权限。适合多团队、多环境,且不希望把密钥散落在 CI 变量和 ConfigMap 中。

前置条件

步骤

  1. 使用 Helm 安装生产模式:
helm repo add hashicorp https://helm.releases.hashicorp.com
helm repo update
helm install vault hashicorp/vault \
  --namespace vault --create-namespace \
  --set 'server.ha.enabled=true' \
  --set 'server.ha.raft.enabled=true' \
  --set 'server.dataStorage.size=20Gi'
  1. 初始化并解封:
kubectl -n vault exec -it vault-0 -- vault operator init
kubectl -n vault exec -it vault-0 -- vault operator unseal <KEY_1>
kubectl -n vault exec -it vault-0 -- vault operator unseal <KEY_2>
kubectl -n vault exec -it vault-0 -- vault operator unseal <KEY_3>

初始化的 root token 只用于首次配置,配置完成后立即撤销或封存。

  1. 登录并启用 KV v2:
kubectl -n vault exec -it vault-0 -- vault login <ROOT_TOKEN>
kubectl -n vault exec -it vault-0 -- vault secrets enable -path=secret kv-v2
kubectl -n vault exec -it vault-0 -- vault kv put secret/demo/db username=app password='***'
  1. 配置策略和 Kubernetes 认证:
vault policy write demo-read - <<'EOF'
path "secret/data/demo/*" {
  capabilities = ["read"]
}
EOF

vault auth enable kubernetes
vault write auth/kubernetes/config kubernetes_host="https://kubernetes.default.svc"
vault write auth/kubernetes/role/demo \
  bound_service_account_names=demo \
  bound_service_account_namespaces=demo \
  policies=demo-read ttl=1h
  1. 应用通过 Vault Agent Injector 或 CSI Provider 注入密钥:
kubectl annotate deploy demo \
  vault.hashicorp.com/agent-inject="true" \
  vault.hashicorp.com/role="demo" \
  vault.hashicorp.com/agent-inject-secret-db="secret/data/demo/db"
  1. 配置审计和备份:
vault audit enable file file_path=/vault/logs/audit.log
vault operator raft snapshot save /vault/backup/vault.snap

验证

回滚

常见坑

相关命令