CreaRack-SL

Servicio MibAssistant (análisis Gemma 4 con sanitización de prompt injection)

Propósito

MibAssistant (en network/services/mib_assistant.py) integra Gemma 4 (google_genai) para analizar OIDs extraídos de MIBs subidos y proponer categorías:

  • monitoring_oids: para Zabbix/Prometheus (métricas principales)
  • deep_discovery_oids: para SNMP polling profundo (diagnostics, detalle)

Acepta OIDs de MIBs subidos (input no confiable) y los envía al LLM con sanitización de prompt injection (s114).

Funciones principales

analyze_mib_oids(extracted_oids, vendor_name, device_type, sys_descr) → dict

Analiza OIDs extraídos de un MIB custom y propone categorías.

Entrada:

  • extracted_oids: lista de dicts (nombre, OID, tipo, sintaxis)
  • vendor_name: nombre del vendor (para contexto)
  • device_type: tipo de dispositivo (router, switch, etc.)
  • sys_descr: descripción de sistema (opcional, para SNMP fingerprinting)

Salida: dict con:

{
    "monitoring_oids": [
        {"name": "sysUpTime", "oid": "1.3.6.1.2.1.1.3", "category": "uptime"},
        ...
    ],
    "deep_discovery_oids": {
        "interfaces": [
            {"name": "ifInOctets", "oid": "1.3.6.1.2.1.2.2.1.10.1"},
            ...
        ],
        ...
    },
    "analysis": "Explicación texto (para UI)"
}

_format_oid_list(oids) → str

Formatea la lista de OIDs para el prompt de Gemma 4 (limita a 200 OIDs para caber en contexto).

s114 change: Los nombres/sintaxis se encapsulan con wrap_untrusted() (reutiliza sanitize.py de CNS) antes de pasar a la IA:

from monitoring.services.ai_providers.sanitize import wrap_untrusted

oid_list = wrap_untrusted("mib_oids", _format_oid_list(extracted_oids))

wrap_untrusted() marca los datos como “datos, no instrucciones” para que un OID malicioso no pueda inyectar prompts o comandos.

apply_proposal(vendor_slug, proposal) → dict

Aplica la propuesta de análisis al VendorProfile (merge sin sobrescribir OIDs existentes).

s114 robustness: Ahora omite entries sin oid en vez de lanzar KeyError:

for entry in oids:
    oid_value = entry.get("oid") if isinstance(entry, dict) else None
    if oid_value and oid_value not in existing_set:
        existing.append(entry)
        existing_set.add(oid_value)

_fallback_classify(oids, device_type) → dict

Clasificación rule-based cuando Gemma 4 no está disponible (fallback).

Endpoints

Ambos endpoints requieren admin only (s114):

  • POST /api/vendor-profiles/{slug}/mib-assistant/analyze

    • Análisis con Gemma 4 (consume crédito de IA)
    • Requiere: if not is_admin(request.user): return 403
  • POST /api/vendor-profiles/{slug}/mib-assistant/apply

    • Aplica propuesta al VendorProfile
    • Requiere: admin only

Docstrings

s114 corrige la documentación (decía “Gemini Flash”, usa “Gemma 4 (google_genai)”):

  • analyze_mib_oids: “Analyze extracted OIDs using Gemma 4 (google_genai)…”
  • _format_oid_list: “Format extracted OIDs for the Gemma 4 prompt.”
  • _fallback_classify: “Rule-based fallback when Gemma 4 is unavailable.”

Error handling

Previo: except Exception as e: return 400, {"message": f"Analysis failed: {str(e)}"}

Ahora: return 400, {"message": "MIB analysis failed. See server logs for details."}

Evita filtrar detalles internos que podrían ser sensibles.

Véase también

  • [[entity—network—model—custom-mib]]
  • [[entity—network—service—mib-manager]]
  • [[feature—network—sa3-auditoria-vendor-mib]]