En este tutorial, construiremos un sistema de análisis de registros SIEM simplificado y con sabor a IA utilizando Python. Nuestro enfoque estará en el análisis de registros y la detección de anomalías.

Recorreremos el proceso de ingestión de registros, detección de anomalías con un modelo de aprendizaje automático ligero, e incluso tocaremos cómo el sistema podría responder automáticamente.

Esta prueba de concepto práctica ilustrará cómo la IA puede mejorar la supervisión de seguridad de manera práctica y accesible.

Tabla de Contenidos

¿Qué son los sistemas SIEM?

Los sistemas de Gestión de la Información y Eventos de Seguridad (SIEM) son el sistema nervioso central de las operaciones de seguridad modernas. Un SIEM recopila y correlaciona registros y eventos de seguridad de todo un entorno de TI para proporcionar información en tiempo real sobre posibles incidentes. Esto ayuda a las organizaciones a detectar amenazas más rápido y a responder más pronto.

Estos sistemas reúnen grandes volúmenes de datos de registros, desde alertas de firewall hasta registros de aplicaciones, y los analizan en busca de signos de problemas. La detección de anomalías en este contexto es crucial, y patrones inusuales en los registros pueden revelar incidentes que podrían pasar desapercibidos para las reglas estáticas. Por ejemplo, un aumento repentino en las solicitudes de red podría indicar un ataque de denegación de servicio (DDoS), mientras que varios intentos fallidos de inicio de sesión podrían señalar intentos de acceso no autorizado.

La IA lleva las capacidades de SIEM un paso más allá. Al aprovechar modelos de IA avanzados (como los modelos de lenguaje grande), un SIEM potenciado por IA puede analizar e interpretar registros de manera inteligente, aprender cómo se ve un comportamiento “normal” y señalar las cosas “raras” que merecen atención.

En esencia, la IA puede actuar como un copiloto inteligente para los analistas, detectando anomalías sutiles e incluso resumiendo hallazgos en un lenguaje claro. Los recientes avances en modelos de lenguaje grande permiten a los SIEM razonar sobre innumerables puntos de datos de manera similar a como lo haría un analista humano, pero con una velocidad y escala mucho mayores. El resultado es un asistente de seguridad digital poderoso que ayuda a filtrar el ruido y centrarse en amenazas reales.

Requisitos previos

Antes de comenzar, asegúrate de tener lo siguiente:

  • Python 3.x instalado en tu sistema. Los ejemplos de código deberían funcionar en cualquier versión reciente de Python.

  • Un conocimiento básico de programación en Python (bucles, funciones, uso de bibliotecas) y una comprensión de los registros (por ejemplo, cómo se ve una entrada de registro) serán útiles.

  • Bibliotecas de Python: Usaremos algunas bibliotecas comunes que son ligeras y no requieren hardware especial:

    • pandas para el manejo básico de datos (si tus registros están en formato CSV o similar).

    • numpy para operaciones numéricas.

    • scikit-learn para el modelo de detección de anomalías (específicamente, usaremos el algoritmo IsolationForest).

  • Un conjunto de datos de registro para analizar. Puedes usar cualquier archivo de registro (registros del sistema, registros de aplicaciones, etc.) en formato de texto plano o CSV. Para la demostración, simularemos un pequeño conjunto de datos de registro para que puedas seguir aunque no tengas un archivo de registro listo.

Nota: Si no tienes las bibliotecas mencionadas arriba, instálalas a través de pip:

pip install pandas numpy scikit-learn

Configuración del Proyecto

Configuraremos una estructura de proyecto simple. Crea un nuevo directorio para este proyecto de detección de anomalías SIEM y navega hacia él. Dentro, puedes tener un script de Python (por ejemplo, siem_anomaly_demo.py) o un Cuaderno Jupyter para ejecutar el código paso a paso.

Asegúrate de que tu directorio de trabajo contenga o pueda acceder a tus datos de registro. Si estás usando un archivo de registro, podría ser una buena idea colocar una copia en esta carpeta del proyecto. Para nuestra prueba de concepto, como generaremos datos de registro sintéticos, no necesitaremos un archivo externo, pero en un escenario real sí lo necesitarías.

Pasos de configuración del proyecto:

  1. Inicializar el entorno – Si lo prefieres, crea un entorno virtual para este proyecto (opcional pero buena práctica):

     python -m venv venv
     source venv/bin/activate  # En Windows usa "venv\Scripts\activate"
    

    Luego instala los paquetes requeridos en este entorno virtual.

  2. Preparar una fuente de datos – Identifica la fuente de registro que deseas analizar. Esto podría ser una ruta a un archivo de registro o base de datos. Asegúrate de conocer el formato de los registros (por ejemplo, ¿están separados por comas, en líneas JSON o en texto plano?). Para ilustrar, fabricaremos algunas entradas de registro.

  3. Configura tu script o cuaderno – Abre tu archivo Python o cuaderno. Comenzaremos importando las bibliotecas necesarias y configurando cualquier configuración (como semillas aleatorias para la reproducibilidad).

Al final de esta configuración, deberías tener un entorno de Python listo para ejecutar nuestro código de análisis de registros de SIEM, y ya sea un conjunto de datos de registro real o la intención de simular datos junto conmigo.

Implementación del Análisis de Registros

En un sistema SIEM completo, el análisis de registros implica recopilar registros de diversas fuentes y analizarlos en un formato uniforme para su posterior procesamiento. Los registros a menudo contienen campos como marca de tiempo, nivel de gravedad, origen, mensaje de evento, ID de usuario, dirección IP, y así sucesivamente. La primera tarea es ingerir y preprocesar estos registros.

1. Ingestión de Registros

Si tus registros están en un archivo de texto, puedes leerlos en Python. Por ejemplo, si cada entrada de registro es una línea en el archivo, podrías hacer:

with open("my_logs.txt") as f:
    raw_logs = f.readlines()

Si los registros están estructurados (digamos, en formato CSV con columnas), Pandas puede simplificar enormemente la lectura:

import pandas as pd
df = pd.read_csv("my_logs.csv")
print(df.head())

Esto te dará un DataFrame df con tus entradas de registro organizadas en columnas. Pero muchos registros son semi-estructurados (por ejemplo, componentes separados por espacios o caracteres especiales). En tales casos, es posible que necesites dividir cada línea por un delimitador o usar regex para extraer campos. Por ejemplo, imagina una línea de registro:

2025-03-06 08:00:00, INFO, User login success, user: admin

Esta tiene una marca de tiempo, un nivel de registro, un mensaje y un usuario. Podemos analizar tales líneas con los métodos de cadena de Python:

logs = [
    "2025-03-06 08:00:00, INFO, User login success, user: admin",
    "2025-03-06 08:01:23, INFO, User login success, user: alice",
    "2025-03-06 08:02:45, ERROR, Failed login attempt, user: alice",
    # ...(más líneas de registro)
]
parsed_logs = []
for line in logs:
    parts = [p.strip() for p in line.split(",")]
    timestamp = parts[0]
    level = parts[1]
    message = parts[2]
    user = parts[3].split(":")[1].strip() if "user:" in parts[3] else None
    parsed_logs.append({"timestamp": timestamp, "level": level, "message": message, "user": user})

# Convertir a DataFrame para un análisis más fácil
df_logs = pd.DataFrame(parsed_logs)
print(df_logs.head())

Ejecutar lo anterior en nuestra lista de muestra daría como resultado algo así:

            timestamp  level                 message   user
0  2025-03-06 08:00:00   INFO    User login success   admin
1  2025-03-06 08:01:23   INFO    User login success   alice
2  2025-03-06 08:02:45  ERROR  Failed login attempt   alice
...

Ahora hemos estructurado los registros en una tabla. En un escenario real, continuarías analizando todos los campos relevantes de tus registros (por ejemplo, direcciones IP, códigos de error, etc.) dependiendo de lo que desees analizar.

2. Preprocesamiento y Extracción de Características

Con los registros en un formato estructurado, el siguiente paso es derivar características para la detección de anomalías. Los mensajes de registro sin procesar (cadenas) por sí solos son difíciles para que un algoritmo aprenda directamente. A menudo extraemos características numéricas o categorías que pueden cuantificarse. Algunos ejemplos de características podrían ser:

  • Cuenta de eventos: número de eventos por minuto/hora, número de fallos de inicio de sesión para cada usuario, y así sucesivamente.

  • Duración o tamaño: si los registros incluyen duraciones o tamaños de datos (por ejemplo, tamaño de transferencia de archivos, tiempo de ejecución de consultas), esos valores numéricos pueden ser utilizados directamente.

  • Codificación categórica: los niveles de registro (INFO, ERROR, DEBUG) podrían ser mapeados a números, o tipos de eventos específicos podrían ser codificados en one-hot.

Para esta prueba de concepto, nos enfocaremos en una característica numérica simple: el recuento de intentos de inicio de sesión por minuto para un usuario dado. Simularemos esto como nuestros datos de característica.

En un sistema real, calcularías esto agrupando las entradas de registro analizadas por ventana de tiempo y usuario. El objetivo es obtener una matriz de números donde cada número representa “cuántos intentos de inicio de sesión ocurrieron en un minuto dado”. La mayoría de las veces este número será bajo (comportamiento normal), pero si un minuto en particular tuvo un número inusualmente alto de intentos, eso es una anomalía (posiblemente un ataque de fuerza bruta).

Para simular, generaremos una lista de 50 valores que representan un comportamiento normal, y luego agregaremos algunos valores que son anormalmente altos:

import numpy as np

# Simular 50 minutos de recuentos de intentos de inicio de sesión normales (alrededor de 5 por minuto en promedio)
np.random.seed(42)  # para ejemplo reproducible
normal_counts = np.random.poisson(lam=5, size=50)

# Simular anomalía: un pico en los intentos de inicio de sesión (por ejemplo, un atacante intenta más de 30 veces en un minuto)
anomalous_counts = np.array([30, 40, 50])

# Combinar los datos
login_attempts = np.concatenate([normal_counts, anomalous_counts])
print("Login attempts per minute:", login_attempts)

Cuando ejecutes lo anterior, login_attempts podría verse así:

Login attempts per minute: [ 5  4  4  5  5  3  5  ...  4 30 40 50]

La mayoría de los valores están en cifras simples, pero al final tenemos tres minutos con 30, 40 y 50 intentos, claros valores atípicos. Estos son nuestros datos preparados para la detección de anomalías. En un análisis de registro real, este tipo de datos podría provenir de contar eventos en tus registros con el tiempo o extrayendo alguna métrica del contenido del registro.

Ahora que nuestros datos están listos, podemos pasar a construir el modelo de detección de anomalías.

Cómo construir el modelo de detección de anomalías

Para detectar anomalías en nuestros datos derivados de registros, utilizaremos un enfoque de aprendizaje automático. Específicamente, utilizaremos un Bosque de Aislamiento, un algoritmo popular para la detección de anomalías no supervisada.

El Bosque de Aislamiento funciona dividiendo aleatoriamente los datos y aislándolos. Las anomalías son aquellos puntos que se aíslan (se separan de los demás) rápidamente, es decir, en menos divisiones aleatorias. Esto lo hace ideal para identificar valores atípicos en un conjunto de datos sin necesidad de etiquetas (no tenemos que saber de antemano qué entradas de registro son “malas”).

¿Por qué Bosque de Aislamiento?

  • Es eficiente y funciona bien incluso si tenemos muchos datos.

  • No asume ninguna distribución específica de los datos (a diferencia de algunos métodos estadísticos).

  • Nos proporciona una forma directa de puntuar anomalías.

Entrenemos un Bosque de Aislamiento en nuestros datos de intentos_de_inicio_de_sesión:

from sklearn.ensemble import IsolationForest

# Prepara los datos en la forma que espera el modelo (muestras, características)
X = login_attempts.reshape(-1, 1)  # cada muestra es un arreglo unidimensional [conteo]

# Inicializa el modelo de Isolation Forest
model = IsolationForest(contamination=0.05, random_state=42)
# contaminación=0.05 significa que esperamos que aproximadamente el 5% de los datos sean anomalías

# Entrena el modelo con los datos
model.fit(X)

Un par de notas sobre el código:

  • Reformateamos login_attempts a un arreglo 2D X con una columna de características porque scikit-learn requiere un arreglo 2D para el entrenamiento (fit).

  • Establecimos contaminación=0.05 para darle al modelo una pista de que aproximadamente el 5% de los datos podrían ser anomalías. En nuestros datos sintéticos agregamos 3 anomalías de 53 puntos, lo que es aproximadamente un 5.7%, por lo que 5% es una suposición razonable. (Si no especificas la contaminación, el algoritmo elegirá un valor por defecto basado en suposiciones o usará un 0.1 por defecto en algunas versiones.)

  • random_state=42 solo garantiza la reproducibilidad.

En este punto, el modelo Isolation Forest ha sido entrenado con nuestros datos. Internamente, ha construido un conjunto de árboles aleatorios que dividen los datos. Los puntos que son difíciles de aislar (es decir, en el grupo denso de puntos normales) terminan profundamente en estos árboles, mientras que los puntos que son fáciles de aislar (los valores atípicos) terminan con caminos más cortos.

A continuación, utilizaremos este modelo para identificar qué puntos de datos se consideran anómalos.

Pruebas y Visualización de Resultados

Ahora llega la parte emocionante: utilizar nuestro modelo entrenado para detectar anomalías en los datos de registro. Tendremos al modelo predecir etiquetas para cada punto de datos y luego filtrar aquellos marcados como valores atípicos.

# Utilizar el modelo para predecir anomalías
labels = model.predict(X)
# El modelo produce +1 para puntos normales y -1 para anomalías

# Extraer los índices y valores de anomalía
anomaly_indices = np.where(labels == -1)[0]
anomaly_values = login_attempts[anomaly_indices]

print("Anomaly indices:", anomaly_indices)
print("Anomaly values (login attempts):", anomaly_values)

En nuestro caso, esperamos que las anomalías sean los números grandes que insertamos (30, 40, 50). La salida podría verse así:

Anomaly indices: [50 51 52]
Anomaly values (login attempts): [30 40 50]

Incluso sin saber nada específico sobre “intentos de inicio de sesión”, el Isolation Forest reconoció esos valores como fuera de línea con el resto de los datos.

Esta es la potencia de la detección de anomalías en un contexto de seguridad: no siempre sabemos cómo se verá un nuevo ataque, pero si hace que algo se aleje mucho de los patrones normales (como un usuario que de repente realiza 10 veces más intentos de inicio de sesión de lo habitual), el detector de anomalías lo pone en evidencia.

Visualización de los resultados

En un análisis real, a menudo es útil visualizar los datos y las anomalías. Por ejemplo, podríamos graficar los valores de intentos de inicio de sesión a lo largo del tiempo (minuto a minuto) y resaltar las anomalías en un color diferente.

En este caso simple, un gráfico de líneas mostraría una línea casi plana alrededor de 3-8 inicios de sesión/min con tres picos enormes al final. Esos picos son nuestras anomalías. Podrías lograr esto con Matplotlib si estás ejecutando esto en un cuaderno:

import matplotlib.pyplot as plt

plt.plot(login_attempts, label="Login attempts per minute")
plt.scatter(anomaly_indices, anomaly_values, color='red', label="Anomalies")
plt.xlabel("Time (minute index)")
plt.ylabel("Login attempts")
plt.legend()
plt.show()

Para la salida basada en texto como la que tenemos aquí, los resultados impresos ya confirman que los valores altos fueron detectados. En casos más complejos, los modelos de detección de anomalías también proporcionan un puntaje de anomalía para cada punto (por ejemplo, qué tan lejos está del rango normal). IsolationForest de Scikit-learn, por ejemplo, tiene un método decision_function que produce un puntaje (donde puntajes más bajos significan más anormal).

Por simplicidad, no profundizaremos en los puntajes aquí, pero es bueno saber que puedes recuperarlos para clasificar las anomalías por severidad.

Con la detección de anomalías funcionando, ¿qué podemos hacer cuando encontramos una anomalía? Eso nos lleva a pensar en respuestas automatizadas.

Posibilidades de Respuesta Automatizadas

Detectar una anomalía es solo la mitad de la batalla; el siguiente paso es responder a ella. En los sistemas SIEM empresariales, la respuesta automatizada (a menudo asociada con SOAR – Orquestación, Automatización y Respuesta de Seguridad) puede reducir drásticamente el tiempo de reacción ante incidentes.

¿Qué podría hacer un SIEM impulsado por IA cuando detecta algo inusual? Aquí hay algunas posibilidades:

  • Alerta: La acción más simple es enviar una alerta al personal de seguridad. Esto podría ser un correo electrónico, un mensaje en Slack o crear un ticket en un sistema de gestión de incidentes. La alerta contendría detalles de la anomalía (por ejemplo, “El usuario alice tuvo 50 intentos de inicio de sesión fallidos en 1 minuto, lo cual es anormal”). GenAI puede ayudar aquí generando un resumen claro en lenguaje natural del incidente para el analista.

  • Atenuación automatizada: Los sistemas más avanzados podrían tomar medidas directas. Por ejemplo, si una dirección IP muestra un comportamiento malicioso en los registros, el sistema podría bloquear automáticamente esa IP en el firewall. En nuestro ejemplo de aumento repentino de inicio de sesión, el sistema podría bloquear temporalmente la cuenta de usuario o solicitar autenticación adicional, bajo la suposición de que podría tratarse de un ataque de bots. Los SIEM basados en IA hoy en día pueden activar acciones de respuesta predefinidas e incluso orquestar flujos de trabajo complejos cuando se detectan ciertas amenazas (consultar AI SIEM: Cómo SIEM con IA/ML está Revolucionando el SOC | Exabeam para obtener más información).

  • Soporte de investigación: La IA generativa también podría utilizarse para recopilar automáticamente contexto. Por ejemplo, al detectar la anomalía, el sistema podría extraer registros relacionados (eventos circundantes, otras acciones del mismo usuario o desde la misma IP) y proporcionar un informe agregado. Esto ahorra al analista de tener que consultar manualmente múltiples fuentes de datos.

Es importante implementar respuestas automatizadas cuidadosamente, no quieres que el sistema reaccione exageradamente a falsos positivos. Una estrategia común es una respuesta escalonada: las anomalías de baja confianza podrían simplemente registrar una advertencia o enviar una alerta de baja prioridad, mientras que las anomalías de alta confianza (o combinaciones de anomalías) desencadenan medidas de defensa activas.

En la práctica, un SIEM impulsado por IA se integraría con su infraestructura (a través de APIs, scripts, y así sucesivamente) para ejecutar estas acciones. Para nuestro PoC de Python, podrías simular una respuesta automatizada, por ejemplo, imprimiendo un mensaje o llamando a una función ficticia cuando se detecta una anomalía. Por ejemplo:

if len(anomaly_indices) > 0:
    print(f"Alert! Detected {len(anomaly_indices)} anomalous events. Initiating response procedures...")
    # Aquí podrías agregar código para deshabilitar un usuario o notificar a un administrador, etc.

Aunque nuestra demostración es simple, es fácil imaginar escalar esto. El SIEM podría, por ejemplo, alimentar anomalías en un modelo generativo más grande que evalúa la situación y decide cuál es el mejor curso de acción (como un asistente de chatbot Ops que conoce tus libros de ejecución). Las posibilidades de automatización se están expandiendo a medida que la IA se vuelve más sofisticada.

Conclusión

En este tutorial, construimos un componente básico de SIEM impulsado por IA que ingiere datos de registro, los analiza en busca de anomalías utilizando un modelo de aprendizaje automático, e identifica eventos inusuales que podrían representar amenazas de seguridad.

Comenzamos analizando y preparando datos de registro, luego usamos un modelo de Isolation Forest para detectar valores atípicos en una secuencia de recuentos de intentos de inicio de sesión. El modelo identificó con éxito comportamientos fuera de lo común sin ningún conocimiento previo de cómo se ve un “ataque” – se basó puramente en desviaciones de patrones normales aprendidos.

También discutimos cómo un sistema así podría responder a anomalías detectadas, desde alertar a humanos hasta tomar acciones automáticamente.

Los sistemas SIEM modernos aumentados con IA/ML se están moviendo en esta dirección: no solo detectan problemas, sino que también ayudan a clasificar y responder a ellos. La IA generativa mejora esto aún más al aprender de los analistas y proporcionar resúmenes y decisiones inteligentes, convirtiéndose efectivamente en un asistente incansable en el Centro de Operaciones de Seguridad.

Para los siguientes pasos y mejoras:

  • Puedes probar este enfoque con datos de registro reales. Por ejemplo, toma un archivo de registro del sistema y extrae una característica como “número de registros de error por hora” o “bytes transferidos por sesión” y ejecuta detección de anomalías sobre eso.

  • Experimenta con otros algoritmos como One-Class SVM o Local Outlier Factor para la detección de anomalías y ver cómo se comparan.

  • Incorpora un modelo de lenguaje simple para analizar líneas de registro o para explicar anomalías. Por ejemplo, un LLM podría leer una entrada de registro anómala y sugerir qué podría estar mal (“Este error generalmente significa que la base de datos no es accesible”).

  • Amplía las características: en un SIEM real, usarías muchas señales a la vez (recuentos de inicio de sesión fallidos, geolocalización de IP inusual, nombres de procesos raros en los registros, y así sucesivamente). Más características y datos pueden mejorar el contexto para la detección.