此版本仍在开发中,尚未被视为稳定版本。如需最新的稳定版本,请使用 Spring Cloud Vault 4.1.4! |
秘密后端
键值后端
Spring Cloud Vault 支持键值秘密后端,即版本化 (v2) 和未版本化 (v1)。
键值后端允许将任意值存储为键值存储。
单个上下文可以存储一个或多个键值元组。
上下文可以按层次结构进行组织。
Spring Cloud Vault 会自行确定秘密是否正在使用版本控制,并将路径映射到其相应的 URL。
Spring Cloud Vault 允许使用应用程序名称和默认上下文名称 (application
) 与 Active Profiles 结合使用。
/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
可以通过将 Secret 的路径添加到应用程序名称(以逗号分隔)来从 key-value backend 中的其他上下文中获取。
例如,给定应用程序名称usefulapp,mysql1,projectx/aws
,将使用以下每个文件夹:
-
/secret/usefulapp
-
/secret/mysql1
-
/secret/projectx/aws
Spring Cloud Vault 将所有活动配置文件添加到可能的上下文路径列表中。 任何活动配置文件都不会跳过访问具有配置文件名称的上下文。
属性的公开方式与存储时一样(即没有额外的前缀)。
Spring Cloud Vault 将data/ context 之间的 context,具体取决于挂载是否使用版本控制的键值后端。 |
spring.cloud.vault:
kv:
enabled: true
backend: secret
profile-separator: '/'
default-context: application
application-name: my-app
profiles: local, cloud
-
enabled
将此值设置为false
禁用 secret 后端配置使用 -
backend
设置要使用的 secret 挂载的路径 -
default-context
设置所有应用程序使用的上下文名称 -
application-name
覆盖应用程序名称以在 key-value 后端中使用 -
profiles
覆盖活动配置文件以在 key-value 后端中使用 -
profile-separator
使用 Profiles 将 Profile 名称与 Property Sources 中的上下文分开
键值密钥后端可以在版本控制 (v2) 和非版本控制 (v1) 模式下运行。 |
另请参阅:
领事
Spring Cloud Vault 可以获取 HashiCorp Consul 的凭据。
Consul 集成需要spring-cloud-vault-config-consul
Dependency。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-vault-config-consul</artifactId>
<version>4.2.0-RC1</version>
</dependency>
</dependencies>
可以通过设置spring.cloud.vault.consul.enabled=true
(默认false
) 并为角色名称提供spring.cloud.vault.consul.role=…
.
获取的 Token 存储在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
Dependency。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-vault-config-rabbitmq</artifactId>
<version>4.2.0-RC1</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
Dependency。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-vault-config-aws</artifactId>
<version>4.2.0-RC1</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.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 Secret Key 的属性名称 -
session-token-key-property
设置存储 AWS STS 安全令牌的属性名称。 -
credential-type
设置用于此后端的 AWS 凭证类型。默认为iam_user
-
ttl
使用assumed_role
或federation_token
.默认为 vault 角色指定的 ttl。最小值/最大值也仅限于 AWS 对 STS 的支持值。 -
role-arn
如果在使用assumed_role
.
数据库后端
Vault 支持多个数据库密钥后端,以根据配置的角色动态生成数据库凭证。 这意味着需要访问数据库的服务不再需要配置凭证:它们可以从 Vault 请求凭证,并使用 Vault 的租赁机制更轻松地滚动密钥。
Spring Cloud Vault 与以下后端集成:
使用数据库密钥后端需要在配置中启用后端,并且spring-cloud-vault-config-databases
Dependency。
Vault 从 0.7.1 开始提供专用的database
允许通过插件集成数据库的 secret 后端。
您可以通过使用通用数据库后端来使用该特定后端。
确保指定适当的后端路径,例如spring.cloud.vault.mysql.role.backend=database
.
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-vault-config-databases</artifactId>
<version>4.2.0-RC1</version>
</dependency>
</dependencies>
启用多个符合 JDBC 标准的数据库将生成凭据,并默认将其存储在相同的属性键中,因此需要单独配置 JDBC 密钥的属性名称。 |
数据库
Spring Cloud Vault 可以获取 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
多个数据库
有时,单个数据库的凭据是不够的,因为应用程序可能会连接到两个或多个相同类型的数据库。
从版本 3.0.5 开始, Spring Vault 支持在spring.cloud.vault.databases.*
Namespace。
该配置接受多个数据库后端,以将凭证具体化到指定的属性中。确保配置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
设置要使用的 Database mount 的路径 -
<name>.username-property
设置存储 Database username 的属性名称。确保使用唯一的属性名称以避免属性阴影。 -
<name>.password-property
设置存储 Database 口令的属性名称 确保使用唯一的属性名称以避免属性阴影。
Spring Cloud Vault 不支持获取新凭证和配置DataSource 当达到 Maximum lease time 时与他们一起使用。
也就是说,如果max_ttl 的 Database 角色设置为24h 这意味着在应用程序启动 24 小时后,它将无法再向数据库进行身份验证。 |
Apache Cassandra
这cassandra backend 在 Vault 0.7.1 中已被弃用,建议使用database backend 并将其挂载为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 数据库
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 密码的属性名称
另请参阅: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 数据库
这mongodb backend 在 Vault 0.7.1 中已被弃用,建议使用database backend 并将其挂载为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 (MySQL的
这mysql backend 在 Vault 0.7.1 中已被弃用,建议使用database backend 并将其挂载为mysql .
配置spring.cloud.vault.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 数据库
这postgresql backend 在 Vault 0.7.1 中已被弃用,建议使用database backend 并将其挂载为postgresql .
配置spring.cloud.vault.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 密码的属性名称
自定义要作为 PropertySource 公开的 secret 后端
Spring Cloud Vault 使用基于属性的配置来创建PropertySource
s 用于键值和发现的 secret 后端。
发现的后端提供VaultSecretBackendDescriptor
bean 来描述使用 secret backend 的配置状态PropertySource
.
一个SecretBackendMetadataFactory
需要创建SecretBackendMetadata
object,其中包含 path、name 和 property 转换配置。
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()));
自定义密钥后端实现
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
object 中保存 Vault 服务器中的上下文路径、解析参数化上下文路径所需的任何 path 变量以及PropertyTransformer
.
双VaultSecretBackendDescriptor
和SecretBackendMetadataFactory
类型必须在spring.factories
这是 Spring 提供的一种扩展机制,类似于 Java 的 ServiceLoader。