Счастливый 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.
Ссылка
- Https://engineering.linkedin.com/blog/2019/isolation-forest
- Https://github.com/titicaca/spark-iforest
- Https://github.com/linkedin/isolation-forest
- Https://towardsdatascience.com/isolation-forest-and-spark-b88ade6c63ff
- Https://zeppelin.apache.org/docs/0.6.2/manual/dependencymanagement.html
- Https://docs.qubole.com/en/latest/user-guide/engines/spark/configure-spark-notebook.html
- Https://www.offensive-security.com/metasploit-unleashed/scanner-http-auxiled-modules/