Sealed Secrets
Sealed Secrets ist eine Kubernetes-Lösung zur sicheren Speicherung und Verwaltung geheimer Daten (z. B. Passwörter, API-Schlüssel oder Zertifikate). Sie kombiniert Public-Key-Verschlüsselung mit Kubernetes-CRDs (Custom Resource Definitions), um sensible Informationen sicher bereitzustellen, ohne dass sie im Klartext gespeichert werden.

Inhaltsverzeichnis
Warum Sealed Secrets?
Ich möchte ja in Kombination mit Flux meinen
kompletten k3s Cluster mit deklarativen Code betanken. Das heißt ich habe die komplette
Konfiguration im git Repository liegen. Ziemlich häufig müssen auch Secrets in den
einzelnen Konfigurationen hinterlegt werden. Damit ich alles beisammen habe, habe ich mich
für Sealed Secrets
entschieden.
Vorteile von Sealed Secrets
- Sicher in Git verwaltbar – Verschlüsselte Secrets können in einem Repository gespeichert werden.
- Schutz vor unbefugtem Zugriff – Nur der Cluster mit dem richtigen Private Key kann sie entschlüsseln.
- Einfache Integration in CI/CD – Secrets können sicher in Pipelines verwendet werden.
- Namespace- oder Cluster-spezifisch – Steuerung, wo und wie ein Secret genutzt werden kann.
Wie funktionieren Sealed Secrets?
-
Installation des Sealed-Secret-Controllers:
- Ein Kubernetes-Operator (Sealed-Secret-Controller) wird im Cluster installiert.
- Dieser generiert automatisch ein Schlüsselpaar (Public/Private Key).
-
Verschlüsselung mit dem Public Key:
- Der Public Key wird genutzt, um ein Kubernetes-Secret außerhalb des Clusters zu verschlüsseln.
- Das verschlüsselte Secret wird als SealedSecret-Ressource gespeichert und kann sicher in einem Git-Repository oder einer CI/CD-Pipeline verwaltet werden.
-
Entschlüsselung durch den Sealed-Secret-Controller:
- Im Cluster entschlüsselt der Sealed-Secret-Controller das SealedSecret automatisch mit dem Private Key und erstellt ein herkömmliches Kubernetes-Secret.
Sealed Secret erstellen
- Ein normales Secret erzeugen:
kubectl create secret generic mysecret --from-literal=password=supersecure -n mynamespace --dry-run=client -o yaml > secret.yaml
- Das Secret mit kubeseal verschlüsseln:
kubeseal --format=yaml < secret.yaml > sealedsecret.yaml
- Das SealedSecret ins Cluster deployen:
kubectl apply -f sealedsecret.yaml
Der Sealed-Secret-Controller entschlüsselt es automatisch und stellt das Kubernetes-Secret bereit. Hier ein Beispiel wie das verschlüsselete Secret aussieht:
apiVersion: bitnami.com/v1alpha1kind: SealedSecretmetadata: creationTimestamp: null name: git-auth-secret namespace: www-trinityonline-despec: encryptedData: identity: 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 identity.pub: AgAgR/9dfHHsknns4mjgemH7pLrf0bkA9AlmrBVPV+VP7oT/F9RbLIY7afkSU+PJHxvytrVLSe4iTqWPrKLi+yjm0hhxYszp/204ADngEY9kpU8gl5GXZ/hv1kW+e5twWBVXnruErwVODZVjnMm91GqAnA82MJVkl3mXDWBLXNIjSJRGcNYMgHPyq8vUr2ROqXuty9f/16v8kb3IQdf2AmLe5xBXsVQfwYJHWkwnhlBxjqXCfrAD37s8+XfvLC6qoI4ojzrwUvEsbv8mi7T6JqbXlHxYWIujhqndakRcOIkpghwK5tXpr+/CRu5MNxTcwO/zLMz1oEYcZ4XEtQPQ6urIXs5taGAlvgoNA8tihKp8PO6zEsznpKhJf9uMXsBBQG4ZuJsG5HiBALrCipA/8NUVmvMlyf0WiS6KOqGQKVVkR1zmS/ZV1sY1leAU+vXcaVdF2adswr0+mh0eHmjmif1ZkRhGSUZmAoaNQSRe5ZReaU+6SvZq6p5RoZzDkfnlS8moxmRlUlbOtCweFV/k7q4kpEWC0f8cAy13b7kdkUfbD6dzAWVvOrGf9fY3OFuOfVmVMt66VJy1Q9AZyz3I1elT3vRYmCao/zM+FMOp+PlSj9CfPCH9+VdHkV7Q1hGV3TvOKkmaWp7NFuB0k6ZDixLGEfP8/ETaQ7xRgsrxNj+7mO6NLHs0wTMkGLiGypTqSLSvW042DNh1LRhl6Dp7hul2YOO3YOUgHMUHHcRvZbSJyztlOoQp+TOA11XVRiAejeS2ewnSmuS6pNzfFC/6Od0ep7QpCMcdoXVOgSfDeX7X3t3dqIl2gX4PuPkh9QA23yUQoKtaibsjJ/UZdMYibn4orRR9V2EQLPgoCJboQAxm+RrZb+23ILC63qRiFF3MhgoFSihWzzI5RSEpK6R+rylcuNED5mM6kG54eSUmZ25w2V4+jEWPJ6q9jX327Zbmo/tlgMPikrICYw2nwR49v/q7RBOdMovAuyR4e1WyxQRf+XMWuAryAZWwTbawWOGCk0b9W98HpjgzucrCYsL1id3odEicFlPP7EX+uA79/BzqfQPhtpgv3goTnP7OV7CmJUNuiaMxDbjwVwA3j3Mm5OrNLFDNaglw2CSBF35PE3WGCh2jikorJh2zglG6v630DV1NSIzEhj6SCB2kEW8tJ/n9UVDURHrN2JacloJ9FK35McqaFxpCHpLVeeKnvOdNiHJbuKDMfPUoFLqSN1U9tlQhiOueIwPRMEeEJAR0AA8tdC34NAutMs3cG1dJahvo/s7vJHVcR5CCekVK2u3jC3gflRm4rNNeyAS2TPbxs0d+I6Gd6oObhjPyBccBRFixpEgUojQh3V134e6LrP3u+RFMilIHGOHPLzZQhvqVOIcxCNJVz5bZmgeCZskqCQyR4XtbU4asNILOvcAynaG9Zb6RworOINjgoeSIUug0IVro23QQ4ZrbXopxTb9jXBkyLBL9abYMpEnx7L70KsR1CV4tIR86IZ0iPBdRzUNIeZr5pS4ctam7udqlR+QWZy00YtwZPRnQKx+1WMV4stu2SUFCuVBd+NidJ+UORxptu2/O8bJ6rlwvm1lgjQv2qDEHXc+RbXpw+8QhqicVIV6O4QCBtkLIZdmGO+G+gqXJOpE3IvF3hacxmNaGravTny0ZU2Hz/+07SL9rFxBF known_hosts: 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 template: metadata: creationTimestamp: null name: git-auth-secret namespace: www-trinityonline-de
Backup
Sollte der Cluster neu aufgesetzt werden, wird der sealed-secret key neu erstellt. Von daher ist es wichtig, dass der jetztige Key gesichert wird, da ihr sonst eure Secrets nicht mehr entschlüsseln könnt.
Der Key kann wie folgt gesichert werden:
kubectl get secret -n kube-system -l sealedsecrets.bitnami.com/sealed-secrets-key -o yaml > sealed-secrets-backup.yaml
Ich sichere den Key in meinem pass password manager.
cat sealed-secrets-backup.yaml| xclip -selection clipboardrm sealed-secrets-backup.yaml
Die originale Datei wird mittels rm entfernt!
Zurückspielen kann man den Key wie folgt:
kubectl apply -f sealed-secrets-backup.yaml
Danach sollte der Sealed Secrets Controller neugestartet werden:
kubectl delete pod -n kube-system -l name=sealed-secrets-controller