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.