Secrets management end-to-end 30 min de lecture

Gestion centralisee des secrets

Le probleme des secrets

Les secrets (mots de passe, tokens API, certificats TLS) sont partout dans l'infrastructure. Les stocker en clair dans Git ou dans des variables d'environnement non chiffrees est un risque majeur.

HashiCorp Vault

Vault est un gestionnaire de secrets centralise avec controle d'acces, audit et rotation automatique.

# Demarrer Vault en mode dev (ne pas utiliser en production)
vault server -dev

# Stocker un secret
vault kv put secret/mon-app/db \
  username="admin" \
  password="S3cur3P4ss!"

# Lire un secret
vault kv get secret/mon-app/db

# Politique d'acces
path "secret/data/mon-app/*" {
  capabilities = ["read"]
}

# Authentification Kubernetes
vault auth enable kubernetes
vault write auth/kubernetes/config \
  kubernetes_host="https://kubernetes.default.svc"
vault write auth/kubernetes/role/mon-app \
  bound_service_account_names=mon-app \
  bound_service_account_namespaces=production \
  policies=mon-app-policy \
  ttl=1h

Kubernetes Secrets et leurs limites

Les Secrets Kubernetes sont encodes en base64, pas chiffres. Ils necessitent des mesures supplementaires.

# Secret Kubernetes standard (base64 seulement)
apiVersion: v1
kind: Secret
metadata:
  name: db-credentials
  namespace: production
type: Opaque
data:
  username: YWRtaW4=
  password: UzNjdXIzUDRzcyE=

# Activer le chiffrement au repos (encryption at rest)
# /etc/kubernetes/encryption-config.yaml
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
  - secrets
  providers:
  - aescbc:
      keys:
      - name: key1
        secret: 
  - identity: {}

Sealed Secrets pour GitOps

Sealed Secrets permet de stocker des secrets chiffres dans Git. Seul le controleur dans le cluster peut les dechiffrer.

# Installer le controleur
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.24.0/controller.yaml

# Chiffrer un secret avec kubeseal
kubectl create secret generic db-creds \
  --from-literal=password=S3cur3P4ss! \
  --dry-run=client -o yaml | \
  kubeseal --format yaml > sealed-db-creds.yaml

# Le SealedSecret resultant peut aller dans Git
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
  name: db-creds
  namespace: production
spec:
  encryptedData:
    password: AgBy3i4OJSWK+PiTySYZZA9...

External Secrets Operator

Pour synchroniser Vault (ou AWS Secrets Manager, Azure Key Vault) avec des Secrets Kubernetes :

apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: db-credentials
spec:
  refreshInterval: 1h
  secretStoreRef:
    name: vault-backend
    kind: ClusterSecretStore
  target:
    name: db-credentials
  data:
  - secretKey: password
    remoteRef:
      key: secret/data/mon-app/db
      property: password
Regle d'or : Jamais de secrets en clair dans Git. Utilisez Sealed Secrets pour le GitOps et Vault pour la gestion centralisee avec rotation.