配置資料API

Spring Boot 自 2.4 版本起提供了 ConfigData API,允許宣告配置源並將其作為屬性源匯入。

Spring Cloud Vault 自 3.0 版本起使用 ConfigData API 將 Vault 的秘密後端掛載為屬性源。在之前的版本中,使用的是 Bootstrap 上下文。ConfigData API 更加靈活,因為它允許指定要匯入哪些配置系統以及匯入的順序。

您可以透過設定配置屬性 spring.cloud.bootstrap.enabled=true 或包含依賴 org.springframework.cloud:spring-cloud-starter-bootstrap 來啟用引導上下文。使用引導上下文應該很少需要,因此我們建議使用 Config Data API 以便在屬性源排序方面獲得更大的靈活性。

ConfigData 位置

您可以透過一個或多個從 Vault 具象化的 PropertySource 來掛載 Vault 配置。Spring Cloud Vault 支援兩種配置位置:

  • vault://(預設位置)

  • vault:///<context-path>(上下文位置)

使用預設位置會為所有啟用的秘密後端掛載屬性源。如果沒有進一步配置,Spring Cloud Vault 會將鍵值後端掛載到 /secret/${spring.application.name}。每個啟用的配置檔案都會新增另一個上下文路徑,形式為 /secret/$\{spring.application.name}/${profile}。在類路徑中新增更多模組,例如 spring-cloud-config-databases,可以提供額外的秘密後端配置選項,如果啟用,這些選項將作為屬性源掛載。

如果您想控制從 Vault 掛載哪些上下文路徑作為 PropertySource,您可以使用上下文位置 (vault:///my/context/path) 或配置一個VaultConfigurer

上下文位置是單獨指定和掛載的。Spring Cloud Vault 將每個位置掛載為唯一的 PropertySource。您可以將預設位置與上下文位置(或其他配置系統)混合使用,以控制屬性源的順序。這種方法特別有用,如果您想停用預設的鍵值路徑計算並自行掛載每個鍵值後端。

application.yml
spring.config.import: vault://first/context/path, vault://other/path, vault://

Spring Environment 中的屬性名稱必須是唯一的,以避免覆蓋。如果您在不同的上下文路徑中使用相同的秘密名稱,並且希望將它們作為單獨的屬性公開,您可以透過向位置新增 prefix 查詢引數來區分它們。

示例 1. application.yml
spring.config.import: vault://my/path?prefix=foo., vault://my/other/path?prefix=bar.
secret: ${foo.secret}
other.secret: ${bar.secret}
字首會原樣新增到 Vault 返回的所有屬性名稱中。如果您希望鍵名在字首和鍵名之間用點分隔,請確保在字首後新增一個點。

有條件地啟用/停用 Vault 配置

在某些情況下,可能需要不使用 Vault 啟動應用程式。您可以透過位置字串來表達 Vault 配置位置是可選的還是強制的(預設):

  • optional:vault://(預設位置)

  • optional:vault:///<context-path>(上下文位置)

如果透過 spring.cloud.vault.enabled=false 停用 Vault 支援,則在應用程式啟動期間會跳過可選位置。

無論配置位置是否標記為可選,如果找不到 Vault 上下文路徑(HTTP 狀態 404),都會跳過。 Vault 客戶端快速失敗 允許在找不到 Vault 上下文路徑(因為 HTTP 狀態 404)時啟動失敗。

基礎設施定製

Spring Cloud Vault 需要基礎設施類才能與 Vault 互動。當不使用 ConfigData API(意味著您沒有指定 spring.config.import=vault:// 或上下文 Vault 路徑)時,Spring Cloud Vault 透過 VaultAutoConfigurationVaultReactiveAutoConfiguration 定義其 Bean。Spring Boot 在 Spring 上下文可用之前引導應用程式。因此 VaultConfigDataLoader 自身註冊 Bean,以便稍後將這些 Bean 傳播到應用程式上下文中。

您可以透過使用 Bootstrapper API 註冊自定義例項來定製 Spring Cloud Vault 使用的基礎設施

自定義 ClientHttpRequestFactory
ClientOptions options = new ClientOptions();
SslConfiguration sslConfiguration = SslConfiguration.unconfigured();
HttpClientBuilder builder = HttpComponents.getHttpClientBuilder(options, sslConfiguration);

InstanceSupplier<ClientFactoryWrapper> supplier = context ->
new ClientFactoryWrapper(new HttpComponentsClientHttpRequestFactory(builder.build()));

SpringApplication application = new SpringApplication(MyApplication.class);
application.addBootstrapRegistryInitializer(registry -> registry.register(ClientFactoryWrapper.class, supplier));
自定義 RestTemplateBuilder
InstanceSupplier<RestTemplateBuilder> supplier = context -> {

	return RestTemplateBuilder
			.builder()
			.requestFactory(context.get(ClientFactoryWrapper.class).getClientHttpRequestFactory())
			.defaultHeader("X-Vault-Namespace", "my-namespace");
};

SpringApplication application = new SpringApplication(MyApplication.class);
application.addBootstrapRegistryInitializer(registry -> registry.register(RestTemplateBuilder.class, supplier));

另請參閱 自定義要公開為 PropertySource 的秘密後端VaultConfigDataLoader 的源以獲取定製鉤子。

© . This site is unofficial and not affiliated with VMware.