[ Volver a la página principal ]
Fecha: Octubre 2026
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
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.
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
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}")
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