Secret Backends
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 会在装载路径和实际上下文路径之间添加 |
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。
<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。
<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.username 和 spring.rabbitmq.password 中,因此使用 Spring Boot 无需进一步配置即可获取生成的凭证。你可以通过设置 spring.cloud.vault.rabbitmq.username-property 和 spring.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 依赖项。
<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.accessKey 和 cloud.aws.credentials.secretKey 中。因此,使用 Spring Cloud AWS 无需进一步配置即可获取生成的凭证。
你可以通过设置 spring.cloud.vault.aws.access-key-property 和 spring.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_role或federation_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。
<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.username 和 spring.datasource.password 属性获取,因此无需进一步配置,使用 Spring Boot 即可获取为 DataSource 生成的凭证。你可以通过设置 spring.cloud.vault.database.username-property 和 spring.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-property 和 password-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
|
|
Spring Cloud Vault 可以获取 Apache Cassandra 的凭据。可以通过设置`spring.cloud.vault.cassandra.enabled=true`(默认值为 false)并使用 spring.cloud.vault.cassandra.role=… 提供角色名来启用集成。
用户名和密码可以从 spring.data.cassandra.username 和 spring.data.cassandra.password 属性中获得,因此使用 Spring Boot 可以在不进行进一步配置的情况下获取生成的凭据。可以通过设置 spring.cloud.vault.cassandra.username-property 和 spring.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.username 和 spring.couchbase.password 属性中获得,因此使用 Spring Boot 可以在不进行进一步配置的情况下获取生成的凭据。可以通过设置 spring.cloud.vault.couchbase.username-property 和 spring.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.username 和 spring.elasticsearch.rest.password 属性中获得,因此使用 Spring Boot 可以在不进行进一步配置的情况下获取生成的凭据。可以通过设置 spring.cloud.vault.elasticsearch.username-property 和 spring.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
|
|
Spring Cloud Vault 可以获取 MongoDB 的凭据。可以通过设置`spring.cloud.vault.mongodb.enabled=true`(默认值为 false)并使用 spring.cloud.vault.mongodb.role=… 提供角色名来启用集成。
用户名和密码存储在 spring.data.mongodb.username 和 spring.data.mongodb.password 中,因此使用 Spring Boot 可以在不进行进一步配置的情况下获取生成的凭据。可以通过设置 spring.cloud.vault.mongodb.username-property 和 spring.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
|
|
Spring Cloud Vault 可以获取 MySQL 的凭据。可以通过设置`spring.cloud.vault.mysql.enabled=true`(默认值为 false)并使用 spring.cloud.vault.mysql.role=… 提供角色名来启用集成。
用户名和密码可以从 spring.datasource.username 和 spring.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
|
|
Spring Cloud Vault 可以获取 PostgreSQL 的凭据。可以通过设置 spring.cloud.vault.postgresql.enabled=true(默认值为 false)并使用 spring.cloud.vault.postgresql.role=… 提供角色名来启用集成。
用户名和密码可以从 spring.datasource.username 和 spring.datasource.password 属性中获得,因此使用 Spring Boot 可以在不进行进一步配置的情况下获取生成的凭据。可以通过设置 spring.cloud.vault.postgresql.username-property 和 spring.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。
VaultSecretBackendDescriptor 和 SecretBackendMetadataFactory 类型都必须在 spring.factories 中注册,spring.factories 是 Spring 提供的一个扩展机制,类似于 Java 的 ServiceLoader。