[ Volver a la página principal ]

Proyecto 4: Telemetria IoT - Tambo Caprino


Fecha: Octubre 2026

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

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

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

l 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