Property Sources

Vault 可以用许多不同的方式。一个特定的用例是使用 Vault 来存储加密属性。Spring Vault 支持 Vault 作为属性源,以便使用 Spring’s {spring-framework-docs}core.html#beans-property-source-abstraction[属性源抽象] 获取配置属性。

您可以在其他属性源中引用存储在 Vault 中的属性,或使用 @Value(…) 进行值注入。在引导需要存储在 Vault 内的数据的 bean 时,需要特别注意。必须在该时间初始化 VaultPropertySource 以从 Vault 检索属性。

Spring Boot/Spring Cloud 用户可以受益于 Spring Cloud Vault 的配置集成,该集成在应用程序启动期间初始化各种属性源。

Registering 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 注释提供了一种方便且具有声明性的机制,用于向 Spring 的 Environment 中添加 PropertySource,以与 @Configuration 类结合使用。

@VaultPropertySource 采用 secret/my-application 等 Vault 路径,并在 PropertySource 中公开存储在节点中的数据。@VaultPropertySource 支持为与租期关联的秘密(例如,mysql 后端的凭据)续约租期,并在终端租期到期后对凭据进行轮换。默认情况下,禁用续约租期。

Example 1. Properties stored in Vault
{
  // …

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

  // …
}
Example 2. Declaring a @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;
    }
}
Example 3. Declaring a @VaultPropertySource with credential rotation and prefix
@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 从版本化 Key-Value 后端获取最新的机密版本。请确保路径中不包含 data/ 段。

已在 @VaultPropertySource 路径中存在的任何 ${…​} 占位符都使用已针对环境注册的属性源集进行解析,如下例所示:

Example 4. Declaring a @VaultPropertySource path using placeholders
@Configuration
@VaultPropertySource(value = "aws/creds/${my.placeholder:fallback/value}",
                     propertyNamePrefix = "aws.",
                     renewal = Renewal.ROTATE)
public class AppConfig {
}

假设 my.placeholder 位于已注册的某个属性源中(例如,系统属性或环境变量),则占位符将解析为相应的值。如果没有,则 fallback/value 用作默认值。如果未指定默认值且无法解析属性,则会引发 IllegalArgumentException

在某些情况下,使用 @VaultPropertySource 注解时,严格控制属性源顺序可能不可行或不切实际。例如,如果上面的 @Configuration 类是通过组件扫描注册的,那么顺序就很难预测。在这种情况(如果覆盖很重要)下,建议用户退回到使用编程属性源 API。请参阅 ConfigurableEnvironmentMutablePropertySources 以了解更多详情。