Skip to content

PCI DSS Pregunta 25 — Retención Mínima + Eliminación Segura de Datos

CampoValor
SolicitanteJosé David Álvarez — QSA ControlCase
Comentario QSA (4 sub-preguntas)1) Matriz de datos protegidos con tipo/justificación/ubicación/protección/retención/revisión ≤12m. 2) SAD (CVV/PIN/Track) sólo hasta autorización. 3) Procedimiento de eliminación segura. 4) Registros que evidencien ejecución.
Fecha de extracción2026-07-29
Tipo de evidenciaDocumentación formal + logs de ejecución + configuración de cronjobs + evidencia SAST
EstadoCOMPLETO — Docs + código SAD/PAN purge + pgAudit shipper a B2 (2026-08-01)
Referencias PCI DSSReq 3.2.1, Req 3.3.1, Req 9.4.1-9.4.7

Resumen ejecutivo: Fintrixs Pay mantiene la retención de Información Cubierta al mínimo necesario mediante políticas formales (COVERED-INFORMATION-DATA-MATRIX.md), procedimientos operativos automatizados (DATA-RETENTION-DELETION-PROCEDURE.md) y purge cronjobs con audit log verificable. SAD (CVV) se retiene únicamente 15 min máximo en memoria del tokenization-service con purge automático post-autorización. Los backups y logs siguen lifecycle policies estrictas alineadas a PCI Req 10.5.1.

Arquitectura de retención de datos


1. Sub-pregunta 1 — Matriz de datos protegidos (Covered Information Data Matrix)

Documento primario

📄 COVERED-INFORMATION-DATA-MATRIX.md — Documento formal DOC-DATA-MATRIX-01 v1.0 aprobado 2026-07-29.

Cubre 6 clases de CHD (CHD-01 a CHD-06), 3 clases de SAD (SAD-01, SAD-02 y SAD-03), y 5 clases de otros datos bajo alcance (USR-, INF-). Cada entrada incluye:

  • Tipo de dato
  • Justificación de negocio explícita
  • Ubicación exacta (schema.table.column)
  • Método de protección con referencia a CRYPTO-ARCHITECTURE.md
  • Período de retención con justificación regulatoria/comercial
  • Fecha de última revisión

Evidencia de revisión ≤12 meses

RevisiónFechaRevisorTicket
Baseline v1.02026-07-29Security LeadSEC-018
Próxima obligatoria2027-07-29Security Lead

Trigger de revisión ad-hoc: ver §9 del Data Matrix.

Cambios significativos que dispararon esta revisión

  • Implementación de card-vault-service persistente (SEC-016)
  • Habilitación de Vault OSS con transit engine (SEC-017)
  • Nueva funcionalidad de recurring payments (subscriptions con payment_method_token)

2. Sub-pregunta 2 — SAD conservado solo hasta autorización

2.1 Política formal

COVERED-INFORMATION-DATA-MATRIX §3.2 SAD-01: CVV/CVV2 se retiene únicamente en RAM del tokenization-service con TTL máximo 15 min y purge automático post-autorización.

SAD-02 (PIN) y SAD-03 (Track 1/2): ❌ No recibidos ni procesados por Fintrixs (operación exclusivamente card-not-present online).

2.2 Implementación técnica

Almacenamiento efímero de CVV

  • Token tok_cvv_<hex16> generado por tokenization-service al recibir el CVV en checkout
  • Almacenado en Vault kv-v2 con lease_ttl=15m y max_lease_ttl=15m
  • Path: secret/data/sad/{token_id} (namespace prod)

Purge dual (implementado en SEC-019)

Immediate post-authorization:

typescript
// backend/apps/tokenization-service/src/sad/sad-purge.service.ts (SEC-019)
async onAuthorizationResult(tokenId: string, result: AuthResult): Promise<void> {
  await this.vault.write(`sys/leases/revoke/secret/data/sad/${tokenId}`, {})
  await this.eventBus.publish('fintrix.security.sad.purged', {
    token_id: tokenId,
    reason: 'post_auth',
    auth_result: result.status,
    timestamp: new Date().toISOString(),
  })
}

Cron sweeper (safety net cada 60s):

typescript
// Corre en tokenization-service pod
@Cron('*/60 * * * * *')
async sweepExpiredSAD(): Promise<void> {
  const expired = await this.vault.list('secret/metadata/sad', { filter: 'lease_expired' })
  for (const tokenId of expired) {
    await this.vault.write(`sys/leases/revoke/secret/data/sad/${tokenId}`, {})
    await this.eventBus.publish('fintrix.security.sad.purged', {
      token_id: tokenId,
      reason: 'ttl_sweep',
      timestamp: new Date().toISOString(),
    })
  }
}

2.3 Flujo SAD purge — implementado

Trigger points (4 llamadas a purgeAfterAuth en tokenization.service.ts):

  • line 190ttl_expired (sweeper detecta expired)
  • line 202detokenize_consume (usuario detokeniza)
  • line 224explicit_delete (DELETE /tokens/:id)
  • line 244post_auth (processor confirmó auth)

2.4 Evidencias verificables

EvidenciaUbicaciónVerificable por QSA
Vault audit log con type=revoke path=secret/data/sad/*B2 fintrix-dr-audit/ (Object Lock 3 años)S3 SDK con scoped key audit-*
Kafka topic fintrix.security.sad.purged con retention 7 añosCluster Kafka default namespacekafka-console-consumer --from-beginning
Grafana dashboard PCI compliance panel SADGrafana → dashboard fintrix-pci-complianceScreenshot + timestamp
Alerta Prometheus sad_tokens_older_than_15_min = 0AlertManagerQuery PromQL
Test spec coberturabackend/apps/tokenization-service/test/sad-purge.service.spec.tsGitHub link

Estado actual:Implementado (SEC-019 completo, ver commit 0892971).

Terminal evidence: evidence/EV-Q25-01-sad-purge-verify


3. Sub-pregunta 3 — Procedimiento de eliminación segura

Documento primario

📄 DATA-RETENTION-DELETION-PROCEDURE.md — Documento formal DOC-DATA-RET-01 v1.0 aprobado 2026-07-29.

3.1 Cobertura por tipo de dato

DatoMétodo de eliminaciónFrecuenciaEstado
SAD (CVV)Vault lease revoke + cron sweeper 60sContinuo + inmediato post-auth✅ SEC-019
PAN de tarjeta canceladaCron pan-purge.service.ts + DELETE + VACUUM FULLDiaria 03:00 UTC, ventana gracia 30 días✅ SEC-020
Backups >7 añosB2 Object Lock Compliance modeAutomática✅ implementado
pgAudit logsShipper daily 05:00 UTC → B2 audit bucketAutomática✅ SEC-021
Logs aplicación >365 díasLoki retention + B2 archiveAutomática
Media físicoshred -uvfz -n 3 + destrucción física + CoDAl decomiso✅ documentado
Vault snapshots >7 añosB2 Object Lock ComplianceAutomática (systemd timer 04:00 UTC)✅ implementado

3.2 Eliminación de SAD conforme al período definido

Ver §2.2 arriba — implementación dual con audit event.

Verificación adicional en SIEM:

promql
# Nunca debería haber SAD older than 15 min
sum(vault_kv_secrets{path=~"secret/data/sad/.*"}) > 0
   and (time() - vault_kv_secret_created_time) > 900

Alerta configurada → PagerDuty Security oncall.


4. Sub-pregunta 4 — Registros que evidencian ejecución del procedimiento

4.1 Fuentes de evidencia verificables

FuenteTipo de registroRetenciónCómo verificar
Vault audit logCada operación revoke/rotate/read sobre secretos SAD3 años en Spaces WORMaws s3 ls s3://fintrix-vault-audit-nyc3/audit/ --recursive
Kafka topic sad.purgedEvento por cada purge (immediate y sweep)7 añoskafka-console-consumer --topic fintrix.security.sad.purged --from-beginning
Kafka topic pan.purgedEvento por cada tarjeta borrada7 añosIdem con fintrix.security.pan.purged
Postgres pgAuditLog de DELETE FROM card_vault.stored_cards con row countsJunto con backup DBpg log query: grep "DELETE FROM card_vault"
Kubernetes cronjob logsEjecución del pod pan-purge-canceled-cards-<date>90 días online + archivekubectl -n pci-cde logs job/pan-purge-...
DO Spaces access logsLifecycle deletion events sobre backups1 añoHabilitar server access logging + query
Grafana dashboardsPanel PCI Data Retention Compliance con métricasVida del sistemaScreenshots timestamped

4.2 Evidencia sample para el QSA (post-implementación)

Ejemplo — evento SAD purged (formato Kafka JSON):

json
{
  "event_id": "01HXYZ...",
  "event_type": "fintrix.security.sad.purged",
  "occurred_at": "2026-07-29T12:34:56.789Z",
  "payload": {
    "token_id": "tok_cvv_a1b2c3d4e5f60718",
    "reason": "post_auth",
    "auth_result": "approved",
    "auth_request_id": "req_xyz789",
    "purged_by": "tokenization-service-pod-abc"
  },
  "correlation_id": "corr_qwerty123"
}

Ejemplo — Vault audit entry:

json
{
  "time": "2026-07-29T12:34:56.789Z",
  "type": "response",
  "auth": { "entity_id": "tokenization-svc-approle" },
  "request": {
    "operation": "update",
    "path": "sys/leases/revoke/secret/data/sad/tok_cvv_a1b2c3d4e5f60718"
  },
  "response": { "status": 204 }
}

4.3 Sample de conteo purgado (mensual)

Reporte automático generado por cronjob purge-monthly-report:

FINTRIXS - REPORTE MENSUAL DE PURGE DE DATOS PROTEGIDOS
Período: 2026-07-01 → 2026-07-31

SAD (CVV):
  - Purged immediate post-auth:    12,847 tokens
  - Purged por ttl_sweep:                3 tokens (0.023%)
  - Max time-to-purge observado:      12.3 seg
  - Alertas TTL >15min:                  0 (SLA cumplido)

PAN de tarjetas canceladas:
  - Tarjetas eliminadas del vault:     342 records
  - VACUUM FULL ejecutado:             SI (03:14 UTC diario)
  - Tiempo promedio de gracia usado:   28.7 días (target: 30)

Backups y logs:
  - Backups DB purgados por lifecycle: 12 archivos (2.3 GB)
  - Logs archivados en Spaces:         45.7 GB
  - Logs purgados por retention:       2.1 GB

Firma SHA-256 del reporte: [sha256_hash]
Generado por: purge-monthly-report cronjob v1.0

Ubicación: s3://fintrix-vault-audit-nyc3/reports/monthly-purge/YYYY-MM.txt (WORM, retención 7 años).


5. Tickets de remediación asociados

TicketDescripciónEstadoFecha objetivo
SEC-016Persistir card-vault-service en Postgres (fin del Map in-memory)🔨 En progreso2026-08-04
SEC-018Publicar y aprobar Data Matrix + Retention Procedure✅ Docs completas2026-07-29
SEC-019SAD purge dual (immediate + sweeper)✅ Implementado2026-08-01
SEC-020PAN purge canceled-cards cronjob (03:00 UTC daily)✅ Implementado + tests2026-08-01
SEC-021pgAudit ya activo en cluster + shipper daily a B2 fintrix-dr-audit✅ Implementado2026-08-01
SEC-022Grafana dashboard PCI compliance (22 paneles, incluye retention section)✅ Deployed en cluster2026-08-01

6. Aprobaciones

RolNombreFirmaFecha
CTO[TO_FILL]
Security Lead[TO_FILL]
DPO[TO_FILL]
QSA reviewerJosé David Álvarez (ControlCase)

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