Aller au contenu principal

Gestion des secrets


Table des matières

  1. Le problème des secrets
  2. Sealed Secrets
  3. SOPS
  4. HashiCorp Vault
  5. External Secrets Operator
  6. Comparaison et choix
  7. Exercices pratiques

1 - Le problème des secrets

Ce qu'il ne faut PAS faire

# ❌ JAMAIS dans Git !
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
password: cGFzc3dvcmQxMjM= # base64 n'est PAS du chiffrement !
# Base64 est réversible
echo "cGFzc3dvcmQxMjM=" | base64 -d
# password123

# Git conserve l'historique
# Même après suppression, le secret reste dans l'historique

Le dilemme GitOps

Solutions disponibles

SolutionTypeComplexité
Sealed SecretsChiffrement asymétriqueFaible
SOPSChiffrement fichierMoyenne
VaultGestion centraliséeÉlevée
External SecretsSync depuis providerMoyenne

🔝 Retour à la table des matières


2 - Sealed Secrets

Principe

Installation

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

# Installer kubeseal CLI
brew install kubeseal # macOS
# ou
wget https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.24.0/kubeseal-0.24.0-linux-amd64.tar.gz

Utilisation

# 1. Créer un secret classique (ne pas commiter !)
kubectl create secret generic my-secret \
--from-literal=password=mysuperpassword \
--dry-run=client -o yaml > secret.yaml

# 2. Chiffrer avec kubeseal
kubeseal --format yaml < secret.yaml > sealed-secret.yaml

# 3. Le SealedSecret peut aller dans Git ✅
cat sealed-secret.yaml
# sealed-secret.yaml (peut être committé)
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
name: my-secret
namespace: default
spec:
encryptedData:
password: AgBj7...long-encrypted-string...==

Scopes

# Strict (namespace + name)
kubeseal --scope strict

# Namespace-wide (même namespace, tout nom)
kubeseal --scope namespace-wide

# Cluster-wide (tout namespace, tout nom)
kubeseal --scope cluster-wide

Avantages/Inconvénients

AvantagesInconvénients
Simple à utiliserClé privée dans le cluster
Natif KubernetesRotation manuelle
Pas de dépendance externeUn controller par cluster

🔝 Retour à la table des matières


3 - SOPS

Principe

SOPS (Secrets OPerationS) chiffre les valeurs dans les fichiers YAML/JSON.

# Avant SOPS
apiVersion: v1
kind: Secret
data:
password: mypassword

# Après SOPS (seules les valeurs sont chiffrées)
apiVersion: v1
kind: Secret
data:
password: ENC[AES256_GCM,data:...,iv:...,tag:...,type:str]
sops:
kms: ...
age: ...

Installation

# macOS
brew install sops

# Linux
wget https://github.com/getsops/sops/releases/download/v3.8.1/sops-v3.8.1.linux.amd64 -O /usr/local/bin/sops
chmod +x /usr/local/bin/sops

Configuration avec Age

# Générer une clé Age
age-keygen -o key.txt
# Public key: age1...
# Private key dans key.txt

# Configurer .sops.yaml
cat > .sops.yaml << EOF
creation_rules:
- path_regex: secrets/.*\.yaml$
age: age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p
EOF

Utilisation

# Chiffrer un fichier
sops -e secret.yaml > secret.enc.yaml

# Éditer in-place (déchiffre, édite, rechiffre)
sops secret.enc.yaml

# Déchiffrer
sops -d secret.enc.yaml > secret.yaml

Intégration avec Flux

# Flux supporte SOPS nativement
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: my-app
spec:
decryption:
provider: sops
secretRef:
name: sops-age # Secret contenant la clé privée

Avantages/Inconvénients

AvantagesInconvénients
Multi-providers (AWS KMS, GCP, Age)Configuration initiale
Diff lisibleClé à gérer
Flux natifPas ArgoCD natif

🔝 Retour à la table des matières


4 - HashiCorp Vault

Principe

Installation

# Helm install
helm repo add hashicorp https://helm.releases.hashicorp.com
helm install vault hashicorp/vault --set "server.dev.enabled=true"

Stocker un secret

# Activer le secret engine KV
vault secrets enable -path=secret kv-v2

# Stocker un secret
vault kv put secret/myapp/config \
username=admin \
password=supersecret

Vault Agent Injector

# Pod avec injection automatique
apiVersion: v1
kind: Pod
metadata:
annotations:
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/role: "myapp"
vault.hashicorp.com/agent-inject-secret-config: "secret/data/myapp/config"
spec:
containers:
- name: myapp
image: myapp:latest
# Les secrets sont injectés dans /vault/secrets/config

Avantages/Inconvénients

AvantagesInconvénients
Gestion centraliséeComplexité opérationnelle
Rotation automatiqueCoût (Enterprise)
Audit trailSingle point of failure
Dynamic secretsCourbe d'apprentissage

🔝 Retour à la table des matières


5 - External Secrets Operator

Principe

Installation

helm repo add external-secrets https://charts.external-secrets.io
helm install external-secrets external-secrets/external-secrets

Configuration AWS

# SecretStore
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: aws-secrets
spec:
provider:
aws:
service: SecretsManager
region: us-east-1
auth:
secretRef:
accessKeyIDSecretRef:
name: aws-creds
key: access-key
secretAccessKeySecretRef:
name: aws-creds
key: secret-key

ExternalSecret

# ExternalSecret (peut être dans Git)
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: my-secret
spec:
refreshInterval: 1h
secretStoreRef:
name: aws-secrets
kind: SecretStore
target:
name: my-secret
data:
- secretKey: password
remoteRef:
key: myapp/prod/db
property: password

Avantages/Inconvénients

AvantagesInconvénients
Multi-cloudDépendance externe
GitOps friendlyConfiguration par provider
Sync automatiqueLatence

🔝 Retour à la table des matières


6 - Comparaison et choix

Tableau comparatif

SolutionComplexitéGitOps NativeMulti-clusterCloud Native
Sealed Secrets
SOPS⭐⭐✅ (Flux)⚠️
Vault⭐⭐⭐⚠️
ESO⭐⭐

Recommandations

ScénarioRecommandation
Petite équipe, démarrageSealed Secrets
Flux, multi-envSOPS
Entreprise, complianceVault
Multi-cloud, AWS/GCP/AzureExternal Secrets

🔝 Retour à la table des matières


7 - Exercices pratiques

Quiz

Q1. Pourquoi base64 n'est pas suffisant pour les secrets ?

Réponse

Base64 est un encodage, pas un chiffrement. N'importe qui peut décoder :

echo "c2VjcmV0" | base64 -d  # secret

Q2. Quelle solution choisir pour un démarrage rapide ?

Réponse

Sealed Secrets car :

  • Simple à installer
  • Pas de dépendance externe
  • Intégration native Kubernetes
  • CLI intuitive (kubeseal)

Exercice : Créer un Sealed Secret

# 1. Créer le secret
kubectl create secret generic db-creds \
--from-literal=username=admin \
--from-literal=password=supersecret \
--dry-run=client -o yaml > secret.yaml

# 2. Chiffrer
kubeseal --format yaml < secret.yaml > sealed-secret.yaml

# 3. Vérifier
cat sealed-secret.yaml
Résultat attendu
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
name: db-creds
namespace: default
spec:
encryptedData:
username: AgBj7...
password: AgCk9...

🔝 Retour à la table des matières


Points clés à retenir

  • Jamais de secrets en clair dans Git (même en base64)
  • Sealed Secrets : simple, un cluster
  • SOPS : multi-provider, Flux natif
  • Vault : enterprise, audit, rotation
  • External Secrets : cloud-native, multi-provider
  • Choisir selon la complexité et les besoins

🔝 Retour à la table des matières


← Chapitre précédent | Chapitre suivant : Multi-environnements →