Almacenando Secrets en Kubernetes. Explicación detallada y buenas prácticas.


Crear y gestionar Secrets en Kubernetes es un aspecto fundamental cuando trabajamos con información sensible, como credenciales o claves de API. A continuación, explico cómo se puede crear un Secret y algunas prácticas importantes al respecto.

Ejemplo práctico

En este ejercicio práctico, vamos a trabajar con un objeto Secret en Kubernetes:

  1. Creación del Secret a partir de un manifiesto YAML: Lo primero que haremos será crear un Secret utilizando un manifiesto YAML. Este procedimiento es similar a lo que hemos hecho anteriormente para otros objetos como ConfigMaps. En este paso, también verificaremos el estado del Secret y cómo recuperarlo de Kubernetes. Esta verificación es útil si queremos revisar el estado actual del objeto para recrearlo o modificarlo más adelante. Durante este proceso, también decodificamos el payload que está codificado en base64, para ver los valores clave que almacena.

    Comando de creación de un Secret:

    kubectl create secret generic mysecret --from-literal=username=admin --from-literal=password=pass123

    Recuperación del Secret:

    kubectl get secret mysecret -o yaml

    Decodificación del Secret (su contenido está en base64):

    echo "YWRtaW4=" | base64 --decode
  2. Recuperar el manifiesto YAML de un Secret existente: A continuación, obtendremos el YAML del Secret almacenado en el clúster. Este paso es útil para ver de forma sencilla el estado actual del Secret y cómo los datos se almacenan en el clúster. Una advertencia clave en este paso es que, si un hacker obtiene acceso al kube-apiserver, podría extraer los Secrets del clúster, ya que están almacenados en etcd sin encriptación.

    Comando para ver el YAML del Secret:

    kubectl get secret mysecret -o yaml

    El Secret estará codificado en base64, por lo que, aunque esté "ofuscado", puede ser fácilmente decodificado si alguien tiene acceso no autorizado.

  3. Creación de un Secret desde cero: En este paso, vamos a crear un nuevo Secret escribiendo los pares clave-valor en base64, creando el manifiesto YAML y aplicándolo en el clúster a través de la línea de comandos. Este proceso es muy útil cuando trabajas con Secretos sensibles y prefieres crear el YAML manualmente para tener un control total sobre su contenido antes de implementarlo.

    Ejemplo de YAML para un Secret:

    apiVersion: v1 kind: Secret metadata: name: my-manual-secret data: username: YWRtaW4= # admin (codificado en base64) password: cGFzczEyMw== # pass123 (codificado en base64)

    Aplicar el Secret en el clúster:

    kubectl apply -f my-manual-secret.yaml

    Ahora puedes verificar que el Secret ha sido correctamente creado y almacenado en el clúster.

  4. Verificación de los Secrets: Finalmente, para verificar que el Secret ha sido creado y almacenado correctamente, puedes ejecutar los siguientes comandos:

    Para verificar su existencia:

    kubectl get secrets

    Para obtener más detalles:

    kubectl describe secret my-manual-secret

Seguridad y buenas prácticas con los Secrets

Los Secrets son una parte vital de cualquier entorno de producción de Kubernetes, y aunque su codificación en base64 agrega una capa de ofuscación, no se consideran seguros por sí solos. Aquí algunas recomendaciones para mejorar la seguridad de los Secrets:

  • Cifrado en reposo: Asegúrate de habilitar la encriptación de los Secrets en el almacenamiento de etcd para protegerlos de accesos no autorizados.
  • RBAC: Utiliza Control de Acceso Basado en Roles (RBAC) para limitar el acceso a los Secrets solo a aquellos usuarios o servicios que realmente lo necesiten.
  • Sistemas de gestión de Secrets externos: Considera la posibilidad de integrar Kubernetes con un gestor de Secrets externo, como HashiCorp Vault, que proporciona un nivel adicional de seguridad y control sobre los datos sensibles.

Comentarios