So dekodieren Sie ein Pull-Secret
- Fügen Sie eines davon in die Eingabe ein:
- die Ausgabe von
kubectl get secret regcred -o yaml - nur den Base64-Wert von
.dockerconfigjson - das JSON selbst, zum Beispiel Ihre
~/.docker/config.json
- die Ausgabe von
- Zuerst werden die Registry-Zugangsdaten aufgelistet: Registry, Benutzername, Passwort und der Wert
auth, aufgeteilt in Benutzer und Passwort. - Um stattdessen ein Secret zu erstellen, öffnen Sie Pull-Secret erstellen und füllen Registry, Benutzername, Passwort und bei Bedarf E-Mail (optional) aus. Das Ergebnis ist dasselbe Secret, das
kubectl create secret docker-registryschreibt.
Das doppelte Base64 in einem Pull-Secret
Ein Pull-Secret verpackt Base64 in Base64, deshalb braucht das Dekodieren von Hand zwei Schritte.
apiVersion: v1
kind: Secret
metadata:
name: regcred
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: eyJhdXRocyI6eyJyZWdpc3RyeS5leGFtcGxlLmNvbSI6eyJ1c2VybmFtZSI6ImNpLWJvdCIsInBhc3N3b3JkIjoicHVsbC1vbmx5LXRva2VuIiwiYXV0aCI6Ilkya3RZbTkwT25CMWJHd3RiMjVzZVMxMGIydGxiZz09In19fQ==
Schicht eins, der Wert des Secrets, wird zum JSON der Docker-Konfiguration dekodiert:
{"auths":{"registry.example.com":{"username":"ci-bot","password":"pull-only-token","auth":"Y2ktYm90OnB1bGwtb25seS10b2tlbg=="}}}
Schicht zwei, auth, wird zu ci-bot:pull-only-token dekodiert. Ein mit kubectl create secret docker-registry erzeugter Wert von .dockerconfigjson beginnt mit eyJhdXRocyI6, dem Base64 von {"auths":, deshalb sind solche Zeichenketten in Logs und Manifesten leicht zu erkennen.
Formate, denen Sie begegnen können
| Form | Woher sie stammt |
|---|---|
{"auths": {"host": {...}}} | .dockerconfigjson, aktuelle ~/.docker/config.json |
{"host": {"auth": "...", "email": "..."}} | alte .dockercfg-Secrets (kubernetes.io/dockercfg) |
"https://index.docker.io/v1/" als Host | Docker Hub |
identitytoken statt eines Passworts | Registrys, die nach docker login OAuth-Refresh-Tokens ausgeben |
Beide Secret-Typen werden hier dekodiert. Ein altes .dockercfg hat keine Hülle auths, ein für das eine Format geschriebenes Skript findet im anderen also stillschweigend nichts.
Dekodieren in der Shell
kubectl get secret regcred -o jsonpath='{.data.\.dockerconfigjson}' | base64 --decode | jq .
kubectl get secret regcred -o jsonpath='{.data.\.dockerconfigjson}' | base64 --decode \
| jq -r '.auths | to_entries[] | "\(.key) \(.value.auth | @base64d)"'
Der zweite Befehl gibt pro Registry eine Zeile registry user:password aus. Der Wert auth hat dasselbe Format wie ein Basic-Auth-Header, daher liest ihn auch der Basic-Auth-Decoder.
Warum ein Pull-Secret scheitert
- Falscher Registry-Schlüssel. Der Host in
authsmuss zur Image-Referenz passen:ghcr.io/org/appbrauchtghcr.io, und Images von Docker Hub brauchenhttps://index.docker.io/v1/. - Secret in einem anderen Namespace.
imagePullSecretsfindet nur Secrets im eigenen Namespace des Pods. - Abgelaufenes Token. Manche Registrys geben kurzlebige Passwörter aus; Tokens von Amazon ECR etwa gelten 12 Stunden. Ein Secret, das gestern funktioniert hat, führt dann heute zu
ImagePullBackOff. - Von Hand gebautes JSON. Ein Passwort, das mit Zeilenumbruch oder Leerzeichen am Ende kopiert wurde, oder ein
auth-Wert aus der falschen Zeichenkette scheitert stillschweigend. Vergleichen Sie das dekodierteauthmit den Feldern für Benutzername und Passwort, oder erstellen Sie das Secret mitkubectl create secret docker-registryneu.
Wer das Secret lesen kann, kann das Konto benutzen, denn Base64 verbirgt nichts. Geben Sie Pull-Secrets nur Registry-Tokens mit Lesezugriff.
Häufige Fragen
Wie dekodiere ich ein imagePullSecret?
Fügen Sie oben die Ausgabe von kubectl get secret regcred -o yaml ein. In der Shell gibt kubectl get secret regcred -o jsonpath='{.data.\.dockerconfigjson}' | base64 --decode das JSON aus, und dessen Feld auth ist noch einmal Base64.
Was ist das Feld auth in der config.json?
Es ist username:password in Base64, dasselbe Format wie ein HTTP-Basic-Authorization-Header. Y2ktYm90OnB1bGwtb25seS10b2tlbg== wird zu ci-bot:pull-only-token dekodiert.
Warum ist mein auths-Eintrag in ~/.docker/config.json leer?
Docker legt das Passwort in einem Credential Helper ab, wenn credsStore oder credHelpers gesetzt ist, etwa im Schlüsselbund des Systems. Die Datei enthält dann pro Registry nur {}, und es gibt nichts zu dekodieren.