Seguridad MQTT

Registro de auditoría MQTT: qué registrar y por qué

Una guía práctica del registro de auditoría MQTT: qué eventos importan para la seguridad y el cumplimiento, qué campos capturar, de dónde salen los logs con un broker MQTT gestionado y cómo montar un pipeline sencillo.

Pipeline de registro de auditoría MQTT con eventos de conexión del broker, fallos de autenticación y acciones administrativas fluyendo hacia un almacén central de logs
Pruébalo en tu propio broker MQTTConsigue un broker MQTT privado y gestionado con el plan Free y empieza con ejemplos de código listos para usar.
Pruébalo gratis Ejemplos de código Sin tarjeta

El registro de auditoría MQTT consiste en anotar quién se conectó, quién no logró conectarse, qué cambió en la configuración y qué acciones fueron relevantes, para poder investigar incidentes y demostrar a los auditores que los controles funcionan. Esta guía explica qué eventos registrar, qué campos necesita cada entrada, cuánto tiempo conservarlos y cómo montar un pipeline de logs alrededor de un broker MQTT gestionado. Se centra en eventos de seguridad y operativos, no en almacenar cada payload.

Logs de auditoría frente a datos de mensajes

Conviene separar tres tipos de registros:

  • Logs de auditoría: eventos relevantes para la seguridad, como logins, logins fallidos, cambios de credenciales y acciones administrativas. Pequeños, estructurados y conservados durante un periodo definido.
  • Logs operativos: caídas de conexión, errores, cuotas alcanzadas y señales de rendimiento que se usan para mantener el sistema en marcha.
  • Historial de mensajes: la propia telemetría, normalmente almacenada en una base de datos de series temporales o un historian para analítica.

Mezclarlos genera problemas. Los archivos de payloads son grandes, pueden contener datos personales o confidenciales y entierran los eventos de seguridad que realmente necesitas durante una investigación. Mantén los logs de auditoría ligeros y centrados.

Qué registrar

Evento Por qué importa Campos clave
Conexión correcta Muestra qué identidad estaba activa, cuándo y desde dónde Marca de tiempo (UTC), client ID, usuario, IP de origen, versión del protocolo, TLS sí/no
Autenticación fallida Detecta intentos de adivinar contraseñas, credenciales filtradas y dispositivos mal configurados Marca de tiempo, usuario intentado, client ID, IP de origen, reason code
Desconexión Explica cortes y secuestros de sesión Marca de tiempo, client ID, reason code, duración de la sesión
Denegación de autorización Muestra clientes que intentan acceder a topics que no les corresponden Client ID, filtro de topic, acción, reason code
Evento de cuota o límite de tasa Identifica dispositivos descontrolados y abusos Client ID, tipo de límite, reason code (por ejemplo 0x97)
Bloqueos de IP Confirma que las defensas automáticas funcionan IP de origen, desencadenante, duración
Ciclo de vida de credenciales Demuestra que el aprovisionamiento, la rotación y la revocación se realizan Identidad, acción, actor, marca de tiempo
Cambios administrativos Quién cambió brokers, planes, reglas de alerta o usuarios Actor, acción, objeto, valor anterior y nuevo
Mensajes de comando En topics de control, quién envió qué comando Topic, identidad del emisor, comando, resultado

La última fila merece atención. La telemetría rara vez necesita una pista de auditoría, pero los comandos que cambian el estado de un equipo a menudo sí. Registra el comando, la identidad que lo envió y el acuse de recibo, no solo el hecho de que pasó un mensaje.

Campos que necesita cada entrada

Sea cual sea la fuente, normaliza las entradas a una estructura coherente:

{
  "ts": "2026-10-16T09:41:07.312Z",
  "event": "client.disconnected",
  "source": "connectmq-monitor",
  "client_id": "gw-plant1-01",
  "username": "gw-plant1-01",
  "ip": "203.0.113.24",
  "reason_code": "0x8E",
  "details": { "previous_state": "connected" }
}

Usa marcas de tiempo UTC con milisegundos, mantén estables los nombres de los eventos y nunca registres contraseñas, tokens ni payloads completos que contengan datos personales.

De dónde salen los eventos

En un entorno autoalojado, los propios archivos de log del broker son la fuente principal. Mosquitto, por ejemplo, registra conexiones, desconexiones y fallos de autenticación cuando se activan las opciones log_type correspondientes, y tú envías esos archivos a un sistema central.

Con un broker MQTT gestionado, combinas lo que expone la plataforma con lo que registran tus propios clientes y aplicaciones. Es importante ser preciso sobre qué es cada cosa. En ConnectMQ las fuentes visibles son:

  • Topics de estado de conexión: $SYS/broker/connection/{clientId}/state indica si un cliente está conectado; puedes suscribirte y registrarlo.
  • Dashboard del portal y vista de dispositivos: visibilidad operativa de los clientes conectados y los topics.
  • Reglas de alerta por umbral y registro de alertas: constancia de cuándo los datos cruzaron los umbrales que definiste.
  • Reason codes de MQTT 5: devueltos a los clientes al rechazarlos, incluido el 0x97 de cuota superada, que tus clientes pueden registrar.
  • Protecciones de la plataforma: la protección contra floods y el bloqueo de IP tras varios logins fallidos se ejecutan en el lado del broker.

Son señales operativas, no una pista de auditoría para cumplimiento normativo. Para una pista de auditoría completa, registra los eventos desde el lado del cliente y de la aplicación en un almacenamiento que controles, y documenta los procedimientos administrativos en tus propios registros de cambios. Es el reparto de responsabilidad compartida habitual en un broker MQTT gestionado: la plataforma opera el broker y tú conservas la pista de auditoría de tus clientes y procesos.

Monta un pipeline de auditoría sencillo

Un pequeño servicio que se suscribe a los topics de estado de conexión y escribe líneas estructuradas en un archivo o en un agente de envío de logs te da un historial de conexiones fiable. Este ejemplo usa paho-mqtt 2.x y vigila una lista conocida de client ID:

import json
import logging
from datetime import datetime, timezone
import paho.mqtt.client as mqtt

WATCHED_CLIENTS = ["gw-plant1-01", "gw-plant1-02", "dashboard-01"]

logging.basicConfig(filename="mqtt-audit.jsonl", level=logging.INFO, format="%(message)s")

def audit(event, **fields):
    entry = {"ts": datetime.now(timezone.utc).isoformat(timespec="milliseconds"),
             "event": event, "source": "connectmq-monitor", **fields}
    logging.info(json.dumps(entry))

def on_connect(client, userdata, flags, reason_code, properties):
    audit("monitor.connected", reason_code=str(reason_code))
    for cid in WATCHED_CLIENTS:
        client.subscribe(f"$SYS/broker/connection/{cid}/state", qos=1)

def on_message(client, userdata, msg):
    cid = msg.topic.split("/")[3]
    audit("client.state", client_id=cid, state=msg.payload.decode("utf-8", "replace"))

def on_disconnect(client, userdata, flags, reason_code, properties):
    audit("monitor.disconnected", reason_code=str(reason_code))

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="YOUR_CLIENT_ID",
                     protocol=mqtt.MQTTv5)
client.username_pw_set("YOUR_USERNAME", "YOUR_PASSWORD")
client.tls_set()
client.on_connect = on_connect
client.on_message = on_message
client.on_disconnect = on_disconnect
client.reconnect_delay_set(min_delay=1, max_delay=60)
client.connect("YOUR_BROKER_HOST", 8883, keepalive=60)
client.loop_forever()

Cualquier agente de envío de logs puede recoger el archivo JSON lines y reenviarlo al SIEM o a la plataforma de logs que ya use tu organización. Observa que el monitor también registra sus propias desconexiones: los huecos en tu pista de auditoría son en sí mismos eventos importantes.

Registra también en el lado del cliente

Los dispositivos y las aplicaciones ven eventos que el broker nunca te comunica, como sus propios intentos de conexión fallidos y las publicaciones rechazadas. Haz que cada cliente registre:

  1. Los intentos de conexión con el reason code resultante.
  2. Las suscripciones rechazadas (códigos SUBACK de 0x80 en adelante).
  3. Las publicaciones rechazadas, especialmente 0x97 de cuota superada y 0x87 de no autorizado.
  4. Los comandos recibidos, los resultados de validación y las acciones realizadas.
  5. Los eventos de rotación de credenciales.

En los gateways de planta, envía estos logs a un recolector central en lugar de guardarlos solo en el dispositivo. La guía de seguridad OT con MQTT explica cómo hacerlo sin abrir puertos de entrada.

Retención, integridad y privacidad

Los logs de auditoría solo son útiles si son completos, fiables y legales de conservar.

  • Retención: fija un periodo según tus necesidades regulatorias, contractuales y de investigación, y documéntalo. Elimina los logs cuando termine ese periodo.
  • Integridad: escribe en almacenamiento de solo anexado o en un sistema que restrinja el borrado, y limita quién puede modificar los logs.
  • Sincronización horaria: usa NTP en cada host que registre; los relojes desfasados hacen inútiles las líneas de tiempo.
  • Privacidad: las direcciones IP y los nombres de usuario pueden ser datos personales. Recoge lo que necesites, protege el acceso y aplica tu política de privacidad.
  • Acceso: registra también el acceso a los propios logs.

Convierte los logs en alertas

Los logs que nadie lee no mejoran la seguridad. Empieza con unas pocas alertas de alto valor:

  1. Muchas autenticaciones fallidas para un usuario o desde una IP en poco tiempo.
  2. Un dispositivo conocido que se conecta desde una red inesperada.
  3. Un gateway desconectado más tiempo que su corte máximo esperado.
  4. Rechazos repetidos por cuota o límite de tasa de un mismo cliente.
  5. Cualquier comando en un topic de control fuera del horario laboral o desde una identidad inesperada.

Estas alertas encajan con las ideas de verificación continua de zero trust para la mensajería IoT y con las expectativas de monitorización de eventos de marcos como IEC 62443.

Checklist de registro de auditoría

  1. Lista definida de eventos de seguridad y responsables de cada fuente.
  2. Estructura JSON coherente con marcas de tiempo UTC.
  3. Estado de conexión monitorizado para cada cliente crítico.
  4. Registro en el cliente de reason codes, rechazos y comandos.
  5. Cambios administrativos registrados en tu proceso de gestión de cambios.
  6. Almacenamiento central con control de acceso y un periodo de retención documentado.
  7. Alertas sobre logins fallidos, desconexiones inesperadas y anomalías de tasa.
  8. Revisión periódica de que el propio pipeline funciona.

Empieza a monitorizar tu broker con ConnectMQ

Crea un broker privado en el plan gratuito Serverless en app.connectmq.com (sin tarjeta de crédito), conecta el monitor anterior con tus credenciales generadas y observa cómo aparecen los eventos de conexión. Si antes quieres experimentar sin credenciales, prueba el servidor MQTT público gratuito, solo con datos de prueba y nunca con datos de producción. El artículo de buenas prácticas de seguridad MQTT cubre los controles que tus logs deberían verificar.

Preguntas frecuentes

¿Debo registrar cada mensaje MQTT para auditoría?

Normalmente no. Registra los eventos de seguridad y administrativos, además de los comandos en topics de control. Guarda la telemetría por separado en un historian o una base de datos si la necesitas para analítica.

¿Cuál es el evento MQTT más importante de auditar?

Los intentos de autenticación fallidos, porque revelan pronto los intentos de adivinar contraseñas, las credenciales filtradas o caducadas y los dispositivos mal configurados.

¿Cuánto tiempo deben conservarse los logs de auditoría MQTT?

No hay una única respuesta. La retención depende de tus requisitos regulatorios, contractuales y de investigación, así que define un periodo, documéntalo y aplica el borrado cuando termine.

¿Puedo obtener eventos de conexión de un broker MQTT gestionado?

En ConnectMQ puedes suscribirte a $SYS/broker/connection/{clientId}/state para conocer el estado de conexión y combinarlo con logs del cliente sobre reason codes para construir tu propio historial de conexiones.

Artículos relacionados

Cómo rotar credenciales MQTT sin tiempo de inactividad

Una estrategia de doble credencial paso a paso para rotar usuarios y contraseñas MQTT en toda una flota: prepara la nueva credencial, cambia con respaldo, verifica y solo entonces revoca la antigua.

8 min de lectura

Todos los artículos →

Tu broker MQTT privado, a unos pocos clics

Crea una cuenta, obtén las credenciales de tu broker y conecta tu primer dispositivo, sin servidores que instalar, parchear ni escalar.