Secretos KV en Vault
En la gestión moderna de la infraestructura y el desarrollo seguro de aplicaciones, proteger la información sensible es una prioridad clave.
HashiCorp Vault se ha convertido en una herramienta esencial para almacenar y gestionar secretos de forma segura.
En este artículo, exploraré los Secretos KV en Vault, un motor de almacenamiento flexible y poderoso que permite gestionar credenciales, tokens de acceso y otros datos sensibles con controles de acceso robustos y cifrado avanzado.
Descubre cómo funcionan, sus casos de uso y las mejores prácticas para integrarlos en tu flujo de trabajo de DevOps.
Si llegaste de casualidad a este artículo, pero no conoces aún sobre esta herramienta, te recomiendo primero leer el artículo Qué es Hashicorp Vault.
1. Introducción
El almacenamiento de secretos KV (Key-Value o Clave-Valor) en Vault es una práctica fundamental en la seguridad de la información que consiste en guardar datos sensibles, como contraseñas, tokens de acceso y claves de cifrado, de forma segura y estructurada.
Esta metodología utiliza un formato simple donde cada dato confidencial se asocia a una clave única, permitiendo un acceso controlado y eficiente a la información.
En este artículo mostraré una guía práctica de configuración y uso de secretos KV en Vault.
2. Configuración
Antes que nada, es necesario tener una instalación lista de Hashicorp Vault para probar. Si no lo tienes, te puede interesar leer el artículo Instalación de Hashicorp Vault, o sino Probando Vault en Docker.
Por ello, a partir de este punto asumiré que ya tienes acceso a Vault con un usuario que tenga todos los privilegios, o sino el token de root.
2.1. Habilitación de motor de secretos KV en Vault
En Vault existen múltiples motores de secretos, tales como kv, aws, pki, kubernetes, y varios más. Por cada uno de ellos se puede habilitar una o más «instancias» de ellos en lo que se conoce «puntos de montaje» o «rutas».
A modo de ejemplo, puedes montar dos instancias del motor de secretos de tipo kv en las rutas de nombre «comun» y «produccion» de esta manera:
vault secrets enable -path comun kv-v2 vault secrets enable -path produccion kv-v2
El último valor que dice kv-v2
especifica el tipo de motor de secretos KV en su versión 2. Si en su lugar solo se escribe kv
se asumirá que se usa la versión 1 (no recomendada).
Por la interfaz Web se seguiría esta secuencia: Secret Engines
–> Enable new engine
–> KV
y asignarle un nombre a la ruta.
2.2. Escritura de secretos KV en Vault
Una vez montada una ruta de secretos KV, puedes ya escribir, modificar y borrar todos los secretos que desees.
Pero recuerda, estos secretos deben ser porciones pequeñas de texto, de unos cuantos bytes o kilobytes a lo mucho. Esto no está pensado en almacenar grandes cantidades de datos como imágenes, adjuntos u otros contenidos. Solamente valores de texto simple.
Desde la línea de comandos puedes escribir secretos en alguna de las rutas creadas, por ejemplo así:
vault kv put comun/mysql/dev ip=172.16.10.23 user=root password=kBoH1FicdT
Esto muestra en pantalla un texto informativo con la metadata del secreto creado:
Lo que se hizo fue escribir un secreto de nombre «dev» dentro de «comun/mysql» y como contenido se le puso tres pares de clave-valor:
- ip: 172.16.10.23
- user: root
- password: kBoH1FicdT
No es necesario que la ruta padre «mysql» exista dentro de «comun» para poder escribir «mysql/dev».
Si bien sigue una nomenclatura similar a los directorios en UNIX (separados por slash), no es requisito que los «directorios» padre sean primero creados. Pero, obviamente, la ruta base padre «comun» sí debe existir, dado que este es el punto de montaje base de una instancia del motor de secretos KV.
Aquí unos ejemplos más:
vault kv put comun/mysql/prod ip=172.16.10.91 user=root password=FGcM19Net0oHHuufHT vault kv put comun/router usuario=admin password=p4ssw0rd13 url=http://172.16.0.1 vault kv put comun/licencias/software/win10 key=NPPR9-FWDCX-D2C8J-H872K-2YT43
De forma gráfica, lo harías así: Secret Engines
–> comun
–> Create secret
y completar el nombre y contenido del secreto.
En la interfaz Web es más amigable el proceso, pues incluso se puede alternar entre visualizar u ocultar el valor del secreto.
2.3. Lectura de secretos KV en Vault
En la línea de comandos la lectura de secretos puede constar de dos acciones: «listar» y «leer»
Dado que los secretos se almacenan de forma jerárquica, similar a una estructura de archivos y directorios en UNIX, es necesario poder listar los contenedores y secretos. Para ello se usan estos comandos:
vault kv list comun vault kv list comun/mysql vault kv list comun/mysql/dev vault kv get comun/mysql/dev
En el listado mostrado por Vault para las rutas KV, cada entrada puede ser un contenedor o un secreto. El contenedor termina en el símbolo slash y el secreto no lleva ese símbolo al final. Esta imagen puede aclarar mejor el tema:
Como se explica en la imagen, los contenedores se listan con el subcomando list
, mientras que los secretos se leen con el subcomando get
.
Importante: Un detalle no menor es que la metadata mostrada en pantalla indica que se tiene la versión 1 del secreto.
En la interfaz Web de Vault es aún más sencillo listar y revisar los secretos solo haciendo clics de forma intuitiva. Esta imagen resume la secuencia a seguir para encontrar y leer un secreto:
De modo similar a lo mostrado en la línea de comandos, en la interfaz Web también se aprecia que el secreto en cuestión está en su versión 1.
2.4. Actualización de secretos KV en Vault
Actualizar un secreto no es más que volver a escribir datos, lo cual crea una nueva versión del mismo.
Por ejemplo, en así lo haría en la línea de comandos:
vault kv put comun/mysql/dev ip=172.16.10.23 user=root password=NuevoPassword
En la siguiente imagen se ve que el secreto se ha actualizado a su versión 2:
En la interfaz Web de Vault, simplemente hay que dar clic en «Create new version»:
Importante:
- El motor de secretos KV v2 soporta versionamiento de secretos, mientras que el motor KV v1 no soporta dicha funcionalidad.
- Cuando se crea una nueva ruta de secretos KV v2, la cantidad de secretos máxima almacenada por cada secreto es ilimitado. Esto puede generar un aumento en el consumo de espacio en disco, pero también es posible limitar un máximo definido (Ejm: 10).
- Cada secreto, además de los datos sensibles, almacena también metadatos los cuales informan sobre las versiones, sus fechas de creación, entre otros datos importantes.
2.5. Gestión de versiones de secretos
Los Secretos KV en Vault, asumo por defecto la versión 2, soportan versionamiento como ya lo mencioné antes.
En la línea de comandos, así es como puedes consultar cuántas versiones existen de un secreto:
vault kv metadata get comun/mysql/dev
Acá se ve que hay dos secretos, siendo la 2 la vigente:
En la interfaz Web, es más fácil consultar esta información:
Ahora, si quieres ver el valor de un secreto en una versión anterior, lo haces así desde la línea de comandos:
vault kv get -version 1 comun/mysql/dev
En la interfaz Web UI tienes que seleccionar la versión a consultar:
2.6. Eliminación de secretos y versiones
Los Secretos KV en Vault que he mostrado aquí soportan versionamiento. Por ello, a la hora de intentar eliminar un secreto y/o una de sus versiones tienes tres alternativas:
- Eliminar una versión de secreto (recuperable)
- Destruir una versión de secreto (no recuperable)
- Destruir el secreto y todas sus versiones (no recuperable)
A continuación explicaré cada una de estas tres opciones. Pero, para facilitar los ejemplo posteriores, primero voy a crear tres nuevas versiones del secreto comun/mysql/dev como sigue:
vault kv put comun/mysql/dev ip=172.16.10.23 user=root password=p4ssw0rd vault kv put comun/mysql/dev ip=172.16.10.23 user=root password=R4nd0m24 vault kv put comun/mysql/dev ip=172.16.10.23 user=root password=Secret666
Ahora consultaré la lista de versiones existentes y deberían aparecer 5 en total:
vault kv metadata get comun/mysql/dev
2.6.1. Eliminación y recuperación de una versión de secreto
Desde el CLI es simple. Por ejemplo, si deseo eliminar las versiones 3 y 5 haces esto:
vault kv delete -versions 3,5 comun/mysql/dev
Luego, al consultar las versiones del secreto se aprecia que la 3 y la 5 tienen el atributo deletion_time
con una hora y fecha válida, lo cual indica que fueron eliminados.
vault kv metadata get comun/mysql/dev
La recuperación de una versión de secreto (por ejemplo la 3) es también fácil:
vault kv undelete -versions 3 comun/mysql/dev
Esto permite poder acceder nuevamente a la información almacenada en esa versión del secreto.
2.6.2. Destrución de una versión de secreto
Esto destruye permanentemente la versión del secreto deseado, sin posibilidad alguna de recuperarlo.
Por ejemplo, para destruir las versiones 3 y 5 se ejecuta esto:
vault kv destroy -versions 3,5 comun/mysql/dev
El resultado posterior a la eliminación es evidente en la siguiente imagen:
2.6.3. Destruir el secreto y todas sus versiones
Esta acción es irrecuperable, pues destruye todas las versiones de un secreto:
vault kv metadata delete comun/mysql/dev
Así luce el resultado de la operación:
El mensaje de error en color rojo es claro: el secreto ya no existe más.
3. Conclusión
Los secretos KV en Vault en su versión 2, la que soporta versionamiento, son bastante funcionales y potentes.
La versatilidad de opciones que Hashicorp Vault brinda para almacenar, leer, modificar y eliminar versiones de secretos tiene importantes ventajas para una correcta gestión de datos sensibles en las organizaciones, reduciendo de este modo la posibilidad de pérdida accidental o mal intencionada de los mismos.
Esta guía ha sido bastante extensa porque el tema lo amerita, para así poder mostrar las diferentes alternativas que tienes a tu disposición.
En un posterior artículo explicaré cómo integrar otras aplicaciones y herramientas para que consuman Secretos KV en Vault de formas que son bastante comunes en las empresas.
Espero te haya sido de utilidad este artículo.
Deja un comentario