Como decodificar um Secret do Kubernetes
- Rode
kubectl get secret app-db -n shop -o yamle cole a saída na caixa. JSON de-o jsontambém funciona. - A tabela lista cada chave com o valor decodificado e o tamanho, além dos botões Copiar e Copiar Base64.
- O painel de saída traz o mesmo Secret reescrito com
stringData, com os valores em texto puro. Valores binários continuam emdata. - Troque para Gerar Secret para o caminho inverso: entram linhas
KEY=value, sai um Secret comdataem Base64.
A entrada também pode ser uma List de kubectl get secrets -o yaml, vários documentos separados por ---, um manifesto renderizado pelo Helm, um .dockerconfigjson sozinho ou um único valor Base64.
Exemplo: o que o kubectl entrega e o que significa
apiVersion: v1
data:
DATABASE_URL: cG9zdGdyZXM6Ly9hcHA6czNjcjN0LVBhNTVAZGI6NTQzMi9zaG9w
DB_PASSWORD: czNjcjN0LVBhNTUK
DB_USER: YXBw
kind: Secret
metadata:
name: app-db
namespace: shop
type: Opaque
| Chave | Decodificado | Tamanho |
|---|---|---|
DATABASE_URL | postgres://app:s3cr3t-Pa55@db:5432/shop | 39 B |
DB_PASSWORD | s3cr3t-Pa55 mais uma quebra de linha | 12 B |
DB_USER | app | 3 B |
A senha tem 11 caracteres, mas o valor tem 12 bytes. Alguém o criou com echo 's3cr3t-Pa55' | base64, e a quebra de linha no final vai quebrar o login no banco de dados. O Base64 sem a quebra de linha seria czNjcjN0LVBhNTU=.
O que o decodificador reconhece
- Certificados e chaves PEM, como
tls.crtetls.keynum Secretkubernetes.io/tls, são sinalizados. Certificados ganham um link para o decodificador de certificados, para conferir a validade e os SANs. - Valores JSON são formatados.
- Valores binários, como um keystore Java, recebem o tipo de arquivo, uma prévia em hex e um botão Baixar.
- Valores
.dockerconfigjsone.dockercfgsão separados em registry, usuário e senha, com oauthdecodificado. O decodificador de .dockerconfigjson coloca isso em primeiro plano.
Comandos kubectl de uma linha
Um valor. Escape os pontos nos nomes de chave dentro do jsonpath:
kubectl get secret app-db -o jsonpath='{.data.DB_PASSWORD}' | base64 --decode
kubectl get secret app-tls -o jsonpath='{.data.tls\.crt}' | base64 --decode
Todos os valores, com a função de template base64decode embutida no kubectl ou com o 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)'
Criar um Secret sem cair na armadilha da quebra de linha:
kubectl create secret generic app-db --from-literal=DB_PASSWORD='s3cr3t-Pa55' --dry-run=client -o yaml
Há mais receitas de shell na página de Base64 no Bash.
Limites e problemas comuns
- “Nenhum Secret com data ou stringData foi encontrado”: o que foi colado provavelmente é um Deployment ou um ConfigMap. Os valores de ConfigMap são texto puro e não precisam ser decodificados.
- Tamanho: um Secret tem limite de 1 MiB no total. Gerar Secret confere o limite, os nomes das chaves e o nome no estilo DNS antes de você aplicar qualquer coisa.
- Recursos de YAML: o leitor cobre o que kubectl, Helm e Kustomize geram, incluindo block scalars e vários documentos. Âncoras, aliases e merge keys não são suportados.
- Secrets de release do Helm (
sh.helm.release.v1.*) contêm Base64 de dados gzip dentro do valor Base64 dedata. Decodifique a camada externa aqui e depois use o decodificador gzip Base64.
Perguntas frequentes
Como decodificar um Secret do Kubernetes com o kubectl?
Para uma chave: kubectl get secret app-db -o jsonpath='{.data.DB_PASSWORD}' | base64 --decode. Para todas de uma vez, cole aqui a saída de -o yaml, ou use os comandos de uma linha com go-template ou jq desta página.
Os Secrets do Kubernetes são criptografados?
O campo data é só Base64, que qualquer pessoa com permissão de leitura consegue reverter. A criptografia em repouso no etcd é uma configuração separada do cluster, e o RBAC decide quem pode ler Secrets. Veja codificação vs criptografia.
Por que meu Secret decodificado tem uma quebra de linha no final?
O valor foi criado com echo em vez de echo -n, então a quebra de linha também foi codificada. O Base64 dele costuma terminar em K, o= ou Cg==. Crie de novo com printf '%s' value | base64 ou com kubectl create secret --from-literal.
Qual a diferença entre data e stringData?
data guarda valores em Base64, stringData recebe texto puro que o API server codifica para você na gravação. As leituras sempre devolvem data. O painel de saída aqui reescreve o Secret com stringData, para você editar e aplicar de novo.