Protección de Datos Personales
Visión General
LCS maneja datos personales sensibles de deudores (nombres, teléfonos, direcciones, información financiera). Esta sección documenta las medidas implementadas para proteger esa información.
Cifrado en Tránsito (HTTPS/TLS)
Toda la comunicación entre el navegador del usuario y la aplicación está cifrada:
| Conexión | Protocolo | Detalle |
|---|---|---|
| Usuario ↔ Web App | HTTPS (TLS 1.2+) | Certificado gestionado por Azure |
| Web App ↔ Worker | HTTP interno | Red privada Azure (no expuesto a internet) |
| Web App ↔ SQL Server | TDS + TLS | Conexión cifrada obligatoria |
| Web App ↔ Blob Storage | HTTPS | TLS 1.2 mínimo |
El custom domain admin.recuperacionintegral.com utiliza certificados TLS gestionados automáticamente por Azure Container Apps. No se permite tráfico HTTP sin cifrar.
Cifrado en Reposo
Base de Datos — Transparent Data Encryption (TDE)
Azure SQL Server cifra automáticamente todos los datos almacenados:
- TDE (Transparent Data Encryption) habilitado por defecto en Azure SQL
- Cifra datos, logs de transacciones y backups
- Llave maestra gestionada por Azure (service-managed key)
- Sin impacto en performance ni cambios en la aplicación
Almacenamiento — Azure Blob Encryption
Los archivos importados y exportados están cifrados en reposo:
- SSE (Storage Service Encryption) con claves Microsoft-managed
- Todos los blobs cifrados con AES-256
- Archivos de exportación tienen retención de 90 días antes de eliminación automática
Control de Acceso
Sistema de Permisos Granular
Tres capas de protección:
- Permisos (42 permisos nombrados): Controlan qué secciones y APIs puede usar el usuario
- Enrollment por Cliente: Supervisores y Ejecutivos solo ven datos de los clientes a los que están inscritos
- Rol del usuario: Determina permisos base (Admin ve todo, Ejecutivo acceso limitado)
Filtrado de Datos por Enrollment
| Rol | Acceso a datos |
|---|---|
| Admin | Todos los clientes, todas las cuentas |
| Supervisor | Solo clientes inscritos vía CustomerEnrollments |
| Ejecutivo | Solo clientes inscritos vía CustomerEnrollments |
Esto garantiza que un Ejecutivo de la cartera "Sears" no pueda ver ni consultar datos de la cartera "Cetelem", incluso si tiene los permisos de página/API necesarios.
Tokens JWT — Sin Datos Sensibles
El token JWT que maneja la sesión del usuario no contiene datos personales de deudores:
| Lo que contiene ✅ | Lo que NO contiene ❌ |
|---|---|
| ID del usuario | Nombres de deudores |
| Nombre de usuario | Montos de deuda |
| Rol | Teléfonos/direcciones |
| Permisos | Datos financieros |
| Timestamps de sesión | Información bancaria |
Protecciones adicionales del token:
- Almacenado en cookie HTTP-only (no accesible por JavaScript)
- Flag Secure (solo transmitido por HTTPS)
- Flag SameSite: Strict (protección contra CSRF)
- Firmado con HMAC-SHA256 (no puede ser modificado)
- Vida corta — expira por inactividad (30 min) o máximo absoluto (8 horas)
Seguridad de Contraseñas
Hashing
- Las contraseñas se almacenan hasheadas con el algoritmo compatible con ASP.NET Identity
- Nunca se almacenan en texto plano
- No es posible recuperar la contraseña original desde el hash
Rotación Obligatoria
| Política | Valor |
|---|---|
| Vigencia máxima | 60 días |
| Acción al expirar | Forzar cambio (bloquea acceso a todo hasta cambiar) |
| Historial | No se permite reusar las últimas contraseñas |
Protección contra Fuerza Bruta
| Medida | Configuración |
|---|---|
| Intentos antes de bloqueo | 5 intentos fallidos |
| Duración del bloqueo | 5 minutos automático |
| Reset | Login exitoso resetea el contador |
El sistema registra los intentos fallidos (AccessFailedCount) y la fecha del último intento. Esto permite auditar intentos de acceso no autorizado.
Infraestructura Azure — Seguridad
Red Privada
- El Worker no tiene ingress externo — solo accesible desde la red interna
- Azure SQL acepta conexiones solo desde la Container Apps Environment
- Blob Storage protegido con SAS tokens temporales (60 min para downloads)
Managed Identities
Donde es posible, se utilizan Azure Managed Identities para evitar almacenar credenciales:
- Container Apps se autentican al Container Registry sin contraseñas
- Las connection strings sensibles se almacenan como Secrets en Container Apps
Archivos Temporales — SAS URLs
Cuando un usuario descarga un archivo exportado:
- Se genera una SAS URL (Shared Access Signature) temporal
- La URL expira en 60 minutos
- Es de solo lectura
- Está ligada a un blob específico (no al container completo)
- Después de 90 días, el archivo se elimina automáticamente (lifecycle policy)
Minimización de Datos
Principios Aplicados
- Solo acceso necesario: Los Ejecutivos solo ven datos de cuentas que tienen asignadas
- Campos filtrados en APIs: Las APIs devuelven solo los campos requeridos para la operación
- Logs sin datos personales: Los logs de la aplicación no incluyen datos de deudores
- Exports con alcance limitado: Las exportaciones filtran por cliente y rango de fechas, no exportan toda la DB
- Retención limitada: Los archivos exportados se eliminan automáticamente después de 90 días
Datos Mínimos en Sesión
El JWT contiene solo lo necesario para autenticación/autorización. Los datos de deudores se consultan bajo demanda y se filtran por enrollment.
Auditoría
Registro de Cambios
La tabla AccountAuditHistory registra cada modificación a datos de cuentas:
| Campo | Descripción |
|---|---|
| AccountId | Cuenta afectada |
| FieldName | Campo modificado |
| OldValue | Valor anterior |
| NewValue | Valor nuevo |
| ChangedBy | Usuario que realizó el cambio |
| ChangedAt | Fecha/hora del cambio |
| ImportJobId | Job de importación (si aplica) |
Registro de Importaciones
Cada importación queda registrada con:
- Quién la ejecutó
- Cuándo se ejecutó
- Cuántos registros se procesaron
- El archivo original (almacenado en Blob Storage)
Registro de Acceso
LastAccessDatese actualiza en cada login exitosoAccessFailedCountregistra intentos fallidos- El proxy registra la actividad del usuario para control de inactividad
Resumen de Controles
| Amenaza | Control Implementado |
|---|---|
| Intercepción de datos en tránsito | HTTPS/TLS obligatorio |
| Acceso no autorizado a DB | Permisos + enrollment + red privada |
| Robo de sesión | JWT HTTP-only + Secure + SameSite + timeout |
| Fuerza bruta de contraseña | Bloqueo automático + rotación 60 días |
| Acceso a datos de otro cliente | Filtrado por CustomerEnrollments |
| Datos expuestos en logs | No se loguean datos personales |
| Archivos exportados accesibles | SAS URLs temporales (60 min) + eliminación 90 días |
| Modificación no rastreable | AccountAuditHistory con campo-por-campo |
| Base de datos comprometida | TDE (cifrado en reposo) |
| Archivos comprometidos | SSE Azure (AES-256) |