Aller au contenu principal

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 officielhttps://sealed-secrets.netlify.app/
Repositoryhttps://github.com/bitnami-labs/sealed-secrets
LicenceApache 2.0
DéveloppeurBitnami
LangageGo
ChiffrementRSA 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