# Seguridad y manejo de secretos ## No versionar secretos El repositorio incluye `.gitignore` para ignorar: - `.env` - `env/` (virtualenv) Recomendación: - Mantener **cualquier credencial** fuera del control de versiones. ## Dónde viven los secretos en este proyecto El código en `SaveUrl.py` toma secretos principalmente desde: - **Airflow Variables**: - SQL: `DB_MSSQ_USER`, `DB_MSSQ_PASSWORD`, `DB_MSSQ_SERVER` - FTP: `FTP_000oqta_USER`, `FTP_000oqta_PASSWORD`, `FTP_000oqta_SERVER` - Webhook: `WEBHOOK_URL_NOTIFICATION` - Kafka básico: `BOOTSTRAP_SERVERS_DOCKER`, `KAFKA_USE_SSL` - **Variables de entorno del proceso** (solo cuando `KAFKA_USE_SSL=True`): - `SECURITY_PROTOCOL`, `SASL_MECHANISM` - `SASL_PLAIN_USERNAME`, `SASL_PLAIN_PASSWORD` - `SSL_CAFILE`, `SSL_CHECK_HOSTNAME` Implicación: - Para Kafka con SSL/SASL, no basta con Airflow Variables: hay que configurar también **env vars** en el worker/scheduler (o usar un backend de secrets que las exponga como env vars). ## Recomendaciones de seguridad - **Airflow Secrets Backend**: usar un backend (Vault/AWS Secrets Manager/Azure Key Vault/GCP Secret Manager) en vez de Variables planas. - **Rotación**: - FTP y SQL: rotación periódica y seguimiento de expiración. - Kafka: rotación de credenciales SASL y CA si cambia. - **Principio de mínimo privilegio**: - SQL user: permisos mínimos necesarios sobre `URL_FTP` (SELECT/INSERT). - FTP user: permisos mínimos para listar/leer rutas necesarias (NLST). - **TLS**: - si se habilita SSL en Kafka, asegurar que `SSL_CAFILE` apunte a un CA dentro del contenedor. ## Señales de filtración / exposición Revisar que no exista: - `.env` real en el repo - credenciales hardcodeadas en archivos `.py` - rutas de certificados locales de un desarrollador (ej. paths absolutos de Windows) en configuración de producción ## Checklist antes de producción - Variables/secretos definidos en sistema seguro - `.env` excluido y no presente en artefactos de build - permisos SQL y FTP mínimos - endpoints (Kafka/webhook) accesibles solo desde redes necesarias