Файл: Обзор методов и средств анализа сетевого трафика и поиска аномалий трафика (Классификация средств мониторинга и анализа).pdf
Добавлен: 25.04.2023
Просмотров: 1909
Скачиваний: 43
СОДЕРЖАНИЕ
Глава 1. Исследование существующих систем мониторинга и анализа сетевого трафика
1.1 Классификация средств мониторинга и анализа
Глава 2. Проектирование системы
Глава 3. Разработка прототипа системы анализа сетевого трафика
3.1 Модуль преобразования дампа сетевого трафика
3.2 Обоснование выбора программных средств
3.3 Модуль хранения сетевого трафика
3.4 Обоснование выбора программных средств
3.5 Модуль анализа и отображения
3.7 Анализ частоты запросов по ip-адресам
3.8 Обоснование выбора программных средств
На текущий момент идет разбор пакетов исключительно на сетевом и транспортном уровне, так как для прототипа это тот максимум информации, который нужен в дальнейшем анализе [18]. Этот функционал системы легко расширяем по мере надобности.
С сетевого уровня сохраняем информацию о:
- длине пакета;
- времени поступления пакета (секунды, миллисекунды и строку с датой и временем);
- протоколе сетевого уровня (идентификатор и название);
- протоколе транспортного уровня (идентификатор и название). С транспортного уровня сохраняем информацию о:
- ip-адрес и порт источника;
- ip-адрес и порт получателя.
Модуль реализован на языке С++ с использованием библиотеки WinPcap
- для правильной обработки дампа трафика и драйвером для базы данных.
3.2 Обоснование выбора программных средств
C++ — компилируемый, статически типизированный язык программирования общего назначения. Являясь чрезвычайно мощным языком, он содержит средства создания эффективных программ почти любого назначения: от низкоуровневых утилит и драйверов до сложных программных комплексов. В частности:
-
- поддерживает разные технологии программирования: традиционное директивное программирование, метапрограммирование (шаблоны, макросы), ООП, обобщённое программирование;
- позволяет пользовательским функциям-операторам кратко и емко записывать выражения над пользовательскими типами в естественной алгебраической форме;
- автоматически вызывает деструкторы объектов при их уничтожении в порядке обратном вызову конструкторов, что упрощает создание кода, делает более надёжным освобождение ресурсов (таких как память, семафоры, файлы и т. п.) и позволяет гарантированно выполнить любые переходы состояний программы, даже не обязательно связанные с освобождением ресурсов (к примеру, запись в журнал);
- выполняет программы предсказуемо, что является важным для построения систем реального времени. Генерируемый компилятором код для реализации языковых возможностей (например, при преобразовании переменной к другому типу) описан в стандарте, в котором также строго определены места, где этот код выполняется. Такое поведение дает возможность измерять время реакции программы на внешнее событие;
- поддерживает понятия логической (mutable) и физической (const) константности, что увеличивает надежность программы, так как позволяет компилятору диагностировать ошибочные попытки изменения значения переменной. Объявление константности предоставляет программисту, который читает текст программы, дополнительное представление о правильном использовании классов и функций, что, в свою очередь, может являться подсказкой для оптимизации. Перегрузка функций-членов по признаку константности дает возможность определить внутри объекта цели вызова метода (константный – для чтения, неконстантный – для изменения). Чтобы сохранить логическую константность при использовании кэшей и ленивых вычислений используют объявление mutable;
- может создавать встроенные предметно-ориентированные языки программирования. Для иллюстрации этого пункта можно привести библиотеку Boost.Spirit, которая позволяет задавать EBNF-грамматику парсеров прямо в коде C++;
- использует шаблоны с целью создания обобщённых контейнеров и алгоритмов для различных типов данных, а также специализации и вычисления на этапе компиляции;
- с помощью шаблонов и множественного наследования может имитировать классы-примеси и комбинаторную параметризацию библиотек. Пример такого использования языка существует в библиотеке Loki, где класс SmartPrt позволяет, управляя всего несколькими параметрами времени компиляции, сгенерировать примерно 300 видов «умных указателей» для управления ресурсами;
- может имитировать расширения языка для поддержки парадигм, которые не поддерживаются компиляторами напрямую: к примеру, библиотека Boost.Bind позволяет связывать аргументы функций;
- кроссплатформенен: стандарт языка накладывает минимальные требования на вычислительное устройство для запуска скомпилированных программ. В стандартной библиотеке есть возможности для определения реальных свойств системы выполнения. Стоит отметить, что компиляторы этого языка доступны для большого количества платформ;
- высоко совместим с языком Си; это позволяет использовать весь существующий Си-код: код на Си может быть с минимальными переделками скомпилирован компилятором C++; библиотеки, написанные на Си, могут вызываться из C++ без каких-либо дополнительных затрат, в том числе и на уровне функций обратного вызова, позволяя библиотекам, написанным на Си, вызывать код, написанный на С++.
- эффективен при использовании, благодаря тому, что язык спроектирован так, чтобы дать программисту максимальный контроль над всеми аспектами структуры и порядка исполнения программы. Для обеспечения максимальной производительности позволяет отключить все языковых возможностей, которые приводят к дополнительным накладным расходам, потому что они не являются обязательными для использования;
- имеет инструменты для работы на низком уровне с памятью и адресами.
Хотя у С++ существуют и недостатки, в нашем случае они не столь важны, потому что скоростная эффективность от использования этого языка превышает неудобства при разработке.
3.3 Модуль хранения сетевого трафика
Через драйвер программа-сниффер заполняет базу данных записями о полученных пакетах (одна запись – один пакет). Назначение данного модуля по мимо хранения информации – это уменьшить объем занимаемый дампом и ускорить выборку данных при запросе пользователя.
Для нашей системы сниффер записывает только определенные части пакетов, которые на текущем этапе интересны нам для анализа. В таблице 2 отображена схема записи об одном пакете.
Таблица 2 – Схема данных, хранящихся в базе данных
Поле |
Тип |
Описание |
|
id |
ObjectId |
Идентификатор записи в документе |
|
time |
Object |
Сборное поле для времени получения пакета |
|
seconds |
Int32 |
Время в секундах |
|
useconds |
Int32 |
Время в миллисекундах |
|
data |
String |
Дата и время получения пакета |
|
internetLayer |
Object |
Данные о протоколе сетевого уровня |
|
number |
Int32 |
Идентификатор |
|
name |
String |
Название |
|
transportLayer |
Object |
Данные о протоколе транспортного уровня |
|
number |
Int32 |
Идентификатор |
|
name |
String |
Название |
|
length |
Int32 |
Длина пакета в октетах, включая заголовок и данные |
|
source |
Object |
Данные об отправителе пакета |
|
ip |
String |
IP-адрес |
|
port |
Int32 |
Порт |
|
destination |
Object |
Данные о получателе пакета |
|
ip |
String |
IP-адрес |
|
port |
Int32 |
Порт |
3.4 Обоснование выбора программных средств
Для прототипа была взята MongoDB – документо-ориентированная база данных с открытым исходным кодом, не требующая описания схемы таблиц.
Основные возможности:
-
- документо-ориентированное хранение (JSON-подобная схема данных);
- использование Javascript в качестве языка для формирования запросов;
- широкий набор атомарных операций над данными (условный поиск, сложная вставка/обновление и тому подобное);
- разные типы данных (в том числе поддержка массивов);
- поддержка индексов (B-Tree);
- профилирование запросов;
- журналирование операций, изменяющих данные в базе данных;
- поддержка отказоустойчивости и масштабируемости: асинхронная репликация, набор реплик и распределения базы данных на узлы;
- эффективное хранение больших объектов, административный интерфейс, серверные функции, Map/Reduce и другое;
- полнотекстовый поиск, в том числе на русском языке, с поддержкой морфологии.
В отличие от реляционных баз данных MongoDB предлагает документо- ориентированную модель данных, благодаря чему она работает быстрее, обладает лучшей масштабируемостью, ее легче использовать.
Но, даже учитывая все недостатки традиционных баз данных и достоинства MongoDB, важно понимать, что задачи бывают разные и методы их решения бывают разные. В какой-то ситуации MongoDB действительно улучшит производительность вашего приложения, например, если надо хранить сложные по структуре данные. В другой же ситуации лучше будет использовать традиционные реляционные базы данных. Кроме того, можно использовать смешенный подход: хранить один тип данных в MongoDB, а другой тип данных - в традиционных БД.
Вся система MongoDB может представлять не только одну базу данных, находящуюся на одном физическом сервере. Функциональность MongoDB позволяет расположить несколько баз данных на нескольких физических серверах, и эти базы данных смогут легко обмениваться данными и сохранять целостность.
Рассмотрим несколько свойств этой базы данных:
- Формат данных в MongoDB.
Одним из популярных стандартов обмена данными и их хранения является JSON (JavaScript Object Notation). JSON эффективно описывает сложные по структуре данные. Способ хранения данных в MongoDB в этом плане похож на JSON, хотя формально JSON не используется. Для хранения в MongoDB применяется формат, который называется BSON или сокращение от binary JSON.
BSON позволяет работать с данными быстрее: быстрее выполняется поиск и обработка. Хотя надо отметить, что BSON в отличие от хранения данных в формате JSON имеет небольшой недостаток: в целом данные в JSON- формате занимают меньше места, чем в формате BSON, с другой стороны, данный недостаток с лихвой окупается скоростью.
- Кроссплатформенность.
MongoDB написана на C++, поэтому ее легко портировать на самые разные платформы. MongoDB может быть развернута на платформах Windows, Linux, MacOS, Solaris. Можно также загрузить исходный код и самому скомпилировать MongoDB, но рекомендуется использовать библиотеки с официального сайта.
- Коллекции.
Если в традиционном мире SQL есть таблицы, то в мире MongoDB есть коллекции. И если в реляционных БД таблицы хранят однотипные жестко структурированные объекты, то в коллекции могут содержать самые разные объекты, имеющие различную структуру и различный набор свойств.
- Репликация.
Система хранения данных в MongoDB представляет набор реплик. В этом наборе есть основной узел, а также может быть набор вторичных узлов. Все вторичные узлы сохраняют целостность и автоматически обновляются вместе с обновлением главного узла. И если основной узел по каким-то причинам выходит из строя, то один из вторичных узлов становится главным.
- Простота в использовании.
Отсутствие жесткой схемы базы данных и в связи с этим потребности при малейшем изменении концепции хранения данных пересоздавать эту схему значительно облегчают работу с базами данных MongoDB и дальнейшим их масштабированием. Кроме того, экономится время разработчиков. Им больше не надо думать о пересоздании базы данных и тратить время на построение сложных запросов.
- GridFS.
Одной из проблем при работе с любыми системами баз данных является сохранение данных большого размера. Можно сохранять данные в файлах, используя различные языки программирования. Некоторые СУБД предлагают специальные типы данных для хранения бинарных данных в БД (например, BLOB в MySQL).
В отличие от реляционных СУБД MongoDB позволяет сохранять различные документы с различным набором данных, однако при этом размер документа ограничивается 16 Мб. Но MongoDB предлагает решение - специальную технологию GridFS, которая позволяет хранить данные по размеру больше, чем 16 Мб.
Система GridFS состоит из двух коллекций. В первой коллекции, которая называется files, хранятся имена файлов, а также их метаданные, например, размер. А в другой коллекции, которая называется chunks, в виде небольших сегментов хранятся данные файлов, обычно сегментами по 256 Кб.
3.5 Модуль анализа и отображения
К заполненной базе подключается web-сервер, который берет на себя функционал:
- разграничения доступа к информации – взаимодействие разрешено только провайдеру (рисунок 6);
- проведения заданной аналитики;
- отображение данных и графиков;
- обеспечение запросов на сторонние ресурсы – получение данных об автономных системах, которым принадлежат IP-адреса, на которые идут запросы.
Рисунок 6 – Аутентификация пользователя
3.6Аналитика сетевого трафика
С заданного временного промежутка выбираются пакеты, которые отправляются из локальной сети во внешнюю, измеряется временной промежуток между соседними по записи пакетами, а затем подсчитывается количество пакетов, попавших в заданный временной интервал. То есть, к примеру, если пакет пришел с интервалом 10 от предыдущего, то он записывается в промежуток от 0 до 10.
Для демонстрации работы был установлен промежуток в 200 миллисекунд, это значит, что подсчитывались пакеты, попадающие в интервал с шагом 200. Также было установлено ограничение на вывод полученных результатов: отображаются первые 50 (рисунок 7).
Рисунок 7 – Отображение графика временных интервалов между
отправленными пакетами с шагом в 200 миллисекунд
Кроме этого имеет фильтр, позволяющий получать временную статистику для всех типов сетевых пакетов, так и для отдельных протоколов.
Например, на рисунках 8-10 выводятся графики временных интервалов для пакетов, устанавливающих сессию в протоколе TCP, для пакетов протокола UDP.
Рисунок 8 – График временных интервалов между отправленными
пакетами с установкой сессии
Рисунок 9 – График временных интервалов между отправленными
пакетами протокола UDP
Рисунок 10 – График временных интервалов для сравнения аналитики по различным протоколам
3.7 Анализ частоты запросов по ip-адресам
Следующий частью аналитики является вывод статистики частоты запросов на различные ip-адреса (рисунок 11). Для демонстрации вывод был ограничен до 30 часто запрашиваемых ресурсов.