Skip to main content

Command Palette

Search for a command to run...

Centralizando Secretos Dinámicos con Hashicorp Vault

Vault la bóveda que nos sirve para la administración de secretos que todos debemos manejar

Updated
3 min read
Centralizando Secretos Dinámicos con Hashicorp Vault
S

I have a bachelor's degree in Technology from the University of Palermo, a Master in Information Security from the University of Murcia and different certifications such as CISSP | CISM | CDPSE | CCSK | CSX | MCSA | SMAC™️ | DSOE | DEPC | CSFPC | CSFPC | 5x AWS Certified.

He is currently CISO at Klar, a Mexican Fintech. He was fortunate to be awarded as CISO of the Year in Argentina in 2021 and was among the Top 100 CISO's in the World in 2022.

A lover of new technologies, he has developed a career in DevSecOps and Cloud Security at Eko Party, the largest security conference in Latin America.

Hace un tiempo escribí sobre el manejo de secretos estáticos en HashiCorp Vault en esta entrada. ¡Hoy le tocan a los dinámicos! Para ello vamos a usar un docker-compose donde levantaremos un Vault + MySQLServer.

¿Que es Vault?

Como su nombre lo indica es una bóveda que nos sirve para la administración de secretos. Nos permite administrar el almacenamiento de los mismos como nombre de usuario, contraseña y credenciales de Base de Datos.

Manos a la obra. Vamos a necesitar, para esta POC, tener instalado Docker & Docker-Compose.

version: "3.3"
services:
  vault:
    image: vault
    container_name: vault-dev
    ports:
      - '8200:8200'
    restart: always
    volumes:
      - ./vault/config:/vault/config
      - ./vault/policies:/vault/policies
      - ./vault/data:/vault/data
      - ./vault/logs:/vault/logs
    environment:
      - 'VAULT_ADDR=http://localhost:8200'
      - 'VAULT_DEV_ROOT_TOKEN_ID=00000000-0000-0000-0000-000000000000'
      - 'dev'

    cap_add:
      - IPC_LOCK
  db:
    image: mysql/mysql-server:5.7
    container_name: mysql-dev
    restart: always
    environment:
     MYSQL_ROOT_PASSWORD: 's4nt1ag0'

    ports:
      - '3306:3306'
    expose:
      - '3306'
    volumes:
      - mysql-db:/var/lib/mysql
volumes:
  mysql-db:

Ahora corremos la configuración, del manifiesto, con docker-compose up.

Configuración MySQL

Podríamos utilizar el usuario root, para la PoC, pero como "Best Practice" vamos a crear un usuario llamado wordpress con todos los privilegios necesarios para la prueba. ¡Vamos a conectarnos a nuestro docker, via shell, para crearlo! Si revisan el manifiesto lo llamamos container_name: mysql-dev.

docker exec -it mysql-dev  mysql -uroot -p's4nt1ag0'
CREATE DATABASE 'wordpress_db';
CREATE USER 'wordpress'@'%' IDENTIFIED BY 'wordpress';
GRANT ALL PRIVILEGES ON *.* TO 'wordpress_db' WITH GRANT OPTION;

Configuración Vault

Vamos a conectarnos al docker, si revisan el manifiesto lo llamamos container_name: vault-dev. Ya en el contendor vamos agregar las variables de entorno e instalar el plugin the MySQL.

docker exec -it mysql-dev  mysql -uroot -p's4nt1ag0'
CREATE DATABASE 'wordpress_db';
CREATE USER 'wordpress'@'%' IDENTIFIED BY 'wordpress';
GRANT ALL PRIVILEGES ON *.* TO 'wordpress_db' WITH GRANT OPTION;

Ahora vamos a configurar la base de datos y los roles para el consumo.

# Configurar Base de Datos para MySQL
vault write database/config/my-mysql-database \
    plugin_name=mysql-database-plugin \
    connection_url="wordpress:wordpress@tcp(mysql-dev:3306)/" \
    allowed_roles="*" \
    username="wordpress" \
    password="wordpress" \
    default_ttl="1h" \
    max_ttl="386h"

# Configurar Roles para Usuarios Dinamicos
vault write database/roles/my-role \
    db_name=wordpress_db \
    creation_statements="CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}';GRANT SELECT ON *.* TO '{{name}}'@'%';" \
    default_ttl="1h" \
    max_ttl="24h"

¡Listo! Ahora podemos consumir Vault y obtener los secretos dinámicos con vault read database/creds/my-role. Aca les dejo una imagen como se popula la base de datos, con el usuarios & password dinámico, y la forma de consumir los secretos.

En la primer imagen consultamos el rol y nos entrega el usuario & password, mientras hacemos la query en la tabla de usuarios de MySQL encontramos el usuarios dinámico que tiene un lease de 1 hora.

Aca le dejo el comando curl para poder jugar con el JSON.

curl --header "X-Vault-Token: $VAULT_TOKEN" \
       --request GET \
       http://127.0.0.1:8200/v1/database/creds/my-role | jq

¡Espero que les sirva!