Files
TransferData-main/Documentacion/Seguridad.md
T
2026-05-09 14:00:04 -04:00

356 lines
7.7 KiB
Markdown

# 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:**
```python
# App/Config/GeneralConfig.py
USERNAME = "usuario_db"
PASSWORD = "password_db"
SHAREPOINT_CLIENT_ID = "client_id"
```
### Soluciones Recomendadas
#### 1. Variables de Entorno
```bash
# Archivo .env
DB_USER=usuario_seguro
DB_PASSWORD=password_seguro
SHAREPOINT_CLIENT_ID=client_id_seguro
FTP_PASSWORD=password_ftp_seguro
```
```python
# 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
```python
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
```python
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
```python
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
```python
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
```python
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
```python
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
```python
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
```python
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
```python
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
```sql
-- 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
```bash
# 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
```python
# 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
```bash
# Escanear dependencias
safety check
pip-audit
# Escanear imagen Docker
docker scan datatransfer:latest
```
## Backup y Recuperación
### Estrategia de Backup
#### Configuración
```bash
# 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