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.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- 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é
Prérequis
Section intitulée « Prérequis »Installation de Vault
Section intitulée « Installation de Vault »Vault peut être installé de deux manières. Choisissez une seule méthode :
| Méthode | Avantages | Inconvénients |
|---|---|---|
| Package officiel | Service systemd inclus, mises à jour simplifiées, utilisateur créé | Dépendance au repo HashiCorp |
| Binaire manuel | Contrôle total, pas de dépendance externe | Configuration 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
Debian / Ubuntu
Section intitulée « Debian / Ubuntu »-
Ajouter la clé GPG HashiCorp
Fenêtre de terminal sudo apt update && sudo apt install -y gpgwget -O- https://apt.releases.hashicorp.com/gpg | \sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg -
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 -
Installer Vault
Fenêtre de terminal sudo apt update && sudo apt install -y vault -
Vérifier l’installation
Fenêtre de terminal vault version# Vault v1.21.4 (...)# Vérifier que le service existesystemctl status vault# ● vault.service - "HashiCorp Vault..."
RHEL / Fedora / CentOS
Section intitulée « RHEL / Fedora / CentOS »# Ajouter le dépôt HashiCorpsudo dnf config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
# Installer Vaultsudo dnf install -y vault
# Vérifiervault versionL’installation manuelle vous donne un contrôle total, mais vous devez créer l’utilisateur, les répertoires et le service systemd vous-même.
Télécharger et vérifier le binaire
Section intitulée « Télécharger et vérifier le binaire »-
Télécharger le binaire et les fichiers de vérification
Fenêtre de terminal VERSION="1.21.4"ARCH="amd64" # ou arm64cd /tmp# Télécharger le binaire, les checksums et la signaturecurl -LO "https://releases.hashicorp.com/vault/${VERSION}/vault_${VERSION}_linux_${ARCH}.zip"curl -LO "https://releases.hashicorp.com/vault/${VERSION}/vault_${VERSION}_SHA256SUMS"curl -LO "https://releases.hashicorp.com/vault/${VERSION}/vault_${VERSION}_SHA256SUMS.sig" -
Importer la clé PGP HashiCorp
Fenêtre de terminal # Importer la clé publique HashiCorpcurl -sL https://www.hashicorp.com/.well-known/pgp-key.txt | gpg --import# Vérifier l'empreinte (doit contenir : 34365D9472D7468F)gpg --list-keys --fingerprint security@hashicorp.com -
Vérifier la signature des checksums
Fenêtre de terminal gpg --verify vault_${VERSION}_SHA256SUMS.sig vault_${VERSION}_SHA256SUMS# Doit afficher : Good signature from "HashiCorp Security..." -
Vérifier le checksum du binaire
Fenêtre de terminal sha256sum -c vault_${VERSION}_SHA256SUMS --ignore-missing# Doit afficher : vault_1.21.4_linux_amd64.zip: OK -
Extraire et installer
Fenêtre de terminal unzip vault_${VERSION}_linux_${ARCH}.zipsudo mv vault /usr/local/bin/sudo chmod +x /usr/local/bin/vaultvault version
Créer l’utilisateur et les répertoires
Section intitulée « Créer l’utilisateur et les répertoires »# Créer l'utilisateur système (sans login)sudo useradd --system --home /opt/vault --shell /bin/false vault
# Créer les répertoiressudo mkdir -p /opt/vault/{data,config,tls,logs}
# Définir les permissionssudo chown -R vault:vault /opt/vaultsudo chmod 700 /opt/vault/datasudo chmod 700 /opt/vault/logsCréer le service systemd
Section intitulée « Créer le service systemd »Créez /etc/systemd/system/vault.service :
[Unit]Description=HashiCorp VaultDocumentation=https://www.vaultproject.io/docs/Requires=network-online.targetAfter=network-online.target
[Service]User=vaultGroup=vaultExecStart=/usr/local/bin/vault server -config=/opt/vault/config/vault.hclExecReload=/bin/kill --signal HUP $MAINPIDKillMode=processKillSignal=SIGINTRestart=on-failureRestartSec=5LimitNOFILE=65536LimitMEMLOCK=infinity# Permettre mlock sans privilèges rootCapabilityBoundingSet=CAP_IPC_LOCKAmbientCapabilities=CAP_IPC_LOCK
[Install]WantedBy=multi-user.targetsudo systemctl daemon-reloadMode dev : pour apprendre et tester
Section intitulée « Mode dev : pour apprendre et tester »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.
Ce que fait le mode dev
Section intitulée « Ce que fait le mode dev »| Caractéristique | Valeur |
|---|---|
| Stockage | Mémoire (perdu au redémarrage) |
| Protocole | HTTP (non chiffré) |
| État initial | Déjà initialisé et déverrouillé |
| Secrets engine | KV v2 activé sur secret/ |
| Token root | Affiché au démarrage |
Démarrer le serveur dev
Section intitulée « Démarrer le serveur dev »Dans un premier 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: rootDevelopment mode should NOT be used in production installations!Configurer le client
Section intitulée « Configurer le client »Dans un second terminal :
export VAULT_ADDR='http://127.0.0.1:8200'export VAULT_TOKEN='root'
vault statusSortie attendue :
Key Value--- -----Seal Type shamirInitialized trueSealed false...Storage Type inmemInitialized: true et Sealed: false : vous pouvez utiliser Vault.
Premier test rapide
Section intitulée « Premier test rapide »vault kv put secret/test message="Hello Vault!"vault kv get secret/testSi vous voyez votre secret, bravo ! Passons à un déploiement persistant.
Premier serveur persistant
Section intitulée « Premier serveur 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 cible
Section intitulée « Architecture cible »Fichier de configuration
Section intitulée « Fichier de configuration »Modifiez /etc/vault.d/vault.hcl :
# Interface utilisateur webui = true
# Stockage avec Raft (intégré)storage "raft" { path = "/opt/vault/data" node_id = "vault-1"}
# Listener HTTPSlistener "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 clusterapi_addr = "https://vault.example.com:8200"cluster_addr = "https://vault.example.com:8201"
# Log levellog_level = "info"Créez les répertoires nécessaires :
sudo mkdir -p /opt/vault/{data,tls,logs}sudo chown -R vault:vault /opt/vaultsudo chmod 700 /opt/vault/dataCréez /opt/vault/config/vault.hcl :
# Interface utilisateur webui = true
# Stockage avec Raft (intégré)storage "raft" { path = "/opt/vault/data" node_id = "vault-1"}
# Listener HTTPSlistener "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 clusterapi_addr = "https://vault.example.com:8200"cluster_addr = "https://vault.example.com:8201"
# Log levellog_level = "info"À propos de mlock
Section intitulée « À propos de mlock »Par défaut, Vault utilise mlock pour empêcher les secrets d’être écrits sur
le swap. C’est une protection importante en production.
| Environnement | Recommandation |
|---|---|
| Lab / dev | disable_mlock = true acceptable pour simplifier |
| Production | Garder 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
Certificats TLS
Section intitulée « Certificats TLS »Vault doit utiliser HTTPS, même pour un lab. Pour un premier test, vous pouvez créer un certificat auto-signé :
# 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.keyDémarrer le serveur
Section intitulée « Démarrer le serveur »sudo systemctl enable vaultsudo systemctl start vaultsudo systemctl status vaultVérifier le statut
Section intitulée « Vérifier le statut »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 statusSortie attendue (serveur non initialisé) :
Key Value--- -----Seal Type shamirInitialized falseSealed true...Shamir vs Auto-unseal
Section intitulée « Shamir vs Auto-unseal »Avant d’initialiser Vault, comprenez les deux mécanismes de déverrouillage.
Shamir (par défaut)
Section intitulée « Shamir (par défaut) »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
Auto-unseal (recommandé en exploitation)
Section intitulée « Auto-unseal (recommandé en exploitation) »Vault délègue le déchiffrement à un service externe de confiance :
| Méthode | Fournisseur | Prérequis |
|---|---|---|
| AWS KMS | Amazon Web Services | Clé KMS + IAM role |
| Azure Key Vault | Microsoft Azure | Key Vault + managed identity |
| GCP Cloud KMS | Google Cloud | Clé KMS + service account |
| Transit | Un autre Vault | Cluster Vault dédié |
| HSM | PKCS#11 | Hardware 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
Ce guide utilise Shamir
Section intitulée « Ce guide utilise Shamir »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.
Initialisation de Vault
Section intitulée « Initialisation de Vault »L’initialisation est une opération unique qui génère la clé maître et les clés de déverrouillage.
Pour un lab (1 clé)
Section intitulée « Pour un lab (1 clé) »vault operator init -key-shares=1 -key-threshold=1Pour un environnement partagé (3 sur 5)
Section intitulée « Pour un environnement partagé (3 sur 5) »vault operator init -key-shares=5 -key-threshold=3Sortie :
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.Déverrouillage (Unseal)
Section intitulée « Déverrouillage (Unseal) »Après chaque redémarrage, Vault démarre scellé (sealed). Il faut le déverrouiller avec les clés Shamir.
Pourquoi ce mécanisme ?
Section intitulée « Pourquoi ce mécanisme ? »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.
Procédure
Section intitulée « Procédure »Répétez la commande avec le nombre de clés requis (threshold) :
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/3Une fois le seuil atteint :
Sealed false <-- Déverrouillé !Authentification
Section intitulée « Authentification »vault login <root_token>Activer l’audit
Section intitulée « Activer l’audit »L’audit est essentiel pour la traçabilité. Il enregistre chaque opération sur Vault : qui a lu quel secret, quand, depuis quelle IP.
Activer l’audit fichier
Section intitulée « Activer l’audit fichier »# Créer le répertoire (déjà fait si vous avez suivi le guide)sudo mkdir -p /opt/vault/logssudo chown vault:vault /opt/vault/logs
# Activer l'audit devicevault audit enable file file_path=/opt/vault/logs/vault-audit.logVérifiez que l’audit fonctionne :
vault audit listPath Type Description---- ---- -----------file/ file n/aTester l’audit
Section intitulée « Tester l’audit »Créez un secret et vérifiez que l’opération est journalisée :
vault kv put secret/test foo=bar
# Vérifier le logsudo tail -1 /opt/vault/logs/vault-audit.log | jq .Vous verrez une entrée JSON avec l’opération, l’utilisateur, la date, etc.
Rotation des logs
Section intitulée « Rotation des logs »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}Vérification des permissions
Section intitulée « Vérification des permissions »Pour un déploiement plus strict, Vault peut vérifier les permissions des fichiers de configuration au démarrage :
# Dans le fichier d'environnement du service# ou avant de démarrer Vaultexport VAULT_ENABLE_FILE_PERMISSIONS_CHECK=trueCela génère des warnings si les fichiers de configuration sont lisibles par d’autres utilisateurs.
Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
connection refused | Vault n’est pas démarré | systemctl start vault |
Vault is sealed | Vault n’est pas déverrouillé | vault operator unseal |
permission denied | Token invalide ou expiré | vault login avec le bon token |
certificate signed by unknown authority | Certificat auto-signé non reconnu | export VAULT_CACERT=/path/to/ca.crt |
mlock: operation not permitted | Capabilities manquantes | Vérifier AmbientCapabilities dans systemd |
Listener config not found | Erreur de syntaxe HCL | vault server -config=... -dev pour tester |
Ce guide ne couvre pas
Section intitulée « Ce guide ne couvre pas »Ce guide vous donne une base fonctionnelle, mais un déploiement production réel nécessite des étapes supplémentaires :
| Sujet | Pourquoi 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 Raft | Récupération après incident |
| Monitoring / telemetry | Détecter les problèmes avant qu’ils ne deviennent critiques |
| Load balancing | Répartition de charge et point d’entrée unique |
| Certificats signés par une vraie CA | TLS de bout en bout sans VAULT_SKIP_VERIFY |
| Procédures de recovery | Que faire si vous perdez des unseal keys |
| Rotation du root token | Le root token initial ne doit pas rester actif |
| Namespaces (Enterprise) | Isolation multi-tenant |
| Réplication (Enterprise) | DR et performance multi-région |
À retenir
Section intitulée « À retenir »- Deux méthodes d’installation : package (recommandé) ou binaire manuel
- Vérifiez toujours les checksums et signatures des binaires téléchargés
- Mode dev : apprentissage uniquement, jamais en dehors d’un lab local
- Shamir vs auto-unseal : Shamir pour comprendre, auto-unseal pour exploiter
- mlock : garder actif en production, désactiver le swap
- Audit : à activer explicitement dès le premier déploiement
- Certificats : auto-signé pour le lab, vraie CA pour la production
- Ce guide est un point de départ, pas une recette production complète