Resumen
Durante la auditoria 2026-07 (FASE 0), se identificó que tres tablas nuevas carecen de Row Level Security (RLS) configurado en PostgreSQL:
- AIInsight (monitoring/models_insight.py)
- AIInsightAuditLog (monitoring/models_insight.py)
- 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)
-
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.Ano veAIInsightdeOrg.B.
-
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]]
Referenciado desde
- Auditoria 2026-07 Fase 1: Seguridad, Rendimiento y Calidad
- Incident: Daphne CVEs PYSEC-2026-213 (DoS) y PYSEC-2026-214 (Header Injection)
- Incident: tareas Huey (purga, integridad, monitor de conexiones) corrían sin RLS — inertes en PROD
- Servidor MCP de CreaRack: asistentes de IA consultan WiFi y estado de equipos con la cuenta del usuario (entrega 1, v1.173.0)