Appearance
Vault 详解:密钥管理
Spring Cloud Vault 是 HashiCorp Vault 的 Spring 集成,用于集中管理密钥、密码、证书等敏感信息。它解决了敏感配置在代码仓库中明文存储的安全问题,提供了加密存储、动态生成、访问审计等企业级安全能力。
一、为什么需要 Vault?
1.1 没有 Vault 的安全风险
yaml
# application.yml(明文存储敏感信息,极不安全)
spring:
datasource:
username: admin
password: MySecret123 # ← 明文密码在代码仓库中
redis:
password: RedisPass456 # ← 明文密码在代码仓库中
# 问题:
# 1. 密码明文存储在 Git 中,所有开发者都能看到
# 2. 密码泄露后无法追溯是谁泄露的
# 3. 密码轮换需要修改代码、重新部署
# 4. 无法动态管理数据库证书(如 MySQL 临时账号)1.2 有了 Vault 之后
┌──────────────────────────────────────────────────────────────────┐
│ Vault 密钥管理 │
│ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ Vault Server │ │
│ │ │ │
│ │ secret/application/datasource/username = admin │ │
│ │ secret/application/datasource/password = MySecret123 │ │
│ │ secret/application/redis/password = RedisPass456 │ │
│ │ │ │
│ │ 访问控制 + 审计日志 + 动态轮换 │ │
│ └────────────────────────────────────────────────────────────┘ │
│ ↑ │
│ │ AppRole Token 认证 │
│ │ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ order- │ │ user- │ │ inventory│ │
│ │ service │ │ service │ │ -service │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
│ application.yml 中不再有明文密码,只有 Vault 地址引用 │
└──────────────────────────────────────────────────────────────────┘二、核心概念
| 概念 | 说明 | 示例 |
|---|---|---|
| Secret | 秘密数据,键值对形式存储 | password=MySecret123 |
| Secret Engine | 秘密引擎,管理某一类秘密 | KV(键值)、Database(数据库)、PKI(证书) |
| KV Engine | 键值存储引擎,最常用 | secret/application 路径下的键值对 |
| Auth Method | 认证方式 | Token、AppRole、Kubernetes、AWS IAM |
| Policy | 访问策略,控制谁能读/写哪些秘密 | read "secret/application/*" |
| Lease | 租约,动态秘密有有效期 | 数据库临时凭证有效期 1 小时 |
三、快速上手
3.1 依赖
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-vault-config</artifactId>
</dependency>3.2 配置(bootstrap.yml)
yaml
spring:
application:
name: order-service
cloud:
vault:
host: localhost
port: 8200
scheme: http
authentication: TOKEN # 认证方式:TOKEN / APPROLE / KUBERNETES
token: s.xxxxxxxxxxxx # Vault Token
kv:
enabled: true
backend: secret # KV 引擎挂载路径
default-context: application # 默认上下文
application-name: order-service # 应用名称
fail-fast: true # 连接失败时快速失败3.3 配置路径映射
Vault 会自动按以下路径查找配置:
1. secret/application → 所有应用共享配置
2. secret/application/dev → 环境级共享配置
3. secret/order-service → 应用级配置
4. secret/order-service/dev → 应用+环境配置3.4 配置读取
yaml
# Vault 中存储:
# secret/order-service/dev
# datasource.username = admin
# datasource.password = MySecret123
# 应用代码中直接注入(与普通配置一样)
@Value("${datasource.username}")
private String username;
@Value("${datasource.password}")
private String password;四、动态数据库凭证
Vault 最强大的功能之一是动态生成数据库凭证:
yaml
# Vault 配置数据库引擎
# vault write database/config/mysql \
# plugin_name=mysql-database-plugin \
# connection_url="{{username}}:{{password}}@tcp/localhost:3306/" \
# allowed_roles="readonly" \
# username="root" \
# password="root"
# vault write database/roles/readonly \
# db_name=mysql \
# creation_statements="CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}'; GRANT SELECT ON *.* TO '{{name}}'@'%';" \
# default_ttl="1h" \
# max_ttl="24h"yaml
# 应用配置
spring:
cloud:
vault:
database:
enabled: true
role: readonly
backend: database每次应用启动时,Vault 自动创建临时数据库账号,1 小时后自动过期。无需手动管理密码。
五、Vault vs Config + 加密
| 维度 | Spring Cloud Config + 加密 | Vault |
|---|---|---|
| 加密存储 | 支持({cipher} 加密) | 支持(原生加密) |
| 动态凭证 | 不支持 | 支持(数据库临时账号) |
| 访问审计 | 无 | 完整的审计日志 |
| 访问控制 | 无 | 细粒度 Policy 控制 |
| 证书管理 | 不支持 | 支持(PKI Engine) |
| 密钥轮换 | 手动 | 自动(Lease 机制) |
| 部署复杂度 | 低(Config Server + Git) | 中(独立 Vault Server) |
| 适用场景 | 简单加密需求 | 企业级安全合规 |
选型建议:
配置加密需求简单 → Config + 加密
企业级安全合规(审计/轮换) → Vault
数据库凭证动态管理 → Vault(不可替代)
证书管理 → Vault(PKI Engine)六、面试要点
Q1:Vault 解决了什么问题?
解决敏感配置(密码、密钥、证书)的存储和管理问题。提供加密存储、访问控制、动态凭证生成、审计日志等企业级安全能力,避免明文密码在代码仓库中泄露。
Q2:Vault 的动态凭证是怎么实现的?
Vault 的 Database Secret Engine 可以在应用启动时动态创建临时数据库账号,凭证有租约(TTL),到期自动销毁。应用无需知道真实的数据库密码,每次获取的都是临时凭证。
Q3:Vault 和 Config 加密有什么区别?
Config 加密只能做静态加密存储,Vault 支持动态凭证生成、访问控制、审计日志、证书管理等更高级的安全功能。Config 适合简单场景,Vault 适合企业级安全合规需求。
Q4:Vault 的认证方式有哪些?
Token(最简单)、AppRole(应用角色,推荐)、Kubernetes(ServiceAccount 自动认证)、AWS IAM、LDAP 等。生产环境推荐 AppRole 或 Kubernetes 认证。
