第四讲:常见 Secrets 管理工具对比

聊到 Secrets 管理,市场上工具一大堆。我最早接触的还是 HashiCorp 的 Vault,后来在各种云厂里摸爬滚打。

你会发现,每个工具都有自己的脾气。有的适合裸金属,有的和自家云服务深度绑定。这篇文章我就带你走一遍四个最主流的选手:Vault、AWS Secrets Manager、Azure Key Vault、GCP Secret Manager。

我不是要背参数,而是把我在项目中踩过的坑、觉得好用的点,掰开揉碎讲给你听。

常见 Secrets 管理工具核心对比 Vault 开源 | 全平台 AWS Secrets Mgr 托管 | 深度集成 Azure Key Vault 托管 | Azure 生态 GCP Secret Mgr 托管 | 简洁易用 核心能力:动态 Secret | 自动轮转 | 细粒度审计 | 加密集成 • 动态 secret • 多 backend • 策略精细 • 运维成本高 • 自动轮转 RDS • 无服务器 • 细粒度 IAM • 供应商锁定 • 与 AAD 集成 • 支持托管标识 • 软删除保护 • 编排稍弱 • 版本管理好 • IAM 统一 • 透明加密 • 动态能力弱 选择建议 多云/混合云 → Vault | 深度 AWS → Secrets Manager Azure 环境 → Key Vault | GCP 原生 → Secret Manager

HashiCorp Vault:万金油的代价

说实话,Vault 是我个人最喜欢的一个。它不挑平台,你可以在物理机、虚拟机、K8s、甚至树莓派上跑。

核心特性:

  • 动态 Secret:可以生成临时数据库密码、临时 SSH 证书。用完即销毁。
  • 丰富的 Secret 引擎:K/V、数据库、SSH、PKI、Transit 加密,几乎覆盖所有场景。
  • 多后端存储:Consul、Raft、文件、Kubernetes CRD,按需选。
  • 审计日志:所有操作都可追溯,适合合规审计。

我记得有一次,客户要求数据库密码每 10 分钟轮换一次。用 Vault 的动态数据库引擎,配置好自己的角色和 TTL,之后就全自动了。应用里只配了 Lease ID,到期自动拉新的。

我个人的经验:

Vault 的灵活性是双刃剑。你配置得越灵活,就越容易出错。特别是它的策略系统(Policy),写过一次之后你会发现其他的 ACL 都太简单了。但运维压力也大——你不仅要管业务,还要管 Vault 本身的解封、备份、升级。

我曾经踩过的坑:

Vault 在自动解封模式下,如果你本地存储坏了,整个集群可能面临数据丢失。我建议用 Raft + 定期快照,并且解封密钥必须放在其他地方,比如 KMS 或硬件安全模块里。

AWS Secrets Manager:云原生的省心选择

说白了,如果你整个基础设施都在 AWS 上,那 Secrets Manager 就是默认选项。它没有 Vault 那种「可移植」的包袱,和 IAM、CloudTrail、Lambda 之间配合得天衣无缝。

能力 AWS Secrets Manager
自动轮转内置 RDS、Redshift、Aurora 轮转模板;也可自定义 Lambda
访问控制细粒度 IAM Policy + Resource-based Policy
审计集成 CloudTrail,记录所有 API 调用
加密使用 KMS 加密,默认 AWS 托管密钥
定价按 secret 数量 + API 调用次数计费,一般每月 0.40 美元/secret

为什么 AWS 能在众多工具中占据一席之地?因为它解决了「轮转」这个老大难。你想想看,每周手动改一次数据库密码就够烦了,它帮你自动做了,还跟 RDS 绑定得很好。我见过有团队直接拿 Secrets Manager 的轮转和 Lambda 或 Fargate 搭配,效果挺稳。

避坑指南:

我曾经遇到过 Secrets Manager 轮转失败导致应用断连的情况。后来发现是 Lambda 执行角色权限不够。建议在轮转脚本里加个检查:如果新密码写入失败,立刻回滚并用旧密码继续尝试,而不是直接报错。

Azure Key Vault:微软系的正确打开方式

在 Azure 生态里,Key Vault 的地位有点像 AWS 的 Secrets Manager。但它有一个杀手锏——托管标识(Managed Identity)。说白了就是 Azure 资源(比如 VM、App Service、Azure Functions)可以直接用标识去 Key Vault 获取密钥,连凭证都不用写。这个体验我认为比 AWS 的 IAM Role 还好用。

Azure Key Vault 还支持软删除和清除保护。我曾经手滑删了一个 secret,结果发现 90 天内还能恢复。这对于生产环境来说简直是救命稻草。

Azure 独有优势:

  • 和 Azure Active Directory 深度集成,不需要单独的用户/密码。
  • 支持 RBAC(和传统 access policy 并存)。
  • 软删除和清除保护默认开启,防止误删。
  • 支持 Key Vault Firewall + 服务端点,可以只允许特定 VNet 访问。

不过,Azure Key Vault 也有它的短板。怎么说呢,和 Vault 比起来,它的轮转能力比较「轻」。它不是不支持自动轮转,但不像 Vault 那样可以用动态引擎生成临时 ,更多是「换一个版本」。如果你需要像数据库动态密码那样的能力,就得自己写逻辑包装一下。

我在实际项目里的一种用法:

我用 Key Vault 存储 和连接字符串,和 Azure DevOps Pipeline 配合得挺好。Pipeline 里直接引用 keyvault 的变量组,不需要把 secrets 暴露在流水线变量里。

GCP Secret Manager:极简主义者的选择

坦白讲,GCP Secret Manager 是四个工具里最「轻」的。它的设计哲学和 GCP 其他产品一样——简单、直观、不做多余的事情。所以我个人认为它适合中小团队或者追求效率的项目。

能力 GCP Secret Manager
版本管理每个 secret 可保留多个版本,支持按版本号访问
自动加密使用 CMEK(客户管理加密密钥,可选)或默认 Google 托管密钥
访问控制通过 IAM 绑定 secret 或 secret 版本的角色
审计自动输出到 Cloud Audit Logs
轮转没有内置自动轮转,需配合 Cloud Scheduler + Cloud Functions

GCP 的版本管理体验不错。你想回到上一版?直接指定版本号就行。而且它的 SDK 极其简单,像下面这样就能读一个 secret:

# 用 gcloud 读取最新版本
gcloud secrets versions access latest --secret="my-"

# 用 Python SDK
from google.cloud import secretmanager
client = secretmanager.SecretManagerServiceClient()
name = f"projects/my-project/secrets/my-/versions/latest"
response = client.access_secret_version(request={"name": name})
payload = response.payload.data.decode("UTF-8")

嗯,这里要注意:GCP Secret Manager 没有内置的轮转触发器。我曾经在 GCP 上做过自动轮转,需要写 Cloud Functions + Cloud Scheduler 来模拟。虽然也能用,和多云的 Vault 比,就显得有点「自己动手丰衣足食」了。

说到底,怎么选?

四个工具我都接触过,说下我的真实感受:

  • 如果你在多云或混合云环境:Vault 没得跑。你不可能在 AWS 上用 Secrets Manager,同时在 Azure 上用 Key Vault,还要维护两套轮转脚本。Vault 可以提供统一的接口。
  • 如果你铁了心在 AWS 一套体系里:别折腾,Secrets Manager 足够用。它的轮转机制和 IAM 集成非常好,你不需要额外引入运维复杂度。
  • 如果你是 Azure 原生用户:Azure Key Vault 的 Managed Identity 真的舒服。你试试用 C#、PowerShell 或者 ARM 模板直接引用 KV,我保证你会觉得自家产品就是贴心。
  • 如果你追求简约和快速上线:GCP Secret Manager 的学习成本最小。API 只用几个方法,IAM 也统一,适合小团队或非核心业务。

一个我曾犯过的错误:

在一个多云项目里,我用 Vault 统一管所有 secret。但后来发现某个团队的 K8s 集群和 Vault 之间网络时延很高,导致应用启动慢。后来我在那个集群里装了一个 Vault Agent Injector,缓存了 secret,问题才解决。所以不管你用哪个工具,网络延迟和缓存策略一定要提前验证。

到这,你应该对四个主流工具有了一个清晰的轮廓。工具的选择没有银弹,最终还是看你的业务场景和团队能力。我个人建议:先用好你的云平台自带的工具,等发现明显瓶颈时再考虑引入 Vault 这样的通用方案。没必要一开始就给团队增加额外的学习成本和运维负担。