En esta lección nos sumergiremos en el mundo de la protección de los "tesoros" de nuestra aplicación: secretos, tokens, claves API y otros datos confidenciales. Hoy vamos a hablar de HashiCorp Vault!
Imagina: por accidente haces push a GitHub con la contraseña de la base de datos. En 30 minutos tu producción cae — alguien está minando criptomonedas en tus servidores.
Y ahora imagina que tienes:
- 20 microservicios
- En cada uno — sus propias contraseñas y claves
- Tres entornos (dev, test, prod)
- Un equipo de 10 desarrolladores
Cómo suelen almacenarse los secretos (y por qué eso es malo)
Opción 1: En el código
String dbPassword = "super_secret_123"; // Por favor, no hagas esto!
Tarde o temprano eso llegará a Git. Y entonces... ver la historia del minado de criptomonedas arriba.
Opción 2: En archivos de configuración
database:
password: another_secret_123 # Tampoco es la mejor idea
Los mismos problemas que con el código. Además hay que repartir esos archivos entre los desarrolladores.
Opción 3: En variables de entorno
export DB_PASSWORD=yet_another_secret
¡Mejor! Pero ¿cómo gestionar cientos de variables en decenas de servidores?
HashiCorp Vault viene al rescate
Vault es como una caja fuerte para tus secretos. ¡Pero inteligente! Veamos qué hace:
- Sabe quién y cuándo abrió la caja fuerte
- Puede cambiar claves y contraseñas automáticamente
- Puede trabajar con distintos tipos de secretos
- Se integra con Spring Boot (y no sólo)
¿Qué puede hacer Vault?
1. Almacenar secretos de forma centralizada
- Se acabaron los archivos
.enven cada servidor - Todos los secretos en un solo lugar
- El acceso está estrictamente controlado
2. Generar datos temporales
{
"db_credentials": {
"username": "app_1234",
"password": "temp_pass_5678",
"ttl": "1h"
}
}
En una hora esos datos dejarán de ser válidos. ¡Automáticamente!
3. Llevar auditoría
- ¿Quién solicitó la contraseña de la base?
- ¿Cuándo se actualizaron por última vez las API-keys?
- ¿Qué servicio usa credenciales obsoletas?
Integración con Spring Boot
Spring Boot + Vault = ♥️
Se ve más o menos así:
spring:
cloud:
vault:
host: vault.company.com
token: my-token
@Value("${secret.db.password}")
private String dbPassword; // ¡Lo obtenemos mágicamente desde Vault!
Funciones principales de Vault
Vault ofrece un montón de funcionalidades, aquí algunas:
| Función | Descripción |
|---|---|
| Generación dinámica | Generación de credenciales temporales para bases de datos, API y otros servicios |
| Gestión de claves | Almacenamiento y rotación de claves de cifrado |
| Secrets como servicio | Almacén centralizado de datos confidenciales |
| Políticas de acceso | Control de acceso basado en roles |
| Auditoría | Logs de acceso a secretos y operaciones |
Vault soporta distintos backends de almacenamiento (tanto sistemas de archivos como proveedores cloud) para gestionar secretos.
Soluciones alternativas
¿Y por qué Vault? Comparemos con otras soluciones populares:
AWS Parameter Store
- Funciona genial en AWS
- Gratis (casi)
- Pero está ligado a Amazon
Apache ZooKeeper
- Probado por el tiempo
- Escala muy bien
- Pero es complejo de configurar
- Y los secretos no son su objetivo principal
Etcd
- El favorito de Kubernetes
- Rápido y fiable
- Pero más orientado a configuraciones que a secretos
HashiCorp Vault
- Creado específicamente para secretos
- Funciona bien en cualquier sitio
- Sabe trabajar con secretos dinámicos
- Se integra con prácticamente todo
Tipos de almacenes en Vault
Key-Value (KV)
- Almacenamiento simple key-value
- Ideal para contraseñas y claves API
- Soporta versionado
Base de datos
- Credenciales dinámicas para DB
- Rotación automática de contraseñas
- Soporta PostgreSQL, MySQL, MongoDB y otros
PKI
- Generación de certificados SSL/TLS
- Gestión de CA raíz e intermedias
- Renovación automática
Un poco más sobre la integración de HashiCorp Vault con Spring
Spring Boot usa la configuración en application.properties o application.yml para conectarse a Vault. Tras la conexión, la aplicación puede cargar secretos como si fueran propiedades normales.
Ejemplo de uso:
- Secretos en Vault (por ejemplo, en la ruta
secret/data/myapp):{ "data": { "username": "admin", "password": "s3cr3t" } } - Acceso a secretos en Spring Boot:
spring: cloud: vault: uri: http://localhost:8200 token: my-root-token kv: enabled: true backend: secret default-context: myappLos secretos ahora están disponibles en la app como propiedades
usernameypassword. Por ejemplo, puedes usarlos en@Value:public class Credentials { @Value("${username}") private String username; @Value("${password}") private String password; // Getters, setters o simplemente un método para la lógica }
¿Qué problemas resuelve Vault?
1. Seguridad
- Los secretos no se almacenan en el código
- Cada uno recibe sólo los datos que necesita
- Todas las acciones quedan registradas
2. Automatización
- Cambio automático de contraseñas
- Integración con CI/CD
- API para todo
3. Escalabilidad
- Funciona tanto con un servicio como con miles
- Soporta clustering
- Se integra con nubes
¿Qué sigue?
HashiCorp Vault es una herramienta potente que te permite gestionar datos confidenciales con la máxima seguridad. Al configurarlo en tu aplicación, no sólo protegerás los datos de forma fiable, sino que además podrás dormir tranquilo sabiendo que ninguna clave API se vaya a filtrar por accidente en tu repositorio. En la próxima lección vamos a:
- Instalar Vault
- Configurar la integración con Spring Boot
- Aprender a almacenar y recuperar secretos
- Ver todo esto en acción
GO TO FULL VERSION