属性来源

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后端的凭据)进行租约续订,并在租约到期时进行凭据轮换。默认情况下禁用租约续订。

示例 1. 存储在 Vault 中的属性
{
  // …

  "data": {
    "database": {
      "password": ...
    },
    "user.name": ...,
  }

  // …
}
示例 2. 声明@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;
    }
}
示例 3. 声明具有凭据轮换和前缀的@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路径中存在的任何${…​}占位符都将根据已针对环境注册的属性源集进行解析,如下例所示

示例 4. 使用占位符声明@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。有关详细信息,请参阅 ConfigurableEnvironmentMutablePropertySources