如何集成 HashiCorp Vault 实现自动密钥版本管理?
解读
在国内金融、政务云及大型互联网企业的 CouchDB 落地场景中,“密钥不落盘、轮换可审计” 已成为等保 2.0 与《个人信息保护法》的硬性要求。面试官问“自动密钥版本管理”,重点考察三件事:
- 能否让 CouchDB 在零代码改造的前提下,把加密密钥从本地文件挪到 Vault;
- 能否让 Vault 在不中断业务的情况下完成密钥轮换,并通知 CouchDB 重新加载;
- 能否把整套流程做成国产化可控的 CI/CD 环节,而不是手动敲命令。
回答时务必围绕“Vault ↔ CouchDB 的密钥生命周期闭环”展开,突出版本号追踪、自动轮换、故障回滚、国密合规四个关键词。
知识点
- CouchDB 加密点:
- 数据库级:
couchdb@localhost的local.ini中[couch_httpd_auth]的hmac_secret; - 副本级:
[replicator]的pem_key_file用于 SSL 双向认证; - 应用级:用户文档字段级加密,由 sm4-gcm 或 aes256-gcm 完成。
- 数据库级:
- Vault 引擎:
- KV Secrets Engine v2 自带
version、created_time、deletion_time元数据,天然满足“版本管理”; - Transit Engine 只暴露加密接口,密钥永不出库,适合国密 SM4/SM2 场景;
- Agent Template + Consul-Template 实现热更新文件, CouchDB 无需重启。
- KV Secrets Engine v2 自带
- 国产合规:
- Vault 1.12+ 已支持 国密 SM4 算法插件,需在
plugin_directory放置经国密办备案的.so; - 北京、上海两地机房需走 双向 TLS + SM2 证书,Vault 的
tls_cipher_suites需显式开启TLS_SM2_WITH_SM4_SM3。
- Vault 1.12+ 已支持 国密 SM4 算法插件,需在
- 轮换策略:
- 时间驱动:Vault 的
lease_duration=24h+ CouchDB 的gen_server定时拉取; - 事件驱动:Vault 的 Eventual Consistency Notification 通过 Kafka 推给 自研 sidecar,sidecar 调用
POST /_node/_local/_config热加载。
- 时间驱动:Vault 的
答案
生产级落地分五步,全部脚本化,可在麒麟 V10 + ARM 服务器上一键部署:
-
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,绑定策略仅允许read与list:
vault policy write couchdb-ro -<<EOF path "couchdb/data/*" { capabilities = ["read", "list"] } EOF -
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。 -
自动轮换
Vault 侧配置 周期性角色:
vault write couchdb/config/lease lease=24h lease_max=25h
并通过 Kubernetes CronJob 或 Ansible Tower 每日 02:00 执行:
`vault kv patch couchdb/db-