Tema
Covered Information Data Matrix — Fintrixs Pay
Documento: DOC-DATA-MATRIX-01 Versión: 1.0 Fecha de aprobación: 2026-07-29 Owner: Security Lead + DPO Frecuencia de revisión: Anual + tras cambios significativos en el CDE Referencias PCI DSS: Req 3.2.1 (retención mínima), Req 3.3.1 (SAD no persistente), Req 9.4 (media disposal) Cuestionario ControlCase: Pregunta 25
1. Propósito
Este documento inventaría toda la Información Cubierta (Covered Information) que Fintrixs Pay almacena, procesa o transmite, con la justificación de negocio, ubicación exacta, método de protección, período de retención y evidencia de revisión.
Es el documento primario que responde a la Pregunta 25 del cuestionario ControlCase.
2. Definiciones
| Término | Definición (PCI DSS v4.0 Glossary) |
|---|---|
| CHD (Cardholder Data) | PAN + cualquier otro dato de portador (nombre, expiración, service code) |
| PAN (Primary Account Number) | Número de tarjeta (13-19 dígitos) |
| SAD (Sensitive Authentication Data) | CVV/CVV2/CVC2, PIN/PIN Block, Track 1/Track 2 |
| CDE (Cardholder Data Environment) | Segmento de red y sistemas que almacenan/procesan/transmiten CHD o SAD |
| Covered Information | CHD + SAD + cualquier dato adicional bajo alcance de esta certificación |
3. Matriz de datos protegidos
3.1 Cardholder Data (CHD)
| # | Dato | Justificación de negocio | Ubicación de almacenamiento | Método de protección | Período de retención | Última revisión |
|---|---|---|---|---|---|---|
| CHD-01 | PAN completo | Recurring payments (subscriptions). Requerido para autorizar cargos futuros sin re-solicitar tarjeta al cliente. | Postgres schema card_vault.stored_cards (StatefulSet en namespace pci-cde) | AES-256-GCM (envelope encryption con KEK en Vault transit engine kek-card-vault) | Vida de la suscripción activa + 30 días post-cancelación (justificado por dispute chargeback window) | 2026-07-29 |
| CHD-02 | PAN fingerprint (HMAC-SHA256) | Búsqueda idempotente sin exponer PAN. Evita duplicados de tarjeta por cliente. | Postgres schema card_vault.stored_cards.pan_fingerprint | HMAC-SHA-256 con clave dedicada en Vault (hmac-pan-fpr) | Igual que CHD-01 | 2026-07-29 |
| CHD-03 | PAN truncado (BIN + last4) | UI: mostrar al cliente cuál tarjeta guardó. Logs de transacción para reconciliación. | Postgres schema payments_core.payment_intents.card_display, logs de app | No requiere cifrado (dato ya enmascarado) | Vida de transacción + 7 años (retención fiscal) | 2026-07-29 |
| CHD-04 | Nombre del portador | Autorización de transacción (algunas redes requieren cardholder name match) | Postgres schema card_vault.stored_cards.cardholder_name_ciphertext | AES-256-GCM (mismo envelope que CHD-01) | Igual que CHD-01 | 2026-07-29 |
| CHD-05 | Fecha de expiración (MM/YY) | Autorización + notificación pre-expiración al cliente | Postgres schema card_vault.stored_cards.exp_ciphertext | AES-256-GCM (mismo envelope que CHD-01) | Igual que CHD-01 | 2026-07-29 |
| CHD-06 | Service code | Autorización (identifica tipo de tarjeta ATM/débito/crédito) | No almacenado — leído del PAN en runtime | N/A | N/A | 2026-07-29 |
3.2 Sensitive Authentication Data (SAD)
Política dura: SAD NUNCA se almacena post-autorización. Se retiene únicamente en memoria del tokenization-service durante la ventana de autorización activa, con purge automático inmediato.
| # | Dato | Justificación de negocio | Ubicación | Método de protección | Período de retención | Última revisión |
|---|---|---|---|---|---|---|
| SAD-01 | CVV / CVV2 | Autorización de transacción one-time (algunos processors requieren CVV) | RAM del tokenization-service pod únicamente. Token tok_cvv_* con TTL 15 min. | AES-256-GCM en memoria + purge automático post-autorización | Max 15 minutos (TTL enforced por Vault kv-v2 lease + cron de purge cada 60 seg) | 2026-07-29 |
| SAD-02 | PIN / PIN Block | ❌ NO recibido ni procesado por Fintrixs (opera solo canales card-not-present online) | N/A | N/A | N/A | 2026-07-29 |
| SAD-03 | Track 1 / Track 2 | ❌ NO recibido ni procesado (no operamos card-present ni con lectores) | N/A | N/A | N/A | 2026-07-29 |
3.3 Otros datos bajo alcance
| # | Dato | Justificación | Ubicación | Método de protección | Retención |
|---|---|---|---|---|---|
| USR-01 | Email de merchant | Autenticación + notificaciones | auth_db.users | bcrypt en password field, email en claro con RLS por merchant | Vida de cuenta + 30 días post-baja |
| USR-02 | JWT secrets | Firma de tokens JWT | Vault kv-v2/jwt-signing-keys | Vault-managed AES-256-GCM | Rotación 6 meses |
| USR-03 | Merchant API keys | Autenticación B2B | payments_core.api_keys (hash SHA-256) | Solo hash almacenado (nunca la key en claro post-generación) | Vida activa del API key |
| INF-01 | Logs de aplicación con requestId | Debugging + audit | ELK/Loki cluster + DO Spaces WORM | Encryption at rest de DO Spaces + acceso restringido | 90 días online + 275 días archive (365 total, PCI Req 10.5.1) |
| INF-02 | Backup de Postgres | Recuperación de desastre | DO Spaces WORM bucket | Encryption at rest + GPG encryption con key en Vault | 90 días |
4. Ubicación física y lógica del almacenamiento
┌────────────────────────────────────────────────────────────────────┐
│ fintrix-production-vpc (10.100.0.0/16) — Region: nyc1 │
│ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ DOKS cluster fintrix-production-k8s │ │
│ │ │ │
│ │ ┌── namespace: pci-cde (target SEC-012) ──────────────────┐ │ │
│ │ │ card-vault-service pods │ │ │
│ │ │ tokenization-service pods │ │ │
│ │ │ payments-api pods │ │ │
│ │ │ Postgres StatefulSet (schemas: card_vault, tokens) │ │ │
│ │ │ → CHD-01, CHD-02, CHD-04, CHD-05 aquí │ │ │
│ │ └──────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌── namespace: default ────────────────────────────────────┐ │ │
│ │ │ auth-service, merchants-api │ │ │
│ │ │ → USR-01, USR-03 aquí │ │ │
│ │ └──────────────────────────────────────────────────────────┘ │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ Vault cluster (droplets separados en misma VPC) │ │
│ │ vault-01 (10.100.0.20), vault-02 (10.100.0.21), vault-03 │ │
│ │ → USR-02, todas las KEKs y HMAC keys aquí │ │
│ └──────────────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ DO Spaces (region nyc3) │
│ fintrix-vault-audit-nyc3 (WORM) │
│ fintrix-logs-archive-nyc3 │
│ fintrix-db-backup-nyc3 │
│ → INF-01, INF-02 aquí │
└──────────────────────────────────────┘5. Flujos de datos (referencia al DFD)
Ver documento formal data_flow_diagram.md para el diagrama detallado. Resumen de flujos que involucran Covered Information:
Guardar tarjeta para recurring (customer-not-present)
- Cliente ingresa PAN en checkout iframe → HTTPS TLS 1.3 →
tokenization-service tokenization-servicegeneratok_pan_*+ envía PAN acard-vault-servicecard-vault-servicegenera DEK, cifra PAN + nombre + exp con DEK, envuelve DEK con KEK (Vault transit)- Persiste ciphertexts + DEK_cifrada + fingerprint en
card_vault.stored_cards - Retorna
card_idUUID → asociado asubscription_customer_id
- Cliente ingresa PAN en checkout iframe → HTTPS TLS 1.3 →
Cobro recurrente (scheduled)
- Cron trigger →
payments-apiconsultasubscriptions WHERE next_billing_date <= now() - Para cada suscripción: fetch
card_id→ llamada acard-vault-service card-vault-servicefetch ciphertext + DEK_cifrada → desenvuelve DEK con Vault → descifra PAN- Envío del PAN al processor (Wompi/Cybersource/etc.) sobre TLS 1.3
- PAN en RAM del pod solo durante la duración del request; nunca a disco
- Respuesta del processor → actualización de
subscriptions.next_billing_date
- Cron trigger →
Purge SAD post-autorización
- Post-autorización exitosa/fallida →
tokenization-serviceinvalidatok_cvv_*inmediatamente - Cron cada 60 seg elimina cualquier
tok_cvv_*con lease expirado (>15 min) - Evento
sad.purgedpublicado a Kafka contoken_id,purge_reason,timestamp(audit)
- Post-autorización exitosa/fallida →
6. Método de protección — resumen
| Clase | Protección primaria | Protección secundaria | Referencia |
|---|---|---|---|
| PAN almacenado | AES-256-GCM (envelope: DEK cifrada por KEK) | HMAC-SHA-256 fingerprint para búsqueda | CRYPTO-ARCHITECTURE.md §4 |
| PAN en tránsito | TLS 1.3 (fallback TLS 1.2 ECDHE-only) | mTLS entre servicios CDE | Req 4.2.1 |
| CVV en autorización | AES-256-GCM en memoria + TTL 15 min | Purge automático + audit event | §3.2 SAD-01 |
| Cardholder name | AES-256-GCM (mismo envelope) | RLS por merchant en pg | §3.1 CHD-04 |
| Backups | AES-256-GCM (DO Spaces at-rest) | GPG encryption con key en Vault | §3.3 INF-02 |
| Logs con PII | Masking automático en @fintrix/logging | Encryption at rest DO Spaces | §3.3 INF-01 |
7. Períodos de retención — justificación
| Dato | Retención | Justificación regulatoria/comercial |
|---|---|---|
| PAN de suscripción activa | Vida activa + 30 días | Chargeback dispute window Visa/MC = 30 días desde última tx |
| PAN de suscripción cancelada | 30 días post-cancelación, luego purge automático | Post-cancelación no hay razón de negocio; purge cumple Req 3.2.1 |
| CVV/SAD | Max 15 min | PCI DSS 3.3.1 obliga a NO persistir SAD post-autorización |
| Backup de DB | 90 días | Balance entre recovery point objective y minimización PCI |
| Logs de aplicación | 365 días (90 online + 275 archive) | PCI DSS Req 10.5.1 mínimo 1 año |
| Logs de acceso a keys (Vault audit) | 3 años | PCI DSS Req 10.5 + best practice para investigaciones forenses |
| Audit de rotación de claves | Vida del sistema | Necesario para demostrar compliance histórico |
8. Procedimiento de eliminación segura
Ver documento separado DATA-RETENTION-DELETION-PROCEDURE.md.
Resumen de mecanismos:
| Dato | Método de eliminación | Verificación |
|---|---|---|
| PAN de tarjeta cancelada | Cron diario sec-purge-canceled-cards → DELETE FROM card_vault.stored_cards WHERE deleted_at < now() - interval '30 days' + VACUUM FULL | Log de purge en audit con conteo antes/después |
| CVV/SAD | Cron cada 60 seg + expiración de lease Vault | Vault audit log muestra token.revoked events |
| Backups >90 días | DO Spaces object lifecycle policy | Verificable via s3api list-objects + verificación de retention |
| Logs >365 días | Retention policy en Loki/Spaces | Verificable via query rango de fechas |
| Servidor decomisionado | Wipe con shred -uvfz -n 3 + destrucción física del disco + certificate of destruction | Certificado archivado en drive legal |
9. Evidencia de revisión
| Revisión | Fecha | Revisor | Cambios | Ticket |
|---|---|---|---|---|
| Baseline | 2026-07-29 | Security Lead | Documento inicial completo | SEC-018 |
| Próxima obligatoria | 2027-07-29 | Security Lead | Revisión anual PCI | — |
Triggers de revisión ad-hoc:
- Nueva clase de dato incorporada al CDE
- Cambio en el schema de
card_vaultotokenization - Migración a nuevo cloud provider o región
- Incidente de seguridad relacionado con datos protegidos
- Cambio en regulación (PCI DSS versión, GDPR, ley 1581 Colombia)
10. Aprobaciones
| Rol | Nombre | Firma | Fecha |
|---|---|---|---|
| CTO | [TO_FILL] | ||
| Security Lead | [TO_FILL] | ||
| DPO / Legal | [TO_FILL] |
