← Proyectos

Telemetría IoT — Tambo Caprino

  • 2 min de lectura
  • IoT

Sistema de telemetría para un tambo caprino con sensores simulados, broker MQTT y PostgreSQL, protegido con UFW, Fail2Ban y Wazuh.

En esta página

1. Descripción

El objetivo de este proyecto es diseñar, orquestar y fortificar una infraestructura de microservicios orientada a eventos para el sector AgTech. Específicamente, se simula el sistema de telemetría de un tambo caprino inteligente, garantizando la trazabilidad de la producción y la seguridad del entorno industrial (OT).

El ecosistema abarca desde la simulación de sensores IoT que emiten datos en tiempo real (litros y temperatura de la leche), pasando por un bus de mensajería asíncrono, hasta un servicio backend que ingesta los datos en una base de datos relacional. Todo el servidor está resguardado por políticas estrictas de firewall, prevención de intrusiones y auditoría HIDS.

2. Tecnologías y Herramientas Utilizadas

  • Infraestructura y Orquestación: Ubuntu Server ARM64, Docker, Docker Compose.
  • IoT y Mensajería: Eclipse Mosquitto (Broker MQTT), scripts en Python.
  • Backend y Persistencia: Python (paho-mqtt, psycopg2), PostgreSQL.
  • Ciberseguridad (SOC): Autenticación asimétrica (SSH Ed25519), UFW (Firewall), Fail2Ban, Wazuh Agent (HIDS).

3. Arquitectura del Sistema y Flujo de Datos

La arquitectura se diseñó bajo el principio de menor privilegio y aislamiento de redes. Los contenedores del broker MQTT y la base de datos se comunican mediante una red privada virtual de Docker (bridge), sin exponer la base de datos a internet.

Topología lógica del sistema de telemetría IoT para el tambo caprino
Topología lógica del sistema de telemetría IoT para el tambo caprino

4. Infraestructura como Código

Para garantizar la portabilidad y el rápido despliegue, los servicios centrales se empaquetaron utilizando Docker Compose. Se definieron volúmenes persistentes para proteger el historial de producción ante reinicios del contenedor.

services:
  mqtt-broker:
    image: eclipse-mosquitto:latest
    container_name: tambo-mqtt
    ports:
      - "1883:1883"
    volumes:
      - ./mosquitto/config/mosquitto.conf:/mosquitto/config/mosquitto.conf
    restart: unless-stopped
    networks:
      - tambo_red

  db-postgres:
    image: postgres:15-alpine
    container_name: tambo-db
    environment:
      POSTGRES_USER: admin_tambo
      POSTGRES_PASSWORD: superpassword123
      POSTGRES_DB: tambo_metrics
    volumes:
      - tambo_pgdata:/var/lib/postgresql/data
    restart: unless-stopped
    networks:
      - tambo_red

5. Ingesta de Datos

Debido a que el broker MQTT no almacena información, se desarrolló un servicio de ingesta (Worker) en Python. Este script actúa como puente: se suscribe al topic de ordeñe, decodifica el payload JSON emitido por los sensores y ejecuta consultas parametrizadas para inyectar los datos en PostgreSQL de forma segura, mitigando riesgos de inyección SQL.

def guardar_en_db(id_cabra, litros, temperatura):
    try:
        conn = psycopg2.connect(host=DB_HOST, database=DB_NAME, user=DB_USER, password=DB_PASS)
        cur = conn.cursor()

        query = """
            INSERT INTO mediciones_ordene (id_cabra, litros_leche, temperatura_leche_c)
            VALUES (%s, %s, %s);
        """
        cur.execute(query, (id_cabra, litros, temperatura))
        conn.commit()
    except Exception as e:
        print(f"Error al guardar: {e}")

6. Hardening y Monitoreo de Seguridad

El servidor base fue fortificado deshabilitando la autenticación por contraseña en SSH y configurando UFW para permitir exclusivamente el tráfico a los puertos 22 (SSH) y 1883 (MQTT). Fail2Ban se integró para bloquear dinámicamente ataques de fuerza bruta.

Para validar la eficacia del HIDS, se inyectó una puerta trasera creando un usuario no autorizado en el sistema (useradd -m intruso). El agente de Wazuh, operando en segundo plano y analizando el archivo auth.log, registró inmediatamente la anomalía, permitiendo al Blue Team aislar el evento y erradicar la amenaza.

# Auditoría de logs crudos rastreando el artefacto del atacante
sudo grep -a -i "intruso" /var/log/auth.log

# Salida del sistema confirmando la intrusión
2026-10-02T20:27:21.295914+00:00 tambo-srv useradd[24872]: new user: name=intruso, UID=1001, GID=1001, home=/home/intruso, shell=/bin/sh