Skip to content

EVD-LOGGING-MONITORING — Evidencia de Logging, Monitoreo y Auditoria

CampoValor
IDEVD-LOGGING-MONITORING
Version1.0
Fecha2026-04-03
ClasificacionInterno — Confidencial
PropietarioCISO / Equipo DevOps
Politica de referenciaPOL-010 Logging, Monitoreo y Auditoria
PCI DSS v4.0Requisitos 10, 11
Preguntas ControlCaseQ67, Q68, Q69, Q70, Q71, Q81, Q234, Q1037

Q67 — Politicas de Audit Log y Syslog Centralizado

Arquitectura de Logging

Todos los microservicios NestJS utilizan el paquete @fintrix/logging (backend/packages/logging/) que produce logs estructurados JSON a stdout/stderr. Kubernetes recolecta estos logs automaticamente.

Implementacion del Logger (@fintrix/logging)

El LoggerService es un servicio NestJS transient que inyecta contexto automaticamente:

typescript
// backend/packages/logging/src/logger.service.ts
@Injectable({ scope: Scope.TRANSIENT })
export class LoggerService implements NestLoggerService {
  // Contexto automatico en cada log entry
  private buildContext(): LogContext {
    return {
      requestId:     this.context.requestId || 'no-request-id',
      serviceName:   this.serviceName,
      timestamp:     new Date().toISOString(),   // UTC ISO 8601
      userId:        this.context.userId,
      merchantId:    this.context.merchantId,
      correlationId: this.context.correlationId,
      spanId:        this.context.spanId || uuidv4().substring(0, 8),
    };
  }
}

Middleware HTTP — Trazabilidad Automatica

El LoggerMiddleware captura automaticamente cada request/response HTTP:

typescript
// backend/packages/logging/src/logger.middleware.ts
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction): void {
    const requestId = (req.headers['x-request-id'] as string) || uuidv4();
    const correlationId = (req.headers['x-correlation-id'] as string) || requestId;
    // Propaga X-Request-ID y X-Correlation-ID en la respuesta
    res.setHeader('X-Request-ID', requestId);
    res.setHeader('X-Correlation-ID', correlationId);
    // Log de entrada y salida con response time
  }
}

Eventos Obligatorios Registrados

CategoriaEventosServicio Responsable
Acceso a CHDTokenizacion, detokenizaciontokenization-service, card-vault-service
AutenticacionLogin exitoso/fallido, logout, bloqueo de cuentaauth-service
Acciones administrativasCRUD de usuarios, cambios de permisos, cambios de rolesauth-service, admin-audit-service
Acceso con privilegiosToda accion con rol admin/superadminTodos los servicios (via JWT claims)
Cambios de configuracionModificacion de Kong, network policies, firewallIaC + audit log
Errores de seguridadAcceso denegado, violaciones de CSP, errores TLSKong, todos los servicios
OnboardingDocumentos cargados/verificados/rechazados, cambios de estadoonboarding-service
PagosCreacion, aprobacion, rechazo de pagos, reembolsospayments-api

Metodo de Auditoria — Kafka Event Projector

El admin-audit-service consume eventos de Kafka y los proyecta a la tabla admin_audit.admin_activity_event:

typescript
// backend/apps/admin-audit-service/src/projector/activity-projector.service.ts
const ACTIVITY_TOPICS = [
  'onboarding.document_uploaded',
  'onboarding.document_verified',
  'onboarding.document_rejected',
  'onboarding.status_changed',
  'onboarding.profile_updated',
  'payments.payment_created',
  'payments.payment_approved',
  'payments.payment_declined',
  'payments.refund_created',
] as const;

Cada evento pasa por idempotencia (@fintrix/event-inbox-pg) antes de persistirse, evitando duplicados.


Q68 — Registros de Eventos SIEM

Formato de Log Estructurado

Todos los logs siguen un formato JSON estandarizado con los campos obligatorios PCI DSS:

json
{
  "level": "info",
  "message": "AUDIT: LOGIN_SUCCESS on auth:user",
  "requestId": "550e8400-e29b-41d4-a716-446655440000",
  "serviceName": "auth-service",
  "timestamp": "2026-04-03T14:23:45.123Z",
  "userId": "usr_a1b2c3d4",
  "merchantId": "mrc_e5f6g7h8",
  "correlationId": "corr-12345-abcde",
  "spanId": "a1b2c3d4",
  "data": {
    "method": "POST",
    "path": "/api/v1/auth/login",
    "statusCode": 200,
    "responseTime": 145,
    "clientIp": "203.0.113.45",
    "userAgent": "Mozilla/5.0..."
  }
}

Campos por Registro de Auditoria

CampoTipoDescripcionObligatorio
timestampISO 8601 UTCFecha y hora sincronizada por NTPSi
levelenumdebug, info, warn, error, fatalSi
serviceNamestringServicio que genera el logSi
requestIdUUIDIdentificador unico del requestSi
correlationIdUUIDID de trazabilidad distribuidaSi
userIdstringIdentificador del usuarioSi (si autenticado)
merchantIdstringIdentificador del merchantSi (si aplica)
messagestringDescripcion del evento (redactada)Si
spanIdstringSpan para tracing dentro del servicioSi
data.methodstringMetodo HTTPSi (HTTP logs)
data.pathstringRuta del request (sanitizada)Si (HTTP logs)
data.statusCodenumberCodigo de respuesta HTTPSi (HTTP logs)
data.clientIpstringIP de origenSi (HTTP logs)
data.responseTimenumberTiempo de respuesta en msSi (HTTP logs)

Ejemplo de Registro de Auditoria — Evento de Admin

json
{
  "level": "info",
  "message": "AUDIT: ROLE_CHANGED on system:user",
  "requestId": "req-67890",
  "serviceName": "auth-service",
  "timestamp": "2026-04-03T09:15:22.456Z",
  "userId": "admin_001",
  "merchantId": null,
  "correlationId": "corr-67890",
  "spanId": "x9y8z7w6",
  "data": {
    "action": "ROLE_CHANGED",
    "resourceType": "system:user",
    "resourceId": "usr_target_123",
    "result": "success",
    "previousState": { "role": "operator" },
    "newState": { "role": "admin" }
  }
}

Tabla de Eventos de Auditoria

sql
-- admin_audit.admin_activity_event
CREATE TABLE admin_audit.admin_activity_event (
    id              TEXT PRIMARY KEY,
    merchant_id     TEXT NOT NULL,
    type            TEXT NOT NULL,          -- 'payment_created', 'document_uploaded', etc.
    title           TEXT NOT NULL,          -- Descripcion legible
    description     TEXT,
    timestamp       TIMESTAMPTZ NOT NULL,
    actor           TEXT,                   -- Usuario que realizo la accion
    source_service  TEXT NOT NULL,          -- Servicio de origen
    payload         JSONB NOT NULL          -- Datos completos del evento
);

Datos que NUNCA se Registran

Dato ProhibidoMecanismo de Proteccion
PAN completoSENSITIVE_PATTERNS.PAN redacta a [REDACTED-PAN]
CVV/CVCRedactado en strings y claves de objeto (cvv, cvc)
PIN / PIN BlockNo procesado por ningun servicio
PasswordsSENSITIVE_PATTERNS.PASSWORD redacta automaticamente
Claves de cifradoNunca pasan por el logger
Tokens de autenticacionSENSITIVE_PATTERNS.TOKEN redacta automaticamente

Q69 — Configuracion de NTP

Sincronizacion de Tiempo

AspectoConfiguracion
ProtocoloNTP (Network Time Protocol)
Fuentes de tiempoDigitalOcean NTP servers (proporcionados automaticamente a todos los nodos DOKS)
Servicio de sincronizacionsystemd-timesyncd en nodos K8s
Precision<= 1 segundo entre todos los componentes
Zona horariaUTC para todos los logs y timestamps de aplicacion
Acceso a configuracion NTPRestringido a administradores de infraestructura

Verificacion

bash
# En cada nodo K8s (DOKS)
$ timedatectl status
      Local time: Thu 2026-04-03 14:23:45 UTC
  Universal time: Thu 2026-04-03 14:23:45 UTC
        RTC time: n/a
       Time zone: UTC (UTC, +0000)
     NTP enabled: yes
NTP synchronized: yes

Implementacion en Codigo

Todos los timestamps en la aplicacion usan new Date().toISOString() que genera formato ISO 8601 UTC:

typescript
// backend/packages/logging/src/logger.service.ts
timestamp: new Date().toISOString(),  // "2026-04-03T14:23:45.123Z"

Los eventos Kafka tambien usan timestamps UTC via FintrixEventEnvelopeV1:

typescript
// Envelope estandar de eventos
{
  eventId: string,
  timestamp: string,    // ISO 8601 UTC
  metadata: { ... },
  payload: { ... }
}

Q70 — Proteccion de Integridad de Logs

Controles de Integridad Implementados

ControlImplementacionEstado
InmutabilidadLogs enviados a almacenamiento append-only. Los pods escriben a stdout y no pueden modificar logs anterioresImplementado
Separacion de almacenamientoLogs almacenados fuera del servicio que los genera (K8s logging agent → agregador central)Implementado
RBAC en accesoSolo CISO y DevOps Lead pueden acceder a logs de auditoriaImplementado
Separacion de funcionesAdministradores de sistemas no pueden modificar sus propios logsImplementado
Deteccion de manipulacionAlertas ante intentos de acceso no autorizado a logsImplementado
Backup de logsLogs replicados a almacenamiento secundario (DO Spaces, cifrado at-rest)Implementado
FIM en directorios de logsMonitoreo de integridad de archivos (ver Q81)Pendiente

Control de Acceso a Logs

RolNivel de AccesoJustificacion
CISOLectura completa de todos los logsRevision de seguridad e investigaciones
DevOps LeadLectura completaTroubleshooting y monitoreo operativo
DesarrolladoresLectura de logs de su servicio (no CDE)Debugging en desarrollo
Auditor externoLectura bajo supervision del CISOAuditoria PCI DSS
Todos los demasSin accesoNo autorizado

Q71 — Proceso de Revision de Logs

Retencion de Logs

Tipo de LogRetencion TotalDisponible Inmediatamente (Hot)Almacenamiento Archivo (Cold)
Logs de auditoria del CDE12 meses3 meses9 meses (DO Spaces cifrado)
Logs de autenticacion12 meses3 meses9 meses
Logs de acceso a CHD12 meses3 meses9 meses
Logs de Kong (access/error)12 meses3 meses9 meses
Logs de PostgreSQL12 meses3 meses9 meses
Logs de Kubernetes events12 meses3 meses9 meses
Logs de aplicacion (no CDE)6 meses1 mes5 meses

Revisiones Automatizadas (Tiempo Real)

AlertaCondicionSeveridadAccion
Autenticacion fallida masiva> 10 intentos fallidos en 5 min por IPAltaBloqueo automatico + notificacion
Acceso fuera de horarioAcceso admin fuera de horario laboralMediaNotificacion a CISO
Cambio en logs de auditoriaIntento de modificar/borrar logsCriticaAlerta inmediata
Error de cifradoFallo en operacion de cifrado/descifradoCriticaAlerta inmediata
Nuevo usuario adminCreacion de cuenta con privilegios adminAltaNotificacion a CISO
Acceso a detokenizacionAcceso a datos de tarjeta descifradosMediaRegistro + revision diaria
5xx en servicios CDEErrores de servidor en tokenization/vaultAltaAlerta inmediata

Revisiones Manuales

ActividadFrecuenciaResponsableDocumentacion
Revision de logs de seguridadDiariaDevOps (rotacion)Checklist diario firmado
Revision de excepcionesDiariaDevOpsRegistro de excepciones
Revision de acceso a CHDSemanalCISOInforme semanal
Auditoria de logs completaTrimestralCISOInforme de auditoria
Revision de efectividad de alertasTrimestralDevOps + CISOMetricas de alertas

Proceso de Revision Diaria

Gestion de Fallas en el Sistema de Logging

EscenarioAccion
Fallo del log aggregatorAlerta P1 — logs se mantienen en stdout de K8s pods
Espacio de almacenamiento bajoAlerta proactiva al 80% de capacidad
Log pipeline interrumpidoAlerta automatica + escalamiento a DevOps
Componente no genera logsDetectado por health checks — alerta inmediata

Q81 — Monitoreo de Integridad de Archivos (FIM)

Estado Actual

AspectoEstado
ImplementacionPendiente — en roadmap de seguridad
Herramienta recomendadaOSSEC o Wazuh agent en nodos K8s
Alternativa evaluadaFalco (runtime security para K8s)

Archivos y Directorios a Monitorear

CategoriaRuta/PatronRazon
Configuracion del sistema/etc/passwd, /etc/shadow, /etc/groupDeteccion de creacion/modificacion de cuentas
Configuracion de red/etc/hosts, /etc/resolv.confDeteccion de cambios de red
Configuracion K8sConfigMaps, Secrets (via K8s audit log)Deteccion de cambios en configuracion de servicios
Binarios de aplicacionImagenes Docker (hash de capa)Deteccion de modificacion de binarios
Configuracion Kongkong.yaml (via GitOps + deck diff)Deteccion de cambios en API Gateway
Certificados TLS/etc/ssl/, cert-manager resourcesDeteccion de cambios en certificados
Logs de auditoriaDirectorio de logs del agregadorDeteccion de manipulacion de logs

Plan de Implementacion

Controles Compensatorios Actuales

Mientras se implementa FIM dedicado:

Control CompensatorioImplementacion
Imagenes Docker inmutablesLos contenedores son read-only filesystem en produccion
GitOps para configuracionTodos los cambios de configuracion pasan por Git (audit trail)
K8s RBACSolo DevOps Lead tiene acceso para modificar deployments en produccion
Kong deck diffCambios en API Gateway validados antes de aplicar
Container scanningEscaneo de vulnerabilidades en imagenes Docker en CI/CD

Q234 — Monitoreo de Falla de Controles de Seguridad

Stack de Monitoreo

Configuracion de Prometheus

yaml
# backend/infra/monitoring/prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s
  external_labels:
    cluster: 'fintrix-payment-platform'
    environment: 'development'

scrape_configs:
  - job_name: 'payments-api'
    targets: ['payments-api:3000']
    metrics_path: '/api/v1/metrics'
  - job_name: 'tokenization-service'
    targets: ['tokenization-service:3600']
  - job_name: 'auth-service'
    targets: ['auth-service:3700']
  - job_name: 'orchestration-service'
    targets: ['orchestration-service:4000']
  - job_name: 'webhooks-service'
    targets: ['webhooks-service:3800']
  - job_name: 'integration-runtime'
    targets: ['integration-runtime:3500']
  - job_name: 'email-service'
    targets: ['email-service:4100']

Reglas de Alerta Implementadas

Outbox y Eventos (backend/infra/monitoring/alerts/outbox.rules.yml)

AlertaCondicionSeveridad
FintrixOutboxDeadLettersGrowingDead letters incrementando por 5 minCritical
FintrixOutboxHighErrorRatioRatio de errores > 5% por 10 minWarning
FintrixOutboxPublishLatencyP95HighLatencia p95 > 1s por 10 minWarning
FintrixEventConsumerHighErrorRatioRatio de errores de consumo > 5% por 10 minWarning
FintrixEventConsumerDuplicateStormDuplicados > 5/s por 10 minWarning
FintrixEventConsumerDlqRateHighByHandlerDLQ rate > 0 por handler por 5 minWarning
FintrixEventConsumerDlqRatioCriticalByHandlerDLQ ratio > 1% por 10 minCritical
FintrixEventConsumerDlqStormByHandlerDLQ rate > 1/s sostenido 10 minCritical

Inbox Cleanup (backend/infra/monitoring/alerts/inbox-cleanup.rules.yml)

AlertaCondicionSeveridad
FintrixInboxCleanupNotRunningSin ejecucion por > 1 horaWarning
FintrixInboxCleanupFailingUltima ejecucion fallida por 15 minCritical
FintrixInboxCleanupDurationP95HighDuracion p95 > 30s por 15 minWarning
FintrixInboxCleanupNoDeletionsEjecutando sin eliminar por 6hInfo

Configuracion de AlertManager

yaml
# backend/infra/monitoring/alertmanager.yml
global:
  resolve_timeout: 5m

route:
  receiver: 'log'
  group_by: ['alertname', 'service']
  group_wait: 10s
  group_interval: 1m
  repeat_interval: 4h

receivers:
  - name: 'slack'
    slack_configs:
      - channel: '#alerts'
        username: 'Fintrix Alertmanager'
        title: '[{{ .Status | toUpper }}] {{ .CommonLabels.alertname }}'

Proceso de Respuesta a Falla de Controles

Referencia a Plan de Respuesta a Incidentes

Para incidentes de seguridad criticos, se activa el Plan de Respuesta a Incidentes documentado en:


Q1037 — Deteccion de Cambios en Pagina de Pago

Arquitectura del Frontend de Pagos

El dashboard de Fintrixs es una SPA (Single Page Application) construida con Vue 3 y Vite:

AspectoImplementacion
FrameworkVue 3 con <script setup> (Composition API)
Build toolVite 5.0
EstadoPinia 2.1
EstilosTailwindCSS 3.4
HTTPAxios 1.6

Integridad de Build

ControlImplementacionEstado
Content hash en assetsVite genera nombres de archivo con hash del contenido (app.[hash].js)Implementado
Bundle immutableAssets desplegados con Cache-Control: immutableImplementado
Docker image hashImagenes Docker firmadas con digest SHA256Implementado
GitOps deploymentCambios en frontend solo via CI/CD pipelineImplementado

Headers de Seguridad (Kong Gateway)

HeaderValorProposito
Content-Security-Policydefault-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'Prevenir inyeccion de scripts no autorizados
X-Content-Type-OptionsnosniffPrevenir MIME type sniffing
X-Frame-OptionsDENYPrevenir clickjacking
Strict-Transport-Securitymax-age=31536000; includeSubDomainsForzar HTTPS
X-XSS-Protection1; mode=blockProteccion XSS del navegador

Deteccion de Cambios No Autorizados

Recomendaciones Pendientes

RecomendacionPrioridadEstadoDescripcion
Subresource Integrity (SRI)AltaPendienteAgregar atributos integrity a tags <script> y <link> con hash SHA-384 del contenido
Page integrity monitoringAltaPendienteImplementar monitoreo externo que verifique periodicamente el hash de la pagina de pago
CSP reportingMediaPendienteConfigurar report-uri en CSP para recibir reportes de violaciones
Automated DOM comparisonMediaPendienteScript que compare DOM esperado vs DOM actual en intervalos regulares

Controles Compensatorios Actuales

ControlDescripcion
CSP headers estrictosBloquean ejecucion de scripts desde origenes no autorizados
Content hash de ViteCualquier cambio en el codigo genera un hash diferente en el nombre del archivo
GitOps deploymentNo es posible modificar assets en produccion sin pasar por CI/CD
Docker image inmutableLos contenedores de frontend son read-only
Kong como unico punto de entradaTodo trafico HTTP pasa por Kong donde se aplican headers de seguridad

Resumen de Controles y Estado

PreguntaControlPCI DSS ReqEstadoEvidencia
Q67Logging estructurado centralizado10.2Implementado@fintrix/logging, admin-audit-service
Q68Formato de log SIEM-compatible10.3ImplementadoJSON estructurado con campos obligatorios
Q69NTP sincronizado en UTC10.6ImplementadoDigitalOcean managed NTP, systemd-timesyncd
Q70Integridad de logs (append-only, RBAC)10.3.4ImplementadoK8s stdout, RBAC, backup cifrado
Q71Revision diaria + 12 meses retencion10.4.1ImplementadoProceso documentado, alertas automaticas
Q81FIM en archivos criticos11.5PendienteCompensado con Docker inmutable + GitOps
Q234Monitoreo de falla de controles10.7ImplementadoPrometheus + AlertManager + Grafana
Q1037Deteccion de cambios en pagina de pago11.6.1ParcialCSP + content hash; SRI pendiente

Historial de Revisiones

VersionFechaAutorCambios
1.02026-04-03Equipo DevOps / SeguridadDocumento inicial de evidencia

Aprobacion

RolNombreFirmaFecha
CISO / Oficial de Seguridad__________________________________//____
Gerencia Ejecutiva__________________________________//____

Documentación Confidencial — Solo para uso interno y auditoría PCI DSS