# RF-AUDIT-003: Eventos de Seguridad ## Identificacion | Campo | Valor | |-------|-------| | **ID** | RF-AUDIT-003 | | **Modulo** | MGN-007 Audit | | **Titulo** | Eventos de Seguridad | | **Prioridad** | P0 - Critica | | **Estado** | Draft | | **Fecha** | 2025-12-05 | --- ## Descripcion El sistema debe detectar, registrar y alertar sobre eventos de seguridad como intentos de acceso fallidos, cambios en permisos, accesos desde ubicaciones inusuales, y otros patrones sospechosos. --- ## Requisitos Funcionales ### RF-AUDIT-003.1: Estructura del Evento de Seguridad | Campo | Tipo | Descripcion | |-------|------|-------------| | id | UUID | Identificador unico | | tenant_id | UUID | Tenant (si aplica) | | user_id | UUID | Usuario afectado | | event_type | VARCHAR(50) | Tipo de evento | | severity | ENUM | low, medium, high, critical | | title | VARCHAR(255) | Titulo descriptivo | | description | TEXT | Descripcion detallada | | metadata | JSONB | Datos adicionales | | ip_address | INET | IP origen | | country_code | VARCHAR(2) | Pais | | is_resolved | BOOLEAN | Evento resuelto | | resolved_by | UUID | Usuario que resolvio | | resolved_at | TIMESTAMPTZ | Fecha resolucion | | created_at | TIMESTAMPTZ | Timestamp | ### RF-AUDIT-003.2: Tipos de Eventos de Seguridad ```typescript enum SecurityEventType { // Autenticacion LOGIN_FAILED = 'login_failed', LOGIN_BLOCKED = 'login_blocked', BRUTE_FORCE_DETECTED = 'brute_force_detected', PASSWORD_CHANGED = 'password_changed', PASSWORD_RESET_REQUESTED = 'password_reset_requested', // Sesiones SESSION_HIJACK_ATTEMPT = 'session_hijack_attempt', CONCURRENT_SESSION = 'concurrent_session', SESSION_FROM_NEW_LOCATION = 'session_from_new_location', SESSION_FROM_NEW_DEVICE = 'session_from_new_device', // Permisos PERMISSION_ESCALATION = 'permission_escalation', ROLE_CHANGED = 'role_changed', ADMIN_CREATED = 'admin_created', // Datos MASS_DELETE_ATTEMPT = 'mass_delete_attempt', DATA_EXPORT = 'data_export', SENSITIVE_DATA_ACCESS = 'sensitive_data_access', // Sistema API_KEY_CREATED = 'api_key_created', WEBHOOK_MODIFIED = 'webhook_modified', SETTINGS_CHANGED = 'settings_changed' } ``` ### RF-AUDIT-003.3: Severidad de Eventos | Severidad | Descripcion | Accion | |-----------|-------------|--------| | `low` | Informativo, sin accion requerida | Log only | | `medium` | Requiere revision | Notificar admin | | `high` | Accion requerida pronto | Notificar + alertar | | `critical` | Accion inmediata requerida | Bloquear + notificar | ### RF-AUDIT-003.4: Deteccion de Patrones El sistema detecta automaticamente: ```typescript interface SecurityPattern { // Brute force maxLoginAttempts: 5; windowMinutes: 15; lockoutMinutes: 30; // Ubicacion flagNewCountry: true; flagNewCity: true; // Comportamiento flagMassDelete: { threshold: 10, windowMinutes: 5 }; flagMassExport: { threshold: 1000, windowMinutes: 60 }; // Horario flagOutOfHours: { start: '22:00', end: '06:00' }; } ``` ### RF-AUDIT-003.5: Alertas Automaticas Cuando se detecta un evento critico: 1. Registrar en base de datos 2. Enviar notificacion a admins 3. Opcionalmente bloquear accion 4. Crear tarea de seguimiento ```typescript interface SecurityAlert { eventId: UUID; sentTo: UUID[]; // Admins channels: ('email' | 'push' | 'slack')[]; sentAt: TIMESTAMPTZ; acknowledged: boolean; acknowledgedBy?: UUID; } ``` ### RF-AUDIT-003.6: Resolucion de Eventos Un admin puede marcar un evento como resuelto: ```typescript POST /api/v1/audit/security/:eventId/resolve { "resolution": "verified_legitimate", // o "blocked_user", "reset_password", etc. "notes": "Usuario verificado por telefono" } ``` --- ## Operaciones ### Listar Eventos de Seguridad ```typescript GET /api/v1/audit/security?severity=high&isResolved=false Response: { "data": [ { "id": "uuid", "eventType": "brute_force_detected", "severity": "high", "title": "Multiples intentos de login fallidos", "user": { "id": "...", "email": "user@example.com" }, "ipAddress": "192.168.1.100", "countryCode": "MX", "isResolved": false, "createdAt": "2025-12-05T10:00:00Z" } ] } ``` ### Obtener Detalle de Evento ```typescript GET /api/v1/audit/security/:eventId Response: { "id": "uuid", "eventType": "brute_force_detected", "severity": "high", "title": "Multiples intentos de login fallidos", "description": "Se detectaron 5 intentos fallidos en 10 minutos", "metadata": { "attempts": 5, "windowMinutes": 10, "lastAttemptAt": "2025-12-05T09:55:00Z" }, "relatedEvents": [...] } ``` ### Dashboard de Seguridad ```typescript GET /api/v1/audit/security/dashboard Response: { "summary": { "critical": 0, "high": 2, "medium": 5, "low": 20, "unresolvedCount": 7 }, "recentEvents": [...], "topAffectedUsers": [...], "topSourceIPs": [...] } ``` --- ## Reglas de Negocio | ID | Regla | Severidad | |----|-------|-----------| | BR-001 | Eventos criticos notifican inmediatamente | Critical | | BR-002 | Brute force bloquea cuenta temporalmente | Security | | BR-003 | Login desde nuevo pais requiere verificacion | Security | | BR-004 | Solo admins ven eventos de seguridad | Security | | BR-005 | Eventos no se pueden eliminar | Compliance | --- ## Criterios de Aceptacion - [ ] Deteccion automatica de patrones sospechosos - [ ] Clasificacion por severidad - [ ] Alertas en tiempo real - [ ] Dashboard de seguridad - [ ] Flujo de resolucion de eventos - [ ] Historial de eventos por usuario - [ ] Integracion con bloqueo de cuentas --- ## Historial | Version | Fecha | Autor | Cambios | |---------|-------|-------|---------| | 1.0 | 2025-12-05 | Requirements-Analyst | Creacion inicial |