Olivier Brun | Blog Cloud & Cybersécurité

Vault sur les trois clouds : secrets engines, dynamic credentials et intégration avec Kubernetes

HashiCorp Vault est la rĂ©fĂ©rence pour la gestion centralisĂ©e des secrets, qu’il s’agisse de mots de passe, clĂ©s API, certificats ou tokens. En environnement multi-cloud (AWS, Azure, GCP) et Kubernetes, Vault permet d’éliminer les secrets en dur, de gĂ©nĂ©rer des identifiants temporaires (dynamic credentials) et d’automatiser l’injection de secrets dans les pods. Dans cet article, je vous montre comment dĂ©ployer Vault et l’intĂ©grer efficacement sur les trois grands clouds.

1. Pourquoi Vault plutĂŽt que Secrets Manager natif ?

Chaque cloud a son propre service de secrets (AWS Secrets Manager, Azure Key Vault, GCP Secret Manager). Mais en environnement multi-cloud, Vault offre une couche d’abstraction unique, des secrets engines pluggables, du leasing, de la rotation automatique et une gestion fine des politiques (policy as code). De plus, son intĂ©gration avec Kubernetes est mature et ne vous enferme pas chez un fournisseur.

2. Architecture typique de Vault en multi-cloud

On dĂ©ploie gĂ©nĂ©ralement un cluster Vault (mode HA) sur chaque cloud ou bien un cluster centralisĂ© avec des replicators. Le stockage backend peut ĂȘtre Consul, Raft intĂ©grĂ© (Vault 1.10+), ou utiliser des services natifs comme AWS DynamoDB, Azure Cosmos DB, GCP Cloud Spanner. Voici un exemple simple de configuration backend pour AWS :

storage "raft" {
  path = "/vault/data"
  node_id = "node1"
}

ha_storage "raft" {
  path = "/vault/data/raft"
}

listener "tcp" {
  address     = "0.0.0.0:8200"
  tls_disable = false
  tls_cert_file = "/vault/config/tls.crt"
  tls_key_file  = "/vault/config/tls.key"
}

3. Secrets engines essentiels pour AWS, Azure, GCP

đŸ”č AWS Secrets Engine (dynamic credentials)

Permet de gĂ©nĂ©rer des clĂ©s IAM temporaires (STS) Ă  la demande, avec des permissions granulaires. Exemple d’activation :

vault secrets enable aws
vault write aws/config/root \
  access_key=AKIA... \
  secret_key=...
vault write aws/roles/my-role \
  credential_type=iam_user \
  policy_document='{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"s3:ListBucket","Resource":"*"}]}'
vault read aws/creds/my-role

đŸ”č Azure Secrets Engine

GénÚre des tokens Azure AD et des certificats pour les service principals ou les managed identities. Utile pour des pipelines CI/CD multi-cloud.

vault secrets enable azure
vault write azure/config \
  subscription_id=xxx \
  tenant_id=xxx \
  client_id=xxx \
  client_secret=xxx
vault write azure/roles/my-app \
  ttl=1h \
  azure_roles='[{"role_name":"Contributor","scope":"/subscriptions/xxx/resourceGroups/my-rg"}]'
vault read azure/creds/my-app

đŸ”č GCP Secrets Engine

GénÚre des comptes de service GCP ou des tokens OAuth2 avec des rÎles spécifiques. Idéal pour des workloads éphémÚres.

vault secrets enable gcp
vault write gcp/config credentials=@sa-key.json
vault write gcp/roleset/my-token \
  project="my-project" \
  secret_type="access_token" \
  token_scopes="https://www.googleapis.com/auth/cloud-platform" \
  bindings='resource "//cloudresourcemanager.googleapis.com/projects/my-project" { roles = ["roles/viewer"] }'
vault read gcp/token/my-token

4. Intégration de Vault avec Kubernetes : deux approches

Pour injecter des secrets dans vos pods sans les stocker dans des Secrets Kubernetes (qui sont souvent en clair en base64), vous avez deux méthodes principales :

✅ 1. Agent Sidecar Injector (Vault Agent)

Un conteneur sidecar (vault-agent) tourne aux cĂŽtĂ©s de votre application. Il s’authentifie auprĂšs de Vault (via Kubernetes auth method), rĂ©cupĂšre les secrets dynamiques et les Ă©crit dans un volume partagĂ©. Votre application lit simplement un fichier local. Exemple d’annotation sur un deployment :

annotations:
  vault.hashicorp.com/agent-inject: "true"
  vault.hashicorp.com/role: "my-app-role"
  vault.hashicorp.com/agent-inject-secret-db-creds: "database/creds/my-app"

✅ 2. CSI Driver (Container Storage Interface)

Permet de monter des secrets Vault directement comme un volume via le driver secrets-store.csi.k8s.io. Les secrets sont synchronisĂ©s pĂ©riodiquement. C’est plus lĂ©ger qu’un sidecar, mais moins dynamique pour les changements Ă  la volĂ©e.

kind: Pod
spec:
  containers:
  - name: app
    volumeMounts:
    - name: secrets-store
      mountPath: "/mnt/secrets"
  volumes:
  - name: secrets-store
    csi:
      driver: secrets-store.csi.k8s.io
      readOnly: true
      volumeAttributes:
        secretProviderClass: "vault-database"

5. Authentification Kubernetes (Auth Method)

Pour que Vault fasse confiance à vos pods, on configure l’auth method Kubernetes. Chaque pod a un service account token (JWT) que Vault valide contre l’API Kubernetes. Exemple de configuration :

vault auth enable kubernetes
vault write auth/kubernetes/config \
  kubernetes_host="https://$KUBE_HOST" \
  kubernetes_ca_cert=@ca.crt
vault write auth/kubernetes/role/my-app-role \
  bound_service_account_names=my-sa \
  bound_service_account_namespaces=default \
  policies=my-policy \
  ttl=24h

6. Gestion des leases et rotation automatique

Vault ne stocke pas les secrets statiquement ; il gĂ©nĂšre des credentials avec une durĂ©e de vie (lease). Vous pouvez Ă©galement dĂ©clencher des rotations automatiques via vault lease renew ou des controllers comme vault-crd. En production, nous utilisons Vault’s database secrets engine pour gĂ©rer les mots de passe de bases de donnĂ©es PostgreSQL, MySQL, etc. avec rotation pĂ©riodique.

💡 Retour d’expĂ©rience – Groupe bancaire international :
J’ai mis en place Vault sur AWS, Azure et GCP avec fĂ©dĂ©ration d’identitĂ© (Kubernetes auth). RĂ©sultat : fin des secrets en dur dans les dĂ©pĂŽts de code, rotation automatique des identifiants toutes les 6 heures, et rĂ©duction des incidents de sĂ©curitĂ© liĂ©s aux fuites de clĂ©s. Le gain de confiance des Ă©quipes de sĂ©curitĂ© a Ă©tĂ© immĂ©diat.

7. Bonnes pratiques pour Vault en production

  • Haute disponibilitĂ© : dĂ©ployez au moins 3 nƓuds Vault avec backend Raft ou Consul.
  • Chiffrement des mĂ©tadonnĂ©es : activez le seal auto-dĂ©verrouillage (KMS seal) avec AWS KMS, Azure Key Vault ou GCP Cloud KMS.
  • Politiques (policies) : appliquez le moindre privilĂšge, chaque application ne doit avoir accĂšs qu’à son propre chemin de secrets.
  • Audit logging : activez les device logs vers un stockage immuable (S3, GCS, Azure Blob).
  • RĂ©plication : utilisez vault replication (perf/secondary) pour des architectures multi-rĂ©gions ou multi-cloud.

8. Exemple complet : IntĂ©gration d’une app Node.js avec Vault sur AKS (Azure)

L’application lit un secret dynamique PostgreSQL depuis Vault via le sidecar :

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-postgres
spec:
  template:
    metadata:
      annotations:
        vault.hashicorp.com/agent-inject: "true"
        vault.hashicorp.com/role: "app-postgres"
        vault.hashicorp.com/agent-inject-secret-db-creds: "database/creds/app-role"
        vault.hashicorp.com/agent-inject-template-db-creds: |
          {{ with secret "database/creds/app-role" -}}
          POSTGRES_USER={{ .Data.username }}
          POSTGRES_PASSWORD={{ .Data.password }}
          {{- end }}
    spec:
      serviceAccountName: vault-auth
      containers:
        - name: app
          image: myapp:latest
          env:
            - name: DB_HOST
              value: "postgres.example.com"
          volumeMounts:
            - name: vault-secrets
              mountPath: /etc/secrets
              readOnly: true
      volumes:
        - name: vault-secrets
          emptyDir:
            medium: Memory

Le fichier /etc/secrets/db-creds contient les variables d’environnement attendues, que l’application peut charger avec dotenv. Pas de secret dans le pod, pas de stockage en base64.

Conclusion

Vault est un outil incontournable dĂšs que vous sortez d’un cloud unique ou que vous avez des exigences Ă©levĂ©es de sĂ©curitĂ©. Il Ă©limine les secrets en clair des code repositories, automatise la rotation et s’intĂšgre nativement Ă  Kubernetes. Lancez-vous avec le mode dev pour tester, puis passez en production avec un KMS seal et des politiques restrictives.

Prochain article : je vous montrerai comment automatiser le déploiement de Vault avec Terraform sur les trois clouds, avec un backtend Raft et un équilibrage de charge.

← Retour au blog