# RF-AUDIT-002: Logs de Acceso

## Identificacion

| Campo | Valor |
|-------|-------|
| **ID** | RF-AUDIT-002 |
| **Modulo** | MGN-007 Audit |
| **Titulo** | Logs de Acceso |
| **Prioridad** | P0 - Critica |
| **Estado** | Draft |
| **Fecha** | 2025-12-05 |

---

## Descripcion

El sistema debe registrar todos los accesos a recursos protegidos, incluyendo peticiones HTTP, accesos a APIs, y consultas a datos sensibles, para monitoreo de seguridad y cumplimiento normativo.

---

## Requisitos Funcionales

### RF-AUDIT-002.1: Estructura del Log de Acceso

| Campo | Tipo | Descripcion |
|-------|------|-------------|
| id | UUID | Identificador unico |
| tenant_id | UUID | Tenant (si aplica) |
| user_id | UUID | Usuario (si autenticado) |
| session_id | UUID | ID de sesion |
| request_id | UUID | ID unico de la peticion |
| method | VARCHAR(10) | GET, POST, PUT, DELETE |
| path | VARCHAR(500) | Ruta del recurso |
| query_params | JSONB | Parametros de query |
| status_code | INTEGER | Codigo de respuesta HTTP |
| response_time_ms | INTEGER | Tiempo de respuesta |
| ip_address | INET | IP del cliente |
| user_agent | TEXT | User agent |
| referer | VARCHAR(500) | Referer header |
| country_code | VARCHAR(2) | Pais (geo-ip) |
| created_at | TIMESTAMPTZ | Timestamp |

### RF-AUDIT-002.2: Niveles de Logging

```typescript
enum AccessLogLevel {
  MINIMAL = 'minimal',   // Solo errores y auth
  STANDARD = 'standard', // Todo excepto GET de listas
  VERBOSE = 'verbose',   // Todo incluyendo GETs
  DEBUG = 'debug'        // Todo + request body
}
```

Configurable por tenant y globalmente.

### RF-AUDIT-002.3: Recursos a Monitorear

| Tipo | Ejemplos | Prioridad |
|------|----------|-----------|
| Autenticacion | /auth/login, /auth/logout | Siempre |
| Admin APIs | /admin/*, /settings/* | Siempre |
| Datos sensibles | /users/*, /contacts/* | Siempre |
| APIs publicas | /api/v1/* | Configurable |
| Assets estaticos | /assets/*, /public/* | Nunca |

### RF-AUDIT-002.4: Excepcion de Logging

Ciertos paths se excluyen por defecto:

```typescript
const EXCLUDED_PATHS = [
  '/health',
  '/metrics',
  '/favicon.ico',
  '/assets/*',
  '/static/*'
];
```

### RF-AUDIT-002.5: Request Body Logging

Para operaciones criticas, se puede registrar el body:

```typescript
// Solo para operaciones de escritura en recursos criticos
// Body se sanitiza (passwords -> ****)
// Maximo 10KB de body almacenado
{
  "requestBody": {
    "email": "user@example.com",
    "password": "****",
    "name": "John Doe"
  }
}
```

### RF-AUDIT-002.6: Metricas de Acceso

El sistema calcula metricas en tiempo real:

```typescript
interface AccessMetrics {
  requestsPerMinute: number;
  errorRate: number;
  avgResponseTime: number;
  uniqueUsers: number;
  topEndpoints: { path: string; count: number }[];
  topErrors: { statusCode: number; count: number }[];
}
```

---

## Operaciones

### Consultar Logs de Acceso

```typescript
GET /api/v1/audit/access?from=2025-12-01&to=2025-12-05&userId=uuid&statusCode=500

Response:
{
  "data": [
    {
      "id": "uuid",
      "method": "POST",
      "path": "/api/v1/users",
      "statusCode": 201,
      "responseTimeMs": 45,
      "user": { "id": "...", "name": "Admin" },
      "ipAddress": "192.168.1.100",
      "createdAt": "2025-12-05T10:00:00Z"
    }
  ],
  "meta": { "total": 1000, "page": 1 }
}
```

### Consultar Metricas

```typescript
GET /api/v1/audit/access/metrics?period=1h

Response:
{
  "period": "1h",
  "requestsTotal": 5000,
  "requestsPerMinute": 83.3,
  "errorRate": 0.02,
  "avgResponseTime": 120,
  "p99ResponseTime": 450,
  "uniqueUsers": 150,
  "topEndpoints": [
    { "path": "/api/v1/users", "count": 500 }
  ]
}
```

### Consultar Sesiones de Usuario

```typescript
GET /api/v1/audit/access/user/:userId/sessions

Response:
{
  "sessions": [
    {
      "sessionId": "uuid",
      "startedAt": "2025-12-05T08:00:00Z",
      "lastActivityAt": "2025-12-05T10:30:00Z",
      "ipAddress": "192.168.1.100",
      "userAgent": "Mozilla/5.0...",
      "requestCount": 150
    }
  ]
}
```

---

## Reglas de Negocio

| ID | Regla | Severidad |
|----|-------|-----------|
| BR-001 | Logs de acceso son inmutables | Critical |
| BR-002 | Retencion: 90 dias por defecto | Compliance |
| BR-003 | Body de request sanitizado | Security |
| BR-004 | Solo admins acceden a logs | Security |
| BR-005 | Rate limit en consultas de logs | Performance |

---

## Criterios de Aceptacion

- [ ] Logging automatico de todas las peticiones
- [ ] Filtrado por paths excluidos
- [ ] Sanitizacion de datos sensibles
- [ ] Metricas en tiempo real
- [ ] Consulta con filtros multiples
- [ ] Geo-IP para ubicacion
- [ ] Performance < 5ms overhead

---

## Historial

| Version | Fecha | Autor | Cambios |
|---------|-------|-------|---------|
| 1.0 | 2025-12-05 | Requirements-Analyst | Creacion inicial |
