| Versión | Soportada |
|---|---|
| main | ✅ |
| ramas feature/* | solo durante desarrollo activo |
No abras un issue público para reportar vulnerabilidades de seguridad — eso expone el problema antes de que podamos mitigarlo.
Envía un correo a blascooscar36@gmail.com con:
- Descripción del problema y su impacto potencial
- Pasos para reproducirlo (cuanto más detallado, mejor)
- Versión o commit afectado
- Cualquier mitigación temporal que hayas identificado
Responderemos en un plazo máximo de 48 horas con la confirmación de recepción. Si la vulnerabilidad se confirma, publicaremos un parche y te acreditaremos en el changelog (salvo que prefieras permanecer anónimo).
Este proyecto aplica los siguientes principios desde el primer commit:
- Las claves de API (AEMET, etc.) y
FLASK_SECRET_KEYnunca se comitean al repositorio. - Se cargan exclusivamente desde variables de entorno via
python-dotenv. - El fichero
config/.envestá en.gitignore; solo se incluyeconfig/.env.examplecon valores vacíos.
- Todos los parámetros de las rutas API (
lat,lon,kwh) se validan comofloatantes de pasarse a los servicios. - Los datos procedentes de APIs externas (AEMET, PNOA, OMIE) se tratan como no confiables y se validan antes de persistirlos.
- Las dependencias se fijan con versiones exactas en
requirements.txt. - Solo se incluyen librerías con licencia compatible con Apache 2.0.
- El modo
DEBUGde Flask solo se activa siFLASK_DEBUG=1en el entorno. En producción nunca debe estar activo. - No se exponen rutas de administración ni endpoints de introspección en producción.
- Antes de enviar cualquier texto a un LLM externo,
anonymizer_service.pydetecta y sustituye entidades PII (CIF, NIF, IBAN, email, teléfono) usando Microsoft Presidio con fallback regex. - El informe de anonimización se incluye en la respuesta API (
entities_found,method) para trazabilidad completa.
- Si Ollama está disponible en
localhost:11434, el sistema lo usa por defecto — los datos nunca salen del servidor. - La cadena de proveedores es: Ollama → GROQ → fallback estructurado.
- El endpoint
GET /api/llm/healthexpone el proveedor activo en cada momento.
- Las contraseñas se almacenan como hash PBKDF2-SHA256 via
werkzeug.security.generate_password_hash. - Las sesiones usan la
FLASK_SECRET_KEYconfigurada en.env. - No se almacenan contraseñas en texto plano ni en logs.
- Cada recomendación generada por los agentes de IA registra la fuente de datos usada, la fecha de consulta y el margen de confianza, cumpliendo con el requisito de explicabilidad del hackathon.
| Dependencia | Política de seguridad |
|---|---|
| Flask | https://flask.palletsprojects.com/en/latest/security/ |
| SQLAlchemy | https://docs.sqlalchemy.org/en/latest/core/security.html |
| requests | https://requests.readthedocs.io/en/latest/community/vulnerabilities/ |
Si adaptas este proyecto para otra región, asegúrate de revisar:
- Las claves de API específicas de tu región (boletín oficial, datos climáticos)
- Los límites de rate-limiting de las APIs públicas que uses
- Que
FLASK_SECRET_KEYsea única por despliegue