Files
2026-05-09 14:00:04 -04:00

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=yes en 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

  1. Restaurar desde backup
  2. Reconfigurar credenciales
  3. Verificar integridad
  4. 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

  1. Code Reviews: Revisar código por seguridad
  2. Dependency Scanning: Verificar vulnerabilidades en paquetes
  3. Input Validation: Sanitizar todas las entradas
  4. Error Handling: No exponer información sensible en errores

Despliegue Seguro

  1. Imágenes Base: Usar imágenes oficiales y actualizadas
  2. Secrets: Nunca en código o imágenes
  3. Network: Principio de zero trust
  4. Monitoring: Alertas en tiempo real

Operaciones Seguras

  1. Access Management: Rotación regular de credenciales
  2. Backup Testing: Verificar restauración periódicamente
  3. Incident Response: Plan documentado y probado
  4. 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