Машинное обучение в кибербезопасности

Обнаружение активности сетевого сканирования

Пример использования того, как мы могли бы включить машинное обучение в кибербезопасность

Эта статья представляет собой запись, в которой задокументированы варианты использования, которые я разработал для обеспечения обнаружения аномалий с помощью машинного обучения, что может помочь в анализе реагирования на инциденты / синей команды. Предысторию этого исследования вы можете посмотреть здесь.

Первый вариант использования, который я проиллюстрирую здесь, — обнаружение действий по сканированию сети с помощью машинного обучения. Разработанная модель будет протестирована, чтобы оценить, включены ли после того, как мы включили некоторые особенности среды, т. е. специфические функции, связанные с вашей средой. Мы сможем создать модель, которая может значительно снизить частоту ложных срабатываний по сравнению со статическим правилом обнаружения.

Что такое сканирование сети?

Сканирование сети — один из наиболее распространенных видов деятельности хакеров. Это первый шаг в цепочке киберубийств — РАЗВЕДКА, когда хакеры стремятся собрать информацию о целях.

Типичные действия по сканированию сети могут выполняться с помощью таких инструментов, как Nmap. Они будут генерировать пакеты, которые пытаются исследовать определенный диапазон IP-адресов с другим указанным портом назначения.

Создание функций

Чтобы обнаружить сканирование сети, мне нужно будет найти соответствующие журналы, которые будут фиксировать такие виды сетевой активности. Через некоторое время я решил, что журнал брандмауэра будет хорошим источником данных.

Пример журнала брандмауэра выглядит так:

Он описывает IP-адрес источника, IP-адрес назначения, порт службы/назначения и действие, выполняемое брандмауэром, например. заблокировано, разрешено.

Чтобы алгоритм машинного обучения понял наш набор данных, нам нужно будет пройти процесс преобразования данных — генерацию признаков. По моему опыту, я потратил большую часть времени на правильную генерацию, так как это часто требует от аналитика полного понимания вариантов использования, т. е. того, что вы хотите обнаружить, данных, т. е. того, как атака будет выглядеть в перспективе журнала. а также процесс атаки, т.е. что такое известный «плохой трафик». Если генерация признаков не выполнена должным образом, это повлияет на последующие шаги и, наконец, повлияет на производительность модели. Время от времени может случиться так, что вы вернетесь к этому шагу, чтобы задаться вопросом, не пропустили ли вы какие-то функции.

Для этого варианта использования это относительно просто, я сделал предположение, что сканирование сети будет генерировать много пакетного трафика за короткий период, и мы также предположили, что запрещенный трафик будет иметь более высокую долю, чем принимаемый трафик. Поэтому был создан список функций корпоративного брандмауэра:

  • ВСЕГО — общее количество пакетов, сгенерированных за 15 минут.
  • ACCEPT _COUNT — общее количество действий подтверждения, выполненных брандмауэром в течение 15 минут.
  • DENY_COUNT — ОБЩЕЕ количество действий «запретить», выполненных брандмауэром в течение 15 минут.
  • Интернет — указывает, является ли Source_IP общедоступным IP-адресом (т. е. 0 = нет; 1 = да).
  • isinfra — это особый параметр, который я сгенерировал, предоставив список известных мне общих инфраструктур в среде. Если исходный IP-адрес исходит из этого списка инфраструктуры, он будет помечен как 0 и наоборот, как 1.
  • protco_count – номер порта назначения, который исходный IP инициировал.
  • ip_c — номер IP-адреса назначения, инициированный исходным IP-адресом.
  • date_occurance —сколько раз за последние 7 дней я видел этот IP-адрес в журнале брандмауэра.

Выбор модели

Я провел некоторую оценку данных и отметил, что классификатор дерева решений, одна из моделей контролируемого обучения, кажется подходящим.

Классификатор дерева решений

Дерево решений — это простое представление классифицирующих примеров. Это контролируемое машинное обучение, при котором данные непрерывно разделяются в соответствии с определенным параметром.

Дерево решений состоит из:

  1. Узлы: проверьте значение определенного атрибута.
  2. Edges/Branch: соответствует результату теста и подключается к следующему узлу или листу.
  3. Листовые узлы. Конечные узлы, которые предсказывают результат (представляют метки классов или распределение классов).

Набор данных

Я подготовил набор данных, извлеченный из лабораторного брандмауэра, который я построил с базовой инфраструктурой, такой как AD, серверы Zabbix и другие сетевые устройства.

В рамках контролируемого обучения я также предоставил дополнительный столбец данных «тег» — если это известная атака IPSWEEP, она будет помечена как 1; PORT SCAN, он будет помечен как 2, а обычный трафик будет помечен как 0.

Как для сканирования PORT SCAN, так и для сканирования IPSWEEP оно генерируется Nmap.

Вы также можете получить набор данных здесь.

Критерии оценки эффективности

Для производительности категориального прогноза мы будем использовать следующие показатели:

  • Точность = TP + TN / (TP + TN + FP + FN) (Предполагается одинаковая стоимость обоих типов ошибок. Точность 99% может быть отличной, хорошей, посредственной, плохой или ужасной в зависимости от проблемы.)
  • Отзыв = TP / (TP + FN) (Отзыв может быть определен как отношение общего количества правильно классифицированных положительных примеров к общему количеству положительных примеров. Высокий отзыв указывает на то, что класс правильно распознан)
  • Точность = TP /(TP + FP) (Высокая точность указывает на то, что пример, помеченный как положительный, действительно положительный)
  • F1 = 2*Отзыв*Точность/(Отзыв + Точность)

Для наших случаев мы часто предпочитаем иметь высокую полноту и высокую точность. Точность не слишком важна для нашей модели. Пока возьмем на рассмотрение Recall, Precision и F1.

Результат

Модель может набрать 98% баллов F1.

Скрипты, которые я использовал в питоне:

import pandas as pd
from sklearn.metrics import classification_report
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
data  = pd.read_csv("<your path here>", header = 0)
feature_cols = ['TOTAL', 'accept_count',  'date_occurance', 'deny_count', 'internet', 'ip_c', 'isinfra', 'protco_count']
X = data[feature_cols]
y = data.tag
X_train, X_test, y_train, y_test =train_test_split(X, y, test_size=0.4, random_state=1)
clf = DecisionTreeClassifier(criterion='entropy')
clf = clf.fit(X_train, y_train)
y_predict = clf.predict(X_test)
target_names = ['Normal','IPSWEEP','Port Scan']
result = classification_report(y_test, y_predict, target_names = target_names)
print (result)

Я также поместил эту модель, разработанную в MLTK, и запустил ее в производственной среде, где я сравнил результаты с коммерческим готовым инструментом обнаружения при обнаружении IPSWEEP и PORT SCAN. Хотя они оба могли обнаруживать действия сканирования портов, моя модель на самом деле давала меньше ложноположительных результатов, поскольку учитывала, является ли это известным шаблоном или известной инфраструктурой, которая будет генерировать аналогичный шаблон, как сканирование портов.

Следующий шаг. Известно, что дерево решений нестабильно, поскольку небольшие изменения в данных могут привести к созданию совершенно другого дерева. Кроме того, образцы данных, которые я использовал, могут применяться только к конкретной среде. Лучше всего, если вы повторно запустите процедуру обучения/тестирования, чтобы сгенерировать набор данных, который больше всего соответствует вашей среде. Возможная оценка, чтобы увидеть, можем ли мы использовать другую модель, такую ​​как повышение и бэггинг, для снижения дисперсии.