ConfigData API
Spring Boot 從 2.4 版本開始提供了 ConfigData API,它允許宣告配置源並將其作為屬性源匯入。
從 3.0 版本開始,Spring Cloud Vault 使用 ConfigData API 將 Vault 的秘密後端掛載為屬性源。在之前的版本中,使用的是 Bootstrap context。ConfigData API 更具靈活性,因為它允許指定要匯入哪些配置系統以及匯入順序。
您可以透過設定配置屬性 spring.cloud.bootstrap.enabled=true 或包含依賴 org.springframework.cloud:spring-cloud-starter-bootstrap 來啟用 bootstrap context。使用 bootstrap context 應該很少需要,因此我們建議使用 Config Data API 來獲得屬性源排序的更大靈活性。 |
ConfigData 位置
您可以透過一個或多個從 Vault 具現化的 PropertySource
來掛載 Vault 配置。Spring Cloud Vault 支援兩種配置位置:
-
vault://
(預設位置) -
vault:///<context-path>
(上下文位置)
使用預設位置會為所有啟用的秘密後端掛載屬性源。如果未進行進一步配置,Spring Cloud Vault 會將鍵值後端掛載到 /secret/${spring.application.name}
。每個啟用的 profile 會新增另一個上下文路徑,形式為 /secret/$\{spring.application.name}/${profile}
。將更多模組新增到 classpath,例如 spring-cloud-config-databases
,提供了額外的秘密後端配置選項,啟用後它們也會作為屬性源掛載。
如果您想控制哪些上下文路徑從 Vault 作為 PropertySource
掛載,您可以使用上下文位置(vault:///my/context/path
)或配置一個VaultConfigurer
。
上下文位置是單獨指定和掛載的。Spring Cloud Vault 會將每個位置掛載為一個唯一的 PropertySource
。您可以將預設位置與上下文位置(或其他配置系統)混合使用,以控制屬性源的順序。如果您想停用預設的鍵值路徑計算並自行掛載每個鍵值後端,這種方法特別有用。
spring.config.import: vault://first/context/path, vault://other/path, vault://
Spring Environment
中的屬性名稱必須是唯一的,以避免遮蔽。如果您在不同的上下文路徑中使用相同的秘密名稱,並且希望將它們作為獨立的屬性公開,您可以透過向位置新增 prefix
查詢引數來區分它們。
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 Client Fail Fast 允許在啟動時因找不到 Vault 上下文路徑(HTTP 狀態 404)而失敗。 |
基礎設施定製
Spring Cloud Vault 需要基礎設施類來與 Vault 互動。當不使用 ConfigData API(意味著您沒有指定 spring.config.import=vault://
或上下文 Vault 路徑)時,Spring Cloud Vault 透過 VaultAutoConfiguration
和 VaultReactiveAutoConfiguration
定義其 bean。Spring Boot 在 Spring Context 可用之前啟動應用程式。因此,VaultConfigDataLoader
會自行註冊 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
的原始碼,瞭解定製鉤子。