đ HashiCorp Vault â Secrets Management & Encryption
Guide IDEO-Lab pour comprendre, installer et intégrer HashiCorp Vault en environnement DevOps : gestion centralisée des secrets, chiffrement, dynamic secrets & policies.
Vue dâensemble Vault
Concept, architecture, cas dâusage typiques DevOps / Cloud / microservices.
Secrets Encryption Zero TrustInstallation & modes serveur
Dev server, mode standalone, HA, premiers tests en local.
CLI DevSecrets Engines
KV v2, Transit, Database, Cloud, PKIâŠ
KV Transit DBAuth Methods
Tokens, AppRole, Kubernetes, OIDC, LDAP, GitHubâŠ
AuthN KubernetesStorage backends & HA
Integrated Storage (Raft), Consul, Cloud storage, clustering.
HA RaftTokens, Policies & ACL
ModĂšle RBAC, policies HCL, best practices.
ACL RBACIntégration Applications
SDKs, Vault Agent, sidecar, templates, env vars.
Apps Agent3.2 Dynamic Secrets
Users DB à la volée, creds cloud, TTL & rotation.
Dynamic DatabaseVault & CI/CD
GitHub Actions, GitLab CI, Jenkins, GitOps.
CI/CD Pipelines4.1 Sécurité & Hardening
Unseal, root token, audit logs, réseau, durcissement.
Security HardeningOperations & SRE
Monitoring, sauvegardes, DRP, upgrades.
Ops SRECheat-sheet Vault
Commandes, TTL, policies, tokens : mémo rapide.
CLI TTLQuâest-ce que Vault ?
HashiCorp Vault est une solution centralisée de secrets management et de chiffrement pour les environnements modernes (Cloud, Kubernetes, microservices).
- Stocker et distribuer des secrets (mots de passe, tokens, API keys).
- Générer des secrets dynamiques (users DB, access keys Cloud).
- Fournir des APIs de chiffrement (Transit Engine) pour les apps.
- Appliquer des policies fines (ACL) pour chaque app/service.
Approche âZero Trustâ
Vault sâinscrit dans une approche Zero Trust : on ne fait plus confiance Ă lâinfrastructure, seulement aux identitĂ©s (apps, services, humains).
- Chaque app sâauthentifie auprĂšs de Vault (AppRole, JWT, KubernetesâŠ).
- Vault délivre un token avec un périmÚtre (policy) précis.
- Les accÚs sont tracés dans les audit logs.
Composants principaux
- Core : cĆur de Vault (auth, policies, audit, storage).
- Storage backend : oĂč sont stockĂ©es les donnĂ©es chiffrĂ©es (Raft intĂ©grĂ©, Consul, etc.).
- Secrets Engines : KV, Transit, Database, Cloud, PKIâŠ
- Auth Methods : AppRole, Kubernetes, JWT/OIDC, LDAPâŠ
Vision âAPI firstâ
# Exemple de lecture d'un secret KV v2 (curl)
curl \
--header "X-Vault-Token: <token>" \
https://vault.ideo-lab.com/v1/secret/data/app/django
# Réponse JSON (valeur dans data.data)
{
"data": {
"data": {
"DJANGO_SECRET_KEY": "xxx",
"DB_PASSWORD": "yyy"
},
"metadata": {
"version": 2,
"created_time": "...",
"deletion_time": ""
}
}
}
Flow simple âapp â secretâ
- Lâapp sâauthentifie auprĂšs de Vault (ex: Kubernetes ServiceAccount).
- Vault renvoie un token limité par une policy.
- Lâapp utilise le token pour lire
secret/data/app/*. - Le token et le secret ont un TTL configurable.
Flow âdynamic secrets DBâ
- Lâapp sâauthentifie auprĂšs de Vault.
- Vault contacte la base de donnĂ©es (MySQL, PostgreSQLâŠ).
- Vault crée un user temporaire avec des rÎles précis.
- Vault renvoie de maniĂšre Ă©phĂ©mĂšre login / mot de passe Ă lâapp.
- Une fois le TTL expirĂ©, lâuser DB est rĂ©voquĂ© automatiquement.
Cas dâusage DevOps & SRE
- Centralisation des secrets sur tous les environnements (dev, QA, prod).
- Rotation automatique de mots de passe DB et access keys cloud.
- Chiffrement applicatif (Transit) sans manipuler les clés directement.
- Onboarding/offboarding dâapps / teams via les policies.
Pourquoi Vault devient clé dans un SI moderne
- Explosion du nombre de secrets (microservices, CI/CD, SaaSâŠ).
- Obligations de conformitĂ© (ISO, SOC2, RGPDâŠ).
- Besoin de traceabilité : qui a accédé à quoi, quand ?
- RĂ©duction du âsecret sprawlâ (fichiers .env, Ansible vars, configs GitâŠ).
Linux / macOS
# Via apt / yum (exemple)
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository \
"deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install vault
vault version
Docker (rapide)
docker run --cap-add=IPC_LOCK \
-e 'VAULT_DEV_ROOT_TOKEN_ID=root' \
-p 8200:8200 \
hashicorp/vault:latest
Variables essentielles
export VAULT_ADDR="http://127.0.0.1:8200"
export VAULT_TOKEN="root" # dev uniquement ! Ă proscrire en prod
En production : pas de dev root token, pas de HTTP, pas de VAULT_TOKEN en clair dans le shell.
Dev mode (non persistant)
vault server -dev \
-dev-root-token-id=root \
-dev-listen-address="0.0.0.0:8200"
- Storage en mémoire (perdu au redémarrage).
- Unseal automatique.
- Root token connu en clair.
Usage typique
- Démos, tests de scripts, lab local.
- Pas dâexposition vers Internet.
- Toujours isolĂ© (Docker, VMâŠ)
Câest le mode parfait pour expĂ©rimenter rapidement les commandes du guide, mais Ă bannir pour tout environnement partagĂ©.
Configuration standalone (fichier HCL)
listener "tcp" {
address = "0.0.0.0:8200"
tls_disable = "0"
tls_cert_file = "/etc/vault/tls/server.crt"
tls_key_file = "/etc/vault/tls/server.key"
}
storage "raft" {
path = "/opt/vault/data"
node_id = "vault-1"
}
api_addr = "https://vault01.ideo-lab.com:8200"
cluster_addr = "https://vault01.ideo-lab.com:8201"
Lancement
vault server -config=/etc/vault/config.hcl
# Initialisation (une seule fois)
vault operator init
# Unseal (avec les clés retournées par init)
vault operator unseal
vault operator unseal
vault operator unseal
En HA, plusieurs nodes partagent le mĂȘme storage backend (Raft / Consul) avec un leader Ă©lu.
Activer KV v2
vault secrets enable -path=secret kv-v2
Ăcrire / lire des secrets
vault kv put secret/app/django \
DJANGO_SECRET_KEY="xxx" \
DB_PASSWORD="yyy"
vault kv get secret/app/django
Versionning & métadonnées
- KV v2 permet de versionner les secrets.
- Roll-back rapide vers une version précédente.
- Soft-delete, destruction dĂ©finitive, TTLâŠ
vault kv metadata get secret/app/django
vault kv rollback secret/app/django -version=1
Transit : chiffrer sans gérer les clés
vault secrets enable transit
vault write -f transit/keys/client-data
Les apps envoient les données à chiffrer à Vault (via HTTPS), Vault renvoie les données chiffrées ; les clés ne quittent jamais Vault.
API CLI
# Chiffrer
vault write transit/encrypt/client-data \
plaintext=$(echo -n "hello" | base64)
# Déchiffrer
vault write transit/decrypt/client-data \
ciphertext="vault:v1:...."
Intéressant pour protéger des données sensibles (PII, secrets applicatifs) sans réinventer la crypto cÎté app.
Database Secrets Engine
vault secrets enable database
vault write database/config/mydb \
plugin_name="postgresql-database-plugin" \
connection_url="postgresql://vault:pass@db:5432/postgres?sslmode=disable" \
allowed_roles="app-role"
vault write database/roles/app-role \
db_name="mydb" \
creation_statements="CREATE ROLE \"\" WITH LOGIN PASSWORD '' VALID UNTIL '';" \
default_ttl="1h" \
max_ttl="24h"
Obtenir un user DB dynamique
vault read database/creds/app-role
# Retour : username / password avec TTL
MĂȘme principe pour les secrets engines Cloud (AWS, GCP, Azure) : Vault gĂ©nĂšre des access keys avec un TTL, supprimĂ©es automatiquement Ă expiration.
Tokens & AppRole
# Auth method AppRole
vault auth enable approle
vault write auth/approle/role/django \
token_policies="django-app" \
token_ttl="1h" \
token_max_ttl="24h"
# Récupérer role_id & secret_id
vault read auth/approle/role/django/role-id
vault write -f auth/approle/role/django/secret-id
Une app peut sâauthentifier avec (role_id, secret_id) pour obtenir son token Vault.
Kubernetes & OIDC
- Kubernetes : Vault valide le JWT du ServiceAccount.
- OIDC : intĂ©gration avec un IdP (Keycloak, Azure ADâŠ).
- LDAP/GitHub : pour les utilisateurs humains.
vault auth enable kubernetes
vault write auth/kubernetes/config \
kubernetes_host="https://$KUBERNETES_PORT_443_TCP_ADDR:443" \
token_reviewer_jwt="$SA_JWT" \
kubernetes_ca_cert="$SA_CA_CRT"
Integrated Storage (Raft)
Mode recommandĂ© pour de nombreuses installs : pas besoin dâun systĂšme externe (Consul).
storage "raft" {
path = "/opt/vault/data"
node_id = "vault-1"
}
- HA natif (plusieurs nodes Raft).
- Snapshot & backup via commandes Raft.
Consul & autres backends
| Backend | Usage typique |
|---|---|
| Consul | Historique, quand Consul est déjà core du SI. |
| Cloud storage | Backends managés (certaines offres SaaS / Cloud). |
Quel que soit le backend, les donnĂ©es sont dĂ©jĂ chiffrĂ©es par Vault avant dâĂȘtre Ă©crites dans le storage.
Policy HCL
# django-app.hcl
path "secret/data/app/django/*" {
capabilities = ["read", "list"]
}
path "database/creds/django-role" {
capabilities = ["read"]
}
vault policy write django-app django-app.hcl
Tokens liés aux policies
vault token create -policy="django-app" -ttl="1h"
# voir les infos
vault token lookup <token>
- Principe du least privilege : chaque app a sa policy minimale.
- TTL court sur les tokens (et possibilité de renewal contrÎlé).
- Pas de partage de token entre apps/services.
Pattern âVault Agent + Templateâ
# agent.hcl
exit_after_auth = false
pid_file = "/run/vault-agent.pid"
auto_auth {
method "approle" {
mount_path = "auth/approle"
config = {
role_id_file_path = "/etc/vault/role_id"
secret_id_file_path = "/etc/vault/secret_id"
}
}
sink "file" {
config = {
path = "/run/vault/token"
}
}
}
template {
source = "/etc/vault/templates/django.env.tpl"
destination = "/run/vault/django.env"
}
Template dâenv (extrait)
DJANGO_SECRET_KEY="{{ with secret "secret/data/app/django" -}}
{{ .Data.data.DJANGO_SECRET_KEY }}{{- end }}"
DB_PASSWORD="{{ with secret "secret/data/app/django" -}}
{{ .Data.data.DB_PASSWORD }}{{- end }}"
Lâapp source simplement /run/vault/django.env au dĂ©marrage ; Vault Agent gĂšre toute la complexitĂ© (auth, rotation, templatesâŠ).
Base de données
# obtenir un user DB dynamique
vault read database/creds/django-role
Key Value
--- -----
lease_id database/creds/django-role/...
lease_duration 1h
lease_renewable true
username v-token-django-1234
password A1b2C3d4...
- TTL court (ex: 1h), renouvelable si besoin.
- Révocation automatique à la fin du lease.
Cloud credentials (AWS par ex.)
vault secrets enable aws
vault write aws/config/root \
access_key="AKIA..." \
secret_key="..." \
region="eu-west-1"
vault write aws/roles/app-role \
credential_type=iam_user \
policy_document=@policy.json
vault read aws/creds/app-role
Tes apps nâutilisent plus de access keys âpermanentesâ ; Vault Ă©met des credentials Ă durĂ©e de vie limitĂ©e, avec des permissions minimales.
GitHub Actions (exemple)
name: Build & Deploy
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Vault CLI
run: |
sudo apt-get update && sudo apt-get install -y vault
- name: Fetch secrets from Vault
env:
VAULT_ADDR: $
VAULT_TOKEN: $
run: |
vault kv get -format=json secret/app/django \
| jq -r '.data.data.DJANGO_SECRET_KEY' \
>> $GITHUB_ENV
Bonnes pratiques CI/CD
- Le pipeline CI sâauthentifie lui-mĂȘme via un AppRole dĂ©diĂ©.
- Les secrets ne sont jamais commités ni stockés dans les logs.
- TTL trĂšs courts pour les tokens CI.
- Audit activé pour suivre les lectures de secrets par les pipelines.
Initialisation & Unseal
vault operator init
Unseal Key 1: xxx
Unseal Key 2: yyy
Unseal Key 3: zzz
Initial Root Token: s.xxxxx
- Les unseal keys sont réparties (Shamir) entre plusieurs personnes.
- Plusieurs keys sont nĂ©cessaires pour âouvrirâ Vault aprĂšs un restart.
- Le root token ne doit servir quâĂ la bootstrap, puis ĂȘtre rĂ©voquĂ©.
Hardening réseau & TLS
- Vault toujours derriĂšre TLS (certs valides, pas de TLS disable).
- AccÚs réseau trÚs restreint (SG, firewall, mTLS éventuellement).
- Audit logs activés sur un backend (fichier, syslog, SIEM).
vault audit enable file file_path=/var/log/vault/audit.log
Monitoring
- Exporter les métriques vers Prometheus / Grafana.
- Surveiller le leader HA, la latence API, les erreurs.
- Alertes sur les errors dâauth, les 5xx API, etc.
# Exemple : endpoint /sys/metrics (selon version/licence)
curl $VAULT_ADDR/v1/sys/health
Sauvegardes & DRP
- Avec Raft : snapshots réguliers du storage data.
- Test de restore régulier (environnement de DRp).
- Documenter la procédure de re-unseal en DR (quorum de personnes).
Lâobjectif : capacitĂ© Ă reconstruire un cluster Vault fonctionnel Ă partir des snapshots + des unseal keys, dans un dĂ©lai maĂźtrisĂ© (RTO).
CLI essentiel
vault status # état du cluster
vault login # login interactif
vault kv put/get # secrets KV
vault token create # créer un token
vault token revoke # révoquer
vault policy list/read/write # policies
vault auth enable/disable # auth methods
vault secrets enable/disable # engines
vault operator init/unseal # Bootstrap
vault operator rekey/rotate # Gestion clés
Patterns Ă retenir
- Jamais de secrets en clair dans Git : tout passe par Vault.
- Utiliser des policies dédiées aux apps & teams.
- TTL court partout (tokens, dynamic secrets, leases).
- Vault Agent/sidecar quand câest possible, plutĂŽt que dâembarquer un client lourd dans lâapp.
- Activer & monitorer lâaudit en continu.
