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, sodass 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 und diese in normale Secret Objekte umwandelt.

Verfügbarkeit

Bei NKE ist Sealed Secrets als optionaler Serivce verfügbar. Die Funktionalität kann über das Cockpit für bestehende NKE Cluster aktiviert werden.

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: Sie können 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, Sie übergeben 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 Sie an kubeseal zur Erstellung des verschlüsselten Secrets übergeben. Weitere Einzelheiten finden Sie in der Scopes-Dokumentation.

Nutzung

Strict Scope (Standard)

Um Sealed Secrets zu nutzen, müssen Sie zunächst die CLI-Utility kubeseal installieren, welche Teil des Projekts sealed-secrets ist. Nach Installation von kubeseal für Ihr Betriebssystem können Sie Secrets lokal verschlüsseln.

  1. Definieren Sie dazu Ihr normales, unverschlüsseltes Secret in einer lokalen Datei mit dem Namen secret.yaml.

    apiVersion: v1
    kind: Secret
    metadata:
    name: example
    namespace: dev
    type: Opaque
    stringData:
    password: verysecure
  2. Verwenden Sie kubeseal, um eine verschlüsselte SealedSecret Ressource zu generieren.

    kubeseal --controller-namespace nine-system < secret.yaml > sealed-secret.json

    Hinweis: der aktuelle kube Kontext muss auf den NKE Cluster verweisen. Alternativ können die kubeconfig und der Kontext mit zusätzlichen Optionen an kubeseal geliefert werden.

  3. Wenden Sie es über kubectl an.

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

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

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

Beachten Sie, dass wir in einem produktiven Szenario nicht empfehlen, SealedSecret lokal mit kubectl anzuwenden. Stattdessen können Sie es in Ihrem Konfigurations-Repository speichern und Argo CD das Erstellen überlassen.

Cluster-wide Scope

Die Vorgehensweise ist der des Strict Scope recht ähnlich. Übergeben Sie einfach --scope cluster-wide an die kubeseal-CLI (oder verwenden Sie annotations).

$ kubeseal --scope cluster-wide --controller-namespace nine-system < secret.yaml > sealed-secret.json