如何集成 HashiCorp Vault 实现自动密钥版本管理?

解读

在国内金融、政务云及大型互联网企业的 CouchDB 落地场景中,“密钥不落盘、轮换可审计” 已成为等保 2.0 与《个人信息保护法》的硬性要求。面试官问“自动密钥版本管理”,重点考察三件事:

  1. 能否让 CouchDB 在零代码改造的前提下,把加密密钥从本地文件挪到 Vault;
  2. 能否让 Vault 在不中断业务的情况下完成密钥轮换,并通知 CouchDB 重新加载;
  3. 能否把整套流程做成国产化可控的 CI/CD 环节,而不是手动敲命令。
    回答时务必围绕“Vault ↔ CouchDB 的密钥生命周期闭环”展开,突出版本号追踪、自动轮换、故障回滚、国密合规四个关键词。

知识点

  1. CouchDB 加密点:
    • 数据库级couchdb@localhostlocal.ini[couch_httpd_auth]hmac_secret
    • 副本级[replicator]pem_key_file 用于 SSL 双向认证;
    • 应用级:用户文档字段级加密,由 sm4-gcmaes256-gcm 完成。
  2. Vault 引擎:
    • KV Secrets Engine v2 自带 versioncreated_timedeletion_time 元数据,天然满足“版本管理”;
    • Transit Engine 只暴露加密接口,密钥永不出库,适合国密 SM4/SM2 场景;
    • Agent Template + Consul-Template 实现热更新文件, CouchDB 无需重启。
  3. 国产合规:
    • Vault 1.12+ 已支持 国密 SM4 算法插件,需在 plugin_directory 放置经国密办备案的 .so
    • 北京、上海两地机房需走 双向 TLS + SM2 证书,Vault 的 tls_cipher_suites 需显式开启 TLS_SM2_WITH_SM4_SM3
  4. 轮换策略:
    • 时间驱动:Vault 的 lease_duration=24h + CouchDB 的 gen_server 定时拉取;
    • 事件驱动:Vault 的 Eventual Consistency Notification 通过 Kafka 推给 自研 sidecar,sidecar 调用 POST /_node/_local/_config 热加载。

答案

生产级落地分五步,全部脚本化,可在麒麟 V10 + ARM 服务器上一键部署:

  1. Vault 侧准备
    a. 启用 KV-v2 并创建路径 couchdb/data/encryption/db-key
    vault secrets enable -path=couchdb -version=2 kv
    b. 写入首版密钥,显式指定国密 SM4
    vault kv put couchdb/db-key key=$(openssl rand -hex 32) algorithm=sm4-gcm
    c. 创建 AppRole,绑定策略仅允许 readlist
    vault policy write couchdb-ro -<<EOF path "couchdb/data/*" { capabilities = ["read", "list"] } EOF

  2. CouchDB 侧无侵入改造
    a. 部署 vault-agent 作为 systemd 守护进程,配置文件 /etc/vault-agent.hcl
    vault { address = "https://vault.intra" } auto_auth { method "approle" { config={role_id="xxx" secret_id="xxx"} } } template { source = "/opt/couchdb/etc/key.ctmpl" destination = "/opt/couchdb/etc/encryption.key" command = "sudo -u couchdb /opt/couchdb/bin/hot-reload-key.sh" }
    b. 模板文件 key.ctmpl 只提取最新版本:
    {{ with secret "couchdb/data/db-key" }}{{ .Data.data.key }}{{ end }}
    c. hot-reload-key.sh 内容:
    #!/bin/bash curl -X POST -H "Content-Type: application/json" \ http://localhost:5984/_node/_local/_config/encryption/key \ -d \"$(cat /opt/couchdb/etc/encryption.key)\"
    该接口是 CouchDB 私有 RPC,不会触发集群重启,RTO<3s

  3. 自动轮换
    Vault 侧配置 周期性角色
    vault write couchdb/config/lease lease=24h lease_max=25h
    并通过 Kubernetes CronJobAnsible Tower 每日 02:00 执行:
    `vault kv patch couchdb/db-