Como decodificar um pull secret
- Cole na entrada uma destas opções:
- a saída de
kubectl get secret regcred -o yaml - só o valor Base64 de
.dockerconfigjson - o próprio JSON, por exemplo o seu
~/.docker/config.json
- a saída de
- As credenciais de registry aparecem primeiro: registry, usuário, senha e o valor
authseparado em usuário e senha. - Para criar um Secret, abra Gerar pull secret e preencha Registry, Usuário, Senha e, se quiser, E-mail. O resultado é o mesmo Secret que
kubectl create secret docker-registrygrava.
O Base64 duplo dentro de um pull secret
Um pull secret embrulha Base64 dentro de Base64, e é por isso que decodificá-lo à mão leva dois passos.
apiVersion: v1
kind: Secret
metadata:
name: regcred
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: eyJhdXRocyI6eyJyZWdpc3RyeS5leGFtcGxlLmNvbSI6eyJ1c2VybmFtZSI6ImNpLWJvdCIsInBhc3N3b3JkIjoicHVsbC1vbmx5LXRva2VuIiwiYXV0aCI6Ilkya3RZbTkwT25CMWJHd3RiMjVzZVMxMGIydGxiZz09In19fQ==
A primeira camada, o valor do Secret, decodifica para o JSON de configuração do Docker:
{"auths":{"registry.example.com":{"username":"ci-bot","password":"pull-only-token","auth":"Y2ktYm90OnB1bGwtb25seS10b2tlbg=="}}}
A segunda camada, auth, decodifica para ci-bot:pull-only-token. Um valor .dockerconfigjson criado por kubectl create secret docker-registry começa com eyJhdXRocyI6, o Base64 de {"auths":, o que facilita identificar essas strings em logs e manifestos.
Formatos que você pode encontrar
| Forma | De onde vem |
|---|---|
{"auths": {"host": {...}}} | .dockerconfigjson, ~/.docker/config.json atual |
{"host": {"auth": "...", "email": "..."}} | Secrets .dockercfg legados (kubernetes.io/dockercfg) |
"https://index.docker.io/v1/" como host | Docker Hub |
identitytoken no lugar de senha | registries que entregam refresh tokens OAuth depois do docker login |
Os dois tipos de Secret são decodificados aqui. Um .dockercfg legado não tem o invólucro auths, então um script escrito para um formato não encontra nada no outro, sem avisar.
Como decodificar no 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)"'
O segundo comando imprime uma linha registry user:password por registry. O valor auth tem o mesmo formato de um header Basic Auth, então o decodificador de Basic Auth também o lê.
Por que um pull secret falha
- Chave de registry errada. O host em
authsprecisa corresponder à referência da imagem:ghcr.io/org/appprecisa deghcr.io, e imagens do Docker Hub precisam dehttps://index.docker.io/v1/. - Secret em outro namespace.
imagePullSecretssó encontra Secrets no namespace do próprio Pod. - Token expirado. Alguns registries emitem senhas de curta duração; tokens do Amazon ECR, por exemplo, valem por 12 horas. Um Secret que funcionou ontem dá
ImagePullBackOffhoje. - JSON montado à mão. Uma senha copiada com quebra de linha ou espaço no final, ou um valor
authcodificado a partir da string errada, falha em silêncio. Compare oauthdecodificado com os campos de usuário e senha, ou recrie o Secret comkubectl create secret docker-registry.
Qualquer um que consiga ler o Secret pode usar a conta, já que o Base64 não esconde nada. Use tokens de registry somente leitura nos pull secrets.
Perguntas frequentes
Como decodificar um imagePullSecret?
Cole acima a saída de kubectl get secret regcred -o yaml. No shell, kubectl get secret regcred -o jsonpath='{.data.\.dockerconfigjson}' | base64 --decode imprime o JSON, e o campo auth dele está em Base64 mais uma vez.
O que é o campo auth no config.json?
É username:password em Base64, o mesmo formato de um header HTTP Basic Authorization. Y2ktYm90OnB1bGwtb25seS10b2tlbg== decodifica para ci-bot:pull-only-token.
Por que a entrada auths do meu ~/.docker/config.json está vazia?
O Docker guarda a senha em um credential helper quando credsStore ou credHelpers está definido, por exemplo no chaveiro do sistema. O arquivo então tem só {} por registry, e não há nada para decodificar.