DevOps · Fiche 04

Gestion des Secrets

Centralisation et sécurisation des secrets avec HashiCorp Vault : politiques, authentification et intégration Kubernetes.

Centralisation et sécurisation des secrets avec HashiCorp Vault : mots de passe, clés d’API et certificats sont stockés dans un coffre central plutôt que dispersés dans le code ou les variables d’environnement.

Architecture Vault

Stockage sécurisé et distribution des secrets :

                                    ┌─────────────────┐
                                    │   HashiCorp     │
                                    │     Vault       │
                                    │   (Secrets)     │
                                    └─────────┬───────┘

                                              │ API Calls

                    ┌─────────────────────────┼─────────────────────────┐
                    │                         │                         │
                    ▼                         ▼                         ▼
            ┌───────────────┐         ┌───────────────┐         ┌───────────────┐
            │  Kubernetes   │         │   CI/CD       │         │  Applications │
            │   Secrets     │         │   Pipeline    │         │   (Runtime)   │
            └───────┬───────┘         └───────┬───────┘         └───────┬───────┘
                    │                         │                         │
                    ▼                         ▼                         ▼
            ┌───────────────┐         ┌───────────────┐         ┌───────────────┐
            │   Pod Env     │         │  Build Vars   │         │  Config Maps  │
            │  Variables    │         │               │         │               │
            └───────────────┘         └───────────────┘         └───────────────┘

🔐 Configuration Vault

# Activation du moteur KV
vault secrets enable -path=secret kv-v2

# Création d'une politique
vault policy write app-policy - <<EOF
path "secret/data/scpi-invest/*" {
  capabilities = ["read"]
}
path "secret/data/database/*" {
  capabilities = ["read"]
}
EOF

# Stockage des secrets
vault kv put secret/database \
  username="scpi_user" \
  password="super_secure_password" \
  host="postgres.company.com" \
  port="5432"

vault kv put secret/scpi-invest \
  api_key="sk-1234567890abcdef" \
  jwt_secret="my-jwt-secret-key" \
  kafka_brokers="kafka1:9092,kafka2:9092"

🔑 Authentification

  • Kubernetes Auth : authentification via Service Account
  • AppRole : pour les applications et la CI/CD
  • LDAP/OIDC : pour les utilisateurs humains

🚀 Intégration Kubernetes

Vault Agent Injector

Un sidecar injecté dans le pod récupère les secrets et les écrit dans un fichier consommé au démarrage :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: scpi-invest-api
spec:
  template:
    metadata:
      annotations:
        vault.hashicorp.com/agent-inject: "true"
        vault.hashicorp.com/role: "scpi-invest"
        vault.hashicorp.com/agent-inject-secret-db: "secret/data/database"
        vault.hashicorp.com/agent-inject-template-db: |
          {{- with secret "secret/data/database" -}}
          export DATABASE_URL="postgresql://{{ .Data.data.username }}:{{ .Data.data.password }}@{{ .Data.data.host }}:{{ .Data.data.port }}/scpi"
          {{- end }}
    spec:
      containers:
      - name: api
        image: scpi-invest-api:latest
        command: ["/bin/sh"]
        args: ["-c", "source /vault/secrets/db && ./start-app"]

External Secrets Operator

L’opérateur synchronise les secrets Vault vers des Secrets Kubernetes natifs :

apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
  name: vault-backend
spec:
  provider:
    vault:
      server: "https://vault.company.com"
      path: "secret"
      version: "v2"
      auth:
        kubernetes:
          mountPath: "kubernetes"
          role: "scpi-invest"
---
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: database-secret
spec:
  refreshInterval: 15s
  secretStoreRef:
    name: vault-backend
    kind: SecretStore
  target:
    name: db-credentials
    creationPolicy: Owner
  data:
  - secretKey: username
    remoteRef:
      key: database
      property: username
  - secretKey: password
    remoteRef:
      key: database
      property: password

Interro écrite

7 questions pour valider la fiche. Une seule réponse par question.

Question 1/7Pourquoi centraliser les secrets dans un outil comme HashiCorp Vault plutôt que dans des variables d'environnement ou le code ?