Introduction
HashiCorp Vault est la solution de référence pour centraliser la gestion des secrets, des tokens et des certificats. Dans un contexte DevOps moderne, stocker des mots de passe en clair dans le code ou les variables d'environnement représente un risque majeur. Ce tutoriel vous guide pas à pas pour déployer Vault, le configurer et l'intégrer dans une application. Vous apprendrez à créer des politiques dynamiques et à accéder aux secrets de manière sécurisée. L'approche progressive vous permettra de passer d'un environnement de développement à une configuration prête pour la production.
Prérequis
- Docker et Docker Compose installés
- Connaissances de base en ligne de commande
- Notions de TypeScript et Node.js
- Accès administrateur sur votre machine
Déploiement avec Docker Compose
version: '3.8'
services:
vault:
image: hashicorp/vault:1.18
container_name: vault
ports:
- "8200:8200"
environment:
VAULT_DEV_ROOT_TOKEN_ID: "dev-only-token"
VAULT_DEV_LISTEN_ADDRESS: "0.0.0.0:8200"
cap_add:
- IPC_LOCKCe fichier démarre Vault en mode développement avec un token racine fixe. Le mode dev est idéal pour tester mais jamais pour la production.
Initialisation et déverrouillage
#!/bin/bash
export VAULT_ADDR='http://127.0.0.1:8200'
export VAULT_TOKEN='dev-only-token'
vault status
vault secrets enable -path=secret kv-v2
vault kv put secret/app/config username="admin" password="s3cr3t"Active le moteur KV v2 et stocke une première paire clé-valeur. Le token dev permet un accès immédiat sans initialisation complète.
Création d'une politique
path "secret/data/app/config" {
capabilities = ["read"]
}
path "secret/metadata/app/*" {
capabilities = ["list"]
}Cette politique autorise uniquement la lecture des secrets de l'application. Limiter les droits est essentiel pour respecter le principe du moindre privilège.
Application de la politique
vault policy write app-policy app-policy.hcl
vault token create -policy=app-policy -ttl=1hCrée un token avec la politique restreinte. Ce token sera utilisé par l'application pour lire les secrets sans droits d'administration.
Client Node.js pour lire les secrets
import * as vault from 'node-vault';
const client = vault({
apiVersion: 'v1',
endpoint: 'http://127.0.0.1:8200',
token: process.env.VAULT_TOKEN
});
export async function getAppConfig() {
const result = await client.read('secret/data/app/config');
return result.data.data;
}Le client utilise le token limité pour récupérer les secrets. Toujours valider la présence du token avant toute requête en production.
Intégration dans une API Express
import express from 'express';
import { getAppConfig } from './vault-client';
const app = express();
app.get('/config', async (req, res) => {
try {
const config = await getAppConfig();
res.json(config);
} catch (error) {
res.status(500).json({ error: 'Impossible de récupérer les secrets' });
}
});
app.listen(3000, () => console.log('Serveur démarré'));L'API expose les données de configuration sans jamais les stocker en dur. Gérez les erreurs pour éviter les fuites d'informations sensibles.
Bonnes pratiques
- Utilisez toujours des tokens à durée de vie limitée et renouvelez-les automatiquement
- Activez l'audit logging pour tracer tous les accès aux secrets
- Préférez le moteur KV v2 pour bénéficier des versions et de la suppression sécurisée
- Séparez les environnements avec des namespaces ou des instances Vault distinctes
- Intégrez Vault dans vos pipelines CI/CD via des rôles d'authentification dynamiques
Erreurs courantes à éviter
- Laisser le mode dev activé en production
- Accorder des droits trop larges aux tokens d'application
- Oublier de chiffrer les données au repos avec un KMS externe
- Stocker le token racine dans le code source ou les variables d'environnement
Pour aller plus loin
Explorez l'authentification Kubernetes et les secrets dynamiques pour les bases de données. Découvrez nos formations avancées sur la sécurité.