Aller au contenu
Sécurité medium

Opérer Vault en production : guide complet

22 min de lecture

Opérer Vault en production va bien au-delà de l’installation. Ce guide couvre les aspects opérationnels essentiels : dimensionnement, haute disponibilité, monitoring, sauvegardes, maintenance et troubleshooting.

Ce guide suppose que vous avez déjà :

  • Dimensionner un cluster selon votre charge
  • Configurer un cluster HA avec Raft
  • Mettre en place le monitoring Prometheus/Grafana
  • Automatiser les sauvegardes Raft
  • Effectuer les opérations de maintenance
  • Diagnostiquer les problèmes courants
  • Appliquer la checklist de sécurité production

Avant d’entrer dans le détail, les docs officielles identifient trois piliers pour l’observabilité d’un cluster Vault :

SourceContenuUsage
Audit logsToutes les requêtes authentifiéesSécurité, conformité, forensics
Operational logsÉvénements système, erreursTroubleshooting, alertes
TelemetryMétriques Prometheus/StatsDMonitoring, capacity planning

Ces trois sources sont complémentaires. Un cluster production doit les activer toutes.

ConfigurationNœudsTolérance pannesUsage
Développement10Tests, POC
Production31Base de prod la plus courante
Tolérance renforcée52Besoin de résilience accrue
Cas spécifiques73À justifier selon le contexte

Le tableau suivant donne des points de départ, pas des valeurs définitives. Le dimensionnement réel dépend de votre mix de charge.

Charge indicativeCPURAMStockageIOPS
Légère (< 100 req/s)2 vCPU4 GB25 GB SSD1000
Moyenne (100-500 req/s)4 vCPU8 GB50 GB SSD3000
Élevée (500-2000 req/s)8 vCPU16 GB100 GB SSD10000
Très élevée (> 2000 req/s)16 vCPU32 GB200 GB SSD15000+
FacteurImpact
Mix lecture/écritureLes écritures impactent tous les nœuds (réplication)
Transit / PKIOpérations crypto = CPU intensif
Secrets dynamiquesPlus gourmand (connexions DB, appels API)
Audit loggingI/O significatif selon le volume
Nombre de secretsPlus de secrets = plus de stockage et RAM

Points d’attention :

  • Stockage : SSD obligatoire, NVMe recommandé pour les charges élevées
  • IOPS : souvent le goulot d’étranglement
  • Réseau : latence < 10ms entre nœuds du cluster
  • RAM : Vault garde beaucoup en mémoire pour la performance
Architecture cluster Vault HA avec Raft

vault.hcl (nœud 1) :

cluster_name = "vault-prod"
cluster_addr = "https://vault-1.internal:8201"
api_addr = "https://vault-1.internal:8200"
storage "raft" {
path = "/opt/vault/data"
node_id = "vault-1"
retry_join {
leader_api_addr = "https://vault-2.internal:8200"
}
retry_join {
leader_api_addr = "https://vault-3.internal:8200"
}
}
listener "tcp" {
address = "0.0.0.0:8200"
cluster_addr = "0.0.0.0:8201"
tls_cert_file = "/opt/vault/tls/vault.crt"
tls_key_file = "/opt/vault/tls/vault.key"
}
seal "awskms" {
region = "eu-west-1"
kms_key_id = "alias/vault-unseal"
}
# Telemetry pour Prometheus
telemetry {
prometheus_retention_time = "30s"
disable_hostname = true
}

Adaptez pour chaque nœud :

  • cluster_addr et api_addr avec l’adresse du nœud
  • node_id unique
  • retry_join vers les autres nœuds
  1. Préparer le nouveau nœud avec la même configuration (en adaptant node_id, cluster_addr, api_addr)

  2. Démarrer Vault sur le nouveau nœud :

    Fenêtre de terminal
    sudo systemctl start vault
  3. Le nœud contacte les leaders potentiels via retry_join

  4. Vérifier le statut du cluster :

    Fenêtre de terminal
    vault operator raft list-peers

    Sortie attendue :

    Node Address State Voter
    ---- ------- ----- -----
    vault-1 vault-1.internal:8201 leader true
    vault-2 vault-2.internal:8201 follower true
    vault-3 vault-3.internal:8201 follower true

Le load balancer doit distribuer le trafic et vérifier la santé des nœuds.

État du nœudCode par défautAvec standbyok=true
Active (leader)200200
Standby429200
Performance standby (Enterprise)473200
Sealed503503
Uninitialized501501

Exemple HAProxy :

frontend vault_front
bind *:443 ssl crt /etc/haproxy/certs/vault.pem
default_backend vault_back
backend vault_back
balance roundrobin
option httpchk GET /v1/sys/health?standbyok=true
http-check expect status 200
server vault-1 vault-1.internal:8200 check ssl verify none
server vault-2 vault-2.internal:8200 check ssl verify none
server vault-3 vault-3.internal:8200 check ssl verify none

Points clés :

  • Health check sur /v1/sys/health?standbyok=true
  • Session persistence non requise (stateless)
  • Les standby peuvent servir les requêtes de lecture

Vault expose des métriques au format Prometheus sur /v1/sys/metrics.

Activer les métriques dans vault.hcl :

telemetry {
prometheus_retention_time = "30s"
disable_hostname = true
}

Policy pour accéder aux métriques :

path "sys/metrics" {
capabilities = ["read", "list"]
}

Scrape config Prometheus :

scrape_configs:
- job_name: 'vault'
metrics_path: '/v1/sys/metrics'
params:
format: ['prometheus']
scheme: https
tls_config:
insecure_skip_verify: true # Ou configurez le CA
bearer_token_file: /etc/prometheus/vault-token
static_configs:
- targets:
- 'vault-1.internal:8200'
- 'vault-2.internal:8200'
- 'vault-3.internal:8200'

Ce tableau présente des métriques utiles en priorité, pas des seuils absolus. Adaptez les valeurs à votre contexte.

MétriqueAlerte suggéréeSignification
vault_core_unsealed== 0 pendant > 1minVault est scellé
vault_core_activeAucun nœud = 1Pas de leader
vault_raft_leaderChangements fréquentsInstabilité cluster
vault_raft_peers< attenduNœuds déconnectés
vault_audit_log_request_failure> 0Audit en échec (critique)
vault_runtime_alloc_bytesCroissance continuePression mémoire
vault_token_countÀ observerFuite potentielle de tokens
vault_expire_num_leasesCroissance rapideLeases non révoqués
groups:
- name: vault
rules:
- alert: VaultSealed
expr: vault_core_unsealed == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Vault est scellé sur {{ $labels.instance }}"
- alert: VaultNoLeader
expr: sum(vault_core_active) == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Aucun leader Vault actif"
- alert: VaultRaftPeersLow
expr: vault_raft_peers < 3
for: 5m
labels:
severity: warning
annotations:
summary: "Cluster Vault dégradé - {{ $value }} nœuds"
- alert: VaultAuditFailure
expr: rate(vault_audit_log_request_failure[5m]) > 0
for: 1m
labels:
severity: critical
annotations:
summary: "Échec d'écriture des logs d'audit"
- alert: VaultHighMemory
expr: vault_runtime_alloc_bytes / (1024*1024*1024) > 12
for: 10m
labels:
severity: warning
annotations:
summary: "Vault utilise {{ $value | humanize }}GB de RAM"

La communauté propose des dashboards Grafana pour Vault, notamment : Vault Metrics Dashboard

Panneaux recommandés :

  • Statut du cluster (leader, peers)
  • Requêtes par seconde
  • Latence des opérations
  • Utilisation mémoire et CPU
  • Audit log rate
  • Token/Lease counts
TypeContenuDisponibilité
Snapshot Raft manuelDonnées complètesToutes éditions
Snapshot Raft automatiqueDonnées complètes, planifiéEnterprise
Export secretsSecrets spécifiquesToutes éditions
  1. Créer une policy de backup :

    path "sys/storage/raft/snapshot" {
    capabilities = ["read"]
    }
  2. Créer un token dédié :

    Fenêtre de terminal
    vault token create \
    -policy=backup \
    -ttl=8760h \
    -display-name="backup-automation"
  3. Script de backup (/opt/vault/scripts/backup.sh) :

    #!/bin/bash
    set -euo pipefail
    BACKUP_DIR="/opt/vault/backups"
    RETENTION_DAYS=30
    DATE=$(date +%Y%m%d-%H%M%S)
    BACKUP_FILE="${BACKUP_DIR}/vault-snapshot-${DATE}.snap"
    # Vérifier que Vault est accessible
    vault status > /dev/null 2>&1 || {
    echo "ERROR: Vault inaccessible"
    exit 1
    }
    # Créer le snapshot
    vault operator raft snapshot save "${BACKUP_FILE}"
    # Vérifier l'intégrité
    if [[ -f "${BACKUP_FILE}" && -s "${BACKUP_FILE}" ]]; then
    echo "SUCCESS: Snapshot créé ${BACKUP_FILE}"
    # Optionnel : copier vers stockage externe
    # aws s3 cp "${BACKUP_FILE}" s3://my-vault-backups/
    # Nettoyer les anciens backups
    find "${BACKUP_DIR}" -name "*.snap" -mtime +${RETENTION_DAYS} -delete
    else
    echo "ERROR: Snapshot vide ou manquant"
    exit 1
    fi
  4. Planifier avec cron :

    Fenêtre de terminal
    # Toutes les 6 heures
    0 */6 * * * /opt/vault/scripts/backup.sh >> /var/log/vault-backup.log 2>&1

Procédure générale (cluster complet) :

  1. Arrêter tous les nœuds

  2. Sur un nœud, effectuer une restauration forcée :

    Fenêtre de terminal
    vault operator raft snapshot restore -force \
    /opt/vault/backups/vault-snapshot-XXXXXX.snap

    Le flag -force est souvent nécessaire pour les scénarios de disaster recovery.

  3. Démarrer ce nœud et vérifier :

    Fenêtre de terminal
    sudo systemctl start vault
    vault status
    vault secrets list
  4. Redémarrer les autres nœuds qui rejoindront le cluster

  5. Vérifier le cluster :

    Fenêtre de terminal
    vault operator raft list-peers

Un snapshot aide à la récupération des données, mais un Plan de Reprise d’Activité (PRA) complet suppose aussi :

ÉlémentÀ prévoir
Mécanisme de sealLe KMS/HSM doit être accessible
Clés ShamirSi utilisées, elles doivent être disponibles
Certificats TLSSauvegardés séparément
Configurationvault.hcl et scripts
Procédure testéeTest de restauration mensuel

Vault chiffre les données avec une clé interne qui peut être rotée sans downtime :

Fenêtre de terminal
# Vérifier la clé actuelle
vault operator key-status
# Effectuer la rotation
vault operator rotate
# Vérifier la nouvelle version
vault operator key-status

Les données existantes restent lisibles. Les nouvelles écritures utilisent la nouvelle clé.

Le root token initial ne doit jamais être conservé. Après l’initialisation :

  1. Créer des admins avec des policies appropriées

  2. Révoquer le root token initial :

    Fenêtre de terminal
    vault token revoke s.XXXXX
  3. Si besoin d’un nouveau root token (urgence) :

    Fenêtre de terminal
    # Initier la régénération
    vault operator generate-root -init
    # Chaque holder de recovery key (ou unseal key) fournit sa part
    vault operator generate-root \
    -nonce=<nonce> \
    <recovery_key_share>
    # Une fois le seuil atteint, décoder le token
    vault operator generate-root \
    -decode=<encoded_token> \
    -otp=<otp>
Fenêtre de terminal
# Mettre à jour le package
sudo apt update && sudo apt install vault
# Redémarrer (un nœud à la fois en HA)
sudo systemctl restart vault
# Vérifier la version
vault version

Procédure rolling update (cluster HA) :

  1. Mettre à jour un standby (pas le leader)

  2. Vérifier qu’il rejoint le cluster et fonctionne correctement

  3. Répéter pour les autres standby

  4. Step down le leader :

    Fenêtre de terminal
    vault operator step-down
  5. Mettre à jour l’ancien leader devenu standby

  6. Vérifier le cluster :

    Fenêtre de terminal
    vault operator raft list-peers
    vault version
Fenêtre de terminal
# Identifier le node_id à retirer
vault operator raft list-peers
# Retirer le nœud (depuis le leader)
vault operator raft remove-peer vault-old

Vérifier les logs :

Fenêtre de terminal
sudo journalctl -u vault -f

Causes fréquentes :

ErreurCauseSolution
permission deniedMauvaises permissionschown -R vault:vault /opt/vault
address already in usePort 8200/8201 occupéss -tlnp | grep 8200
TLS handshake errorCertificat invalideVérifier dates, CA, SAN
KMS access deniedIAM insuffisantVérifier la policy KMS
seal configuration missingConfig seal absenteVérifier vault.hcl
Fenêtre de terminal
# Vérifier le statut
vault status
# Si auto-unseal, vérifier l'accès KMS
# AWS
aws kms describe-key --key-id alias/vault-unseal
# Si Shamir, désceller manuellement
vault operator unseal

Causes de scellement :

  • Redémarrage du serveur
  • Crash de Vault
  • Appel explicite vault operator seal

Vérifier l’état du cluster :

Fenêtre de terminal
vault operator raft list-peers

Un nœud ne rejoint pas :

Fenêtre de terminal
# Vérifier la connectivité réseau (port 8201)
nc -zv vault-1.internal 8201
# Vérifier les logs du nœud
sudo journalctl -u vault -f
# Forcer une nouvelle tentative
sudo systemctl restart vault

Split-brain (rare) :

Si le cluster se partitionne, les nœuds minoritaires deviennent standby sans leader. Une fois la connectivité rétablie, ils rejoignent automatiquement.

Diagnostiquer :

Fenêtre de terminal
# Latence des opérations
vault read sys/health
# Métriques instantanées
curl -s https://vault:8200/v1/sys/metrics?format=prometheus | grep vault_

Causes fréquentes :

SymptômeCause probableSolution
Latence lecture élevéeDisque lentSSD/NVMe, vérifier IOPS
Latence écriture élevéeRéplication RaftRéduire latence réseau
OOM / crashRAM insuffisanteAugmenter RAM, réduire cache
Timeouts KMSKMS distant/lentRégion KMS plus proche
Fenêtre de terminal
# Vérifier les audit devices
vault audit list
# Regarder l'espace disque
df -h /var/log
# Vérifier les permissions
ls -la /var/log/vault/
  • TLS activé sur tous les listeners
  • Auto-unseal recommandé pour éviter l’intervention manuelle
  • Audit device activé et fonctionnel
  • Root token révoqué après initialisation
  • mlock activé (sauf contrainte conteneur)
  • Firewall : ports 8200 (API) et 8201 (cluster) restreints
  • Load balancer avec health checks /sys/health?standbyok=true
  • Pas d’exposition directe à Internet
  • Policies least privilege pour chaque rôle
  • Pas de policy root pour les utilisateurs normaux
  • Auth methods adaptées (OIDC, LDAP, Kubernetes)
  • Token TTL courts (1h-8h max pour les interactifs)
  • Sauvegardes automatisées (minimum quotidien)
  • Test de restauration mensuel sur environnement isolé
  • Monitoring avec alertes sur sealed, no-leader, audit-failure
  • Rotation clé chiffrement annuelle minimum
  • Secrets dynamiques privilégiés sur statiques
  • TTL courts sur les leases
  • Rotation automatique des credentials DB
  • Response wrapping pour la distribution
  1. Cluster 3 nœuds minimum : la base pour une production résiliente
  2. Auto-unseal recommandé : évite l’intervention manuelle au redémarrage
  3. Monitoring : sealed, no-leader, audit-failure = alertes critiques
  4. Backups testés : snapshot Raft quotidien + test mensuel
  5. Rolling updates : un nœud à la fois, standby d’abord, vérifier les release notes
  6. Audit obligatoire : sans audit, vous perdez la traçabilité
  7. Dimensionnement = test de charge : les tableaux ne remplacent pas l’observation de votre charge réelle

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn