🔐
CULTIVA IA
Legal & Compliance

Informe de Cumplimiento PCI DSS v4.0

PayFlow SaaS · Fecha: 16 jun 2026 · Auditor: CULTIVA IA · Reunión QSA en 3 semanas

SAQ Aplicable
A-EP
E-commerce con
Stripe Elements JS
5
✓ Cumple
3
⚠ En riesgo
4
✗ Pendiente
12
Requisitos total
Nivel de cumplimiento actual 41.7% — Necesita acción urgente antes del QSA
■ 5 OK ■ 3 En riesgo ■ 4 Pendientes
🏗️ Arquitectura de Tokenización (SAQ A-EP)
👤 Cliente
Ingresa tarjeta
💳 Stripe.js
CardElement
Token en el browser
🏦 Stripe Servers
(PCI Level 1)
Procesa CHD
🖥️ FastAPI Backend
PayFlow
Recibe solo token
🗄️ PostgreSQL
stripe_customer_id
Almacena token ✓

✓ Arquitectura correcta: el PAN nunca toca los servidores de PayFlow

📋 Los 12 Requisitos PCI DSS v4.0 — Estado Actual
Req 1 · Red OK
Controles de seguridad de red
AWS VPC con grupos de seguridad correctamente configurados. El endpoint /api/payments está restringido. Firewall activo con reglas revisadas.
Req 2 · Configuración OK
Configuraciones seguras
Imágenes Docker sin credenciales por defecto. Variables de entorno via AWS Secrets Manager. Servicios no necesarios deshabilitados.
Req 3 · Almacenamiento OK
Proteger datos almacenados
Solo se almacena stripe_customer_id, last4 y brand — nunca PAN completo ni CVV. Tokenización correcta via Stripe Vault.
Req 4 · Tránsito Revisar
Proteger CHD en tránsito
TLS 1.3 activo en producción ✓. PENDIENTE: verificar que ningún endpoint interno usa HTTP. Revisar conexión DB: ¿SSL activo en PostgreSQL?
Req 5 · Malware Pendiente
Proteger sistemas de malware
No hay solución EDR/antivirus en los contenedores de producción. No se realizan escaneos periódicos. Acción inmediata requerida.
Req 6 · Desarrollo Crítico
Sistemas y software seguros
🚨 CRÍTICO: logs de desarrollo incluyen card_exp en algunos endpoints. Ningún CVE scan activo en dependencias (pip/npm). Sin revisión de código seguro.
Req 7 · Acceso OK
Restricción de acceso por rol
RBAC implementado. Solo roles billing_admin y finance_manager acceden a registros de pago. Principio de mínimo privilegio aplicado.
Req 8 · Autenticación Crítico
Identificar usuarios y autenticar
🚨 CRÍTICO: MFA habilitado solo para CEO. Resto del equipo accede con contraseñas simples. PCI DSS v4.0 requiere MFA para TODO acceso al CDE.
Req 9 · Físico N/A parcial
Restringir acceso físico
Infraestructura en AWS (física gestionada por AWS) ✓. Sin hardware propio con CHD. Verificar acceso físico a portátiles del equipo con acceso a consola AWS.
Req 10 · Logs Crítico
Registrar y monitorizar accesos
🚨 CRÍTICO: logs antiguos con PANs parciales detectados. Sin log de auditoría estructurado para accesos a datos de tarjeta. Retención de 12 meses no configurada.
Req 11 · Vulnerabilidades En riesgo
Pruebas de seguridad
Ningún escaneo de vulnerabilidades realizado. Sin pentest anual. Necesario programar ASV scan trimestral y pentest antes del QSA.
Req 12 · Políticas Pendiente
Política de seguridad de la información
Sin política de seguridad documentada. Sin plan de respuesta a incidentes. Sin evaluación anual de riesgos. Formación en seguridad no realizada.
💻 Correcciones de Código — Puntos Críticos
logs_fix.py
mask_pan.py
mfa_middleware.py
audit_log.py
# ❌ ANTES — Req 6: card_exp aparece en logs (VIOLACIÓN CRÍTICA PCI DSS)
import logging
def create_subscription(customer_id: str, card_exp: str, plan: str):
    logging.info(f"Creando suscripción para {customer_id} con tarjeta exp {card_exp}")  # ❌ SAD en logs
    ...

# ✅ DESPUÉS — Solo información no sensible en logs
def create_subscription(customer_id: str, card_exp: str, plan: str):
    logging.info(f"Creando suscripción plan={plan} customer={customer_id[:8]}...")  # ✅ Sin CHD
    ...

# ✅ Req 3: Enmascarar PAN si alguna vez es necesario mostrarlo
def mask_pan(pan: str) -> str:
    """PCI DSS Req 3.3.1 — mostrar solo primeros 6 y últimos 4."""
    if len(pan) < 13:
        raise ValueError("PAN inválido")
    return pan[:6] + "*" * (len(pan) - 10) + pan[-4:]
    # 4111111111111111 → 411111******1111

# ✅ Req 8: Forzar MFA en todo acceso al CDE (FastAPI middleware)
from fastapi import Request, HTTPException

async def require_mfa(request: Request):
    user = request.state.user
    if not user.mfa_verified:
        raise HTTPException(403, "MFA requerido para acceder al entorno CDE")
    return user

# ✅ Req 10: Log de auditoría estructurado — NUNCA el PAN completo
import json
from datetime import datetime, timezone

def audit_chd_access(user_id: str, action: str, last4: str, amount: float = None):
    entry = {
        "ts": datetime.now(timezone.utc).isoformat(),
        "user_id": user_id,
        "action": action,        # "view" | "charge" | "refund"
        "card_last4": last4,      # ✅ Solo últimos 4
        "amount_eur": amount,
        "event_type": "chd_access"
    }
    audit_logger.info(json.dumps(entry))  # → CloudWatch Logs con retención 12m
🚨 Plan de Acción Priorizado — 3 semanas antes del QSA
CRÍTICO
Semana 1
Req 8 — Activar MFA para todos los accesos al CDE
MFA habilitado solo en cuenta CEO. PCI DSS v4.0 (req 8.4.2) exige MFA para CUALQUIER acceso no console al CDE: todos los empleados con acceso a consola AWS, BD, o panel de pagos.
→ Activar AWS IAM MFA + TOTP en la app para roles billing_admin y finance_manager
⏱ Prioridad 1
≤ 48 horas
CRÍTICO
Semana 1
Req 6 + 10 — Purgar logs con card_exp y limpiar logs históricos
Logs de desarrollo incluyen card_exp (SAD). Logs históricos con PANs parciales. Cualquier SAD almacenado post-autorización es una violación directa PCI DSS req 3.2.1.
→ grep -r "card_exp\|pan\|cvv" en todos los logs → eliminar + fix en código + CloudWatch log group rotation
⏱ Prioridad 2
≤ 72 horas
ALTO
Semana 2
Req 10 — Implementar audit log estructurado con retención 12 meses
Sin registro de auditoría de accesos a datos de titulares. PCI DSS req 10.2 exige log de cada acceso a CHD, cambios de privilegios, y fallos de autenticación.
→ Integrar audit_chd_access() en todos los endpoints de pagos + CloudWatch Logs retention 365 días
⏱ Semana 2
ALTO
Semana 2
Req 12 — Redactar política de seguridad de la información
Sin política documentada. El QSA solicitará ver la política en la auditoría. Mínimo: política de uso aceptable, gestión de accesos, retención de datos, respuesta a incidentes.
→ Redactar 4 políticas mínimas + plan de respuesta a brechas de tarjetas
⏱ Semana 2
MEDIO
Semana 3
Req 11 — Programar escaneo ASV trimestral + pentest anual
Ningún escaneo de vulnerabilidades realizado. PCI DSS req 11.3 exige escaneos trimestrales con Approved Scanning Vendor y pentest anual.
→ Contratar Qualys/Rapid7 para ASV scan + nmap interno + OWASP ZAP sobre /checkout
⏱ Semana 3
☑️ Checklist de Auditoría — Para entregar al QSA
SAQ tipo A-EP seleccionado y justificado
Acuerdo con procesador (Stripe BAA) firmado
CDE documentado: ningún PAN en servidores
TLS 1.2+ en todos los endpoints externos
Tokenización activa — solo token en PostgreSQL
RBAC documentado y evidencia de roles
MFA para TODOS los accesos al CDE
Logs históricos con CHD eliminados
Audit log estructurado activo (retención 12m)
Política de seguridad de la información
Escaneo ASV trimestral programado
~
Revisión SSL/TLS conexión interna PostgreSQL
Plan de respuesta a incidentes (brechas CHD)
Formación en seguridad al equipo documentada
~
EDR/antivirus en contenedores de producción
Pentest anual planificado