属性源
Vault 可以用在许多不同的场景中。其中一个具体的用例是使用 Vault 来存储加密属性。Spring Vault 支持 Vault 作为属性源,使用 Spring 的 PropertySource 抽象 来获取配置属性。
您可以引用存储在 Vault 中的属性,这些属性可以在其他属性源中使用,也可以使用 @Value(…) 进行值注入。在引导需要存储在 Vault 中的数据的 Bean 时,需要特别注意。必须在此时初始化 VaultPropertySource 以从 Vault 中检索属性。
|
Spring Boot/Spring Cloud 用户可以从 Spring Cloud Vault 的配置集成中获益,该集成在应用程序启动期间初始化各种属性源。 |
注册 VaultPropertySource
Spring Vault 提供了一个 VaultPropertySource
,用于与 Vault 一起使用以获取属性。它使用嵌套的 data
元素来公开存储在 Vault 中并加密的属性。
ConfigurableApplicationContext ctx = new GenericApplicationContext();
MutablePropertySources sources = ctx.getEnvironment().getPropertySources();
sources.addFirst(new VaultPropertySource(vaultTemplate, "secret/my-application"));
在上面的代码中,VaultPropertySource
已被添加到搜索中的最高优先级。如果它包含一个 ´foo` 属性,它将被检测到并返回,优先于任何其他 PropertySource
中的任何 foo
属性。MutablePropertySources
公开了许多方法,允许对属性源集进行精确操作。
@VaultPropertySource
@VaultPropertySource
注解提供了一种方便且声明性的机制,用于将 PropertySource
添加到 Spring 的 Environment
中,以便与 @Configuration
类一起使用。
@VaultPropertySource
接受一个 Vault 路径,例如 secret/my-application
,并在 PropertySource
中公开存储在该节点上的数据。@VaultPropertySource
支持对与租约关联的密钥(例如,来自 mysql
后端的凭据)进行租约续订,并在租约到期时进行凭据轮换。租约续订默认情况下处于禁用状态。
{
// …
"data": {
"database": {
"password": ...
},
"user.name": ...,
}
// …
}
@VaultPropertySource
@Configuration
@VaultPropertySource("secret/my-application")
public class AppConfig {
@Autowired Environment env;
@Bean
public TestBean testBean() {
TestBean testBean = new TestBean();
testBean.setUser(env.getProperty("user.name"));
testBean.setPassword(env.getProperty("database.password"));
return testBean;
}
}
@VaultPropertySource
@Configuration
@VaultPropertySource(value = "aws/creds/s3-access",
propertyNamePrefix = "aws.",
renewal = Renewal.ROTATE)
public class AppConfig {
// provides aws.access_key and aws.secret_key properties
}
从 generic 密钥后端获取的密钥与 TTL(refresh_interval )相关联,但没有租约 ID。Spring Vault 的 PropertySource 在达到 TTL 时会轮换通用密钥。
|
您可以使用 @VaultPropertySource 从版本化的键值后端获取最新的密钥版本。确保不要在路径中包含 data/ 段。
|
@VaultPropertySource
路径中存在的任何 ${…}
占位符都将针对已注册到环境中的属性源集进行解析,如下面的示例所示
@VaultPropertySource
路径@Configuration
@VaultPropertySource(value = "aws/creds/${my.placeholder:fallback/value}",
propertyNamePrefix = "aws.",
renewal = Renewal.ROTATE)
public class AppConfig {
}
假设 my.placeholder
存在于已注册的某个属性源中(例如,系统属性或环境变量),则占位符将解析为相应的值。如果没有,则使用 fallback/value
作为默认值。如果未指定默认值,并且无法解析属性,则会抛出 IllegalArgumentException
。
在某些情况下,使用@VaultPropertySource
注解时,可能无法或不切实际地严格控制属性源的排序。例如,如果上面的@Configuration
类是通过组件扫描注册的,则排序很难预测。在这种情况下 - 如果覆盖很重要 - 建议用户回退到使用编程的PropertySource API。有关详细信息,请参阅ConfigurableEnvironment
和MutablePropertySources
。