HashiCorp Vault
Vue d'ensemble
HashiCorp Vault est une solution centralisée pour la gestion sécurisée des secrets, le chiffrement et la gestion d'identité. Il fournit une API unifiée pour accéder aux secrets avec un contrôle d'accès détaillé.
Philosophie
"Secrets management made simple - Sécurisez, stockez et contrôlez étroitement l'accès aux tokens, mots de passe, certificats et clés de chiffrement."
Fonctionnalités clés
Gestion des secrets
- Secrets statiques : Mots de passe, API keys, certificats
- Secrets dynamiques : Credentials générés à la demande
- Transit encryption : Chiffrement en tant que service
- PKI : Autorité de certification intégrée
Authentification & autorisation
- Multiple auth methods : LDAP, JWT, AWS IAM, GitHub
- Policies : Contrôle d'accès granulaire
- Namespaces : Isolation multi-tenant
- Audit logs : Traçabilité complète
Haute disponibilité
- Clustering : Mode haute disponibilité natif
- Auto-unseal : Déverrouillage automatique cloud
- Replication : Disaster recovery et performance
- Snapshots : Sauvegarde et restauration
Architecture
Composants principaux
- Storage Backend : Stockage chiffré des données
- Secrets Engines : Modules pour différents types de secrets
- Auth Methods : Méthodes d'authentification
- Policies : Règles d'autorisation
Secrets Engines populaires
# Key-Value v2
vault secrets enable -path=secret kv-v2
# Database credentials
vault secrets enable database
# PKI certificates
vault secrets enable pki
# AWS credentials
vault secrets enable aws
Configuration exemple
Configuration serveur
# vault.hcl
ui = true
disable_mlock = true
storage "consul" {
address = "127.0.0.1:8500"
path = "vault/"
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_cert_file = "/etc/vault/tls/vault.crt"
tls_key_file = "/etc/vault/tls/vault.key"
}
api_addr = "https://vault.example.com:8200"
cluster_addr = "https://vault-internal.example.com:8201"
# Auto-unseal avec AWS KMS
seal "awskms" {
region = "us-west-2"
kms_key_id = "12345678-1234-1234-1234-123456789012"
}
Policy exemple
# developer-policy.hcl
path "secret/data/dev/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
path "secret/data/prod/*" {
capabilities = ["read"]
}
path "database/creds/dev-role" {
capabilities = ["read"]
}
path "pki/issue/dev-cert" {
capabilities = ["create", "update"]
}
Intégration applications
Avec Terraform
# Configuration Terraform avec Vault
provider "vault" {
address = "https://vault.example.com:8200"
}
data "vault_generic_secret" "db_credentials" {
path = "secret/database"
}
resource "aws_db_instance" "main" {
username = data.vault_generic_secret.db_credentials.data["username"]
password = data.vault_generic_secret.db_credentials.data["password"]
# ...
}
Avec Nomad
job "web-app" {
group "app" {
task "web" {
vault {
policies = ["web-app-policy"]
}
template {
data = <<EOH
{{with secret "secret/web-app"}}
DATABASE_URL="{{.Data.database_url}}"
API_KEY="{{.Data.api_key}}"
{{end}}
EOH
destination = "secrets/app.env"
env = true
}
}
}
}
Avec Laravel
use Illuminate\Support\Facades\Http;
class VaultSecretProvider
{
public function getSecret(string $path): array
{
$response = Http::withToken($this->getVaultToken())
->get("https://vault.example.com:8200/v1/secret/data/{$path}");
return $response->json()['data']['data'];
}
public function getDynamicDbCredentials(): array
{
$response = Http::withToken($this->getVaultToken())
->get('https://vault.example.com:8200/v1/database/creds/laravel-role');
return $response->json()['data'];
}
}
Cas d'usage typiques
Secrets statiques
- Configuration apps : Database URLs, API keys
- Certificats TLS : SSL/TLS pour services
- Tokens : JWT secrets, OAuth credentials
Secrets dynamiques
- Database credentials : MySQL, PostgreSQL, MongoDB
- Cloud credentials : AWS, Azure, GCP
- SSH certificates : Accès serveurs temporaires
PKI & Certificates
- Internal CA : Certificats pour services internes
- Intermediate CA : Hiérarchie de certification
- Auto-renewal : Rotation automatique certificats
Intégration CI/CD
Avec GitLab CI
variables:
VAULT_ADDR: "https://vault.example.com:8200"
before_script:
- export VAULT_TOKEN=$(vault write -field=token auth/jwt/login role=ci-role jwt=$CI_JOB_JWT)
- export DB_PASSWORD=$(vault kv get -field=password secret/database)
deploy:
script:
- echo "Using dynamic credentials from Vault"
- deploy-application.sh
Monitoring & observabilité
Métriques importantes
- Seal status : Statut du coffre-fort
- Auth failures : Tentatives d'authentification échouées
- Secret access : Accès aux secrets
- Performance : Latence des opérations
Intégration Prometheus
# prometheus.yml
scrape_configs:
- job_name: 'vault'
static_configs:
- targets: ['vault.example.com:8200']
metrics_path: '/v1/sys/metrics'
params:
format: ['prometheus']
Ressources
- Documentation : vaultproject.io
- Learn : learn.hashicorp.com/vault
- API Reference : vaultproject.io/api