Счастливый ML

Фон

Isolation Forest(iForest) - это неконтролируемый алгоритм машинного обучения, оптимизированный для обнаружения аномалий / выбросов. iForest использует древовидную структуру для моделирования данных, iTree изолирует аномалии ближе к корню дерева по сравнению с нормальными точками. Оценка аномалий рассчитывается моделью iForest для измерения аномальности экземпляров данных. Чем выше, тем ненормальнее. Более подробную информацию об iForest можно найти в статье Isolation Forest и в блоге здесь.

В этом посте я собираюсь использовать алгоритм iForest для обнаружения аномалий в данных сетевого трафика. В моем предыдущем посте я обсуждал обнаружение аномалий в данных сетевого трафика с помощью K-Means кластеризации с Zeppelin notebook и docker. В этом посте я также буду запускать алгоритм iForest на ноутбуке Zeppelin с докером. Все исходные коды и датасеты, относящиеся к этому посту, доступны в gitlab. Пожалуйста, клонируйте репо и продолжайте публикацию.

Докер Zeppelin

Я запустил Zeppelin на своем локальном компьютере с докером. Ниже приводится docker-compose.yml для запуска Zeppelin. Он определяет два тома докеров, в которых хранятся наборы данных и записные книжки.

Набор данных

Я собираюсь проанализировать аномалии сетевых данных и определить поведение атак в сети, используя алгоритм iForest. Для этого мне пришлось сгенерировать набор данных об атаке. Чтобы сгенерировать набор данных, я запустил простую службу на основе Scala HTTP REST и провожу настоящие атаки с помощью Metasploit. Затем перехватили все пакеты, приходящие на сервер через TShark. Я написал сообщение в блоге о захвате сетевых данных с TShark в здесь. Захваченный набор данных опубликован в виде .CSV файла в gitlab. Загрузите набор данных и поместите его в том каталога данных контейнера докеров Zeppelin. Тогда он будет доступен внутри док-контейнера Zeppelin. Для примера я поместил его в каталог /private/var/services/spark/zeppelin/data на моем локальном компьютере.

Беги Цеппелин

Я могу запустить контейнер Zeppelin с помощью команды docker-compose up -d zeppelin. Затем я могу просматривать веб-страницы Zeppelin по адресу http:localhost:8080. Zeppelin Web предоставляет интерфейс для создания записных книжек, импорта записных книжек, визуализации данных. Я создал записную книжку с названием iforest. Программа iForest Spark, написанная в той записной книжке. Я использовал Scala язык, чтобы написать искровую работу. Подробнее о настройке ноутбука Zeppelin читайте в моем предыдущем посте.

библиотека iForest

Я использовал библиотеку iForest, которую реализовал LinkedIn. Репозиторий библиотеки можно найти на гитхабе. По умолчанию в библиотеке iForest нет Spark, поэтому я скачал jar файл iForest из репозитория maven и загрузил его в блокнот. Я также включил jar-файл в gitlab. Вы можете получить его оттуда, если хотите. Поскольку я запускаю Zeppelin с докером, мне нужно скопировать файл jar в контейнер докера Zeppelin. Я сделал это с помощью тома докера. Я поместил файл jar в каталог /private/var/services/spark/zeppelin/data на моем локальном компьютере, который является объемом каталога данных Zeppelin. Тогда он будет доступен внутри док-контейнера Zeppelin.

Мы можем загружать внешние зависимости или jar-файлы в записную книжку Zeppelin с помощью команд %dep или %spark.dep (при использовании Spark). Более подробную информацию о загрузке зависимостей можно найти в документации Zeppelin. Вот как я загрузил jar-файл iForest в записную книжку.

Загрузить набор данных

Чтобы построить модель iForest, я загрузил набор данных в Spark DataFrame. Набор данных находится по /usr/zeppelin/data/tshark.csv пути внутри контейнера докеров. Ниже приведен способ загрузки набора данных в DataFrame.

Подготовить набор данных

Затем я провел различную подготовку данных и добавил столбцы функций в набор данных. Я использовал packet count, average packet length, average frame length, packet local anomaly, frame local anomaly в качестве функций. Для создания функций я сгруппировал набор данных с frame_time (с интервалом в 1 минуту), ip_src и frame_protocols. Затем вычислили packet count, average packet length, average frame length, packet local anomaly, frame local anomaly и сгенерировали новый DataFrame. Этот DataFrame соединился с исходным DataFrame, чтобы получить набор данных с полным набором функций. Вот как это сделать. Я добавил комментарии на каждом этапе кода, чтобы сделать его более понятным.

iForest модель

Для обучения и тестирования модели iForest набор данных необходимо разделить на набор данных для обучения и набор данных для тестирования. 70% данных используется для обучения модели, а 30% - для тестирования. Модель iForest построена с использованием обучающего набора данных и оценена с помощью тестового набора данных. При построении модели iForest я использовал различные параметры модели, такие как setNumEstimators, setMaxFeatures. Подробнее об этих параметрах можно узнать здесь. Обученный DataFrame содержит predicted_label, outlier_score столбцов. Я создал новый DataFrame с этими полями с последовательностью id столбца и сохранил в SQL view для визуализации.

Визуализация

Zeppelin поддерживает визуализацию данных с помощью SQL запросов. Я могу выполнять SQL-запросы с данными в представлении SQL и генерировать различные графики / диаграммы на основе результатов запроса. Ниже приведены некоторые примеры диаграмм, которые я использовал для визуализации результатов прогнозирования модели iForest. select id, predicted_label from iforest - это SQL-запрос, который я использовал для выбора соответствующих данных. iforest - это имя SQL view, которое я создал ранее.

Полная искровая работа

Ниже приведен полный исходный код искровой работы. Искровые задания можно экспортировать как JSON документов из сети Zeppelin. Я экспортировал это задание как JSON документ и опубликовал в gitlab. При желании вы можете скачать его и напрямую импортировать в сеть Zeppelin.

Ссылка

  1. Https://engineering.linkedin.com/blog/2019/isolation-forest
  2. Https://github.com/titicaca/spark-iforest
  3. Https://github.com/linkedin/isolation-forest
  4. Https://towardsdatascience.com/isolation-forest-and-spark-b88ade6c63ff
  5. Https://zeppelin.apache.org/docs/0.6.2/manual/dependencymanagement.html
  6. Https://docs.qubole.com/en/latest/user-guide/engines/spark/configure-spark-notebook.html
  7. Https://www.offensive-security.com/metasploit-unleashed/scanner-http-auxiled-modules/