Не удалось разрешить доступ к секретам Docker Vault с помощью конфигурации Spring Cloud Starter Vault

Я бегу Docker Vault container в dev режим, и я не могу прочитать секрет, расположенный в /secret/mobsters/ называется password,

Вот весенние бревна.

Бег vault kv get secret/mobsters возвращает пару ключ-значение пароля. Я также могу получить доступ к серверу хранилища локально.

Вот как я ссылаюсь на секрет:

@Value("${password}")
String password;

@PostConstruct
private void postConstruct() {
    System.out.println("My password is: " + password);
}

Spring Cloud Vault Конфигурация настраивается с помощью bootstrap.yml файл:

spring.application.name: mobsters
spring.cloud.vault:
host: localhost
port: 8200
scheme: http
authentication: TOKEN
token: ...

Я получаю исключение с сообщением (полное исключение здесь):

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'password' in value "${password}"`

Из пользовательского интерфейса Vault:

введите описание изображения здесь

1 ответ

Решение

Использование Spring Vault/Spring Cloud Vault с HashiCorp Vault 0.10.0 не работает, поскольку бэкэнд ключ / значение монтируется с включенным контролем версий по умолчанию. Это имеет некоторое значение, так как версионный API полностью изменился и нарушает существующие клиентские реализации. Контекстные пути и структура ответа различны.

У вас есть два варианта:

  1. Используйте более старую версию Vault (например, 0.9.5)
  2. Старайтесь справляться с изменениями API, пока Spring Cloud Vault не найдет подход к использованию нового API. Вам нужно:
    • Задавать spring.cloud.vault.generic.backend=secret/data в вашей конфигурации начальной загрузки.
    • Имена свойств префикса с data. так @Value("${hello.world}") становится @Value("${data.hello.world}"),

Похоже, есть способ это исправить.

В вашем bootstrap.yml, удостоверься что generic.enabled ложно и kv.enabled правда.

spring:
  ...
  cloud.vault:
      ...
      kv.enabled: true
      generic.enabled: false

Согласно этому ответу на GitHub:

Основное различие между этими двумя заключается в том, что kv внедряет сегмент данных в контекстный путь и разворачивает вложенные ответы данных.

Если вы работаете с версией [springboot] до 2.0, вам нужно реализовать bean-компонент org.springframework.cloud.vault.config.VaultConfigurer, который доступен для контекста начальной загрузки. SecretBackendConfigurer принимает путь и PropertyTransformer, который преобразует свойства, прежде чем выставить их как PropertySource.

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