|
对于最新稳定版本,请使用 Spring Cloud Vault 5.0.1! |
秘密后端
Key-Value 后端
Spring Cloud Vault 支持 Key-Value 秘密后端,包括版本化(v2)和非版本化(v1)。
键值后端允许将任意值存储为键值存储。
一个上下文可以存储一个或多个键值对。
上下文可以按层次组织。
Spring Cloud Vault 会根据情况判断一个秘密是否使用版本化,并将路径映射到相应的 URL。
Spring Cloud Vault 允许使用应用程序名称和默认上下文名称(application)与活动的 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
profiles 通过以下属性确定:
-
spring.cloud.vault.kv.profiles -
spring.profiles.active
可以从键值后端的其他上下文中通过将它们的路径添加到应用程序名称,用逗号分隔来获取Secrets。
例如,给定应用程序名称 usefulapp,mysql1,projectx/aws,这些文件夹都会被使用:
-
/secret/usefulapp -
/secret/mysql1 -
/secret/projectx/aws
Spring Cloud Vault 会将所有活动的 profiles 添加到可能的 context 路径列表中。 如果没有活动的 profiles,将跳过访问带有 profile 名称的上下文。
属性以它们存储的方式暴露(即不带任何额外前缀)。
Spring Cloud Vault会在mount路径和实际上下文路径之间根据mount是否使用版本化的键值后端添加data/上下文。 |
spring.cloud.vault:
kv:
enabled: true
backend: secret
profile-separator: '/'
default-context: application
application-name: my-app
profiles: local, cloud
-
enabled将此值设置为false会禁用 secret 后端配置的使用 -
backend设置将使用的秘密挂载路径 -
default-context设置所有应用程序使用的上下文名称 -
application-name会覆盖用于键值后端的 应用名称 -
profiles重写了键值后端的活动配置文件 for use in the key-value backend -
profile-separator用于在具有 profiles 的属性源中将 profile 名称与 context 分开
| 键值秘密后端可以以版本化(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>4.3.1</version>
</dependency>
</dependencies>
该集成可以通过将
spring.cloud.vault.consul.enabled=true(默认值为 false) 并使用 spring.cloud.vault.consul.role=… 提供角色名称来启用。
The obtained token is stored in spring.cloud.consul.token
so using Spring Cloud Consul can pick up the generated credentials without further configuration.
You can configure the property name by setting 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 ACLTokens存储的属性名称
见 also: Vault 文档: 使用 Consul 配置 Vault
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>4.3.1</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密码
见 also: Vault 文档: 使用 Vault 配置 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>4.3.1</version>
</dependency>
</dependencies>
该集成可以通过将
spring.cloud.vault.aws=true(默认值为 false) 并使用 spring.cloud.vault.aws.role=… 提供角色名称来启用。
支持的 AWS 凭证类型:
-
iam_user(默认值)
-
假设的角色 (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安全Tokens,可以通过设置spring.cloud.vault.aws.session-token-key-property来配置属性名称。安全Tokens存储在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 安全Tokens的属性名称。 -
credential-type将为此后端设置要使用的 AWS 凭证类型。默认值为iam_user -
ttl设置使用assumed_role或federation_token时的STSTokensTTL。默认值为由vault角色指定的TTL。最小/最大值也受限于AWS对STS的支持。 -
role-arn设置在使用assumed_role时,若为 vault 角色配置了多个 IAM 角色需要假设的,则要假设的 IAM 角色。
见 also: Vault 文档: 使用 Vault 配置 AWS
数据库后端
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>4.3.1</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.*命名空间下配置多个数据库秘密后端。
配置可接受多个数据库后端,用于将凭据材料化到指定的属性中。请确保适当配置 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 中 Database 角色的 max_ttl 设置为 24h,这意味着在应用程序启动后24小时,它将无法再与数据库进行身份验证。 |
Apache Cassandra
The 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.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
-
enabledsetting this value totrueenables the Couchbase backend config usage -
role设置 Couchbase 角色定义的角色名称 -
backendsets the path of the Couchbase mount to use -
username-property设置属性名,用于存储 Couchbase 的用户名 -
password-property设置Couchbase密码存储的属性名称
见 also: 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"0" 设置Elasticsearch用户名存储的属性名称 -
password-property设置Elasticsearch密码存储的属性名称
MongoDB
The 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.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 密码
见 also: Vault 文档: 使用 Vault 配置 MongoDB
MySQL
The 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.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密码
见 also: Vault 文档: 使用 Vault 设置 MySQL
PostgreSQL
The 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.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 使用基于属性的配置为键值和发现的密后端创建 PropertySources。
发现的后端提供VaultSecretBackendDescriptor个豆以描述使用秘密后端的配置状态为PropertySource。
一个SecretBackendMetadataFactory是创建SecretBackendMetadata对象所必需的,该对象包含路径、名称和属性转换配置。
SecretBackendMetadata用于支持特定的PropertySource。
你可以为自定义设置注册一个VaultConfigurer。
如果你提供一个VaultConfigurer,则默认的键值和后端发现的注册将被禁用。
不过你也可以通过SecretBackendConfigurer.registerDefaultKeyValueSecretBackends()和SecretBackendConfigurer.registerDefaultDiscoveredSecretBackends()启用默认注册。
public class MyConfigurer 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.addBootstrapRegistryInitializer(VaultBootstrapper.fromConfigurer(new MyConfigurer()));
自定义 Secret 后端实现
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。