SURCO · 11-privacy-security.md · 13 de 22

En esta página 1. Contexto 0%

11 — Privacidad y seguridad — SURCO

1. Contexto

SURCO es un demo de portfolio / vertical slice de cuaderno de campo.
Trata datos de cuenta y notas operativas de finca. No es un producto certificado en producción, pero el diseño aplica controles mínimos serios (JWT, bcrypt, autorización por rol).

No se declara cumplimiento RGPD/LOPDGDD definitivo: en producción real se requieren política de privacidad, base legal documentada y, si hay encargados, DPA.

2. Datos tratados

DatoCategoríaFinalidadSensibilidad
emailIdentificador cuentaLoginPersonal
passwordHashCredencialAuth (nunca password en claro)Crítico
nameIdentidadUI personalizadaPersonal
roleAutorizaciónPermisosOperativo
parcel name, crop, haDatos explotaciónContexto de tareaOperativo
task title, notes, dueAt, status, codeOperativaCuadernoOperativo (notes = texto libre)
technicianId / farmerIdRelacionalAsignaciónOperativo

No se tratan en v1: ubicación GPS, biometría, datos de salud personal, pagos, documentos de identidad, geolocalización de parcelas.

3. Base legítima (modelo producto real)

Si SURCO fuera producción en UE:

TratamientoBase (orientativa)
Cuenta de usuarioEjecución de contrato / medidas precontractuales
Logs técnicosInterés legítimo seguridad
Notas de parcelaEjecución del servicio

Demo: datos seed ficticios; no usar emails reales de terceros sin consentimiento.

4. Controles de seguridad

ControlImplementación v1
Hash de contraseñabcrypt (seed cost 10)
TransporteHTTPS en deploy; HTTP local dev
AuthNJWT firmado (HS256) con secret de entorno
AuthZJwtAuthGuard + checks farmer/technician + FARMER-only create
Validación entradaclass-validator DTOs
Enum statusSolo valores TaskStatus
Secretos.env / Neon URL fuera de git
MinimizaciónSin campos PII extra; sin GPS ni fotos

Matriz de autorización (resumen)

AcciónFARMERTECHNICIAN
Login
List own✓ asignadas
Create✗ 403
Get if party
Patch status if party✓ (subconjunto ACTIVE/DONE/CANCELLED)

5. Amenazas y mitigaciones

AmenazaRiesgoMitigación
Credenciales demo públicasAlto en prod realSolo demo; rotar en prod
JWT robado (XSS)MedioNo guardar datos sensibles extra; CSP futuro; HttpOnly cookie posible evolución
IDOR task idAlto sin checksget/update validan ownership
Enumeración de emails técnicoBajo404 “Técnico no encontrado”
Fuerza bruta loginMedioRate limit futuro (no v1)
SQL injectionBajoPrisma parametrizado
Logs con passwordsAltoNo loguear body de login

6. Retención y borrado (modelo / hipótesis de producto)

DatoRetención demoProducción sugerida
Users seedMientras exista DB demoMientras cuenta activa
TasksHasta delete manual / seed resetp. ej. 24 meses post-cierre (propuesta)
Logs de accesoN/A v190 días (propuesta)
JWTExpiración secret-dependentTTL corto + refresh

v1 no expone endpoint de borrado de cuenta (fuera de alcance).

7. Cookies y tracking

  • Auth en localStorage (token), no cookie de sesión.
  • Sin banners de analytics de terceros en v1.
  • Si se añade analytics (doc 12), minimización IP y consentimiento según base legal.

8. Roles y principio de mínimo privilegio

  • TECHNICIAN no crea tareas ni ve tareas de otros farmers no asignadas.
  • No hay rol ADMIN en v1 (reduce superficie).
  • Parcelas solo del farmer propietario.
  • Email de técnico opcional en create: único PII de “tercero” ligero en el flujo.

9. Incidentes (proceso demo)

  1. Rotar JWT_SECRET y forzar re-login.
  2. Reset seed / rotar passwords demo.
  3. Revisar logs Nest y Neon.
  4. Notificar usuarios afectados si hubiera PII real.
  5. Documentar en memory si afecta al caso.

10. Criterios de aceptación seguridad

  1. Password no se almacena en claro.
  2. /api/tasks sin Bearer → 401.
  3. TECHNICIAN POST /api/tasks → 403.
  4. TECHNICIAN GET tarea de otro → 403.
  5. .env con DATABASE_URL no versionado en repo público (revisar .gitignore).
  6. No se loguean contraseñas ni tokens completos en cliente.