В статье приведён анализ решений в сфере IDS и систем обработки траффика, краткий анализ атак и разбор принципов функционирования IDS. После чего сделана попытка разработки модуля для обнаружения аномалий в сети, на основе нейросетевого метода анализа сетевой активности, со следующими целями: Целью статьи является попытка применения аппарата нейронных сетей в прикладной области, в основном ради изучения вопроса. Задачей, реализующей цель, будет построение нейросетевого модуля обнаружения отклонений в работе сети передачи данных от её нормальных режимов. Исследование и обоснование: Разработка: Существует классическое деление СОВ на [11]: В данной статье я хочу несколько расширить это деление.
Собственно, целью любой такой системы является ответ на вопрос: есть ли проблемы и какие?
Решение выносится на основе полученных данных. Т.е. задачи системы состоят из: Соответственно, все системы возможно позиционировать по значениям следующих признаков: Внесистемной характеристикой я считаю тип реакции на результат: В первом случае, производится информирование заинтересованных лиц.
Во втором — активные действия, например блокирование диапазона адресов атакующего.
По этому признаку данные системы обычно искусственно разделяются на IDS и IPS.
Характеристика эта внесистемная, потому что я предполагаю разбиение системы
на "разведывательную" и "силовую" части. И любая IDS может быть включена в состав IPS.
Далее, к этому вопросу я не буду возвращаться. Следуя классическому делению, я введу два класса и добавлю третий, чтобы возможно было представить класс, как "координату в конфигурационном пространстве" (просто для того, чтобы позже все перестановки быстро получить): Типы данных, собираемые об узле сети — это данные, которые касаются только одного узла и частично тех, кто с ним взаимодействует.
Анализ таких данных позволяет ответить на вопрос: "Идёт ли атака на данный хост?"
Как правило, удобнее собирать эти данные непосредственно на узле, но это не обязательно.
Например, сетевые сканеры могут получить список открытых портов на конкретном узле извне, не имея возможности запускать там код. Этот класс включает данные следующих типов (к каждому из которых относятся конкретные собираемые показатели): При этом, узлы могут быть как рабочими станциями, не предполагающими их использования в качестве серверов, предоставляющих службы, так и серверами.
Я разделяю хосты на типы, потому что хочу выделить отдельный случай: хост может быть специально сделан уязвимым, с целью изучения методов атак (в том числе дообучения нейронных сетей) и выявления атакующих узлов.
Возможно предполагать, что любое взаимодействие с данным узлом будет являться попыткой атаки. Данные, собираемые о сети — это цельная картина сетевого взаимодействия.
Как правило, полные сетевые данные не собираются, т.к. это ресурсоёмко и считается, что нарушитель либо не может находиться внутри сети, либо ему обязательно нужна связь с внешним миром (что, конечно, не обязательно так, ведь провести атаку возможно и на физически изолированную сеть, для чего существуют техники "преодоления воздушного зазора"). В этом случае, IDS анализирует трафик, идущий через маршрутизатор, для чего в маршрутизаторе имеется SPAN порт, с которого трафик перенаправляется в IDS. В принципе, ничего не мешает собирать данные с узла, на котором работает IDS, это даже полезно и привносит дополнительный контроль. Также возможно собирать трафик сети на её узлах. Но это заставляет сетевой адаптер узла работать в режиме захвата всего трафика, чего обычно не предполагается при штатной работе, плюс это явно избыточно (единственный вариант, когда это может быть полезно, с большой натяжкой, — распределённый анализ потока). Классы методов получения данных: При пассивном обнаружении, система просто наблюдает за обстановкой. Большинство IDS используют данный класс методов. Системы уровня хоста также, обычно используют данный класс методов. Например, они не пытаются удалить системный файл из под пользователя и проверить, что он был удалён, а просто оценивают соответствие прав на данный файл, шаблону в базе, и если соответствие не наблюдается, выдают предупреждение. В данном классе методов ошибки провоцируются путём некоторых действий, как известных, так и неизвестных (fuzzy системы). После этого, по базе анализируется реакция на данные действия. Данный класс методов характерен для сканеров уязвимостей. Для интерпретации результатов применимы оба класса методов: Плюсы очевидны: Минусы: При этом, риски направленных атак всё-равно остаются. Этот риск, возможно в меньшей степени, имеет место быть и для других классов методов. Возможно выделить следующие классы, каждый из которых может включать несколько методов: Сводится к поиску признаков уже известных атак. Преимущества: Недостатком этих методов является невозможность обнаруживать неизвестные системе атаки. В классическом варианте реализация предполагает сравнение сигнатур пакетов с сигнатурами в базе. Сравнение может быть, как точное, так и с шаблоном или по регулярному выражению.
Большинство известных IDS используют методы данного класса. Сюда же возможно отнести методы нечёткого сравнения: Суть в том, чтобы записать шаблон нормальной активности сети и реагировать на отклонения от этого шаблона. Возможен вариант реализации в виде базы сигнатур "нормальных" пакетов в сети
и статистической системы обнаружения отклонений, когда анализатор ищет какие-то редкие действия, или активности. События в системе исследуются статистически, чтобы найти те из них, проявление которых выглядит аномальным. Представленный ниже детектор будет пытаться обнаружить аномалии. Как показал анализ существующих решений, обычно используются два типа методов: Результат также может быть представлен с определённым уровнем достоверности. И любая нейросеть представляет результат, не как "да" или "нет", а как множество вероятностей результатов. В существующих подходах вероятность аппроксимируется к единичной или нулевой (например, изо всех возможных атак на выходе сети, выбирается первая с самой высокой вероятностью) и нигде дальше не учитывается. На данном этапе параметр "Метод представления результата" не представляет интереса (он был введён для разделения детекторов). Далее, я сведу их в меньшее количество типов: Ниже указаны примеры существующих решений, попадающие в вышеназванные группы. Snort является классической IDS уровня сети и анализирует трафик на совпадение с базой правил (фактически с базой сигнатур). Т.е., данная система ищет известные нарушения. Для Snort возможно несложно реализовать свой модуль, что и было сделано в одной из работ. На базе Snort реализовано много известных коммерческих решений, в том числе русских. Помимо работы с базой сигнатур, построенная на базе Snort IDS, вполне может иметь в своём составе эвристические, нейросетевые и подобные модули обнаружения. Как минимум, существует в рабочем виде статистический детектор аномалий для Snort. Suricata также, как и Snort является системой уровня сети.
У данной системы есть несколько особенностей: Т.е., эта система, хотя и обнаруживают известные нарушения, также как предыдущая, обладает большей адаптивностью и возможностью обучаться (уровень репутации хоста может изменяться в процессе работы системы и влиять на принятие ей решения). Платформа для создания IDS уровня сети. Является гибридной системой, с упором на обнаружение известных нарушений. Работает на транспортном, сетевом уровне и уровне приложений. Поддерживает свой язык сценариев. Имеется возможность обнаружения аномалий, например, множественное подключение к сервисам на разных портах — не свойственное для нормального узла поведение, которое будет обнаружено. Это реализовано, во-первых, на основе на основе проверок передаваемых данных на нормальность (например, TCP-пакет со всеми установленными флагами, наверное тут что-то не то, несмотря на то, что он корректен). Во-вторых, на базе политик, описывающих как должна функционировать сеть в норме. Bro не только обнаруживает атаки, но также помогает при диагностике сетевых проблем (заявленный функционал). Технически Bro реализован достаточно интересно: он не производит анализ трафика напрямую по признакам, а прогоняет пакеты на "событийной машине", которая преобразует поток пакетов в серию высокоуровневых событий. Эту машину возможно считать дополнительным уровнем абстракции, позволяющим отобразить сетевую (как правило, хотя и не обязательно) активность в терминах нейтральных относительно политик (события просто сигнализируют, о том, что нечто произошло, но о том почему, событийный движок ничего не говорит, т.к. это задача интерпретатора политик). Например, HTTP запрос будет преобразован в событие http_request с соответствующими параметрами, которое передаётся на уровень анализа. Интерпретатор политик выполняет сценарий, в котором устанавливаются обработчики событий. В данных обработчиках могут рассчитываться статистические параметры трафика. При этом, обработчики могут сохранять контекст, а не просто реагировать на отдельно взятый пакет.
Т.е., учитывается временная динамика, "история" потока. Краткая схема работы ядра Bro: По классической терминологии, это представители систем уровня хоста.
Совмещают в себе методы обнаружения известных нарушений и методы поиска аномальной активности. Механизм поиска аномалий основан на том, что при установке, система сохраняет в базе хэши системных файлов и метаинформацию о них. При обновлении пакетов операционной системы, хэши пересчитываются. В случае неконтролируемого изменения какого-либо наблюдаемого файла, через некоторое время система даст об этом знать (как правило, сканирование запускается планировщиком, хотя возможны системы, реагирующие на события ФС). Помимо наблюдения за файлами, данные системы могут наблюдать за процессами, соединениями и анализировать системные журналы. Также, ими может использоваться база известных нарушений, которая периодически обновляется.
Некоторые имеют централизованный интерфейс, который позволяет анализировать данные одновременно на многих узлах. Неплохо суть описана на сайте Samhain: Пример развёртывания OSSEC:
 Это гибридные системы, позиционируемые, как SIEM. Prelude сочетает в себе сенсорную сеть и анализатор. Заявлено, что данная система обеспечивает повышенный уровень безопасности, поскольку взломщик может обойти одну IDS, но сложность обхода многочисленных механизмов защиты возрастает экспоненциально. Система хорошо масштабируется: по заявлениям разработчиков, сенсорная сеть может покрывать континент или даже мир. Система совместима со многими существующими IDS по формату данных (IDMEF) в том числе с: AuditD, Nepenthes, NuFW, OSSEC, Pam, Samhain, Sancp, Snort, Suricata, Kismet и т.д.. Примерно тоже самое возможно сказать про OSSIM. Это системы, которые занимаются активным поиском уязвимостей на узле, либо в сети.
Самые простые ищут только известные проблемы, которые есть в базе, более серьёзные системы могут совмещать в себе как методы обнаружения известных нарушений, так и аномальной активности. Сканеры уязвимостей появились давно и наделать их успели достаточно много.
Приведу только несколько известных продуктов, которые представлены на рынке: Возможности данных систем на примере вышеприведённого XSpider: Системы специально сделанные уязвимыми, с целью привлечения к ним атак. Могут быть использованы для исследования действий атакующего. Пример развёртывания: Вообще, готовых honeypot решений достаточно много. Сюда же могут относиться ловушки типа tarpits, замедляющие атаку (повышает требования к ресурсам атакующего, даёт время на реагирование), которые возможно считать "активным" вариантом honeypot. В работе [14] проведён анализ упоминаний широко используемой базы KDD. Как видно, нейронные сети в работах за 2015-2016 годы представлены не столь широко, к тому же, это как правило, сети прямого распространения. На практике же, решения, в том числе и приведённые выше, в основном опираются на следующие технологии анализа: Про некоторые варианты решений, которых я не коснулся, возможно также посмотреть здесь. У данных решений есть свои проблемы: Нейронные сети, прежде всего стоит рассматривать, в качестве замены статистических детекторов аномалий, либо дополнения к ним, но в какой-то мере, они могут заменить сигнатурный поиск и прочие методы. Кроме того, гибридные системы, скорее всего будут применяться в ближайшем будущем. Нейронные сети имеют, как свои преимущества: Так и недостатки: Обобщу подходы, описанные в литературе: И практически используемые: Средства управления и мониторинга СПД эволюционируют в сторону комплексных решений. Современные системы, в целом стремятся к тому, чтобы не только выполнять узкую задачу обнаружения вторжений, но и помогать в диагностике неисправностей сети, при этом реализуя как методы обнаружения аномалий, так и методы обнаружения известных нарушений. В состав такой комплексной системы входят различные распределённые по сети сенсоры, которые могут быть, как пассивными, так и активными. Используя данные сенсоров, которыми могут являться целые экземпляры IDS, центральный коррелятор (в терминологии Prelude SIEM) анализирует общее состояние сети. При этом, возрастают объёмы данных, которые требуется обработать, и их размерность. В литературе, в основном, рассмотрены нейросетевые методы, основанные на перцептронах, либо картах Кохонена. Есть не заполненная ниша в виде разработок, на базе последних исследований, касающихся соревновательных нейросетей или свёрточных сетей. Хотя данные методы хорошо себя зарекомендовали в смежных областях, где требуется сложный анализ. Явно наблюдается разрыв между потребностями рынка и предложением в виде существующих решений. Поэтому, имеет смысл проводить исследования в данном направлении. Чтобы понять от чего надо защищаться, стоит определиться, где искать атаки, и что они из себя вообще представляют [16]. Во-первых, рассматривать канальный уровень и ниже я не буду, поскольку его протоколы специфичны для оборудования и большинство IDS не работает на данном уровне (здесь есть, разве что обнаружение ARP спуфинга, специфичного для Ethernet, про обнаружение же атак на PPP и подобные протоколы, я недостаточно знаю). Если смотреть на динамику атак по уровням, видно что с сетевого и транспортного в конце 90-х — начале 2000-х, они смещаются в сторону прикладного уровня. Ранее были популярны атаки типа Ping of the Death, IP Spoofing, SYN flood или ARP cache poison, а сейчас нижний уровень начинается где-то в районе DNS. От атак типа инъекций кода (например, SQL injection или PHP injection), которые ещё изредка встречаются, атакующие перешли к XSS и CSRF, которые они могут использовать для получения учётных данных, либо для выполнения неавторизованных запросов на серверах внутри сети. Сейчас кроссайтовый скриптинг закрыт в большинстве фрэймворков. Но может оставаться в самописных сайтах (в том числе, прошивках устройств). Активно проводятся атаки на Active Directory, из относительно свежих "олд-скул" атак на протоколы известна атака на SMB. Пока не завершён переход на HTTPS с HSTS, могут встречаться атаки типа SSL stripping.
Также, могут быть использованы эксплоиты для устаревших версий ПО (например, тот же, наделавший много шуму HeartBleed), от чего может помочь сканирование сети. Эти атаки проводятся, прежде всего с целью перехвата управления или раскрытия данных. Отдельно стоит выделить DoS атаки, которые как правило, проводятся на конкретный сервер.
Прежде они могли реализовываться на транспортном уровне (например, SYN Flood) и ниже, теперь же, чаще всего реализуются на прикладном (например, посылкой большого количества HTTP запросов) в виде DDoS. Фишинговые атаки также пока не потеряли своей актуальности. Во-вторых, рассматривать только сетевые атаки было бы наивно. В конечном итоге, не имеет значения, как будет осуществлён DoS: атакой на канал сервера, либо через взлом Windows-машины администратора сети, хранящей SSH ключи. Мало того, атака на целевые узлы сети часто начинается с захвата наиболее уязвимых пользовательских узлов. Кроме того, "классические" атаки прикладного уровня (например, на сервисы, такие как ftpd, либо дырявый sendmail), также уступают место атакам на уровне хоста. Причём, многие из них сейчас требуют тех или иных действий пользователя: просмотра каталога, открытия pdf документа, перехода на сайт и т.п.. Обнаружение атак уровня хоста IDS уровня сети не столь эффективно: как правило, атакующий рассчитывает на то, что сообщения будут проверены. Потому могут быть использованы обфускация, шифрование, либо внесение атакующего агента через сторонние каналы, в обход сети. С задачами обнаружения таких атак справляется антивирус. Но антивирус, без централизованного управления и анализа данных способен только лишь распознать локальную угрозу и устранить её. Он не способен определить, что это: случайно попавший файл, неудачная попытка целевой атаки с использованием плохо обфусцированного агента, либо начало проникновения червя в сеть.
Также, использование буткитов, как правило, сводит функционирование антивируса на нет. В-третьих, для осуществления почти любой атаки требуется знание о сети (пример, когда не требуется: физическое отключение сегмента, — и то здесь надо быть уверенным, что канал связи с внешним миром только один). Это знание возможно получить прямо или косвенно (кражей данных о топологии, например). Прямое получение данных о сети и её узлах осуществляется за счёт сканирования. Сканирование подразделяется на следующие типы: Сканирование диапазона адресов может быть совмещено со сканированием портов для поиска сервисов, которые могут оказаться уязвимыми. Сканирование может производиться "наивным методом", к примеру используя посылку ICMP ping. Но может быть замаскировано. Пример маскировки — посылка TCP SYN на указанные порты без последующего установления соединения. Как правило, современные IDS могут отловить оба варианта. Маскировка сканирования также может осуществляться разнесением его на длительное время, либо выполнением с нескольких узлов. Помимо сканирования, топология сети может быть определена менее точно, но более скрытно: Теперь возможно выделить типы атак для каждого класса. Несколько примеров типов атак: Конечно, большинство из этих атак также возможно маскировать, но при этом, возможно обнаружить попытку маскировки и также её интерпретировать, как атаку (самый простой пример: многие антивирусы обнаруживают такую технику маскировки, как внедрение в процесс, считая её за вредоносную активность). Некоторые атаки на хост возможно распознать по изменению потребления ресурсов. Запуск дополнительного кода, как правило, ведёт к повышению потребления памяти, увеличению частоты обращения к диску и увеличению использования CPU. Обычно данные аспекты не маскируют, т.к. они являются незначительными. Однако, при поражении большого количества узлов, возможно выделить характерные паттерны. Часто, начиная с какого-то момента, хост начинает проявлять нетипичную для него сетевую активность, например попытку регулярного обращения к сайтам, на которые ранее обращений не было, либо к сайтам, доменные имена которых не разбиваются на словарные слова (ну или имеют высокую энтропию относительно "нормальных" имён). На стороне узла данная активность, как правило успешно маскируется (поскольку, если был антивирус, он её пропустил), но она может быть видна сетевой IDS. Типы атак: Про конкретные атаки подробнее было написано выше. Подразделяется на: Первый вариант атаки проще обнаружить сетевой IDS: трафик сканирования будет заметен, если он компактно расположен во времени. В ином случае, следует использовать методы слабо чувствительные к временным разрывам.
Второй вариант проще всего обнаружить с использованием данных, полученных непосредственно с узла. Считая, что вышеназванные атаки вызовут отклонения в использовании ресурсов, будут собираться следующие параметры: Параметры узлов объединяются в вектор. В работе [12] предлагается собирать следующие сетевые параметры: В работе [6] представлен обширный список параметров, взятый из базы NSL-KDD. Одной из интересных особенностей в данной работе является то, что признаки нейросети могут настраиваться пользователем. Хотя это и не актуально для концепта в данной статье, но может быть учтено при разработке законченного продукта. Номер порта отправителя, как правило, не имеет смысла учитывать, поскольку он генерируется автоматически. При разработке концепта, я буду использовать базу NSL-KDD для эмуляции сетевой активности, поскольку с ней удобно работать. Соответственно, параметры будут взяты оттуда. В реальной же системе, как следует из обзора, желательно подробно разбирать пакеты прикладных протоколов. Я выбрал параметры, отталкиваясь от работы [6] и несколько дополнив их. Типичная IDS состоит из следующих компонентов: Датчики: Подсистема анализа: Датчиков в современных IDS, как правило несколько, и они могут быть распределены по машинам пользователя. Лучше всего это видно на примерах Prelude SIEM и OSSIM, описанных выше. Задачей датчиков является захват данных, их накопление и отправка центральной системе. Датчики подразделяют на: Полученная от датчиков информация декодируется в набор признаков и проводится через цепочку модулей анализа. Модуль анализа принимает информацию из источника данных и анализирует данные на наличие признаков атак или нарушений политики безопасности. Он может использоваться, как для обнаружения вторжений, эксплуатирующих известные шаблоны атак, так и для обнаружения аномальной активности. Анализаторы известных атак могут опираться на обновляемую базу сигнатур, либо быть реализованы на основе сети прямого распространения, обученной на примерах атак.
Анализаторы аномалий могут учитывать не только состояние датчиков, но и результаты работы предыдущих анализаторов. После того, как анализаторы отработали, в том или ином виде выводится их совокупное состояние. Это может быть, как вывод данных пользователю через один из интерфейсов, за что отвечают модули вывода, так и указание цели активной системе защиты (например, брандмауэру на блокирование соединения), за что отвечают модули реагирования. Кратко это выглядит так:  Изо всего вышесказанного следует, что детектор должен быть комбинированным: обнаруживать аномалии и известные атаки. Либо это должно быть несколько разных детекторов в цепи. Кроме того, желательно чтобы IDS периодически запускала активное сканирование с целью обнаружения потенциальных уязвимостей. В связи с объёмом работы, требуемой для реализации полноценного детектора, в данной статье я решаю ограниченную задачу построения концепта модуля обнаружения аномалий. Предполагается, что данные мне поставлены модулем декодирования в понятной форме, в виде набора признаков, которые я могу подать на входы сети (это база NSL-KDD). Данные хостов будут сгенерированы. С учётом предпосылки в начале статьи, метод представления результатов детектора желательно реализовать многоклассовым (чтобы не только обнаруживать наличие аномальной активности, но и определять её тип), но с целью упрощения будет реализован двуклассовый детектор. Все детекторы аномалий, независимо от модели использованной при их построении, действуют по принципу сравнения данных эталона с текущей обстановкой и сигнализации, при выходе за указанный порог. Любая модель от статистической, до искусственной имунной системы должна иметь такой эталон.
В случае нейросети, эталон создаётся в процессе обучения во время нормальной работы сети передачи данных (СПД), затем сеть, функционируя, выявляет отклонения, выходящие за указанные границы. Сложности данного подхода заключаются в том, что: Сеть надо обучить при нормальном функционировании СПД, но нельзя быть уверенным, что в данный момент не ведётся атака, и сеть не обучится на "аномальной активности". Остановить СПД или отключить её от внешних сетей тоже нельзя: даже если возможно прервать её работу, в будущем активность подключенной СПД будет трактоваться, как аномальная. От проблемы обучения на при нормальном функционировании уйти не представляется возможным (её решают написанием правил, описывающих функционирование СПД в нормальном режиме, но здесь это не применимо). Проблему большого объёма данных, разнесённого во времени, возможно смягчить, используя адаптивную подстройку. Как возможно видеть на визуализации ниже, сетевая активность при атаках отлична от нормальной активности сети (данные взяты из NSL-KDD):   Т.е., возможно увидеть аномальную активность атаки на фоне нормальной активности сети:  Потому, обнаруживать аномалии предлагается с помощью кластеризации "картины сетевой активности".  Как правило, задача кластеризации в рамках нейросетевого подхода решается с использованием самоорганизующихся карт Кохонена. Дополнительными проблемами, которые вносит данный подход, являются: Чтобы исключить данные проблемы, для построения детектора аномалий, я решил обратиться к адаптивным нейросетевым алгоритмам кластеризации. Идея обнаружения такова: сеть учится в режиме нормального функционирования СПД в течение некоторого времени. При этом, образуется некоторое количество кластеров данных, которые при правильной настройке сети, полностью характеризуют нормальное функционирование СПД. Есть следующие варианты обнаружения: В первом случае, аномалии возможно обнаружить по: Во втором случае аномалии обнаруживаются по отклонению значения новых измерений от среднего для данных, на которых сеть обучена. В сетевых алгоритмах расчёт динамики выполнить сложно: сеть может изменять количество нейронов и связей на каждой итерации, при том что некоторые алгоритмы создают и удаляют фиксированное количество нейронов на каждой итерации. Изменение количества кластеров не является надёжным показателем. Кроме того, обучение сети в процессе обнаружения ставит несколько других проблем (таких, как переобучение, например).
Достаточно надёжным вариантом является измерение отклонений. Именно этот вариант будет применён. Данные с узлов пересылаются агентами и для каждого параметра вычисляется среднее. Эти данные объединяются в один вектор с данными сетевой активности, получаемыми от IDS. В прототипе данные хостов генерируются функцией, которая увеличивает потребление ресурсов в определённом проценте атак (на данный момент, выбрано 25%). Данные сети предоставляются модулю IDS в стандартизованном виде. В прототипе это записи NSL-KDD. Реализован будет алгоритм обнаружения отклонений от среднего:  Как видно из диаграммы, в данном алгоритме может быть использована адаптивная подстройка, напоминающая метод обучения с частичным привлечением учителя. С целью улучшения качества обнаружения, считается не одно отклонение, а средние отклонения для лучше всего подходящих нейронов. Потом для кластера вычисляется корень из среднего арифметического всех значений отклонений, входящих в него нейронов.  Для поданного на проверку сэмпла данных ищется ближайший нейрон, считается расстояние между ними и сравнивается с посчитанным среднеквадратическим отклонением для кластера, в который входит нейрон. Если расстояние между сэмплом и нейроном больше отклонения по кластеру, данный сэмпл считается аномальным. Это гибрид метода классификации по среднему расстоянию, который используется для определения класса нейронов, в статье 20 и метода по классификации по минимальному расстоянию. Сначала используется первый: выбирается лучший нейрон. Затем, считается разница между средним отклонением по кластеру. Ещё один вариант — классификация по методу большинства, когда нейрон получает класс по максимальному количеству точек в его области Вороного здесь не применим. Ядро детектора представляет собой объект, реализующий один из алгоритмов "растущего нейронного газа" или GNG, который обучен на сетевой активности во время нормального функционирования СПД. GNG позволяет кластеризовать данные, самостоятельно определяя необходимое количество кластеров. В частности, это может быть один из следующих алгоритмов: Модуль хранит данные, на которых он обучался, в виде структуры сети и получает новые данные во время работы. На выходе модуль должен постоянно выводить результат: есть аномальная активность, либо нет, либо вероятность наличия данной активности. На следующем рисунке показан пример кластеризации, с использованием GNG (на ограниченном подмножестве, с целью наглядности), где ясно видно, как алгоритм сходится.  Существует несколько реализаций GNG, как минимум: Реализация на MQL-5 в вышеприведённой статье [18]. Язык сильно похож на C++ и легко понимается. В целом, общий стиль данной реализации мне не понравился. Соответственно, в качестве языка реализации прототипа используется Python. С реализациями IGNG дело обстоит хуже, и я не нашёл ни одной, хотя конечно же они есть, т.к. авторы статьи получали результаты для своего алгоритма. В результате, IGNG реализацию пришлось реализовывать полностью самостоятельно. Точкой входа является функция main(), которая устанавливает параметры и вызывает функцию test_detector(), гоняющую детектор так, как задумано. В функции test_detector() предварительно загружаются данные для обучения детектора.
Затем, производится обучение, используя метод train(), и вызывается обнаружение на разных наборах данных, используя метод detect_anomalies(). Все данные загружаются функцией read_ids_data(). Функция читает данные из базы NSL-KDD с использованием стандартного модуля csv. Какие данные будут прочитаны: нормальные, аномальные или полные, задаётся параметром activity_type. Также функция, если было запрошено, может сгенерировать активность хостов, вызвав generate_host_activity(), и добавить полученные данные к данным сети.
Функция вернёт результат в виде ненормализованного массива Numpy. После возврата из функции, данные будут нормализованы, используя функцию normalize() модуля preprocessing библиотеки Scikit-Learn. Далее, вся работа производится только с нормализованными данными. На прочитанных данных строится ненаправленный граф, как объект класса Graph библиотеки NetworkX через вызов функции create_data_graph().
Этот граф нужен только для визуализации. Данные передаются конструктору класса детектора. В конструкторе данные запоминаются во внутренний атрибут класса и создаётся пустой граф, в который будут добавляться нейроны и связи. Основным классом детектора является GNG или IGNG, в зависимости от реализованного алгоритма. Эти классы являются наследниками абстрактного класса NeuralGas, в котором реализованы общие методы. В методе train() многократно вызывается кластеризующий метод и периодически сохраняется картинка с визуализацией через вызов метода __save_img(). Кластеризующему методу передаётся одно из значений, которое представляет собой набор координат точки данных в многомерном пространстве. Получая данные этой точки, кластеризующий метод выбирает наиболее близкие нейроны внутреннего графа (того, который был создан в конструкторе) и, если они не удовлетворительны, создаёт новые нейроны и связи. В методе __save_img() для формирования картинки используются функции draw_dots3d(), либо draw_graph3d(), который вызывается два раза: сначала для отрисовки данных, затем для отрисовки нейронной сети поверх данных. Внутри визуализация реализована с помощью библиотеки Mayavi и основной вызов, рисующий точки — это mayavi.points3d(). После завершения обучения, сохранённые картинки сшиваются в GIF, используя модуль ImageIO. Полный исходный код находится здесь: https://github.com/artiomn/GNG Код сначала был адаптирован для многомерных данных и частично переписан. По ходу этого, выяснилось, что код индусский, и алгоритм вообще реализован некорректно (см. например на использование переменной i в методе train оригинала: благодаря этому багу, код работал). Затем, в связи с низкой скоростью работы, был реализован алгоритм IGNG. На всякий случай (потому что неизвестно, что будет с Github в течение ближайшего года) продублирую здесь код прототипа. Прототип однопоточный и медленный. Потому, его обучение на больших выборках занимает достаточно много времени (по нескольку часов для каждого алгоритма), а распределение результатов примерно соответствует маленькой выборке. Потому, и в связи с недостатком времени, финальное обучение я провёл на маленькой выборке. Сначала детектор был обучен на обучающей выборке, затем применён к выборке на которой он учился. После чего, обученный детектор был применён к аномальным и к полным данным из того же множества, из которого была построена обучающая выборка. Затем, тоже самое было повторено на тестовых выборках. Заданные параметры: Обозначения: Выводы: Получилось хуже, чем я ожидал. Но уже закончился отпуск, так что доделать и изучить ещё несколько моментов я не успеваю. Кратко опишу их здесь. Жду замечаний, вопросов и уточнений. [1] http://www.irjcs.com/volumes/vol4/iss09/08.SISPCS10095.pdf "J.Rubina Parveen — Neural networks in cyber security — 2017"
[2] http://e-notabene.ru/nb/article_18834.html "Мустафаев А.Г. — Нейросетевая система обнаружения компьютерных атак на основе анализа сетевого трафика — 2016"
[3] https://www.sciencedirect.com/science/article/pii/S2352864816300281 "Haibo Zhang, Qing Huang, Fangwei Li, Jiang Zhu — A network security situation prediction model based on wavelet neural network with optimized parameters — 2016"
[4] https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4896428/pdf/pone.0155781.pdf "Min-Joo Kang, Je-Won Kang — Intrusion Detection System Using Deep Neural Network for In-Vehicle Network Security — 2016"
[5] https://journals.nstu.ru/vestnik/download_article?id=3366 "Д.К. Левоневский, Р.Р. Фаткиева — Разработка системы обнаружения аномалий сетевого трафика — 2014"
[6] https://storage.tusur.ru/files/425/КИБЭВС-1005_Жигулин_П.В__Подворчан_Д.Э.pdf "Жигулин П.Э., Подворчан Д.В. — Анализ сетевого трафика с помощью нейронных сетей — 2013"
[7] https://www.sciencedirect.com/science/article/pii/S1877705814003579 "Halenar Igor, Juhasova Bohuslava, Juhas Martin, Nesticky Martin — Application of Neural Networks in Computer Security — 2013"
[8] http://psta.psiras.ru/read/psta2011_3_3-15.pdf "Талалаев А.А., Тищенко И.П., Фраленко В.П., Емельянова Ю.Г. — Нейросетевая технология обнаружения сетевых атак на информационные ресурсы — 2011"
[9] https://pdfs.semanticscholar.org/94f8/e1914ca526f53e9932890a0356394f9806f8.pdf "E.Kesavulu Reddy — Neural Networks for Intrusion Detection and Its Applications — 2013"
[10] http://elib.bsu.by/bitstream/123456789/179040/1/119-122.pdf "Балахонцев А.Ю., Сидорик Д.В., Сидоревич А.Н., Якутович М.В. — Нейросетевая система для обнаружения атак в локальных вычислительных сетях — 2004"
[11] https://www.sans.org/reading-room/whitepapers/detection/application-neural-networks-intrusion-detection-336 "SANS Institute — Application of Neural Networks to Intrusion Detection — 2001"
[12] http://dom8a.ru/cupnewyear2014/prezentation/evlanenkova_paper.pdf "Евлаленкова О. — Применение нейронных сетей для обнаружения вторжений — ?"
[13] https://www.science-education.ru/pdf/2014/6/1632.pdf "Корнев П.А., Пылькин А.Н., Свиридов А.Ю. — Применение инструментария искусственного интеллекта в системах обнаружения вторжений в вычислительные сети — ?"
[14] https://www.researchgate.net/publication/309038723_A_review_of_KDD99_dataset_usage_in_intrusion_detection_and_machine_learning_between_2010_and_2015 "Atilla Özgür — A review of KDD99 dataset usage in intrusion detection and machine learning between 2010 and 2015 — 2016"
[15] http://citforum.ru/security/internet/ids_overview/ "Корниенко А.А., Слюсаренко И.И. — Системы и методы обнаружения вторжений: современное состояние и направления совершенствования — 2009"
[16] https://moluch.ru/conf/tech/archive/5/1115/ "Боршевников А.В. — Сетевые атаки. Виды. Способы борьбы — 2011"
[17] https://papers.nips.cc/paper/893-a-growing-neural-gas-network-learns-topologies.pdf "Fritzke B. — A Growing Neural Gas Network Learns
Topologies — 1993"
[18] https://www.mql5.com/ru/articles/163 "Субботин А. — Растущий нейронный газ, реализация на языке программирования MQL5 — 2010"
[19] https://www.researchgate.net/publication/4202425_An_incremental_growing_neural_gas_learns_topologies "Prudent Y., Ennaji A. — An incremental growing neural gas learns topologies — 2005"
[20] https://cyberleninka.ru/article/v/modifitsirovannyy-algoritm-rastuschego-neyronnogo-gaza-primenitelno-k-zadache-klassifikatsii "Муравьёв А.С., Белоусов А.А. — Модифицированный алгоритм растущего нейронного газа, применительно к задаче классификации — 2014
[21] http://www.booru.net/download/MasterThesisProj.pdf "Jim Holmström — Growing Neural Gas
Experiments with GNG, GNG with Utility and Supervised GNG — 2002" Технарь-психопат