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