Un sistema completo de análisis de logs de seguridad (SIEM) construido con Flask que permite ingesta, almacenamiento, visualización y análisis inteligente de eventos de seguridad mediante Inteligencia Artificial.
- Descripción
- Características Principales
- Tecnologías Utilizadas
- Requisitos Previos
- Instalación
- Configuración
- Uso
- Estructura del Proyecto
- API Endpoints
- Funcionalidades de IA
- Simulador de Logs
- Seguridad
- Troubleshooting
- Contribuciones
SIEM Analyzer es una aplicación web completa diseñada para analizar y gestionar logs de seguridad en tiempo real. El sistema permite:
- Ingesta de Logs: Carga archivos JSON con eventos de seguridad
- Almacenamiento Persistente: Base de datos SQLite con deduplicación automática
- Visualización en Tiempo Real: Dashboard interactivo con gráficos y tablas
- Análisis con IA: Explicaciones automáticas de alertas usando modelos locales (Ollama)
- Autenticación de Usuarios: Sistema de login seguro con Flask-Login
- Simulación de Eventos: Herramienta para generar logs de prueba
- Sistema de autenticación con Flask-Login
- Contraseñas cifradas con Werkzeug
- Protección de rutas con decoradores
@login_required - Validación de formularios con WTForms
- Tema SB Admin 2: Diseño moderno y profesional basado en Bootstrap 4
- Layout Responsivo: Barra lateral colapsable y barra superior de navegación
- Modo Oscuro/Claro: Estilos optimizados para legibilidad
- Dashboard en Tiempo Real: Actualización automática cada 5 segundos
- Búsqueda Global: Filtrado instantáneo de logs por IP, mensaje o nivel
- Paginación Avanzada:
- Selector de tamaño de página (10, 25, 50, 100)
- Navegación rápida (Primero, Anterior, Siguiente, Último)
- Gráficos Interactivos:
- Gráfico de tarta para distribución por nivel
- Gráfico de barras para Top 5 IPs más activas
- Código de Colores: Alertas visuales para niveles ERROR y WARN
- Integración con Ollama (modelo phi3:mini)
- Análisis automático de alertas de seguridad
- Sugerencias de mitigación e investigación
- Interfaz modal para consultas de IA
Sistema de detección de patrones y amenazas similar a CrowdStrike, que analiza logs para identificar comportamientos sospechosos
Patrones de Detección:
- Fuerza Bruta: Múltiples intentos fallidos de autenticación (5+ eventos)
- Severidad CRITICAL: 10+ intentos | HIGH: 7-9 | MEDIUM: 5-6
- Escaneo de Puertos: Acceso a múltiples puertos desde misma IP (5+ puertos)
- Severidad HIGH: 10+ puertos | MEDIUM: 5-9
- IP Sospechosa: Actividad anormalmente alta (15+ eventos ERROR/WARN)
- Severidad HIGH: 30+ eventos | MEDIUM: 15-29
- Anomalía Temporal: Volumen inusual en periodo corto (20+ eventos)
Características:
-
Análisis automático de logs de últimas 24 horas
-
Agrupación inteligente por IP origen
-
Deduplicación de correlaciones similares
-
Estados: ACTIVE, RESOLVED, FALSE_POSITIVE
-
Interfaz con filtros por severidad, tipo y estado
-
Drill-down a logs relacionados
-
Exportación de reportes
- Deduplicación Automática: Hash SHA-256 para evitar logs duplicados
- Base de Datos SQLite: Almacenamiento persistente y eficiente
- Análisis con Pandas: Estadísticas avanzadas sobre los logs
- Carga Masiva: Procesamiento de múltiples logs en un solo archivo JSON
- Flask 2.x: Framework web de Python
- Flask-SQLAlchemy: ORM para gestión de base de datos
- Flask-Login: Manejo de sesiones de usuario
- Flask-WTF: Protección CSRF y formularios
- Werkzeug: Utilidades de seguridad (hash de contraseñas)
- Pandas: Análisis de datos y estadísticas
- Ollama: Integración con modelos de IA locales
- SB Admin 2: Tema administrativo basado en Bootstrap 4
- HTML5/CSS3: Estructura y estilos personalizados
- JavaScript (jQuery): Lógica del cliente y manipulación del DOM
- Chart.js 2.9.4: Visualización de gráficos (versión compatible con SB Admin 2)
- Jinja2: Motor de plantillas de Flask
- SQLite: Base de datos relacional ligera
Antes de instalar la aplicación, asegúrate de tener:
- Python 3.8+ instalado en tu sistema
- Ollama instalado y corriendo (para funcionalidades de IA)
- Descarga desde: https://ollama.ai
- Modelo requerido:
phi3:mini - Instalación del modelo:
ollama pull phi3:mini
cd /ruta/a/tu/proyectopython3 -m venv .venv
source .venv/bin/activate # En Windows: venv\Scripts\activateCrea un archivo requirements.txt con las siguientes dependencias:
Flask==3.0.0
Flask-SQLAlchemy==3.1.1
Flask-Login==0.6.3
Flask-WTF==1.2.1
WTForms==3.1.1
Werkzeug==3.0.1
pandas==2.1.4
ollama==0.1.7Luego instala:
pip install -r requirements.txtpython3 -c "from app import app, db; app.app_context().push(); db.create_all()"python3 -c "
from app import app, db, User
with app.app_context():
admin = User(username='admin')
admin.set_password('admin123')
db.session.add(admin)
db.session.commit()
print('Usuario admin creado con contraseña: admin123')
"IMPORTANTE: Cambia la clave secreta en app.py antes de usar en producción:
# Genera una nueva clave secreta:
python3 -c 'import os; print(os.urandom(24).hex())'
# Reemplaza en app.py línea 38:
app.config['SECRET_KEY'] = 'TU_CLAVE_GENERADA_AQUI'Asegúrate de que Ollama esté corriendo:
# Verificar que Ollama está corriendo
ollama list
# Si no tienes el modelo phi3:mini, instálalo:
ollama pull phi3:minipython3 app.pyEl servidor estará disponible en: http://localhost:5000
- Abre tu navegador y ve a
http://localhost:5000 - Serás redirigido a la página de login
- Inicia sesión con las credenciales creadas (por defecto:
admin/admin123)
- Visualiza logs en tiempo real
- Consulta estadísticas actualizadas
- Navega entre páginas de logs
- Analiza alertas con IA
- Ve a la sección "Subir Logs" en el menú
- Selecciona un archivo JSON con el siguiente formato:
[
{
"timestamp": "2024-01-15T10:30:00",
"ip": "192.168.1.100",
"nivel": "ERROR",
"mensaje": "Fallo de autenticación"
},
{
"timestamp": "2024-01-15T10:31:00",
"ip": "10.0.0.5",
"nivel": "WARN",
"mensaje": "Intento de acceso a puerto 8080"
}
]- Haz clic en "Subir"
- El sistema procesará los logs y mostrará cuántos fueron añadidos y cuántos duplicados fueron ignorados
- En el dashboard, busca logs con nivel ERROR o WARN
- Haz clic en el botón "🤖 IA" junto al log
- Se abrirá un modal con la explicación generada por la IA
- La IA proporcionará:
- Explicación del evento en lenguaje simple
- Sugerencia de acción de mitigación o investigación
- Ve a "Correlación de Eventos" en el menú lateral
- Haz clic en "Analizar Ahora" para ejecutar el análisis
- El sistema detectará patrones en los logs de las últimas 24 horas
- Revisa las correlaciones detectadas:
- Filtrar: Por estado (Activas/Resueltas), severidad (Crítica/Alta/Media) o tipo
- Ver Detalles: Click en "Ver Detalles" para información completa
- Gestionar: Marca como "Resueltas" o "Falso Positivo"
- Cada correlación muestra:
- Tipo de patrón detectado
- IP origen
- Número de eventos relacionados
- Severidad automática
- Periodo de tiempo (primer y último evento)
- IDs de logs relacionados
python-siem-analyzer/ │ ├── app.py # Aplicación principal Flask ├── simulador.py # Simulador de logs en tiempo real ├── debug_api.py # Script para probar endpoints de la API ├── debug_db.py # Script para inspeccionar la base de datos ├── requirements.txt # Dependencias del proyecto ├── README.md # Documentación del proyecto │ ├── instance/ │ └── users.db # Base de datos SQLite │ ├── static/ │ ├── css/ │ │ ├── sb-admin-2.min.css # Estilos del tema SB Admin 2 │ │ └── style.css # Estilos personalizados │ └── js/ │ └── sb-admin-2.min.js # Scripts del tema SB Admin 2 │ └── templates/ ├── base.html # Plantilla base con navegación ├── index.html # Dashboard principal ├── login.html # Página de inicio de sesión └── upload.html # Página de carga de archivos
GET /login- Página de inicio de sesiónPOST /login- Procesar credencialesGET /logout- Cerrar sesión
GET /- Dashboard principal (requiere autenticación)
-
GET /api/logs?page=1&per_page=10- Obtener logs paginados- Parámetros:
page: Número de página (default: 1)per_page: Logs por página (default: 10)
- Respuesta:
{ "logs": [...], "current_page": 1, "total_pages": 5, "total_logs": 50 }
- Parámetros:
-
GET /api/stats- Obtener estadísticas- Respuesta:
{ "total_logs": 150, "conteo_por_nivel": { "ERROR": 25, "WARN": 30, "INFO": 95 }, "top_5_ips": { "192.168.1.100": 45, "10.0.0.5": 32 } }
- Respuesta:
-
POST /api/explain- Analizar log con IA- Body:
{ "mensaje": "Fallo de autenticación desde 192.168.1.100" } - Respuesta:
{ "explicacion": "Este evento indica un intento fallido de autenticación..." }
- Body:
GET /upload- Página de carga de archivosPOST /upload- Procesar archivo JSON subido
-
GET /correlations- Página de correlaciones (requiere autenticación) -
GET /api/correlations- Obtener correlaciones detectadas- Parámetros:
status: Estado (ACTIVE, RESOLVED, FALSE_POSITIVE, ALL)severity: Severidad (CRITICAL, HIGH, MEDIUM, LOW)type: Tipo (brute_force, port_scan, suspicious_ip, time_anomaly)
- Respuesta:
{ "correlations": [ { "id": 1, "correlation_type": "brute_force", "source_ip": "192.168.1.100", "event_count": 12, "severity": "CRITICAL", "first_seen": "2025-01-21T10:00:00", "last_seen": "2025-01-21T10:15:00", "description": "Detectados 12 intentos fallidos...", "related_log_ids": [1, 2, 3, ...], "status": "ACTIVE" } ], "total": 5 }
- Parámetros:
-
POST /api/correlations/analyze- Ejecutar análisis de correlación manual- Respuesta:
{ "message": "Análisis completado. 5 correlaciones detectadas/actualizadas.", "detected": 5, "saved": 5 }
- Respuesta:
-
PUT /api/correlations/<id>/status- Actualizar estado de correlación- Body:
{ "status": "RESOLVED" }
- Body:
La aplicación utiliza Ollama con el modelo phi3:mini, un modelo ligero y eficiente que corre localmente.
El sistema utiliza ingeniería de prompts para obtener respuestas útiles:
- Rol: Analista experto en ciberseguridad (SOC Nivel 3)
- Audiencia: Analista junior (Nivel 1)
- Tarea: Explicar alertas y sugerir acciones
- Ollama debe estar corriendo en el sistema
- El modelo
phi3:minidebe estar descargado - Conexión local (no requiere internet)
El archivo simulador.py permite generar logs de prueba en tiempo real.
# En una terminal separada (mientras app.py está corriendo)
python3 simulador.py- Genera logs aleatorios cada 2-5 segundos
- Simula diferentes niveles (INFO, WARN, ERROR)
- Usa IPs predefinidas para simular tráfico real
- Los logs se guardan directamente en la base de datos
- Presiona
Ctrl+Cpara detener
- INFO: Conexiones exitosas, backups, actualizaciones
- WARN: Intentos de acceso a puertos, alto uso de CPU
- ERROR: Fallos de autenticación, servicios caídos
-
Autenticación de Usuarios
- Contraseñas cifradas con hash bcrypt
- Sesiones gestionadas por Flask-Login
- Protección de rutas sensibles
-
Validación de Entrada
- WTForms para validación de formularios
- Sanitización de nombres de archivo
- Validación de formato JSON
-
Deduplicación
- Hash SHA-256 para prevenir logs duplicados
- Índices en base de datos para búsquedas rápidas
-
Protección CSRF
- Flask-WTF con tokens CSRF (configurable)
⚠️ Cambiar la SECRET_KEY antes de desplegar⚠️ Usar una base de datos más robusta (PostgreSQL, MySQL)⚠️ Implementar HTTPS⚠️ Configurar rate limiting⚠️ Añadir logging de seguridad⚠️ Implementar rotación de logs⚠️ Usar variables de entorno para configuración sensible
Solución: Verifica que Ollama esté corriendo:
ollama list
ollama serve # Si no está corriendoSolución: Crea un nuevo usuario o verifica las credenciales:
python3 -c "from app import app, db, User; app.app_context().push(); u = User(username='test'); u.set_password('test123'); db.session.add(u); db.session.commit()"Solución: Verifica el formato del JSON. Debe ser un array de objetos con las claves: timestamp, ip, nivel, mensaje.
Solución: Crea manualmente la carpeta instance y ejecuta:
python3 -c "from app import app, db; app.app_context().push(); db.create_all()"Solución: Verifica la conexión a internet (Chart.js se carga desde CDN) o descarga Chart.js localmente.
Las contribuciones son bienvenidas. Para contribuir:
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Este proyecto es de código abierto y está disponible bajo la licencia MIT.
Desarrollado por Rafael Pérez
- LinkedIn: [https://www.linkedin.com/in/rperezll/]
- GitHub: [https://github.com/leafar1087]
Desarrollado como proyecto educativo de análisis SIEM con Python y Flask.
Nota: Este es un proyecto educativo. Para uso en producción, implementa medidas de seguridad adicionales y realiza auditorías de seguridad.