ConTodo
Ciberseguridad

ConTodo ERP — Ciberseguridad, RBAC Multi-Tenant, Auditoría y Readiness SOC 2 / ISO 27001

ConTodo ERP — Arquitectura de Seguridad Cloud-Native Multi-Tenant

Propósito. Definir el modelo de seguridad de ConTodo, un ERP SaaS multi-tenant para PYMEs y medianas de Perú y LATAM, sobre el stack objetivo Ruby on Rails + PostgreSQL + Redis + Sidekiq desplegado en AWS (ECS, RDS, S3, CloudFront, Route53, WAF). El documento cubre RBAC granular, auditoría inmutable, cifrado at-rest/in-transit con gestión de llaves, aislamiento de tenants, modelo de amenazas STRIDE, controles OWASP Top 10, matriz de riesgos y la hoja de ruta de readiness SOC 2 Type II e ISO/IEC 27001:2022.

Disclaimer anti-overclaiming. No declaramos "compliance" sino readiness: tener un control diseñado no es lo mismo que tener evidencia de su operación efectiva durante un período de observación (SOC 2 Type II exige 6–12 meses de evidencia). Toda afirmación de seguridad aquí es una decisión de diseño con costo y supuestos explícitos; la seguridad absoluta no existe, se gestiona riesgo residual aceptable. La pieza menos reversible es el modelo de aislamiento de tenants: una fuga cross-tenant en un ERP contable es un evento de extinción de marca.


1. Contexto, supuestos y superficie de exposición

#SupuestoValor / Justificación
S1Tenant = persona jurídica (RUC)El límite de confianza primario es el tenant_id. Toda decisión de autorización lo evalúa primero.
S2Datos críticosPlanillas (PII de trabajadores DNI/CUSPP), certificados digitales SUNAT (.pfx), claves SOL, CPE/PLE/SIRE, estados financieros, cuentas bancarias para tesorería.
S3Marco legalLey 29733 (Protección de Datos Personales, Perú) + D.S. 003-2013-JUS; LGPD (Brasil), Ley 21719 (Chile 2026), Ley 1581 (Colombia) en expansión LATAM.
S4Residencia de datosAWS sa-east-1 (São Paulo) preferida por latencia y argumento comercial de residencia regional.
S5Equipo seguridad inicial0 dedicados → 1 Security Engineer + responsabilidad compartida (DevSecOps). La operabilidad es restricción de primer orden.
S6Modelo de tenancyShared schema con tenant_id + PostgreSQL Row-Level Security (RLS) como red de seguridad de base de datos (defensa en profundidad).
S7Objetivo complianceSOC 2 Type II (requisito de venta enterprise) + ISO 27001 (palanca LATAM/licitaciones).

Superficie de ataque principal: API REST/JSON Rails (autenticada), SPA React (token en memoria), endpoints de integración SUNAT/OSE, webhooks de pasarelas (Yape/Plin/Niubiz), jobs Sidekiq, panel de administración interno (back-office), y el bucket S3 de documentos (CPE XML, PDFs, certificados).


2. RBAC multi-tenant: roles y permisos granulares

2.1 Modelo conceptual

ConTodo usa RBAC con scoping multi-tenant y soporte ABAC selectivo (atributos para reglas finas como "solo su sucursal", "monto ≤ X"). La unidad atómica de autorización es el permiso (recurso:acción), no el rol. Los roles son colecciones de permisos; los usuarios reciben roles dentro del scope de un tenant (y opcionalmente de una sucursal).

Entidades:

  • Permiso (permission): tupla recurso:acción — p.ej. factura:emitir, kardex:ajustar, planilla:aprobar, banco:conciliar. Catálogo cerrado versionado en código (seed), no editable por el cliente.
  • Rol (role): agrupación nombrada de permisos. Hay roles de sistema (inmutables: super_admin de plataforma, owner de tenant) y roles personalizados por tenant.
  • Asignación (membership): usuario × tenant × rol × scope_sucursal. Un usuario puede pertenecer a varios tenants (contador externo) con roles distintos en cada uno.
  • Política contextual (ABAC): condiciones evaluadas en runtime (sucursal propia, límite de monto, horario, segregación de funciones).

2.2 Catálogo de roles base por defecto

RolScopePermisos representativosPrincipio aplicado
Plataforma: super_adminGlobal (ConTodo)Operación de infraestructura; sin acceso a datos de negocio del tenant en claro salvo break-glass auditadoMínimo privilegio + break-glass
Tenant ownerTenantTodo dentro del tenant, gestión de usuarios y facturación SaaSÚnico rol que crea otros admins
admin_empresaTenantConfig empresa, usuarios, roles (excepto crear owners)Delegación controlada
contadorTenantContabilidad, EE.FF., PLE/SIRE, asientos; lectura de ventas/comprasSegregación: registra, no aprueba pagos
tesoreroTenant/sucursalTesorería, conciliación, aprobación de pagosSegregación con contador
vendedorSucursalEmitir CPE de su sucursal, CRM, lectura de inventarioABAC por sucursal + límite de descuento
almaceneroAlmacénKardex (movimientos), recepciones, despachos; no ajustes valorizadosAjuste de valor requiere contador
rrhhTenantPersonal, contratos, planillas (cálculo); aprobación = owner/adminDoble control de planilla
auditor (read-only)TenantLectura total + acceso al audit log; cero escrituraPara revisores/clientes Big Four

2.3 Segregación de funciones (SoD)

Reglas SoD codificadas y validadas en tiempo de asignación de roles (no solo en runtime):

Combinación prohibidaRiesgo mitigado
compra:registrar + pago:aprobarPago fraudulento a proveedor ficticio
proveedor:crear + pago:aprobarProveedor fantasma + autopago
planilla:calcular + planilla:aprobarPago indebido de remuneraciones
asiento:registrar + periodo:cerrarOcultamiento de errores contables

2.4 Diagrama del modelo de permisos

2.5 Enforcement en Rails

  • Autorización: Pundit con políticas por recurso. Cada policy scope fuerza where(tenant_id: Current.tenant_id); ninguna query de negocio puede emitirse sin tenant en el contexto (Current attributes, set en middleware tras autenticar).
  • Tenant resolution: subdominio (acme.contodo.app) o claim del JWT → set_current_tenant. Mismatch entre tenant del token y del recurso = 403 + alerta de seguridad.
  • Doble candado de DB: además de Pundit, PostgreSQL RLS con current_setting('app.current_tenant') aplicado por conexión, de modo que un bug de lógica de aplicación no basta para filtrar datos de otro tenant.

3. Auditoría: audit log inmutable

AtributoDecisión
Qué se registraLogin/logout, cambios de rol/permiso, CRUD de entidades financieras (CPE, asientos, pagos), accesos a PII (planillas), exportaciones, acciones de super_admin, break-glass.
Esquema del eventoevent_id (uuid), tenant_id, actor_id, actor_ip, action, resource_type, resource_id, before, after (jsonb), request_id, occurred_at, signature
InmutabilidadTabla audit_events append-only: revocado UPDATE/DELETE al rol de la app vía GRANT; trigger que bloquea modificación; encadenamiento hash (cada evento incluye prev_hash → tamper-evidence tipo blockchain ligero).
Almacenamiento secundarioRéplica a S3 con Object Lock (modo Compliance, WORM) + envío a CloudWatch/SIEM. Retención 1 año caliente, 7 años en Glacier (alineado a plazos tributarios SUNAT).
AccesoSolo rol auditor y security; toda lectura del log se audita a su vez (meta-auditoría).

El encadenamiento hash permite detectar manipulación; el S3 Object Lock WORM la previene. Doble garantía deliberada: SOC 2 (CC7.x) e ISO 27001 A.8.15 exigen logs protegidos contra alteración.


4. Cifrado y gestión de llaves

CapaControlDetalle
In-transit (externo)TLS 1.3CloudFront + ACM, HSTS max-age=63072000; includeSubDomains; preload, cifrados modernos, OCSP stapling.
In-transit (interno)TLS / mTLSRDS rds.force_ssl=1; Redis TLS (in-transit encryption); mTLS entre servicios en ECS donde aplique.
At-rest (DB)AES-256 KMSRDS encryption (CMK por entorno); snapshots cifrados.
At-rest (objetos)SSE-KMSS3 con CMK, bucket key habilitado para reducir costo de KMS; sin objetos públicos (Block Public Access ON).
Application-levelCifrado de campoActive Record Encryption (AEAD) para PII y secretos: DNI, CUSPP, cuentas bancarias, claves SOL, certificados .pfx. Cifrado determinístico solo donde se necesita búsqueda exacta; no determinístico por defecto.
SecretosAWS Secrets ManagerCredenciales de DB, claves SUNAT/OSE, tokens de pasarelas; rotación automática; sin secretos en código ni en variables de entorno en claro.
Gestión de llavesAWS KMSCMK por dominio (DB, S3, app); rotación anual automática; políticas de key con separación de funciones; CloudTrail sobre cada uso de llave.

Decisión justificada (alternativa descartada): se evaluó cifrado por-tenant con CMK independiente (BYOK). Se descarta para el MVP por costo operativo de KMS (miles de llaves) y complejidad; se reserva como add-on enterprise para clientes que lo exijan contractualmente. El cifrado a nivel de aplicación sobre PII cubre el riesgo dominante (exposición de la base) sin esa complejidad.


5. Aislamiento de tenants (defensa en profundidad)

Capas: (1) aplicaciónCurrent.tenant_id obligatorio + scopes Pundit; (2) base de datos — RLS por sesión; (3) almacenamiento — prefijos S3 por tenant tenant/<id>/... con políticas IAM/condiciones; (4) jobs — Sidekiq propaga tenant_id en el payload y lo re-establece en Current antes de ejecutar (un job sin tenant aborta). Tests de aislamiento automatizados en CI: cada endpoint se prueba con dos tenants para verificar que A no ve datos de B (regresión cross-tenant es bloqueante de merge).


6. Modelo de amenazas STRIDE

Amenaza (STRIDE)Escenario en ConTodoControl
SpoofingRobo de sesión, suplantación de tenant en JWTMFA/2FA, JWT corto + refresh rotatorio, validación de claim tenant_id, rate-limit en login, detección de credential stuffing
TamperingAlteración de asientos, kardex o audit logRLS, integridad de DB, audit log encadenado por hash + WORM, firmas de payload de webhooks
Repudiation"Yo no aprobé ese pago"Audit log inmutable con actor/IP/request_id, doble control SoD, sello temporal
Information DisclosureFuga cross-tenant, exposición de PII/certificadosAislamiento multicapa, cifrado de campo, S3 sin acceso público, principio de mínimo privilegio
Denial of ServiceAbuso de API, scraping, ataque volumétricoAWS WAF (rate-based rules), CloudFront, autoscaling ECS, límites por tenant (quotas), Shield Standard
Elevation of PrivilegeBug de autorización, IDOR, escalamiento a super_adminPundit deny-by-default, validación SoD en asignación, separación de plano de plataforma vs. tenant, revisión de PR de seguridad

7. Controles OWASP Top 10 (2021)

OWASPRiesgoControl en ConTodo
A01 Broken Access ControlIDOR, salto de tenantPundit deny-by-default + RLS + tests cross-tenant en CI
A02 Cryptographic FailuresPII/secretos expuestosTLS 1.3, KMS, Active Record Encryption, Secrets Manager
A03 InjectionSQLi, XSSActiveRecord parametrizado, escape React por defecto, CSP estricta, strong_params
A04 Insecure DesignFalta de threat modelingSTRIDE, SoD, threat model por epic en diseño
A05 Security MisconfigurationBuckets abiertos, headers laxosIaC (Terraform) revisado, S3 Block Public Access, secure_headers, baseline CIS
A06 Vulnerable ComponentsGema/lib con CVEDependabot, bundler-audit, SCA en CI, SBOM
A07 Identification & Auth FailuresBrute force, sesiones débilesDevise + MFA, lockout, política de contraseñas, refresh rotatorio
A08 Software & Data IntegritySupply chain, deploy maliciosoFirmas de imagen, CI/CD con OIDC (sin llaves estáticas), aprobación de deploy a prod
A09 Logging & Monitoring FailuresAtaque no detectadoAudit log + CloudWatch + alertas + SIEM, runbooks de IR
A10 SSRFWebhooks/integraciones SUNAT abusadasAllowlist de destinos, validación de URL, egress controlado por SG

8. Matriz de riesgos

IDRiesgoProbabilidadImpactoNivelMitigaciónControl / Framework
R01Fuga de datos cross-tenant (IDOR/bug de scope)MediaCríticoAltoRLS + Pundit + tests cross-tenant en CI bloqueantesOWASP A01 / SOC2 CC6.1 / ISO A.5.15
R02Compromiso de certificado digital SUNAT (.pfx) o clave SOLBajaCríticoAltoCifrado de campo + Secrets Manager + acceso mínimo + auditoría de usoISO A.8.24 / Ley 29733
R03Exfiltración de PII de planillas (DNI/CUSPP)MediaAltoAltoCifrado AEAD, RBAC rrhh, masking en logs, DLP en exportacionesLey 29733 / SOC2 CC6.x
R04Escalamiento de privilegios a super_adminBajaCríticoAltoSeparación plano plataforma/tenant, break-glass auditado, MFA obligatorioOWASP A01/STRIDE-E
R05Manipulación del audit log para ocultar fraudeBajaAltoMedioAppend-only + hash chain + S3 Object Lock WORMISO A.8.15 / SOC2 CC7.2
R06Credential stuffing / robo de sesiónAltaAltoAltoMFA, rate-limit, refresh rotatorio, detección de anomalíasOWASP A07
R07Dependencia vulnerable (CVE en gema/npm)AltaMedioMedioDependabot, bundler-audit, SCA en CI, SLA de parcheoOWASP A06
R08Ransomware / pérdida de datosBajaCríticoAltoBackups cifrados PITR, snapshots inmutables, DR cross-AZ, RPO≤5min/RTO≤1hSOC2 A1.2 / ISO A.8.13
R09Misconfiguración de S3 (bucket público)MediaCríticoAltoBlock Public Access org-wide, Config rules, IaC revisadoOWASP A05
R10DoS / abuso de APIMediaMedioMedioWAF rate-limit, quotas por tenant, autoscaling, ShieldOWASP/STRIDE-D
R11Insider malicioso (empleado ConTodo)BajaAltoMedioMínimo privilegio, JIT access, auditoría, background checks, SoDSOC2 CC1.x / ISO A.6.1
R12SSRF vía integraciones SUNAT/OSE/webhooksBajaAltoMedioAllowlist destinos, egress SG, validación URLOWASP A10
R13Incumplimiento Ley 29733 (consentimiento/derechos ARCO)MediaAltoAltoRegistro de tratamiento, flujos ARCO, DPA con subprocesadoresLey 29733
R14Pérdida/rotación fallida de llaves KMSBajaCríticoMedioKMS rotación automática, política multi-administrador, backups de envelopeISO A.8.24

Escala de nivel: combinación probabilidad × impacto. Alto = requiere mitigación antes de GA o compensación documentada. Medio = mitigación planificada con SLA. El riesgo residual aceptado se firma por el responsable de seguridad y se revisa trimestralmente.


9. SOC 2 readiness (Trust Services Criteria)

TSCCriterioEstado de diseño en ConTodo
Security (CC)Control de acceso, gestión de cambios, monitoreoRBAC+RLS, CI/CD con aprobaciones, audit log, SIEM — diseñado
Availability (A)Backups, DR, capacityPITR, multi-AZ, autoscaling, SLA 99.9% — diseñado
Confidentiality (C)Clasificación y cifrado de datos confidencialesCifrado de campo, KMS, controles de acceso — diseñado
Processing Integrity (PI)Procesamiento completo/exactoValidaciones contables, conciliación, idempotencia de jobs — parcial
Privacy (P)Tratamiento de datos personalesFlujos ARCO, registro de tratamiento — en diseño

Camino: (1) política de seguridad de la información y de aceptable use; (2) implementar controles CC6–CC9; (3) Type I (diseño en un punto en el tiempo, ~mes 6); (4) ventana de observación 6–12 meses; (5) Type II (auditoría con evidencia de operación). Plataformas de compliance (Vanta/Drata) automatizan la recolección de evidencia y reducen el esfuerzo manual ~60–70%.

10. ISO/IEC 27001:2022 readiness

FaseEntregable
Alcance del SGSIConTodo SaaS, infraestructura AWS, equipo de ingeniería
LiderazgoPolítica del SGSI aprobada por dirección, roles definidos
Evaluación de riesgosEsta matriz (sección 8) como base del Risk Treatment Plan
Declaración de aplicabilidad (SoA)Mapeo de los 93 controles del Anexo A (4 temas: Organizacional, Personas, Físico, Tecnológico)
Controles claveA.5.15 (acceso), A.8.13 (backup), A.8.15 (logging), A.8.24 (cripto), A.8.28 (codificación segura)
AuditoríaInterna → Certificación Etapa 1 (documental) y Etapa 2 (operación)

ISO 27001 es palanca comercial fuerte en licitaciones públicas peruanas y contratos LATAM; comparte ~80% de controles con SOC 2, por lo que se persiguen en paralelo.


11. Recomendaciones priorizadas

  1. Bloqueante GA: tests de aislamiento cross-tenant en CI + RLS activado (R01).
  2. Bloqueante GA: MFA obligatorio para roles administrativos y manejo seguro de certificados SUNAT (R02, R06).
  3. Mes 1–3: audit log inmutable con hash chain + S3 Object Lock; pipeline DevSecOps (SCA, SAST, dependabot).
  4. Mes 3–6: SOC 2 Type I + arranque del SGSI ISO 27001; flujos ARCO Ley 29733.
  5. Mes 6–12: ventana de observación SOC 2 Type II; pentest externo anual; programa de bug bounty privado.

Conclusión. La seguridad de ConTodo se construye sobre tres pilares no negociables: aislamiento multicapa de tenants (app + RLS + storage), auditoría inmutable y verificable, y cifrado de PII/secretos con gestión de llaves disciplinada. El riesgo dominante de un ERP contable multi-tenant es la fuga cross-tenant; por eso se trata con doble candado y verificación automatizada. La readiness SOC 2 + ISO 27001 no es un fin en sí: es la formalización auditable de controles que, en cualquier caso, este producto necesita para ser vendible a empresas que confían su contabilidad y sus planillas a la nube.