Ir al contenido

HashiCorp Vault y Docker Compose: gestión de secretos paso a paso

13 de julio de 2026 por
Ilimit Comunicacions S.L., Oscar Mas

Soy Òscar Mas y hoy os quiero explicar cómo coger secretos de un servidor de Vault y ponerlos en un archivo de variables que nos servirá para levantar un Docker Compose.

Para hacer este laboratorio necesitaremos dos equipos:

  • Servidor de Vault
  • Cliente con el servicio de Docker Compose instalado
HashiCorp Vault genera variables .env para Docker Compose

Configuración de Vault

Verificar el estado unseal de HashiCorp Vault

Primero de todo, nos meteremos dentro del contenedor de Vault y verificaremos que esté "unsealed". Recordad que un sistema de Vault esté "unsealed", quiere decir que se pueden descifrar los datos que hay en Vault o, mejor dicho, que ya podemos acceder a los secretos que hemos guardado en Vault.

root@vault:~# docker exec -it vault ash

/ # vault status Key Value --- ----- ... ... Sealed false ... ...

A partir de aquí iniciaremos sesión con el token de root, ya que lo necesitaremos para poder trabajar:

/ # export VAULT_ADDR=http://127.0.0.1:8200
/ # vault login s.KaU83zJXYPXaZZCfFkgT8eJX

Crear el Secret Engine para Docker Compose

Habilitaremos y configuraremos un nuevo motor de almacenamiento de secretos (Secret Engine) en la ruta (path): docker-compose. Como ya explicamos en anteriores posts, habilitaremos la versión 2, de esta manera podremos tener versionado de secretos y hacer un rollback del secreto en caso de que lo necesitemos:

/ # vault secrets enable -description="Secrets AppRole Docker Compose" -version=2 -path=docker-compose kv

Crear un secreto para Docker Compose

Crearemos nuestro secreto:

/ # vault kv put docker-compose/vault-cli-docker/dbinfo username='secret-username' password='secret-password'

Crear una política de lectura en Vault

Crearemos una política de lectura para poder coger los datos:

/ # vault policy write policy-vault-cli-docker - <<EOF
path "docker-compose/data/vault-cli-docker/dbinfo" {
    capabilities = ["read"]
}
EOF

Configurar la autenticación AppRole en Vault

Activaremos el método de autenticación de AppRole y lo enlazaremos con la política que hemos creado.

/ # vault auth enable approle
/ # vault write auth/approle/role/vault-agent-role-docker-compose policies="policy-vault-cli-docker"

Con este método, dejamos que solo se pueda acceder al secreto si le pasamos los siguientes valores:

  • RoleID (como usuario)
  • SecretID (como contraseña)

Recordad, no se podrá acceder a los secretos de Vault con un token, solo con un RoleID y un SecretID.

Obtener el RoleID y el SecretID

Ahora le indicaremos que nos dé el RoleID y el SecretID.

/ # vault read auth/approle/role/vault-agent-role-docker-compose/role-id
Key        Value
---        -----
role_id    3e3fab5c-f3b3-7489-9c42-6fa4e9ba73d4

/ # vault write -f auth/approle/role/vault-agent-role-docker-compose/secret-id
Key                   Value
---                   -----
secret_id             b0f8cf4c-a4e3-bd9a-3387-2fef649500df
secret_id_accessor    946ef901-791e-a362-e2ac-4069eeaed41e
secret_id_num_uses    0
secret_id_ttl         0s

Os tenéis que apuntar estos dos valores, ya que los utilizaremos en nuestro cliente:

  • RoleID: 3e3fab5c-f3b3-7489-9c42-6fa4e9ba73d4
  • SecretID: b0f8cf4c-a4e3-bd9a-3387-2fef649500df

Configuración del cliente

Instalar la CLI de HashiCorp Vault

Una vez dentro en el servidor que hará las funcionalidades de cliente, lo primero que tenemos que hacer es instalar el CLI de HashiCorp Vault. Este binario lo que hará es conectarse a Vault, con unos datos que le pasaremos: RoleID, SecretID, URL de Vault, etc... y de esta manera podrá consultar nuestro secreto y grabarlo en un archivo de variables que le indiquemos:

root@vault-cli-docker:~# apt update && apt install -y unzip
root@vault-cli-docker:~# VAULT_RELEASE="1.19.4"
root@vault-cli-docker:~# wget https://releases.hashicorp.com/vault/${VAULT_RELEASE}/vault_${VAULT_RELEASE}_linux_amd64.zip
root@vault-cli-docker:~# unzip vault_${VAULT_RELEASE}_linux_amd64.zip
root@vault-cli-docker:~# mv vault /usr/local/bin/

Configurar Vault Agent para acceder a los secretos

Una vez descargado, crearemos el archivo con los datos de configuración para poder acceder a Vault:

root@vault-cli-docker:~# vim /etc/docker-compose/vault-agent.hcl
vault {
  address = "http://vault.ilba.cat"
}
auto_auth {
   method "approle" {
       mount_path = "auth/approle"
       config = {
           role_id_file_path = "/etc/docker-compose/role_id"
           secret_id_file_path = "/etc/docker-compose/secret_id"
           remove_secret_id_file_after_reading = false
       }
   }
   sink "file" {
       config = {
           path = "/etc/docker-compose/vault-agent-token"
       }
   }
}
template {
  source      = "/etc/docker-compose/env-template.tmpl"
  destination = "/etc/docker-compose/.env"
}

Configurar el RoleID y el SecretID

Pondremos el RoleID y el SecretID en otro archivo:

root@vault-cli-docker:~# echo "3e3fab5c-f3b3-7489-9c42-6fa4e9ba73d4" > /etc/docker-compose/role_id
root@vault-cli-docker:~# echo "b0f8cf4c-a4e3-bd9a-3387-2fef649500df" > /etc/docker-compose/secret_id

Crear la plantilla de variables de entorno

Y a partir de aquí, crearemos el archivo de template, para poder poner los datos del secreto en el formato que mejor se adapte a nuestras necesidades:

root@vault-cli-docker:~# vim /etc/docker-compose/env-template.tmpl
DB_USER={{ with secret "docker-compose/data/vault-cli-docker/dbinfo" }}{{ .Data.data.username }}{{ end }}
DB_PASS={{ with secret "docker-compose/data/vault-cli-docker/dbinfo" }}{{ .Data.data.password }}{{ end }}

Validar la integración de Vault con Docker Compose

Y ahora solo queda validar que todo funciona correctamente:

root@vault-cli-docker:~# vault agent -config=/etc/docker-compose/vault-agent.hcl

root@vault-cli-docker:~# cat /etc/docker-compose/.env
DB_USER=secret-username
DB_PASS=secret-password

Espero que os haya servido de ayuda o si no como mínimo, que hayáis descubierto una nueva funcionalidad de Vault.