Centralizando Secretos Dinámicos con Hashicorp Vault

Centralizando Secretos Dinámicos con Hashicorp Vault

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

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!