¿Por qué no debes poner credenciales en tu código? Variables de entorno al rescate - Episodio 24

variables-de-entorno

Por qué no debes poner las credenciales en tu código?

Sé que es obvio, pero importante que hablemos de ello

Cuando comencé a conectar la API con servicios externos como PostgreSQL, AWS S3 y JWT, surgió un problema de seguridad importante:

¿Dónde almacenar las credenciales de forma segura?

Índice
  1. 🚀 Protegiendo credenciales antes de que sea tarde 🔑 📅 Diario de un SaaS
  2. 🔍 ¿Por qué las credenciales en el código son un problema?
  3. 🛠️ Implementación de variables de entorno en Flask
    1. ✅ 1. Instalar python-dotenv para manejar variables de entorno
    2. ✅ 2. Crear un archivo .env para almacenar credenciales
    3. ✅ 3. Modificar app.py para cargar variables desde .env
  4. ❌ Errores encontrados y cómo los solucioné
    1. 🔴 KeyError: 'DB_HOST' al ejecutar Flask
    2. 🔴 Las credenciales seguían visibles en el repositorio
    3. 🔴 .env no cargaba en producción
  5. 💡 Aprendizajes del proceso
    1. 🔹 Nunca almacenes credenciales en el código
    2. 🔹 Los archivos .env deben ignorarse en Git
    3. 🔹 python-dotenv facilita la gestión de configuraciones
    4. 🔹 Siempre prueba en producción
  6. 🚀 Próximos pasos

🚀 Protegiendo credenciales antes de que sea tarde 🔑 📅 Diario de un SaaS

Al principio, las credenciales estaban directamente en el código dentro de app.py y en los archivos de configuración:

DB_HOST = "localhost"
DB_USER = "admin"
DB_PASSWORD = "supersecreta123"

¿El problema?

Si alguna vez subía este código a un repositorio público, cualquiera podría verlas y acceder a la base de datos. 🚨

Menuda imbecilidad la mía, no crees?

Para evitar esto, implementé variables de entorno (.env).

Así que en este post te cuento cómo lo hice y por qué nunca deberías poner credenciales en tu código. 🔒


🔍 ¿Por qué las credenciales en el código son un problema?

Poner credenciales en el código parece una solución rápida, pero trae varios riesgos:

🔴 Exposición accidental: Si subes el código a un repositorio público (GitHub, GitLab), las credenciales quedan expuestas.

🔴 Falta de flexibilidad: No puedes cambiar la configuración sin modificar el código.

🔴 Dificultad para escalar: En un equipo grande, compartir credenciales de forma segura se vuelve complicado.

🔴 Seguridad comprometida: Si alguien accede a tu código, puede conectarse a tu base de datos o servicios externos sin restricciones.

La solución es usar variables de entorno con archivos .env. 🔥

credenciales-en-variables-de-entorno


🛠️ Implementación de variables de entorno en Flask

✅ 1. Instalar python-dotenv para manejar variables de entorno

pip install python-dotenv

✅ 2. Crear un archivo .env para almacenar credenciales

En la raíz del proyecto, creé un archivo llamado .env y agregué las credenciales:

DB_HOST=localhost
DB_USER=admin
DB_PASSWORD=supersecreta123
AWS_ACCESS_KEY=MI_ACCESS_KEY
AWS_SECRET_KEY=MI_SECRET_KEY
JWT_SECRET=clave_ultra_segura

🔹 Este archivo no debe subirse a GitHub. Para evitarlo, agregamos .env al .gitignore:

echo ".env" >> .gitignore

✅ 3. Modificar app.py para cargar variables desde .env

En app.py, en lugar de poner las credenciales directamente, usé dotenv para cargarlas:

from dotenv import load_dotenv
import os

# Cargar variables de entorno
load_dotenv()

DB_HOST = os.getenv("DB_HOST")
DB_USER = os.getenv("DB_USER")
DB_PASSWORD = os.getenv("DB_PASSWORD")
AWS_ACCESS_KEY = os.getenv("AWS_ACCESS_KEY")
AWS_SECRET_KEY = os.getenv("AWS_SECRET_KEY")
JWT_SECRET = os.getenv("JWT_SECRET")

Ahora, el código nunca expone credenciales directamente, sino que las carga desde el archivo .env. 🔥


❌ Errores encontrados y cómo los solucioné

🔴 KeyError: 'DB_HOST' al ejecutar Flask

Solución:

  • Verificar que .env existe y está en la misma carpeta que app.py.
  • Asegurar que load_dotenv() se ejecuta antes de os.getenv().

🔴 Las credenciales seguían visibles en el repositorio

Solución:

  • Si .env ya se había subido a GitHub, eliminamos el archivo y lo volvimos a ignorar:
git rm --cached .env
git commit -m "Eliminando credenciales expuestas"

🔴 .env no cargaba en producción

Solución:

  • En servidores Linux, especificamos la ruta de .env en load_dotenv():
load_dotenv("/ruta/del/archivo/.env")

💡 Aprendizajes del proceso

🔹 Nunca almacenes credenciales en el código

No importa si tu repositorio es privado, siempre usa variables de entorno para proteger tus credenciales.

🔹 Los archivos .env deben ignorarse en Git

Si accidentalmente los subes, podrías exponer información sensible.

🔹 python-dotenv facilita la gestión de configuraciones

Cargar variables de entorno con dotenv hace que el código sea más limpio y fácil de escalar.

🔹 Siempre prueba en producción

Asegúrate de que el servidor pueda leer el archivo .env correctamente.


🚀 Próximos pasos

Con las credenciales protegidas, el siguiente paso es estructurar permisos en la API implementando roles en Flask. 🔒

➡️ ¿Usas variables de entorno en tu proyecto?

¿Cómo gestionas tus credenciales de forma segura?

Cuéntamelo en los comentarios.

 

Si quieres conocer otros artículos parecidos a ¿Por qué no debes poner credenciales en tu código? Variables de entorno al rescate - Episodio 24 puedes visitar la categoría Proyecto-IA.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir