В этом учебном пособии мы создадим упрощенную систему анализа журналов SIEM с искусственным интеллектом, используя Python. Наш акцент будет сделан на анализе журналов и обнаружении аномалий.
Мы пройдем через процесс внедрения журналов, обнаружения аномалий с помощью легковесной модели машинного обучения и даже затронем, как система может реагировать автоматически.
Этот практический концептуальный проект продемонстрирует, как искусственный интеллект может улучшить мониторинг безопасности практичным и доступным способом.
Содержание
Что такое SIEM-системы?
Системы управления информационной безопасностью и событий (SIEM) являются центральной нервной системой современных операций по обеспечению безопасности. SIEM агрегирует и коррелирует журналы безопасности и события из всей IT-среды для предоставления оперативных исследований потенциальных инцидентов. Это помогает организациям быстрее обнаруживать угрозы и реагировать раньше.
Эти системы собирают огромные объемы журнальных данных — от оповещений брандмауэра до журналов приложений — и анализируют их на предмет признаков проблем. Обнаружение аномалий в этом контексте крайне важно, и необычные шаблоны в журналах могут выявить инциденты, которые могли бы ускользнуть от статических правил. Например, внезапный скачок сетевых запросов может указывать на атаку DDoS, а несколько неудачных попыток входа в систему могут указывать на попытки несанкционированного доступа.
ИИ выводит возможности SIEM на новый уровень. Используя современные модели ИИ (например, большие языковые модели), SIEM на базе ИИ может интеллектуально анализировать и интерпретировать журналы, изучать, как выглядит “нормальное” поведение, и отмечать “странные” вещи, требующие внимания.
По сути, ИИ может выступать в роли умного помощника для аналитиков, выявляя тонкие аномалии и даже подводя итоги в простом языке. Недавние достижения в области больших языковых моделей позволяют SIEM рассуждать по множеству данных так же, как это сделал бы человеческий аналитик, но с гораздо большей скоростью и масштабом. Результатом является мощный цифровой помощник по безопасности, который помогает отсеивать шум и сосредоточиться на реальных угрозах.
Предварительные условия
Прежде чем начать, убедитесь, что у вас есть следующее:
-
Установленный Python 3.x на вашей системе. Примеры кода должны работать на любой последней версии Python.
-
Базовое знакомство с программированием на Python (циклы, функции, использование библиотек) и понимание журналов (например, как выглядит запись в журнале) будет полезным.
-
Библиотеки Python: Мы будем использовать несколько общих библиотек, которые легковесны и не требуют специального оборудования:
-
pandas для базовой обработки данных (если ваши журналы в формате CSV или подобном).
-
numpy для числовых операций.
-
scikit-learn для модели обнаружения аномалий (в частности, мы будем использовать алгоритм IsolationForest).
-
-
Набор журнальных данных для анализа. Вы можете использовать любой файл журнала (журналы системы, журналы приложений и т. д.) в формате обычного текста или CSV. Для демонстрации мы сэмулируем небольшой набор журнальных данных, чтобы вы могли следовать за нами даже без готового файла журнала.
Примечание: Если у вас нет вышеперечисленных библиотек, установите их через pip:
pip install pandas numpy scikit-learn
Настройка проекта
Давайте создадим простую структуру проекта. Создайте новый каталог для этого проекта обнаружения аномалий SIEM и перейдите в него. Внутри вы можете разместить скрипт на Python (например, siem_anomaly_demo.py
) или Jupyter Notebook, чтобы запустить код пошагово.
Убедитесь, что ваш рабочий каталог содержит или имеет доступ к вашим журнальным данным. Если вы используете файл журнала, может быть хорошей идеей разместить копию в этой папке проекта. Для нашего концептуального примера, поскольку мы будем генерировать синтетические журнальные данные, нам не понадобится внешний файл, но в реальном сценарии вам это понадобится.
Шаги настройки проекта:
-
Инициализация среды – Если хотите, создайте виртуальную среду для этого проекта (необязательно, но хорошая практика):
python -m venv venv source venv/bin/activate # На Windows используйте "venv\Scripts\activate"
Затем установите необходимые пакеты в этой виртуальной среде.
-
Подготовьте источник данных – Определите источник журнала, который вы хотите проанализировать. Это может быть путь к файлу журнала или базе данных. Убедитесь, что вы знаете формат журналов (например, разделены ли они запятыми, JSON строки или обычный текст?). Для иллюстрации мы сфабрикуем некоторые записи журнала.
-
Настройка вашего скрипта или блокнота – Откройте ваш файл Python или блокнот. Мы начнем с импорта необходимых библиотек и настройки любых конфигураций (например, случайные семена для воспроизводимости).
К концу этой настройки у вас должна быть готова среда Python для запуска нашего кода анализа журналов SIEM, а также настоящий набор данных журналов или намерение симулировать данные вместе со мной.
Реализация анализа журналов
В полной системе SIEM анализ журналов включает сбор журналов из различных источников и их парсинг в единый формат для дальнейшей обработки. Журналы часто содержат поля, такие как временная метка, уровень серьезности, источник, сообщение о событии, идентификатор пользователя, IP-адрес и т. д. Первая задача – впитать и предобработать эти журналы.
1. Впитывание журналов
Если ваши журналы находятся в текстовом файле, вы можете их прочитать в Python. Например, если каждая запись в журнале – это строка в файле, вы можете сделать следующее:
with open("my_logs.txt") as f:
raw_logs = f.readlines()
Если журналы имеют структуру (скажем, формат CSV с колонками), Pandas может значительно упростить чтение:
import pandas as pd
df = pd.read_csv("my_logs.csv")
print(df.head())
Это даст вам DataFrame df
с вашими записями журналов, организованными в колонки. Но многие журналы полуструктурированы (например, компоненты, разделенные пробелами или специальными символами). В таких случаях вам может потребоваться разбить каждую строку по разделителю или использовать регулярные выражения для извлечения полей. Например, представьте строку журнала:
2025-03-06 08:00:00, INFO, User login success, user: admin
В этой строке есть временная метка, уровень журнала, сообщение и пользователь. Мы можем разобрать такие строки с помощью методов строк 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",
# ... (другие строки журнала)
]
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})
# Преобразование в DataFrame для более легкого анализа
df_logs = pd.DataFrame(parsed_logs)
print(df_logs.head())
Запуск вышеуказанного на нашем образцовом списке дал бы следующий результат:
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
...
Теперь мы структурировали журналы в виде таблицы. В реальном сценарии вам следовало бы продолжать анализировать все необходимые поля из ваших журналов (например, IP-адреса, коды ошибок и т. д.) в зависимости от того, что вы хотите проанализировать.
2. Предварительная обработка и извлечение признаков
После того как журналы имеют структурированный формат, следующим шагом является извлечение признаков для обнаружения аномалий. Сырые сообщения журналов (строки) сложно понять алгоритму напрямую. Мы часто извлекаем числовые признаки или категории, которые можно количественно оценить. Некоторые примеры признаков могут быть следующими:
-
Количество событий: количество событий в минуту/час, количество неудачных попыток входа для каждого пользователя и т. д.
-
Продолжительность или размер: если журналы содержат продолжительность или размер данных (например, размер передачи файла, время выполнения запроса), эти числовые значения могут быть использованы напрямую.
-
Категориальное кодирование: уровни журнала (INFO, ERROR, DEBUG) могут быть преобразованы в числа или конкретные типы событий могут быть кодированы в виде one-hot.
Для этого концептуального доказательства давайте сосредоточимся на простой числовой характеристике: количество попыток входа в систему в минуту для определенного пользователя. Мы будем симулировать это как наши данные о характеристиках.
В реальной системе вы бы вычислили это, группируя разобранные записи журнала по временному окну и пользователю. Цель – получить массив чисел, где каждое число представляет “сколько попыток входа произошло в данную минуту”. Большую часть времени это число будет низким (нормальное поведение), но если в какую-то конкретную минуту произошло необычно большое количество попыток, это аномалия (возможно, атака методом перебора).
Для симуляции мы сгенерируем список из 50 значений, представляющих нормальное поведение, а затем добавим несколько значений, которые являются аномально высокими:
import numpy as np
# Симулируем 50 минут нормального количества попыток входа (в среднем около 5 в минуту)
np.random.seed(42) # для воспроизводимого примера
normal_counts = np.random.poisson(lam=5, size=50)
# Симулируем аномалию: всплеск попыток входа (например, злоумышленник пытается более 30 раз в минуту)
anomalous_counts = np.array([30, 40, 50])
# Объединяем данные
login_attempts = np.concatenate([normal_counts, anomalous_counts])
print("Login attempts per minute:", login_attempts)
Когда вы запустите вышеуказанное, login_attempts
может выглядеть примерно так:
Login attempts per minute: [ 5 4 4 5 5 3 5 ... 4 30 40 50]
Большинство значений однозначные, но в конце у нас есть три минуты с 30, 40 и 50 попытками – явные выбросы. Это наши подготовленные данные для обнаружения аномалий. В реальном анализе журналов такие данные могут получаться из подсчета событий в ваших журналах с течением времени или извлечения какой-то метрики из содержания журнала.
Теперь, когда наши данные готовы, мы можем перейти к созданию модели обнаружения аномалий.
Как построить модель обнаружения аномалий
Для обнаружения аномалий в наших данных, полученных из журналов, мы будем использовать подход машинного обучения. В частности, мы будем использовать Изолирующий Лес – популярный алгоритм для обнаружения аномалий без учителя.
Изолирующий Лес работает путем случайного разбиения данных и выделения точек. Аномалии – это те точки, которые быстро изолируются (отделяются от других), то есть, в меньшем количестве случайных разделений. Это отлично подходит для выявления выбросов в наборе данных без необходимости использования меток (нам не нужно знать заранее, какие записи в журнале являются “плохими”).
Почему Изолирующий Лес?
-
Он эффективен и хорошо работает даже при наличии большого объема данных.
-
Он не предполагает какое-либо конкретное распределение данных (в отличие от некоторых статистических методов).
-
Он предоставляет нам простой способ оценки аномалий.
Давайте обучим Изолирующий Лес на наших данных login_attempts
:
from sklearn.ensemble import IsolationForest
# Подготовьте данные в форме, которую ожидает модель (образцы, признаки)
X = login_attempts.reshape(-1, 1) # каждый образец представляет собой одномерный [count]
# Инициализируйте модель Isolation Forest
model = IsolationForest(contamination=0.05, random_state=42)
# contamination=0.05 означает, что мы ожидаем, что около 5% данных будут аномалиями
# Обучите модель на данных
model.fit(X)
Несколько замечаний по коду:
-
Мы преобразовали
login_attempts
в 2D массивX
с одним столбцом признаков, потому что scikit-learn требует 2D массив для обучения (fit
). -
Мы установили
contamination=0.05
, чтобы дать модели подсказку о том, что примерно 5% данных могут быть аномалиями. В наших синтетических данных мы добавили 3 аномалии из 53 точек, что составляет ~5.7%, поэтому 5% — это разумная оценка. (Если вы не укажете уровень загрязнения, алгоритм выберет значение по умолчанию на основе предположений или использует значение по умолчанию 0.1 в некоторых версиях.) -
random_state=42
просто обеспечивает воспроизводимость.
На данный момент модель Isolation Forest обучена на наших данных. Внутри она построила ансамбль случайных деревьев, разделяющих данные. Точки, которые сложно изолировать (то есть, в плотном кластере нормальных точек), оказываются глубоко в этих деревьях, в то время как точки, которые легко изолировать (выбросы), имеют более короткие пути.
Далее мы будем использовать эту модель, чтобы определить, какие данные считаются аномальными.
Тестирование и визуализация результатов
Теперь наступает захватывающая часть: использование нашей обученной модели для обнаружения аномалий в журнальных данных. Модель будет предсказывать метки для каждой точки данных, а затем отфильтруем те, которые помечены как выбросы.
# Используем модель для предсказания аномалий
labels = model.predict(X)
# Модель выводит +1 для нормальных точек и -1 для аномалий
# Извлекаем индексы и значения аномалий
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)
В нашем случае мы ожидаем, что аномалии будут большими числами, которые мы вставили (30, 40, 50). Вывод может выглядеть так:
Anomaly indices: [50 51 52]
Anomaly values (login attempts): [30 40 50]
Даже не зная ничего о “попытках входа” в частности, Isolation Forest распознала эти значения как несоответствующие остальным данным.
Вот сила обнаружения аномалий в контексте безопасности: мы не всегда знаем, как будет выглядеть новая атака, но если что-то заставляет отклониться от нормальных шаблонов (например, пользователь внезапно делает в 10 раз больше попыток входа, чем обычно), детектор аномалий бросает на это свет.
Визуализация результатов
В реальном анализе часто полезно визуализировать данные и аномалии. Например, мы могли бы построить график значений попытки_входа
с течением времени (минута за минутой) и выделить аномалии другим цветом.
В этом простом случае линейный график показал бы в основном плоскую линию около 3-8 входов/мин с тремя огромными пиками в конце. Эти пики – наши аномалии. Вы можете добиться этого с помощью Matplotlib, если запускаете это в блокноте:
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()
Для текстового вывода, как здесь, напечатанные результаты уже подтверждают, что высокие значения были обнаружены. В более сложных случаях модели обнаружения аномалий также предоставляют оценку аномалии для каждой точки (например, насколько она отличается от нормального диапазона). Например, у IsolationForest из Scikit-learn есть метод decision_function
, который дает оценку (где более низкие оценки означают более аномальные).
Для простоты мы не будем углубляться в оценки здесь, но полезно знать, что можно их получить, чтобы ранжировать аномалии по серьезности.
При работающем обнаружении аномалий, что мы можем сделать, когда обнаружим аномалию? Это приводит нас к мыслям об автоматизированных ответах.
Возможности автоматизированного ответа
Обнаружение аномалии — только полбеды: следующий шаг — реагирование на нее. В корпоративных системах SIEM автоматизированный ответ (часто ассоциируемый с SOAR – Оркестровка, Автоматизация и Реагирование безопасности) может существенно сократить время реакции на инциденты.
Что может сделать AI-приводимый SIEM, когда он обнаруживает что-то необычное? Вот некоторые возможности:
-
Оповещение: Самое простое действие — отправить оповещение сотрудникам службы безопасности. Это может быть электронное письмо, сообщение в Slack или создание заявки в системе управления инцидентами. Оповещение будет содержать детали аномалии (например, “Пользователь alice совершил 50 неудачных попыток входа за 1 минуту, что необычно”). GenAI может помочь, сгенерировав понятное описание инцидента на естественном языке для аналитика.
-
Автоматизированное смягчение: Более продвинутые системы могут принимать прямые меры. Например, если IP-адрес демонстрирует вредоносное поведение в журналах, система может автоматически заблокировать этот IP на файрволе. В нашем примере с резким увеличением входа в систему, система может временно заблокировать учетную запись пользователя или запросить дополнительную аутентификацию, исходя из предположения, что это может быть атака бота. Современные SIEM на основе ИИ действительно могут инициировать заранее определенные действия реагирования или даже организовывать сложные рабочие процессы, когда обнаруживаются определенные угрозы (см. AI SIEM: Как SIEM с ИИ/МЛ революционизирует SOC | Exabeam для получения дополнительной информации).
-
Поддержка в расследовании: Генеративный ИИ также может использоваться для автоматического сбора контекста. Например, обнаружив аномалию, система может извлечь связанные журналы (окружающие события, другие действия того же пользователя или с того же IP) и предоставить агрегированный отчет. Это позволяет аналитику избежать ручного запроса к нескольким источникам данных.
Важно тщательно внедрять автоматизированные ответы — вам не хочется, чтобы система реагировала излишне на ложноположительные сигналы. Одна из распространенных стратегий — это иерархический ответ: низкую уверенность в аномалиях можно просто зарегистрировать предупреждение или отправить уведомление о низком приоритете, тогда как высокая уверенность в аномалиях (или их комбинации) вызывает активные защитные меры.
На практике ИИ-обеспеченная SIEM будет интегрироваться с вашей инфраструктурой (через API, скрипты и т. д.), чтобы выполнить эти действия. Для нашего Python PoC вы можете смоделировать автоматический ответ, например, печать сообщения или вызов фиктивной функции при обнаружении аномалии. Например:
if len(anomaly_indices) > 0:
print(f"Alert! Detected {len(anomaly_indices)} anomalous events. Initiating response procedures...")
# Здесь вы могли бы добавить код для отключения пользователя или уведомления администратора и т. д.
Хотя наша демонстрация проста, легко представить ее масштабирование. SIEM, например, может передавать аномалии в более крупную генеративную модель, которая оценивает ситуацию и принимает наилучшее решение (например, помощник чата Ops, который знает ваши инструкции). Возможности автоматизации расширяются с улучшением ИИ.
Заключение
В этом руководстве мы создали базовый компонент AI-обеспеченной SIEM, который обрабатывает журнальные данные, анализирует их на наличие аномалий с помощью модели машинного обучения и выявляет необычные события, которые могут представлять угрозу безопасности.
Мы начали с разбора и подготовки журнальных данных, затем использовали модель Isolation Forest для обнаружения выбросов в потоке попыток входа в систему. Модель успешно выявила нестандартное поведение без предварительного знания о том, как выглядит “атака” — она полностью опиралась на отклонения от изученных нормальных шаблонов.
Мы также обсудили, как такая система может реагировать на обнаруженные аномалии, начиная с оповещения людей и заканчивая автоматическим принятием мер.
Современные системы SIEM, дополненные ИИ/МО, движутся в этом направлении: они не только обнаруживают проблемы, но также помогают классифицировать и реагировать на них. Генеративный ИИ дополняет это, учась у аналитиков и предоставляя интеллектуальные сводки и решения, эффективно становясь неутомимым помощником в Центре операций безопасности.
Для следующих шагов и улучшений:
-
Вы можете попробовать это решение на реальных журнальных данных. Например, возьмите файл журнала системы и извлеките характеристику, такую как “количество ошибок в журналах в час” или “переданные байты за сеанс”, и запустите анализ аномалий на них.
-
Попробуйте другие алгоритмы, такие как One-Class SVM или Local Outlier Factor для обнаружения аномалий, чтобы увидеть, как они сравниваются.
-
Включите простую языковую модель для разбора строк журналов или объяснения аномалий. Например, ЯМ может прочитать аномальную запись в журнале и предложить, в чем может быть проблема (“Эта ошибка обычно означает, что база данных недоступна”).
-
Расширьте функционал: в реальной СЭМ вы бы использовали множество сигналов одновременно (количество неудачных попыток входа, необычное географическое местоположение IP, редкие имена процессов в журналах и т. д.). Дополнительные функции и данные могут улучшить контекст для обнаружения.
Source:
https://www.freecodecamp.org/news/how-to-create-a-python-siem-system-using-ai-and-llms/