Gestión de secretos en producción: claves y variables

Guía práctica para gestionar claves y variables de entorno en producción, asegurando secretos sin exponer datos sensibles.

Cuando trabajamos en producción, uno de los errores más comunes es hardcodear contraseñas, claves de API o tokens directamente en el código. Esto no solo es una mala práctica de seguridad, sino que convierte el mantenimiento en una pesadilla. La gestión de secretos y variables de entorno es la solución que todo administrador de sistemas debe dominar para mantener aplicaciones seguras, portables y fáciles de auditar.

Variables de entorno: el primer paso, pero no el definitivo

Las variables de entorno son la forma más básica y universal de separar configuración del código. En Linux, se definen en el shell o mediante archivos como .env. Un ejemplo típico:

export DB_PASSWORD="supersecreto123"
export API_KEY="abc123def456"

En aplicaciones Node.js o Python, se cargan con librerías como dotenv o python-dotenv. Pero en producción, depender solo de variables de entorno tiene un problema crítico: cualquier proceso que acceda a /proc o ejecute ps aux puede verlas. Además, si alguien obtiene acceso al servidor, tiene todas las claves.

Consejo práctico: nunca guardes archivos .env en repositorios Git. Añádelos a .gitignore y documenta las variables necesarias en un .env.example.

Almacenamiento seguro con herramientas dedicadas

Para producción real necesitas un gestor de secretos. Las opciones más sólidas son:

  • HashiCorp Vault: el estándar de la industria. Permite almacenar, rotar y auditar secretos. Se integra con LDAP, Kubernetes y AWS.
  • Bitwarden Secrets Manager: más ligero, ideal para equipos pequeños. Ofrece CLI y SDK.
  • SOPS (Secrets OPerationS): de Mozilla, cifra archivos YAML/JSON con AWS KMS, GCP KMS o PGP. Perfecto si quieres mantener secretos en Git pero cifrados.

Ejemplo con SOPS para cifrar un archivo .env:

# Cifrar con clave PGP
sops --encrypt --pgp FINGERPRINT .env > .env.encrypted

# Descifrar
sops --decrypt .env.encrypted > .env

Integración en el flujo de trabajo de producción

No basta con tener los secretos guardados; hay que inyectarlos correctamente en los servicios. Aquí van dos enfoques prácticos:

Con Docker Compose: define variables desde un archivo externo o directamente desde Vault.

services:
  app:
    image: mi-app
    secrets:
      - db_password
    environment:
      DB_PASSWORD_FILE: /run/secrets/db_password

secrets:
  db_password:
    file: ./secrets/db_password.txt

Con systemd: usa EnvironmentFile para cargar un archivo de variables, pero asegúrate de que los permisos sean 600 y propietario root.

[Service]
EnvironmentFile=/etc/secrets/app.env

Rotación y auditoría: no lo dejes para después

Los secretos deben rotarse periódicamente. Con Vault puedes configurar TTLs automáticos. Con SOPS, basta con regenerar el archivo cifrado. Además, registra quién accede a qué secreto. En Vault, los logs de auditoría son configurables; en Bitwarden, el historial de acceso está disponible en el panel.

Script básico para rotar una clave en Vault:

vault write -force secret/data/database
vault read -field=data secret/data/database

Conclusión

Gestionar secretos en producción no es un lujo, es una necesidad. Empieza con variables de entorno bien protegidas, pero evoluciona hacia herramientas como Vault o SOPS. Automatiza la rotación, limita el acceso y audita cada uso. Tu futuro yo (y tu equipo de seguridad) te lo agradecerán.