Protección de Credenciales usando Vault

Protección de Credenciales usando Vault

Aunque parezca obvio, siempre es bueno recordar que: "La mejor manera de proteger los datos sensibles de tu aplicación es no almacenarlos en ella".
A continuación hablaremos de algunas alternativas sencillas :)

1. Guardarlos en variables de entorno
Se podría configurar manualmente cada variable en el servidor. Sin embargo, cualquier fallo en la configuración puede causar una fitlración de las mismas.

2. Guardarlos en archivos externos
Se podría contar con archivos para almacenar claves (encriptadas o no). En Spring Boot solemos especificar los valores de credenciales en el archivo application.properties el cual puede estar o no dentro del proyecto.

3. Usar un servicio de manejo de credenciales
Usar una bóveda (Vault) para almacenar los datos sensibles, obteniéndolos a través de un servicio y gestionando el acceso a los mismos.

De todas formas, cualquiera de los métodos anteriores, implica que alguna persona conozca alguna credencial, sin embargo reduce la facilidad con la que se puede acceder a ellas.

Vayamos a lo que nos interesa... ¡código!

coding

Spring Boot + Vault

Nuestro framework estrella ofrece una integración con el Vault de HashiCorp y muy acorde a lo suyo, realiza una integración casi transparente.

El Vault de HashiCorp es Open Source, gratuito y tiene una versión empresarial. Permite controlar el acceso a los secretos concediendo y revocando permisos sobre los mismos.

hashicorp

Permite almacenar los secretos de varias formas, una de ellas es guardarlos en el formato key-value. Básicamente lo que se debe hacer, una vez levantado el servicio, es seleccionar un nombre bajo el cual se quiere almacenar las credenciales (podría tener uno por aplicación), cargar las credenciales, crear las políticas de privacidad para el acceso a los datos, crear tokens de accesos y asignarles las políticas que les correspondan.

La guía oficial detallada sobre cómo instalar y configurar Vault se puede ver el este enlace.

Cómo lo integro con mi aplicación Spring Boot

Para que tu aplicación SpringBoot se conecte al Vault, se debe seguir los siguientes pasos:

1. Agregar la dependencia

   <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-vault-config</artifactId>
      <version>${spring-cloud.version}</version>
    </dependency>

2. Agregar las configuraciones

Debemos configurar lo referente al vault en el application.properties. Por ejemplo:

spring.application.name=myApp
spring.cloud.vault.token=token-generado
spring.cloud.vault.scheme=http
spring.cloud.vault.kv.enabled=true
spring.cloud.vault.host=127.0.0.1
spring.cloud.vault.port=8200
spring.cloud.vault.authentication=token
  • spring.application.name nombre de la aplicación creada en el Vault, bajo ella se insertan los valores a ser almacenados.
  • spring.cloud.vault.token token generado en el vault para acceder a los valores almacenados.
  • spring.cloud.vault.scheme esquema utilizado para la conexión al Vault.
  • spring.cloud.vault.host IP utilizada para la conexión al Vault.
  • spring.cloud.vault.port puerto utilizado para la conexión al Vault.
  • spring.cloud.vault.authentication tipo de autenticación utilizada.

3. Acceder a Vault para obtener las credenciales

Se debe crear un bean para la configuración de los datos a los cuales queramos acceder y anotarlo con @ConfigutarionProperties. Esto será utilizado por Vault para mapear las credenciales. Para este ejemplo las credenciales dentro del Vault tienen los keys: database.username y database.password.

@ConfigurationProperties("database")
public class DatabaseCredentialsConfig {
    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

...y ¡voilá! Spring hace su magia para que los valores puedan ser utilizados desde este Bean.

Como último punto, debemos recordar que invertir tiempo y esfuerzo para asegurar los datos sensibles de tu aplicación siempre será acertado, quizás no podamos reducir el riesgo a cero pero si podemos aumentar la dificultad de acceso a los curiosos...

happy