Skip to content

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