¡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:
- Enviamos un evento a RabbitMQ
- Spring Cloud Bus lo entrega a todos los microservicios
- 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
- Instala Vault localmente
- Crea una aplicación Spring Boot sencilla
- Configura el almacenamiento y la obtención de al menos tres secretos diferentes
- 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
GO TO FULL VERSION