Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

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

1.1

Vue d’ensemble Vault

Concept, architecture, cas d’usage typiques DevOps / Cloud / microservices.

Secrets Encryption Zero Trust
1.2

Installation & modes serveur

Dev server, mode standalone, HA, premiers tests en local.

CLI Dev
1.3

Secrets Engines

KV v2, Transit, Database, Cloud, PKI


KV Transit DB
1.4

Auth Methods

Tokens, AppRole, Kubernetes, OIDC, LDAP, GitHub


AuthN Kubernetes
2.1

Storage backends & HA

Integrated Storage (Raft), Consul, Cloud storage, clustering.

HA Raft
2.2

Tokens, Policies & ACL

ModĂšle RBAC, policies HCL, best practices.

ACL RBAC
3.1

Intégration Applications

SDKs, Vault Agent, sidecar, templates, env vars.

Apps Agent

3.2 Dynamic Secrets

Users DB à la volée, creds cloud, TTL & rotation.

Dynamic Database
3.3

Vault & CI/CD

GitHub Actions, GitLab CI, Jenkins, GitOps.

CI/CD Pipelines

4.1 Sécurité & Hardening

Unseal, root token, audit logs, réseau, durcissement.

Security Hardening
4.2

Operations & SRE

Monitoring, sauvegardes, DRP, upgrades.

Ops SRE
5.1

Cheat-sheet Vault

Commandes, TTL, policies, tokens : mémo rapide.

CLI TTL
1.1 Vue d’ensemble & Architecture HashiCorp Vault
Qu’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”
  1. L’app s’authentifie auprùs de Vault (ex: Kubernetes ServiceAccount).
  2. Vault renvoie un token limité par une policy.
  3. L’app utilise le token pour lire secret/data/app/*.
  4. Le token et le secret ont un TTL configurable.
Flow “dynamic secrets DB”
  1. L’app s’authentifie auprùs de Vault.
  2. Vault contacte la base de données (MySQL, PostgreSQL
).
  3. Vault crée un user temporaire avec des rÎles précis.
  4. Vault renvoie de maniĂšre Ă©phĂ©mĂšre login / mot de passe Ă  l’app.
  5. 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
).
1.2 Installation & Modes serveur Vault
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.

1.3 Secrets Engines – KV, Transit, Database & co.
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.

1.4 Auth Methods – Tokens, AppRole, Kubernetes, OIDC

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"
                    
2.1 Storage backends & High Availability
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
BackendUsage typique
ConsulHistorique, quand Consul est déjà core du SI.
Cloud storageBackends 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.

2.2 Tokens, Policies & ModĂšle ACL Vault
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.
3.1 Intégration Vault dans les Applications (SDK, Agent, Sidecar)
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
).

3.2 Dynamic Secrets – DB & Cloud credentials Ă©phĂ©mĂšres
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.

3.3 Intégrer Vault dans les Pipelines CI/CD
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.
4.1 Sécurité, Unseal, Root token & Hardening Vault
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
                    
4.2 Operations, Monitoring & DRP Vault
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).

5.1 Cheat-sheet Vault – Commandes & Patterns rapides
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.