1. Обзор
Хранилище HashiCorp — это инструмент для хранения и защиты секретов. Vault, в целом, решает проблему безопасности при разработке программного обеспечения, связанную с управлением секретами. Чтобы узнать больше об этом, ознакомьтесь с нашей статьей здесь .
Spring Vault предоставляет абстракции Spring для хранилища HashiCorp.
В этом руководстве мы рассмотрим пример того, как хранить и извлекать секреты из хранилища.
2. Зависимости Maven
Для начала давайте посмотрим на зависимости, которые нам нужны для начала работы с Spring Vault:
<dependencies>
<dependency>
<groupId>org.springframework.vault</groupId>
<artifactId>spring-vault-core</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
</dependencies>
Последнюю версию spring-vault-core
можно найти на Maven Central .
3. Настройка хранилища
Давайте теперь пройдемся по шагам, необходимым для настройки Vault.
3.1. Создание шаблона хранилища
Чтобы защитить наши секреты, нам нужно будет создать экземпляр VaultTemplate
, для которого нам нужны экземпляры VaultEndpoint
и TokenAuthentication
:
VaultTemplate vaultTemplate = new VaultTemplate(new VaultEndpoint(),
new TokenAuthentication("00000000-0000-0000-0000-000000000000"));
3.2. Создание VaultEndpoint
Существует несколько способов создания экземпляра VaultEndpoint
. Давайте посмотрим на некоторые из них.
Первый — просто создать экземпляр с помощью конструктора по умолчанию, который создаст конечную точку по умолчанию, указывающую на http://localhost:8200:
VaultEndpoint endpoint = new VaultEndpoint();
Другой способ — создать VaultEndpoint
, указав хост и порт Vault:
VaultEndpoint endpoint = VaultEndpoint.create("host", port);
И, наконец, мы также можем создать его из URL-адреса хранилища:
VaultEndpoint endpoint = VaultEndpoint.from(new URI("vault uri"));
Здесь следует отметить несколько вещей: Vault будет настроен с корневым токеном 00000000-0000-0000-0000-000000000000
для запуска этого приложения.
В нашем примере мы использовали TokenAuthentication
, но также поддерживаются и другие методы аутентификации .
4. Настройка Vault Bean с помощью Spring
С помощью Spring мы можем настроить Vault несколькими способами. Один — путем расширения AbstractVaultConfiguration,
а другой — с помощью EnvironmentVaultConfiguration
, который использует свойства среды Spring.
Теперь мы рассмотрим оба пути.
4.1. Использование конфигурации абстрактного хранилища
Давайте создадим класс, расширяющий AbstractVaultConfiguration,
для настройки Spring Vault:
@Configuration
public class VaultConfig extends AbstractVaultConfiguration {
@Override
public ClientAuthentication clientAuthentication() {
return new TokenAuthentication("00000000-0000-0000-0000-000000000000");
}
@Override
public VaultEndpoint vaultEndpoint() {
return VaultEndpoint.create("host", 8020);
}
}
Этот подход аналогичен тому, что мы видели в предыдущем разделе. Отличие заключается в том, что мы использовали Spring Vault для настройки компонентов Vault, расширив абстрактный класс AbstractVaultConfiguration.
Нам просто нужно предоставить реализацию для настройки VaultEndpoint
и ClientAuthentication
.
4.2. Использование EnvironmentVaultConfiguration
Мы также можем настроить Spring Vault с помощью EnviromentVaultConfiguration
:
@Configuration
@PropertySource(value = { "vault-config.properties" })
@Import(value = EnvironmentVaultConfiguration.class)
public class VaultEnvironmentConfig {
}
EnvironmentVaultConfiguration
использует Spring PropertySource
для настройки компонентов Vault. Нам просто нужно предоставить файл свойств с некоторыми допустимыми записями.
Более подробную информацию обо всех предопределенных свойствах можно найти в официальной документации .
Для настройки Vault нам понадобится как минимум пара свойств:
vault.uri=https://localhost:8200
vault.token=00000000-0000-0000-0000-000000000000
5. Защита секретов
Мы создадим простой класс Credentials
, который сопоставляется с именем пользователя и паролем:
public class Credentials {
private String username;
private String password;
// standard constructors, getters, setters
}
Теперь давайте посмотрим, как мы можем защитить наш объект Credentials с помощью
VaultTemplate:
Credentials credentials = new Credentials("username", "password");
vaultTemplate.write("secret/myapp", credentials);
Теперь, когда эти строки завершены, наши секреты сохранены.
Далее мы увидим, как получить к ним доступ.
6. Доступ к секретам
Мы можем получить доступ к защищенным секретам, используя метод read()
в VaultTemplate,
который возвращает VaultResponseSupport
в качестве ответа:
VaultResponseSupport<Credentials> response = vaultTemplate
.read("secret/myapp", Credentials.class);
String username = response.getData().getUsername();
String password = response.getData().getPassword();
Наши секретные значения готовы.
7. Заключение
В этой статье мы узнали об основах Spring Vault на примере, показывающем, как работает Vault в типичных сценариях .
Как обычно, представленный здесь исходный код можно найти на GitHub .