CreaRack-SL

Incident: RLS-gap en 3 tablas nuevas (AIInsight, AIInsightAuditLog, VictoriaMetrics ingest)

Resumen

Durante la auditoria 2026-07 (FASE 0), se identificó que tres tablas nuevas carecen de Row Level Security (RLS) configurado en PostgreSQL:

  1. AIInsight (monitoring/models_insight.py)
  2. AIInsightAuditLog (monitoring/models_insight.py)
  3. Tabla de ingestión de VictoriaMetrics (métricas crudas)

Sin RLS, usuarios de una organización podrían acceder a datos de otra organización si atraviesan la API o explotan consultas directas.

Severidad: MEDIA (requiere acceso a BD o API no validada; RLS es defensa en profundidad).

Estado: DRAFT — en remediación (FASE 1a).

Detalles Técnicos

AIInsight

Modelo: monitoring.models_insight.AIInsight

Relación con tenant:

class AIInsight(models.Model):
    monitoring_target = models.ForeignKey(MonitoringTarget, ...)
    # MonitoringTarget.organization → FK indirecto

RLS necesaria: WHERE organization_id = current_user.organization_id (vía MonitoringTarget.organization).

Estado actual: Sin RLS en BD.

AIInsightAuditLog

Modelo: monitoring.models_insight.AIInsightAuditLog

Relación con tenant:

class AIInsightAuditLog(models.Model):
    ai_insight = models.ForeignKey(AIInsight, ...)

RLS necesaria: Cascada desde AIInsight (mediante ai_insight.monitoring_target.organization).

Estado actual: Sin RLS en BD.

VictoriaMetrics Ingest

Contexto: Tabla interna (o stream directo a VictoriaMetrics) que recibe métricas crudas del agente.

Problema: Sin allowlist de nombres de agente, la tabla crece sin límite cardinal (high cardinality → degradación de almacenamiento).

RLS: Aunque VictoriaMetrics es externa, la tabla de ingestión en Postgres debe validar que el agente pertenece a la org del usuario.

Estado actual: Sin validación en BD, se confía en nivel de aplicación.

Remediación

Fase 1a (esta semana)

  1. AIInsight + AIInsightAuditLog:

    • Crear policy RLS en la BD.
    • Django: no cambio en ORM (las policies se aplican a nivel de conexión BD).
    • Tests: verificar que User.A no ve AIInsight de Org.B.
  2. VictoriaMetrics ingest:

    • Agregar allowlist de nombres de agente (configurable por org).
    • Validar en modelo/señal que el agente existe en Organization.agent_set.

Verificación

  • Ejecutar SELECT * FROM monitoring_aiinsight WHERE organization_id != current_user.organization_id → debe devolver 0 filas.
  • Test: crear AIInsight en Org A, loginear como User B (Org B), intentar GET /api/insights/ → debe 404.

Referencias

  • [[decision—20260403—multi-tenancy-rls]] — política RLS general.
  • [[concept—saas—multi-tenancy]] — fundamentos.
  • [[decision—20260710—auditoria-2026-07-fase-1]] — contexto de la auditoria.

Véase también

  • [[decision—20260403—multi-tenancy-rls]]
  • [[concept—saas—multi-tenancy]]
  • [[decision—20260710—auditoria-2026-07-fase-1]]
  • [[incident—20260710—daphne-cves-pysec-2026-213-214]]