秘密后端

Key-Value 后端

Spring Cloud Vault 支持 Key-Value 秘密后端,包括版本化(v2)和非版本化(v1)。Key-Value 后端允许将任意值存储为键值对。单个上下文可以存储一个或多个键值元组。上下文可以分层组织。Spring Cloud Vault 会自行确定秘密是否使用版本控制,并将路径映射到其相应的 URL。Spring Cloud Vault 允许结合活跃的 Profile 使用应用名称和默认上下文名称(application)。

/secret/{application}/{profile}
/secret/{application}
/secret/{default-context}/{profile}
/secret/{default-context}

应用名称由以下属性确定:

  • spring.cloud.vault.kv.application-name

  • spring.cloud.vault.application-name

  • spring.application.name

Profile 由以下属性确定:

  • spring.cloud.vault.kv.profiles

  • spring.profiles.active

通过将秘密后端中的其他上下文路径添加到应用名称(用逗号分隔),可以从这些上下文获取秘密。例如,给定应用名称 usefulapp,mysql1,projectx/aws,将使用以下每个文件夹:

  • /secret/usefulapp

  • /secret/mysql1

  • /secret/projectx/aws

Spring Cloud Vault 会将所有活跃的 Profile 添加到可能的上下文路径列表中。没有活跃 Profile 时,将跳过访问具有 Profile 名称的上下文。

属性按存储方式暴露(即不带额外的 J 前缀)。

根据挂载是否使用版本化的 Key-Value 后端,Spring Cloud Vault 会在挂载路径和实际上下文路径之间添加 data/ 上下文。
spring.cloud.vault:
    kv:
        enabled: true
        backend: secret
        profile-separator: '/'
        default-context: application
        application-name: my-app
        profiles: local, cloud
  • enabled 将此值设置为 false 可禁用秘密后端配置的使用

  • backend 设置要使用的秘密挂载路径

  • default-context 设置所有应用使用的上下文名称

  • application-name 覆盖 Key-Value 后端使用的应用名称

  • profiles 覆盖 Key-Value 后端使用的活跃 Profile

  • profile-separator 在带有 Profile 的属性源中分隔 Profile 名称和上下文

Key-Value 秘密后端可以在版本化(v2)和非版本化(v1)模式下运行。

参阅

Consul

Spring Cloud Vault 可以获取 HashiCorp Consul 的凭据。Consul 集成需要 spring-cloud-vault-config-consul 依赖。

pom.xml
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-vault-config-consul</artifactId>
        <version>4.2.1</version>
    </dependency>
</dependencies>

通过设置 spring.cloud.vault.consul.enabled=true(默认为 false)并提供角色名称 spring.cloud.vault.consul.role=… 可以启用集成。

获取到的令牌存储在 spring.cloud.consul.token 中,因此使用 Spring Cloud Consul 可以无需进一步配置即可获取生成的凭据。您可以通过设置 spring.cloud.vault.consul.token-property 来配置属性名称。

spring.cloud.vault:
    consul:
        enabled: true
        role: readonly
        backend: consul
        token-property: spring.cloud.consul.token
  • enabled 将此值设置为 true 可启用 Consul 后端配置的使用

  • role 设置 Consul 角色定义的角色名称

  • backend 设置要使用的 Consul 挂载路径

  • token-property 设置存储 Consul ACL 令牌的属性名称

RabbitMQ

Spring Cloud Vault 可以获取 RabbitMQ 的凭据。

RabbitMQ 集成需要 spring-cloud-vault-config-rabbitmq 依赖。

pom.xml
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-vault-config-rabbitmq</artifactId>
        <version>4.2.1</version>
    </dependency>
</dependencies>

通过设置 spring.cloud.vault.rabbitmq.enabled=true(默认为 false)并提供角色名称 spring.cloud.vault.rabbitmq.role=… 可以启用集成。

用户名和密码存储在 spring.rabbitmq.usernamespring.rabbitmq.password 中,因此使用 Spring Boot 可以无需进一步配置即可获取生成的凭据。您可以通过设置 spring.cloud.vault.rabbitmq.username-propertyspring.cloud.vault.rabbitmq.password-property 来配置属性名称。

spring.cloud.vault:
    rabbitmq:
        enabled: true
        role: readonly
        backend: rabbitmq
        username-property: spring.rabbitmq.username
        password-property: spring.rabbitmq.password
  • enabled 将此值设置为 true 可启用 RabbitMQ 后端配置的使用

  • role 设置 RabbitMQ 角色定义的角色名称

  • backend 设置要使用的 RabbitMQ 挂载路径

  • username-property 设置存储 RabbitMQ 用户名的属性名称

  • password-property 设置存储 RabbitMQ 密码的属性名称

AWS

Spring Cloud Vault 可以获取 AWS 的凭据。

AWS 集成需要 spring-cloud-vault-config-aws 依赖。

pom.xml
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-vault-config-aws</artifactId>
        <version>4.2.1</version>
    </dependency>
</dependencies>

通过设置 spring.cloud.vault.aws=true(默认为 false)并提供角色名称 spring.cloud.vault.aws.role=… 可以启用集成。

支持的 AWS 凭据类型

  • iam_user(默认)

  • assumed_role (STS)

  • federation_token (STS)

访问密钥和秘密密钥存储在 cloud.aws.credentials.accessKeycloud.aws.credentials.secretKey 中。因此使用 Spring Cloud AWS 可以无需进一步配置即可获取生成的凭据。

您可以通过设置 spring.cloud.vault.aws.access-key-propertyspring.cloud.vault.aws.secret-key-property 来配置属性名称。

对于 STS 安全令牌,您可以通过设置 spring.cloud.vault.aws.session-token-key-property 来配置属性名称。安全令牌存储在 cloud.aws.credentials.sessionToken 下(默认)。

示例:iam_user

spring.cloud.vault:
    aws:
        enabled: true
        role: readonly
        backend: aws
        access-key-property: cloud.aws.credentials.accessKey
        secret-key-property: cloud.aws.credentials.secretKey

示例:assumed_role (STS)

spring.cloud.vault:
    aws:
        enabled: true
        role: sts-vault-role
        backend: aws
        credential-type: assumed_role
        access-key-property: cloud.aws.credentials.accessKey
        secret-key-property: cloud.aws.credentials.secretKey
        session-token-key-property: cloud.aws.credentials.sessionToken
        ttl: 3600s
        role-arn: arn:aws:iam::${AWS_ACCOUNT}:role/sts-app-role
  • enabled 将此值设置为 true 可启用 AWS 后端配置的使用

  • role 设置 AWS 角色定义的角色名称

  • backend 设置要使用的 AWS 挂载路径

  • access-key-property 设置存储 AWS 访问密钥的属性名称

  • secret-key-property 设置存储 AWS 秘密密钥的属性名称

  • session-token-key-property 设置存储 AWS STS 安全令牌的属性名称。

  • credential-type 设置此后端使用的 AWS 凭据类型。默认为 iam_user

  • ttl 当使用 assumed_rolefederation_token 时,设置 STS 令牌的 TTL。默认为 Vault 角色指定的 TTL。最小/最大值也受 AWS 对 STS 的支持限制。

  • role-arn 当使用 assumed_role 且 Vault 角色配置了多个 IAM 角色时,设置要承担的 IAM 角色。

数据库后端

Vault 支持多种数据库秘密后端,用于根据配置的角色动态生成数据库凭据。这意味着需要访问数据库的服务不再需要配置凭据:它们可以从 Vault 请求凭据,并使用 Vault 的租约机制更轻松地滚动密钥。

Spring Cloud Vault 集成了以下后端:

使用数据库秘密后端需要在配置中启用后端并添加 spring-cloud-vault-config-databases 依赖。

Vault 自 0.7.1 版本起自带一个专用的 database 秘密后端,允许通过插件进行数据库集成。您可以通过使用通用数据库后端来使用该特定后端。请确保指定适当的后端路径,例如 spring.cloud.vault.mysql.role.backend=database

pom.xml
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-vault-config-databases</artifactId>
        <version>4.2.1</version>
    </dependency>
</dependencies>
启用多个兼容 JDBC 的数据库将生成凭据,并默认存储在相同的属性键中,因此 JDBC 秘密的属性名称需要单独配置。

Database

Spring Cloud Vault 可以获取 www.vaultproject.io/api/secret/databases/index.html 中列出的任何数据库的凭据。通过设置 spring.cloud.vault.database.enabled=true(默认为 false)并提供角色名称 spring.cloud.vault.database.role=… 可以启用集成。

虽然 database 后端是通用的,但 spring.cloud.vault.database 特别针对 JDBC 数据库。用户名和密码可通过 spring.datasource.usernamespring.datasource.password 属性获取,因此使用 Spring Boot 可以无需进一步配置即可为您的 DataSource 获取生成的凭据。您可以通过设置 spring.cloud.vault.database.username-propertyspring.cloud.vault.database.password-property 来配置属性名称。

spring.cloud.vault:
    database:
        enabled: true
        role: readonly
        backend: database
        username-property: spring.datasource.username
        password-property: spring.datasource.password

多个数据库

有时,单个数据库的凭据不足,因为一个应用可能连接到两个或更多相同类型的数据库。从 3.0.5 版本开始,Spring Vault 支持在 spring.cloud.vault.databases.* 命名空间下配置多个数据库秘密后端。

该配置接受多个数据库后端,将凭据具体化到指定的属性中。请确保适当地配置 username-propertypassword-property

spring.cloud.vault:
    databases:
        primary:
            enabled: true
            role: readwrite
            backend: database
            username-property: spring.primary-datasource.username
            password-property: spring.primary-datasource.password
        other-database:
            enabled: true
            role: readonly
            backend: database
            username-property: spring.secondary-datasource.username
            password-property: spring.secondary-datasource.password
  • <name> 数据库配置的描述性名称。

  • <name>.enabled 将此值设置为 true 可启用数据库后端配置的使用

  • <name>.role 设置数据库角色定义的角色名称

  • <name>.backend 设置要使用的数据库挂载路径

  • <name>.username-property 设置存储数据库用户名的属性名称。请确保使用唯一的属性名称以避免属性覆盖。

  • <name>.password-property 设置存储数据库密码的属性名称。请确保使用唯一的属性名称以避免属性覆盖。

Spring Cloud Vault 不支持在达到最大租约时间时获取新凭据并使用它们配置您的 DataSource。也就是说,如果 Vault 中数据库角色的 max_ttl 设置为 24h,这意味着您的应用启动 24 小时后将无法再使用数据库进行认证。

Apache Cassandra

cassandra 后端在 Vault 0.7.1 中已弃用,建议使用 database 后端并将其挂载为 cassandra

Spring Cloud Vault 可以获取 Apache Cassandra 的凭据。通过设置 spring.cloud.vault.cassandra.enabled=true(默认为 false)并提供角色名称 spring.cloud.vault.cassandra.role=… 可以启用集成。

用户名和密码可通过 spring.data.cassandra.usernamespring.data.cassandra.password 属性获取,因此使用 Spring Boot 可以无需进一步配置即可获取生成的凭据。您可以通过设置 spring.cloud.vault.cassandra.username-propertyspring.cloud.vault.cassandra.password-property 来配置属性名称。

spring.cloud.vault:
    cassandra:
        enabled: true
        role: readonly
        backend: cassandra
        username-property: spring.data.cassandra.username
        password-property: spring.data.cassandra.password
  • enabled 将此值设置为 true 可启用 Cassandra 后端配置的使用

  • role 设置 Cassandra 角色定义的角色名称

  • backend 设置要使用的 Cassandra 挂载路径

  • username-property 设置存储 Cassandra 用户名的属性名称

  • password-property 设置存储 Cassandra 密码的属性名称

Couchbase Database

Spring Cloud Vault 可以获取 Couchbase 的凭据。通过设置 spring.cloud.vault.couchbase.enabled=true(默认为 false)并提供角色名称 spring.cloud.vault.couchbase.role=… 可以启用集成。

用户名和密码可通过 spring.couchbase.usernamespring.couchbase.password 属性获取,因此使用 Spring Boot 可以无需进一步配置即可获取生成的凭据。您可以通过设置 spring.cloud.vault.couchbase.username-propertyspring.cloud.vault.couchbase.password-property 来配置属性名称。

spring.cloud.vault:
    couchbase:
        enabled: true
        role: readonly
        backend: database
        username-property: spring.couchbase.username
        password-property: spring.couchbase.password
  • enabled 将此值设置为 true 可启用 Couchbase 后端配置的使用

  • role 设置 Couchbase 角色定义的角色名称

  • backend 设置要使用的 Couchbase 挂载路径

  • username-property 设置存储 Couchbase 用户名的属性名称

  • password-property 设置存储 Couchbase 密码的属性名称

Elasticsearch

Spring Cloud Vault 可以自 3.0 版本起获取 Elasticsearch 的凭据。通过设置 spring.cloud.vault.elasticsearch.enabled=true(默认为 false)并提供角色名称 spring.cloud.vault.elasticsearch.role=… 可以启用集成。

用户名和密码可通过 spring.elasticsearch.rest.usernamespring.elasticsearch.rest.password 属性获取,因此使用 Spring Boot 可以无需进一步配置即可获取生成的凭据。您可以通过设置 spring.cloud.vault.elasticsearch.username-propertyspring.cloud.vault.elasticsearch.password-property 来配置属性名称。

spring.cloud.vault:
    elasticsearch:
        enabled: true
        role: readonly
        backend: mongodb
        username-property: spring.elasticsearch.rest.username
        password-property: spring.elasticsearch.rest.password
  • enabled 将此值设置为 true 可启用 Elasticsearch 数据库后端配置的使用

  • role 设置 Elasticsearch 角色定义的角色名称

  • backend 设置要使用的 Elasticsearch 挂载路径

  • username-property 设置存储 Elasticsearch 用户名的属性名称

  • password-property 设置存储 Elasticsearch 密码的属性名称

MongoDB

mongodb 后端在 Vault 0.7.1 中已弃用,建议使用 database 后端并将其挂载为 mongodb

Spring Cloud Vault 可以获取 MongoDB 的凭据。通过设置 spring.cloud.vault.mongodb.enabled=true(默认为 false)并提供角色名称 spring.cloud.vault.mongodb.role=… 可以启用集成。

用户名和密码存储在 spring.data.mongodb.usernamespring.data.mongodb.password 中,因此使用 Spring Boot 可以无需进一步配置即可获取生成的凭据。您可以通过设置 spring.cloud.vault.mongodb.username-propertyspring.cloud.vault.mongodb.password-property 来配置属性名称。

spring.cloud.vault:
    mongodb:
        enabled: true
        role: readonly
        backend: mongodb
        username-property: spring.data.mongodb.username
        password-property: spring.data.mongodb.password
  • enabled 将此值设置为 true 可启用 MongoDB 后端配置的使用

  • role 设置 MongoDB 角色定义的角色名称

  • backend 设置要使用的 MongoDB 挂载路径

  • username-property 设置存储 MongoDB 用户名的属性名称

  • password-property 设置存储 MongoDB 密码的属性名称

MySQL

mysql 后端在 Vault 0.7.1 中已弃用,建议使用 database 后端并将其挂载为 mysqlspring.cloud.vault.mysql 的配置将在未来的版本中移除。

Spring Cloud Vault 可以获取 MySQL 的凭据。通过设置 spring.cloud.vault.mysql.enabled=true(默认为 false)并提供角色名称 spring.cloud.vault.mysql.role=… 可以启用集成。

用户名和密码可通过 spring.datasource.usernamespring.datasource.password 属性获取,因此使用 Spring Boot 可以无需进一步配置即可获取生成的凭据。您可以通过设置 spring.cloud.vault.mysql.username-propertyspring.cloud.vault.mysql.password-property 来配置属性名称。

spring.cloud.vault:
    mysql:
        enabled: true
        role: readonly
        backend: mysql
        username-property: spring.datasource.username
        password-property: spring.datasource.password
  • enabled 将此值设置为 true 可启用 MySQL 后端配置的使用

  • role 设置 MySQL 角色定义的角色名称

  • backend 设置要使用的 MySQL 挂载路径

  • username-property 设置存储 MySQL 用户名的属性名称

  • password-property 设置存储 MySQL 密码的属性名称

PostgreSQL

postgresql 后端在 Vault 0.7.1 中已弃用,建议使用 database 后端并将其挂载为 postgresqlspring.cloud.vault.postgresql 的配置将在未来的版本中移除。

Spring Cloud Vault 可以获取 PostgreSQL 的凭据。通过设置 spring.cloud.vault.postgresql.enabled=true(默认为 false)并提供角色名称 spring.cloud.vault.postgresql.role=… 可以启用集成。

用户名和密码可通过 spring.datasource.usernamespring.datasource.password 属性获取,因此使用 Spring Boot 可以无需进一步配置即可获取生成的凭据。您可以通过设置 spring.cloud.vault.postgresql.username-propertyspring.cloud.vault.postgresql.password-property 来配置属性名称。

spring.cloud.vault:
    postgresql:
        enabled: true
        role: readonly
        backend: postgresql
        username-property: spring.datasource.username
        password-property: spring.datasource.password
  • enabled 将此值设置为 true 可启用 PostgreSQL 后端配置的使用

  • role 设置 PostgreSQL 角色定义的角色名称

  • backend 设置要使用的 PostgreSQL 挂载路径

  • username-property 设置存储 PostgreSQL 用户名的属性名称

  • password-property 设置存储 PostgreSQL 密码的属性名称

定制哪些秘密后端暴露为 PropertySource

Spring Cloud Vault 使用基于属性的配置来为 Key-Value 和发现的秘密后端创建 PropertySource

发现的后端提供 VaultSecretBackendDescriptor Bean,用于描述将秘密后端用作 PropertySource 的配置状态。需要一个 SecretBackendMetadataFactory 来创建 SecretBackendMetadata 对象,该对象包含路径、名称和属性转换配置。

SecretBackendMetadata 用于支持特定的 PropertySource

您可以注册一个 VaultConfigurer 进行定制。如果提供了 VaultConfigurer,则默认的 Key-Value 和发现的后端注册将被禁用。但是,您可以通过 SecretBackendConfigurer.registerDefaultKeyValueSecretBackends()SecretBackendConfigurer.registerDefaultDiscoveredSecretBackends() 启用默认注册。

public class CustomizationBean implements VaultConfigurer {

    @Override
    public void addSecretBackends(SecretBackendConfigurer configurer) {

        configurer.add("secret/my-application");

        configurer.registerDefaultKeyValueSecretBackends(false);
        configurer.registerDefaultDiscoveredSecretBackends(true);
    }
}
SpringApplication application = new SpringApplication(MyApplication.class);
application.addBootstrapper(VaultBootstrapper.fromConfigurer(new CustomizationBean()));

自定义秘密后端实现

Spring Cloud Vault 提供了对最常见后端集成的秘密后端支持。您可以通过提供一个实现来集成任何类型的后端,该实现描述了如何从要使用的后端获取数据,以及如何通过提供 PropertyTransformer 来呈现该后端提供的数据。

添加自定义后端实现需要实现两个接口:

  • org.springframework.cloud.vault.config.VaultSecretBackendDescriptor

  • org.springframework.cloud.vault.config.SecretBackendMetadataFactory

VaultSecretBackendDescriptor 通常是一个持有配置数据的对象,例如 VaultDatabaseProperties。Spring Cloud Vault 要求您的类型使用 @ConfigurationProperties 注解,以便从配置中实例化类。

SecretBackendMetadataFactory 接受 VaultSecretBackendDescriptor 来创建实际的 SecretBackendMetadata 对象,该对象持有您的 Vault 服务器内的上下文路径、解析参数化上下文路径所需的任何路径变量以及 PropertyTransformer

VaultSecretBackendDescriptorSecretBackendMetadataFactory 类型都必须注册在 spring.factories 中,这是 Spring 提供的一种扩展机制,类似于 Java 的 ServiceLoader。