// 03.01 · mar–jun 2025
ENTREGADO
CRONÓMETRO DE PLENOS
Ayuntamiento de Espartinas · prácticas DAM
Aplicación de escritorio en Python con arquitectura MVC (PyQt6) para gestionar los tiempos de intervención en plenos municipales. Doble ventana: visualización en pantalla completa para proyector y panel de control del operador. Cronómetros por grupo político con logos, cuenta atrás con alarma sonora, paso automático a tiempo excedido, sincronización en cascada entre turnos y atajos de teclado. Configuración persistente en JSON para plenos ordinarios y extraordinarios.
PythonPyQt6pygameMVCJSON
pleno ordinario · Ayto. Espartinas
┌─────────────────────────────────────┐
│ GRUPO A 05:42 ▓▓▓▓▓░ en curso │
│ GRUPO B 02:11 ▓▓▒░░░ en curso │
│ GRUPO C 00:00 ██████ EXCEDIDO │
│ GRUPO D 04:00 ░░░░░░ en espera │
└─────────────────────────────────────┘
[viz] pantalla completa · [ctrl] operador
// 03.02 · 2024–2025
TFG
FRICHAT · FRONTEND
TFG DAM · IES El Majuelo
Frontend de una aplicación de mensajería en tiempo real inspirada en Discord, desarrollada como TFG del grado DAM. SPA sin router: máquina de estados con useState en App. Componentes separados por dominio (Auth, InterfazChat) con lógica de red encapsulada en custom hooks. Chat en tiempo real con WebSocket nativo del navegador. Diseño tipo Discord: sidebar de contactos, área de chat y barra de usuario con cierre de sesión.
React 19ViteJSXWebSocketCustom Hooks
App
+-- Auth/
| +-- FormularioAuth <-- base reutilizable
| +-- Login <-- hook: useLogin
| +-- Register <-- hook: useRegister
+-- InterfazChat/
+-- Menu <-- barra superior · logout
+-- Contactos <-- lista + agregar contactos
+-- Chat <-- WebSocket nativo · RT
// 03.03 · 2024–2025
TFG
FRICHAT · BACKEND
TFG DAM · IES El Majuelo
API REST y servidor WebSocket para Frichat. FastAPI sobre MySQL con SQLAlchemy ORM. Registro con hash bcrypt, autenticación por correo y contraseña, gestión de contactos bidireccional con deduplicación por IDs ordenados. Enrutamiento de mensajes en tiempo real: el servidor mantiene un dict de conexiones activas y reenvía el JSON al destinatario si está conectado.
PythonFastAPISQLAlchemyMySQLWebSocketbcrypt
FastAPI
+-- /registro/ POST --> bcrypt hash + INSERT
+-- /login/ POST --> bcrypt.verify
+-- /contactos/ POST --> listar por usuario
+-- /agregar/ POST --> sorted(id1,id2) dedup
+-- /ws/{nombre} WS --> routing RT en memoria
MySQL: usuarios(id, nombre, correo, hash, admin)
contactos(id1 FK, id2 FK) clave compuesta
// 03.04 · 2025
DESPLEGADO
PORTFOLIO PERSONAL
Proyecto personal · ivanbatista.dev
Portfolio con estética terminal escrito en HTML5, CSS3 y JavaScript vanilla. CSS de más de 3 200 líneas con variables, animaciones y diseño responsive. JS con Three.js (globo 3D), GSAP + ScrollTrigger (animaciones de scroll) y VanillaTilt (profundidad en tarjetas). Dominio propio comprado en Squarespace, DNS gestionado en Cloudflare y desplegado en Cloudflare Pages con CI/CD automático en cada push a main.
HTML5CSS3JavaScriptThree.jsGSAPCloudflare PagesSquarespace DNS
dominio → ivanbatista.dev (Squarespace)
dns → Cloudflare
deploy → git push → Cloudflare Pages CI/CD
stack → Three.js · GSAP · VanillaTilt
css → 3 200+ líneas · responsive
// 03.05 · 2025–2026
TFM
ZERO TRUST ARCHITECTURE · TFM
Máster Ciberseguridad · EUSA — Universidad de Sevilla
Diseño e implantación de una arquitectura Zero Trust sobre laboratorio de 4 VMs interconectadas por túnel WireGuard. Nginx como PEP con oauth2-proxy, autenticación JWT+TOTP vía Keycloak y gestión de secretos con HashiCorp Vault. Simulación de 5 escenarios de ataque reales: tasa de detección 80 % (Wazuh 4.14.5 + Snort 2).
WazuhKeycloakVaultNginxSnortDockerWireGuard
Zero Trust flow:
Firefox → Nginx PEP → oauth2-proxy → Keycloak (JWT+TOTP) → webapp
Attack simulation (10/05/2026 · 4 VMs · WireGuard lab)
Hydra SSH → fail2ban block 8 attempts ~10 s ✓
Keycloak BF → blocked 5 attempts <1 s ✓
Nmap recon → Snort [1:469] <1 s ✓
LinPEAS (FIM) → Wazuh /tmp detected <2 s ✓
Data exfiltration → egress gap NOT DET ✗
Detection 80 % · Wazuh 4.14.5 · 3 agents active
// 03.06 · feb 2026
ENTREGADO
LOGCLASSIFIER · IDS
Normativa de Ciberseguridad · Máster EUSA
Sistema IDS basado en reglas inspirado en Fail2Ban. Pipeline de 5 módulos: ingesta de logs en tiempo real, motor de expresiones regulares que evalúa cada línea contra reglas YAML, correlación temporal con ventana deslizante por IP, módulo de respuesta (bloqueo real vía iptables o modo simulación) y sistema de alertas con registro en fichero. Extensible sin tocar código: añadir una nueva regla de detección es sólo escribir un fichero YAML.
PythonPyYAMLDockerpytestiptablesRegex
log/*.log --> [Ingesta] --> [Motor Reglas] --> [Correlacion]
(regex + YAML) (ventana deslizante)
|
[Respuesta]
bloquear_ip | alertar
modo: real | simulacion
|
[Alertas]
consola + alertas.log
// 03.07 · jun 2026
ACTIVO
PULPO · IDS/IPS MONITOR
Proyecto personal · inspirado conceptualmente en LogClassifier
Dashboard SOC construido con Electron + React sobre un backend FastAPI + SQLite. LogClassifier detecta ataques mediante 14 reglas YAML (SSH, SQLi, XSS, path traversal, command injection, HTTP flood, scanner UA…) y los persiste en base de datos. La API REST expone los datos al dashboard y un WebSocket emite cada alerta en tiempo real sin polling. El IDS arranca automáticamente como servicio systemd. El dashboard incluye filtros por tipo y severidad, gráficos de actividad, distribución por severidad y top de reglas con datos históricos completos de la BD.
ElectronReactTypeScriptFastAPISQLiteWebSocketPythonRecharts
logs/*.log → [LogClassifier · 14 reglas YAML] → SQLite (pulpo.db)
SSH · SQLi · XSS · Traversal │
CmdInject · Flood · ScannerUA [FastAPI :8080]
REST + WebSocket
│
[Dashboard · Electron]
Filtros · Timeline
Donut · Top Reglas
Acknowledge · CSV