Ir al contenido principal

Gestionando Problemas con Variables de Entorno y Secrets en Kubernetes: Decodificación Base64 y Hashes MD5

                                   

  En Kubernetes, los Secrets son una herramienta esencial para gestionar información sensible. Sin embargo, un problema común ocurre al pasar un valor en formato Base64 como una variable de entorno en un Pod. Kubernetes decodifica automáticamente los Secrets almacenados en Base64, lo que puede cambiar su representación y causar discrepancias, especialmente si se está utilizando un hash MD5 para validar la integridad del valor.

En este artículo educativo, exploraremos este problema con ejemplos prácticos y presentaremos soluciones para evitar confusiones al usar Secrets en Pods.


Clase práctica.

El problema; Decodificación Automática de Secrets.

Cuando creamos un Secret en Kubernetes, los valores son almacenados en formato Base64. Si utilizamos el Secret como una variable de entorno en un Pod, Kubernetes lo decodifica automáticamente antes de exponerlo al contenedor. Esto puede llevar a:

  1. Diferencias en la Representación del Valor: El valor almacenado en el Secret está codificado en Base64, pero el contenedor recibe el valor decodificado.
  2. Discrepancias en el Hash MD5: Si estás utilizando un hash MD5 para verificar el valor, es posible que no coincida debido a que Kubernetes pasa el valor decodificado al contenedor.

Ejemplo Práctico

Supongamos que generamos una clave AES-256 y queremos almacenarla como un Secret en Kubernetes:

1. Generar la Clave AES-256

Usamos el siguiente comando para generar la clave:


openssl rand -hex 32

Salida (ejemplo):


80a3284a8461ac72b8558f5d913b0e60e9c46f1ffe2cfbf645c16a312552e211

2. Crear el Secret con el Valor Codificado en Base64

Convertimos el valor en Base64:


echo -n "80a3284a8461ac72b8558f5d913b0e60e9c46f1ffe2cfbf645c16a312552e211" | base64

Salida:


ODBhMzI4Mjg0YTg0NjYxYWM3MmI4NTU1OGY1ZDkxM2IwZTYwZTljNDZmMWZmZTJjZmJmNjQ1YzE2YTMxMjU1MmUyMTE=

Creamos el archivo YAML del Secret:


apiVersion: v1 kind: Secret metadata: name: aes-key-secret type: Opaque data: aes-key: ODBhMzI4Mjg0YTg0NjYxYWM3MmI4NTU1OGY1ZDkxM2IwZTYwZTljNDZmMWZmZTJjZmJmNjQ1YzE2YTMxMjU1MmUyMTE=

Aplicamos el Secret:


kubectl apply -f aes-key-secret.yaml

3. Usar el Secret en un Pod

Ahora creamos un Pod que utiliza el Secret como una variable de entorno:


apiVersion: v1 kind: Pod metadata: name: print-secret-pod spec: containers: - name: print-secret image: alpine command: ["/bin/sh", "-c", "echo $AES_KEY | md5sum"] env: - name: AES_KEY valueFrom: secretKeyRef: name: aes-key-secret key: aes-key restartPolicy: Never

Aplicamos el Pod:


kubectl apply -f print-secret-pod.yaml

4. Ver los Logs del Pod

Verificamos los logs para ver el hash MD5 calculado:


kubectl logs print-secret-pod

Problema observado: El hash MD5 mostrado en los logs no coincide con el hash calculado previamente para el valor codificado en Base64. Esto ocurre porque Kubernetes ha decodificado automáticamente el valor antes de pasarlo al Pod.

Solución: Asegurar el Formato del Valor

Para evitar problemas, es crucial garantizar que el valor del Secret esté en el formato esperado dentro del Pod. Hay varias formas de lograrlo:

Solución 1: Almacenar el Valor sin Codificar en Base64

Si no necesitas que el valor esté en Base64 dentro del Pod, almacénalo directamente en el Secret sin codificar. Por ejemplo:


apiVersion: v1 kind: Secret metadata: name: aes-key-plain type: Opaque stringData: aes-key: 80a3284a8461ac72b8558f5d913b0e60e9c46f1ffe2cfbf645c16a312552e211

Usa stringData en lugar de data para evitar la codificación en Base64.

Cuando pases este Secret al Pod, el valor estará en el formato esperado, y el hash MD5 coincidirá.

Solución 2: Decodificar el Valor Dentro del Contenedor

Si necesitas trabajar con el valor codificado en Base64 dentro del Pod, puedes decodificarlo manualmente en el contenedor. Por ejemplo, actualiza el comando del Pod para manejar la decodificación:


apiVersion: v1 kind: Pod metadata: name: decode-secret-pod spec: containers: - name: decode-secret image: alpine command: ["/bin/sh", "-c", "echo $AES_KEY | base64 -d | md5sum"] env: - name: AES_KEY valueFrom: secretKeyRef: name: aes-key-secret key: aes-key restartPolicy: Never

En este caso, el valor se decodifica dentro del contenedor antes de calcular el hash MD5.

Solución 3: Almacenar el Hash MD5 Precalculado

Si necesitas validar la integridad del valor en el Pod, una alternativa es almacenar el hash MD5 junto con el valor original en el Secret. Por ejemplo:


apiVersion: v1 kind: Secret metadata: name: aes-key-with-md5 type: Opaque data: aes-key: ODBhMzI4Mjg0YTg0NjYxYWM3MmI4NTU1OGY1ZDkxM2IwZTYwZTljNDZmMWZmZTJjZmJmNjQ1YzE2YTMxMjU1MmUyMTE= aes-key-md5: OWZmODQ3ZGEyZmVmYzg5NzRjZjA2ODc1

En el Pod, puedes comparar el hash MD5 almacenado con el calculado.

Consideraciones Adicionales

  1. Evitar Confusiones: Asegúrate de entender cómo Kubernetes maneja los Secrets y cómo los pasa al Pod. Saber que Kubernetes decodifica automáticamente los valores te ayudará a evitar problemas.

  2. Pruebas: Siempre prueba tus Secrets y Pods antes de usarlos en producción. Usa el comando kubectl logs para verificar los valores y hashes.

  3. Seguridad: Recuerda que los Secrets en Kubernetes no están cifrados por defecto. Usa soluciones adicionales como Helm Secrets o herramientas de gestión de secretos en la nube para proteger la información sensible.


Comentarios

Entradas populares de este blog

Autenticación y Autorización (Kubernetes).

La autenticación en Kubernetes es un aspecto crítico para la seguridad y control de acceso dentro de un clúster. Kubernetes proporciona varios mecanismos de autenticación para usuarios y cuentas de servicio, que deben pasar a través del API Server para realizar cualquier operación. En este artículo, revisaremos cómo funciona la autenticación y cómo puedes usar herramientas como kubectl y curl para interactuar de manera segura con el clúster. En primer lugar, ¿Qué es la autenticación y la autorización? •     Autenticación:  Es el proceso de verificar quién es un usuario. Responde a la pregunta "¿Quién eres?". •     Autorización: El proceso de determinar qué acciones puede realizar un usuario autenticado. Responde a la pregunta "¿Qué puedes hacer?". Primer paso: Autenticación. La autenticación en Kubernetes es el proceso mediante el cual el sistema verifica la identidad de los usuarios y cuentas de servicio que intentan acceder al clúster.  ...

TLS Bootstrapping en Kubernetes: Qué es, cómo funciona y por qué importa en el examen CKA

                                                       Uno de los conceptos que a menudo pasan desapercibidos en la administración de Kubernetes —pero que resultan clave tanto en entornos reales como en el examen CKA— es el TLS Bootstrapping . En este artículo entenderás qué es, cómo funciona, qué lo diferencia del kubeadm join tradicional y cómo puede aparecer en el examen. ¿Qué es TLS Bootstrapping? TLS Bootstrapping es el proceso por el cual el kubelet , el agente que corre en cada nodo, obtiene automáticamente un certificado TLS firmado por el clúster para autenticarse con el kube-apiserver . En otras palabras: permite que un nuevo nodo se una de forma segura al clúster sin necesidad de copiar manualmente los certificados. ¿Por qué es necesario? Cuando añades un nuevo nodo worker, su kubelet necesita autentic...

Tip 1. Exámen CKA. Economiza y optimiza tu tiempo; Usa --help con el paginador Less en la ayuda.

📘 Domina los comandos --help y el uso de less en el examen CKA Durante el examen CKA (Certified Kubernetes Administrator) , uno de los recursos más potentes y completamente permitidos es el uso del --help en los comandos de Kubernetes. Además, puedes combinarlo con el paginador less para buscar y navegar fácilmente entre opciones. ✅ ¿Está permitido usar --help ? Sí, está 100% permitido . Puedes usar el --help de cualquier comando disponible en el entorno del examen: kubectl --help kubeadm init --help kubelet --help kubectl explain pod.spec.containers Estos comandos muestran la ayuda y las opciones disponibles directamente desde el sistema, sin necesidad de ir a la documentación. 🔍 ¿Cómo usar less para buscar rápidamente? Cuando la salida del comando es larga, puedes usar | less para verla de forma paginada y navegar más cómodamente. kubeadm init --help | less Una vez dentro de less , puedes buscar cualquier texto escribiendo /texto . Por ejemplo: /pod-networ...