# Centralizando Secretos Dinámicos con Hashicorp Vault

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.

```yaml
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.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1707408116110/ffe35ef2-875c-42c6-8fbb-7dc856013a1e.png align="center")

## 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**.

```yaml
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.

```yaml
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;
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1707408135677/a7961f2e-ac97-49e2-9dcd-150dbc1b9097.png align="center")

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

```yaml
# 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.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1707408160241/4b3fe837-de14-4fd8-8fe8-585676f66c93.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1707408167815/a1e7348e-9a3d-4280-aa0e-f4fa5fd3df9e.png align="center")

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.

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1707408186574/0c3600cf-578d-4485-b516-9a555b07fbb9.png align="center")

¡Espero que les sirva!
