Sealed Secrets
Overview
Sealed Secrets, c'est le contrôleur Kubernetes développé par Bitnami qui pense que tes secrets peuvent être dans Git, mais chiffrés. Il utilise une paire de clés asymétrique : tu chiffres tes secrets avec la clé publique (safe pour Git), et seul le cluster Kubernetes peut les déchiffrer avec la clé privée. Si tu veux du GitOps complet avec les secrets, c'est parfait.
Sealed Secrets fonctionne avec un contrôleur dans le cluster et un CLI kubeseal. Tu crées un secret normal, tu le "scelles" avec kubeseal, et tu peux committer le SealedSecret résultant dans Git. Le contrôleur surveille les SealedSecrets et crée automatiquement les secrets Kubernetes correspondants.
Sealed Secrets se distingue par sa simplicité (un contrôleur, un CLI, c'est tout), sa compatibilité GitOps totale (secrets chiffrés dans Git), et sa sécurité asymétrique (seul le cluster peut déchiffrer).
Informations essentielles
| Propriété | Valeur |
|---|---|
| Site officiel | https://sealed-secrets.netlify.app/ |
| Repository | https://github.com/bitnami-labs/sealed-secrets |
| Licence | Apache 2.0 |
| Développeur | Bitnami |
| Langage | Go |
| Chiffrement | RSA 4096, AES-GCM |
Fonctionnalités principales
Chiffrement asymétrique
- Clé publique pour chiffrer (safe pour Git)
- Clé privée dans le cluster uniquement
- Chiffrement RSA 4096 + AES-GCM
- Rotation automatique des clés configurable
- Multiple clés supportées pour rotation
Scoping granulaire
- strict : namespace et nom spécifiques
- namespace-wide : tout le namespace
- cluster-wide : tout le cluster
- Contrôle fin des permissions d'accès
- Isolation par environnement
GitOps natif
- SealedSecrets stockés en toute sécurité dans Git
- Workflow standard kubectl apply
- Synchronisation automatique GitOps (ArgoCD, FluxCD)
- Historique des changements dans Git
- Review process standard pour les secrets
CLI intuitif
- kubeseal : chiffrement simple et rapide
- Support stdin/stdout pour pipelines
- Formats multiples (YAML, JSON)
- Validation des SealedSecrets
- Intégration CI/CD native
Cas d'usage
- GitOps complet : Secrets versionés et trackés dans Git
- CI/CD pipelines : Déploiement automatisé avec secrets sécurisés
- Multi-environnements : Différents secrets par environment, même repo
- Audit trail : Historique complet des changements de secrets
- Team collaboration : Review process pour les modifications de secrets
Installation
Contrôleur (via kubectl)
# Installation du contrôleur
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.25.0/controller.yaml
# Vérification
kubectl get pods -n kube-system -l name=sealed-secrets-controller
CLI kubeseal
# Via Homebrew (macOS/Linux)
brew install kubeseal
# Via binaire directe
curl -OL https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.25.0/kubeseal-0.25.0-linux-amd64.tar.gz
tar xfz kubeseal-0.25.0-linux-amd64.tar.gz
sudo install -m 755 kubeseal /usr/local/bin/kubeseal
# Via Go
go install github.com/bitnami-labs/sealed-secrets/cmd/kubeseal@latest
Via Helm
helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets
helm install sealed-secrets sealed-secrets/sealed-secrets \
--namespace kube-system \
--version 2.15.1
Utilisation basique
Création d'un secret scellé
# Créer un secret Kubernetes standard (temporaire)
kubectl create secret generic mysecret \
--from-literal=username=myuser \
--from-literal=password=mypassword \
--dry-run=client -o yaml > secret.yaml
# Sceller le secret
kubeseal -f secret.yaml -w mysealedsecret.yaml
# Nettoyer le fichier temporaire
rm secret.yaml
# Appliquer le secret scellé
kubectl apply -f mysealedsecret.yaml
SealedSecret généré
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
creationTimestamp: null
name: mysecret
namespace: default
spec:
encryptedData:
password: AgBy3i4OJSWK+PiTySYZZA9rO43cGDEQAx...
username: AgBy3i4OJSWK+PiTySYZZA9rO43cGDEQAx...
template:
metadata:
creationTimestamp: null
name: mysecret
namespace: default
Scoping des secrets
# Strict scoping (défaut) - namespace et nom spécifiques
kubeseal --scope strict -f secret.yaml -w sealed.yaml
# Namespace-wide - utilisable par tout le namespace
kubeseal --scope namespace-wide -f secret.yaml -w sealed.yaml
# Cluster-wide - utilisable partout dans le cluster
kubeseal --scope cluster-wide -f secret.yaml -w sealed.yaml
Pipeline CI/CD
#!/bin/bash
# Script pour pipeline CI/CD
# Récupérer la clé publique du cluster
kubeseal --fetch-cert > public.crt
# Chiffrer le secret avec la clé publique
echo -n mypassword | kubeseal --raw --from-file=/dev/stdin --name=mysecret --namespace=production
# Le résultat peut être injecté dans un SealedSecret YAML
Rotation des clés
# Forcer la rotation (génère une nouvelle clé)
kubectl annotate secret sealed-secrets-key \
-n kube-system sealedsecrets.bitnami.com/sealed-secrets-key=active
# Lister les clés disponibles
kubectl get secrets -n kube-system -l sealedsecrets.bitnami.com/sealed-secrets-key
Avantages
- ✅ GitOps natif : secrets chiffrés stockés en toute sécurité dans Git, workflow GitOps complet
- ✅ Sécurité asymétrique : seul le cluster peut déchiffrer, clé publique safe partout
- ✅ Simplicité : un contrôleur, un CLI, pas de complexité supplémentaire
- ✅ Mature et stable : utilisé en production depuis des années, c'est prouvé
- ✅ Scoping granulaire : contrôle fin des permissions par namespace/cluster
Limitations
- Rotation des clés peut être complexe sur clusters existants : mais possible avec planification
- Secrets modifiés directement dans K8s sont écrasés : mais c'est le comportement voulu
- Pas de synchronisation avec systèmes externes : mais c'est pour rester simple
Alternatives
- External Secrets Operator : Synchronisation depuis systèmes externes
- SOPS : Chiffrement de fichiers avec multiples providers
- HashiCorp Vault : Système de secrets centralisé
- Kubernetes Secrets : Secrets natifs (base64, pas chiffré)
Ressources
- Documentation : https://sealed-secrets.netlify.app/
- GitHub : https://github.com/bitnami-labs/sealed-secrets
- Getting Started : https://sealed-secrets.netlify.app/getting-started/
- Best Practices : https://sealed-secrets.netlify.app/best-practices/