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