Skip to Content

HashiCorp Vault i Docker Compose: gestió de secrets pas a pas

13 July 2026 by
Ilimit Comunicacions S.L., Oscar Mas

Soc Òscar Mas i avui us vull explicar com agafar secrets d'un servidor de Vault i entregar a un fitxer de variables, que el farem servir per aixecar un docker compose amb la nostra aplicació. 

Per fer aquest laboratori necessitarem dos equips:

  • Servidor de Vault
  • Client amb el servei de Docker Compose instal·lat
HashiCorp Vault genera variables .env per a Docker Compose

Configuració de Vault

Verificar l'estat unseal de HashiCorp Vault

Primer de tot, ens ficarem dintre del contenidor de Vault i verificarem que estigui "unselaed". Recordeu que un sistema de Vault estigui "unseal", vol dir que es poden desxifrar les dades que hi ha a Vault o, millor dit, que ja podem accedir als secrets que hem guardat a Vault.

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

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

A partir d'aquí iniciarem sessió amb el token de root, ja que el necessitarem per poder treballar:

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

Crear el Secret Engine per a Docker Compose

Habilitarem i configurarem un nou motor d'emmagatzematge de secrets (Secret Engine) en la ruta (path): docker-compose. Com ja vam explicar en anteriors posts, habilitarem la versió 2, d'aquesta manera podrem tenir versionat de secrets i fer un rollback del secret en cas que ho necessitem:

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

Crear un secret per a Docker Compose

Crearem el nostre secret:

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

Crear una política de lectura a Vault

Crearem una política de lectura per poder agafar les dades:

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

Configurar l'autenticació AppRole a Vault

Activarem el mètode d'autenticació de AppRole i l'enllaçarem amb la política que hem creat.

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

Amb aquest mètode, deixem que només es pugui accedir al secret si ens passem els següents valors:

  • RoleID (com a usuari)
  • SecretID (com a contrasenya)

Recordeu, no es podrà accedir als secrets de Vault amb un token, només amb un RoleID i un SecretID.

Obtenir el RoleID i el SecretID

Ara li indicarem que ens doni el RoleID i 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

Us heu d'apuntar aquests dos valors, ja que els farem servir en el nostre client:

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

Configuració del client

Instal·lar la CLI de HashiCorp Vault

Un cop dins en el servidor que farà les funcionalitats de client, el primer que hem de fer és instal·lar el CLI de HashiCorp Vault. Aquest binari el que farà és connectar-se a Vault, amb unes dades que li passarem: RoleID, SecretID, URL de Vault, etc... i d'aquesta manera podrà consultar el nostre secret i gravar-lo en un fitxer de variables que li indiquem:

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 per accedir als secrets

Un cop descarregat, crearem el fitxer amb les dades de configuració per poder accedir 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 i el SecretID

Posarem el RoleID i el SecretID en un altre fitxer:

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 d'entorn

I a partir d'aquí, crearem el fitxer de template, per poder posar les dades del secret en el format que millor s'adapti a les nostres necessitats:

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ó de Vault amb Docker Compose

I ara només queda validar que tot funciona correctament:

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 us hagi servit d'ajuda o sinó com a mínim, que hàgiu descobert una nova funcionalitat de Vault.