Secret Backends

  • AWS

  • Consul

  • RabbitMQ

  • Database

  • Multiple Databases

  • Secret Backend Implementations

  • PropertySource

  • VaultConfigurer :description: 此文档介绍了 Spring Cloud Vault 支持的多种方法,用于从各种后端秘密源获取秘密,包括:

    • 键值后端(版本化和非版本化)

    • Consul

    • RabbitMQ

    • AWS

    • 数据库后端(Cassandra、Couchbase、Elasticsearch、MongoDB、MySQL、PostgreSQL)

    • 发现的后端

    • 可自定义的后端(通过实施接口)

Key-Value Backend

Spring Cloud Vault 同时支持键值秘密后端,即版本化(v2)和非版本化(v1)。键值后端允许以键值存储的形式存储任意值。一个上下文可以存储一个或多个键值元组。上下文可以按层次组织。Spring Cloud Vault 本身确定秘密是否使用版本控制并将路径映射到其相应的 URL。Spring Cloud Vault 允许结合活动配置文件使用应用程序名称和默认上下文名称(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

活动配置文件由以下属性确定:

  • spring.cloud.vault.kv.profiles

  • spring.profiles.active

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

  • /secret/usefulapp

  • /secret/mysql1

  • /secret/projectx/aws

Spring Cloud Vault 将所有活动配置文件添加到可行上下文路径列表中。活动配置文件不会跳过访问具有配置文件名的上下文。

属性的显示方式与它们的存储方式相同(即没有其他前缀)。

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 重写应用程序名称,用于密钥-值后端

  • profiles 重写活动配置文件,用于密钥-值后端

  • profile-separator 用配置文件中带有配置文件的属性源将配置文件名与上下文分离

键值机密后端可在版本化 (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>{project-version}</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>{project-version}</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>{project-version}</version>
    </dependency>
</dependencies>

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

受支持的 AWS 凭证类型:

  • iam_user (Defaults)

  • 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)。默认为保管库角色指定的 TTL。最小/最大值也受 AWS 对 STS 支持的限制。

  • role-arn 如果为保管库角色配置了多个 IAM 角色,则设置在使用 assumed_role 时要承担的 IAM 角色。

Database backends

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>{project-version}</version>
    </dependency>
</dependencies>

启用多个 JDBC 兼容数据库会生成凭证并将其存储在默认情况下相同的属性键中,因此 JDBC 机密需要分别配置属性名称。

Database

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

虽然数据库后端是一个通用后端,但 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

Multiple Databases

有时,单个数据库的凭证还不够,因为应用程序可能连接到两个或更多同类数据库。从版本 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
  • &lt;name&gt; 数据库配置的描述性名称。

  • &lt;name&gt;.enabled 将此值设置为 true 可启用数据库后端配置使用

  • &lt;name&gt;.role 设置数据库角色定义的角色名称

  • &lt;name&gt;.backend 设置要使用的数据库挂载路径

  • &lt;name&gt;.username-property 设置存储数据库用户名属性的属性名称。请务必使用唯一的属性名称以避免属性阴影。

  • &lt;name&gt;.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 后端并将其装载为 mysql。对 spring.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-property` 和 spring.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 后端并将其装载为 postgresql。对 spring.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 密码的属性名称

Customize which secret backends to expose as PropertySource

Spring Cloud Vault 使用基于属性的配置为键值和已发现 secret 后端创建 PropertySource

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

SecretBackendMetadata 用于支持一个特定的 PropertySource

你可以注册一个 VaultConfigurer 以进行自定义。如果你提供了 VaultConfigurer,则禁用默认键值和发现后端的注册。但是,你可以使用 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()));

Custom Secret Backend Implementations

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.factories 是 Spring 提供的一个扩展机制,类似于 Java 的 ServiceLoader。