Spring Vault

Spring Vault

1. обзор

HashiCorp’s Vault - это инструмент для хранения и защиты секретов. В общем, Vault решает проблему безопасности разработки программного обеспечения, связанную с управлением секретами. Чтобы узнать больше об этом, посетитеour article here.

Spring Vault предоставляет абстракции Spring для хранилища HashiCorp.

В этом руководстве мы рассмотрим пример того, как хранить и извлекать секреты из Vault.

2. Maven Зависимости

Для начала давайте взглянем на зависимости, которые нам нужны, чтобы начать работать с Spring Vault:


    
        org.springframework.vault
        spring-vault-core
        2.0.1.RELEASE
    

Последнюю версиюspring-vault-core можно найти наMaven Central.

3. Настройка Vault

Теперь рассмотрим шаги, необходимые для настройки Сейфа.

3.1. СозданиеVaultTemplate

Чтобы защитить наши секреты, нам нужно будет создать экземпляр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, но есть и другие поддерживаемыеauthentication methods.

4. Настройка компонентов Vault с помощью Spring

С помощью Spring мы можем настроить Vault несколькими способами. Один заключается в расширенииAbstractVaultConfiguration,, а другой - в использованииEnvironmentVaultConfiguration w, который использует свойства среды Spring.

Теперь мы рассмотрим оба пути.

4.1. ИспользуяAbstractVaultConfiguration

Давайте создадим класс, который расширяет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 использует SpringPropertySource для настройки bean-компонентов Vault. Нам просто нужно предоставить файл свойств с некоторыми допустимыми записями.

Более подробную информацию обо всех предопределенных свойствах можно найти вofficial documentation.

Для настройки 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 response = vaultTemplate
  .read("secret/myapp", Credentials.class);
String username = response.getData().getUsername();
String password = response.getData().getPassword();

Наши секретные ценности теперь готовы.

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

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

Как обычно, представленный здесь исходный код можно найтиover on GitHub.