Настройка 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"

Решение:

  1. Создайте 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)
        }
    }
}
  1. Создайте 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

происходят в контексте начальной загрузки, как говорится в документации.

  1. Теперь вы можете указать желаемые пути в своем 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);
            }
        };
    }
}

Таким образом, вы можете сканировать свои секреты, размещенные в произвольном пути

С уважением Арун

Другие вопросы по тегам