4. HashiCorp Vault基础
老实说,刚开始接触 Secrets 管理的时候,我也觉得「不就是存个密码嘛,用数据库也行啊」。直到有一次线上事故——员工离职后密钥明文散落在配置文件里,我们花了整整两天才完成轮换。那之后我才真正理解:企业级 Secrets 管理,核心不是存储,而是策略、审计和生命周期控制。
HashiCorp Vault 正是围绕这个理念设计的。这一章我把它的基础要点做个归纳,方便你快速回顾,也把自己踩过的坑标记出来。
4.1 核心概念速览
Vault 里最绕不开的几个概念,我用一个表格整理清楚。
| 概念 | 一句话说明 | 我的经验 |
|---|---|---|
| Secret | 需要被保护的数据:密码、、证书 | 别把 Secret 当普通字符串,Vault 有自动轮换能力 |
| Secret Engine | 产生或存储 Secret 的模块,比如 KV、PKI、Transit | 我常把 KV 当“静态保险箱”,Transit 当“加密处理器” |
| Auth Method | 客户端如何证明身份:、AppRole、LDAP 等 | 生产环境最常用的是 AppRole,因为无人工介入 |
| Policy | 基于路径的权限规则,决定谁可以读/写/删除 | Policy 是安全的基石——我见过太多人把 root 令牌发给应用程序 |
| Path | Vault 中的所有操作都是路径驱动的:secret/data/myapp | 路径命名一定要规范,不然三个月后你根本找不到对应的业务 |
一个小习惯:我每次创建新的 Secret Engine 后,第一件事就是写一条
deny * 的 Policy,再逐步开放。先锁死再开门,比先开放再补墙安全得多。
4.2 Vault 架构的关键层次
Vault 的架构说白了就三层:
- API 层:所有操作走 HTTP REST,客户端不需要关心后端是什么。
- 核心层:负责 Seal/Unseal、Policy 匹配、租约管理 —— 这是 Vault 的大脑。
- 存储层:Consul、Raft、文件系统等,只做持久化,不参与逻辑。
我常跟团队说一句话:Vault 本身是无状态的,状态全在存储后端里。所以备份存储后端比备份 Vault 二进制文件重要得多。
4.3 常用 Secret Engine 对比
我用得最多的三个 Engine,给大家列个对比表格,方便选型时一眼看准。
| Engine | 类型 | 典型场景 | 需要留意的地方 |
|---|---|---|---|
| KV v2 | 静态存储 | 数据库密码、第三方 | 版本管理需要定期清理旧版本,否则存储暴涨 |
| Transit | 加密即服务 | 对数据加密,但不存储密文 | 加密密钥轮换要提前规划,我在项目里吃过亏 |
| PKI | 动态证书 | 内部服务 TLS、短生命周期证书 | CA 根证书离线保存,千万别在线签发根证书 |
| Database | 动态凭据 | MySQL/PostgreSQL 动态用户 | 租约过期后连接池里的连接会失效,应用要做好重连 |
| AWS | 云凭据 | IAM User 动态生成 | 依赖云服务 IAM 角色绑定,需要先调整云侧权限 |
一个重要教训:KV v2 默认保留 10 个版本。我遇到过存储后端被旧版本塞满导致 Vault 无响应的情况。建议根据业务需求设置 max_versions = 2,除非你有合规审计需求。
4.4 部署模式简析
Vault 的部署模式就两种,简单讲一下区别。
- Dev 模式:
vault server -dev,自动 Unseal,内存存储,仅用于本地开发。千万别把它带上生产——我见过有人图省事直接把 Dev 模式怼到 demo 环境,结果重启后数据全丢。 - 生产模式:需要配置文件、手动 Seal/Unseal、外部存储后端。高可用(HA)一般用 Raft 或 Consul,多个节点组成集群。
说说 Unseal 的流程吧:生产启动后 Vault 处于 Seal 状态,必须凑够 Shamir 份额才能 Unseal。我个人习惯把份额数设置为 5 份,阈值设为 3。既能防单点丢失,又不会因为太多人缺席而无法解锁。
Seal/Unseal 的坑:我曾经在升级过程中忘记检查存储后端版本,导致所有节点 Unseal 后数据格式不兼容,回滚花了 4 小时。建议每次升级前先备份存储后端,并在测试环境完整演练一遍 Unseal 流程。
4.5 三条实用避坑指南
- 路径与 Policy 绑定要严格:Policy 是按 路径前缀 匹配的。写 Policy 时多留个心眼,别用
secret/*这种万能路径,否则一个微服务能读走所有数据。我习惯为每个应用创建独立的路径,比如secret/app-orders/。 - 生命周期管理:Vault 默认 永不过期(root 级别)。生产务必设置 TTL 和 Renew 策略。我常用
max_ttl = 72h,配合 short-lived 自动轮换。 - 审计日志必须开启:很多人觉得审计日志只是“事后追责”,其实它在排查故障时非常有用。比如你想知道某个 Secret 被谁读了几次,审计日志能直接告诉你。我建议至少开启 File 审计,并设置日志切割。
开源库优化:如果你是 Go 生态,推荐使用 hashicorp/vault/api 客户端库。它的自动续租和重试机制比我们自己写轮子靠谱得多。
嗯,以上就是 Vault 基础部分的核心归纳。我常跟团队说:Vault 不难学,难的是持续遵守纪律——路径规范、Policy 最小化、定期轮换密钥。把这些基础打牢,后面讲动态凭据和自动轮换时你就会轻松很多。