Настройка Spring Cloud Vault Config для извлечения из местоположения, отличного от /secret
В настоящее время я интегрирую Spring Cloud Vault Config в приложение Spring Boot. С домашней страницы:
Spring Cloud Vault Config считывает свойства конфигурации из хранилищ, используя имя приложения и активные профили:
/secret/{application}/{profile}
/secret/{application}
/secret/{default-context}/{profile}
/secret/{default-context}
Вместо этого я хотел бы указать свое собственное местоположение, из которого можно извлечь свойства из Vault, который не начинается с /secret (например, /deployments/prod). Я просматривал справочную документацию, но так и не нашел, чтобы это указать - возможно ли это?
2 ответа
Я смог использовать свойства Generic Backend, чтобы втиснуть пути в то, что я искал. Что-то вроде:
spring.cloud.vault:
generic:
enabled: true
backend: deployments
profile-separator: '/'
default-context: prod
application-name: my-app
Это также, к сожалению, пикап места Vault, как deployments/my-app
а также deployments/prod/activeProfile
так что будьте осторожны, чтобы в этих местах не было никаких свойств, которые вы не хотите забирать.
Похоже, что есть желание (и реализация), чтобы эти пути были определены более программно.
Я решил ту же проблему в своем
Kotlin
проект. Но это работает и на Java.
Проблема
Я хотел указать пути к хранилищу в конфигурации yaml, поэтому в итоге я получил следующее решение, которое позволяет вам указывать пути непосредственно в
bootstrap.yml
используя четкий синтаксис, например:
spring:
cloud:
vault:
paths: "secret/your-app"
Решение:
- Создайте
VaultConfig
class в вашем проекте со следующим содержанием:
package com.your.app.configuration
import org.springframework.beans.factory.annotation.Value
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
import org.springframework.cloud.vault.config.VaultConfigurer
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@Configuration
@ConditionalOnProperty(
prefix = "spring.cloud.vault", value = ["paths"],
matchIfMissing = false
)
class VaultConfig {
@Value("\${spring.cloud.vault.paths}")
private lateinit var paths: List<String>
@Bean
fun configurer(): VaultConfigurer {
return VaultConfigurer { configurer ->
paths.forEach {
configurer.add(it)
}
configurer.registerDefaultGenericSecretBackends(false)
configurer.registerDefaultDiscoveredSecretBackends(false)
}
}
}
- Создайте
spring.factories
файл вsrc/main/resources/META-INF/spring.factories
с содержанием:
org.springframework.cloud.bootstrap.BootstrapConfiguration=com.your.app.configuration.VaultConfig
Не забудьте указать действительную ссылку на вашу конфигурацию вместо
com.your.app.configuration.VaultConfig
spring.factories
позволяет вашему VaultConfigпроисходят в контексте начальной загрузки, как говорится в документации.
- Теперь вы можете указать желаемые пути в своем
bootstrap.yml
, следующим образом:
spring:
cloud:
vault:
paths:
- "secret/application"
- "secret/your-app"
И это должно работать.
Это должно быть сделано таким образом.
Есть класс конфигурации
@Configuration
public class VaultConfiguration {
@Bean
public VaultConfigurer configurer() {
return new VaultConfigurer() {
@Override
public void addSecretBackends(SecretBackendConfigurer configurer) {
configurer.add("secret/my-app/path-1");
configurer.add("secret/my-app/path-2");
configurer.registerDefaultGenericSecretBackends(false);
}
};
}
}
Таким образом, вы можете сканировать свои секреты, размещенные в произвольном пути
С уважением Арун