ConfigMaps y Secrets: Configuración y datos sensibles
Clase 8 de 24 • Curso de Kubernetes
Resumen
Los Config Maps y Secrets son fundamentales para proteger la configuración de tus aplicaciones en Kubernetes. No implementarlos adecuadamente podría exponer información sensible y comprometer la seguridad de tus despliegues. Estos dos recursos permiten separar la configuración del código, siguiendo las mejores prácticas de desarrollo moderno, y agregan capas adicionales de seguridad que todo administrador de sistemas debe conocer.
¿Qué son los ConfigMaps y Secrets en Kubernetes?
Los ConfigMaps y Secrets son objetos de Kubernetes que permiten almacenar información de configuración separada del código de la aplicación. Sin embargo, tienen propósitos diferentes y niveles de seguridad distintos.
Los ConfigMaps están diseñados para almacenar datos de configuración no sensibles en formato de pares clave-valor. Estos datos se almacenan en texto plano y son fácilmente accesibles. Por otro lado, los Secrets están diseñados específicamente para almacenar información confidencial como contraseñas, tokens OAuth, claves SSH y otros datos sensibles que no deberían estar expuestos.
Para experimentar con estos objetos, podemos utilizar los archivos proporcionados en la carpeta 08-configs-secrets
de nuestro proyecto:
- Un archivo para crear un ConfigMap
- Un archivo para crear un Secret
- Un archivo README.md con instrucciones y comandos
¿Cómo crear y gestionar ConfigMaps?
Para crear un ConfigMap declarativamente, primero necesitamos revisar la estructura del archivo. En el ejemplo autconfig.yaml
, encontramos:
apiVersion: v1
kind: ConfigMap
metadata:
name: autconfig
data:
api_url: "https://api.example.com"
Este archivo define un objeto de tipo ConfigMap llamado "autconfig" que contiene una URL como dato de configuración. Para aplicarlo en nuestro clúster, ejecutamos:
kubectl apply -f autconfig.yaml
Una vez creado, podemos verificar su existencia y contenido con los siguientes comandos:
kubectl get configmap
kubectl describe configmap autconfig
El comando describe
nos mostrará el valor en texto plano, confirmando que los ConfigMaps almacenan información sin encriptar. Esto es adecuado para valores como:
- Entornos de ejecución (desarrollo, staging, producción)
- URLs de servicios externos no sensibles
- Niveles de log (debug, info, error)
Un buen ejercicio es crear un ConfigMap con diferentes tipos de variables como strings, enteros u otros tipos para configurar tu aplicación.
¿Cómo implementar Secrets para información sensible?
A diferencia de los ConfigMaps, los Secrets agregan una capa adicional de seguridad al codificar los valores en base64. Para crear un Secret imperativamente desde la línea de comandos:
kubectl create secret generic autsecret --from-literal=client_id=myclientid --from-literal=client_secret=secret
Este comando crea un Secret llamado "autsecret" con dos valores: client_id y client_secret. Aunque pasamos estos valores en texto plano desde la consola (lo cual no es una buena práctica en producción), Kubernetes los almacenará codificados.
Para verificar la creación del Secret:
kubectl get secret
kubectl describe secret autsecret
El comando describe
mostrará que tenemos información de tipo "Opaque" y nos indicará el tamaño en bytes de cada valor, pero no mostrará directamente los datos. Para ver o editar estos valores:
kubectl edit secret autsecret
Este comando abrirá un editor donde veremos los valores codificados en base64. Si necesitamos decodificar estos valores, podemos utilizar herramientas online o el comando base64 en la terminal.
Es importante destacar que aunque los Secrets codifican los datos en base64, esto no proporciona encriptación real, sino solo ofuscación. Para entornos con mayores requisitos de seguridad, es recomendable considerar soluciones como:
- HashiCorp Vault
- External Secrets con AWS Secrets Manager
Mejores prácticas para la gestión de configuraciones y secretos
La implementación adecuada de ConfigMaps y Secrets ofrece varios beneficios para la arquitectura y seguridad de tus aplicaciones:
-
Desacoplamiento de configuraciones: Permite separar completamente la configuración del código de la aplicación, facilitando el mantenimiento y los cambios.
-
Soporte para múltiples entornos: Puedes crear diferentes ConfigMaps para cada entorno (desarrollo, testing, producción) sin cambiar el código.
-
Rotación de secretos: Los Secrets pueden ser actualizados y rotados regularmente sin necesidad de reconstruir y redesplegar las aplicaciones.
-
Control de acceso granular: Kubernetes permite definir políticas de acceso para determinar qué usuarios o aplicaciones pueden acceder a qué secretos.
-
Integración con soluciones externas: Para mayor seguridad, puedes integrar soluciones como HashiCorp Vault o AWS Secrets Manager a través de External Secrets.
¿Cuándo usar cada tipo de objeto?
-
ConfigMaps: Para datos de configuración no sensibles que pueden estar en texto plano
- Variables de entorno
- URLs no confidenciales
- Configuración de logging
- Parámetros de aplicación
-
Secrets: Exclusivamente para información sensible
- API keys
- Passwords
- Tokens de autenticación
- Certificados SSL
El siguiente paso en nuestro aprendizaje será descubrir cómo integrar estos ConfigMaps y Secrets con nuestros Pods y Deployments para que nuestras aplicaciones puedan utilizar estas configuraciones. Esto implica entender cómo montar estos recursos como variables de entorno o como volúmenes dentro de los contenedores.
La gestión adecuada de configuraciones y secretos es fundamental para mantener aplicaciones seguras y fáciles de mantener en Kubernetes. Te animamos a experimentar creando tus propios ConfigMaps y Secrets, integrándolos en tus aplicaciones, y explorando soluciones más avanzadas para entornos de producción con altos requisitos de seguridad.