7.7 KiB
7.7 KiB
Seguridad
Principios de Seguridad
DataTransferV2 maneja datos sensibles y requiere medidas de seguridad apropiadas para entornos de producción.
Gestión de Credenciales
Problema Actual
Las credenciales están hardcodeadas en archivos de configuración:
# App/Config/GeneralConfig.py
USERNAME = "usuario_db"
PASSWORD = "password_db"
SHAREPOINT_CLIENT_ID = "client_id"
Soluciones Recomendadas
1. Variables de Entorno
# Archivo .env
DB_USER=usuario_seguro
DB_PASSWORD=password_seguro
SHAREPOINT_CLIENT_ID=client_id_seguro
FTP_PASSWORD=password_ftp_seguro
# En GeneralConfig.py
import os
USERNAME = os.getenv("DB_USER")
PASSWORD = os.getenv("DB_PASSWORD")
SHAREPOINT_CLIENT_ID = os.getenv("SHAREPOINT_CLIENT_ID")
2. Secrets Management
Azure Key Vault
from azure.keyvault.secrets import SecretClient
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()
client = SecretClient(vault_url="https://myvault.vault.azure.net/", credential=credential)
DB_PASSWORD = client.get_secret("db-password").value
AWS Secrets Manager
import boto3
client = boto3.client('secretsmanager')
response = client.get_secret_value(SecretId='prod/datatransfer/db')
credentials = json.loads(response['SecretString'])
DB_USER = credentials['username']
DB_PASSWORD = credentials['password']
HashiCorp Vault
import hvac
client = hvac.Client(url='https://vault.example.com:8200')
client.auth.approle.login(role_id='role_id', secret_id='secret_id')
DB_PASSWORD = client.read('secret/datatransfer/db')['data']['password']
Autenticación y Autorización
API Security
Implementar API Keys
from flask import request, abort
API_KEYS = os.getenv("API_KEYS", "").split(",")
def require_api_key(func):
@wraps(func)
def decorated(*args, **kwargs):
api_key = request.headers.get('X-API-Key')
if api_key not in API_KEYS:
abort(401, "Invalid API key")
return func(*args, **kwargs)
return decorated
@app.route('/api/download')
@require_api_key
def download_data():
# Endpoint protegido
JWT Tokens
from flask_jwt_extended import JWTManager, jwt_required
app.config['JWT_SECRET_KEY'] = os.getenv('JWT_SECRET_KEY')
jwt = JWTManager(app)
@app.route('/api/download')
@jwt_required()
def download_data():
# Requiere token JWT válido
UI Web Security
Autenticación de Usuario
from flask_login import LoginManager, login_required
login_manager = LoginManager()
login_manager.init_app(app)
@app.route('/etl')
@login_required
def etl_interface():
# Solo usuarios autenticados
Rate Limiting
from flask_limiter import Limiter
limiter = Limiter(app, key_func=lambda: request.remote_addr)
@app.route('/api/download')
@limiter.limit("10 per minute")
def download_data():
# Máximo 10 requests por minuto por IP
Encriptación de Datos
En Tránsito
HTTPS para API
from flask_sslify import SSLify
sslify = SSLify(app) # Fuerza HTTPS
Conexiones Encriptadas
- Base de Datos: Usar
encrypt=yesen connection string - FTP: Considerar FTPS (FTP over SSL)
- SFTP: Ya encriptado por defecto
- SharePoint: HTTPS obligatorio
En Reposo
Encriptar Archivos Excel
from openpyxl import Workbook
from openpyxl.styles import Protection
wb = Workbook()
ws = Protection.set_password('password_seguro')
wb.security = Protection(workbookPassword='password_seguro')
Encriptar Base de Datos
Configurar SQL Server con Transparent Data Encryption (TDE).
Control de Acceso
Principio de Menor Privilegio
Usuario de Base de Datos
-- Crear usuario con permisos mínimos
CREATE USER datatransfer_user WITH PASSWORD = 'password';
GRANT SELECT ON Cobertura TO datatransfer_user;
GRANT SELECT ON Checkout TO datatransfer_user;
-- Solo permisos de lectura
Usuario FTP
- Solo permisos de escritura en directorio específico
- No permisos de lectura/eliminación
Usuario SharePoint
- Acceso solo a document libraries específicas
- Permisos de Contributor (no Owner)
Network Security
Firewall Rules
# Solo permitir conexiones desde IPs específicas
ufw allow from 192.168.1.0/24 to any port 5000
ufw allow from 10.0.0.0/8 to any port 5000
ufw deny from 0.0.0.0/0 to any port 5000
VPC/Subnets
- Desplegar en red privada
- Usar NAT Gateway para acceso outbound
- Security Groups restrictivos
Auditoría y Monitoreo
Logging Seguro
# No loggear credenciales
logger.info(f"Connected to database: {db_config['server']}")
# ❌ MAL: logger.info(f"Connected with user: {USERNAME}")
# Sanitizar datos sensibles en logs
def sanitize_log(message):
# Remover passwords, tokens, etc.
return re.sub(r'password=\w+', 'password=***', message)
Monitoreo de Seguridad
Detección de Intrusiones
- Monitorear logs para patrones sospechosos
- Alertas en accesos desde IPs desconocidas
- Rate limiting para prevenir ataques de fuerza bruta
Vulnerability Scanning
# Escanear dependencias
safety check
pip-audit
# Escanear imagen Docker
docker scan datatransfer:latest
Backup y Recuperación
Estrategia de Backup
Configuración
# Backup de configs
tar -czf config_backup_$(date +%Y%m%d).tar.gz App/Config/
# Versionado en Git (sin secrets)
git add App/Config/
git commit -m "Config update"
Datos
- Reportes: Backup automático en storage redundante
- Logs: Rotación y compresión semanal
- Base de Datos: Backup SQL Server programado
Plan de Recuperación
Disaster Recovery
- Restaurar desde backup
- Reconfigurar credenciales
- Verificar integridad
- Reanudar operaciones
Business Continuity
- RTO (Recovery Time Objective): 4 horas
- RPO (Recovery Point Objective): 1 hora
- Multi-region: Despliegue en múltiples zonas
Cumplimiento
GDPR (Europa)
- Derecho al olvido: Capacidad de eliminar datos
- Consentimiento: Documentar uso de datos
- Auditoría: Logs de acceso a datos personales
SOX (EEUU)
- Controles internos: Validación de procesos ETL
- Auditoría financiera: Traceability de datos
- Integridad: Checks de validación de datos
ISO 27001
- Asset Management: Inventario de datos sensibles
- Access Control: Autenticación multifactor
- Incident Management: Procedimientos de respuesta
Mejores Prácticas
Desarrollo Seguro
- Code Reviews: Revisar código por seguridad
- Dependency Scanning: Verificar vulnerabilidades en paquetes
- Input Validation: Sanitizar todas las entradas
- Error Handling: No exponer información sensible en errores
Despliegue Seguro
- Imágenes Base: Usar imágenes oficiales y actualizadas
- Secrets: Nunca en código o imágenes
- Network: Principio de zero trust
- Monitoring: Alertas en tiempo real
Operaciones Seguras
- Access Management: Rotación regular de credenciales
- Backup Testing: Verificar restauración periódicamente
- Incident Response: Plan documentado y probado
- Training: Capacitación en seguridad para equipo
Checklist de Seguridad
Antes de Producción
- Credenciales en variables de entorno
- HTTPS configurado
- Autenticación implementada
- Rate limiting activo
- Logs sanitizados
- Backup funcionando
- Firewall configurado
- Dependencias actualizadas
Monitoreo Continuo
- Alertas de seguridad activas
- Logs revisados regularmente
- Vulnerabilidades escaneadas
- Accesos auditados
- Backups verificados