Skip to content

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 认证。