Zum Hauptinhalt springen

Sealed Secrets

Sealed Secrets verschlüsselt Kubernetes Secrets, damit diese ohne Bedenken in einem git Repository gespeichert werden können.

Details

Der Inhalt eines Kubernetes Secret ist üblicherweise nicht verschlüsselt, wodurch es nicht zu empfehlen ist das Secret zusammen mit anderen Kubernetes Definitionen in der Versionskontrolle oder an einem ungesicherten Ort zu speichern. Dadurch werden manuelle und fehleranfällige Schritte notwendig um eine Applikation zu Deployen. Als Lösung betreiben wir einen Controller, der das Entschlüsseln der Sealed Secrets übernimmt um diese in normale Secret Objekte umwandelt.

Verfügbarkeit

Sealed Secrets sind standardmässig Teil von nine Managed GKE.

Scopes

Der Scope ist nichts anderes als der Kontext von versiegelten Secrets innerhalb eines Kubernetes-Clusters. Der Scope bezeichnet den Kontext in dem ein verschlüsseltes Kubernetes Secret in einem Kubernetes Cluster entschlüsselt werden kann.

Die möglichen Scopes sind:

  • strict (Standard): Das verschlüsselte Secret darf nur mit dem angegeben Namen und Namespace verwendet werden. Diese Attribute werden Teil der verschlüsselten Daten und daher würde das Ändern von Name und/oder Namespace zu einem "decryption error" führen.
  • namespace-wide: Du kannst das Sealed Secret innerhalb eines bestimmten Namespaces frei umbenennen.
  • cluster-wide: Das Secret kann in jedem Namespace entschlüsselt und mit beliebigem Namen versehen werden.

Standardmässig ist der strict Scope ausgewählt, es sei denn, du übergibst das --scope Flag mit einem anderen Wert an die kubeseal-CLI.

Es ist auch möglich, einen Scope über annotations in dem Secret zu setzen, welches du an kubeseal zur Erstellung des verschlüsselten Secrets übergibst. Weitere Einzelheiten findest du in der Scopes-Dokumentation.

Nutzung

Strict Scope (Standard)

Der einfachste Weg ein Sealed Secret zu erstellen ist durch unseren Generator auf runway.

  1. Generieren eines Sealed Secret durch ausfüllen des Formulares im Secrets Generator Tab.

  2. Sealed Secret herunterladen.

  3. Anwenden via kubectl.

    $ kubectl apply -f ~/Downloads/cloudsql-prod.yaml
    sealedsecret.bitnami.com/cloudsql-prod created
  4. Überprüfen des Secret, welches der Controller für uns erstellt hat.

    $ kubectl get secret cloudsql-prod --template={{.data.password}} | base64 -d
    s#g{eJJ#O)p~VCHVNt26*WGD3

Um das Secret zu löschen, kann einfach das Sealed Secret gelöscht werden und der Controller wird auch das Secret Objekt entfernen.

$ kubectl delete sealedsecret cloudsql-prod
sealedsecret.bitnami.com "cloudsql-prod" deleted

Beachte, dass wir in einem produktiven Szenario nicht empfehlen das Sealed Secret lokal mit kubectl anzuwenden. Stattdessen kannst du es in deinem Konfigurations Repository speichern und Argo CD das Erstellen überlassen.

Cluster-wide Scope

Die Vorgehensweise ist der des strict scopes recht ähnlich. Jedoch kann hier der Generator auf runway nicht genutzt werden. Um Sealed Secrets zu nutzen, musst du zunächst das CLI-Utility kubeseal installieren, welches Teil des sealed-secrets Projektes ist. Nach der Installation von kubeseal kannst du Secrets lokal verschlüsseln.

  1. Definiere dazu dein normales, unverschlüsseltes Secret in einer lokalen Datei mit dem Namen secret.yaml.

    apiVersion: v1
    kind: Secret
    metadata:
    name: example
    type: Opaque
    stringData:
    password: verysecureerysecure
  2. Verwende kubeseal, um eine verschlüsselte SealedSecret Ressource zu generieren.

    Beachte, dass du --scope cluster-wide an die kubeseal-CLI übergibst (oder annotations verwendest).

    Bitte lies die Dokumentation zum Cluster login, um zu erfahren, wie du deine <project-number> erhältst.

    $ kubeseal --cert https://sealed-secrets.apps.<project-number>.ninegcp.ch/v1/cert.pem --scope cluster-wide < secret.yaml > sealed-secret.json
  3. Nutze kubectl, um das Sealed Secret auf dem Cluster zu erstellen.

    $ kubectl apply -f sealed-secret.json
    sealedsecret.bitnami.com/example created
  4. Überprüfe die Secret Ressource, die der Controller erstellt hat.

    $ kubectl get secret example -o jsonpath='{.data.password}' | base64 -d
    verysecureerysecure

Um das Secret wieder zu löschen, kann einfach das SealedSecret gelöscht werden. Der Controller entfernt dann das Secret Objekt.

$ kubectl delete sealedsecret example
sealedsecret.bitnami.com "example" deleted