356 lines
7.7 KiB
Markdown
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 |