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.