CodeGym /Cursos /Módulo 5. Spring /Lección 227: Práctica: integración de HashiCorp Vault con...

Lección 227: Práctica: integración de HashiCorp Vault con microservicios

Módulo 5. Spring
Nivel 23 , Lección 6
Disponible

¡Hola! En la última clase vimos para qué sirve Vault y qué puede hacer. Hoy vamos a ponernos manos a la obra: instalaremos, configuraremos y haremos que funcione con nuestras aplicaciones Spring Boot.


Instalación de Vault

La forma más sencilla es usar Docker. Un comando y tendremos un Vault funcionando:


docker run --cap-add=IPC_LOCK \
-e 'VAULT_DEV_ROOT_TOKEN_ID=myroot' \
-p 8200:8200 \
vault

¡Recuerda el token myroot — te será útil!


Primeros pasos con Vault CLI

Vamos a familiarizarnos con la CLI de Vault. Primero indicamos la dirección del servidor:

export VAULT_ADDR='http://127.0.0.1:8200'

Ahora nos autenticamos con nuestro token:


vault login myroot

Añadiendo los primeros secretos

Vault guarda los secretos en 'secret engines' especiales. Creemos uno para nuestra app:


vault secrets enable -path=secret kv-v2

Ahora añadimos el primer secreto:


vault kv put secret/myapp/database \
username=dbuser \
password=dbpass

Verifiquemos que se guardó:

vault kv get secret/myapp/database

Conectando Spring Boot

Ahora lo más interesante: conectamos nuestra app a Vault.

1. Añadimos dependencias

En pom.xml:


<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-vault-config</artifactId>
</dependency>

2. Configuramos la aplicación

En application.yml:


spring:
cloud:
vault:
host: localhost
port: 8200
scheme: http
authentication: TOKEN
token: myroot
kv:
enabled: true
backend: secret
default-context: myapp

3. Usamos los secretos

En el código se ve sencillo:


@Value("${database.username}")
private String username;

@Value("${database.password}")
private String password;

Probando

Creamos un REST controller sencillo:


@RestController
public class TestController {

       @Value("${database.username}")
       private String username;

       @GetMapping("/test")
       public String test() {
           return "Conectado como: " + username;
       }
}

Arranca la aplicación y prueba:

curl http://localhost:8080/test

Funciones útiles

1. Actualizar secretos "al vuelo"

Cambia el secreto en Vault:


vault kv put secret/myapp/database \
username=newuser \
password=newpass

Y actualiza la configuración de la app:

curl -X POST http://localhost:8080/actuator/refresh

2. Diferentes secretos para distintos entornos

En Vault:


vault kv put secret/myapp/database/dev \
username=devuser \
password=devpass

vault kv put secret/myapp/database/prod \
username=produser \
password=prodpass

En la aplicación:


spring:
cloud:
vault:
kv:
default-context: myapp/database/${spring.profiles.active}

Técnicas avanzadas: actualización en tiempo real

Conectamos Spring Cloud Bus

En pom.xml:


<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

Configuramos RabbitMQ

En application.yml:


    spring:
      rabbitmq:
        host: localhost
        port: 5672
        username: guest
        password: guest
      cloud:
        bus:
          enabled: true

Actualización automática de secretos

Ahora, al cambiar un secreto en Vault:

  1. Enviamos un evento a RabbitMQ
  2. Spring Cloud Bus lo entrega a todos los microservicios
  3. Cada servicio actualiza sus secretos

Trabajo con distintos entornos

Estructura de secretos en Vault

secret/
├── dev/
│   ├── app1/
│   └── app2/
├── staging/
│   ├── app1/
│   └── app2/
└── prod/
    ├── app1/
    └── app2/

Configuración de perfiles Spring

En bootstrap.yml:


spring:
  cloud:
    vault:
      kv:
        application-name: ${spring.application.name}/${spring.profiles.active}

Problemas típicos y sus soluciones

1. Vault no disponible al arrancar

Añade en application.yml:


spring:
cloud:
vault:
fail-fast: false
config:
lifecycle:
enabled: true

2. Los secretos no se actualizan

No olvides añadir:


@RefreshScope
public class MyConfig {
// ...
}

Tarea

  1. Instala Vault localmente
  2. Crea una aplicación Spring Boot sencilla
  3. Configura el almacenamiento y la obtención de al menos tres secretos diferentes
  4. Bonus: configura el trabajo con distintos perfiles (dev/prod)

En la próxima clase veremos técnicas avanzadas con Vault: políticas de acceso, auditoría y rotación automática de secretos.

¡Nos vemos en la práctica! Y no olvides limpiar el historial del terminal — ahí podrían quedar secretos

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION