So dekodieren Sie ein Kubernetes Secret
- Führen Sie
kubectl get secret app-db -n shop -o yamlaus und fügen Sie die Ausgabe in das Feld ein. JSON aus-o jsonfunktioniert ebenfalls. - Die Tabelle listet jeden Schlüssel mit dekodiertem Wert und Größe, dazu die Schaltflächen Kopieren und Base64 kopieren.
- Der Ausgabebereich enthält dasselbe Secret, umgeschrieben mit
stringDataund Werten im Klartext. Binäre Werte bleiben indata. - Wechseln Sie zu Secret erstellen für die Gegenrichtung:
KEY=value-Zeilen rein, ein Secret mit Base64-dataraus.
Die Eingabe kann auch eine List aus kubectl get secrets -o yaml sein, mehrere durch --- getrennte Dokumente, ein von Helm gerendertes Manifest, eine einzelne .dockerconfigjson oder nur ein Base64-Wert.
Beispiel: was kubectl liefert und was es bedeutet
apiVersion: v1
data:
DATABASE_URL: cG9zdGdyZXM6Ly9hcHA6czNjcjN0LVBhNTVAZGI6NTQzMi9zaG9w
DB_PASSWORD: czNjcjN0LVBhNTUK
DB_USER: YXBw
kind: Secret
metadata:
name: app-db
namespace: shop
type: Opaque
| Schlüssel | Dekodiert | Größe |
|---|---|---|
DATABASE_URL | postgres://app:s3cr3t-Pa55@db:5432/shop | 39 B |
DB_PASSWORD | s3cr3t-Pa55 plus ein Zeilenumbruch | 12 B |
DB_USER | app | 3 B |
Das Passwort hat 11 Zeichen, der Wert aber 12 Bytes. Jemand hat ihn mit echo 's3cr3t-Pa55' | base64 erstellt, und der abschließende Zeilenumbruch wird die Datenbankanmeldung scheitern lassen. Ohne den Zeilenumbruch wäre das Base64 czNjcjN0LVBhNTU=.
Was der Decoder erkennt
- PEM-Zertifikate und -Schlüssel wie
tls.crtundtls.keyin einem Secret vom Typkubernetes.io/tlswerden markiert. Zertifikate bekommen einen Link zum Zertifikat-Decoder, um Ablaufdatum und SANs zu prüfen. - JSON-Werte werden formatiert.
- Binäre Werte wie ein Java-Keystore erhalten ihren Dateityp, eine Hex-Vorschau und eine Schaltfläche Herunterladen.
.dockerconfigjson- und.dockercfg-Werte werden in Registry, Benutzername und Passwort zerlegt, mit dekodiertemauth. Der .dockerconfigjson-Decoder stellt diese an den Anfang.
kubectl-Einzeiler
Ein Wert. Punkte in Schlüsselnamen müssen in jsonpath maskiert werden:
kubectl get secret app-db -o jsonpath='{.data.DB_PASSWORD}' | base64 --decode
kubectl get secret app-tls -o jsonpath='{.data.tls\.crt}' | base64 --decode
Alle Werte, mit der in kubectl eingebauten Template-Funktion base64decode oder mit jq:
kubectl get secret app-db -o go-template='{{range $k, $v := .data}}{{$k}}={{$v | base64decode}}{{"\n"}}{{end}}'
kubectl get secret app-db -o json | jq '.data | map_values(@base64d)'
Ein Secret ohne die Zeilenumbruch-Falle erstellen:
kubectl create secret generic app-db --from-literal=DB_PASSWORD='s3cr3t-Pa55' --dry-run=client -o yaml
Weitere Shell-Rezepte stehen auf der Seite Base64 in Bash.
Grenzen und häufige Probleme
- „In dieser Eingabe wurde kein Secret mit data oder stringData gefunden.“: Eingefügt wurde vermutlich ein Deployment oder eine ConfigMap. ConfigMap-Werte sind Klartext und müssen nicht dekodiert werden.
- Größe: Ein Secret ist insgesamt auf 1 MiB begrenzt. Secret erstellen prüft die Grenze, die Schlüsselnamen und den Namen im DNS-Format, bevor Sie etwas anwenden.
- YAML-Funktionen: Der Parser deckt ab, was kubectl, Helm und Kustomize erzeugen, einschließlich Block-Skalaren und mehrerer Dokumente. Anker, Aliase und Merge-Keys werden nicht unterstützt.
- Helm-Release-Secrets (
sh.helm.release.v1.*) enthalten im Base64-data-Wert Base64 von gzip-Daten. Dekodieren Sie hier die äußere Schicht und nutzen Sie dann den Gzip-Base64-Decoder.
Häufige Fragen
Wie dekodiere ich ein Kubernetes Secret mit kubectl?
Für einen Schlüssel: kubectl get secret app-db -o jsonpath='{.data.DB_PASSWORD}' | base64 --decode. Für alle Schlüssel auf einmal fügen Sie die Ausgabe von -o yaml hier ein, oder Sie verwenden die Einzeiler mit go-template oder jq auf dieser Seite.
Sind Kubernetes Secrets verschlüsselt?
Das Feld data ist nur Base64, das jeder mit Lesezugriff umkehren kann. Verschlüsselung im Ruhezustand in etcd ist eine separate Cluster-Einstellung, und RBAC entscheidet, wer Secrets lesen darf. Siehe Kodierung vs. Verschlüsselung.
Warum hat mein dekodiertes Secret am Ende einen Zeilenumbruch?
Der Wert wurde mit echo statt echo -n erstellt, sodass der Zeilenumbruch mitkodiert wurde. Sein Base64 endet dann oft auf K, o= oder Cg==. Erstellen Sie ihn neu mit printf '%s' value | base64 oder mit kubectl create secret --from-literal.
Was ist der Unterschied zwischen data und stringData?
data enthält Base64-Werte, stringData nimmt Klartext an, den der API-Server beim Schreiben für Sie kodiert. Beim Lesen kommt immer data zurück. Der Ausgabebereich hier schreibt das Secret mit stringData um, damit Sie es bearbeiten und erneut anwenden können.