Aller au contenu
Sécurité medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Installer et configurer HashiCorp Vault

20 min de lecture

logo vault

Ce guide vous accompagne de l’installation de Vault jusqu’à un premier serveur persistant. Vous commencerez par le mode dev (pour apprendre), puis vous configurerez un serveur avec stockage Raft, initialisation et audit.

  • Installer Vault via package officiel (recommandé) ou binaire manuel
  • Démarrer un serveur mode dev pour les tests
  • Configurer un premier serveur persistant avec Raft
  • Comprendre Shamir vs auto-unseal
  • Initialiser et déverrouiller Vault
  • Activer l’audit pour la traçabilité
  • Linux (Debian/Ubuntu, RHEL/Fedora, ou autre)
  • Accès root ou sudo
  • curl et gpg installés

Vault peut être installé de deux manières. Choisissez une seule méthode :

MéthodeAvantagesInconvénients
Package officielService systemd inclus, mises à jour simplifiées, utilisateur crééDépendance au repo HashiCorp
Binaire manuelContrôle total, pas de dépendance externeConfiguration manuelle du service

Le package officiel HashiCorp installe :

  • Le binaire /usr/bin/vault
  • Un utilisateur système vault
  • Une unité systemd /usr/lib/systemd/system/vault.service
  • Une configuration de base /etc/vault.d/vault.hcl
  1. Ajouter la clé GPG HashiCorp

    Fenêtre de terminal
    sudo apt update && sudo apt install -y gpg
    wget -O- https://apt.releases.hashicorp.com/gpg | \
    sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
  2. Ajouter le dépôt

    Fenêtre de terminal
    echo "deb [arch=$(dpkg --print-architecture) \
    signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] \
    https://apt.releases.hashicorp.com $(lsb_release -cs) main" | \
    sudo tee /etc/apt/sources.list.d/hashicorp.list
  3. Installer Vault

    Fenêtre de terminal
    sudo apt update && sudo apt install -y vault
  4. Vérifier l’installation

    Fenêtre de terminal
    vault version
    # Vault v1.21.4 (...)
    # Vérifier que le service existe
    systemctl status vault
    # ● vault.service - "HashiCorp Vault..."
Fenêtre de terminal
# Ajouter le dépôt HashiCorp
sudo dnf config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
# Installer Vault
sudo dnf install -y vault
# Vérifier
vault version

Le mode dev est conçu pour l’apprentissage et les tests locaux. Il démarre un serveur Vault complet en quelques secondes, sans configuration.

CaractéristiqueValeur
StockageMémoire (perdu au redémarrage)
ProtocoleHTTP (non chiffré)
État initialDéjà initialisé et déverrouillé
Secrets engineKV v2 activé sur secret/
Token rootAffiché au démarrage

Dans un premier terminal :

Fenêtre de terminal
vault server -dev -dev-root-token-id="root"

L’option -dev-root-token-id définit un token root prévisible pour simplifier les tests. Vous verrez :

==> Vault server configuration:
Api Address: http://127.0.0.1:8200
...
Root Token: root
Development mode should NOT be used in production installations!

Dans un second terminal :

Fenêtre de terminal
export VAULT_ADDR='http://127.0.0.1:8200'
export VAULT_TOKEN='root'
vault status

Sortie attendue :

Key Value
--- -----
Seal Type shamir
Initialized true
Sealed false
...
Storage Type inmem

Initialized: true et Sealed: false : vous pouvez utiliser Vault.

Fenêtre de terminal
vault kv put secret/test message="Hello Vault!"
vault kv get secret/test

Si vous voyez votre secret, bravo ! Passons à un déploiement persistant.

Cette section configure un serveur Vault mono-nœud avec stockage Raft. C’est adapté pour :

  • Un lab avancé ou une maquette
  • Un environnement de développement partagé
  • Une petite infrastructure tolérante à une indisponibilité temporaire

Architecture Vault Server mono-nœud

Modifiez /etc/vault.d/vault.hcl :

# Interface utilisateur web
ui = true
# Stockage avec Raft (intégré)
storage "raft" {
path = "/opt/vault/data"
node_id = "vault-1"
}
# Listener HTTPS
listener "tcp" {
address = "0.0.0.0:8200"
tls_cert_file = "/opt/vault/tls/vault.crt"
tls_key_file = "/opt/vault/tls/vault.key"
}
# Adresses pour l'API et le cluster
api_addr = "https://vault.example.com:8200"
cluster_addr = "https://vault.example.com:8201"
# Log level
log_level = "info"

Créez les répertoires nécessaires :

Fenêtre de terminal
sudo mkdir -p /opt/vault/{data,tls,logs}
sudo chown -R vault:vault /opt/vault
sudo chmod 700 /opt/vault/data

Par défaut, Vault utilise mlock pour empêcher les secrets d’être écrits sur le swap. C’est une protection importante en production.

EnvironnementRecommandation
Lab / devdisable_mlock = true acceptable pour simplifier
ProductionGarder mlock actif + désactiver le swap + capabilities systemd

Si vous avez l’erreur mlock: operation not permitted :

Option 1 (recommandée) : Ajouter les capabilities dans systemd (déjà fait dans notre unité avec AmbientCapabilities=CAP_IPC_LOCK)

Option 2 (lab uniquement) : Ajouter disable_mlock = true dans la config

Vault doit utiliser HTTPS, même pour un lab. Pour un premier test, vous pouvez créer un certificat auto-signé :

Fenêtre de terminal
# Certificat auto-signé (lab uniquement)
sudo openssl req -x509 -nodes -days 365 \
-newkey rsa:2048 \
-keyout /opt/vault/tls/vault.key \
-out /opt/vault/tls/vault.crt \
-subj "/CN=vault.example.com"
sudo chown vault:vault /opt/vault/tls/*
sudo chmod 600 /opt/vault/tls/vault.key
Fenêtre de terminal
sudo systemctl enable vault
sudo systemctl start vault
sudo systemctl status vault
Fenêtre de terminal
export VAULT_ADDR='https://vault.example.com:8200'
# Si certificat auto-signé (lab uniquement !)
export VAULT_CACERT=/opt/vault/tls/vault.crt
# OU (moins sécurisé)
export VAULT_SKIP_VERIFY=1
vault status

Sortie attendue (serveur non initialisé) :

Key Value
--- -----
Seal Type shamir
Initialized false
Sealed true
...

Avant d’initialiser Vault, comprenez les deux mécanismes de déverrouillage.

Vault utilise l’algorithme de Shamir’s Secret Sharing pour diviser la clé maître en plusieurs parts (shares). Vous définissez :

  • key-shares : nombre total de parts (ex: 5)
  • key-threshold : nombre minimum pour déverrouiller (ex: 3)

Avantages :

  • Aucune dépendance externe
  • Gouvernance multi-personnes (plusieurs détenteurs de clés)
  • Bon pour comprendre le mécanisme

Inconvénients :

  • Intervention humaine à chaque redémarrage
  • Complique l’automatisation (CI/CD, auto-scaling)
  • Risque d’indisponibilité si les détenteurs sont absents

Vault délègue le déchiffrement à un service externe de confiance :

MéthodeFournisseurPrérequis
AWS KMSAmazon Web ServicesClé KMS + IAM role
Azure Key VaultMicrosoft AzureKey Vault + managed identity
GCP Cloud KMSGoogle CloudClé KMS + service account
TransitUn autre VaultCluster Vault dédié
HSMPKCS#11Hardware Security Module

Avantages :

  • Déverrouillage automatique au redémarrage
  • Compatible avec l’automatisation (Kubernetes, auto-scaling)
  • Meilleure expérience opérationnelle

Inconvénients :

  • Dépendance à un service externe
  • Coût du service KMS/HSM
  • Configuration initiale plus complexe

Pour ce premier déploiement, nous utilisons Shamir car il ne nécessite aucune infrastructure externe. Une fois familiarisé avec Vault, configurez auto-unseal pour vos environnements d’exploitation.

L’initialisation est une opération unique qui génère la clé maître et les clés de déverrouillage.

Fenêtre de terminal
vault operator init -key-shares=1 -key-threshold=1
Fenêtre de terminal
vault operator init -key-shares=5 -key-threshold=3

Sortie :

Unseal Key 1: lWF1ue8BgtW3/19Uf49GaAicvaebxtFWlDFvEIKvs3s=
Unseal Key 2: ...
Unseal Key 3: ...
Unseal Key 4: ...
Unseal Key 5: ...
Initial Root Token: hvs.FkLQnkIPosIar9SSeDfdsFEb
Vault initialized with 5 key shares and a key threshold of 3.

Après chaque redémarrage, Vault démarre scellé (sealed). Il faut le déverrouiller avec les clés Shamir.

Quand Vault est scellé, les données sont chiffrées et inaccessibles. Même si un attaquant vole le serveur ou accède au stockage, il ne peut rien lire sans les clés de déverrouillage.

Répétez la commande avec le nombre de clés requis (threshold) :

Fenêtre de terminal
vault operator unseal <unseal_key_1>
vault operator unseal <unseal_key_2>
vault operator unseal <unseal_key_3>

Après chaque clé, Vault affiche la progression :

Unseal Progress 2/3

Une fois le seuil atteint :

Sealed false <-- Déverrouillé !
Fenêtre de terminal
vault login <root_token>

L’audit est essentiel pour la traçabilité. Il enregistre chaque opération sur Vault : qui a lu quel secret, quand, depuis quelle IP.

Fenêtre de terminal
# Créer le répertoire (déjà fait si vous avez suivi le guide)
sudo mkdir -p /opt/vault/logs
sudo chown vault:vault /opt/vault/logs
# Activer l'audit device
vault audit enable file file_path=/opt/vault/logs/vault-audit.log

Vérifiez que l’audit fonctionne :

Fenêtre de terminal
vault audit list
Path Type Description
---- ---- -----------
file/ file n/a

Créez un secret et vérifiez que l’opération est journalisée :

Fenêtre de terminal
vault kv put secret/test foo=bar
# Vérifier le log
sudo tail -1 /opt/vault/logs/vault-audit.log | jq .

Vous verrez une entrée JSON avec l’opération, l’utilisateur, la date, etc.

Ajoutez une rotation dans /etc/logrotate.d/vault :

/opt/vault/logs/*.log {
daily
rotate 30
compress
delaycompress
notifempty
missingok
postrotate
/bin/kill -HUP $(cat /run/vault.pid 2>/dev/null) 2>/dev/null || true
endscript
}

Pour un déploiement plus strict, Vault peut vérifier les permissions des fichiers de configuration au démarrage :

Fenêtre de terminal
# Dans le fichier d'environnement du service
# ou avant de démarrer Vault
export VAULT_ENABLE_FILE_PERMISSIONS_CHECK=true

Cela génère des warnings si les fichiers de configuration sont lisibles par d’autres utilisateurs.

SymptômeCause probableSolution
connection refusedVault n’est pas démarrésystemctl start vault
Vault is sealedVault n’est pas déverrouillévault operator unseal
permission deniedToken invalide ou expirévault login avec le bon token
certificate signed by unknown authorityCertificat auto-signé non reconnuexport VAULT_CACERT=/path/to/ca.crt
mlock: operation not permittedCapabilities manquantesVérifier AmbientCapabilities dans systemd
Listener config not foundErreur de syntaxe HCLvault server -config=... -dev pour tester

Ce guide vous donne une base fonctionnelle, mais un déploiement production réel nécessite des étapes supplémentaires :

SujetPourquoi c’est important
Haute disponibilité (3+ nœuds)Tolérance aux pannes, pas d’interruption de service
Auto-unseal (KMS/HSM)Redémarrage automatique sans intervention humaine
Sauvegardes / snapshots RaftRécupération après incident
Monitoring / telemetryDétecter les problèmes avant qu’ils ne deviennent critiques
Load balancingRépartition de charge et point d’entrée unique
Certificats signés par une vraie CATLS de bout en bout sans VAULT_SKIP_VERIFY
Procédures de recoveryQue faire si vous perdez des unseal keys
Rotation du root tokenLe root token initial ne doit pas rester actif
Namespaces (Enterprise)Isolation multi-tenant
Réplication (Enterprise)DR et performance multi-région
  1. Deux méthodes d’installation : package (recommandé) ou binaire manuel
  2. Vérifiez toujours les checksums et signatures des binaires téléchargés
  3. Mode dev : apprentissage uniquement, jamais en dehors d’un lab local
  4. Shamir vs auto-unseal : Shamir pour comprendre, auto-unseal pour exploiter
  5. mlock : garder actif en production, désactiver le swap
  6. Audit : à activer explicitement dès le premier déploiement
  7. Certificats : auto-signé pour le lab, vraie CA pour la production
  8. Ce guide est un point de départ, pas une recette production complète

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