Saltar al contenido principal

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ónProtocoloDetalle
Usuario ↔ Web AppHTTPS (TLS 1.2+)Certificado gestionado por Azure
Web App ↔ WorkerHTTP internoRed privada Azure (no expuesto a internet)
Web App ↔ SQL ServerTDS + TLSConexión cifrada obligatoria
Web App ↔ Blob StorageHTTPSTLS 1.2 mínimo
info

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:

  1. Permisos (42 permisos nombrados): Controlan qué secciones y APIs puede usar el usuario
  2. Enrollment por Cliente: Supervisores y Ejecutivos solo ven datos de los clientes a los que están inscritos
  3. Rol del usuario: Determina permisos base (Admin ve todo, Ejecutivo acceso limitado)

Filtrado de Datos por Enrollment

RolAcceso a datos
AdminTodos los clientes, todas las cuentas
SupervisorSolo clientes inscritos vía CustomerEnrollments
EjecutivoSolo 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 usuarioNombres de deudores
Nombre de usuarioMontos de deuda
RolTeléfonos/direcciones
PermisosDatos financieros
Timestamps de sesiónInformació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íticaValor
Vigencia máxima60 días
Acción al expirarForzar cambio (bloquea acceso a todo hasta cambiar)
HistorialNo se permite reusar las últimas contraseñas

Protección contra Fuerza Bruta

MedidaConfiguración
Intentos antes de bloqueo5 intentos fallidos
Duración del bloqueo5 minutos automático
ResetLogin exitoso resetea el contador
tip

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:

  1. Se genera una SAS URL (Shared Access Signature) temporal
  2. La URL expira en 60 minutos
  3. Es de solo lectura
  4. Está ligada a un blob específico (no al container completo)
  5. Después de 90 días, el archivo se elimina automáticamente (lifecycle policy)

Minimización de Datos

Principios Aplicados

  1. Solo acceso necesario: Los Ejecutivos solo ven datos de cuentas que tienen asignadas
  2. Campos filtrados en APIs: Las APIs devuelven solo los campos requeridos para la operación
  3. Logs sin datos personales: Los logs de la aplicación no incluyen datos de deudores
  4. Exports con alcance limitado: Las exportaciones filtran por cliente y rango de fechas, no exportan toda la DB
  5. 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:

CampoDescripción
AccountIdCuenta afectada
FieldNameCampo modificado
OldValueValor anterior
NewValueValor nuevo
ChangedByUsuario que realizó el cambio
ChangedAtFecha/hora del cambio
ImportJobIdJob 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

  • LastAccessDate se actualiza en cada login exitoso
  • AccessFailedCount registra intentos fallidos
  • El proxy registra la actividad del usuario para control de inactividad

Resumen de Controles

AmenazaControl Implementado
Intercepción de datos en tránsitoHTTPS/TLS obligatorio
Acceso no autorizado a DBPermisos + enrollment + red privada
Robo de sesiónJWT HTTP-only + Secure + SameSite + timeout
Fuerza bruta de contraseñaBloqueo automático + rotación 60 días
Acceso a datos de otro clienteFiltrado por CustomerEnrollments
Datos expuestos en logsNo se loguean datos personales
Archivos exportados accesiblesSAS URLs temporales (60 min) + eliminación 90 días
Modificación no rastreableAccountAuditHistory con campo-por-campo
Base de datos comprometidaTDE (cifrado en reposo)
Archivos comprometidosSSE Azure (AES-256)