Skip to content

SOP-005: Solicitud de excepción temporal de MFA

CampoValor
IDSOP-005
Versión1.0
Fecha de emisión2026-06-16
PropietarioCTO + CISO
PCI DSSReq 8.5.1.b — "MFA cannot be bypassed by any user including administrators, unless specifically documented and authorized by management on an exception basis, for a limited time period"

1. Propósito

Definir el proceso formal y time-bounded para autorizar el bypass temporal del segundo factor MFA en el dashboard Fintrixs Pay y otros sistemas en alcance PCI DSS v4.0.

Este SOP es la única vía válida para deshabilitar MFA en un sistema crítico. Cualquier bypass que no siga este proceso constituye un incidente de seguridad reportable.

2. Cuándo aplica

EscenarioAplica
Pérdida del dispositivo authenticator del CTO
Maintenance/break-glass requerido por DR (Disaster Recovery)
Diagnóstico de incidente de seguridad activo
Migración de authenticator app del usuario✗ — flujo regular /auth/mfa/disable
Usuario olvidó su código TOTP pero tiene backup codes✗ — usa backup codes
Conveniencia o velocidad operacional✗ — denegar

3. Procedimiento

3.1 Form A — Solicitud

CampoObligatorioNotas
Solicitante (nombre + role)
Sistema afectadodashboard / kubectl / DO console / etc.
Cuenta a impactarUUID o email
Justificación de negociomin 50 chars; "incidente activo X", "DR drill Y"
Ventana solicitada≤ 4 horas absolutas
Compensating controls durante la ventana"doble checkout", "screen recording", "kept on call CTO"
Plan de re-enrollment del MFA tras la ventana"new authenticator app added", "backup codes regenerated"

3.2 Aprobación

SolicitanteAprobadores requeridos
Cualquier usuario merchantCTO + Tech Lead
Tech Lead / Backend DevCTO + CISO
CTOCISO + un testigo externo (auditor, board member)

3.3 Issue de la excepción técnica

Una vez aprobada, el admin con permiso mfa:override ejecuta:

sql
-- Disable MFA temporalmente con expiración automática
UPDATE iam_core.user_mfa
   SET is_enabled = false,
       updated_at = now()
 WHERE user_id = '<uuid del usuario afectado>';

INSERT INTO iam_core.mfa_verification_events
  (user_id, event, metadata)
VALUES
  ('<uuid>', 'mfa_disabled',
   jsonb_build_object(
     'sop_id',         'SOP-005',
     'request_ref',    'EX-2026-XXXX',
     'approved_by',    '[email protected] + ciso@...',
     'expires_at',     '<iso8601 = max NOW() + 4 hours>',
     'reason',         '<resumen de la justificación>',
     'reenrollment_plan', '<descripción>'
   ));

3.4 Auto-expiración

Un cron job (iam_mfa_exception_expirer.sh, hourly) que corre en el cluster prod automáticamente:

  1. Busca registros mfa_disabled con expires_at < now() en mfa_verification_events
  2. Re-ejecuta enableMfa() para el usuario (genera nuevo secret) O marca la cuenta como must_re_enroll = true (el dashboard lo fuerza al siguiente login)
  3. Audita el cierre como mfa_exception_expired

3.5 Audit log inmutable

Todas las entradas en iam_core.mfa_verification_events son append-only por convención. La política de la tabla:

  • INSERT: permitido a app role fintrix
  • UPDATE / DELETE: DENIED a app role; solo doadmin puede limpiar registros > 7 años (PCI 10.5.1 retention)

4. Excepciones nunca permitidas

Las siguientes son denegadas automáticamente y constituyen incidente de seguridad si se intentan:

  • Deshabilitar MFA permanentemente para una cuenta in-scope sin removerla
  • Usar la SOP-005 como vía recurrente para un mismo usuario (>1 vez/mes)
  • Aprobar excepción para una cuenta con must_change_password = true (Q53)
  • Deshabilitar MFA para más de 1 usuario simultáneamente

5. Reporte trimestral

El CISO genera un reporte trimestral con TODAS las excepciones invocadas (SELECT … FROM mfa_verification_events WHERE event='mfa_disabled' AND metadata->>'sop_id'='SOP-005') y se lo entrega al board. Cero excepciones es el target esperado.

6. Referencia cruzada

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