第四讲:常见 Secrets 管理工具对比
聊到 Secrets 管理,市场上工具一大堆。我最早接触的还是 HashiCorp 的 Vault,后来在各种云厂里摸爬滚打。
你会发现,每个工具都有自己的脾气。有的适合裸金属,有的和自家云服务深度绑定。这篇文章我就带你走一遍四个最主流的选手: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 这样的通用方案。没必要一开始就给团队增加额外的学习成本和运维负担。