背景

在企业实践中,HashiCorp Vault 作为密钥管理的事实标准,官方及社区已经提供了 AWS、AliCloud、TencentCloud 等主流云厂商的 Secrets Engine 插件。然而,当我试图为火山引擎(Volcengine)寻找类似方案时,发现市面上并没有现成的插件可用。

既然没有轮子,而且现在有AI了,那咱就自己Vibe一个。

插件能做什么

这个插件(vault-plugin-secrets-volcengine)为 Vault 提供了火山引擎的动态凭证管理能力,支持两种模式:

STS 临时凭证 — 通过 AssumeRole 签发短期临时 AK/SK + SecurityToken,适合短生命周期的作业场景,凭证到期自动失效,无需主动回收。

IAM 动态用户 — 按需创建 IAM 子用户并挂载策略,生成长期 AK/SK。Vault 负责完整的生命周期管理:创建、续期、到期自动回收(删除 AccessKey → 解绑策略 → 删除用户)。

核心设计

凭证链

插件本身需要一组"根凭证"来调用火山引擎 API,通过 config 路径配置:

vault write volcengine/config \
    access_key="AK..." \
    secret_key="SK..." \
    region="cn-beijing"

角色定义

角色决定了凭证的签发方式:

# STS 模式 — 指定 role_trn
vault write volcengine/role/readonly \
    role_trn="trn:iam::200000000:role/ReadOnlyRole"

# IAM 模式 — 指定策略
vault write volcengine/role/deploy \
    remote_policies="name:ReadOnlyAccess,type:System" \
    inline_policies='[{"Statement":[{"Effect":"Allow","Action":["ecs:*"],"Resource":["*"]}]}]' \
    ttl="2h" \
    max_ttl="24h"

凭证签发

vault read volcengine/creds/readonly
# 返回临时 AK/SK/Token,不可续期

vault read volcengine/creds/deploy
# 返回 IAM 用户 AK/SK,可续期,到期自动销毁

故障容错

IAM 凭证的创建过程涉及多个 API 调用(创建用户 → 创建策略 → 挂载策略 → 生成密钥),任何一步失败都会触发 defer 链逐步回滚,避免留下孤儿资源。

撤销时则采用 best-effort 策略:即使某个资源已被手动删除(返回 NotExist),也不会阻断整个回收流程。

技术栈

  • Go + HashiCorp Vault SDK
  • 火山引擎官方 Go SDK(volcengine-go-sdk)
  • STS 服务:AssumeRole
  • IAM 服务:User / Policy / AccessKey CRUD

使用方式

项目地址:https://github.com/Yullin/vault-plugin-secrets-volcengine

# 编译
make build

# 注册插件
vault plugin register \
    -sha256="$(shasum -a 256 vault/plugins/vault-plugin-secrets-volcengine | cut -d ' ' -f1)" \
    -command="vault-plugin-secrets-volcengine" \
    secret volcengine

# 启用
vault secrets enable -path=volcengine volcengine

总结

造这个轮子的过程其实挺顺畅的——火山引擎的 IAM/STS 体系和 AWS 高度相似,SDK 的设计风格也一脉相承,参考 vault-plugin-secrets-alicloud 的架构很容易就对接上了。

如果你也在用火山引擎并且有 Vault 体系,欢迎试用或贡献代码。