Cómo decodificar un Secret de Kubernetes
- Ejecuta
kubectl get secret app-db -n shop -o yamly pega la salida en el cuadro. El JSON de-o jsontambién funciona. - La tabla lista cada clave con su valor decodificado y su tamaño, además de los botones Copiar y Copiar Base64.
- El panel de salida contiene el mismo Secret reescrito con
stringData, con los valores en texto plano. Los valores binarios se quedan endata. - Cambia a Crear Secret para el proceso inverso: entran líneas
KEY=valuey sale un Secret condataen Base64.
La entrada también puede ser una List de kubectl get secrets -o yaml, varios documentos separados por ---, un manifiesto renderizado por Helm, un .dockerconfigjson suelto o un único valor Base64.
Ejemplo: lo que te da kubectl y lo que significa
apiVersion: v1
data:
DATABASE_URL: cG9zdGdyZXM6Ly9hcHA6czNjcjN0LVBhNTVAZGI6NTQzMi9zaG9w
DB_PASSWORD: czNjcjN0LVBhNTUK
DB_USER: YXBw
kind: Secret
metadata:
name: app-db
namespace: shop
type: Opaque
| Clave | Decodificado | Tamaño |
|---|---|---|
DATABASE_URL | postgres://app:s3cr3t-Pa55@db:5432/shop | 39 B |
DB_PASSWORD | s3cr3t-Pa55 más un salto de línea | 12 B |
DB_USER | app | 3 B |
La contraseña tiene 11 caracteres, pero el valor ocupa 12 bytes. Alguien la creó con echo 's3cr3t-Pa55' | base64, y el salto de línea final hará fallar el inicio de sesión en la base de datos. El Base64 sin el salto de línea sería czNjcjN0LVBhNTU=.
Qué reconoce el decodificador
- Certificados y claves PEM, como
tls.crtytls.keyen un Secretkubernetes.io/tls, se señalan. Los certificados reciben un enlace al decodificador de certificados para revisar la caducidad y los SAN. - Los valores JSON se muestran formateados.
- Los valores binarios, como un keystore de Java, muestran su tipo de archivo, una vista previa en hex y un botón Descargar.
- Los valores
.dockerconfigjsony.dockercfgse separan en registro, usuario y contraseña, conauthdecodificado. El decodificador de .dockerconfigjson los muestra en primer lugar.
Comandos de kubectl de una línea
Un valor. Escapa los puntos de los nombres de clave dentro de 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 los valores, con la función de plantilla base64decode integrada en kubectl o con 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)'
Crear un Secret sin caer en la trampa del salto de línea:
kubectl create secret generic app-db --from-literal=DB_PASSWORD='s3cr3t-Pa55' --dry-run=client -o yaml
Hay más recetas de shell en la página de Base64 en Bash.
Límites y problemas habituales
- «No se encontró ningún Secret con data o stringData»: probablemente lo pegado es un Deployment o un ConfigMap. Los valores de un ConfigMap son texto plano y no necesitan decodificarse.
- Tamaño: un Secret está limitado a 1 MiB en total. Crear Secret comprueba el límite, los nombres de las claves y el nombre de estilo DNS antes de que apliques nada.
- Funciones de YAML: el lector cubre lo que generan kubectl, Helm y Kustomize, incluidos los escalares de bloque y los documentos múltiples. No admite anclas, alias ni claves de fusión.
- Los Secrets de releases de Helm (
sh.helm.release.v1.*) contienen Base64 de datos gzip dentro del valordataen Base64. Decodifica aquí la capa exterior y luego usa el decodificador Base64 gzip.
Preguntas frecuentes
¿Cómo decodifico un secret de Kubernetes con kubectl?
Para una clave: kubectl get secret app-db -o jsonpath='{.data.DB_PASSWORD}' | base64 --decode. Para todas a la vez, pega aquí la salida de -o yaml, o usa los comandos de una línea con go-template o jq de esta página.
¿Los Secrets de Kubernetes están cifrados?
El campo data es solo Base64, y cualquiera con permiso de lectura puede revertirlo. El cifrado en reposo en etcd es un ajuste aparte del clúster, y RBAC decide quién puede leer los Secrets. Consulta codificación frente a cifrado.
¿Por qué mi secret decodificado tiene un salto de línea al final?
El valor se creó con echo en lugar de echo -n, así que el salto de línea también se codificó. Su Base64 suele terminar entonces en K, o= o Cg==. Vuelve a crearlo con printf '%s' value | base64 o con kubectl create secret --from-literal.
¿Qué diferencia hay entre data y stringData?
data contiene valores en Base64; stringData acepta texto plano que el servidor de la API codifica por ti al escribir. Las lecturas siempre devuelven data. El panel de salida de esta página reescribe el Secret con stringData para que puedas editarlo y volver a aplicarlo.