Использование машинного обучения для классификации устройств в вашей сети

В этой статье мы планируем познакомить читателей с использованием нашего кода машинного обучения для классификации устройств в сети. Мы коснулись этого в предыдущих сообщениях блога о проекте программно-определяемой сети (SDN) Poseidon и о том, как он связан с обнаружением бокового движения, а также с использованием машинного обучения (ML) для анализа сетевых данных. Имея это в виду, мы экспериментировали с классификацией устройств с использованием данных захвата пакетов. Мы сделали несколько инструментов доступными, чтобы упростить опробование и в вашей собственной сети. Модели, которые мы будем использовать, работают в сочетании с проектом Poseidon SDN, и если вы хотите попробовать это сами, вы можете прочитать о том, как построить свою собственную программно-определяемую сеть с Raspberry Pis и переключателем Zodiac FX. Или посмотрите видео .

Для запуска кода машинного обучения у вас должен быть установлен Docker и какой-то способ захвата трафика на устройствах, которые вы хотите классифицировать. Для сбора сетевых данных рассмотрите возможность использования нашей версии tcpdump, которую мы модифицировали, чтобы включить флаги, которые удаляют информацию о полезной нагрузке уровня 4, а также информацию для внешних хостов. Выполнив предварительные требования, вы можете запускать

docker pull lab41/poseidonml

чтобы получить контейнер машинного обучения, и мы готовы начать. В этом посте будут рассмотрены четыре вещи:

· Запуск предварительно обученной модели на ваших данных

· Сборка набора данных

· Обучение модели на новом наборе данных

· Тестирование производительности на тестовом наборе данных

Запуск предварительно обученной модели на ваших данных

Проще всего запустить одну из моделей, которые мы обучили на ваших собственных данных. Для этого сначала создайте захват пакетов (наша программа машинного обучения PoseidonML ожидает pcap) с интересующего устройства, если у вас его еще нет. Захват должен длиться не менее 15 минут и содержать большой объем внутреннего внутреннего трафика, но более длительный захват может дать более надежные результаты.

Теперь вы можете выбрать одну из двух моделей для классификации. По умолчанию в PoseidonML выбрана модель случайного леса. При обучении на новых данных производительность этой модели сразу внушает оптимизм (подробнее об этом в следующем разделе!), Так что это хорошее место для начала. Чтобы запустить эту модель на вашем компьютере:

docker run –v <path_to_pcap>:/pcaps/eval.pcap lab41/poseidonml

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

docker run –v <path_to_pcap>:/pcaps/eval.pcap lab41/poseidonml:onelayer

В любом случае вы должны получить вывод с сообщением, которое выглядит примерно так:

Message: {“98:01:xx:xx:xx:xx”: {“classification”: {“confidences”: [0.6856065894902689, 0.2727088338248893, 0.022470232107183397], “labels”: [“Developer workstation”, “Unknown”, “Active Directory controller”]}, “timestamp”: 1498669414.355485, “valid”: false, “decisions”: {“behavior”: “normal”, “investigate”: false}}}

Это сообщение, которое инструменты машинного обучения отправляют обратно в Посейдон. Поле «классификация» указывает метки, которые модель классификации назначила устройству, с которого был получен входной pcap, а поле достоверности дает связанные достоверности этих меток. Кроме того, есть поле «поведение», которое обычно должно быть «нормальным», указывающее, что модель не обнаружила аномального поведения, и поле «исследования», которое верно, если инструменты машинного обучения запрашивают у Poseidon дополнительные данные из этого устройство. Поле «действительное» просто указывает, был ли запрос на анализ этого устройства сделан Poseidon со связанными метаданными, поэтому в этом случае оно должно быть ложным. Возвращаются 3 основных типа устройств, которые могут содержать метку «Неизвестно».

Сборка набора данных

Одна из основных проблем, которые мы волновали в этом проекте, заключается в том, выглядят ли данные из вашей сети как-то похожими на данные, на которых мы обучили наши модели. В противном случае инструменты машинного обучения работать не будут. В свете этого мы решили, что нам следует попытаться упростить переобучение моделей машинного обучения на новых данных. Самая сложная часть этого - собрать набор данных, который будет работать для этого. Однако вот несколько практических правил, которые, как мы обнаружили, хорошо работают для нашей конкретной проблемы:

1. Имейте несколько устройств для каждой метки, которую вы хотите назначить.

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

2. Захватывайте трафик непрерывными сегментами продолжительностью не менее 15 минут.

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

3. Общая продолжительность захватов с каждого устройства должна быть не менее 5 часов.

Это предназначено для того, чтобы «усреднить» конкретные варианты использования устройства и дать лучшее представление о том, как оно ведет себя в целом, а не в один момент времени.

4. Зарезервируйте некоторые устройства для тестирования.

Это делается для того, чтобы оценить, насколько хорошо работает обучаемая вами модель. Необходимо тестировать данные, отличные от данных, на которых вы обучались, иначе вы не узнаете, усвоила ли ваша модель что-нибудь общее.

Чтобы упростить задачу, мы приняли соглашение об именах для файлов захвата в форме

DeviceName-deviceID-time-duration-flags.pcap

Например, часовой захват с моей рабочей станции во вторник в 15.20 UTC может иметь такое имя:

DevWorkstation-User1-Tues1520–60mins-n00.pcap

После выполнения сбора вы должны открыть каталог захваченных файлов. Вот несколько примеров того, что мы использовали на тренировках:

Fileserver-a-unk-unk-n00.pcap
GPULaptop-user1-Fri0409–60mins-n00.pcap
Iphone-b-Wed0945–5days-n00.pcap
BusinessWorkstation-user2-Mon-3days-00.pcap

Теперь нам нужно назначить ярлыки, которые мы хотим связать с этими захватами. Для этого создайте файл JSON с именем «label_assignments» в каталоге с вашими данными. Это свяжет имя устройства с меткой. В приведенных выше примерах наш label_assignments.json может выглядеть так:

{
“DevWorkstation”: “Developer workstation”,
“Iphone”: “Smartphone”,
“GPULaptop”: “GPU laptop”,
“Fileserver”: “File server”,
“BusinessWorkstation”: “Business workstation”
}

Во многих случаях ярлык похож на название устройства, но это не обязательно. Любые снимки, которым не назначен ярлык, автоматически получают ярлык «Неизвестно». Это основной формат, который вы можете использовать для создания как набора данных обучения, так и набора данных тестирования.

Обучение новой модели

Теперь, когда у вас настроен набор обучающих данных, обучение модели должно быть довольно простым. Мы автоматизировали большую часть процесса, поэтому вы сможете запустить

docker run -v <path-to-dataset>:/pcaps -v <path-to-save-model>:/models/lab41/poseidonml train

Это обучит случайную модель леса, но вы также можете использовать lab41 / Poseidonml: onelayer для модели нейронной сети. Мы обнаружили, что модель случайного леса хорошо работает с большинством наборов данных, но модель нейронной сети иногда может лучше работать с более крупными наборами данных. Этот шаг должен обрабатывать предварительную обработку набора данных, включая выбор функций, обучение модели и перекрестную проверку. После этого вы должны увидеть общую оценку F1 (чем ближе к 1, тем лучше) для набора проверки (обучающий сценарий автоматически создал его из ваших обучающих данных), и у вас должна быть обученная модель в указанном вами каталоге. Это должно быть все, что вам нужно сделать для обучения модели!

Тестирование производительности модели

После обучения модели вы, вероятно, захотите проверить, как она будет работать с новыми данными. К счастью, это не слишком отличается от того, что мы делали до сих пор. Вам нужно будет создать тестовый набор данных так же, как описано выше. Однако это не должно включать какие-либо данные, которые были в наборе обучающих данных. После этого вы просто запускаете

docker run -v <path-to-dataset>:/pcaps -v <path-to-save-model>:/models/lab41/poseidonml testing

Опять же, вы также можете использовать lab41 / Poseidonml: onelayer для другой модели. После обработки набора данных это должно дать примерно следующий результат:

 — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Results with unknowns
 — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
F1 of 0.XX for Developer workstation
F1 of 0.XX for Smartphone
F1 of 0.XX for Unknown
…
Mean F1: 0.XX
 — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Results forcing decisions
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
F1 of 0.XX for Developer workstation
F1 of 0.XX for Smartphone
…
Mean F1: 0.XX
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Analysis statistics
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Evaluated X pcaps in X seconds
Total data: X Mb
Total capture time: X hours
Data processing rate: X Mb per second
time per 15 minute capture X seconds
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

В приведенной выше таблице показана производительность модели (измеренная с помощью F1-балла) на каждой метке, которую мы определили, а также производительность, усредненная по всем меткам (средняя оценка F1). Кроме того, вы получаете некоторую статистику по времени выполнения и количеству данных, обработанных в конце. Это должно быть все, что вам нужно сделать для обучения модели классификации сетевых устройств на ваших собственных данных.

Еще многое предстоит сделать, в частности, собрать большой общий набор сетевых данных для совместных исследований. Надеюсь, наши инструменты облегчат начало ваших собственных экспериментов. Нам действительно интересно узнать больше о том, как модели, обученные на данных из одной сети, работают в другой, поэтому, если вы проведете какие-либо эксперименты с этим, мы будем рады услышать о них!

Lab41 - это лаборатория Кремниевой долины, в которой эксперты из разведывательного сообщества США (IC), академических кругов, промышленности и In-Q-Tel собираются вместе, чтобы лучше понять, как работать с большими данными и, в конечном итоге, использовать их.

Узнайте больше на lab41.org и подпишитесь на нас в Twitter: @ _lab41