Comment décoder un pull secret
- Collez l’un de ces éléments dans l’entrée :
- la sortie de
kubectl get secret regcred -o yaml - seulement la valeur Base64 de
.dockerconfigjson - le JSON lui-même, par exemple votre
~/.docker/config.json
- la sortie de
- Les identifiants de registre sont listés en premier : registre, nom d’utilisateur, mot de passe, et la valeur
authséparée en utilisateur et mot de passe. - Pour créer un Secret à la place, ouvrez Créer le pull secret et remplissez Registre, Nom d’utilisateur, Mot de passe et éventuellement E-mail. Le résultat est le même Secret que celui qu’écrit
kubectl create secret docker-registry.
Le double Base64 d’un pull secret
Un pull secret emballe du Base64 dans du Base64 : c’est pourquoi le décoder à la main demande deux étapes.
apiVersion: v1
kind: Secret
metadata:
name: regcred
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: eyJhdXRocyI6eyJyZWdpc3RyeS5leGFtcGxlLmNvbSI6eyJ1c2VybmFtZSI6ImNpLWJvdCIsInBhc3N3b3JkIjoicHVsbC1vbmx5LXRva2VuIiwiYXV0aCI6Ilkya3RZbTkwT25CMWJHd3RiMjVzZVMxMGIydGxiZz09In19fQ==
La première couche, la valeur du Secret, se décode en JSON de configuration Docker :
{"auths":{"registry.example.com":{"username":"ci-bot","password":"pull-only-token","auth":"Y2ktYm90OnB1bGwtb25seS10b2tlbg=="}}}
La seconde couche, auth, se décode en ci-bot:pull-only-token. Une valeur .dockerconfigjson créée par kubectl create secret docker-registry commence par eyJhdXRocyI6, le Base64 de {"auths":, ce qui rend ces chaînes faciles à repérer dans les journaux et les manifestes.
Les formats que vous pouvez rencontrer
| Forme | Provenance |
|---|---|
{"auths": {"host": {...}}} | .dockerconfigjson, ~/.docker/config.json actuel |
{"host": {"auth": "...", "email": "..."}} | anciens Secrets .dockercfg (kubernetes.io/dockercfg) |
"https://index.docker.io/v1/" comme hôte | Docker Hub |
identitytoken au lieu d’un mot de passe | registres qui délivrent des jetons de rafraîchissement OAuth après docker login |
Les deux types de Secret sont décodés ici. Un ancien .dockercfg n’a pas d’enveloppe auths : un script écrit pour un format ne trouve donc rien, sans erreur, dans l’autre.
Décoder dans le 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)"'
La seconde commande affiche une ligne registry user:password par registre. La valeur auth a le même format qu’un en-tête Basic Auth : le décodeur Basic Auth la lit donc aussi.
Pourquoi un pull secret échoue
- Mauvaise clé de registre. L’hôte dans
authsdoit correspondre à la référence de l’image :ghcr.io/org/appa besoin deghcr.io, et les images Docker Hub dehttps://index.docker.io/v1/. - Secret dans un autre namespace.
imagePullSecretsne trouve que les Secrets du namespace du Pod. - Jeton expiré. Certains registres délivrent des mots de passe de courte durée ; les jetons Amazon ECR, par exemple, sont valables 12 heures. Un Secret qui fonctionnait hier donne alors
ImagePullBackOffaujourd’hui. - JSON construit à la main. Un mot de passe copié avec un saut de ligne ou une espace en trop, ou une valeur
authencodée à partir de la mauvaise chaîne, échoue sans bruit. Comparez leauthdécodé avec les champs nom d’utilisateur et mot de passe, ou recréez le Secret aveckubectl create secret docker-registry.
Quiconque peut lire le Secret peut utiliser le compte, puisque le Base64 ne cache rien. Donnez aux pull secrets des jetons de registre en lecture seule.
FAQ
Comment décoder un imagePullSecret ?
Collez ci-dessus la sortie de kubectl get secret regcred -o yaml. Dans un shell, kubectl get secret regcred -o jsonpath='{.data.\.dockerconfigjson}' | base64 --decode affiche le JSON, dont le champ auth est encore une fois en Base64.
Qu'est-ce que le champ auth de config.json ?
C’est username:password en Base64, le même format qu’un en-tête HTTP Authorization Basic. Y2ktYm90OnB1bGwtb25seS10b2tlbg== se décode en ci-bot:pull-only-token.
Pourquoi l'entrée auths de mon ~/.docker/config.json est-elle vide ?
Docker stocke le mot de passe dans un credential helper quand credsStore ou credHelpers est défini, par exemple le trousseau du système. Le fichier ne contient alors que {} par registre, et il n’y a rien à décoder.