# Plantilla de Zabbix para Cisco MAC Monitor # ========================================== ## Discovery Rule ```xml Cisco MAC Discovery EXTERNAL cisco_mac_discovery.sh 5m Descubre puertos de switches Cisco con direcciones MAC conectadas MAC Count on {#DEVICE_HOSTNAME} port {#PORT_NAME} CALCULATED cisco.mac.count[{#DEVICE_HOSTNAME},{#PORT_NAME}] 0 UNSIGNED {#MAC_COUNT} Número de direcciones MAC en el puerto MAC Addresses on {#DEVICE_HOSTNAME} port {#PORT_NAME} CALCULATED cisco.mac.addresses[{#DEVICE_HOSTNAME},{#PORT_NAME}] 0 TEXT {#MAC_ADDRESSES} Lista de direcciones MAC en formato JSON VLANs on {#DEVICE_HOSTNAME} port {#PORT_NAME} CALCULATED cisco.mac.vlans[{#DEVICE_HOSTNAME},{#PORT_NAME}] 0 TEXT {#VLANS} VLANs presentes en el puerto Last Update {#DEVICE_HOSTNAME} port {#PORT_NAME} CALCULATED cisco.mac.lastupdate[{#DEVICE_HOSTNAME},{#PORT_NAME}] 0 TEXT {#LAST_UPDATE} Timestamp de última actualización {Template Cisco MAC:cisco.mac.count[{#DEVICE_HOSTNAME},{#PORT_NAME}].change()}>0 MAC count changed on {#DEVICE_HOSTNAME} port {#PORT_NAME} INFO El número de direcciones MAC en el puerto ha cambiado {Template Cisco MAC:cisco.mac.count[{#DEVICE_HOSTNAME},{#PORT_NAME}].last()}>5 Too many MACs on {#DEVICE_HOSTNAME} port {#PORT_NAME} WARNING Demasiadas direcciones MAC en un solo puerto (posible loop o hub) {Template Cisco MAC:cisco.mac.addresses[{#DEVICE_HOSTNAME},{#PORT_NAME}].change()}>0 MAC addresses changed on {#DEVICE_HOSTNAME} port {#PORT_NAME} INFO Las direcciones MAC en el puerto han cambiado MAC Count - {#DEVICE_HOSTNAME} {#PORT_NAME} cisco.mac.count[{#DEVICE_HOSTNAME},{#PORT_NAME}] ``` ## Items Adicionales (nivel de host) ```xml Cisco MAC Monitor - Total Devices DEPENDENT cisco.mac.total_devices cisco_mac_discovery.sh JSONPATH $.total_devices Número total de dispositivos monitorizados Cisco MAC Monitor - Total Ports DEPENDENT cisco.mac.total_ports cisco_mac_discovery.sh JSONPATH $.total_ports Número total de puertos con MACs Cisco MAC Monitor - Last Timestamp DEPENDENT cisco.mac.timestamp cisco_mac_discovery.sh JSONPATH $.timestamp Timestamp de la última ejecución ``` ## Triggers de Host ```xml {Template Cisco MAC:cisco.mac.timestamp.nodata(15m)}>0 Cisco MAC Monitor - No data received WARNING No se han recibido datos del monitor MAC en los últimos 15 minutos {Template Cisco MAC:cisco.mac.total_devices.last()}<1 Cisco MAC Monitor - No devices monitored HIGH No hay dispositivos siendo monitorizados ``` ## Macros de Template ```xml {$CISCO.MAC.MAX_PER_PORT} 5 Máximo número de MACs permitidas por puerto {$CISCO.MAC.DATA_TIMEOUT} 15m Timeout para considerar datos obsoletos {$CISCO.MAC.DISCOVERY_INTERVAL} 5m Intervalo de discovery ``` ## Scripts de Actions ### Script para notificaciones con detalles de MACs ```bash #!/bin/bash # Script para enviar detalles de cambios MAC DEVICE="{ALERT.SUBJECT}" PORT="{ITEM.KEY1}" MAC_DATA="{ITEM.VALUE}" # Formatear mensaje MESSAGE=" Cambio detectado en tabla MAC: Dispositivo: ${DEVICE} Puerto: ${PORT} Timestamp: $(date) Direcciones MAC actuales: ${MAC_DATA} " # Enviar notificación (ejemplo con email) echo "${MESSAGE}" | mail -s "Alerta MAC - ${DEVICE}" admin@empresa.com ``` ### Script para análisis de MACs no autorizadas ```python #!/usr/bin/env python3 import json import sys # Cargar lista de MACs autorizadas authorized_macs = { "aa:bb:cc:dd:ee:01": "Servidor Principal", "aa:bb:cc:dd:ee:02": "Workstation Admin", # ... más MACs autorizadas } # Obtener datos del item mac_data = sys.argv[1] if len(sys.argv) > 1 else "{}" try: macs = json.loads(mac_data) unauthorized = [] for mac_entry in macs: mac = mac_entry.get('mac') if mac and mac not in authorized_macs: unauthorized.append({ 'mac': mac, 'vlan': mac_entry.get('vlan'), 'type': mac_entry.get('type') }) if unauthorized: print(f"MACs no autorizadas detectadas: {len(unauthorized)}") for mac in unauthorized: print(f" - {mac['mac']} (VLAN {mac['vlan']})") else: print("Todas las MACs están autorizadas") except Exception as e: print(f"Error procesando datos MAC: {e}") ``` ## Configuración de Web Scenarios ```xml Cisco MAC Monitor Container Health 5m Check Container Status http://localhost:8080/health 200 OK ``` ## Dashboard Widget ```json { "type": "graph", "name": "Cisco MAC Activity", "fields": { "source_type": "1", "itemid": { "cisco.mac.total_ports": "Total Ports with MACs" } } } ``` ## Media Types para Alertas ### Webhook para Slack ```json { "name": "Cisco MAC Slack Alert", "type": "webhook", "parameters": { "url": "https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK", "channel": "#network-alerts", "message": "🚨 Cisco MAC Alert\nDevice: {ALERT.SUBJECT}\nMessage: {ALERT.MESSAGE}\nTime: {DATE} {TIME}" } } ``` ### Webhook para Teams ```json { "name": "Cisco MAC Teams Alert", "type": "webhook", "parameters": { "url": "https://outlook.office.com/webhook/YOUR/TEAMS/WEBHOOK", "title": "Cisco MAC Monitor Alert", "text": "Device: {ALERT.SUBJECT}\\nStatus: {TRIGGER.STATUS}\\nMessage: {ALERT.MESSAGE}" } } ```