Введение в Spring Cloud Vault

Введение в Spring Cloud Vault

1. обзор

В этом руководстве мы покажем, как можно использовать хранилище Hashicorp в приложениях Spring Boot для защиты конфиденциальных данных конфигурации.

We assume here some Vault knowledge and that we have a test setup already up and running. Если это не так, давайте на минутку прочитаем нашVault Intro tutorial, чтобы мы могли познакомиться с его основами.

2. Spring Cloud Vault

Spring Cloud Vault - относительно недавнее дополнение к стеку Spring Cloud, которое содержитallows applications to access secrets stored in a Vault instance in a transparent way.

В целом, миграция в Vault - очень простой процесс: просто добавьте необходимые библиотеки и добавьте несколько дополнительных свойств конфигурации в наш проект, и мы должны быть готовы. No code changes are required!с

Это возможно, потому что он действует какPropertySource с высоким приоритетом, зарегистрированный в текущемEnvironment.

Таким образом, Spring будет использовать его всякий раз, когда требуется свойство. Примеры включают свойстваDataSource,ConfigurationProperties, и так далее.

3. Добавление Spring Cloud Vault в проект Spring Boot

Чтобы включить библиотекуspring-cloud-vault в проект Spring Boot на основе Maven, мы используем связанный артефактstarter, который будет извлекать все необходимые зависимости.

Помимо основногоstarter, мы также добавимspring-vault-config-databases, который добавляет поддержку динамических учетных данных базы данных:


    org.springframework.cloud
    spring-cloud-starter-vault-config


    org.springframework.cloud
    spring-cloud-vault-config-databases

Последнюю версиюSpring Cloud Vault starter можно загрузить с Maven Central.

3.1. Базовая конфигурация

Для правильной работы Spring Cloud Vault необходим способ определить, где связаться с сервером Vault и как выполнить аутентификацию на нем.

Мы делаем это, предоставляя необходимую информацию вbootstrap.yml илиbootstrap.properties:

# bootstrap.yml
spring:
  cloud:
    vault:
      uri: https://localhost:8200
      ssl:
        trust-store: classpath:/vault.jks
        trust-store-password: changeit

Свойствоspring.cloud.vault.uri указывает на адрес API Vault. Поскольку наша тестовая среда использует HTTPS с самозаверяющим сертификатом, нам также необходимо предоставить хранилище ключей, содержащее его открытый ключ.

Note that this configuration has no authentication data. В простейшем случае, когда мы используем фиксированный токен, мы можем передать его через системное свойствоspring.cloud.vault.token или переменную среды. Этот подход хорошо работает в сочетании со стандартными механизмами конфигурации облака, такими как секреты Kubernetes ConfigMaps или Docker.

Spring Vault также требует дополнительной настройки для каждого типа секрета, который мы хотим использовать в нашем приложении. В следующих разделах описывается, как мы можем добавить поддержку двух общих типов секретов: ключ / значение и учетные данные базы данных.

4. Использование общего секрета Backend

We use the Generic Secret backend to access unversioned secrets stored as Key-Value pairs in Vault.

Предполагая, что у нас уже есть зависимостьspring-cloud-starter-vault-config в нашемclasspath, все, что нам нужно сделать, это добавить несколько свойств в файл конфигурации приложенияbootstrap.yml:

spring:
  cloud:
    vault:
      # other vault properties omitted ...
      generic:
        enabled: true
        application-name: fakebank

Свойствоapplication-name в этом случае необязательно. Если не указано иное, Spring примет вместо этого значение стандартногоspring.application.name.

Теперь мы можем использовать все пары ключ / значение, хранящиеся вsecret/fakebank, как любое другое свойствоEnvironment.. В следующем фрагменте показано, как мы можем прочитать значение ключаfoo, хранящегося в этот путь:

@Autowired Environment env;
public String getFoo() {
    return env.getProperty("foo");
}

As we can see, the code itself knows nothing about Vault,, и это хорошо! Мы по-прежнему можем использовать фиксированные свойства в локальных тестах и ​​переключаться на Vault по своему усмотрению, просто включив одно свойство вbootstrap.yml.

4.1. Примечание о весенних профилях

Если доступно в текущемEnvironment, Spring Cloud Vaultwill use the available profile names as a suffix appended to the specified base path where key/value pairs will be searched.

Он также будет искать свойства в настраиваемом пути приложения по умолчанию (с суффиксом профиля и без него), чтобы мы могли иметь общие секреты в одном месте. Используйте эту функцию с осторожностью!

Подводя итог, можно сказать, что если профильproduction приложения outfakebank активен, Spring Vault будет искать свойства, хранящиеся по следующим путям:

  1. secret/fakebank_/production_ (higher priority)

  2. secret/fakebank

  3. secret/application/production

  4. secret/application (более низкий приоритет)

В предыдущем спискеapplication - это имя, которое Spring использует в качестве дополнительного местоположения по умолчанию для секретов. Мы можем изменить его, используя свойствоspring.cloud.vault.generic.default-context.

Свойства, сохраненные по наиболее конкретному пути, будут иметь приоритет над остальными. Например, если то же свойствоfoo доступно по указанным выше путям, то порядок приоритета будет следующим:

5. Использование базы данных Secret Backend

The Database backend module allows Spring applications to use dynamically generated database credentials created by Vault. Spring Vault вводит эти учетные данные в стандартные свойстваspring.datasource.username иspring.datasource.password, чтобы их можно было выбрать обычнымDataSources.

Обратите внимание, что перед использованием этого бэкенда мы должны создать конфигурацию базы данных и роли в Vault, как описано вour previous tutorial.

Чтобы использовать сгенерированные Vault учетные данные базы данных в нашем приложении Spring,spring-cloud-vault-config-databases должны присутствовать в пути к классам проекта вместе с соответствующим драйвером JDBC.

Нам также необходимо включить его использование в нашем приложении, добавив несколько свойств в нашbootstrap.yml:

spring:
  cloud:
    vault:
      # ... other properties omitted
      database:
        enabled: true
        role: fakebank-accounts-rw

Самым важным свойством здесь является свойствоrole, которое содержит имя роли базы данных, хранящееся в Vault. Во время начальной загрузки Spring свяжется с Vault и запросит создание новых учетных данных с соответствующими привилегиями.

По умолчанию хранилище аннулирует привилегии, связанные с этими учетными данными, после настроенного времени жизни.

К счастью,Spring Vault will automatically renew the lease associated with the acquired credentials.. Таким образом, учетные данные останутся действительными, пока наше приложение работает.

Теперь давайте посмотрим на эту интеграцию в действии. Следующий фрагмент получает новое соединение с базой данных отDataSource, управляемого Spring:

Connection c = datasource.getConnection();

Once again, we can see that there is no sign of Vault usage in our code. Вся интеграция происходит на уровнеEnvironment, поэтому наш код можно легко протестировать, как обычно.

6. Заключение

В этом руководстве мы показали, как интегрировать Vault с Spring Boot с помощью библиотеки Spring Vault. Мы рассмотрели два распространенных случая использования: общие пары ключ / значение и динамические учетные данные базы данных.

Доступен образец проекта, содержащий все необходимые зависимости, тесты интеграции и сценарии установки хранилищаover on GitHub.