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.
Prérequis
Section intitulée « Prérequis »Ce guide suppose que vous avez déjà :
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- 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
Sources de données critiques
Section intitulée « Sources de données critiques »Avant d’entrer dans le détail, les docs officielles identifient trois piliers pour l’observabilité d’un cluster Vault :
| Source | Contenu | Usage |
|---|---|---|
| Audit logs | Toutes les requêtes authentifiées | Sécurité, conformité, forensics |
| Operational logs | Événements système, erreurs | Troubleshooting, alertes |
| Telemetry | Métriques Prometheus/StatsD | Monitoring, capacity planning |
Ces trois sources sont complémentaires. Un cluster production doit les activer toutes.
Dimensionnement du cluster
Section intitulée « Dimensionnement du cluster »Combien de nœuds ?
Section intitulée « Combien de nœuds ? »| Configuration | Nœuds | Tolérance pannes | Usage |
|---|---|---|---|
| Développement | 1 | 0 | Tests, POC |
| Production | 3 | 1 | Base de prod la plus courante |
| Tolérance renforcée | 5 | 2 | Besoin de résilience accrue |
| Cas spécifiques | 7 | 3 | À justifier selon le contexte |
Ordres de grandeur des ressources
Section intitulée « Ordres de grandeur des ressources »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 indicative | CPU | RAM | Stockage | IOPS |
|---|---|---|---|---|
| Légère (< 100 req/s) | 2 vCPU | 4 GB | 25 GB SSD | 1000 |
| Moyenne (100-500 req/s) | 4 vCPU | 8 GB | 50 GB SSD | 3000 |
| Élevée (500-2000 req/s) | 8 vCPU | 16 GB | 100 GB SSD | 10000 |
| Très élevée (> 2000 req/s) | 16 vCPU | 32 GB | 200 GB SSD | 15000+ |
Facteurs de dimensionnement
Section intitulée « Facteurs de dimensionnement »| Facteur | Impact |
|---|---|
| Mix lecture/écriture | Les écritures impactent tous les nœuds (réplication) |
| Transit / PKI | Opérations crypto = CPU intensif |
| Secrets dynamiques | Plus gourmand (connexions DB, appels API) |
| Audit logging | I/O significatif selon le volume |
| Nombre de secrets | Plus 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 haute disponibilité
Section intitulée « Architecture haute disponibilité »Cluster Raft 3 nœuds
Section intitulée « Cluster Raft 3 nœuds »Configuration Raft multi-nœuds
Section intitulée « Configuration Raft multi-nœuds »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 Prometheustelemetry { prometheus_retention_time = "30s" disable_hostname = true}Adaptez pour chaque nœud :
cluster_addretapi_addravec l’adresse du nœudnode_iduniqueretry_joinvers les autres nœuds
Rejoindre un cluster existant
Section intitulée « Rejoindre un cluster existant »-
Préparer le nouveau nœud avec la même configuration (en adaptant node_id, cluster_addr, api_addr)
-
Démarrer Vault sur le nouveau nœud :
Fenêtre de terminal sudo systemctl start vault -
Le nœud contacte les leaders potentiels via
retry_join -
Vérifier le statut du cluster :
Fenêtre de terminal vault operator raft list-peersSortie attendue :
Node Address State Voter---- ------- ----- -----vault-1 vault-1.internal:8201 leader truevault-2 vault-2.internal:8201 follower truevault-3 vault-3.internal:8201 follower true
Load balancer et health checks
Section intitulée « Load balancer et health checks »Le load balancer doit distribuer le trafic et vérifier la santé des nœuds.
Codes retour de /v1/sys/health
Section intitulée « Codes retour de /v1/sys/health »| État du nœud | Code par défaut | Avec standbyok=true |
|---|---|---|
| Active (leader) | 200 | 200 |
| Standby | 429 | 200 |
| Performance standby (Enterprise) | 473 | 200 |
| Sealed | 503 | 503 |
| Uninitialized | 501 | 501 |
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 nonePoints clés :
- Health check sur
/v1/sys/health?standbyok=true - Session persistence non requise (stateless)
- Les standby peuvent servir les requêtes de lecture
Monitoring et alertes
Section intitulée « Monitoring et alertes »Métriques Prometheus
Section intitulée « Métriques Prometheus »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'Métriques utiles à surveiller
Section intitulée « Métriques utiles à surveiller »Ce tableau présente des métriques utiles en priorité, pas des seuils absolus. Adaptez les valeurs à votre contexte.
| Métrique | Alerte suggérée | Signification |
|---|---|---|
vault_core_unsealed | == 0 pendant > 1min | Vault est scellé |
vault_core_active | Aucun nœud = 1 | Pas de leader |
vault_raft_leader | Changements fréquents | Instabilité cluster |
vault_raft_peers | < attendu | Nœuds déconnectés |
vault_audit_log_request_failure | > 0 | Audit en échec (critique) |
vault_runtime_alloc_bytes | Croissance continue | Pression mémoire |
vault_token_count | À observer | Fuite potentielle de tokens |
vault_expire_num_leases | Croissance rapide | Leases non révoqués |
Alertes Prometheus recommandées
Section intitulée « Alertes Prometheus recommandées »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"Dashboard Grafana
Section intitulée « Dashboard Grafana »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
Sauvegardes et restauration
Section intitulée « Sauvegardes et restauration »Types de sauvegardes
Section intitulée « Types de sauvegardes »| Type | Contenu | Disponibilité |
|---|---|---|
| Snapshot Raft manuel | Données complètes | Toutes éditions |
| Snapshot Raft automatique | Données complètes, planifié | Enterprise |
| Export secrets | Secrets spécifiques | Toutes éditions |
Automatiser les snapshots Raft (CE)
Section intitulée « Automatiser les snapshots Raft (CE) »-
Créer une policy de backup :
path "sys/storage/raft/snapshot" {capabilities = ["read"]} -
Créer un token dédié :
Fenêtre de terminal vault token create \-policy=backup \-ttl=8760h \-display-name="backup-automation" -
Script de backup (
/opt/vault/scripts/backup.sh) :#!/bin/bashset -euo pipefailBACKUP_DIR="/opt/vault/backups"RETENTION_DAYS=30DATE=$(date +%Y%m%d-%H%M%S)BACKUP_FILE="${BACKUP_DIR}/vault-snapshot-${DATE}.snap"# Vérifier que Vault est accessiblevault status > /dev/null 2>&1 || {echo "ERROR: Vault inaccessible"exit 1}# Créer le snapshotvault operator raft snapshot save "${BACKUP_FILE}"# Vérifier l'intégritéif [[ -f "${BACKUP_FILE}" && -s "${BACKUP_FILE}" ]]; thenecho "SUCCESS: Snapshot créé ${BACKUP_FILE}"# Optionnel : copier vers stockage externe# aws s3 cp "${BACKUP_FILE}" s3://my-vault-backups/# Nettoyer les anciens backupsfind "${BACKUP_DIR}" -name "*.snap" -mtime +${RETENTION_DAYS} -deleteelseecho "ERROR: Snapshot vide ou manquant"exit 1fi -
Planifier avec cron :
Fenêtre de terminal # Toutes les 6 heures0 */6 * * * /opt/vault/scripts/backup.sh >> /var/log/vault-backup.log 2>&1
Restaurer depuis un snapshot
Section intitulée « Restaurer depuis un snapshot »Procédure générale (cluster complet) :
-
Arrêter tous les nœuds
-
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.snapLe flag
-forceest souvent nécessaire pour les scénarios de disaster recovery. -
Démarrer ce nœud et vérifier :
Fenêtre de terminal sudo systemctl start vaultvault statusvault secrets list -
Redémarrer les autres nœuds qui rejoindront le cluster
-
Vérifier le cluster :
Fenêtre de terminal vault operator raft list-peers
Snapshot ≠ PRA complet
Section intitulée « Snapshot ≠ PRA complet »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 seal | Le KMS/HSM doit être accessible |
| Clés Shamir | Si utilisées, elles doivent être disponibles |
| Certificats TLS | Sauvegardés séparément |
| Configuration | vault.hcl et scripts |
| Procédure testée | Test de restauration mensuel |
Opérations de maintenance
Section intitulée « Opérations de maintenance »Rotation de la clé de chiffrement interne
Section intitulée « Rotation de la clé de chiffrement interne »Vault chiffre les données avec une clé interne qui peut être rotée sans downtime :
# Vérifier la clé actuellevault operator key-status
# Effectuer la rotationvault operator rotate
# Vérifier la nouvelle versionvault operator key-statusLes données existantes restent lisibles. Les nouvelles écritures utilisent la nouvelle clé.
Rotation des credentials root
Section intitulée « Rotation des credentials root »Le root token initial ne doit jamais être conservé. Après l’initialisation :
-
Créer des admins avec des policies appropriées
-
Révoquer le root token initial :
Fenêtre de terminal vault token revoke s.XXXXX -
Si besoin d’un nouveau root token (urgence) :
Fenêtre de terminal # Initier la régénérationvault operator generate-root -init# Chaque holder de recovery key (ou unseal key) fournit sa partvault operator generate-root \-nonce=<nonce> \<recovery_key_share># Une fois le seuil atteint, décoder le tokenvault operator generate-root \-decode=<encoded_token> \-otp=<otp>
Mise à jour de Vault
Section intitulée « Mise à jour de Vault »# Mettre à jour le packagesudo apt update && sudo apt install vault
# Redémarrer (un nœud à la fois en HA)sudo systemctl restart vault
# Vérifier la versionvault version# Télécharger la nouvelle versionwget https://releases.hashicorp.com/vault/${VERSION}/vault_${VERSION}_linux_amd64.zip
# Vérifier le checksumsha256sum -c vault_${VERSION}_SHA256SUMS
# Arrêter Vaultsudo systemctl stop vault
# Remplacer le binaireunzip vault_${VERSION}_linux_amd64.zipsudo mv vault /usr/local/bin/
# Redémarrersudo systemctl start vaultProcédure rolling update (cluster HA) :
-
Mettre à jour un standby (pas le leader)
-
Vérifier qu’il rejoint le cluster et fonctionne correctement
-
Répéter pour les autres standby
-
Step down le leader :
Fenêtre de terminal vault operator step-down -
Mettre à jour l’ancien leader devenu standby
-
Vérifier le cluster :
Fenêtre de terminal vault operator raft list-peersvault version
Retirer un nœud du cluster
Section intitulée « Retirer un nœud du cluster »# Identifier le node_id à retirervault operator raft list-peers
# Retirer le nœud (depuis le leader)vault operator raft remove-peer vault-oldTroubleshooting
Section intitulée « Troubleshooting »Vault ne démarre pas
Section intitulée « Vault ne démarre pas »Vérifier les logs :
sudo journalctl -u vault -fCauses fréquentes :
| Erreur | Cause | Solution |
|---|---|---|
permission denied | Mauvaises permissions | chown -R vault:vault /opt/vault |
address already in use | Port 8200/8201 occupé | ss -tlnp | grep 8200 |
TLS handshake error | Certificat invalide | Vérifier dates, CA, SAN |
KMS access denied | IAM insuffisant | Vérifier la policy KMS |
seal configuration missing | Config seal absente | Vérifier vault.hcl |
Vault est scellé de manière inattendue
Section intitulée « Vault est scellé de manière inattendue »# Vérifier le statutvault status
# Si auto-unseal, vérifier l'accès KMS# AWSaws kms describe-key --key-id alias/vault-unseal
# Si Shamir, désceller manuellementvault operator unsealCauses de scellement :
- Redémarrage du serveur
- Crash de Vault
- Appel explicite
vault operator seal
Problèmes de cluster Raft
Section intitulée « Problèmes de cluster Raft »Vérifier l’état du cluster :
vault operator raft list-peersUn nœud ne rejoint pas :
# Vérifier la connectivité réseau (port 8201)nc -zv vault-1.internal 8201
# Vérifier les logs du nœudsudo journalctl -u vault -f
# Forcer une nouvelle tentativesudo systemctl restart vaultSplit-brain (rare) :
Si le cluster se partitionne, les nœuds minoritaires deviennent standby sans leader. Une fois la connectivité rétablie, ils rejoignent automatiquement.
Performances dégradées
Section intitulée « Performances dégradées »Diagnostiquer :
# Latence des opérationsvault read sys/health
# Métriques instantanéescurl -s https://vault:8200/v1/sys/metrics?format=prometheus | grep vault_Causes fréquentes :
| Symptôme | Cause probable | Solution |
|---|---|---|
| Latence lecture élevée | Disque lent | SSD/NVMe, vérifier IOPS |
| Latence écriture élevée | Réplication Raft | Réduire latence réseau |
| OOM / crash | RAM insuffisante | Augmenter RAM, réduire cache |
| Timeouts KMS | KMS distant/lent | Région KMS plus proche |
Audit logs ne s’écrivent plus
Section intitulée « Audit logs ne s’écrivent plus »# Vérifier les audit devicesvault audit list
# Regarder l'espace disquedf -h /var/log
# Vérifier les permissionsls -la /var/log/vault/Checklist de sécurité production
Section intitulée « Checklist de sécurité production »Configuration minimale
Section intitulée « Configuration minimale »- 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 et authentification
Section intitulée « Policies et authentification »- 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)
Opérations
Section intitulée « Opérations »- 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
À retenir
Section intitulée « À retenir »- Cluster 3 nœuds minimum : la base pour une production résiliente
- Auto-unseal recommandé : évite l’intervention manuelle au redémarrage
- Monitoring : sealed, no-leader, audit-failure = alertes critiques
- Backups testés : snapshot Raft quotidien + test mensuel
- Rolling updates : un nœud à la fois, standby d’abord, vérifier les release notes
- Audit obligatoire : sans audit, vous perdez la traçabilité
- Dimensionnement = test de charge : les tableaux ne remplacent pas l’observation de votre charge réelle