Spring Vault

Spring Vault

1. Visão geral

HashiCorp’s Vault é uma ferramenta para armazenar e proteger segredos. O Vault, em geral, resolve o problema de segurança de desenvolvimento de software de como gerenciar segredos. Para saber mais sobre isso, verifiqueour article here.

Spring Vault fornece abstrações Spring para o HashiCorp’s Vault.

Neste tutorial, veremos um exemplo de como armazenar e recuperar segredos do Vault.

2. Dependências do Maven

Para começar, vamos dar uma olhada nas dependências de que precisamos para começar a trabalhar com o Spring Vault:


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

A versão mais recente despring-vault-core pode ser encontrada emMaven Central.

3. Configurando o Vault

Vamos agora percorrer as etapas necessárias para configurar o Vault.

3.1. Criando umVaultTemplate

Para proteger nossos segredos, teremos que instanciar umVaultTemplate para o qual precisamos das instânciasVaultEndpointeTokenAuthentication:

VaultTemplate vaultTemplate = new VaultTemplate(new VaultEndpoint(),
  new TokenAuthentication("00000000-0000-0000-0000-000000000000"));

3.2. Criando umVaultEndpoint

Existem algumas maneiras de instanciarVaultEndpoint. Vamos dar uma olhada em alguns deles.

O primeiro é simplesmente instanciá-lo usando um construtor padrão, que criará um ponto de extremidade padrão apontando parahttp://localhost:8200:

VaultEndpoint endpoint = new VaultEndpoint();

Outra maneira é criar umVaultEndpoint especificando o host e a porta do Vault:

VaultEndpoint endpoint = VaultEndpoint.create("host", port);

E, finalmente, também podemos criá-lo a partir do URL do Vault:

VaultEndpoint endpoint = VaultEndpoint.from(new URI("vault uri"));

Há algumas coisas a serem observadas aqui - o Vault será configurado com um token raiz de00000000-0000-0000-0000-000000000000 para executar este aplicativo.

Em nosso exemplo, usamosTokenAuthentication, mas também há outrosauthentication methods suportados.

4. Configurando Vault Beans usando Spring

Com o Spring, podemos configurar o Vault de várias maneiras. Uma é estendendoAbstractVaultConfiguration,e a outra é usandoEnvironmentVaultConfiguration que faz uso das propriedades de ambiente do Spring.

Agora vamos repassar os dois caminhos.

4.1. UsandoAbstractVaultConfiguration

Vamos criar uma classe que estendeAbstractVaultConfiguration, para configurar o 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);
    }
}

Essa abordagem é semelhante ao que vimos na seção anterior. A diferença é que usamos o Spring Vault para configurar os beans do Vault estendendo a classe abstrataAbstractVaultConfiguration.

Só temos que fornecer a implementação para configurarVaultEndpointeClientAuthentication.

4.2. UsandoEnvironmentVaultConfiguration

Também podemos configurar o Spring Vault usandoEnviromentVaultConfiguration:

@Configuration
@PropertySource(value = { "vault-config.properties" })
@Import(value = EnvironmentVaultConfiguration.class)
public class VaultEnvironmentConfig {
}

EnvironmentVaultConfiguration usaPropertySource do Spring para configurar os beans do Vault. Nós apenas precisamos fornecer ao arquivo de propriedades algumas entradas aceitáveis.

Mais informações sobre todas as propriedades predefinidas podem ser encontradas emofficial documentation.

Para configurar o Vault, precisamos de pelo menos algumas propriedades:

vault.uri=https://localhost:8200
vault.token=00000000-0000-0000-0000-000000000000

5. Protegendo segredos

Vamos criar uma classeCredentials simples que mapeia para nome de usuário e senha:

public class Credentials {

    private String username;
    private String password;

    // standard constructors, getters, setters
}

Agora, vamos ver como podemos proteger nosso objetoCredentials usando oVaultTemplate:

Credentials credentials = new Credentials("username", "password");
vaultTemplate.write("secret/myapp", credentials);

Com essas linhas concluídas, nossos segredos estão agora armazenados.

A seguir, veremos como acessá-los.

6. Acessando os segredos

Podemos acessar os segredos protegidos usando o métodoread() emVaultTemplate,, que retorna VaultResponseSupport como resposta:

VaultResponseSupport response = vaultTemplate
  .read("secret/myapp", Credentials.class);
String username = response.getData().getUsername();
String password = response.getData().getPassword();

Nossos valores secretos estão agora prontos.

7. Conclusão

Neste artigo, aprendemos os conceitos básicos do Spring Vault com um exemplo que mostra como o Vault funciona em cenários típicos.

Como de costume, o código-fonte apresentado aqui pode ser encontradoover on GitHub.